Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updating basic examples #33

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,6 @@ Você vai encontrar nesta documentação os seguintes conteúdos:

[Apostila Completa](https://solidity.w3d.community/apostila/) - Uma apostila com um passo a passo para você aprender como desenvolver um smart contract em Solidity.

[Exemplos](exemplos/linguagem-v0.8.3/) - Exemplos de códigos muito direto ao ponto se você precisa de uma referência rápida da sintaxe da linguagem.
[Exemplos](exemplos/linguagem-v0.8.20/) - Exemplos de códigos muito direto ao ponto se você precisa de uma referência rápida da syntax da linguagem.

[\[EVM\] Máquina Virtual Ethereum](broken-reference) - Explicação sobre o funcionamento da EVM que é utilizado na rede Ethereum e também em outras redes como Fantom, Polygon e Binance Smart Chain.
96 changes: 53 additions & 43 deletions src/.vuepress/config/sidebar-pt.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,50 +45,60 @@ module.exports = [
children: [
"/exemplos/",
{
title: "Linguagem (v0.8.3)",
path: "/exemplos/linguagem-v0.8.3/",
title: "Linguagem (v0.8.20)",
path: "/exemplos/linguagem-v0.8.20/",
children: [
"/exemplos/linguagem-v0.8.3/",
"/exemplos/linguagem-v0.8.3/ola-mundo.md",
"/exemplos/linguagem-v0.8.3/primeira-aplicacao.md",
"/exemplos/linguagem-v0.8.3/tipos-de-dados-primarios.md",
"/exemplos/linguagem-v0.8.3/variaveis.md",
"/exemplos/linguagem-v0.8.3/constantes.md",
"/exemplos/linguagem-v0.8.3/imutaveis.md",
"/exemplos/linguagem-v0.8.3/lendo-e-escrevendo-para-uma-variavel-de-estado.md",
"/exemplos/linguagem-v0.8.3/ether-e-wei.md",
"/exemplos/linguagem-v0.8.3/gas.md",
"/exemplos/linguagem-v0.8.3/if-else.md",
"/exemplos/linguagem-v0.8.3/for-e-while-loop.md",
"/exemplos/linguagem-v0.8.3/mapping.md",
"/exemplos/linguagem-v0.8.3/matriz.md",
"/exemplos/linguagem-v0.8.3/enum.md",
"/exemplos/linguagem-v0.8.3/structs.md",
"/exemplos/linguagem-v0.8.3/localizacoes-de-dados-armazenamento-memoria-e-calldata.md",
"/exemplos/linguagem-v0.8.3/funcao.md",
"/exemplos/linguagem-v0.8.3/funcoes-view-e-pure.md",
"/exemplos/linguagem-v0.8.3/erro.md",
"/exemplos/linguagem-v0.8.3/modificador-de-funcao.md",
"/exemplos/linguagem-v0.8.3/eventos.md",
"/exemplos/linguagem-v0.8.3/constructor.md",
"/exemplos/linguagem-v0.8.3/heranca.md",
"/exemplos/linguagem-v0.8.3/sombreamento-de-variaveis-de-estado-herdadas.md",
"/exemplos/linguagem-v0.8.3/chamando-contratos-de-classe-pai.md",
"/exemplos/linguagem-v0.8.3/visibilidade.md",
"/exemplos/linguagem-v0.8.3/interface.md",
"/exemplos/linguagem-v0.8.3/pagavel.md",
"/exemplos/linguagem-v0.8.3/enviando-ether-transferir-enviar-chamar.md",
"/exemplos/linguagem-v0.8.3/fallback.md",
"/exemplos/linguagem-v0.8.3/call.md",
"/exemplos/linguagem-v0.8.3/delegatecall.md",
"/exemplos/linguagem-v0.8.3/seletor-de-funcao.md",
"/exemplos/linguagem-v0.8.3/chamando-outro-contrato.md",
"/exemplos/linguagem-v0.8.3/contrato-que-cria-outros-contratos.md",
"/exemplos/linguagem-v0.8.3/try-catch.md",
"/exemplos/linguagem-v0.8.3/import.md",
"/exemplos/linguagem-v0.8.3/biblioteca.md",
"/exemplos/linguagem-v0.8.3/hashing-with-keccak256.md",
"/exemplos/linguagem-v0.8.3/verificando-assinatura.md",
"/exemplos/linguagem-v0.8.20/",
"/exemplos/linguagem-v0.8.20/ola-mundo.md",
"/exemplos/linguagem-v0.8.20/primeira-aplicacao.md",
"/exemplos/linguagem-v0.8.20/tipos-dados-primitivos.md",
"/exemplos/linguagem-v0.8.20/variaveis.md",
"/exemplos/linguagem-v0.8.20/constantes.md",
"/exemplos/linguagem-v0.8.20/imutaveis.md",
"/exemplos/linguagem-v0.8.20/lendo-e-escrevendo-para-uma-variavel-de-estado.md",
"/exemplos/linguagem-v0.8.20/ether-e-wei.md",
"/exemplos/linguagem-v0.8.20/gas.md",
"/exemplos/linguagem-v0.8.20/if-else.md",
"/exemplos/linguagem-v0.8.20/for-e-while-loop.md",
"/exemplos/linguagem-v0.8.20/mapping.md",
"/exemplos/linguagem-v0.8.20/matriz.md",
"/exemplos/linguagem-v0.8.20/enum.md",
"/exemplos/linguagem-v0.8.20/structs.md",
"/exemplos/linguagem-v0.8.20/localizacoes-de-dados-armazenamento-memoria-e-calldata.md",
"/exemplos/linguagem-v0.8.20/funcao.md",
"/exemplos/linguagem-v0.8.20/funcoes-view-e-pure.md",
"/exemplos/linguagem-v0.8.20/erro.md",
"/exemplos/linguagem-v0.8.20/modificador-de-funcao.md",
"/exemplos/linguagem-v0.8.20/eventos.md",
"/exemplos/linguagem-v0.8.20/constructor.md",
"/exemplos/linguagem-v0.8.20/heranca.md",
"/exemplos/linguagem-v0.8.20/sombreamento-de-variaveis-de-estado-herdadas.md",
"/exemplos/linguagem-v0.8.20/chamando-contratos-de-classe-pai.md",
"/exemplos/linguagem-v0.8.20/visibilidade.md",
"/exemplos/linguagem-v0.8.20/interface.md",
"/exemplos/linguagem-v0.8.20/pagavel.md",
"/exemplos/linguagem-v0.8.20/enviando-ether-transferir-enviar-chamar.md",
"/exemplos/linguagem-v0.8.20/fallback.md",
"/exemplos/linguagem-v0.8.20/call.md",
"/exemplos/linguagem-v0.8.20/delegatecall.md",
"/exemplos/linguagem-v0.8.20/seletor-de-funcao.md",
"/exemplos/linguagem-v0.8.20/chamando-outro-contrato.md",
"/exemplos/linguagem-v0.8.20/contrato-que-cria-outros-contratos.md",
"/exemplos/linguagem-v0.8.20/try-catch.md",
"/exemplos/linguagem-v0.8.20/import.md",
"/exemplos/linguagem-v0.8.20/biblioteca.md",
"/exemplos/linguagem-v0.8.20/codificacao-abi.md",
"/exemplos/linguagem-v0.8.20/decodificacao-abi.md",
"/exemplos/linguagem-v0.8.20/hashing-with-keccak256.md",
"/exemplos/linguagem-v0.8.20/verificando-assinatura.md",
"/exemplos/linguagem-v0.8.20/tecnicas-de-economia-de-gas.md",
"/exemplos/linguagem-v0.8.20/operadores-bit-a-bit.md",
"/exemplos/linguagem-v0.8.20/matematica-nao-verificada.md",
"/exemplos/linguagem-v0.8.20/variavel-de-assembly.md",
"/exemplos/linguagem-v0.8.20/condicional-assembly.md",
"/exemplos/linguagem-v0.8.20/loop-assembly.md",
"/exemplos/linguagem-v0.8.20/erro-assembly.md",
"/exemplos/linguagem-v0.8.20/matematica-assembly.md",
],
},
{
Expand Down
2 changes: 2 additions & 0 deletions src/exemplos/linguagem-v0.8.20/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Linguagem (v0.8.13)

84 changes: 84 additions & 0 deletions src/exemplos/linguagem-v0.8.20/biblioteca.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
# Biblioteca

Bibliotecas são semelhantes a contratos, mas você não pode declarar nenhuma variável de estado e não pode enviar ether.

Uma biblioteca é incorporada a um contrato se todas as funções da biblioteca são internas.

Caso contrário, a biblioteca deve ser implementada e então vinculada antes do contrato ser implantado.

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library SafeMath {
function add(uint x, uint y) internal pure returns (uint) {
uint z = x + y;
require(z >= x, "uint overflow");

return z;
}
}

library Math {
function sqrt(uint y) internal pure returns (uint z) {
if (y > 3) {
z = y;
uint x = y / 2 + 1;
while (x < z) {
z = x;
x = (y / x + x) / 2;
}
} else if (y != 0) {
z = 1;
}
// else z = 0 (valor padrão)
}
}

contract TestSafeMath {
using SafeMath for uint;

uint public MAX_UINT = 2**256 - 1;

function testAdd(uint x, uint y) public pure returns (uint) {
return x.add(y);
}

function testSquareRoot(uint x) public pure returns (uint) {
return Math.sqrt(x);
}
}

// Função Array para apagar o elemento no index e reorganizar a o array
// de forma que não haja espaços entre os elementos.
library Array {
function remove(uint[] storage arr, uint index) public {
// Move o último elemento para o lugar onde será apagado
require(arr.length > 0, "Can't remove from empty array");
arr[index] = arr[arr.length - 1];
arr.pop();
}
}

contract TestArray {
using Array for uint[];

uint[] public arr;

function testArrayRemove() public {
for (uint i = 0; i < 3; i++) {
arr.push(i);
}

arr.remove(1);

assert(arr.length == 2);
assert(arr[0] == 0);
assert(arr[1] == 2);
}
}
```

## Teste no Remix

- [Biblioteca.sol](https://remix.ethereum.org/#code=Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVApwcmFnbWEgc29saWRpdHkgXjAuOC4yMDsKCmxpYnJhcnkgU2FmZU1hdGggewogICAgZnVuY3Rpb24gYWRkKHVpbnQgeCwgdWludCB5KSBpbnRlcm5hbCBwdXJlIHJldHVybnMgKHVpbnQpIHsKICAgICAgICB1aW50IHogPSB4ICsgeTsKICAgICAgICByZXF1aXJlKHogPj0geCwgInVpbnQgb3ZlcmZsb3ciKTsKCiAgICAgICAgcmV0dXJuIHo7CiAgICB9Cn0KCmxpYnJhcnkgTWF0aCB7CiAgICBmdW5jdGlvbiBzcXJ0KHVpbnQgeSkgaW50ZXJuYWwgcHVyZSByZXR1cm5zICh1aW50IHopIHsKICAgICAgICBpZiAoeSA+IDMpIHsKICAgICAgICAgICAgeiA9IHk7CiAgICAgICAgICAgIHVpbnQgeCA9IHkgLyAyICsgMTsKICAgICAgICAgICAgd2hpbGUgKHggPCB6KSB7CiAgICAgICAgICAgICAgICB6ID0geDsKICAgICAgICAgICAgICAgIHggPSAoeSAvIHggKyB4KSAvIDI7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHkgIT0gMCkgewogICAgICAgICAgICB6ID0gMTsKICAgICAgICB9CiAgICAgICAgLy8gZWxzZSB6ID0gMCAodmFsb3IgcGFkcmFvKQogICAgfQp9Cgpjb250cmFjdCBUZXN0U2FmZU1hdGggewogICAgdXNpbmcgU2FmZU1hdGggZm9yIHVpbnQ7CgogICAgdWludCBwdWJsaWMgTUFYX1VJTlQgPSAyKioyNTYgLSAxOwoKICAgIGZ1bmN0aW9uIHRlc3RBZGQodWludCB4LCB1aW50IHkpIHB1YmxpYyBwdXJlIHJldHVybnMgKHVpbnQpIHsKICAgICAgICByZXR1cm4geC5hZGQoeSk7CiAgICB9CgogICAgZnVuY3Rpb24gdGVzdFNxdWFyZVJvb3QodWludCB4KSBwdWJsaWMgcHVyZSByZXR1cm5zICh1aW50KSB7CiAgICAgICAgcmV0dXJuIE1hdGguc3FydCh4KTsKICAgIH0KfQoKLy8gRnVuY2FvIEFycmF5IHBhcmEgYXBhZ2FyIG8gZWxlbWVudG8gbm8gaW5kZXggZSByZW9yZ2FuaXphciBhIG8gYXJyYXkKLy8gZGUgZm9ybWEgcXVlIG5hbyBoYWphIGVzcGFjb3MgZW50cmUgb3MgZWxlbWVudG9zLgpsaWJyYXJ5IEFycmF5IHsKICAgIGZ1bmN0aW9uIHJlbW92ZSh1aW50W10gc3RvcmFnZSBhcnIsIHVpbnQgaW5kZXgpIHB1YmxpYyB7CiAgICAgICAgLy8gTW92ZSBvIHVsdGltbyBlbGVtZW50byBwYXJhIG8gbHVnYXIgb25kZSBzZXJhIGFwYWdhZG8KICAgICAgICByZXF1aXJlKGFyci5sZW5ndGggPiAwLCAiQ2FuJ3QgcmVtb3ZlIGZyb20gZW1wdHkgYXJyYXkiKTsKICAgICAgICBhcnJbaW5kZXhdID0gYXJyW2Fyci5sZW5ndGggLSAxXTsKICAgICAgICBhcnIucG9wKCk7CiAgICB9Cn0KCmNvbnRyYWN0IFRlc3RBcnJheSB7CiAgICB1c2luZyBBcnJheSBmb3IgdWludFtdOwoKICAgIHVpbnRbXSBwdWJsaWMgYXJyOwoKICAgIGZ1bmN0aW9uIHRlc3RBcnJheVJlbW92ZSgpIHB1YmxpYyB7CiAgICAgICAgZm9yICh1aW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICAgICAgICAgIGFyci5wdXNoKGkpOwogICAgICAgIH0KCiAgICAgICAgYXJyLnJlbW92ZSgxKTsKCiAgICAgICAgYXNzZXJ0KGFyci5sZW5ndGggPT0gMik7CiAgICAgICAgYXNzZXJ0KGFyclswXSA9PSAwKTsKICAgICAgICBhc3NlcnQoYXJyWzFdID09IDIpOwogICAgfQp9&version=soljson-v0.8.20+commit.a1b79de6.js)
54 changes: 54 additions & 0 deletions src/exemplos/linguagem-v0.8.20/call.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# Call

`call` é uma função de baixo nível para interagir com outros contratos.

Este é o método recomendado para ser usado quando você está somente enviando Ether via chamada da função `fallback`.

Contudo, não é uma forma recomendada para chamar funções existentes.

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract Receptor {
event Received(address caller, uint amount, string message);

fallback() external payable {
emit Received(msg.sender, msg.value, "Fallback foi chamado");
}

function foo(string memory _message, uint _x) public payable returns (uint) {
emit Received(msg.sender, msg.value, _message);

return _x + 1;
}
}

contract Chamador {
event Response(bool success, bytes data);

// Vamos imaginar que o contrato Chamador não tenha o código fonte para o
// contrato Receptor, mas nós sabemos o endereço de Receptor e a função para chamar.
function testCallFoo(address payable _addr) public payable {
// Você pode enviar ether e especificar uma quantidade de gás personalizada
(bool success, bytes memory data) = _addr.call{value: msg.value, gas: 5000}(
abi.encodeWithSignature("foo(string,uint256)", "call foo", 123)
);

emit Response(success, data);
}

// Chamando uma função que não existe aciona a função fallback.
function testCallDoesNotExist(address _addr) public {
(bool success, bytes memory data) = _addr.call(
abi.encodeWithSignature("doesNotExist()")
);

emit Response(success, data);
}
}
```

## Teste no Remix

- [Call.sol](https://remix.ethereum.org/#code=Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVApwcmFnbWEgc29saWRpdHkgXjAuOC4yMDsKCmNvbnRyYWN0IFJlY2VwdG9yIHsKICAgIGV2ZW50IFJlY2VpdmVkKGFkZHJlc3MgY2FsbGVyLCB1aW50IGFtb3VudCwgc3RyaW5nIG1lc3NhZ2UpOwoKICAgIGZhbGxiYWNrKCkgZXh0ZXJuYWwgcGF5YWJsZSB7CiAgICAgICAgZW1pdCBSZWNlaXZlZChtc2cuc2VuZGVyLCBtc2cudmFsdWUsICJGYWxsYmFjayBmb2kgY2hhbWFkbyIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvbyhzdHJpbmcgbWVtb3J5IF9tZXNzYWdlLCB1aW50IF94KSBwdWJsaWMgcGF5YWJsZSByZXR1cm5zICh1aW50KSB7CiAgICAgICAgZW1pdCBSZWNlaXZlZChtc2cuc2VuZGVyLCBtc2cudmFsdWUsIF9tZXNzYWdlKTsKCiAgICAgICAgcmV0dXJuIF94ICsgMTsKICAgIH0KfQoKY29udHJhY3QgQ2hhbWFkb3IgewogICAgZXZlbnQgUmVzcG9uc2UoYm9vbCBzdWNjZXNzLCBieXRlcyBkYXRhKTsKCiAgICAvLyBWYW1vcyBpbWFnaW5hciBxdWUgbyBjb250cmF0byBDaGFtYWRvciBuYW8gdGVuaGEgbyBjb2RpZ28gZm9udGUgcGFyYSBvCiAgICAvLyBjb250cmF0byBSZWNlcHRvciwgbWFzIG5vcyBzYWJlbW9zIG8gZW5kZXJlY28gZGUgUmVjZXB0b3IgZSBhIGZ1bmNhbyBwYXJhIGNoYW1hci4KICAgIGZ1bmN0aW9uIHRlc3RDYWxsRm9vKGFkZHJlc3MgcGF5YWJsZSBfYWRkcikgcHVibGljIHBheWFibGUgewogICAgICAgIC8vIFZvY2UgcG9kZSBlbnZpYXIgZXRoZXIgZSBlc3BlY2lmaWNhciB1bWEgcXVhbnRpZGFkZSBkZSBnYXMgcGVyc29uYWxpemFkYQogICAgICAgIChib29sIHN1Y2Nlc3MsIGJ5dGVzIG1lbW9yeSBkYXRhKSA9IF9hZGRyLmNhbGx7dmFsdWU6IG1zZy52YWx1ZSwgZ2FzOiA1MDAwfSgKICAgICAgICAgICAgYWJpLmVuY29kZVdpdGhTaWduYXR1cmUoImZvbyhzdHJpbmcsdWludDI1NikiLCAiY2FsbCBmb28iLCAxMjMpCiAgICAgICAgKTsKCiAgICAgICAgZW1pdCBSZXNwb25zZShzdWNjZXNzLCBkYXRhKTsKICAgIH0KCiAgICAvLyBDaGFtYW5kbyB1bWEgZnVuY2FvIHF1ZSBuYW8gZXhpc3RlIGFjaW9uYSBhIGZ1bmNhbyBmYWxsYmFjay4KICAgIGZ1bmN0aW9uIHRlc3RDYWxsRG9lc05vdEV4aXN0KGFkZHJlc3MgX2FkZHIpIHB1YmxpYyB7CiAgICAgICAgKGJvb2wgc3VjY2VzcywgYnl0ZXMgbWVtb3J5IGRhdGEpID0gX2FkZHIuY2FsbCgKICAgICAgICAgICAgYWJpLmVuY29kZVdpdGhTaWduYXR1cmUoImRvZXNOb3RFeGlzdCgpIikKICAgICAgICApOwoKICAgICAgICBlbWl0IFJlc3BvbnNlKHN1Y2Nlc3MsIGRhdGEpOwogICAgfQp9&version=soljson-v0.8.20+commit.a1b79de6.js)
78 changes: 78 additions & 0 deletions src/exemplos/linguagem-v0.8.20/chamando-contratos-de-classe-pai.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# Chamando Contratos de Classe Pai

Contratos de classe pai podem ser chamados diretamente ou usando a palavra-chave `super`.

Usando a palavra-chave `super`, todos os contratos de classe pai imediatos serão chamados.

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

/* Árvore de herança
A
/ \
B C
\ /
D
*/

contract A {
// Isto é chamado um evento. Você pode emitir eventos de sua função
// e eles serão registrados no log da transação.
// No nosso caso, isso será útil para traçar chamadas de função.
event Log(string message);

function foo() public virtual {
emit Log("A.foo chamado");
}

function bar() public virtual {
emit Log("A.bar chamado");
}
}

contract B is A {
function foo() public virtual override {
emit Log("B.foo chamado");
A.foo();
}

function bar() public virtual override {
emit Log("B.bar chamado");
super.bar();
}
}

contract C is A {
function foo() public virtual override {
emit Log("C.foo chamado");
A.foo();
}

function bar() public virtual override {
emit Log("C.bar chamado");
super.bar();
}
}

contract D is B, C {
// Tente:
// - Chame D.foo e verifique os logs da transação.
// Embora D herde A, B e C, ele só chamou C e depois A.
// - Chame D.bar e verifique os logs da transação
// D chamou C, depois B, e finalmente A.
// Embora super foi chamado 2 vezes (por B e C) ele só chamou A uma vez.

function foo() public override(B, C) {
super.foo();
}

function bar() public override(B, C) {
super.bar();
}
}
```

## Teste no Remix

- [Super.sol](https://remix.ethereum.org/#code=Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVApwcmFnbWEgc29saWRpdHkgXjAuOC4yMDsKCi8qIMOBcnZvcmUgZGUgaGVyYW7Dp2EKICAgQQogLyAgXApCICAgQwogXCAvCiAgRAoqLwoKY29udHJhY3QgQSB7CiAgICAvLyBJc3RvIGUgY2hhbWFkbyB1bSBldmVudG8uIFZvY2UgcG9kZSBlbWl0aXIgZXZlbnRvcyBkZSBzdWEgZnVuY2FvCiAgICAvLyBlIGVsZXMgc2VyYW8gcmVnaXN0cmFkb3Mgbm8gbG9nIGRhIHRyYW5zYWNhby4KICAgIC8vIE5vIG5vc3NvIGNhc28sIGlzc28gc2VyYSB1dGlsIHBhcmEgdHJhY2FyIGNoYW1hZGFzIGRlIGZ1bmNhby4KICAgIGV2ZW50IExvZyhzdHJpbmcgbWVzc2FnZSk7CgogICAgZnVuY3Rpb24gZm9vKCkgcHVibGljIHZpcnR1YWwgewogICAgICAgIGVtaXQgTG9nKCJBLmZvbyBjaGFtYWRvIik7CiAgICB9CgogICAgZnVuY3Rpb24gYmFyKCkgcHVibGljIHZpcnR1YWwgewogICAgICAgIGVtaXQgTG9nKCJBLmJhciBjaGFtYWRvIik7CiAgICB9Cn0KCmNvbnRyYWN0IEIgaXMgQSB7CiAgICBmdW5jdGlvbiBmb28oKSBwdWJsaWMgdmlydHVhbCBvdmVycmlkZSB7CiAgICAgICAgZW1pdCBMb2coIkIuZm9vIGNoYW1hZG8iKTsKICAgICAgICBBLmZvbygpOwogICAgfQoKICAgIGZ1bmN0aW9uIGJhcigpIHB1YmxpYyB2aXJ0dWFsIG92ZXJyaWRlIHsKICAgICAgICBlbWl0IExvZygiQi5iYXIgY2hhbWFkbyIpOwogICAgICAgIHN1cGVyLmJhcigpOwogICAgfQp9Cgpjb250cmFjdCBDIGlzIEEgewogICAgZnVuY3Rpb24gZm9vKCkgcHVibGljIHZpcnR1YWwgb3ZlcnJpZGUgewogICAgICAgIGVtaXQgTG9nKCJDLmZvbyBjaGFtYWRvIik7CiAgICAgICAgQS5mb28oKTsKICAgIH0KCiAgICBmdW5jdGlvbiBiYXIoKSBwdWJsaWMgdmlydHVhbCBvdmVycmlkZSB7CiAgICAgICAgZW1pdCBMb2coIkMuYmFyIGNoYW1hZG8iKTsKICAgICAgICBzdXBlci5iYXIoKTsKICAgIH0KfQoKY29udHJhY3QgRCBpcyBCLCBDIHsKICAgIC8vIFRlbnRlOgogICAgLy8gLSBDaGFtZSBELmZvbyBlIHZlcmlmaXF1ZSBvcyBsb2dzIGRhIHRyYW5zYWNhby4KICAgIC8vICAgRW1ib3JhIEQgaGVyZGUgQSwgQiBlIEMsIGVsZSBzbyBjaGFtb3UgQyBlIGRlcG9pcyBBLgogICAgLy8gLSBDaGFtZSBELmJhciBlIHZlcmlmaXF1ZSBvcyBsb2dzIGRhIHRyYW5zYWNhbwogICAgLy8gICBEIGNoYW1vdSBDLCBkZXBvaXMgQiwgZSBmaW5hbG1lbnRlIEEuCiAgICAvLyAgIEVtYm9yYSBzdXBlciBmb2kgY2hhbWFkbyAyIHZlemVzIChwb3IgQiBlIEMpIGVsZSBzbyBjaGFtb3UgQSB1bWEgdmV6LgoKICAgIGZ1bmN0aW9uIGZvbygpIHB1YmxpYyBvdmVycmlkZShCLCBDKSB7CiAgICAgICAgc3VwZXIuZm9vKCk7CiAgICB9CgogICAgZnVuY3Rpb24gYmFyKCkgcHVibGljIG92ZXJyaWRlKEIsIEMpIHsKICAgICAgICBzdXBlci5iYXIoKTsKICAgIH0KfQ==&version=soljson-v0.8.20+commit.a1b79de6.js)
Loading