├── diagrams
├── 00
│ ├── .gitkeep
│ └── diagrams.xml
├── 01
│ ├── .gitkeep
│ └── diagrams.xml
├── 02
│ └── .gitkeep
├── 03
│ └── .gitkeep
├── 04
│ ├── .gitkeep
│ └── diagrams.xml
├── 05
│ ├── .gitkeep
│ └── diagrams.xml
├── 06
│ └── .gitkeep
└── 07
│ ├── .gitkeep
│ └── diagrams.xml
├── inbox
├── .gitignore
├── compile.js
├── contracts
│ └── Inbox.sol
├── package.json
├── deploy.js
└── test
│ └── Inbox.test.js
├── lottery
├── .gitignore
├── compile.js
├── package.json
├── deploy.js
├── contracts
│ └── Lottery.sol
└── test
│ └── Lottery.test.js
├── kickstart
├── .gitignore
├── ADDRESS
├── ethereum
│ ├── campaign.js
│ ├── factory.js
│ ├── web3.js
│ ├── compile.js
│ ├── deploy.js
│ └── contracts
│ │ └── Campaign.sol
├── routes.js
├── components
│ ├── Layout.js
│ ├── Header.js
│ ├── ContributeForm.js
│ └── RequestRow.js
├── package.json
├── server.js
├── pages
│ ├── index.js
│ └── campaigns
│ │ ├── new.js
│ │ ├── requests
│ │ ├── index.js
│ │ └── new.js
│ │ └── show.js
└── test
│ └── Campaign.test.js
├── README.md
└── lottery-react
├── src
├── index.css
├── web3.js
├── App.test.js
├── index.js
├── App.css
├── lottery.js
├── App.js
├── logo.svg
└── registerServiceWorker.js
├── public
├── favicon.ico
├── manifest.json
└── index.html
├── .gitignore
└── package.json
/diagrams/00/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/diagrams/01/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/diagrams/02/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/diagrams/03/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/diagrams/04/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/diagrams/05/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/diagrams/06/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/diagrams/07/.gitkeep:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/inbox/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 |
--------------------------------------------------------------------------------
/lottery/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 |
--------------------------------------------------------------------------------
/kickstart/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .next
3 |
--------------------------------------------------------------------------------
/kickstart/ADDRESS:
--------------------------------------------------------------------------------
1 | 0xE950a05cC194a83A11533Bf18218355b21E315ba
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # EthereumCasts
2 | Companion repo to an Ethereum/Solidity course on Udemy
3 |
--------------------------------------------------------------------------------
/lottery-react/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | padding: 0;
4 | font-family: sans-serif;
5 | }
6 |
--------------------------------------------------------------------------------
/lottery-react/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/StephenGrider/EthereumCasts/master/lottery-react/public/favicon.ico
--------------------------------------------------------------------------------
/lottery-react/src/web3.js:
--------------------------------------------------------------------------------
1 | import Web3 from 'web3';
2 |
3 | const web3 = new Web3(window.web3.currentProvider);
4 |
5 | export default web3;
6 |
--------------------------------------------------------------------------------
/kickstart/ethereum/campaign.js:
--------------------------------------------------------------------------------
1 | import web3 from './web3';
2 | import Campaign from './build/Campaign.json';
3 |
4 | export default address => {
5 | return new web3.eth.Contract(JSON.parse(Campaign.interface), address);
6 | };
7 |
--------------------------------------------------------------------------------
/lottery-react/src/App.test.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './App';
4 |
5 | it('renders without crashing', () => {
6 | const div = document.createElement('div');
7 | ReactDOM.render( , div);
8 | });
9 |
--------------------------------------------------------------------------------
/lottery-react/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import './index.css';
4 | import App from './App';
5 | import registerServiceWorker from './registerServiceWorker';
6 |
7 | ReactDOM.render( , document.getElementById('root'));
8 | registerServiceWorker();
9 |
--------------------------------------------------------------------------------
/inbox/compile.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | const fs = require('fs');
3 | const solc = require('solc');
4 |
5 | const inboxPath = path.resolve(__dirname, 'contracts', 'Inbox.sol');
6 | const source = fs.readFileSync(inboxPath, 'utf8');
7 |
8 | module.exports = solc.compile(source, 1).contracts[':Inbox'];
9 |
--------------------------------------------------------------------------------
/kickstart/ethereum/factory.js:
--------------------------------------------------------------------------------
1 | import web3 from './web3';
2 | import CampaignFactory from './build/CampaignFactory.json';
3 |
4 | const instance = new web3.eth.Contract(
5 | JSON.parse(CampaignFactory.interface),
6 | '0xCA7740C40E82f945D4e48b9Cf2475c2674B2813D'
7 | );
8 |
9 | export default instance;
10 |
--------------------------------------------------------------------------------
/lottery/compile.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | const fs = require('fs');
3 | const solc = require('solc');
4 |
5 | const lotteryPath = path.resolve(__dirname, 'contracts', 'Lottery.sol');
6 | const source = fs.readFileSync(lotteryPath, 'utf8');
7 |
8 | module.exports = solc.compile(source, 1).contracts[':Lottery'];
9 |
--------------------------------------------------------------------------------
/inbox/contracts/Inbox.sol:
--------------------------------------------------------------------------------
1 | pragma solidity ^0.4.17;
2 |
3 | contract Inbox {
4 | string public message;
5 |
6 | function Inbox(string initialMessage) public {
7 | message = initialMessage;
8 | }
9 |
10 | function setMessage(string newMessage) public {
11 | message = newMessage;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/kickstart/routes.js:
--------------------------------------------------------------------------------
1 | const routes = require('next-routes')();
2 |
3 | routes
4 | .add('/campaigns/new', '/campaigns/new')
5 | .add('/campaigns/:address', '/campaigns/show')
6 | .add('/campaigns/:address/requests', '/campaigns/requests/index')
7 | .add('/campaigns/:address/requests/new', '/campaigns/requests/new');
8 |
9 | module.exports = routes;
10 |
--------------------------------------------------------------------------------
/lottery-react/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/ignore-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 |
6 | # testing
7 | /coverage
8 |
9 | # production
10 | /build
11 |
12 | # misc
13 | .DS_Store
14 | .env.local
15 | .env.development.local
16 | .env.test.local
17 | .env.production.local
18 |
19 | npm-debug.log*
20 | yarn-debug.log*
21 | yarn-error.log*
22 |
--------------------------------------------------------------------------------
/lottery-react/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | }
10 | ],
11 | "start_url": "./index.html",
12 | "display": "standalone",
13 | "theme_color": "#000000",
14 | "background_color": "#ffffff"
15 | }
16 |
--------------------------------------------------------------------------------
/inbox/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "inbox",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "mocha"
8 | },
9 | "author": "",
10 | "license": "ISC",
11 | "dependencies": {
12 | "ganache-cli": "^6.0.3",
13 | "mocha": "^4.0.1",
14 | "solc": "^0.4.19",
15 | "truffle-hdwallet-provider": "0.0.3",
16 | "web3": "^1.0.0-beta.26"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/lottery/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "inbox",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "mocha"
8 | },
9 | "author": "",
10 | "license": "ISC",
11 | "dependencies": {
12 | "ganache-cli": "^6.0.3",
13 | "mocha": "^4.0.1",
14 | "solc": "^0.4.19",
15 | "truffle-hdwallet-provider": "0.0.3",
16 | "web3": "^1.0.0-beta.26"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/lottery-react/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "lottery-react",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "react": "^16.2.0",
7 | "react-dom": "^16.2.0",
8 | "react-scripts": "1.0.17",
9 | "web3": "^1.0.0-beta.26"
10 | },
11 | "scripts": {
12 | "start": "react-scripts start",
13 | "build": "react-scripts build",
14 | "test": "react-scripts test --env=jsdom",
15 | "eject": "react-scripts eject"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/lottery-react/src/App.css:
--------------------------------------------------------------------------------
1 | .App {
2 | text-align: center;
3 | }
4 |
5 | .App-logo {
6 | animation: App-logo-spin infinite 20s linear;
7 | height: 80px;
8 | }
9 |
10 | .App-header {
11 | background-color: #222;
12 | height: 150px;
13 | padding: 20px;
14 | color: white;
15 | }
16 |
17 | .App-title {
18 | font-size: 1.5em;
19 | }
20 |
21 | .App-intro {
22 | font-size: large;
23 | }
24 |
25 | @keyframes App-logo-spin {
26 | from { transform: rotate(0deg); }
27 | to { transform: rotate(360deg); }
28 | }
29 |
--------------------------------------------------------------------------------
/kickstart/components/Layout.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Container } from 'semantic-ui-react';
3 | import Head from 'next/head';
4 | import Header from './Header';
5 |
6 | export default props => {
7 | return (
8 |
9 |
10 |
14 |
15 |
16 |
17 | {props.children}
18 |
19 | );
20 | };
21 |
--------------------------------------------------------------------------------
/kickstart/ethereum/web3.js:
--------------------------------------------------------------------------------
1 | import Web3 from 'web3';
2 |
3 | let web3;
4 |
5 | if (typeof window !== 'undefined' && typeof window.web3 !== 'undefined') {
6 | // We are in the browser and metamask is running.
7 | web3 = new Web3(window.web3.currentProvider);
8 | } else {
9 | // We are on the server *OR* the user is not running metamask
10 | const provider = new Web3.providers.HttpProvider(
11 | 'https://rinkeby.infura.io/orDImgKRzwNrVCDrAk5Q'
12 | );
13 | web3 = new Web3(provider);
14 | }
15 |
16 | export default web3;
17 |
--------------------------------------------------------------------------------
/kickstart/ethereum/compile.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | const solc = require('solc');
3 | const fs = require('fs-extra');
4 |
5 | const buildPath = path.resolve(__dirname, 'build');
6 | fs.removeSync(buildPath);
7 |
8 | const campaignPath = path.resolve(__dirname, 'contracts', 'Campaign.sol');
9 | const source = fs.readFileSync(campaignPath, 'utf8');
10 | const output = solc.compile(source, 1).contracts;
11 |
12 | fs.ensureDirSync(buildPath);
13 |
14 | for (let contract in output) {
15 | fs.outputJsonSync(
16 | path.resolve(buildPath, contract.replace(':', '') + '.json'),
17 | output[contract]
18 | );
19 | }
20 |
--------------------------------------------------------------------------------
/kickstart/components/Header.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Menu } from 'semantic-ui-react';
3 | import { Link } from '../routes';
4 |
5 | export default () => {
6 | return (
7 |
8 |
9 | CrowdCoin
10 |
11 |
12 |
13 |
14 | Campaigns
15 |
16 |
17 |
18 | +
19 |
20 |
21 |
22 | );
23 | };
24 |
--------------------------------------------------------------------------------
/kickstart/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "kickstart",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "mocha",
8 | "dev": "node server.js",
9 | "build": "next build"
10 | },
11 | "author": "",
12 | "license": "ISC",
13 | "dependencies": {
14 | "fs-extra": "^5.0.0",
15 | "ganache-cli": "^6.0.3",
16 | "mocha": "^4.1.0",
17 | "next": "^4.1.4",
18 | "next-routes": "^1.2.0",
19 | "react": "^16.2.0",
20 | "react-dom": "^16.2.0",
21 | "semantic-ui-css": "^2.2.12",
22 | "semantic-ui-react": "^0.77.1",
23 | "solc": "^0.4.19",
24 | "truffle-hdwallet-provider": "0.0.3",
25 | "web3": "1.0.0-beta.26"
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/kickstart/server.js:
--------------------------------------------------------------------------------
1 | const { createServer } = require('http');
2 | const next = require('next');
3 |
4 | const app = next({
5 | dev: process.env.NODE_ENV !== 'production',
6 | conf: {
7 | webpack: config => {
8 | config.devtool = false;
9 |
10 | for (const r of config.module.rules) {
11 | if (r.loader === 'babel-loader') {
12 | r.options.sourceMaps = false;
13 | }
14 | }
15 |
16 | return config;
17 | }
18 | }
19 | });
20 |
21 | const routes = require('./routes');
22 | const handler = routes.getRequestHandler(app);
23 |
24 | app.prepare().then(() => {
25 | createServer(handler).listen(3000, err => {
26 | if (err) throw err;
27 | console.log('Ready on localhost:3000');
28 | });
29 | });
30 |
--------------------------------------------------------------------------------
/lottery/deploy.js:
--------------------------------------------------------------------------------
1 | const HDWalletProvider = require('truffle-hdwallet-provider');
2 | const Web3 = require('web3');
3 | const { interface, bytecode } = require('./compile');
4 |
5 | const provider = new HDWalletProvider(
6 | 'game saddle oyster laundry equal loop lunch allow cactus endless hover unfair',
7 | 'https://rinkeby.infura.io/orDImgKRzwNrVCDrAk5Q'
8 | );
9 | const web3 = new Web3(provider);
10 |
11 | const deploy = async () => {
12 | const accounts = await web3.eth.getAccounts();
13 |
14 | console.log('Attempting to deploy from account', accounts[0]);
15 |
16 | const result = await new web3.eth.Contract(JSON.parse(interface))
17 | .deploy({ data: bytecode })
18 | .send({ gas: '1000000', from: accounts[0] });
19 |
20 | console.log('Contract deployed to', result.options.address);
21 | };
22 | deploy();
23 |
--------------------------------------------------------------------------------
/inbox/deploy.js:
--------------------------------------------------------------------------------
1 | const HDWalletProvider = require('truffle-hdwallet-provider');
2 | const Web3 = require('web3');
3 | const { interface, bytecode } = require('./compile');
4 |
5 | const provider = new HDWalletProvider(
6 | 'call glow acoustic vintage front ring trade assist shuffle mimic volume reject',
7 | 'https://rinkeby.infura.io/orDImgKRzwNrVCDrAk5Q'
8 | );
9 | const web3 = new Web3(provider);
10 |
11 | const deploy = async () => {
12 | const accounts = await web3.eth.getAccounts();
13 |
14 | console.log('Attempting to deploy from account', accounts[0]);
15 |
16 | const result = await new web3.eth.Contract(JSON.parse(interface))
17 | .deploy({ data: bytecode, arguments: ['Hi there!'] })
18 | .send({ gas: '1000000', from: accounts[0] });
19 |
20 | console.log('Contract deployed to', result.options.address);
21 | };
22 | deploy();
23 |
--------------------------------------------------------------------------------
/kickstart/ethereum/deploy.js:
--------------------------------------------------------------------------------
1 | const HDWalletProvider = require('truffle-hdwallet-provider');
2 | const Web3 = require('web3');
3 | const compiledFactory = require('./build/CampaignFactory.json');
4 |
5 | const provider = new HDWalletProvider(
6 | 'call glow acoustic vintage front ring trade assist shuffle mimic volume reject',
7 | 'https://rinkeby.infura.io/orDImgKRzwNrVCDrAk5Q'
8 | );
9 | const web3 = new Web3(provider);
10 |
11 | const deploy = async () => {
12 | const accounts = await web3.eth.getAccounts();
13 |
14 | console.log('Attempting to deploy from account', accounts[0]);
15 |
16 | const result = await new web3.eth.Contract(
17 | JSON.parse(compiledFactory.interface)
18 | )
19 | .deploy({ data: compiledFactory.bytecode })
20 | .send({ gas: '1000000', from: accounts[0] });
21 |
22 | console.log('Contract deployed to', result.options.address);
23 | };
24 | deploy();
25 |
--------------------------------------------------------------------------------
/lottery/contracts/Lottery.sol:
--------------------------------------------------------------------------------
1 | pragma solidity ^0.4.17;
2 |
3 | contract Lottery {
4 | address public manager;
5 | address[] public players;
6 |
7 | function Lottery() public {
8 | manager = msg.sender;
9 | }
10 |
11 | function enter() public payable {
12 | require(msg.value > .01 ether);
13 |
14 | players.push(msg.sender);
15 | }
16 |
17 | function random() private view returns (uint) {
18 | return uint(keccak256(block.difficulty, now, players));
19 | }
20 |
21 | function pickWinner() public restricted {
22 | uint index = random() % players.length;
23 | players[index].transfer(this.balance);
24 | players = new address[](0);
25 | }
26 |
27 | modifier restricted() {
28 | require(msg.sender == manager);
29 | _;
30 | }
31 |
32 | function getPlayers() public view returns (address[]) {
33 | return players;
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/inbox/test/Inbox.test.js:
--------------------------------------------------------------------------------
1 | const assert = require('assert');
2 | const ganache = require('ganache-cli');
3 | const Web3 = require('web3');
4 | const web3 = new Web3(ganache.provider());
5 | const { interface, bytecode } = require('../compile');
6 |
7 | let accounts;
8 | let inbox;
9 |
10 | beforeEach(async () => {
11 | // Get a list of all accounts
12 | accounts = await web3.eth.getAccounts();
13 |
14 | // Use one of those accounts to deploy
15 | // the contract
16 | inbox = await new web3.eth.Contract(JSON.parse(interface))
17 | .deploy({
18 | data: bytecode,
19 | arguments: ['Hi there!']
20 | })
21 | .send({ from: accounts[0], gas: '1000000' });
22 | });
23 |
24 | describe('Inbox', () => {
25 | it('deploys a contract', () => {
26 | assert.ok(inbox.options.address);
27 | });
28 |
29 | it('has a default message', async () => {
30 | const message = await inbox.methods.message().call();
31 | assert.equal(message, 'Hi there!');
32 | });
33 |
34 | it('can change the message', async () => {
35 | await inbox.methods.setMessage('bye').send({ from: accounts[0] });
36 | const message = await inbox.methods.message().call();
37 | assert.equal(message, 'bye');
38 | });
39 | });
40 |
--------------------------------------------------------------------------------
/lottery-react/src/lottery.js:
--------------------------------------------------------------------------------
1 | import web3 from './web3';
2 |
3 | const address = '0x8DDB5D5F062C235A9eF6C65b789A3D3951134F0b';
4 |
5 | const abi = [
6 | {
7 | constant: true,
8 | inputs: [],
9 | name: 'manager',
10 | outputs: [{ name: '', type: 'address' }],
11 | payable: false,
12 | stateMutability: 'view',
13 | type: 'function'
14 | },
15 | {
16 | constant: false,
17 | inputs: [],
18 | name: 'pickWinner',
19 | outputs: [],
20 | payable: false,
21 | stateMutability: 'nonpayable',
22 | type: 'function'
23 | },
24 | {
25 | constant: true,
26 | inputs: [],
27 | name: 'getPlayers',
28 | outputs: [{ name: '', type: 'address[]' }],
29 | payable: false,
30 | stateMutability: 'view',
31 | type: 'function'
32 | },
33 | {
34 | constant: false,
35 | inputs: [],
36 | name: 'enter',
37 | outputs: [],
38 | payable: true,
39 | stateMutability: 'payable',
40 | type: 'function'
41 | },
42 | {
43 | constant: true,
44 | inputs: [{ name: '', type: 'uint256' }],
45 | name: 'players',
46 | outputs: [{ name: '', type: 'address' }],
47 | payable: false,
48 | stateMutability: 'view',
49 | type: 'function'
50 | },
51 | {
52 | inputs: [],
53 | payable: false,
54 | stateMutability: 'nonpayable',
55 | type: 'constructor'
56 | }
57 | ];
58 |
59 | export default new web3.eth.Contract(abi, address);
60 |
--------------------------------------------------------------------------------
/kickstart/pages/index.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import { Card, Button } from 'semantic-ui-react';
3 | import factory from '../ethereum/factory';
4 | import Layout from '../components/Layout';
5 | import { Link } from '../routes';
6 |
7 | class CampaignIndex extends Component {
8 | static async getInitialProps() {
9 | const campaigns = await factory.methods.getDeployedCampaigns().call();
10 |
11 | return { campaigns };
12 | }
13 |
14 | renderCampaigns() {
15 | const items = this.props.campaigns.map(address => {
16 | return {
17 | header: address,
18 | description: (
19 |
20 | View Campaign
21 |
22 | ),
23 | fluid: true
24 | };
25 | });
26 |
27 | return ;
28 | }
29 |
30 | render() {
31 | return (
32 |
33 |
34 |
Open Campaigns
35 |
36 |
37 |
38 |
44 |
45 |
46 |
47 | {this.renderCampaigns()}
48 |
49 |
50 | );
51 | }
52 | }
53 |
54 | export default CampaignIndex;
55 |
--------------------------------------------------------------------------------
/lottery-react/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
11 |
12 |
13 |
22 | React App
23 |
24 |
25 |
26 | You need to enable JavaScript to run this app.
27 |
28 |
29 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/kickstart/components/ContributeForm.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import { Form, Input, Message, Button } from 'semantic-ui-react';
3 | import Campaign from '../ethereum/campaign';
4 | import web3 from '../ethereum/web3';
5 | import { Router } from '../routes';
6 |
7 | class ContributeForm extends Component {
8 | state = {
9 | value: '',
10 | errorMessage: '',
11 | loading: false
12 | };
13 |
14 | onSubmit = async event => {
15 | event.preventDefault();
16 |
17 | const campaign = Campaign(this.props.address);
18 |
19 | this.setState({ loading: true, errorMessage: '' });
20 |
21 | try {
22 | const accounts = await web3.eth.getAccounts();
23 | await campaign.methods.contribute().send({
24 | from: accounts[0],
25 | value: web3.utils.toWei(this.state.value, 'ether')
26 | });
27 |
28 | Router.replaceRoute(`/campaigns/${this.props.address}`);
29 | } catch (err) {
30 | this.setState({ errorMessage: err.message });
31 | }
32 |
33 | this.setState({ loading: false, value: '' });
34 | };
35 |
36 | render() {
37 | return (
38 |
40 | Amount to Contribute
41 | this.setState({ value: event.target.value })}
44 | label="ether"
45 | labelPosition="right"
46 | />
47 |
48 |
49 |
50 |
51 | Contribute!
52 |
53 |
54 | );
55 | }
56 | }
57 |
58 | export default ContributeForm;
59 |
--------------------------------------------------------------------------------
/kickstart/pages/campaigns/new.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import { Form, Button, Input, Message } from 'semantic-ui-react';
3 | import Layout from '../../components/Layout';
4 | import factory from '../../ethereum/factory';
5 | import web3 from '../../ethereum/web3';
6 | import { Router } from '../../routes';
7 |
8 | class CampaignNew extends Component {
9 | state = {
10 | minimumContribution: '',
11 | errorMessage: '',
12 | loading: false
13 | };
14 |
15 | onSubmit = async event => {
16 | event.preventDefault();
17 |
18 | this.setState({ loading: true, errorMessage: '' });
19 |
20 | try {
21 | const accounts = await web3.eth.getAccounts();
22 | await factory.methods
23 | .createCampaign(this.state.minimumContribution)
24 | .send({
25 | from: accounts[0]
26 | });
27 |
28 | Router.pushRoute('/');
29 | } catch (err) {
30 | this.setState({ errorMessage: err.message });
31 | }
32 |
33 | this.setState({ loading: false });
34 | };
35 |
36 | render() {
37 | return (
38 |
39 | Create a Campaign
40 |
41 |
43 | Minimum Contribution
44 |
49 | this.setState({ minimumContribution: event.target.value })}
50 | />
51 |
52 |
53 |
54 |
55 | Create!
56 |
57 |
58 |
59 | );
60 | }
61 | }
62 |
63 | export default CampaignNew;
64 |
--------------------------------------------------------------------------------
/kickstart/components/RequestRow.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import { Table, Button } from 'semantic-ui-react';
3 | import web3 from '../ethereum/web3';
4 | import Campaign from '../ethereum/campaign';
5 |
6 | class RequestRow extends Component {
7 | onApprove = async () => {
8 | const campaign = Campaign(this.props.address);
9 |
10 | const accounts = await web3.eth.getAccounts();
11 | await campaign.methods.approveRequest(this.props.id).send({
12 | from: accounts[0]
13 | });
14 | };
15 |
16 | onFinalize = async () => {
17 | const campaign = Campaign(this.props.address);
18 |
19 | const accounts = await web3.eth.getAccounts();
20 | await campaign.methods.finalizeRequest(this.props.id).send({
21 | from: accounts[0]
22 | });
23 | };
24 |
25 | render() {
26 | const { Row, Cell } = Table;
27 | const { id, request, approversCount } = this.props;
28 | const readyToFinalize = request.approvalCount > approversCount / 2;
29 |
30 | return (
31 |
35 | | {id} |
36 | {request.description} |
37 | {web3.utils.fromWei(request.value, 'ether')} |
38 | {request.recipient} |
39 |
40 | {request.approvalCount}/{approversCount}
41 | |
42 |
43 | {request.complete ? null : (
44 |
45 | Approve
46 |
47 | )}
48 | |
49 |
50 | {request.complete ? null : (
51 |
52 | Finalize
53 |
54 | )}
55 | |
56 |
57 | );
58 | }
59 | }
60 |
61 | export default RequestRow;
62 |
--------------------------------------------------------------------------------
/kickstart/pages/campaigns/requests/index.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import { Button, Table } from 'semantic-ui-react';
3 | import { Link } from '../../../routes';
4 | import Layout from '../../../components/Layout';
5 | import Campaign from '../../../ethereum/campaign';
6 | import RequestRow from '../../../components/RequestRow';
7 |
8 | class RequestIndex extends Component {
9 | static async getInitialProps(props) {
10 | const { address } = props.query;
11 | const campaign = Campaign(address);
12 | const requestCount = await campaign.methods.getRequestsCount().call();
13 | const approversCount = await campaign.methods.approversCount().call();
14 |
15 | const requests = await Promise.all(
16 | Array(parseInt(requestCount))
17 | .fill()
18 | .map((element, index) => {
19 | return campaign.methods.requests(index).call();
20 | })
21 | );
22 |
23 | return { address, requests, requestCount, approversCount };
24 | }
25 |
26 | renderRows() {
27 | return this.props.requests.map((request, index) => {
28 | return (
29 |
36 | );
37 | });
38 | }
39 |
40 | render() {
41 | const { Header, Row, HeaderCell, Body } = Table;
42 |
43 | return (
44 |
45 | Requests
46 |
47 |
48 |
49 | Add Request
50 |
51 |
52 |
53 |
54 |
55 |
56 | ID
57 | Description
58 | Amount
59 | Recipient
60 | Approval Count
61 | Approve
62 | Finalize
63 |
64 |
65 | {this.renderRows()}
66 |
67 | Found {this.props.requestCount} requests.
68 |
69 | );
70 | }
71 | }
72 |
73 | export default RequestIndex;
74 |
--------------------------------------------------------------------------------
/lottery-react/src/App.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import './App.css';
3 | import web3 from './web3';
4 | import lottery from './lottery';
5 |
6 | class App extends Component {
7 | state = {
8 | manager: '',
9 | players: [],
10 | balance: '',
11 | value: '',
12 | message: ''
13 | };
14 |
15 | async componentDidMount() {
16 | const manager = await lottery.methods.manager().call();
17 | const players = await lottery.methods.getPlayers().call();
18 | const balance = await web3.eth.getBalance(lottery.options.address);
19 |
20 | this.setState({ manager, players, balance });
21 | }
22 |
23 | onSubmit = async event => {
24 | event.preventDefault();
25 |
26 | const accounts = await web3.eth.getAccounts();
27 |
28 | this.setState({ message: 'Waiting on transaction success...' });
29 |
30 | await lottery.methods.enter().send({
31 | from: accounts[0],
32 | value: web3.utils.toWei(this.state.value, 'ether')
33 | });
34 |
35 | this.setState({ message: 'You have been entered!' });
36 | };
37 |
38 | onClick = async () => {
39 | const accounts = await web3.eth.getAccounts();
40 |
41 | this.setState({ message: 'Waiting on transaction success...' });
42 |
43 | await lottery.methods.pickWinner().send({
44 | from: accounts[0]
45 | });
46 |
47 | this.setState({ message: 'A winner has been picked!' });
48 | };
49 |
50 | render() {
51 | return (
52 |
53 |
Lottery Contract
54 |
55 | This contract is managed by {this.state.manager}. There are currently{' '}
56 | {this.state.players.length} people entered, competing to win{' '}
57 | {web3.utils.fromWei(this.state.balance, 'ether')} ether!
58 |
59 |
60 |
61 |
62 |
73 |
74 |
75 |
76 |
Ready to pick a winner?
77 |
Pick a winner!
78 |
79 |
80 |
81 |
{this.state.message}
82 |
83 | );
84 | }
85 | }
86 |
87 | export default App;
88 |
--------------------------------------------------------------------------------
/lottery-react/src/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/kickstart/pages/campaigns/requests/new.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import { Form, Button, Message, Input } from 'semantic-ui-react';
3 | import Campaign from '../../../ethereum/campaign';
4 | import web3 from '../../../ethereum/web3';
5 | import { Link, Router } from '../../../routes';
6 | import Layout from '../../../components/Layout';
7 |
8 | class RequestNew extends Component {
9 | state = {
10 | value: '',
11 | description: '',
12 | recipient: '',
13 | loading: false,
14 | errorMessage: ''
15 | };
16 |
17 | static async getInitialProps(props) {
18 | const { address } = props.query;
19 |
20 | return { address };
21 | }
22 |
23 | onSubmit = async event => {
24 | event.preventDefault();
25 |
26 | const campaign = Campaign(this.props.address);
27 | const { description, value, recipient } = this.state;
28 |
29 | this.setState({ loading: true, errorMessage: '' });
30 |
31 | try {
32 | const accounts = await web3.eth.getAccounts();
33 | await campaign.methods
34 | .createRequest(description, web3.utils.toWei(value, 'ether'), recipient)
35 | .send({ from: accounts[0] });
36 |
37 | Router.pushRoute(`/campaigns/${this.props.address}/requests`);
38 | } catch (err) {
39 | this.setState({ errorMessage: err.message });
40 | }
41 |
42 | this.setState({ loading: false });
43 | };
44 |
45 | render() {
46 | return (
47 |
48 |
49 | Back
50 |
51 | Create a Request
52 |
54 | Description
55 |
58 | this.setState({ description: event.target.value })}
59 | />
60 |
61 |
62 |
63 | Value in Ether
64 | this.setState({ value: event.target.value })}
67 | />
68 |
69 |
70 |
71 | Recipient
72 |
75 | this.setState({ recipient: event.target.value })}
76 | />
77 |
78 |
79 |
80 |
81 | Create!
82 |
83 |
84 |
85 | );
86 | }
87 | }
88 |
89 | export default RequestNew;
90 |
--------------------------------------------------------------------------------
/kickstart/ethereum/contracts/Campaign.sol:
--------------------------------------------------------------------------------
1 | pragma solidity ^0.4.17;
2 |
3 | contract CampaignFactory {
4 | address[] public deployedCampaigns;
5 |
6 | function createCampaign(uint minimum) public {
7 | address newCampaign = new Campaign(minimum, msg.sender);
8 | deployedCampaigns.push(newCampaign);
9 | }
10 |
11 | function getDeployedCampaigns() public view returns (address[]) {
12 | return deployedCampaigns;
13 | }
14 | }
15 |
16 | contract Campaign {
17 | struct Request {
18 | string description;
19 | uint value;
20 | address recipient;
21 | bool complete;
22 | uint approvalCount;
23 | mapping(address => bool) approvals;
24 | }
25 |
26 | Request[] public requests;
27 | address public manager;
28 | uint public minimumContribution;
29 | mapping(address => bool) public approvers;
30 | uint public approversCount;
31 |
32 | modifier restricted() {
33 | require(msg.sender == manager);
34 | _;
35 | }
36 |
37 | function Campaign(uint minimum, address creator) public {
38 | manager = creator;
39 | minimumContribution = minimum;
40 | }
41 |
42 | function contribute() public payable {
43 | require(msg.value > minimumContribution);
44 |
45 | approvers[msg.sender] = true;
46 | approversCount++;
47 | }
48 |
49 | function createRequest(string description, uint value, address recipient) public restricted {
50 | Request memory newRequest = Request({
51 | description: description,
52 | value: value,
53 | recipient: recipient,
54 | complete: false,
55 | approvalCount: 0
56 | });
57 |
58 | requests.push(newRequest);
59 | }
60 |
61 | function approveRequest(uint index) public {
62 | Request storage request = requests[index];
63 |
64 | require(approvers[msg.sender]);
65 | require(!request.approvals[msg.sender]);
66 |
67 | request.approvals[msg.sender] = true;
68 | request.approvalCount++;
69 | }
70 |
71 | function finalizeRequest(uint index) public restricted {
72 | Request storage request = requests[index];
73 |
74 | require(request.approvalCount > (approversCount / 2));
75 | require(!request.complete);
76 |
77 | request.recipient.transfer(request.value);
78 | request.complete = true;
79 | }
80 |
81 | function getSummary() public view returns (
82 | uint, uint, uint, uint, address
83 | ) {
84 | return (
85 | minimumContribution,
86 | this.balance,
87 | requests.length,
88 | approversCount,
89 | manager
90 | );
91 | }
92 |
93 | function getRequestsCount() public view returns (uint) {
94 | return requests.length;
95 | }
96 | }
97 |
--------------------------------------------------------------------------------
/lottery/test/Lottery.test.js:
--------------------------------------------------------------------------------
1 | const assert = require('assert');
2 | const ganache = require('ganache-cli');
3 | const Web3 = require('web3');
4 | const web3 = new Web3(ganache.provider());
5 |
6 | const { interface, bytecode } = require('../compile');
7 |
8 | let lottery;
9 | let accounts;
10 |
11 | beforeEach(async () => {
12 | accounts = await web3.eth.getAccounts();
13 |
14 | lottery = await new web3.eth.Contract(JSON.parse(interface))
15 | .deploy({ data: bytecode })
16 | .send({ from: accounts[0], gas: '1000000' });
17 | });
18 |
19 | describe('Lottery Contract', () => {
20 | it('deploys a contract', () => {
21 | assert.ok(lottery.options.address);
22 | });
23 |
24 | it('allows one account to enter', async () => {
25 | await lottery.methods.enter().send({
26 | from: accounts[0],
27 | value: web3.utils.toWei('0.02', 'ether')
28 | });
29 |
30 | const players = await lottery.methods.getPlayers().call({
31 | from: accounts[0]
32 | });
33 |
34 | assert.equal(accounts[0], players[0]);
35 | assert.equal(1, players.length);
36 | });
37 |
38 | it('allows multiple accounts to enter', async () => {
39 | await lottery.methods.enter().send({
40 | from: accounts[0],
41 | value: web3.utils.toWei('0.02', 'ether')
42 | });
43 | await lottery.methods.enter().send({
44 | from: accounts[1],
45 | value: web3.utils.toWei('0.02', 'ether')
46 | });
47 | await lottery.methods.enter().send({
48 | from: accounts[2],
49 | value: web3.utils.toWei('0.02', 'ether')
50 | });
51 |
52 | const players = await lottery.methods.getPlayers().call({
53 | from: accounts[0]
54 | });
55 |
56 | assert.equal(accounts[0], players[0]);
57 | assert.equal(accounts[1], players[1]);
58 | assert.equal(accounts[2], players[2]);
59 | assert.equal(3, players.length);
60 | });
61 |
62 | it('requires a minimum amount of ether to enter', async () => {
63 | try {
64 | await lottery.methods.enter().send({
65 | from: accounts[0],
66 | value: 0
67 | });
68 | assert(false);
69 | } catch (err) {
70 | assert(err);
71 | }
72 | });
73 |
74 | it('only manager can call pickWinner', async () => {
75 | try {
76 | await lottery.methods.pickWinner().send({
77 | from: accounts[1]
78 | });
79 | assert(false);
80 | } catch (err) {
81 | assert(err);
82 | }
83 | });
84 |
85 | it('sends money to the winner and resets the players array', async () => {
86 | await lottery.methods.enter().send({
87 | from: accounts[0],
88 | value: web3.utils.toWei('2', 'ether')
89 | });
90 |
91 | const initialBalance = await web3.eth.getBalance(accounts[0]);
92 | await lottery.methods.pickWinner().send({ from: accounts[0] });
93 | const finalBalance = await web3.eth.getBalance(accounts[0]);
94 | const difference = finalBalance - initialBalance;
95 |
96 | assert(difference > web3.utils.toWei('1.8', 'ether'));
97 | });
98 | });
99 |
--------------------------------------------------------------------------------
/kickstart/pages/campaigns/show.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import { Card, Grid, Button } from 'semantic-ui-react';
3 | import Layout from '../../components/Layout';
4 | import Campaign from '../../ethereum/campaign';
5 | import web3 from '../../ethereum/web3';
6 | import ContributeForm from '../../components/ContributeForm';
7 | import { Link } from '../../routes';
8 |
9 | class CampaignShow extends Component {
10 | static async getInitialProps(props) {
11 | const campaign = Campaign(props.query.address);
12 |
13 | const summary = await campaign.methods.getSummary().call();
14 |
15 | return {
16 | address: props.query.address,
17 | minimumContribution: summary[0],
18 | balance: summary[1],
19 | requestsCount: summary[2],
20 | approversCount: summary[3],
21 | manager: summary[4]
22 | };
23 | }
24 |
25 | renderCards() {
26 | const {
27 | balance,
28 | manager,
29 | minimumContribution,
30 | requestsCount,
31 | approversCount
32 | } = this.props;
33 |
34 | const items = [
35 | {
36 | header: manager,
37 | meta: 'Address of Manager',
38 | description:
39 | 'The manager created this campaign and can create requests to withdraw money',
40 | style: { overflowWrap: 'break-word' }
41 | },
42 | {
43 | header: minimumContribution,
44 | meta: 'Minimum Contribution (wei)',
45 | description:
46 | 'You must contribute at least this much wei to become an approver'
47 | },
48 | {
49 | header: requestsCount,
50 | meta: 'Number of Requests',
51 | description:
52 | 'A request tries to withdraw money from the contract. Requests must be approved by approvers'
53 | },
54 | {
55 | header: approversCount,
56 | meta: 'Number of Approvers',
57 | description:
58 | 'Number of people who have already donated to this campaign'
59 | },
60 | {
61 | header: web3.utils.fromWei(balance, 'ether'),
62 | meta: 'Campaign Balance (ether)',
63 | description:
64 | 'The balance is how much money this campaign has left to spend.'
65 | }
66 | ];
67 |
68 | return ;
69 | }
70 |
71 | render() {
72 | return (
73 |
74 | Campaign Show
75 |
76 |
77 | {this.renderCards()}
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 | View Requests
89 |
90 |
91 |
92 |
93 |
94 |
95 | );
96 | }
97 | }
98 |
99 | export default CampaignShow;
100 |
--------------------------------------------------------------------------------
/kickstart/test/Campaign.test.js:
--------------------------------------------------------------------------------
1 | const assert = require('assert');
2 | const ganache = require('ganache-cli');
3 | const Web3 = require('web3');
4 | const web3 = new Web3(ganache.provider());
5 |
6 | const compiledFactory = require('../ethereum/build/CampaignFactory.json');
7 | const compiledCampaign = require('../ethereum/build/Campaign.json');
8 |
9 | let accounts;
10 | let factory;
11 | let campaignAddress;
12 | let campaign;
13 |
14 | beforeEach(async () => {
15 | accounts = await web3.eth.getAccounts();
16 |
17 | factory = await new web3.eth.Contract(JSON.parse(compiledFactory.interface))
18 | .deploy({ data: compiledFactory.bytecode })
19 | .send({ from: accounts[0], gas: '1000000' });
20 |
21 | await factory.methods.createCampaign('100').send({
22 | from: accounts[0],
23 | gas: '1000000'
24 | });
25 |
26 | [campaignAddress] = await factory.methods.getDeployedCampaigns().call();
27 | campaign = await new web3.eth.Contract(
28 | JSON.parse(compiledCampaign.interface),
29 | campaignAddress
30 | );
31 | });
32 |
33 | describe('Campaigns', () => {
34 | it('deploys a factory and a campaign', () => {
35 | assert.ok(factory.options.address);
36 | assert.ok(campaign.options.address);
37 | });
38 |
39 | it('marks caller as the campaign manager', async () => {
40 | const manager = await campaign.methods.manager().call();
41 | assert.equal(accounts[0], manager);
42 | });
43 |
44 | it('allows people to contribute money and marks them as approvers', async () => {
45 | await campaign.methods.contribute().send({
46 | value: '200',
47 | from: accounts[1]
48 | });
49 | const isContributor = await campaign.methods.approvers(accounts[1]).call();
50 | assert(isContributor);
51 | });
52 |
53 | it('requires a minimum contribution', async () => {
54 | try {
55 | await campaign.methods.contribute().send({
56 | value: '5',
57 | from: accounts[1]
58 | });
59 | assert(false);
60 | } catch (err) {
61 | assert(err);
62 | }
63 | });
64 |
65 | it('allows a manager to make a payment request', async () => {
66 | await campaign.methods
67 | .createRequest('Buy batteries', '100', accounts[1])
68 | .send({
69 | from: accounts[0],
70 | gas: '1000000'
71 | });
72 | const request = await campaign.methods.requests(0).call();
73 |
74 | assert.equal('Buy batteries', request.description);
75 | });
76 |
77 | it('processes requests', async () => {
78 | await campaign.methods.contribute().send({
79 | from: accounts[0],
80 | value: web3.utils.toWei('10', 'ether')
81 | });
82 |
83 | await campaign.methods
84 | .createRequest('A', web3.utils.toWei('5', 'ether'), accounts[1])
85 | .send({ from: accounts[0], gas: '1000000' });
86 |
87 | await campaign.methods.approveRequest(0).send({
88 | from: accounts[0],
89 | gas: '1000000'
90 | });
91 |
92 | await campaign.methods.finalizeRequest(0).send({
93 | from: accounts[0],
94 | gas: '1000000'
95 | });
96 |
97 | let balance = await web3.eth.getBalance(accounts[1]);
98 | balance = web3.utils.fromWei(balance, 'ether');
99 | balance = parseFloat(balance);
100 |
101 | assert(balance > 104);
102 | });
103 | });
104 |
--------------------------------------------------------------------------------
/lottery-react/src/registerServiceWorker.js:
--------------------------------------------------------------------------------
1 | // In production, we register a service worker to serve assets from local cache.
2 |
3 | // This lets the app load faster on subsequent visits in production, and gives
4 | // it offline capabilities. However, it also means that developers (and users)
5 | // will only see deployed updates on the "N+1" visit to a page, since previously
6 | // cached resources are updated in the background.
7 |
8 | // To learn more about the benefits of this model, read https://goo.gl/KwvDNy.
9 | // This link also includes instructions on opting out of this behavior.
10 |
11 | const isLocalhost = Boolean(
12 | window.location.hostname === 'localhost' ||
13 | // [::1] is the IPv6 localhost address.
14 | window.location.hostname === '[::1]' ||
15 | // 127.0.0.1/8 is considered localhost for IPv4.
16 | window.location.hostname.match(
17 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
18 | )
19 | );
20 |
21 | export default function register() {
22 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
23 | // The URL constructor is available in all browsers that support SW.
24 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location);
25 | if (publicUrl.origin !== window.location.origin) {
26 | // Our service worker won't work if PUBLIC_URL is on a different origin
27 | // from what our page is served on. This might happen if a CDN is used to
28 | // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374
29 | return;
30 | }
31 |
32 | window.addEventListener('load', () => {
33 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
34 |
35 | if (isLocalhost) {
36 | // This is running on localhost. Lets check if a service worker still exists or not.
37 | checkValidServiceWorker(swUrl);
38 | } else {
39 | // Is not local host. Just register service worker
40 | registerValidSW(swUrl);
41 | }
42 | });
43 | }
44 | }
45 |
46 | function registerValidSW(swUrl) {
47 | navigator.serviceWorker
48 | .register(swUrl)
49 | .then(registration => {
50 | registration.onupdatefound = () => {
51 | const installingWorker = registration.installing;
52 | installingWorker.onstatechange = () => {
53 | if (installingWorker.state === 'installed') {
54 | if (navigator.serviceWorker.controller) {
55 | // At this point, the old content will have been purged and
56 | // the fresh content will have been added to the cache.
57 | // It's the perfect time to display a "New content is
58 | // available; please refresh." message in your web app.
59 | console.log('New content is available; please refresh.');
60 | } else {
61 | // At this point, everything has been precached.
62 | // It's the perfect time to display a
63 | // "Content is cached for offline use." message.
64 | console.log('Content is cached for offline use.');
65 | }
66 | }
67 | };
68 | };
69 | })
70 | .catch(error => {
71 | console.error('Error during service worker registration:', error);
72 | });
73 | }
74 |
75 | function checkValidServiceWorker(swUrl) {
76 | // Check if the service worker can be found. If it can't reload the page.
77 | fetch(swUrl)
78 | .then(response => {
79 | // Ensure service worker exists, and that we really are getting a JS file.
80 | if (
81 | response.status === 404 ||
82 | response.headers.get('content-type').indexOf('javascript') === -1
83 | ) {
84 | // No service worker found. Probably a different app. Reload the page.
85 | navigator.serviceWorker.ready.then(registration => {
86 | registration.unregister().then(() => {
87 | window.location.reload();
88 | });
89 | });
90 | } else {
91 | // Service worker found. Proceed as normal.
92 | registerValidSW(swUrl);
93 | }
94 | })
95 | .catch(() => {
96 | console.log(
97 | 'No internet connection found. App is running in offline mode.'
98 | );
99 | });
100 | }
101 |
102 | export function unregister() {
103 | if ('serviceWorker' in navigator) {
104 | navigator.serviceWorker.ready.then(registration => {
105 | registration.unregister();
106 | });
107 | }
108 | }
109 |
--------------------------------------------------------------------------------
/diagrams/05/diagrams.xml:
--------------------------------------------------------------------------------
1 | jZNNc4IwEIZ/DXdIxtZepdpeeqkHzxFWkjFkmRgF++ubwIaPsc6UA5M8u5uPd98kPK+7Dysa+YUl6ISlZZfw94SxNVv5fwD3AfDVegCVVeWAsgns1Q8QTIleVQmXRaJD1E41S1igMVC4BRPWYrtMO6Fe7tqICh7AvhD6kR5U6STRLE2nwCeoStLW6xUFjqI4VxavhvZLGD/13xCuRVyL8i9SlNjOEN8mPLeIbhjVXQ46SBtlG+p2T6LjuS0Y958CNhTchL7S1Q/y7sE3iCDrjk7p7lGZ/m4QqtOEb1qpHOwbUYRo663gmXS19rPMD8fbhVwtjqA3oz45arQ+ZNBASHUWzxChly3tvzES2+AV2pyU1rNMEthzNI68lL3R/K8VhVaV8azwIoGNhXRHkvAG1kH3VNVs7JV/AoA1OBtkowL+Su0l+7Noj3YyE38hJmc+ikyQf6tx6amHfkBtjNPJLn1s9iT59hc= 7Zlbb+I4FMc/Da8ocUggj5S2U62mUrVUmt1HkxwSb504cpxC99OvnTgX45RhpjCdrsoDSo5vh/P7+/jCxFtl+y8cF+k9i4FOkBPvJ971BKEwdOS3Mrw0hpmnDQkncWNye8Oa/Ava2FarSAylUVEwRgUpTGPE8hwiYdgw52xnVtsyao5a4AQswzrC1LZ+I7FItdV1nL7gDkiS6qEXvi7Y4Ogp4azK9XgT5G3rT1Oc4bYvXb9Mccx2A5N3M/FWnDHRPGX7FVAV2jZsTbvbV0o7vznk4pQGqGnwjGkFrce1X+KljUUpOHvqwuBOvKvOaUe+xLhMIdYvmJIkl8+RHB64NKQio32rQnWZ7ROlmWnGoqeqmEqEApMceDndKHDAv5G87v6Ka2GonreE0hWjjNdOtUGVvdbeDUqC+iNLMtnrI+ybMKxUdxBVvCTP8CeUfcc1rO4HULwBetVBbPvNWQ7KCemr9sld6PfB0E79kXYdVOAC9q+CcTvcchYBy0DwF1mlbeDNmiZ6BqFAk9n1evRCv7GlAymiYK7ngZ4DSdd3rwP5oKUwLgvPksWDmjHIcd9RHjiPUhVqA8PcxtApoB2OwlacSgUdpRI4BhTXZuK2Kcxk8nYkMwtJKoRKh0vVBbrd7XbTmOPdlLDfgZExd9+Nl+uZwFp+A2DIvxAw3wK2oiR6kqY74FCvaGqEOJbfjyy2qZmZaZcSAesCR6p0J8NvoemBHs9iVsrs8papE3Qk7Z6aCS01nQHqzGTabRqGszAcg3qGxBhYUO+VZ8uikGyxICy3MIp6DTJYGQDatWUQaW2ygqfCJoehS12QkThWw4yKw5TPD+jjVLZ1Pf073fNzdduUN+Q6Olmdt3OdW1ybKelQUor/F1LvrRuXH6Poz22KswtRdAMLFcRyY69fGRcpS1iO6U1vPQjqgCnsifhLm9Xz3+p5KvO6wo25WKqDxjCtStstUc41TfK4rRFRXJYkaoy6ihrhHxDiRXPBlVwPvKvex6+MFaPqej1jeyZq5HwXtQrP8R2qjCareKRrhePsOVCZ/J7NrsZI6qYPjMhBOs34B8u05wfTmdmJDG4CQrc7UETnyGkiWVxeJHO/Zi19UmXu1HE7g66wWLSGB+BEuq+yQTOth9rqlTOUl2vKSwuw15bzcbUlt0U16aOp5mS5nZo4kH2uOYMm3COacA708JlVDsg7vwh9aK38a+ByBfzcjp94UzH3D/bjYWiv+M7Yiu+dAZ9rH7PuHu+/Sss1iyYooGqjtpE0g0Q9/bFWu/WyBFF+WMDHNnCXAOyHB6tze7QdAkYjgL1zbOns+XnLeKbIVZuMCIHpJ8ifBDmbjdxfXQpk2+8A5DUWeINL+LAAf3WqDdF7plpk/1nwyHFM1K2HmoXOkkcKVSQqbjP93plZXQRGC9hs7djHGBbb6Pc4PYdnvRA5jnt2uLKO3HShsZuun5iv8rX/16k5VfX/7Hk3/wE= 7ZpRc6M2EIB/Sx/8cjPnARSw/Zg4STNtrpO5ZCbXRxlko1ogj5CD3V9fCSRACDs4Icm1jR88aCWE2G93tVp7BObJ7lcGN/E3GiEy8pxoNwKXI8+bzRzxLQX7UnAGlGDFcFSK3Fpwj/9GSqiHbXGEMmMgp5RwvDGFIU1TFHJDBhmjuTlsSYn51A1cIUtwH0JiSx9xxGMldR2n7rhBeBWrR0991bGA4XrF6DZVzxt5YFl8yu4E6rnU+CyGEc0bInA1AnNGKS+vkt0cEalarbbyvusDvdW6GUp5nxu88oYnSLZIr7hYF99rXWSc0XWlBncELqpFO6IRwSxGkWpAglepuA7F4xETgpgnpL5rI6dMditpM+OEhuvtZiwQcohTxLLxQoJD7BGnxfQXTBmGnHmJCZlTQlmxKK1UMWuxukZPUHxETyJmfUC7Ug1zOR0KtyzDT+g7yuqJC1jVCxC4QOSigqjnTWmK5CLEWtWa3KlqNx7tFB8hV0pFjKPdQTBuhVt4EaIJ4mwvhqgbtMMoBwIzULbz2hzBzC9lccMSvWCi3EC5wKqaujYDcaEsodsqgGUVd9JhPMf9QOuAaRhLTRsUJjaFygD04wha8r5QvKNQAhOK61lMXB3BTCavR3JmIYk5l9HwXE7hXed5Po4YzMeY/gyMDNf9MF5uy4s0vwYwz38jYO7MIjYnOFwL0Q1iqNjRxNdVoeY2MTMo5THm6H4DQ9mbC9VbWGqYxwOYFS2rkGXaiHck4vYNgpYlDQD0zORZ5QtND5x1AR0gKOotuwH0lnLxanJ9c6EEBkP+i4WSF1uQwcuAoLeWhraVyFKgVB0WScq56khwFMnHdBqIaUIn2EhfvsU49Z7u8GxdHfKabDud1RmA7cRiqxyz9NIcpzK5wyuZwwk17f9jnMFrk5nT0PoTG+3ZW6GddqS4AZGsIvwkLlfyMkcLoMVixkbPZ2zuCRk4Lcoz24G7MlYwQGx2AwsTisSJTjUp4zFd0RSSq1ra8pwGNLTD/IcSy+s/5fXYly0R5feyyx07zlQLyn7Pd7XgDjEs3kFqtvRKDhk/l+fSJm4hu8bylcoHpZEeERKYZTgshWqInPsvxPle4YVbEZjARf1mt5RuOgPPYUsCJ1hMqV+p1IPmoQ8HdMtCNUr5nnjVFTpuRAwRyMXZzJjqNSZhu/09Yk+fuVbvE2gwM/25quE8F7WDAaK2a+O74rHIm7eJkP6BeE7Z+hPlC1H6E//9UHaUlAaIzfq6js3/2yBbVUgbUbb0n3cIsx2FiQcG00ychTBNe2TJTBbj4ILoasGG4pQXC/IvRv7lSfnxAS8+5IYvynpVyVmteFTlqEaidDxTckTyoAOc8sivqtmbj5r8TmqrnvlrYKZg5v10ucyEgbTpVgvsB9y1gH9DHCYwW3fk1Vq0YG1JO8t+xa2fu0CvXeDM81u7QNeG3pGhT4bYBTpqytsFEQHYu75j+AlyWRL7He2zj+MZhFO0WPbhGUE0XYYnhJM34QnMGBJ0VcO8tzpWBxbPm4dvt0JySUPbdX+7Fz3nmQg/H8j3lf763nx9t5WA6zPNc3zBEHzt8nUjAT9nocQU8q2sZJ9YCWt62iG/+glqYrMjuE+vfT7za9/ERA38jl8qugrbQ6AGdmH7O4IRTmW1c8moBC7QywIoocUPGGEMi4JoCIuyqOyKpAI9R6Z8anDWfdz+V9dJ+9qEN4BNVP8pqM7fHe4PvDeyCTvLe2SYlzYRQQ5HqjJemIS2hy/JNuNfWiZhWFBIsHz9T6N46Z7QKrIGXT9pBsEgRiGa9R9RypNC/WcfcPUP 7VXBkpswDP0arh3Am2167KbJ9tD20BzaHr2ggBtjUWMC6ddXBgFhyHbS7nWZgbGfZMnWezKB2BTto5Vl/hlT0EEcpm0gPgRxvI5X9PXAuQfEat0DmVVpD0UTsFe/gcGQ0VqlUM0cHaJ2qpyDCRoDiZth0lps5m4H1POspcxgAewTqZfoN5W6nNEoDCfDR1BZzqnXKzY8yeSYWawN5wticeie3lzIIRb7V7lMsbmAxDYQG4vo+lHRbkD70g5l69ftnrGO+7Zg3C0L7ngb7jwcHVKqBE/RuhwzNFJvJ/ShOx74ACHNcldoGkY0hFa57x5+s+LZD7ZUTlr33hNDgEEDA7ZTWnMgMOngkWhZVSrpQXbxYX6Cc2dWi6wdEjRt8RNiOaazeIQNarTdoUTYPaNl4FQQckDjOGQc8vzayr5QvjrPlpqhCmubsFfM4pU2A/YSI83UPYAFOHsmFwtaOnWaR5es42z0m7ikAdN5nVpOfZK65qBfSFXUDLJQWklLw0ZRGeLwK0jfQ7uFFuZMN7lysC9ld7aG+n7O/ihl76vlE+iHsRmGgo7U38ZP7Pkg+i88uZtu501qlRmvKaIJ7LCQz8hlPoF10P6d1yVjvEC8417mu45y9/NmujnE0O/5xaVxH76cZLEg+RG7y9J/cvDRy5KaSLWeWboqFRoPutFORvriYQQSkm/VrewsXrc0pvdXrZKjz22IpLTmWK+S+Q/JvJ1LRtxdkcz9FclE0b9rhqbT/6SzXfyzxfYP 7ZnNbqMwEICfZQ9cI7DzQ45ttt097ErVtlLODjjBisHIOIXs069tbAIxjSKFpKu2OaQwNuNhvpnxuPHgIq1+cJQnv1mMqQf8uPLgdw+A+dyX30qwrwVjaAQbTuJaFBwEz+QvNkI7bUdiXHQmCsaoIHlXGLEsw5HoyBDnrOxOWzPaXTVHG+wIniNEXemSxCIx0sD3DwM/MdkkZulwYgZWKNpuONtlZj0PwLX+1MMpsrrM/CJBMStbIvjgwQVnTNRXabXAVLnWuq1+7vGN0cZujjNxzgOgfuAV0R22Fmu7xN76ohCcbRs3BB68b4z25U2MigTH5gZRssnkdSSXx1wKEpHSw1O5UplWGxUzo5RF210+kggFIhnmxWilwGG+JJlWf89NYCjNa0LpglHGtVHWqVKrtq41MtUfOZJKrS+4qt2wUOpwtOMFecV/cHFQrGE1L0DRCtP7BqLVm7EMKyOkrcamIDT3raV9/ZFy41TMBa7eBBM0uGUWYZZiwfdyinkAhCZCTAaBwJApD/E4semStEJxDEKTByYHNo3uQxzICxMK/WEBnbB4UhkD/OAdwwNlUaJc3cEwczE0EWCXo3gtzqUCTlKZdqH0MAn6mIDp5UjGDpJECFUO75QK8FiW5SjmqBwR9j8w6uTuu/EKYBeY5dcCBiZXAjZ1gP1iQrpUmbeQHuAoEt8cVEJXrI7TOxXOVqJWOTQiB5zyHJF72p0ZSEkcq2Xuy4QI/JyjSK1ZSpJOGeyExzA1Uc8z7xkMgHZ8nIpjNxd70fqXo505aF8SUtT9iOaq5hZ6v89k3YxVY6BM9ys/CNEqxGE0n7ul9HL2JnNuTx5euhuehg3DLuzJzM3j8Eqw5z2wMce601TfsqlQr0GVuYF+LcxyqkZ0Iir6Cx0aaY4FyTa6l9W2Z/IbjuB8ouYKqfQa5eCjhsRx/oduaYe9e/EAIWH1tmJiiTJhydZ27tmOyz90F209+PhZyF65zEvON8QcOJjvUukbBZqtbdJa6vW2+0kwD99Lg7FL9mobuG3cW2SDke/A67qxz9Hd5vhcLzuH1sav3U4dnDj4nktq+Ka6KX+nyPl95MAA5Nyj6UNv4n0kdk1LP3R1Pc7B2S1JuifaF5JiW05zIvdNuULdKWXq9b820WE2UXjTTdQ9Bz/VaJc11q/EvTxx4U1LsHv89Su8DsJwhWaTGZypNZE6/pYs+2D/4bhl1h4demHYw3gKBslaeXv4zUGPtX7XgQ//AA== 7ZpRc6o4FMc/yz44fXMgEcXH1q27D3dndq6d6d3HCBFyG4gTYtX99JsTAkJDO90R6Z1WHxROQhLO7/xPQnCEF9nhD0m26V8ipnyEvPgwwr+PEJrPPf0NhmNpmGBrSCSLS5N/MqzYv9Qaq2o7FtOiVVEJwRXbto2RyHMaqZaNSCn27Wobwdu9bklCHcMqIty1PrJYpdbqe96p4E/KktR2HQa2YE2ip0SKXW77GyG8MZ+yOCNVW7Z+kZJY7BsmfD/CCymEKo+yw4JycG3ltvK65Sul9bglzdV7LkDlBc+E72g1YjMudax8USgpnmo3+CN8Vw/a0ycxKVIa2xPCWZLr40h3T6U2pCrjp6u20GR2SCBmxpmInnbbsUaoCMupLMZrAEflI8tN83fSBga0vGGcLwQX0gyqcqpu1YyuUTI1H12S6VYf6KF0wwKao9FOFuyZfqfFqWEDq74BTtaU39UQq3ZzkVMYhB6rHZMf2vNG1575aLt1KpWKHl4F49e4tYqoyKiSR13FXoCnQXmJVRDyp+X5/hSPQSWXtBGKExRaHVgNJHXbpzjQBzYUusMCO2HxNygGef4HhgfJoxRc3cIwczHUEVB1x+lGvZcKepPK1GtB8ZHDxO9igqbnI5k4SFKlIB3eQhNoud/vx7Ek+zETvwKjlnY/jJeP28Aqfg1gKLgQsMAB9k0o7VIY3kJ7QJJI/eagUiZjtZzeynBVJmqkQ2tywIHnmJ7Tbm1BxuIYurnbp0zR1ZZE0Odek3TSYCs8+smJpp69T78HtJOXUpy4WuxE652PduqgfUhZUa5HDFeoW5j5Ptd5M4aFAQzdO3h+SNYhDaP53E2l57O3yhmePD53NnwbNg7bsIOZq+PwQrBnHbCppGalCd96UQG3wWG4vrktKrYcSowQgf7ChEa2pYrliVnLmrHn+huP8TyAuko3eol08FlD4qX+Qze14865uIeQCJ2QeCS5qsCWwzyKndQ/fBc9jfDyq4C9cJbXmIejPHco32baNcBZbCrJVtDLSfeLUO5/JY0mLtiLTd9VwDTI+mPPgdd2Y5ej20vj93rZeWSt/dpep6M3HnvfS6r/JXXtvbfIeV3kUA/kfIfcfafwPhO7ekHfd3J9qcHZkCTdnacHltEqnW6ZnjZ1D+U6KYfbv86h/cyheMg51O/YSSrRPpZYr8I9X7h40BTsbkR5B7rxw3BNZsEMz6BPAg+/e5F/sv2NIVX74pEXhx2Mp+hCqp063Gic0Or2hFSpSERO+P3J+sLDDcD0wNSPxvE/UGUcwFmuB/bDXmFOyjIUmLggUt3Cy5ymirVtyWDg9pq4qhFxUhQsKo22CvT4kyp1tADJTk8u+O40/m9CbDvD8PUEgf9HTJReBNe9GgTVLpB+WoyqWnbnUN9rQm21WXesSMqJYs/t5s8i7+5aftdtMPoMUzPLN0JmukcBWxcq1ciTFPY2COdF/fibml2ReifskyeA5bK/lz4It1/6YOxuanQm9mkf6MOPFf3X1vzM1bz/SrD0L3p3i/NmpT1605b0jdEdGDe7PCqTwFXc7xc3aot7MqS4kbu9cRX3YOKed4gbDyVudxuzU9zwxF0+k10V3pPCAy8YUOHoqvAPU3j9J7WmwicDKRy5m6IrRdTOrMhBruZNJblK+YyVeBDii0lZn57+8GfKGn+qxPf/AQ== 7VrLcqM4FP2WWXhLgWSwvUzccc9iuibVmar0LGVQQG2BKCGCPV8/Eki8RDJOYsdT1WaRgivpSr7nnKtXZnCd7r9ylCffWITpDLjRfga/zABYrVz5VxkOjWEOtSHmJGpMXmd4IP9gbTTVShLhYlBRMEYFyYfGkGUZDsXAhjhn1bDaE6PDXnMUY8vwECJqWx9JJBJt9Vy3K/gdkzjRXS99XbBF4S7mrMx0fzMAn+qnKU6R8aXrFwmKWNUzwbsZXHPGRPOW7teYqtCasDXtNi+UtuPmOBPHNABNg2dES2xGXI9LHEwsCsHZrg2DN4O37aBd+RGhIsGR/kCUxJl8D2X3mEtDIlLatcqVy3QfK844KQt3Ze5ICAUiGeaFs1XAYf5Istr9LdfEUJ6fCKVrRhmvB2WCKr3Wo+uVBPUjS1Lp9S+8b8KwVu5wWPKCPOPvuOgc12C1P4CiLaa3LYjGb8YyrAYhx6rH5EH93et6s3HlI+06qJgLvH8RGK+FW6oIsxQLfpBVjIQ0QbSAPKg9VB0d2zpJj4lwsdIy0BKIW9cdDeSLZsI0K6DFinslGOB6F2QHysJERXqAwsJGoSWA6Y7iJ3EsKOBVUIIRKMDCxPMmMAHBxyGZW5AkQqhseKNcgE1VVU7EUeUQ9n/AaCDdi+HlwSFgBr++iPwzAba0YMCRnGP0J+MiYTHLEL3rrKNc1Is83hPxQ5vV+9/q3fHVVybH9cNUUx9dWSEQFzdqOuxSWG3bEDXsxlsWmRohRUVBwsaoqyivP7EQBw0gKgWTpm74fzCWG3qMU7Hr6nw4JCAccgK4Nifalk0QVeRez6My0Kzkoa7l6yUD4jHWtYJponBMkZBTwnAF8QHYfUun37BAKSp2Fh+GaFcJEfghR/VvqKS+LO11in19ljoWB/DKtHosPla6OMHUF/hD1QJ/YefZYEK2yxNMfSZ/X3V7Ad1+VKS66T0jspOWT3DEJ+h6zmLVe/yhxyZtaCcj5rSjOopMwcTqOqBqctty+RY309zYUuEtVK1cB9hkvCaN6aQxn18yaXgW0N9JtsPbwxW/d+LnGfH8F36BfwL84FmSfpPoTdr/lRO72Sn1V2TeC4Q4+ZLMdN7fznL2TCLJ3as8j5RncER6BRPynM9PAGBwXZNdTrrzCen6nyVd+9jjz1Kq1r3J86t237mfmrv2WeL5lkaLT9au66zgUL5LsDSGe8yJ/Akqsr/4hDxxRPLCWdrpRW2fkbxlW+Q5113Re1fVnyr9id3rWVbV12l7SuDLiWn7owqvm8pYoUOvQq4OSoqe59Hxiw9Gxy/L0ZXkqH4AP1Yf6BuwjqXNiN97iGMied0+nG77MJmHzrZ9WFkAPqrLTDn62nNRpiSLlVYSZSgLBaybyC6B2x3euySTiYNSHP1mwS7qa+YBtmPAtkt/7k9dZC9DHIZTYVcBJyGiN7ogJVFUp8gpWg2J9wZmHcuKup7+xd4JGLEY36V69t2cN3XBvVq8mRHys/uPiiYDdP+1Au/+BQ== 7VlRj5s4EP41kXovEZhAyGM23bSVtuqqe1JvHx2YgG8NjoxTkvv1Z4MNOKZR7jZtTrrNA7LH4/Ew3zf24EyCVXH4wPEu/8xSoBPkpYdJ8H6CUIxC+VSCYysIwrgVZJykrcjvBU/kL9BCT0v3JIXKUhSMUUF2tjBhZQmJsGSYc1bbaltG7VV3OANH8JRg6kq/kVTkWup7Xj/wEUiW66XjUA9scPKScbYv9XoTFGybXztcYGNL61c5Tlk9EAX3k2DFGRNtqzisgKrQmrC189Y/GO385lCKSyagdsJ3TPdgPG78EkcTi0pw9tKFwZ8Ed53TnuykuMoh1R1MSVbKdiKXBy4FuShoP2unTBaHTHFmWrDkZb+bSggFJiXwarpRwAH/RsrG/B3XxFCWt4TSFaOMN06ZoEqrjXeDkaj5yZFCWv0dDm0YVsocJHteke/wFarecANW9wIUb4DedSAauyUrQTkhfdU++YHuD5Zerz35k3IdVOACDj8Exu/gllkErADBj1JFT+hSQWeQP9P9uudjYFiUD6jYCbHOgayz3fNANjQVxmkROLR4VBmDPP+G9MBlkqtQWzDMXRg6BpjlKGzFpaigs6hEJ6AgBxPfH8EERa+HZOZAkguhtsOlMoHWdV1PU47rKWH/BYys3L0ZXn5gAxa5SYTCnwTYwoEBUnnI6C7jImcZKzG976Unm9Eg8nAg4g8lnoa696yVZCT4cTCkus8GL4G5WKrzsN/DGtmaKLf1/NRoJBRXFUlaoVZRZv4EIY4aQLwXTIp69x8Y23XLnezFnqc3RJuAgc0J5Lmc6Ga2QVSRO08BGWi254nWmuuaAfMMzBE9ThQOFAt5JtglxCtgnzt5upKvxrGsUpC3vPskn++ISq0tTuA3hyM2A+qcCHja4ea9aplzTj72WXz+6LoUG3TmrL0UM2cLuUYmh3Ymo5Hz0B87D6MrHIexg2kNm+ANu3+JnR+Evw47c0YPwHv4slo+SNHqy+Pz7UCMkhg220tATDHE2+TGIKIbYhg6EH4l5QtspJGIqlJhw2Ura4uGnyd5S/eLPl3mUWxTxfSHVddomezNXs+VyOHKe9hRdpRAIe+BCfmaytdPpSyESgnWW/5fiOoisg/g+cgBHIYuqvNrbOKeg9MVimnTbkrppnr+fxTM5iN+UDDHbsEc/aKC2fedjF2TUmWryKG94zPlM24eacqhqmTLO/ibGC/cKyvRXPtYiWpF2lznDNJMi5zMUTlDEkyXeqAgadqwa2xnsBn3DzaHS8Ft9PR7mrrmNUkdzk6q6rGkXoxu1VcA3q2gr/6F7L99IY8nvCmLr5nxzVQZKnwcKOyY/NqtBpYflWBQVy5sCgbzkxvrE/14PjunLxutBz0Fu1cZY6Xs9rftrXr/j0Zw/zc= 7ZdNb+MgEIZ/jZWrDU6Ta+t2dy+VVspKe6ZmYqNiE+HJ1/76BRv8UZK2aXd7ig+ReYEBz/OOcSKaVYfvmm3KR8VBRiTmh4jeR4QsFqn5tcKxE+h82QmFFryTkkFYiT/gxNipW8GhmQxEpSSKzVTMVV1DjhONaa3202FrJaerblgBgbDKmQzV34Jj6dQkjoeOHyCK0i29nLuOJ5Y/F1pta7deROi6vbruivlYbnxTMq72I4k+RDTTSmF3Vx0ykDa1Pm3dvG9nevt9a6jxPRNIN2HH5Bb8jtt94dHnAmp+a1NqWrlkTSPyiN6VWEkjJOa2Qa2eIVNS6XYCjdur7/EJpEZZqxodbRK79qmZ3SaAB5SG50r6bBkTgqoA9dEM2Q+4PJNyBMprGiRDsZuGZ841RR+uX+GnEmZhEjuD04WL4/yd+LYP0aitzsHNGuf/jUBp+iIQMl0ABoHMzeixB6nFexo1DVBnqtqoGtr9mMRy0E1Av/Uy2BCWy74UCKsNy23v3pT+Cyt4N9uxkj2BvOvrwWOuzYoXuIZYlwgpRyNdQb3fTUyKorb2NY8KurfXDjTC4VKDuQlpfMYBIwPS+IQDb+LzZpvQfQVlGqDMPcp7wR9Nui1S8zqThtyV6MeIkvQLic4DorPM4JvZMwOwVNxUZqzq7shDzXK8cv0gV5p8IdebgOsvUUHAzjwdvnaqOhTj9DopyJjNlTClf+s6KsG5XeakI6aeucAUlx3kn+JHydtv2vQEPvIP8C0CfCuwr1bOkPmCnDXIEGbXevxoPS7/Xz2a5vAt3X0zDf9X6MNf
--------------------------------------------------------------------------------
/diagrams/00/diagrams.xml:
--------------------------------------------------------------------------------
1 | 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
--------------------------------------------------------------------------------
/diagrams/01/diagrams.xml:
--------------------------------------------------------------------------------
1 | 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
--------------------------------------------------------------------------------
/diagrams/04/diagrams.xml:
--------------------------------------------------------------------------------
1 | 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
--------------------------------------------------------------------------------
/diagrams/07/diagrams.xml:
--------------------------------------------------------------------------------
1 | 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
--------------------------------------------------------------------------------