├── .gitignore ├── README.md ├── backend ├── .prettierrc ├── artifacts │ └── contracts │ │ └── vEVM.sol │ │ ├── vEVM.dbg.json │ │ └── vEVM.json ├── contracts │ └── vEVM.sol ├── hardhat.config.js ├── package.json ├── scripts │ └── deploy.js └── test │ └── vEVM.js ├── frontend ├── .DS_Store ├── .npmrc ├── README.md ├── abi │ └── vEVM.json ├── index.html ├── package.json ├── polyfills.ts ├── public │ ├── ethereum_logo.webp │ ├── logo-etherscan-light.svg │ ├── logo-evmcodes-light.png │ ├── logo-github-light.png │ ├── logo-specification-light.png │ ├── vEVM.ico │ └── vEVM.png ├── src │ ├── App.css │ ├── App.tsx │ ├── components │ │ ├── Account │ │ │ ├── Account.tsx │ │ │ └── index.ts │ │ └── EVMResults │ │ │ ├── EVMResults.tsx │ │ │ └── index.ts │ ├── main.tsx │ ├── vite-env.d.ts │ └── wagmi.ts ├── tsconfig.json └── vite.config.ts └── vEVM.code-workspace /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | coverage 4 | coverage.json 5 | typechain 6 | typechain-types 7 | 8 | artifacts/build-info 9 | artifacts/hardhat 10 | cache 11 | 12 | package-lock.json 13 | 14 | backend/node_modules 15 | backend/.env 16 | backend/coverage 17 | backend/coverage.json 18 | backend/typechain 19 | backend/typechain-types 20 | backend/artifacts/build-info 21 | backend/artifacts/hardhat 22 | backend/cache 23 | backend/package-lock.json 24 | 25 | frontend/node_modules 26 | frontend/.env 27 | frontend/package-lock.json 28 | frontend/.pnp 29 | frontend/.pnp.js 30 | frontend/coverage 31 | frontend/dist 32 | frontend/dist-ssr 33 | frontend/build 34 | frontend/*.pem 35 | frontend/*.local 36 | frontend/npm-debug.log* 37 | frontend/yarn-debug.log* 38 | frontend/yarn-error.log* 39 | frontend/.pnpm-debug.log* 40 | frontend/.env\*.local 41 | frontend/.vercel 42 | frontend/*.tsbuildinfo 43 | frontend/next-env.d.ts 44 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # vEVM 2 | 3 | ## example 4 | 5 | https://goerli.basescan.org/address/0x4121E8574D28b2E5f5777F7B00d435Ee4886A5F4 6 | 7 | ``` 8 | await evm.execute("60016002600360005260AA60005560006000A07F000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F60206000527FA5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C360206000A160206000F3"); 9 | ``` 10 | 11 | returns 12 | 13 | ``` 14 | struct vEVMState { 15 | bytes code; 16 | bytes data; 17 | uint256 value; 18 | uint256 pc; 19 | bytes32[] stack; 20 | bytes mem; 21 | uint256 msize; 22 | bytes32[] storageKey; 23 | bytes32[] storageData; 24 | bytes[] logs; 25 | bytes output; 26 | bool running; 27 | bool reverting; 28 | } 29 | ``` 30 | 31 | ### 0x00 range - arithmetic ops 32 | 33 | | Mnemonic | OpCode | Status | 34 | | ---------- | ------ | ------ | 35 | | STOP | 0x0 | Done | 36 | | ADD | 0x1 | Done | 37 | | MUL | 0x2 | Done | 38 | | SUB | 0x3 | Done | 39 | | DIV | 0x4 | Done | 40 | | SDIV | 0x5 | Done | 41 | | MOD | 0x6 | Done | 42 | | SMOD | 0x7 | Done | 43 | | ADDMOD | 0x8 | Done | 44 | | MULMOD | 0x9 | Done | 45 | | EXP | 0xa | Done | 46 | | SIGNEXTEND | 0xb | Done | 47 | 48 | ### 0x10 range - comparison ops 49 | 50 | | Mnemonic | OpCode | Status | 51 | | -------- | ------ | ------ | 52 | | LT | 0x10 | Done | 53 | | GT | 0x11 | Done | 54 | | SLT | 0x12 | Done | 55 | | SGT | 0x13 | Done | 56 | | EQ | 0x14 | Done | 57 | | ISZERO | 0x15 | Done | 58 | | AND | 0x16 | Done | 59 | | OR | 0x17 | Done | 60 | | XOR | 0x18 | Done | 61 | | NOT | 0x19 | Done | 62 | | BYTE | 0x1a | Done | 63 | | SHL | 0x1b | Done | 64 | | SHR | 0x1c | Done | 65 | | SAR | 0x1d | Done | 66 | 67 | ### 0x20 range - crypto 68 | 69 | | Mnemonic | OpCode | Status | 70 | | -------- | ------ | ------ | 71 | | SHA3 | 0x20 | Done | 72 | 73 | ### 0x30 range - closure state 74 | 75 | | Mnemonic | OpCode | Status | 76 | | -------------- | ------ | ------ | 77 | | ADDRESS | 0x30 | Done | 78 | | BALANCE | 0x31 | Done | 79 | | ORIGIN | 0x32 | Done | 80 | | CALLER | 0x33 | Done | 81 | | CALLVALUE | 0x34 | Done | 82 | | CALLDATALOAD | 0x35 | Done | 83 | | CALLDATASIZE | 0x36 | Done | 84 | | CALLDATACOPY | 0x37 | | 85 | | CODESIZE | 0x38 | Done | 86 | | CODECOPY | 0x39 | | 87 | | GASPRICE | 0x3a | Done | 88 | | EXTCODESIZE | 0x3b | Done | 89 | | EXTCODECOPY | 0x3c | | 90 | | RETURNDATASIZE | 0x3d | | 91 | | RETURNDATACOPY | 0x3e | | 92 | | EXTCODEHASH | 0x3f | | 93 | 94 | ### 0x40 range - block operations 95 | 96 | | Mnemonic | OpCode | Status | 97 | | ----------- | ------ | ------ | 98 | | BLOCKHASH | 0x40 | Done | 99 | | COINBASE | 0x41 | Done | 100 | | TIMESTAMP | 0x42 | Done | 101 | | NUMBER | 0x43 | Done | 102 | | DIFFICULTY | 0x44 | | 103 | | RANDOM | 0x44 | | 104 | | PREVRANDAO | 0x44 | | 105 | | GASLIMIT | 0x45 | | 106 | | CHAINID | 0x46 | Done | 107 | | SELFBALANCE | 0x47 | Done | 108 | | BASEFEE | 0x48 | Done | 109 | 110 | ### 0x50 range - 'storage' and execution 111 | 112 | | Mnemonic | OpCode | Status | 113 | | -------- | ------ | ------ | 114 | | POP | 0x50 | Done | 115 | | MLOAD | 0x51 | Done | 116 | | MSTORE | 0x52 | Done | 117 | | MSTORE8 | 0x53 | Done | 118 | | SLOAD | 0x54 | Done | 119 | | SSTORE | 0x55 | Done | 120 | | JUMP | 0x56 | Done | 121 | | JUMPI | 0x57 | Done | 122 | | PC | 0x58 | Done | 123 | | MSIZE | 0x59 | Done | 124 | | GAS | 0x5a | | 125 | | JUMPDEST | 0x5b | Done | 126 | | PUSH0 | 0x5f | | 127 | 128 | ### 0x60 range - pushes 129 | 130 | | Mnemonic | OpCode | Status | 131 | | -------- | ------ | ------ | 132 | | PUSH1 | 0x60 | Done | 133 | | PUSH2 | 0x61 | Done | 134 | | PUSH3 | 0x62 | Done | 135 | | PUSH4 | 0x63 | Done | 136 | | PUSH5 | 0x64 | Done | 137 | | PUSH6 | 0x65 | Done | 138 | | PUSH7 | 0x66 | Done | 139 | | PUSH8 | 0x67 | Done | 140 | | PUSH9 | 0x68 | Done | 141 | | PUSH10 | 0x69 | Done | 142 | | PUSH11 | 0x6a | Done | 143 | | PUSH12 | 0x6b | Done | 144 | | PUSH13 | 0x6c | Done | 145 | | PUSH14 | 0x6d | Done | 146 | | PUSH15 | 0x6e | Done | 147 | | PUSH16 | 0x6f | Done | 148 | | PUSH17 | 0x70 | Done | 149 | | PUSH18 | 0x71 | Done | 150 | | PUSH19 | 0x72 | Done | 151 | | PUSH20 | 0x73 | Done | 152 | | PUSH21 | 0x74 | Done | 153 | | PUSH22 | 0x75 | Done | 154 | | PUSH23 | 0x76 | Done | 155 | | PUSH24 | 0x77 | Done | 156 | | PUSH25 | 0x78 | Done | 157 | | PUSH26 | 0x79 | Done | 158 | | PUSH27 | 0x7a | Done | 159 | | PUSH28 | 0x7b | Done | 160 | | PUSH29 | 0x7c | Done | 161 | | PUSH30 | 0x7d | Done | 162 | | PUSH31 | 0x7e | Done | 163 | | PUSH32 | 0x7f | Done | 164 | 165 | ### 0x80 range - dups 166 | 167 | | Mnemonic | OpCode | Status | 168 | | -------- | ------ | ------ | 169 | | DUP1 | 0x80 | Done | 170 | | DUP2 | 0x81 | Done | 171 | | DUP3 | 0x82 | Done | 172 | | DUP4 | 0x83 | Done | 173 | | DUP5 | 0x84 | Done | 174 | | DUP6 | 0x85 | Done | 175 | | DUP7 | 0x86 | Done | 176 | | DUP8 | 0x87 | Done | 177 | | DUP9 | 0x88 | Done | 178 | | DUP10 | 0x89 | Done | 179 | | DUP11 | 0x8a | Done | 180 | | DUP12 | 0x8b | Done | 181 | | DUP13 | 0x8c | Done | 182 | | DUP14 | 0x8d | Done | 183 | | DUP15 | 0x8e | Done | 184 | | DUP16 | 0x8f | Done | 185 | 186 | ### 0x90 range - swaps 187 | 188 | | Mnemonic | OpCode | Status | 189 | | -------- | ------ | ------ | 190 | | SWAP1 | 0x90 | Done | 191 | | SWAP2 | 0x91 | Done | 192 | | SWAP3 | 0x92 | Done | 193 | | SWAP4 | 0x93 | Done | 194 | | SWAP5 | 0x94 | Done | 195 | | SWAP6 | 0x95 | Done | 196 | | SWAP7 | 0x96 | Done | 197 | | SWAP8 | 0x97 | Done | 198 | | SWAP9 | 0x98 | Done | 199 | | SWAP10 | 0x99 | Done | 200 | | SWAP11 | 0x9a | Done | 201 | | SWAP12 | 0x9b | Done | 202 | | SWAP13 | 0x9c | Done | 203 | | SWAP14 | 0x9d | Done | 204 | | SWAP15 | 0x9e | Done | 205 | | SWAP16 | 0x9f | Done | 206 | 207 | ### 0xa0 range - logging ops 208 | 209 | | Mnemonic | OpCode | Status | 210 | | -------- | ------ | ------ | 211 | | LOG0 | 0xa0 | Done | 212 | | LOG1 | 0xa1 | Done | 213 | | LOG2 | 0xa2 | Done | 214 | | LOG3 | 0xa3 | Done | 215 | | LOG4 | 0xa4 | Done | 216 | 217 | ### 0xb0 range 218 | 219 | | Mnemonic | OpCode | Status | 220 | | -------- | ------ | ------ | 221 | | TLOAD | 0xb3 | | 222 | | TSTORE | 0xb4 | | 223 | 224 | ### 0xf0 range - closures 225 | 226 | | Mnemonic | OpCode | Status | 227 | | ------------ | ------ | ------ | 228 | | CREATE | 0xf0 | | 229 | | CALL | 0xf1 | | 230 | | CALLCODE | 0xf2 | | 231 | | RETURN | 0xf3 | Done | 232 | | DELEGATECALL | 0xf4 | | 233 | | CREATE2 | 0xf5 | | 234 | | STATICCALL | 0xfa | | 235 | | REVERT | 0xfd | | 236 | | INVALID | 0xfe | | 237 | | SELFDESTRUCT | 0xff | Done | 238 | -------------------------------------------------------------------------------- /backend/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "prettier.eslintIntegration": false, 3 | } -------------------------------------------------------------------------------- /backend/artifacts/contracts/vEVM.sol/vEVM.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../build-info/883df6b9215c2c11e0a06aa0aa931377.json" 4 | } 5 | -------------------------------------------------------------------------------- /backend/artifacts/contracts/vEVM.sol/vEVM.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "vEVM", 4 | "sourceName": "contracts/vEVM.sol", 5 | "abi": [ 6 | { 7 | "inputs": [], 8 | "stateMutability": "nonpayable", 9 | "type": "constructor" 10 | }, 11 | { 12 | "inputs": [ 13 | { 14 | "internalType": "bytes", 15 | "name": "bytecode", 16 | "type": "bytes" 17 | }, 18 | { 19 | "internalType": "bytes", 20 | "name": "data", 21 | "type": "bytes" 22 | }, 23 | { 24 | "internalType": "uint256", 25 | "name": "value", 26 | "type": "uint256" 27 | } 28 | ], 29 | "name": "execute", 30 | "outputs": [ 31 | { 32 | "components": [ 33 | { 34 | "internalType": "bytes", 35 | "name": "code", 36 | "type": "bytes" 37 | }, 38 | { 39 | "internalType": "bytes", 40 | "name": "data", 41 | "type": "bytes" 42 | }, 43 | { 44 | "internalType": "uint256", 45 | "name": "value", 46 | "type": "uint256" 47 | }, 48 | { 49 | "internalType": "uint256", 50 | "name": "pc", 51 | "type": "uint256" 52 | }, 53 | { 54 | "internalType": "bytes32[]", 55 | "name": "stack", 56 | "type": "bytes32[]" 57 | }, 58 | { 59 | "internalType": "bytes", 60 | "name": "mem", 61 | "type": "bytes" 62 | }, 63 | { 64 | "internalType": "uint256", 65 | "name": "msize", 66 | "type": "uint256" 67 | }, 68 | { 69 | "internalType": "bytes32[]", 70 | "name": "storageKey", 71 | "type": "bytes32[]" 72 | }, 73 | { 74 | "internalType": "bytes32[]", 75 | "name": "storageData", 76 | "type": "bytes32[]" 77 | }, 78 | { 79 | "internalType": "bytes[]", 80 | "name": "logs", 81 | "type": "bytes[]" 82 | }, 83 | { 84 | "internalType": "bytes", 85 | "name": "output", 86 | "type": "bytes" 87 | }, 88 | { 89 | "internalType": "bool", 90 | "name": "running", 91 | "type": "bool" 92 | }, 93 | { 94 | "internalType": "bool", 95 | "name": "reverting", 96 | "type": "bool" 97 | } 98 | ], 99 | "internalType": "struct vEVM.vEVMState", 100 | "name": "", 101 | "type": "tuple" 102 | } 103 | ], 104 | "stateMutability": "view", 105 | "type": "function" 106 | } 107 | ], 108 | "bytecode": "0x608060405234801561001057600080fd5b50613a46806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a8c5421114610030575b600080fd5b61004361003e3660046134e0565b610059565b6040516100509190613636565b60405180910390f35b61006161342c565b61006961342c565b86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080516020601f870181900481028201810190925285815290869086908190840183828082843760009201829052506020860194909452505050604082018490526060820181905260c0820181905260016101608301526101808201525b60008787836060015181811061011957610119613773565b909101356001600160f81b03191691505060008190036101455760006101608301526109a9565b6109a9565b6001600160f81b03198116600160f81b0361016357610140826109e6565b6001600160f81b03198116600160f91b036101815761014082610aa5565b6001600160f81b03198116600360f81b0361019f5761014082610b1e565b6001600160f81b03198116600160fa1b036101bd5761014082610b97565b6001600160f81b03198116600560f81b036101db5761014082610c10565b6001600160f81b03198116600360f91b036101f95761014082610c89565b6001600160f81b03198116600760f81b036102175761014082610d02565b6001600160f81b03198116600160fb1b036102355761014082610d7b565b6001600160f81b03198116600960f81b036102535761014082610ee9565b6001600160f81b03198116600560f91b036102715761014082611006565b6001600160f81b03198116600b60f81b0361028f576101408261107f565b6001600160f81b03198116600160fc1b036102ad5761014082611150565b6001600160f81b03198116601160f81b036102cb57610140826111e8565b6001600160f81b03198116600960f91b036102e95761014082611263565b6001600160f81b03198116601360f81b0361030757610140826112de565b6001600160f81b03198116600560fa1b036103255761014082611359565b6001600160f81b03198116601560f81b0361034357610140826113d4565b6001600160f81b03198116600b60f91b03610361576101408261145f565b6001600160f81b03198116601760f81b0361037f57610140826114e4565b6001600160f81b03198116600360fb1b0361039d5761014082611569565b6001600160f81b03198116601960f81b036103bb57610140826115ee565b6001600160f81b03198116600d60f91b036103d95761014082611644565b6001600160f81b03198116601b60f81b036103f757610140826116dc565b6001600160f81b03198116600760fa1b0361041557610140826117a3565b6001600160f81b03198116601d60f81b036104335761014082611833565b6001600160f81b03198116600160fd1b0361045157610140826118cf565b6001600160f81b03198116600360fc1b0361046f5761014082611a3e565b6001600160f81b03198116603160f81b0361048d5761014082611a78565b6001600160f81b03198116601960f91b036104ab5761014082611aff565b6001600160f81b03198116603360f81b036104c95761014082611b39565b6001600160f81b03198116600d60fa1b036104e75761014082611b73565b6001600160f81b03198116603560f81b036105055761014082611bb2565b6001600160f81b03198116601b60f91b036105235761014082611c8f565b6001600160f81b03198116600760fb1b036105415761014082611ccf565b6001600160f81b03198116601d60f91b0361055f5761014082611d0c565b6001600160f81b03198116603b60f81b0361057d5761014082611d46565b6001600160f81b03198116600160fe1b0361059b5761014082611da7565b6001600160f81b03198116604160f81b036105b95761014082611e07565b6001600160f81b03198116602160f91b036105d75761014082611e41565b6001600160f81b03198116604360f81b036105f55761014082611e7b565b6001600160f81b03198116602360f91b036106135761014082611eb5565b6001600160f81b03198116604760f81b036106315761014082611eef565b6001600160f81b03198116600960fb1b0361064f5761014082611f29565b6001600160f81b03198116600560fc1b0361066d5761014082611f63565b6001600160f81b03198116605160f81b0361068b5761014082611f85565b6001600160f81b03198116602960f91b036106a95761014082612038565b6001600160f81b03198116605360f81b036106c7576101408261213c565b6001600160f81b03198116601560fa1b036106e55761014082612222565b6001600160f81b03198116605560f81b036107035761014082612330565b6001600160f81b03198116602b60f91b0361072157610140826124c1565b6001600160f81b03198116605760f81b0361073f576101408261255c565b6001600160f81b03198116600b60fb1b0361075d5761014082612635565b6001600160f81b03198116605960f81b0361077b5761014082612674565b605b60f81b6001600160f81b031982161461014057600360fd1b6001600160f81b03198216108015906107bc5750607f60f81b6001600160f81b0319821611155b1561086e5760006107d2605f60f884901c61379f565b60ff169050610852838a8a866060015160016107ee91906137b8565b90858860600151600161080191906137b8565b61080b91906137b8565b92610818939291906137cb565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506126b492505050565b808360600181815161086491906137b8565b9052506109a99050565b600160ff1b6001600160f81b031982161080159061089a5750608f60f81b6001600160f81b0319821611155b156108ba57610140826108b2607f60f885901c61379f565b60ff16612788565b600960fc1b6001600160f81b03198216108015906108e65750609f60f81b6001600160f81b0319821611155b1561090657610140826108fe608f60f885901c61379f565b60ff16612806565b600560fd1b6001600160f81b03198216108015906109325750602960fa1b6001600160f81b0319821611155b15610952576101408261094a60a060f885901c61379f565b60ff166128f2565b6001600160f81b0319811660f360f81b036109705761014082612bb7565b6001600160f81b0319811660fd60f81b0361098e5761014082612c6b565b6001600160f81b031980821690036109a9576109a982612d27565b8161016001516109b957506109dc565b6001826060018181516109cc91906137b8565b9052505060608101518611610101575b9695505050505050565b6109f1816002612d69565b156109f95750565b60808101518051610a0c906002906137f5565b81518110610a1c57610a1c613773565b602090810291909101015160808201518051610a3a906001906137f5565b81518110610a4a57610a4a613773565b602002602001015160001c610a5f91906137b8565b60808201518051610a72906002906137f5565b81518110610a8257610a82613773565b602002602001018181525050610a9d81608001516001612d8a565b608090910152565b610ab0816002612d69565b15610ab85750565b60808101518051610acb906002906137f5565b81518110610adb57610adb613773565b602090810291909101015160808201518051610af9906001906137f5565b81518110610b0957610b09613773565b602002602001015160001c610a5f9190613808565b610b29816002612d69565b15610b315750565b60808101518051610b44906002906137f5565b81518110610b5457610b54613773565b602090810291909101015160808201518051610b72906001906137f5565b81518110610b8257610b82613773565b602002602001015160001c610a5f91906137f5565b610ba2816002612d69565b15610baa5750565b60808101518051610bbd906002906137f5565b81518110610bcd57610bcd613773565b602090810291909101015160808201518051610beb906001906137f5565b81518110610bfb57610bfb613773565b602002602001015160001c610a5f9190613835565b610c1b816002612d69565b15610c235750565b60808101518051610c36906002906137f5565b81518110610c4657610c46613773565b602090810291909101015160808201518051610c64906001906137f5565b81518110610c7457610c74613773565b602002602001015160001c610a5f9190613849565b610c94816002612d69565b15610c9c5750565b60808101518051610caf906002906137f5565b81518110610cbf57610cbf613773565b602090810291909101015160808201518051610cdd906001906137f5565b81518110610ced57610ced613773565b602002602001015160001c610a5f9190613877565b610d0d816002612d69565b15610d155750565b60808101518051610d28906002906137f5565b81518110610d3857610d38613773565b602090810291909101015160808201518051610d56906001906137f5565b81518110610d6657610d66613773565b602002602001015160001c610a5f919061388b565b610d86816003612d69565b15610d8e5750565b60808101518051610da1906003906137f5565b81518110610db157610db1613773565b602002602001015160001c600003610dfb576080810151805160009190610dda906003906137f5565b81518110610dea57610dea613773565b602002602001018181525050610eda565b6080810151805160009190610e12906001906137f5565b81518110610e2257610e22613773565b602002602001015160001c9050600082608001516002846080015151610e4891906137f5565b81518110610e5857610e58613773565b602002602001015160001c9050600083608001516003856080015151610e7e91906137f5565b81518110610e8e57610e8e613773565b602002602001015160001c9050600081838508608086015180519192508291610eb9906003906137f5565b81518110610ec957610ec9613773565b602002602001018181525050505050505b610a9d81608001516002612d8a565b610ef4816003612d69565b15610efc5750565b60808101518051610f0f906003906137f5565b81518110610f1f57610f1f613773565b602002602001015160001c600003610f48576080810151805160009190610dda906003906137f5565b6080810151805160009190610f5f906001906137f5565b81518110610f6f57610f6f613773565b602002602001015160001c9050600082608001516002846080015151610f9591906137f5565b81518110610fa557610fa5613773565b602002602001015160001c9050600083608001516003856080015151610fcb91906137f5565b81518110610fdb57610fdb613773565b602002602001015160001c9050600081838509608086015180519192508291610eb9906003906137f5565b611011816002612d69565b156110195750565b6080810151805161102c906002906137f5565b8151811061103c5761103c613773565b60209081029190910101516080820151805161105a906001906137f5565b8151811061106a5761106a613773565b602002602001015160001c610a5f9190613983565b61108a816002612d69565b156110925750565b60808101518051600091906110a9906001906137f5565b815181106110b9576110b9613773565b602002602001015160001c90506000826080015160028460800151516110df91906137f5565b815181106110ef576110ef613773565b60209081029190910101516080840151805191925082840b91829190611117906002906137f5565b8151811061112757611127613773565b60200260200101818152505061114284608001516001612d8a565b846080018190525050505050565b61115b816002612d69565b156111635750565b60808101518051611176906002906137f5565b8151811061118657611186613773565b6020908102919091010151608082015180516111a4906001906137f5565b815181106111b4576111b4613773565b602002602001015160001c106111cb5760006111ce565b60015b6080820151805160ff9290921691610a72906002906137f5565b6111f3816002612d69565b156111fb5750565b6080810151805161120e906002906137f5565b8151811061121e5761121e613773565b60209081029190910101516080820151805161123c906001906137f5565b8151811061124c5761124c613773565b602002602001015160001c116111cb5760006111ce565b61126e816002612d69565b156112765750565b60808101518051611289906002906137f5565b8151811061129957611299613773565b6020908102919091010151608082015180516112b7906001906137f5565b815181106112c7576112c7613773565b602002602001015160001c126111cb5760006111ce565b6112e9816002612d69565b156112f15750565b60808101518051611304906002906137f5565b8151811061131457611314613773565b602090810291909101015160808201518051611332906001906137f5565b8151811061134257611342613773565b602002602001015160001c136111cb5760006111ce565b611364816002612d69565b1561136c5750565b6080810151805161137f906002906137f5565b8151811061138f5761138f613773565b6020908102919091010151608082015180516113ad906001906137f5565b815181106113bd576113bd613773565b602002602001015160001c146111cb5760006111ce565b6113df816001612d69565b156113e75750565b608081015180516113fa906001906137f5565b8151811061140a5761140a613773565b602002602001015160001c600014611423576000611426565b60015b6080820151805160ff9290921691611440906001906137f5565b8151811061145057611450613773565b60200260200101818152505050565b61146a816002612d69565b156114725750565b60808101518051611485906002906137f5565b8151811061149557611495613773565b6020026020010151816080015160018360800151516114b491906137f5565b815181106114c4576114c4613773565b60200260200101511681608001516002836080015151610a7291906137f5565b6114ef816002612d69565b156114f75750565b6080810151805161150a906002906137f5565b8151811061151a5761151a613773565b60200260200101518160800151600183608001515161153991906137f5565b8151811061154957611549613773565b60200260200101511781608001516002836080015151610a7291906137f5565b611574816002612d69565b1561157c5750565b6080810151805161158f906002906137f5565b8151811061159f5761159f613773565b6020026020010151816080015160018360800151516115be91906137f5565b815181106115ce576115ce613773565b60200260200101511881608001516002836080015151610a7291906137f5565b6115f9816001612d69565b156116015750565b60808101518051611614906001906137f5565b8151811061162457611624613773565b6020026020010151198160800151600183608001515161144091906137f5565b61164f816002612d69565b156116575750565b608081015180516000919061166e906001906137f5565b8151811061167e5761167e613773565b602002602001015160001c90506000826080015160028460800151516116a491906137f5565b815181106116b4576116b4613773565b60209081029190910101516080840151805191925082841a91829190611117906002906137f5565b6116e7816002612d69565b156116ef5750565b6080810151805160009190611706906001906137f5565b8151811061171657611716613773565b602002602001015160001c9050808260800151600284608001515161173b91906137f5565b8151811061174b5761174b613773565b6020026020010151901b8260800151600284608001515161176c91906137f5565b8151811061177c5761177c613773565b60200260200101818152505061179782608001516001612d8a565b82608001819052505050565b6117ae816002612d69565b156117b65750565b60808101518051600091906117cd906001906137f5565b815181106117dd576117dd613773565b602002602001015160001c9050808260800151600284608001515161180291906137f5565b8151811061181257611812613773565b6020026020010151901c8260800151600284608001515161176c91906137f5565b61183e816002612d69565b156118465750565b608081015180516000919061185d906001906137f5565b8151811061186d5761186d613773565b602002602001015160001c905060008260800151600284608001515161189391906137f5565b815181106118a3576118a3613773565b602002602001015160001c9050600081831d9050808460800151600286608001515161111791906137f5565b6118da816002612d69565b156118e25750565b60808101518051600091906118f9906001906137f5565b8151811061190957611909613773565b602002602001015160001c905060008260800151600284608001515161192f91906137f5565b8151811061193f5761193f613773565b602002602001015160001c905060008360c00151828461195f91906137b8565b106119805760c084015161197383856137b8565b61197d91906137f5565b90505b80156119d45760a08401516119c69061199a602084613877565b156119a65760016119a9565b60005b60ff166119b7602085613835565b6119c191906137b8565b612e46565b60a085018190525160c08501525b60006119e58560a001518585612f09565b80516020820120608087015180519293509091611a04906002906137f5565b81518110611a1457611a14613773565b602002602001018181525050611a2f85608001516001612d8a565b85608001819052505050505050565b611a49816001612fbc565b15611a515750565b611a6081608001516001612fe0565b608082018190528051309190611440906001906137f5565b611a83816001612d69565b15611a8b5750565b6080810151805160009190611aa2906001906137f5565b81518110611ab257611ab2613773565b6020908102919091010151608083015180519192506001600160a01b0383163191611adf906001906137f5565b81518110611aef57611aef613773565b6020026020010181815250505050565b611b0a816001612fbc565b15611b125750565b611b2181608001516001612fe0565b608082018190528051329190611440906001906137f5565b611b44816001612fbc565b15611b4c5750565b611b5b81608001516001612fe0565b608082018190528051339190611440906001906137f5565b611b7e816001612fbc565b15611b865750565b611b9581608001516001612fe0565b6080820181905260408201518151909190611440906001906137f5565b611bbd816001612d69565b15611bc55750565b6080810151805160009190611bdc906001906137f5565b81518110611bec57611bec613773565b602002602001015160001c90506000826020015151602083611c0e91906137b8565b10611c3357826020015151602083611c2691906137b8565b611c3091906137f5565b90505b8015611c4d57611c47836020015182613089565b60208401525b611c5b836020015183613142565b60808401518051611c6e906001906137f5565b81518110611c7e57611c7e613773565b602002602001018181525050505050565b611c9a816001612fbc565b15611ca25750565b611cb181608001516001612fe0565b608082018190526020820151518151909190611440906001906137f5565b611cda816001612fbc565b15611ce25750565b611cf181608001516001612fe0565b608082018190528151518151909190611440906001906137f5565b611d17816001612fbc565b15611d1f5750565b611d2e81608001516001612fe0565b6080820181905280513a9190611440906001906137f5565b611d51816001612d69565b15611d595750565b6080810151805160009190611d70906001906137f5565b81518110611d8057611d80613773565b602090810291909101015160808301518051919250823b91829190611c6e906001906137f5565b611db2816001612d69565b15611dba5750565b6080810151805160009190611dd1906001906137f5565b81518110611de157611de1613773565b602002602001015160001c9050804082608001516001846080015151611adf91906137f5565b611e12816001612fbc565b15611e1a5750565b611e2981608001516001612fe0565b608082018190528051419190611440906001906137f5565b611e4c816001612fbc565b15611e545750565b611e6381608001516001612fe0565b608082018190528051429190611440906001906137f5565b611e86816001612fbc565b15611e8e5750565b611e9d81608001516001612fe0565b608082018190528051439190611440906001906137f5565b611ec0816001612fbc565b15611ec85750565b611ed781608001516001612fe0565b608082018190528051469190611440906001906137f5565b611efa816001612fbc565b15611f025750565b611f1181608001516001612fe0565b608082018190528051479190611440906001906137f5565b611f34816001612fbc565b15611f3c5750565b611f4b81608001516001612fe0565b608082018190528051489190611440906001906137f5565b611f6e816001612d69565b15611f765750565b610a9d81608001516001612d8a565b611f90816001612d69565b15611f985750565b6080810151805160009190611faf906001906137f5565b81518110611fbf57611fbf613773565b602002602001015160001c905060008260c00151602083611fe091906137b8565b106120025760c0830151611ff56020846137b8565b611fff91906137f5565b90505b801561202a5760a083015161201c9061199a602084613877565b60a084018190525160c08401525b611c5b8360a0015183613142565b612043816002612d69565b1561204b5750565b6080810151805160009190612062906001906137f5565b8151811061207257612072613773565b602002602001015160001c905060008260c0015160208361209391906137b8565b106120b55760c08301516120a86020846137b8565b6120b291906137f5565b90505b80156120dd5760a08301516120cf9061199a602084613877565b60a084018190525160c08401525b6121208360a0015183856080015160028760800151516120fd91906137f5565b8151811061210d5761210d613773565b602002602001015160001c60001b6131a4565b61212f83608001516002612d8a565b8360800181905250505050565b612147816002612d69565b1561214f5750565b6080810151805160009190612166906001906137f5565b8151811061217657612176613773565b602002602001015160001c905060008260c0015160018361219791906137b8565b106121b95760c08301516121ac6001846137b8565b6121b691906137f5565b90505b80156121e15760a08301516121d39061199a602084613877565b60a084018190525160c08401525b6121208360a001518360f88660800151600288608001515161220391906137f5565b8151811061221357612213613773565b6020026020010151901b613208565b61222d816001612d69565b156122355750565b60008160e001515160000361225b576080820151805160009190611adf906001906137f5565b6000805b8360e00151518110156122d8576080840151805161227f906001906137f5565b8151811061228f5761228f613773565b60200260200101518460e0015182815181106122ad576122ad613773565b6020026020010151036122c657809150600192506122d8565b806122d081613996565b91505061225f565b508115156000036122fa576080830151805160009190611c6e906001906137f5565b826101000151818151811061231157612311613773565b602002602001015183608001516001856080015151611c6e91906137f5565b61233b816002612d69565b156123435750565b608081015180516000919061235a906001906137f5565b8151811061236a5761236a613773565b6020026020010151905060008260800151600284608001515161238d91906137f5565b8151811061239d5761239d613773565b6020026020010151905060008060005b8560e00151518110156123fc57848660e0015182815181106123d1576123d1613773565b6020026020010151036123ea57809250600191506123fc565b806123f481613996565b9150506123ad565b5080151560000361248d5761241c8560e001518661010001516001613237565b61010087015260e08601819052805185919061243a906001906137f5565b8151811061244a5761244a613773565b6020908102919091010152610100850151805184919061246c906001906137f5565b8151811061247c5761247c613773565b6020026020010181815250506124b2565b8285610100015183815181106124a5576124a5613773565b6020026020010181815250505b611a2f85608001516002612d8a565b6124cc816001612d69565b156124d45750565b60808101518051600091906124eb906001906137f5565b815181106124fb576124fb613773565b602002602001015160001c90508160000151818151811061251e5761251e613773565b6020910101516001600160f81b031916605b60f81b1461253c575050565b6125476001826137f5565b60608301526080820151611797906001612d8a565b612567816002612d69565b1561256f5750565b6080810151805160009190612586906001906137f5565b8151811061259657612596613773565b602002602001015160001c90506000826080015160028460800151516125bc91906137f5565b815181106125cc576125cc613773565b602002602001015160001c9050826000015182815181106125ef576125ef613773565b6020910101516001600160f81b031916605b60f81b1461260e57505050565b80600103612120576126216001836137f5565b606084015261212f83608001516002612d8a565b612640816001612fbc565b156126485750565b61265781608001516001612fe0565b6080820181905260608201518151909190611440906001906137f5565b61267f816001612fbc565b156126875750565b61269681608001516001612fe0565b6080820181905260a0820151518151909190611440906001906137f5565b6126bf826001612fbc565b156126c8575050565b805160009081906126da9060206137f5565b905060005b602081101561273e5781811061272c576126fa816008613808565b8461270584846137f5565b8151811061271557612715613773565b01602001516001600160f81b031916901c92909217915b8061273681613996565b9150506126df565b5061274e84608001516001612fe0565b608085018190528051839190612766906001906137f5565b8151811061277657612776613773565b60200260200101818152505050505050565b612793826001612fbc565b1561279c575050565b6127a68282612d69565b156127af575050565b60808201518051600091906127c59084906137f5565b815181106127d5576127d5613773565b602002602001015190506127ee83608001516001612fe0565b608084018190528051829190611c6e906001906137f5565b6128108282612d69565b15612819575050565b60808201518051829061282e906001906137f5565b61283891906137f5565b8151811061284857612848613773565b60200260200101518260800151600184608001515161286791906137f5565b8151811061287757612877613773565b60200260200101518360800151600185608001515161289691906137f5565b815181106128a6576128a6613773565b6020026020010184608001518460018760800151516128c591906137f5565b6128cf91906137f5565b815181106128df576128df613773565b6020908102919091010191909152525050565b612906826129018360026137b8565b612d69565b1561290f575050565b306000826001600160401b0381111561292a5761292a6139af565b604051908082528060200260200182016040528015612953578160200160208202803683370190505b50905060005b838110156129c757608085015180518290612976906003906137f5565b61298091906137f5565b8151811061299057612990613773565b60200260200101518282815181106129aa576129aa613773565b6020908102919091010152806129bf81613996565b915050612959565b5060808401518051600091906129df906001906137f5565b815181106129ef576129ef613773565b602002602001015160001c9050600085608001516002876080015151612a1591906137f5565b81518110612a2557612a25613773565b602002602001015160001c90506000816001600160401b03811115612a4c57612a4c6139af565b6040519080825280601f01601f191660200182016040528015612a76576020820181803683370190505b509050612a888760a001518484612f09565b9050612a9a8761012001516001613378565b610120880152600082612aae886020613808565b612ab99060206137b8565b612ac391906137b8565b9050806001600160401b03811115612add57612add6139af565b6040519080825280601f01601f191660200182016040528015612b07576020820181803683370190505b506101208901518051612b1c906001906137f5565b81518110612b2c57612b2c613773565b6020026020010181905250858583604051602001612b4c939291906139c5565b60408051601f198184030181529190526101208901518051612b70906001906137f5565b81518110612b8057612b80613773565b6020026020010181905250612ba58860800151886002612ba091906137b8565b612d8a565b88608001819052505050505050505050565b612bc2816002612d69565b15612bca5750565b6080810151805160009190612be1906001906137f5565b81518110612bf157612bf1613773565b602002602001015160001c9050600082608001516002846080015151612c1791906137f5565b81518110612c2757612c27613773565b602002602001015160001c9050612c438360a001518383612f09565b6101408401526080830151612c59906002612d8a565b60808401525050600061016090910152565b612c76816002612d69565b15612c7e5750565b6080810151805160009190612c95906001906137f5565b81518110612ca557612ca5613773565b602002602001015160001c9050600082608001516002846080015151612ccb91906137f5565b81518110612cdb57612cdb613773565b602002602001015160001c9050612cf78360a001518383612f09565b6101408401526080830151612d0d906002612d8a565b608084015250506001610180820152600061016090910152565b612d32816001612d69565b15612d3a5750565b612d4981608001516001612d8a565b608082015260408051600080825260208201909252825261016090910152565b6000818360800151511015612d8057506001612d84565b5060005b92915050565b60606000828451612d9b91906137f5565b6001600160401b03811115612db257612db26139af565b604051908082528060200260200182016040528015612ddb578160200160208202803683370190505b50905060005b838551612dee91906137f5565b811015612e3e57848181518110612e0757612e07613773565b6020026020010151828281518110612e2157612e21613773565b602090810291909101015280612e3681613996565b915050612de1565b509392505050565b60606000612e55836020613808565b8451612e6191906137b8565b6001600160401b03811115612e7857612e786139af565b6040519080825280601f01601f191660200182016040528015612ea2576020820181803683370190505b50905060005b8451811015612e3e57848181518110612ec357612ec3613773565b602001015160f81c60f81b828281518110612ee057612ee0613773565b60200101906001600160f81b031916908160001a90535080612f0181613996565b915050612ea8565b6060816001600160401b03811115612f2357612f236139af565b6040519080825280601f01601f191660200182016040528015612f4d576020820181803683370190505b50905060005b82811015612e3e5784612f6682866137b8565b81518110612f7657612f76613773565b602001015160f81c60f81b828281518110612f9357612f93613773565b60200101906001600160f81b031916908160001a90535080612fb481613996565b915050612f53565b600061040082846080015151612fd291906137b8565b1115612d8057506001612d84565b60606000828451612ff191906137b8565b6001600160401b03811115613008576130086139af565b604051908082528060200260200182016040528015613031578160200160208202803683370190505b50905060005b8451811015612e3e5784818151811061305257613052613773565b602002602001015182828151811061306c5761306c613773565b60209081029190910101528061308181613996565b915050613037565b6060600082845161309a91906137b8565b6001600160401b038111156130b1576130b16139af565b6040519080825280601f01601f1916602001820160405280156130db576020820181803683370190505b50905060005b8451811015612e3e578481815181106130fc576130fc613773565b602001015160f81c60f81b82828151811061311957613119613773565b60200101906001600160f81b031916908160001a9053508061313a81613996565b9150506130e1565b6000805b602081101561319d5761315a816008613808565b8461316583866137b8565b8151811061317557613175613773565b01602001516001600160f81b031916901c91909117908061319581613996565b915050613146565b5092915050565b60005b6020811015613202576131bb816008613808565b82901b846131c983866137b8565b815181106131d9576131d9613773565b60200101906001600160f81b031916908160001a905350806131fa81613996565b9150506131a7565b50505050565b8083838151811061321b5761321b613773565b60200101906001600160f81b031916908160001a905350505050565b606080600083865161324991906137b8565b6001600160401b03811115613260576132606139af565b604051908082528060200260200182016040528015613289578160200160208202803683370190505b509050600084865161329b91906137b8565b6001600160401b038111156132b2576132b26139af565b6040519080825280602002602001820160405280156132db578160200160208202803683370190505b50905060005b875181101561336b578781815181106132fc576132fc613773565b602002602001015183828151811061331657613316613773565b60200260200101818152505086818151811061333457613334613773565b602002602001015182828151811061334e5761334e613773565b60209081029190910101528061336381613996565b9150506132e1565b5090969095509350505050565b6060600082845161338991906137b8565b6001600160401b038111156133a0576133a06139af565b6040519080825280602002602001820160405280156133d357816020015b60608152602001906001900390816133be5790505b50905060005b8451811015612e3e578481815181106133f4576133f4613773565b602002602001015182828151811061340e5761340e613773565b6020026020010181905250808061342490613996565b9150506133d9565b604051806101a0016040528060608152602001606081526020016000815260200160008152602001606081526020016060815260200160008152602001606081526020016060815260200160608152602001606081526020016000151581526020016000151581525090565b60008083601f8401126134aa57600080fd5b5081356001600160401b038111156134c157600080fd5b6020830191508360208285010111156134d957600080fd5b9250929050565b6000806000806000606086880312156134f857600080fd5b85356001600160401b038082111561350f57600080fd5b61351b89838a01613498565b9097509550602088013591508082111561353457600080fd5b5061354188828901613498565b96999598509660400135949350505050565b60005b8381101561356e578181015183820152602001613556565b50506000910152565b6000815180845261358f816020860160208601613553565b601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b838110156135d3578151875295820195908201906001016135b7565b509495945050505050565b600082825180855260208086019550808260051b84010181860160005b8481101561362957601f19868403018952613617838351613577565b988401989250908301906001016135fb565b5090979650505050505050565b60208152600082516101a08060208501526136556101c0850183613577565b91506020850151601f19808685030160408701526136738483613577565b9350604087015160608701526060870151608087015260808701519150808685030160a08701526136a484836135a3565b935060a08701519150808685030160c08701526136c18483613577565b935060c087015160e087015260e087015191506101008187860301818801526136ea85846135a3565b94508088015192505061012081878603018188015261370985846135a3565b94508088015192505061014081878603018188015261372885846135de565b9450808801519250506101608187860301818801526137478584613577565b945080880151925050506101806137618187018315159052565b90950151151593019290925250919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60ff8281168282160390811115612d8457612d84613789565b80820180821115612d8457612d84613789565b600080858511156137db57600080fd5b838611156137e857600080fd5b5050820193919092039150565b81810381811115612d8457612d84613789565b8082028115828204841417612d8457612d84613789565b634e487b7160e01b600052601260045260246000fd5b6000826138445761384461381f565b500490565b6000826138585761385861381f565b600160ff1b82146000198414161561387257613872613789565b500590565b6000826138865761388661381f565b500690565b60008261389a5761389a61381f565b500790565b600181815b808511156138da5781600019048211156138c0576138c0613789565b808516156138cd57918102915b93841c93908002906138a4565b509250929050565b6000826138f157506001612d84565b816138fe57506000612d84565b8160018114613914576002811461391e5761393a565b6001915050612d84565b60ff84111561392f5761392f613789565b50506001821b612d84565b5060208310610133831016604e8410600b841016171561395d575081810a612d84565b613967838361389f565b806000190482111561397b5761397b613789565b029392505050565b600061398f83836138e2565b9392505050565b6000600182016139a8576139a8613789565b5060010190565b634e487b7160e01b600052604160045260246000fd5b83815260006020808301855182870160005b828110156139f3578151845292840192908401906001016139d7565b5050508451613a058183858901613553565b01969550505050505056fea264697066735822122037b0473cae1ec5c6e4ec581fce8d34330439290f9e68288c057e74adf81ca17c64736f6c63430008110033", 109 | "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a8c5421114610030575b600080fd5b61004361003e3660046134e0565b610059565b6040516100509190613636565b60405180910390f35b61006161342c565b61006961342c565b86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080516020601f870181900481028201810190925285815290869086908190840183828082843760009201829052506020860194909452505050604082018490526060820181905260c0820181905260016101608301526101808201525b60008787836060015181811061011957610119613773565b909101356001600160f81b03191691505060008190036101455760006101608301526109a9565b6109a9565b6001600160f81b03198116600160f81b0361016357610140826109e6565b6001600160f81b03198116600160f91b036101815761014082610aa5565b6001600160f81b03198116600360f81b0361019f5761014082610b1e565b6001600160f81b03198116600160fa1b036101bd5761014082610b97565b6001600160f81b03198116600560f81b036101db5761014082610c10565b6001600160f81b03198116600360f91b036101f95761014082610c89565b6001600160f81b03198116600760f81b036102175761014082610d02565b6001600160f81b03198116600160fb1b036102355761014082610d7b565b6001600160f81b03198116600960f81b036102535761014082610ee9565b6001600160f81b03198116600560f91b036102715761014082611006565b6001600160f81b03198116600b60f81b0361028f576101408261107f565b6001600160f81b03198116600160fc1b036102ad5761014082611150565b6001600160f81b03198116601160f81b036102cb57610140826111e8565b6001600160f81b03198116600960f91b036102e95761014082611263565b6001600160f81b03198116601360f81b0361030757610140826112de565b6001600160f81b03198116600560fa1b036103255761014082611359565b6001600160f81b03198116601560f81b0361034357610140826113d4565b6001600160f81b03198116600b60f91b03610361576101408261145f565b6001600160f81b03198116601760f81b0361037f57610140826114e4565b6001600160f81b03198116600360fb1b0361039d5761014082611569565b6001600160f81b03198116601960f81b036103bb57610140826115ee565b6001600160f81b03198116600d60f91b036103d95761014082611644565b6001600160f81b03198116601b60f81b036103f757610140826116dc565b6001600160f81b03198116600760fa1b0361041557610140826117a3565b6001600160f81b03198116601d60f81b036104335761014082611833565b6001600160f81b03198116600160fd1b0361045157610140826118cf565b6001600160f81b03198116600360fc1b0361046f5761014082611a3e565b6001600160f81b03198116603160f81b0361048d5761014082611a78565b6001600160f81b03198116601960f91b036104ab5761014082611aff565b6001600160f81b03198116603360f81b036104c95761014082611b39565b6001600160f81b03198116600d60fa1b036104e75761014082611b73565b6001600160f81b03198116603560f81b036105055761014082611bb2565b6001600160f81b03198116601b60f91b036105235761014082611c8f565b6001600160f81b03198116600760fb1b036105415761014082611ccf565b6001600160f81b03198116601d60f91b0361055f5761014082611d0c565b6001600160f81b03198116603b60f81b0361057d5761014082611d46565b6001600160f81b03198116600160fe1b0361059b5761014082611da7565b6001600160f81b03198116604160f81b036105b95761014082611e07565b6001600160f81b03198116602160f91b036105d75761014082611e41565b6001600160f81b03198116604360f81b036105f55761014082611e7b565b6001600160f81b03198116602360f91b036106135761014082611eb5565b6001600160f81b03198116604760f81b036106315761014082611eef565b6001600160f81b03198116600960fb1b0361064f5761014082611f29565b6001600160f81b03198116600560fc1b0361066d5761014082611f63565b6001600160f81b03198116605160f81b0361068b5761014082611f85565b6001600160f81b03198116602960f91b036106a95761014082612038565b6001600160f81b03198116605360f81b036106c7576101408261213c565b6001600160f81b03198116601560fa1b036106e55761014082612222565b6001600160f81b03198116605560f81b036107035761014082612330565b6001600160f81b03198116602b60f91b0361072157610140826124c1565b6001600160f81b03198116605760f81b0361073f576101408261255c565b6001600160f81b03198116600b60fb1b0361075d5761014082612635565b6001600160f81b03198116605960f81b0361077b5761014082612674565b605b60f81b6001600160f81b031982161461014057600360fd1b6001600160f81b03198216108015906107bc5750607f60f81b6001600160f81b0319821611155b1561086e5760006107d2605f60f884901c61379f565b60ff169050610852838a8a866060015160016107ee91906137b8565b90858860600151600161080191906137b8565b61080b91906137b8565b92610818939291906137cb565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506126b492505050565b808360600181815161086491906137b8565b9052506109a99050565b600160ff1b6001600160f81b031982161080159061089a5750608f60f81b6001600160f81b0319821611155b156108ba57610140826108b2607f60f885901c61379f565b60ff16612788565b600960fc1b6001600160f81b03198216108015906108e65750609f60f81b6001600160f81b0319821611155b1561090657610140826108fe608f60f885901c61379f565b60ff16612806565b600560fd1b6001600160f81b03198216108015906109325750602960fa1b6001600160f81b0319821611155b15610952576101408261094a60a060f885901c61379f565b60ff166128f2565b6001600160f81b0319811660f360f81b036109705761014082612bb7565b6001600160f81b0319811660fd60f81b0361098e5761014082612c6b565b6001600160f81b031980821690036109a9576109a982612d27565b8161016001516109b957506109dc565b6001826060018181516109cc91906137b8565b9052505060608101518611610101575b9695505050505050565b6109f1816002612d69565b156109f95750565b60808101518051610a0c906002906137f5565b81518110610a1c57610a1c613773565b602090810291909101015160808201518051610a3a906001906137f5565b81518110610a4a57610a4a613773565b602002602001015160001c610a5f91906137b8565b60808201518051610a72906002906137f5565b81518110610a8257610a82613773565b602002602001018181525050610a9d81608001516001612d8a565b608090910152565b610ab0816002612d69565b15610ab85750565b60808101518051610acb906002906137f5565b81518110610adb57610adb613773565b602090810291909101015160808201518051610af9906001906137f5565b81518110610b0957610b09613773565b602002602001015160001c610a5f9190613808565b610b29816002612d69565b15610b315750565b60808101518051610b44906002906137f5565b81518110610b5457610b54613773565b602090810291909101015160808201518051610b72906001906137f5565b81518110610b8257610b82613773565b602002602001015160001c610a5f91906137f5565b610ba2816002612d69565b15610baa5750565b60808101518051610bbd906002906137f5565b81518110610bcd57610bcd613773565b602090810291909101015160808201518051610beb906001906137f5565b81518110610bfb57610bfb613773565b602002602001015160001c610a5f9190613835565b610c1b816002612d69565b15610c235750565b60808101518051610c36906002906137f5565b81518110610c4657610c46613773565b602090810291909101015160808201518051610c64906001906137f5565b81518110610c7457610c74613773565b602002602001015160001c610a5f9190613849565b610c94816002612d69565b15610c9c5750565b60808101518051610caf906002906137f5565b81518110610cbf57610cbf613773565b602090810291909101015160808201518051610cdd906001906137f5565b81518110610ced57610ced613773565b602002602001015160001c610a5f9190613877565b610d0d816002612d69565b15610d155750565b60808101518051610d28906002906137f5565b81518110610d3857610d38613773565b602090810291909101015160808201518051610d56906001906137f5565b81518110610d6657610d66613773565b602002602001015160001c610a5f919061388b565b610d86816003612d69565b15610d8e5750565b60808101518051610da1906003906137f5565b81518110610db157610db1613773565b602002602001015160001c600003610dfb576080810151805160009190610dda906003906137f5565b81518110610dea57610dea613773565b602002602001018181525050610eda565b6080810151805160009190610e12906001906137f5565b81518110610e2257610e22613773565b602002602001015160001c9050600082608001516002846080015151610e4891906137f5565b81518110610e5857610e58613773565b602002602001015160001c9050600083608001516003856080015151610e7e91906137f5565b81518110610e8e57610e8e613773565b602002602001015160001c9050600081838508608086015180519192508291610eb9906003906137f5565b81518110610ec957610ec9613773565b602002602001018181525050505050505b610a9d81608001516002612d8a565b610ef4816003612d69565b15610efc5750565b60808101518051610f0f906003906137f5565b81518110610f1f57610f1f613773565b602002602001015160001c600003610f48576080810151805160009190610dda906003906137f5565b6080810151805160009190610f5f906001906137f5565b81518110610f6f57610f6f613773565b602002602001015160001c9050600082608001516002846080015151610f9591906137f5565b81518110610fa557610fa5613773565b602002602001015160001c9050600083608001516003856080015151610fcb91906137f5565b81518110610fdb57610fdb613773565b602002602001015160001c9050600081838509608086015180519192508291610eb9906003906137f5565b611011816002612d69565b156110195750565b6080810151805161102c906002906137f5565b8151811061103c5761103c613773565b60209081029190910101516080820151805161105a906001906137f5565b8151811061106a5761106a613773565b602002602001015160001c610a5f9190613983565b61108a816002612d69565b156110925750565b60808101518051600091906110a9906001906137f5565b815181106110b9576110b9613773565b602002602001015160001c90506000826080015160028460800151516110df91906137f5565b815181106110ef576110ef613773565b60209081029190910101516080840151805191925082840b91829190611117906002906137f5565b8151811061112757611127613773565b60200260200101818152505061114284608001516001612d8a565b846080018190525050505050565b61115b816002612d69565b156111635750565b60808101518051611176906002906137f5565b8151811061118657611186613773565b6020908102919091010151608082015180516111a4906001906137f5565b815181106111b4576111b4613773565b602002602001015160001c106111cb5760006111ce565b60015b6080820151805160ff9290921691610a72906002906137f5565b6111f3816002612d69565b156111fb5750565b6080810151805161120e906002906137f5565b8151811061121e5761121e613773565b60209081029190910101516080820151805161123c906001906137f5565b8151811061124c5761124c613773565b602002602001015160001c116111cb5760006111ce565b61126e816002612d69565b156112765750565b60808101518051611289906002906137f5565b8151811061129957611299613773565b6020908102919091010151608082015180516112b7906001906137f5565b815181106112c7576112c7613773565b602002602001015160001c126111cb5760006111ce565b6112e9816002612d69565b156112f15750565b60808101518051611304906002906137f5565b8151811061131457611314613773565b602090810291909101015160808201518051611332906001906137f5565b8151811061134257611342613773565b602002602001015160001c136111cb5760006111ce565b611364816002612d69565b1561136c5750565b6080810151805161137f906002906137f5565b8151811061138f5761138f613773565b6020908102919091010151608082015180516113ad906001906137f5565b815181106113bd576113bd613773565b602002602001015160001c146111cb5760006111ce565b6113df816001612d69565b156113e75750565b608081015180516113fa906001906137f5565b8151811061140a5761140a613773565b602002602001015160001c600014611423576000611426565b60015b6080820151805160ff9290921691611440906001906137f5565b8151811061145057611450613773565b60200260200101818152505050565b61146a816002612d69565b156114725750565b60808101518051611485906002906137f5565b8151811061149557611495613773565b6020026020010151816080015160018360800151516114b491906137f5565b815181106114c4576114c4613773565b60200260200101511681608001516002836080015151610a7291906137f5565b6114ef816002612d69565b156114f75750565b6080810151805161150a906002906137f5565b8151811061151a5761151a613773565b60200260200101518160800151600183608001515161153991906137f5565b8151811061154957611549613773565b60200260200101511781608001516002836080015151610a7291906137f5565b611574816002612d69565b1561157c5750565b6080810151805161158f906002906137f5565b8151811061159f5761159f613773565b6020026020010151816080015160018360800151516115be91906137f5565b815181106115ce576115ce613773565b60200260200101511881608001516002836080015151610a7291906137f5565b6115f9816001612d69565b156116015750565b60808101518051611614906001906137f5565b8151811061162457611624613773565b6020026020010151198160800151600183608001515161144091906137f5565b61164f816002612d69565b156116575750565b608081015180516000919061166e906001906137f5565b8151811061167e5761167e613773565b602002602001015160001c90506000826080015160028460800151516116a491906137f5565b815181106116b4576116b4613773565b60209081029190910101516080840151805191925082841a91829190611117906002906137f5565b6116e7816002612d69565b156116ef5750565b6080810151805160009190611706906001906137f5565b8151811061171657611716613773565b602002602001015160001c9050808260800151600284608001515161173b91906137f5565b8151811061174b5761174b613773565b6020026020010151901b8260800151600284608001515161176c91906137f5565b8151811061177c5761177c613773565b60200260200101818152505061179782608001516001612d8a565b82608001819052505050565b6117ae816002612d69565b156117b65750565b60808101518051600091906117cd906001906137f5565b815181106117dd576117dd613773565b602002602001015160001c9050808260800151600284608001515161180291906137f5565b8151811061181257611812613773565b6020026020010151901c8260800151600284608001515161176c91906137f5565b61183e816002612d69565b156118465750565b608081015180516000919061185d906001906137f5565b8151811061186d5761186d613773565b602002602001015160001c905060008260800151600284608001515161189391906137f5565b815181106118a3576118a3613773565b602002602001015160001c9050600081831d9050808460800151600286608001515161111791906137f5565b6118da816002612d69565b156118e25750565b60808101518051600091906118f9906001906137f5565b8151811061190957611909613773565b602002602001015160001c905060008260800151600284608001515161192f91906137f5565b8151811061193f5761193f613773565b602002602001015160001c905060008360c00151828461195f91906137b8565b106119805760c084015161197383856137b8565b61197d91906137f5565b90505b80156119d45760a08401516119c69061199a602084613877565b156119a65760016119a9565b60005b60ff166119b7602085613835565b6119c191906137b8565b612e46565b60a085018190525160c08501525b60006119e58560a001518585612f09565b80516020820120608087015180519293509091611a04906002906137f5565b81518110611a1457611a14613773565b602002602001018181525050611a2f85608001516001612d8a565b85608001819052505050505050565b611a49816001612fbc565b15611a515750565b611a6081608001516001612fe0565b608082018190528051309190611440906001906137f5565b611a83816001612d69565b15611a8b5750565b6080810151805160009190611aa2906001906137f5565b81518110611ab257611ab2613773565b6020908102919091010151608083015180519192506001600160a01b0383163191611adf906001906137f5565b81518110611aef57611aef613773565b6020026020010181815250505050565b611b0a816001612fbc565b15611b125750565b611b2181608001516001612fe0565b608082018190528051329190611440906001906137f5565b611b44816001612fbc565b15611b4c5750565b611b5b81608001516001612fe0565b608082018190528051339190611440906001906137f5565b611b7e816001612fbc565b15611b865750565b611b9581608001516001612fe0565b6080820181905260408201518151909190611440906001906137f5565b611bbd816001612d69565b15611bc55750565b6080810151805160009190611bdc906001906137f5565b81518110611bec57611bec613773565b602002602001015160001c90506000826020015151602083611c0e91906137b8565b10611c3357826020015151602083611c2691906137b8565b611c3091906137f5565b90505b8015611c4d57611c47836020015182613089565b60208401525b611c5b836020015183613142565b60808401518051611c6e906001906137f5565b81518110611c7e57611c7e613773565b602002602001018181525050505050565b611c9a816001612fbc565b15611ca25750565b611cb181608001516001612fe0565b608082018190526020820151518151909190611440906001906137f5565b611cda816001612fbc565b15611ce25750565b611cf181608001516001612fe0565b608082018190528151518151909190611440906001906137f5565b611d17816001612fbc565b15611d1f5750565b611d2e81608001516001612fe0565b6080820181905280513a9190611440906001906137f5565b611d51816001612d69565b15611d595750565b6080810151805160009190611d70906001906137f5565b81518110611d8057611d80613773565b602090810291909101015160808301518051919250823b91829190611c6e906001906137f5565b611db2816001612d69565b15611dba5750565b6080810151805160009190611dd1906001906137f5565b81518110611de157611de1613773565b602002602001015160001c9050804082608001516001846080015151611adf91906137f5565b611e12816001612fbc565b15611e1a5750565b611e2981608001516001612fe0565b608082018190528051419190611440906001906137f5565b611e4c816001612fbc565b15611e545750565b611e6381608001516001612fe0565b608082018190528051429190611440906001906137f5565b611e86816001612fbc565b15611e8e5750565b611e9d81608001516001612fe0565b608082018190528051439190611440906001906137f5565b611ec0816001612fbc565b15611ec85750565b611ed781608001516001612fe0565b608082018190528051469190611440906001906137f5565b611efa816001612fbc565b15611f025750565b611f1181608001516001612fe0565b608082018190528051479190611440906001906137f5565b611f34816001612fbc565b15611f3c5750565b611f4b81608001516001612fe0565b608082018190528051489190611440906001906137f5565b611f6e816001612d69565b15611f765750565b610a9d81608001516001612d8a565b611f90816001612d69565b15611f985750565b6080810151805160009190611faf906001906137f5565b81518110611fbf57611fbf613773565b602002602001015160001c905060008260c00151602083611fe091906137b8565b106120025760c0830151611ff56020846137b8565b611fff91906137f5565b90505b801561202a5760a083015161201c9061199a602084613877565b60a084018190525160c08401525b611c5b8360a0015183613142565b612043816002612d69565b1561204b5750565b6080810151805160009190612062906001906137f5565b8151811061207257612072613773565b602002602001015160001c905060008260c0015160208361209391906137b8565b106120b55760c08301516120a86020846137b8565b6120b291906137f5565b90505b80156120dd5760a08301516120cf9061199a602084613877565b60a084018190525160c08401525b6121208360a0015183856080015160028760800151516120fd91906137f5565b8151811061210d5761210d613773565b602002602001015160001c60001b6131a4565b61212f83608001516002612d8a565b8360800181905250505050565b612147816002612d69565b1561214f5750565b6080810151805160009190612166906001906137f5565b8151811061217657612176613773565b602002602001015160001c905060008260c0015160018361219791906137b8565b106121b95760c08301516121ac6001846137b8565b6121b691906137f5565b90505b80156121e15760a08301516121d39061199a602084613877565b60a084018190525160c08401525b6121208360a001518360f88660800151600288608001515161220391906137f5565b8151811061221357612213613773565b6020026020010151901b613208565b61222d816001612d69565b156122355750565b60008160e001515160000361225b576080820151805160009190611adf906001906137f5565b6000805b8360e00151518110156122d8576080840151805161227f906001906137f5565b8151811061228f5761228f613773565b60200260200101518460e0015182815181106122ad576122ad613773565b6020026020010151036122c657809150600192506122d8565b806122d081613996565b91505061225f565b508115156000036122fa576080830151805160009190611c6e906001906137f5565b826101000151818151811061231157612311613773565b602002602001015183608001516001856080015151611c6e91906137f5565b61233b816002612d69565b156123435750565b608081015180516000919061235a906001906137f5565b8151811061236a5761236a613773565b6020026020010151905060008260800151600284608001515161238d91906137f5565b8151811061239d5761239d613773565b6020026020010151905060008060005b8560e00151518110156123fc57848660e0015182815181106123d1576123d1613773565b6020026020010151036123ea57809250600191506123fc565b806123f481613996565b9150506123ad565b5080151560000361248d5761241c8560e001518661010001516001613237565b61010087015260e08601819052805185919061243a906001906137f5565b8151811061244a5761244a613773565b6020908102919091010152610100850151805184919061246c906001906137f5565b8151811061247c5761247c613773565b6020026020010181815250506124b2565b8285610100015183815181106124a5576124a5613773565b6020026020010181815250505b611a2f85608001516002612d8a565b6124cc816001612d69565b156124d45750565b60808101518051600091906124eb906001906137f5565b815181106124fb576124fb613773565b602002602001015160001c90508160000151818151811061251e5761251e613773565b6020910101516001600160f81b031916605b60f81b1461253c575050565b6125476001826137f5565b60608301526080820151611797906001612d8a565b612567816002612d69565b1561256f5750565b6080810151805160009190612586906001906137f5565b8151811061259657612596613773565b602002602001015160001c90506000826080015160028460800151516125bc91906137f5565b815181106125cc576125cc613773565b602002602001015160001c9050826000015182815181106125ef576125ef613773565b6020910101516001600160f81b031916605b60f81b1461260e57505050565b80600103612120576126216001836137f5565b606084015261212f83608001516002612d8a565b612640816001612fbc565b156126485750565b61265781608001516001612fe0565b6080820181905260608201518151909190611440906001906137f5565b61267f816001612fbc565b156126875750565b61269681608001516001612fe0565b6080820181905260a0820151518151909190611440906001906137f5565b6126bf826001612fbc565b156126c8575050565b805160009081906126da9060206137f5565b905060005b602081101561273e5781811061272c576126fa816008613808565b8461270584846137f5565b8151811061271557612715613773565b01602001516001600160f81b031916901c92909217915b8061273681613996565b9150506126df565b5061274e84608001516001612fe0565b608085018190528051839190612766906001906137f5565b8151811061277657612776613773565b60200260200101818152505050505050565b612793826001612fbc565b1561279c575050565b6127a68282612d69565b156127af575050565b60808201518051600091906127c59084906137f5565b815181106127d5576127d5613773565b602002602001015190506127ee83608001516001612fe0565b608084018190528051829190611c6e906001906137f5565b6128108282612d69565b15612819575050565b60808201518051829061282e906001906137f5565b61283891906137f5565b8151811061284857612848613773565b60200260200101518260800151600184608001515161286791906137f5565b8151811061287757612877613773565b60200260200101518360800151600185608001515161289691906137f5565b815181106128a6576128a6613773565b6020026020010184608001518460018760800151516128c591906137f5565b6128cf91906137f5565b815181106128df576128df613773565b6020908102919091010191909152525050565b612906826129018360026137b8565b612d69565b1561290f575050565b306000826001600160401b0381111561292a5761292a6139af565b604051908082528060200260200182016040528015612953578160200160208202803683370190505b50905060005b838110156129c757608085015180518290612976906003906137f5565b61298091906137f5565b8151811061299057612990613773565b60200260200101518282815181106129aa576129aa613773565b6020908102919091010152806129bf81613996565b915050612959565b5060808401518051600091906129df906001906137f5565b815181106129ef576129ef613773565b602002602001015160001c9050600085608001516002876080015151612a1591906137f5565b81518110612a2557612a25613773565b602002602001015160001c90506000816001600160401b03811115612a4c57612a4c6139af565b6040519080825280601f01601f191660200182016040528015612a76576020820181803683370190505b509050612a888760a001518484612f09565b9050612a9a8761012001516001613378565b610120880152600082612aae886020613808565b612ab99060206137b8565b612ac391906137b8565b9050806001600160401b03811115612add57612add6139af565b6040519080825280601f01601f191660200182016040528015612b07576020820181803683370190505b506101208901518051612b1c906001906137f5565b81518110612b2c57612b2c613773565b6020026020010181905250858583604051602001612b4c939291906139c5565b60408051601f198184030181529190526101208901518051612b70906001906137f5565b81518110612b8057612b80613773565b6020026020010181905250612ba58860800151886002612ba091906137b8565b612d8a565b88608001819052505050505050505050565b612bc2816002612d69565b15612bca5750565b6080810151805160009190612be1906001906137f5565b81518110612bf157612bf1613773565b602002602001015160001c9050600082608001516002846080015151612c1791906137f5565b81518110612c2757612c27613773565b602002602001015160001c9050612c438360a001518383612f09565b6101408401526080830151612c59906002612d8a565b60808401525050600061016090910152565b612c76816002612d69565b15612c7e5750565b6080810151805160009190612c95906001906137f5565b81518110612ca557612ca5613773565b602002602001015160001c9050600082608001516002846080015151612ccb91906137f5565b81518110612cdb57612cdb613773565b602002602001015160001c9050612cf78360a001518383612f09565b6101408401526080830151612d0d906002612d8a565b608084015250506001610180820152600061016090910152565b612d32816001612d69565b15612d3a5750565b612d4981608001516001612d8a565b608082015260408051600080825260208201909252825261016090910152565b6000818360800151511015612d8057506001612d84565b5060005b92915050565b60606000828451612d9b91906137f5565b6001600160401b03811115612db257612db26139af565b604051908082528060200260200182016040528015612ddb578160200160208202803683370190505b50905060005b838551612dee91906137f5565b811015612e3e57848181518110612e0757612e07613773565b6020026020010151828281518110612e2157612e21613773565b602090810291909101015280612e3681613996565b915050612de1565b509392505050565b60606000612e55836020613808565b8451612e6191906137b8565b6001600160401b03811115612e7857612e786139af565b6040519080825280601f01601f191660200182016040528015612ea2576020820181803683370190505b50905060005b8451811015612e3e57848181518110612ec357612ec3613773565b602001015160f81c60f81b828281518110612ee057612ee0613773565b60200101906001600160f81b031916908160001a90535080612f0181613996565b915050612ea8565b6060816001600160401b03811115612f2357612f236139af565b6040519080825280601f01601f191660200182016040528015612f4d576020820181803683370190505b50905060005b82811015612e3e5784612f6682866137b8565b81518110612f7657612f76613773565b602001015160f81c60f81b828281518110612f9357612f93613773565b60200101906001600160f81b031916908160001a90535080612fb481613996565b915050612f53565b600061040082846080015151612fd291906137b8565b1115612d8057506001612d84565b60606000828451612ff191906137b8565b6001600160401b03811115613008576130086139af565b604051908082528060200260200182016040528015613031578160200160208202803683370190505b50905060005b8451811015612e3e5784818151811061305257613052613773565b602002602001015182828151811061306c5761306c613773565b60209081029190910101528061308181613996565b915050613037565b6060600082845161309a91906137b8565b6001600160401b038111156130b1576130b16139af565b6040519080825280601f01601f1916602001820160405280156130db576020820181803683370190505b50905060005b8451811015612e3e578481815181106130fc576130fc613773565b602001015160f81c60f81b82828151811061311957613119613773565b60200101906001600160f81b031916908160001a9053508061313a81613996565b9150506130e1565b6000805b602081101561319d5761315a816008613808565b8461316583866137b8565b8151811061317557613175613773565b01602001516001600160f81b031916901c91909117908061319581613996565b915050613146565b5092915050565b60005b6020811015613202576131bb816008613808565b82901b846131c983866137b8565b815181106131d9576131d9613773565b60200101906001600160f81b031916908160001a905350806131fa81613996565b9150506131a7565b50505050565b8083838151811061321b5761321b613773565b60200101906001600160f81b031916908160001a905350505050565b606080600083865161324991906137b8565b6001600160401b03811115613260576132606139af565b604051908082528060200260200182016040528015613289578160200160208202803683370190505b509050600084865161329b91906137b8565b6001600160401b038111156132b2576132b26139af565b6040519080825280602002602001820160405280156132db578160200160208202803683370190505b50905060005b875181101561336b578781815181106132fc576132fc613773565b602002602001015183828151811061331657613316613773565b60200260200101818152505086818151811061333457613334613773565b602002602001015182828151811061334e5761334e613773565b60209081029190910101528061336381613996565b9150506132e1565b5090969095509350505050565b6060600082845161338991906137b8565b6001600160401b038111156133a0576133a06139af565b6040519080825280602002602001820160405280156133d357816020015b60608152602001906001900390816133be5790505b50905060005b8451811015612e3e578481815181106133f4576133f4613773565b602002602001015182828151811061340e5761340e613773565b6020026020010181905250808061342490613996565b9150506133d9565b604051806101a0016040528060608152602001606081526020016000815260200160008152602001606081526020016060815260200160008152602001606081526020016060815260200160608152602001606081526020016000151581526020016000151581525090565b60008083601f8401126134aa57600080fd5b5081356001600160401b038111156134c157600080fd5b6020830191508360208285010111156134d957600080fd5b9250929050565b6000806000806000606086880312156134f857600080fd5b85356001600160401b038082111561350f57600080fd5b61351b89838a01613498565b9097509550602088013591508082111561353457600080fd5b5061354188828901613498565b96999598509660400135949350505050565b60005b8381101561356e578181015183820152602001613556565b50506000910152565b6000815180845261358f816020860160208601613553565b601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b838110156135d3578151875295820195908201906001016135b7565b509495945050505050565b600082825180855260208086019550808260051b84010181860160005b8481101561362957601f19868403018952613617838351613577565b988401989250908301906001016135fb565b5090979650505050505050565b60208152600082516101a08060208501526136556101c0850183613577565b91506020850151601f19808685030160408701526136738483613577565b9350604087015160608701526060870151608087015260808701519150808685030160a08701526136a484836135a3565b935060a08701519150808685030160c08701526136c18483613577565b935060c087015160e087015260e087015191506101008187860301818801526136ea85846135a3565b94508088015192505061012081878603018188015261370985846135a3565b94508088015192505061014081878603018188015261372885846135de565b9450808801519250506101608187860301818801526137478584613577565b945080880151925050506101806137618187018315159052565b90950151151593019290925250919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60ff8281168282160390811115612d8457612d84613789565b80820180821115612d8457612d84613789565b600080858511156137db57600080fd5b838611156137e857600080fd5b5050820193919092039150565b81810381811115612d8457612d84613789565b8082028115828204841417612d8457612d84613789565b634e487b7160e01b600052601260045260246000fd5b6000826138445761384461381f565b500490565b6000826138585761385861381f565b600160ff1b82146000198414161561387257613872613789565b500590565b6000826138865761388661381f565b500690565b60008261389a5761389a61381f565b500790565b600181815b808511156138da5781600019048211156138c0576138c0613789565b808516156138cd57918102915b93841c93908002906138a4565b509250929050565b6000826138f157506001612d84565b816138fe57506000612d84565b8160018114613914576002811461391e5761393a565b6001915050612d84565b60ff84111561392f5761392f613789565b50506001821b612d84565b5060208310610133831016604e8410600b841016171561395d575081810a612d84565b613967838361389f565b806000190482111561397b5761397b613789565b029392505050565b600061398f83836138e2565b9392505050565b6000600182016139a8576139a8613789565b5060010190565b634e487b7160e01b600052604160045260246000fd5b83815260006020808301855182870160005b828110156139f3578151845292840192908401906001016139d7565b5050508451613a058183858901613553565b01969550505050505056fea264697066735822122037b0473cae1ec5c6e4ec581fce8d34330439290f9e68288c057e74adf81ca17c64736f6c63430008110033", 110 | "linkReferences": {}, 111 | "deployedLinkReferences": {} 112 | } 113 | -------------------------------------------------------------------------------- /backend/hardhat.config.js: -------------------------------------------------------------------------------- 1 | require("dotenv").config(); 2 | require("@nomicfoundation/hardhat-toolbox"); 3 | require("hardhat-gas-reporter"); 4 | require("hardhat-contract-sizer"); 5 | require("@nomiclabs/hardhat-etherscan"); 6 | 7 | /** @type import('hardhat/config').HardhatUserConfig */ 8 | module.exports = { 9 | solidity: { 10 | compilers: [ 11 | { 12 | version: "0.8.17", 13 | settings: { 14 | optimizer: { 15 | enabled: true, 16 | runs: 1, 17 | }, 18 | }, 19 | }, 20 | ], 21 | }, 22 | networks: { 23 | // "optimism-goerli": { 24 | // url: process.env.ALCHEMY_OP_GOERLI_KEY_WSS, 25 | // accounts: [process.env.ALCHEMY_OP_GOERLI_PRIVATE_KEY], 26 | // }, 27 | // for testnet 28 | // "base-goerli": { 29 | // url: "https://goerli.base.org", 30 | // accounts: [process.env.ALCHEMY_OP_GOERLI_PRIVATE_KEY], 31 | // }, 32 | // for mainnet 33 | "base": { 34 | url: "https://developer-access-mainnet.base.org", 35 | accounts: [process.env.ALCHEMY_BASE_PRIVATE_KEY], 36 | gasPrice: 500000000 37 | }, 38 | }, 39 | etherscan: { 40 | apiKey: { 41 | // optimisticGoerli: process.env.ETHERSCAN_OP_API_KEY, 42 | "base-goerli": process.env.BASE_GOERLI_BLOCKSCOUT_KEY, 43 | "base": process.env.BASE_BASESCAN_KEY 44 | }, 45 | customChains: [ 46 | { 47 | network: "base-goerli", 48 | chainId: 84531, 49 | urls: { 50 | // Pick a block explorer and uncomment those lines 51 | 52 | // Blockscout 53 | // apiURL: "https://base-goerli.blockscout.com/api", 54 | // browserURL: "https://base-goerli.blockscout.com" 55 | 56 | // Basescan by Etherscan 57 | apiURL: "https://api-goerli.basescan.org/api", 58 | browserURL: "https://goerli.basescan.org" 59 | }, 60 | }, 61 | { 62 | network: "base", 63 | chainId: 8453, 64 | urls: { 65 | // Basescan by Etherscan 66 | apiURL: "https://api.basescan.org/api", 67 | browserURL: "https://basescan.org" 68 | }, 69 | }, 70 | ], 71 | }, 72 | 73 | contractSizer: { 74 | alphaSort: true, 75 | disambiguatePaths: false, 76 | runOnCompile: true, 77 | strict: false, 78 | only: [], 79 | }, 80 | gasReporter: { 81 | enabled: process.env.REPORT_GAS ? true : false, 82 | currency: "USD", 83 | coinmarketcap: process.env.COINMARKETCAP_API_KEY, 84 | gasPriceApi: process.env.GAS_PRICE_API, 85 | showTimeSpent: true, 86 | }, 87 | }; 88 | -------------------------------------------------------------------------------- /backend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vevm", 3 | "version": "0.4.1", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "kethic, aleta", 11 | "license": "ISC", 12 | "dependencies": { 13 | "dotenv": "^16.0.3", 14 | "ethers": "^5.7.2", 15 | "hardhat": "^2.17.0" 16 | }, 17 | "devDependencies": { 18 | "@nomicfoundation/hardhat-toolbox": "^2.0.1", 19 | "@nomiclabs/hardhat-etherscan": "^3.1.6", 20 | "hardhat-contract-sizer": "^2.8.0" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /backend/scripts/deploy.js: -------------------------------------------------------------------------------- 1 | const { ethers } = require("hardhat"); 2 | const hre = require("hardhat"); 3 | 4 | require("@nomiclabs/hardhat-etherscan"); 5 | 6 | const delay = (ms) => new Promise((res) => setTimeout(res, ms)); 7 | 8 | async function main() { 9 | const { chainId } = await ethers.provider.getNetwork(); 10 | console.log(chainId); 11 | 12 | const [deployer] = await ethers.getSigners(); 13 | 14 | console.log("\nDeployer address:", deployer.address); 15 | console.log("Deployer balance:", (await deployer.getBalance()).toString()); 16 | 17 | const evm_factory = await ethers.getContractFactory("vEVM"); 18 | const evm = await evm_factory.deploy(); 19 | console.log("evm address: ", evm.address); 20 | 21 | if (chainId != 31337) { 22 | await delay(60000); 23 | 24 | await hre.run("verify:verify", { 25 | address: evm.address, 26 | }); 27 | console.log("evm verified"); 28 | } 29 | } 30 | 31 | main() 32 | .then(() => process.exit(0)) 33 | .catch((error) => { 34 | console.log(error); 35 | process.exit(1); 36 | }); 37 | -------------------------------------------------------------------------------- /backend/test/vEVM.js: -------------------------------------------------------------------------------- 1 | const { loadFixture } = require("@nomicfoundation/hardhat-network-helpers"); 2 | const { expect } = require("chai"); 3 | 4 | const print_evm_state = (state) => { 5 | console.log(" code:", state.code); 6 | console.log(" data:", state.data); 7 | console.log(" value:", state.value); 8 | console.log(" pc:", parseInt(state.pc)); 9 | console.log("output:", state.output); 10 | console.log(" stack:", state.stack); 11 | console.log(" mem:", chunkSubstr(state.mem, 64)); 12 | console.log(" skey:", state.storageKey); 13 | console.log(" sdata:", state.storageData); 14 | console.log(" logs:", state.logs); 15 | // if (state.storageKey.length > 0) { 16 | // console.log(" store:"); 17 | // for (let i = 0; i < state.storageKey.length; i++) { 18 | // console.log(" ", state.storageKey[i], state.storageValue[i]); 19 | // } 20 | // } 21 | }; 22 | 23 | function chunkSubstr(str, size) { 24 | const hex = str.slice(2); 25 | const numChunks = Math.ceil(hex.length / size); 26 | const chunks = new Array(numChunks); 27 | 28 | for (let i = 0, o = 0; i < numChunks; ++i, o += size) { 29 | chunks[i] = hex.substr(o, size); 30 | } 31 | 32 | return chunks; 33 | } 34 | 35 | describe("vEVM", function () { 36 | async function deployFixture() { 37 | // Contracts are deployed using the first signer/account by default 38 | const [owner, otherAccount] = await ethers.getSigners(); 39 | 40 | const EVM = await ethers.getContractFactory("vEVM"); 41 | const evm = await EVM.deploy(); 42 | 43 | // await owner.sendTransaction({ 44 | // to: evm.address, 45 | // value: ethers.utils.parseEther("1.0"), // Sends exactly 1.0 ether 46 | // }); 47 | 48 | return { evm, owner, otherAccount }; 49 | } 50 | 51 | describe("execute", function () { 52 | // 0x00 - 0x0F: STOP, ADD, MUL, SUB, DIV, SDIV, MOD, SMOD, ADDMOD, MULMOD, EXP, SIGNEXTEND 53 | describe("STOP", function () { 54 | it("Should set running to false", async function () { 55 | const { evm } = await loadFixture(deployFixture); 56 | let result = await evm.execute("0x00", "0x00", 0); 57 | expect(result.running).to.equal(false); 58 | }); 59 | }); 60 | 61 | describe("ADD", function () { 62 | it("Should sum the top two items on the stack", async function () { 63 | const { evm } = await loadFixture(deployFixture); 64 | let result = await evm.execute("0x600160026003600401", "0x00", 0); 65 | expect(result.stack[2]).to.deep.equal( 66 | "0x0000000000000000000000000000000000000000000000000000000000000007" 67 | ); 68 | }); 69 | }); 70 | 71 | describe("MUL", function () { 72 | it("Should multiply the top two items on the stack", async function () { 73 | const { evm } = await loadFixture(deployFixture); 74 | let result = await evm.execute("0x600160026003600402", "0x00", 0); 75 | expect(result.stack[2]).to.deep.equal( 76 | "0x000000000000000000000000000000000000000000000000000000000000000C" 77 | ); 78 | }); 79 | }); 80 | 81 | describe("SUB", function () { 82 | it("Should subtract the top two items on the stack", async function () { 83 | const { evm } = await loadFixture(deployFixture); 84 | let result = await evm.execute("0x600160026003600403", "0x00", 0); 85 | expect(result.stack[2]).to.deep.equal( 86 | "0x0000000000000000000000000000000000000000000000000000000000000001" 87 | ); 88 | }); 89 | }); 90 | 91 | describe("DIV", function () { 92 | it("Should divide the top two items on the stack", async function () { 93 | const { evm } = await loadFixture(deployFixture); 94 | let result = await evm.execute("0x600160026004600C04", "0x00", 0); 95 | expect(result.stack[2]).to.deep.equal( 96 | "0x0000000000000000000000000000000000000000000000000000000000000003" 97 | ); 98 | }); 99 | }); 100 | 101 | describe("SDIV", function () { 102 | it("Should divide the top two signed items on the stack", async function () { 103 | const { evm } = await loadFixture(deployFixture); 104 | let result = await evm.execute( 105 | "0x600160027FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE05", 106 | "0x00", 107 | 0 108 | ); 109 | expect(result.stack[2]).to.deep.equal( 110 | "0x0000000000000000000000000000000000000000000000000000000000000002" 111 | ); 112 | }); 113 | }); 114 | 115 | describe("MOD", function () { 116 | it("Should store modulo remainder of top two items on the stack", async function () { 117 | const { evm } = await loadFixture(deployFixture); 118 | let result = await evm.execute("0x600160026003600A06", "0x00", 0); 119 | expect(result.stack[2]).to.deep.equal( 120 | "0x0000000000000000000000000000000000000000000000000000000000000001" 121 | ); 122 | }); 123 | }); 124 | 125 | describe("SMOD", function () { 126 | it("Should store modulo remainder of top two signed items on the stack", async function () { 127 | const { evm } = await loadFixture(deployFixture); 128 | let result = await evm.execute( 129 | "0x600160027FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF807", 130 | "0x00", 131 | 0 132 | ); 133 | expect(result.stack[2]).to.deep.equal( 134 | "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE" 135 | ); 136 | }); 137 | }); 138 | 139 | describe("ADDMOD", function () { 140 | it("Should add then store modulo remainder of top three items on the stack", async function () { 141 | const { evm } = await loadFixture(deployFixture); 142 | let result = await evm.execute( 143 | "0x60016002600260027FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08", 144 | "0x00", 145 | 0 146 | ); 147 | expect(result.stack[2]).to.deep.equal( 148 | "0x0000000000000000000000000000000000000000000000000000000000000001" 149 | ); 150 | }); 151 | }); 152 | 153 | describe("MULMOD", function () { 154 | it("Should multiply then store modulo remainder of top three items on the stack", async function () { 155 | const { evm } = await loadFixture(deployFixture); 156 | let result = await evm.execute( 157 | "0x60016002600C7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09", 158 | "0x00", 159 | 0 160 | ); 161 | expect(result.stack[2]).to.deep.equal( 162 | "0x0000000000000000000000000000000000000000000000000000000000000009" 163 | ); 164 | }); 165 | }); 166 | 167 | describe("EXP", function () { 168 | it("Should store exponential result of top two items on the stack", async function () { 169 | const { evm } = await loadFixture(deployFixture); 170 | let result = await evm.execute("0x6002600A0A", "0x00", 0); 171 | expect(result.stack[0]).to.deep.equal( 172 | "0x0000000000000000000000000000000000000000000000000000000000000064" 173 | ); 174 | }); 175 | }); 176 | 177 | describe("SIGNEXTEND", function () { 178 | it("Should sign extend top value on the stack starting ata specific byte", async function () { 179 | const { evm } = await loadFixture(deployFixture); 180 | let result = await evm.execute("0x60FF60000B607F60000B", "0x00", 0); 181 | expect(result.stack[1]).to.deep.equal( 182 | "0x000000000000000000000000000000000000000000000000000000000000007F" 183 | ) && 184 | expect(result.stack[0]).to.deep.equal( 185 | "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" 186 | ); 187 | }); 188 | }); 189 | 190 | // 0x10 - 0x1F: LT, GT, SLT, SGT, EQ, ISZERO, AND, OR, XOR, NOT, BYTE, SHL, SHR, SAR 191 | describe("LT", function () { 192 | it("Should store 1 if a < b, else 0", async function () { 193 | const { evm } = await loadFixture(deployFixture); 194 | let result = await evm.execute("0x6009600A10600A600910", "0x00", 0); 195 | expect(result.stack[0]).to.deep.equal( 196 | "0x000000000000000000000000000000000000000000000000000000000000000" 197 | ) && 198 | expect(result.stack[1]).to.deep.equal( 199 | "0x000000000000000000000000000000000000000000000000000000000000001" 200 | ); 201 | }); 202 | }); 203 | 204 | describe("GT", function () { 205 | it("Should store 1 if a > b, else 0", async function () { 206 | const { evm } = await loadFixture(deployFixture); 207 | let result = await evm.execute("0x6009600A11600A600911", "0x00", 0); 208 | expect(result.stack[0]).to.deep.equal( 209 | "0x000000000000000000000000000000000000000000000000000000000000001" 210 | ) && 211 | expect(result.stack[1]).to.deep.equal( 212 | "0x000000000000000000000000000000000000000000000000000000000000000" 213 | ); 214 | }); 215 | }); 216 | 217 | describe("SLT", function () { 218 | it("Should store 1 if a < b, else 0", async function () { 219 | const { evm } = await loadFixture(deployFixture); 220 | let result = await evm.execute( 221 | "0x60097FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12600A600A12", 222 | "0x00", 223 | 0 224 | ); 225 | expect(result.stack[0]).to.deep.equal( 226 | "0x000000000000000000000000000000000000000000000000000000000000001" 227 | ) && 228 | expect(result.stack[1]).to.deep.equal( 229 | "0x000000000000000000000000000000000000000000000000000000000000000" 230 | ); 231 | }); 232 | }); 233 | 234 | describe("SGT", function () { 235 | it("Should store 1 if a > b, else 0", async function () { 236 | const { evm } = await loadFixture(deployFixture); 237 | let result = await evm.execute( 238 | "0x60097FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13600A600B13", 239 | "0x00", 240 | 0 241 | ); 242 | expect(result.stack[0]).to.deep.equal( 243 | "0x000000000000000000000000000000000000000000000000000000000000000" 244 | ) && 245 | expect(result.stack[1]).to.deep.equal( 246 | "0x000000000000000000000000000000000000000000000000000000000000001" 247 | ); 248 | }); 249 | }); 250 | 251 | describe("EQ", function () { 252 | it("Should store 1 if a == b, else 0", async function () { 253 | const { evm } = await loadFixture(deployFixture); 254 | let result = await evm.execute("0x600A600A14600A600914", "0x00", 0); 255 | expect(result.stack[0]).to.deep.equal( 256 | "0x000000000000000000000000000000000000000000000000000000000000001" 257 | ) && 258 | expect(result.stack[1]).to.deep.equal( 259 | "0x000000000000000000000000000000000000000000000000000000000000000" 260 | ); 261 | }); 262 | }); 263 | 264 | describe("ISZERO", function () { 265 | it("Should store 1 if a == 0, else 0", async function () { 266 | const { evm } = await loadFixture(deployFixture); 267 | let result = await evm.execute("0x600015600115", "0x00", 0); 268 | expect(result.stack[0]).to.deep.equal( 269 | "0x0000000000000000000000000000000000000000000000000000000000000001" 270 | ) && 271 | expect(result.stack[1]).to.deep.equal( 272 | "0x000000000000000000000000000000000000000000000000000000000000000" 273 | ); 274 | }); 275 | }); 276 | 277 | describe("AND", function () { 278 | it("Should bitwise AND correctly", async function () { 279 | const { evm } = await loadFixture(deployFixture); 280 | let result = await evm.execute("0x600F600F1660FF600016", "0x00", 0); 281 | expect(result.stack[0]).to.deep.equal( 282 | "0x000000000000000000000000000000000000000000000000000000000000000F" 283 | ) && 284 | expect(result.stack[1]).to.deep.equal( 285 | "0x000000000000000000000000000000000000000000000000000000000000000" 286 | ); 287 | }); 288 | }); 289 | 290 | describe("OR", function () { 291 | it("Should bitwise OR correctly", async function () { 292 | const { evm } = await loadFixture(deployFixture); 293 | let result = await evm.execute("0x600F60F01760FF60FF17", "0x00", 0); 294 | expect(result.stack[0]).to.deep.equal( 295 | "0x00000000000000000000000000000000000000000000000000000000000000FF" 296 | ) && 297 | expect(result.stack[1]).to.deep.equal( 298 | "0x0000000000000000000000000000000000000000000000000000000000000FF" 299 | ); 300 | }); 301 | }); 302 | 303 | describe("XOR", function () { 304 | it("Should bitwise XOR correctly", async function () { 305 | const { evm } = await loadFixture(deployFixture); 306 | let result = await evm.execute("0x600F60F01860FF60FF18", "0x00", 0); 307 | expect(result.stack[0]).to.deep.equal( 308 | "0x00000000000000000000000000000000000000000000000000000000000000FF" 309 | ) && 310 | expect(result.stack[1]).to.deep.equal( 311 | "0x000000000000000000000000000000000000000000000000000000000000000" 312 | ); 313 | }); 314 | }); 315 | 316 | describe("NOT", function () { 317 | it("Should bitwise NOT correctly", async function () { 318 | const { evm } = await loadFixture(deployFixture); 319 | let result = await evm.execute("0x600019", "0x00", 0); 320 | expect(result.stack[0]).to.deep.equal( 321 | "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" 322 | ); 323 | }); 324 | }); 325 | 326 | describe("BYTE", function () { 327 | it("Should extract the correct byte", async function () { 328 | const { evm } = await loadFixture(deployFixture); 329 | let result = await evm.execute("0x60FF601F1A61FF00601E1A", "0x00", 0); 330 | expect(result.stack[0]).to.deep.equal( 331 | "0x00000000000000000000000000000000000000000000000000000000000000FF" 332 | ) && 333 | expect(result.stack[1]).to.deep.equal( 334 | "0x0000000000000000000000000000000000000000000000000000000000000FF" 335 | ); 336 | }); 337 | }); 338 | 339 | describe("SHL", function () { 340 | it("Should shift bits left", async function () { 341 | const { evm } = await loadFixture(deployFixture); 342 | let result = await evm.execute("0x600160011B7FFF0000000000000000000000000000000000000000000000000000000000000060041B", "0x00", 0); 343 | expect(result.stack[0]).to.deep.equal( 344 | "0x000000000000000000000000000000000000000000000000000000000000002" 345 | ) && 346 | expect(result.stack[1]).to.deep.equal( 347 | "0xF000000000000000000000000000000000000000000000000000000000000000" 348 | ); 349 | }); 350 | }); 351 | 352 | describe("SHR", function () { 353 | it("Should shift bits right", async function () { 354 | const { evm } = await loadFixture(deployFixture); 355 | let result = await evm.execute("0x600260011C60FF60041C", "0x00", 0); 356 | expect(result.stack[0]).to.deep.equal( 357 | "0x000000000000000000000000000000000000000000000000000000000000001" 358 | ) && 359 | expect(result.stack[1]).to.deep.equal( 360 | "0x000000000000000000000000000000000000000000000000000000000000000f" 361 | ); 362 | }); 363 | }); 364 | 365 | describe("SAR", function () { 366 | it("Should shift bits right with sign extension", async function () { 367 | const { evm } = await loadFixture(deployFixture); 368 | let result = await evm.execute("0x600260011D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060041D", "0x00", 0); 369 | expect(result.stack[0]).to.deep.equal( 370 | "0x000000000000000000000000000000000000000000000000000000000000001" 371 | ) && 372 | expect(result.stack[1]).to.deep.equal( 373 | "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" 374 | ); 375 | }); 376 | }); 377 | 378 | describe("SHA3", function () { 379 | it("Should keccak256 to the correct value", async function () { 380 | const { evm } = await loadFixture(deployFixture); 381 | let result = await evm.execute("0x7FFFFFFFFF000000000000000000000000000000000000000000000000000000006000526004600020", "0x00", 0); 382 | // print_evm_state(result); 383 | expect(result.stack[0]).to.deep.equal( 384 | "0x29045a592007d0c246ef02c2223570da9522d0cf0f73282c79a1bc8f0bb2c238" 385 | ); 386 | }); 387 | }); 388 | 389 | describe("ADDRESS", function () { 390 | it("Should place address of vEVM on stack", async function () { 391 | const { evm } = await loadFixture(deployFixture); 392 | let result = await evm.execute("0x30", "0x00", 0); 393 | // print_evm_state(result); 394 | expect(result.stack[0]).to.deep.equal( 395 | "0x0000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa3" 396 | ); 397 | }); 398 | }); 399 | 400 | describe("BALANCE", function () { 401 | it("Should place address of vEVM on stack", async function () { 402 | const { evm } = await loadFixture(deployFixture); 403 | let result = await evm.execute("0x3031", "0x00", 0); 404 | // print_evm_state(result); 405 | expect(result.stack[0]).to.deep.equal( 406 | "0x0000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa3" 407 | ); 408 | }); 409 | }); 410 | 411 | // describe("SHA3", function () { 412 | // it("Should extract a specfic byte from a stack value back onto the stack", async function () { 413 | // const { evm } = await loadFixture(deployFixture); 414 | // let result = await evm.execute( 415 | // "0x7FFFFFFFFF000000000000000000000000000000000000000000000000000000006000526004600020" 416 | // ); 417 | // console.log( 418 | // " code:", 419 | // "0x7FFFFFFFFF000000000000000000000000000000000000000000000000000000006000526004600020" 420 | // ); 421 | // print_evm_state(result); 422 | // }); 423 | // }); 424 | 425 | 426 | // 0x60 - 0x7F: PUSH1 - PUSH32 427 | describe("PUSH", function () { 428 | it("Should correctly store calldata from PUSH1-PUSH32", async function () { 429 | const { evm } = await loadFixture(deployFixture); 430 | let result = await evm.execute( 431 | "0x600161000262000003630000000464000000000565000000000006660000000000000767000000000000000868000000000000000009690000000000000000000A6A000000000000000000000B6B00000000000000000000000C6C0000000000000000000000000D6D000000000000000000000000000E6E00000000000000000000000000000F6F0000000000000000000000000000001070000000000000000000000000000000001171000000000000000000000000000000000012720000000000000000000000000000000000001373000000000000000000000000000000000000001474000000000000000000000000000000000000000015750000000000000000000000000000000000000000001676000000000000000000000000000000000000000000001777000000000000000000000000000000000000000000000018780000000000000000000000000000000000000000000000001979000000000000000000000000000000000000000000000000001A7A00000000000000000000000000000000000000000000000000001B7B0000000000000000000000000000000000000000000000000000001C7C000000000000000000000000000000000000000000000000000000001D7D00000000000000000000000000000000000000000000000000000000001E7E0000000000000000000000000000000000000000000000000000000000001F7F00000000000000000000000000000000000000000000000000000000000000FF", 432 | "0xCA11", 433 | 374 434 | ); 435 | expect(result.stack).to.deep.equal([ 436 | "0x0000000000000000000000000000000000000000000000000000000000000001", 437 | "0x0000000000000000000000000000000000000000000000000000000000000002", 438 | "0x0000000000000000000000000000000000000000000000000000000000000003", 439 | "0x0000000000000000000000000000000000000000000000000000000000000004", 440 | "0x0000000000000000000000000000000000000000000000000000000000000005", 441 | "0x0000000000000000000000000000000000000000000000000000000000000006", 442 | "0x0000000000000000000000000000000000000000000000000000000000000007", 443 | "0x0000000000000000000000000000000000000000000000000000000000000008", 444 | "0x0000000000000000000000000000000000000000000000000000000000000009", 445 | "0x000000000000000000000000000000000000000000000000000000000000000a", 446 | "0x000000000000000000000000000000000000000000000000000000000000000b", 447 | "0x000000000000000000000000000000000000000000000000000000000000000c", 448 | "0x000000000000000000000000000000000000000000000000000000000000000d", 449 | "0x000000000000000000000000000000000000000000000000000000000000000e", 450 | "0x000000000000000000000000000000000000000000000000000000000000000f", 451 | "0x0000000000000000000000000000000000000000000000000000000000000010", 452 | "0x0000000000000000000000000000000000000000000000000000000000000011", 453 | "0x0000000000000000000000000000000000000000000000000000000000000012", 454 | "0x0000000000000000000000000000000000000000000000000000000000000013", 455 | "0x0000000000000000000000000000000000000000000000000000000000000014", 456 | "0x0000000000000000000000000000000000000000000000000000000000000015", 457 | "0x0000000000000000000000000000000000000000000000000000000000000016", 458 | "0x0000000000000000000000000000000000000000000000000000000000000017", 459 | "0x0000000000000000000000000000000000000000000000000000000000000018", 460 | "0x0000000000000000000000000000000000000000000000000000000000000019", 461 | "0x000000000000000000000000000000000000000000000000000000000000001a", 462 | "0x000000000000000000000000000000000000000000000000000000000000001b", 463 | "0x000000000000000000000000000000000000000000000000000000000000001c", 464 | "0x000000000000000000000000000000000000000000000000000000000000001d", 465 | "0x000000000000000000000000000000000000000000000000000000000000001e", 466 | "0x000000000000000000000000000000000000000000000000000000000000001f", 467 | "0x00000000000000000000000000000000000000000000000000000000000000ff", 468 | ]); 469 | }); 470 | }); 471 | 472 | // describe("MLOAD", function () { 473 | // it("Should read various offsets onto the stack", async function () { 474 | // const { evm } = await loadFixture(deployFixture); 475 | // let result = await evm.execute("0x60FF60005260005160015160A560A05260A151"); 476 | // console.log(" code:", "0x60FF60005260005160015160A560A05260A151"); 477 | // print_evm_state(result); 478 | // }); 479 | 480 | // }); 481 | 482 | // describe("MSTORE", function () { 483 | // it("Should push a bytes32 to memory 0x80", async function () { 484 | // const { evm } = await loadFixture(deployFixture); 485 | // let result = await evm.execute( 486 | // "0x7F000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F600052" 487 | // ); 488 | // console.log( 489 | // " code:", 490 | // "0x7F000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F600052" 491 | // ); 492 | // print_evm_state(result); 493 | // }); 494 | 495 | // it("Should push a bytes32 to memory 0x81", async function () { 496 | // const { evm } = await loadFixture(deployFixture); 497 | // let result = await evm.execute( 498 | // "0x7F000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F600152" 499 | // ); 500 | // console.log( 501 | // " code:", 502 | // "0x7F000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F600152" 503 | // ); 504 | // print_evm_state(result); 505 | // }); 506 | // }); 507 | 508 | // describe("MSTORE8", function () { 509 | // it("Should push a bytes1 to memory 0x80", async function () { 510 | // const { evm } = await loadFixture(deployFixture); 511 | // let result = await evm.execute("0x60A5600053"); 512 | // console.log(" code:", "0x60A5600053"); 513 | // print_evm_state(result); 514 | // }); 515 | 516 | // it("Should push a bytes1 to memory 0x81", async function () { 517 | // const { evm } = await loadFixture(deployFixture); 518 | // let result = await evm.execute("0x60A5600153"); 519 | // console.log(" code:", "0x60A5600153"); 520 | // print_evm_state(result); 521 | // }); 522 | // }); 523 | 524 | // describe("MSIZE", function () { 525 | // it("Should push a bytes1 to memory 0x80", async function () { 526 | // const { evm } = await loadFixture(deployFixture); 527 | // let result = await evm.execute("0x59608051505960C9515059"); 528 | // console.log(" code:", "0x59608051505960C9515059"); 529 | // print_evm_state(result); 530 | // }); 531 | // }); 532 | 533 | // describe("RETURN", function () { 534 | // it("Should return the sum the top two items on the stack", async function () { 535 | // const { evm } = await loadFixture(deployFixture); 536 | // let result = await evm.execute("0x60016002600360040160005260206000F3"); 537 | // console.log(" code:", "0x60016002600360040160005260206000F3"); 538 | // print_evm_state(result); 539 | // }); 540 | // }); 541 | 542 | // describe("SLOAD", function () { 543 | // it("Should push a bytes1 to memory 0x80", async function () { 544 | // const { evm } = await loadFixture(deployFixture); 545 | // let result = await evm.execute("0x600054600154"); 546 | // console.log(" code:", "0x600054600154"); 547 | // print_evm_state(result); 548 | // }); 549 | // }); 550 | 551 | // describe("SSTORE", function () { 552 | // it("Should store and retrieve 0x25 to storage slot 11", async function () { 553 | // const { evm } = await loadFixture(deployFixture); 554 | // let result = await evm.execute("0x6025601155601154"); 555 | // console.log(" code:", "0x6025601155601154"); 556 | // print_evm_state(result); 557 | // }); 558 | // }); 559 | 560 | // describe("DUPN", function () { 561 | // it("Should Duplicate the Nth stack item (from top of the stack) to the top of stack", async function () { 562 | // const { evm } = await loadFixture(deployFixture); 563 | // let result = await evm.execute( 564 | // "0x6000600160026003600460056006600760086009600A600B600C600D600E600F8A" 565 | // ); 566 | // console.log( 567 | // " code:", 568 | // "0x6000600160026003600460056006600760086009600A600B600C600D600E600F80" 569 | // ); 570 | // print_evm_state(result); 571 | // }); 572 | // }); 573 | 574 | // describe("SWAPN", function () { 575 | // it("Should Duplicate the Nth stack item (from top of the stack) to the top of stack", async function () { 576 | // const { evm } = await loadFixture(deployFixture); 577 | // let result = await evm.execute( 578 | // "0x6000600160026003600460056006600760086009600A600B600C600D600E600F9A" 579 | // ); 580 | // console.log( 581 | // " code:", 582 | // "0x6000600160026003600460056006600760086009600A600B600C600D600E600F9A" 583 | // ); 584 | // print_evm_state(result); 585 | // }); 586 | // }); 587 | 588 | // describe("JUMP", function () { 589 | // it("Should ", async function () { 590 | // const { evm } = await loadFixture(deployFixture); 591 | // let result = await evm.execute("0x6000600756600A5B6001"); 592 | // print_evm_state(result); 593 | // }); 594 | // }); 595 | 596 | // describe("JUMPI", function () { 597 | // it("Should ", async function () { 598 | // const { evm } = await loadFixture(deployFixture); 599 | // let result = await evm.execute("0x6001600757600A5B6001"); 600 | // print_evm_state(result); 601 | // }); 602 | // }); 603 | 604 | // describe("PC", function () { 605 | // it("Should ", async function () { 606 | // const { evm } = await loadFixture(deployFixture); 607 | // let result = await evm.execute("0x600158"); 608 | // print_evm_state(result); 609 | // }); 610 | // }); 611 | 612 | // describe("BALANCE", function () { 613 | // it("Should ", async function () { 614 | // const { evm } = await loadFixture(deployFixture); 615 | // let result = await evm.execute("0x3031"); 616 | // print_evm_state(result); 617 | // }); 618 | // }); 619 | 620 | // describe("Arbitrary", function () { 621 | // it("Execution", async function () { 622 | // const { evm } = await loadFixture(deployFixture); 623 | // //"0x6033600202595260206000f3" 624 | // let result = await evm.execute("0x60006000A07F000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F60206000527FA5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C360206000A1", "0x00", 0); 625 | // print_evm_state(result); 626 | // }); 627 | // }); 628 | 629 | // describe("SELFDESTRUCT", function () { 630 | // it("Should ", async function () { 631 | // const { evm } = await loadFixture(deployFixture); 632 | // let result = await evm.execute("0x600160026003600052FF"); 633 | // print_evm_state(result); 634 | // }); 635 | // }); 636 | 637 | // describe("CALLER", function () { 638 | // it("Should ", async function () { 639 | // const { evm } = await loadFixture(deployFixture); 640 | // let result = await evm.execute("0x33"); 641 | // print_evm_state(result); 642 | // }); 643 | // }); 644 | 645 | // describe("CREATE", function () { 646 | // it("Should ", async function () { 647 | // const { evm } = await loadFixture(deployFixture); 648 | // let result = await evm.execute("0x7F000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F600052602060006001"); 649 | // print_evm_state(result); 650 | // }); 651 | // }); 652 | 653 | // describe("MLOAD DEBUG", function () { 654 | // it("Should", async function () { 655 | // const { evm } = await loadFixture(deployFixture); 656 | // // let result = await evm.execute("0x6701020304050607085952"); 657 | // let result = await evm.execute("0x7F000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F600052600151"); 658 | // print_evm_state(result); 659 | // }); 660 | // }); 661 | 662 | // describe("CALLDATA STUFF", function () { 663 | // it("Execution", async function () { 664 | // const { evm } = await loadFixture(deployFixture); 665 | // //"0x6033600202595260206000f3" 666 | // let result = await evm.execute("0x3436600135", "0x0011223344", 64); 667 | // print_evm_state(result); 668 | // }); 669 | // }); 670 | }); 671 | }); 672 | -------------------------------------------------------------------------------- /frontend/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kethcode/vEVM/ece529e1484cfff167ad205f2c43e49c8aab8bf5/frontend/.DS_Store -------------------------------------------------------------------------------- /frontend/.npmrc: -------------------------------------------------------------------------------- 1 | strict-peer-dependencies = false 2 | legacy-peer-deps = true -------------------------------------------------------------------------------- /frontend/README.md: -------------------------------------------------------------------------------- 1 | This is a [wagmi](https://wagmi.sh) + [ConnectKit](https://docs.family.co/connectkit) + [Vite](https://vitejs.dev/) project bootstrapped with [`create-wagmi`](https://github.com/wagmi-dev/wagmi/tree/main/packages/create-wagmi) 2 | 3 | # Getting Started 4 | 5 | Run `npm run dev` in your terminal, and then open [localhost:5173](http://localhost:5173) in your browser. 6 | 7 | Once the webpage has loaded, changes made to files inside the `src/` directory (e.g. `src/App.tsx`) will automatically update the webpage. 8 | 9 | # Learn more 10 | 11 | To learn more about [Vite](https://vitejs.dev/), [ConnectKit](https://docs.family.co/connectkit) or [wagmi](https://wagmi.sh), check out the following resources: 12 | 13 | - [wagmi Documentation](https://wagmi.sh) – learn about wagmi Hooks and API. 14 | - [wagmi Examples](https://wagmi.sh/examples/connect-wallet) – a suite of simple examples using wagmi. 15 | - [ConnectKit Documentation](https://docs.family.co/connectkit) – learn more about ConnectKit (configuration, theming, advanced usage, etc). 16 | - [Vite Documentation](https://vitejs.dev/) – learn about Vite features and API. 17 | -------------------------------------------------------------------------------- /frontend/abi/vEVM.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "vEVM", 4 | "sourceName": "contracts/vEVM.sol", 5 | "abi": [ 6 | { 7 | "inputs": [], 8 | "stateMutability": "nonpayable", 9 | "type": "constructor" 10 | }, 11 | { 12 | "inputs": [ 13 | { 14 | "internalType": "bytes", 15 | "name": "bytecode", 16 | "type": "bytes" 17 | }, 18 | { 19 | "internalType": "bytes", 20 | "name": "data", 21 | "type": "bytes" 22 | }, 23 | { 24 | "internalType": "uint256", 25 | "name": "value", 26 | "type": "uint256" 27 | } 28 | ], 29 | "name": "execute", 30 | "outputs": [ 31 | { 32 | "components": [ 33 | { 34 | "internalType": "bytes", 35 | "name": "code", 36 | "type": "bytes" 37 | }, 38 | { 39 | "internalType": "bytes", 40 | "name": "data", 41 | "type": "bytes" 42 | }, 43 | { 44 | "internalType": "uint256", 45 | "name": "value", 46 | "type": "uint256" 47 | }, 48 | { 49 | "internalType": "uint256", 50 | "name": "pc", 51 | "type": "uint256" 52 | }, 53 | { 54 | "internalType": "bytes32[]", 55 | "name": "stack", 56 | "type": "bytes32[]" 57 | }, 58 | { 59 | "internalType": "bytes", 60 | "name": "mem", 61 | "type": "bytes" 62 | }, 63 | { 64 | "internalType": "uint256", 65 | "name": "msize", 66 | "type": "uint256" 67 | }, 68 | { 69 | "internalType": "bytes32[]", 70 | "name": "storageKey", 71 | "type": "bytes32[]" 72 | }, 73 | { 74 | "internalType": "bytes32[]", 75 | "name": "storageData", 76 | "type": "bytes32[]" 77 | }, 78 | { 79 | "internalType": "bytes[]", 80 | "name": "logs", 81 | "type": "bytes[]" 82 | }, 83 | { 84 | "internalType": "bytes", 85 | "name": "output", 86 | "type": "bytes" 87 | }, 88 | { 89 | "internalType": "bool", 90 | "name": "running", 91 | "type": "bool" 92 | }, 93 | { 94 | "internalType": "bool", 95 | "name": "reverting", 96 | "type": "bool" 97 | } 98 | ], 99 | "internalType": "struct vEVM.vEVMState", 100 | "name": "", 101 | "type": "tuple" 102 | } 103 | ], 104 | "stateMutability": "view", 105 | "type": "function" 106 | } 107 | ], 108 | "bytecode": "0x608060405234801561001057600080fd5b50613a46806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a8c5421114610030575b600080fd5b61004361003e3660046134e0565b610059565b6040516100509190613636565b60405180910390f35b61006161342c565b61006961342c565b86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080516020601f870181900481028201810190925285815290869086908190840183828082843760009201829052506020860194909452505050604082018490526060820181905260c0820181905260016101608301526101808201525b60008787836060015181811061011957610119613773565b909101356001600160f81b03191691505060008190036101455760006101608301526109a9565b6109a9565b6001600160f81b03198116600160f81b0361016357610140826109e6565b6001600160f81b03198116600160f91b036101815761014082610aa5565b6001600160f81b03198116600360f81b0361019f5761014082610b1e565b6001600160f81b03198116600160fa1b036101bd5761014082610b97565b6001600160f81b03198116600560f81b036101db5761014082610c10565b6001600160f81b03198116600360f91b036101f95761014082610c89565b6001600160f81b03198116600760f81b036102175761014082610d02565b6001600160f81b03198116600160fb1b036102355761014082610d7b565b6001600160f81b03198116600960f81b036102535761014082610ee9565b6001600160f81b03198116600560f91b036102715761014082611006565b6001600160f81b03198116600b60f81b0361028f576101408261107f565b6001600160f81b03198116600160fc1b036102ad5761014082611150565b6001600160f81b03198116601160f81b036102cb57610140826111e8565b6001600160f81b03198116600960f91b036102e95761014082611263565b6001600160f81b03198116601360f81b0361030757610140826112de565b6001600160f81b03198116600560fa1b036103255761014082611359565b6001600160f81b03198116601560f81b0361034357610140826113d4565b6001600160f81b03198116600b60f91b03610361576101408261145f565b6001600160f81b03198116601760f81b0361037f57610140826114e4565b6001600160f81b03198116600360fb1b0361039d5761014082611569565b6001600160f81b03198116601960f81b036103bb57610140826115ee565b6001600160f81b03198116600d60f91b036103d95761014082611644565b6001600160f81b03198116601b60f81b036103f757610140826116dc565b6001600160f81b03198116600760fa1b0361041557610140826117a3565b6001600160f81b03198116601d60f81b036104335761014082611833565b6001600160f81b03198116600160fd1b0361045157610140826118cf565b6001600160f81b03198116600360fc1b0361046f5761014082611a3e565b6001600160f81b03198116603160f81b0361048d5761014082611a78565b6001600160f81b03198116601960f91b036104ab5761014082611aff565b6001600160f81b03198116603360f81b036104c95761014082611b39565b6001600160f81b03198116600d60fa1b036104e75761014082611b73565b6001600160f81b03198116603560f81b036105055761014082611bb2565b6001600160f81b03198116601b60f91b036105235761014082611c8f565b6001600160f81b03198116600760fb1b036105415761014082611ccf565b6001600160f81b03198116601d60f91b0361055f5761014082611d0c565b6001600160f81b03198116603b60f81b0361057d5761014082611d46565b6001600160f81b03198116600160fe1b0361059b5761014082611da7565b6001600160f81b03198116604160f81b036105b95761014082611e07565b6001600160f81b03198116602160f91b036105d75761014082611e41565b6001600160f81b03198116604360f81b036105f55761014082611e7b565b6001600160f81b03198116602360f91b036106135761014082611eb5565b6001600160f81b03198116604760f81b036106315761014082611eef565b6001600160f81b03198116600960fb1b0361064f5761014082611f29565b6001600160f81b03198116600560fc1b0361066d5761014082611f63565b6001600160f81b03198116605160f81b0361068b5761014082611f85565b6001600160f81b03198116602960f91b036106a95761014082612038565b6001600160f81b03198116605360f81b036106c7576101408261213c565b6001600160f81b03198116601560fa1b036106e55761014082612222565b6001600160f81b03198116605560f81b036107035761014082612330565b6001600160f81b03198116602b60f91b0361072157610140826124c1565b6001600160f81b03198116605760f81b0361073f576101408261255c565b6001600160f81b03198116600b60fb1b0361075d5761014082612635565b6001600160f81b03198116605960f81b0361077b5761014082612674565b605b60f81b6001600160f81b031982161461014057600360fd1b6001600160f81b03198216108015906107bc5750607f60f81b6001600160f81b0319821611155b1561086e5760006107d2605f60f884901c61379f565b60ff169050610852838a8a866060015160016107ee91906137b8565b90858860600151600161080191906137b8565b61080b91906137b8565b92610818939291906137cb565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506126b492505050565b808360600181815161086491906137b8565b9052506109a99050565b600160ff1b6001600160f81b031982161080159061089a5750608f60f81b6001600160f81b0319821611155b156108ba57610140826108b2607f60f885901c61379f565b60ff16612788565b600960fc1b6001600160f81b03198216108015906108e65750609f60f81b6001600160f81b0319821611155b1561090657610140826108fe608f60f885901c61379f565b60ff16612806565b600560fd1b6001600160f81b03198216108015906109325750602960fa1b6001600160f81b0319821611155b15610952576101408261094a60a060f885901c61379f565b60ff166128f2565b6001600160f81b0319811660f360f81b036109705761014082612bb7565b6001600160f81b0319811660fd60f81b0361098e5761014082612c6b565b6001600160f81b031980821690036109a9576109a982612d27565b8161016001516109b957506109dc565b6001826060018181516109cc91906137b8565b9052505060608101518611610101575b9695505050505050565b6109f1816002612d69565b156109f95750565b60808101518051610a0c906002906137f5565b81518110610a1c57610a1c613773565b602090810291909101015160808201518051610a3a906001906137f5565b81518110610a4a57610a4a613773565b602002602001015160001c610a5f91906137b8565b60808201518051610a72906002906137f5565b81518110610a8257610a82613773565b602002602001018181525050610a9d81608001516001612d8a565b608090910152565b610ab0816002612d69565b15610ab85750565b60808101518051610acb906002906137f5565b81518110610adb57610adb613773565b602090810291909101015160808201518051610af9906001906137f5565b81518110610b0957610b09613773565b602002602001015160001c610a5f9190613808565b610b29816002612d69565b15610b315750565b60808101518051610b44906002906137f5565b81518110610b5457610b54613773565b602090810291909101015160808201518051610b72906001906137f5565b81518110610b8257610b82613773565b602002602001015160001c610a5f91906137f5565b610ba2816002612d69565b15610baa5750565b60808101518051610bbd906002906137f5565b81518110610bcd57610bcd613773565b602090810291909101015160808201518051610beb906001906137f5565b81518110610bfb57610bfb613773565b602002602001015160001c610a5f9190613835565b610c1b816002612d69565b15610c235750565b60808101518051610c36906002906137f5565b81518110610c4657610c46613773565b602090810291909101015160808201518051610c64906001906137f5565b81518110610c7457610c74613773565b602002602001015160001c610a5f9190613849565b610c94816002612d69565b15610c9c5750565b60808101518051610caf906002906137f5565b81518110610cbf57610cbf613773565b602090810291909101015160808201518051610cdd906001906137f5565b81518110610ced57610ced613773565b602002602001015160001c610a5f9190613877565b610d0d816002612d69565b15610d155750565b60808101518051610d28906002906137f5565b81518110610d3857610d38613773565b602090810291909101015160808201518051610d56906001906137f5565b81518110610d6657610d66613773565b602002602001015160001c610a5f919061388b565b610d86816003612d69565b15610d8e5750565b60808101518051610da1906003906137f5565b81518110610db157610db1613773565b602002602001015160001c600003610dfb576080810151805160009190610dda906003906137f5565b81518110610dea57610dea613773565b602002602001018181525050610eda565b6080810151805160009190610e12906001906137f5565b81518110610e2257610e22613773565b602002602001015160001c9050600082608001516002846080015151610e4891906137f5565b81518110610e5857610e58613773565b602002602001015160001c9050600083608001516003856080015151610e7e91906137f5565b81518110610e8e57610e8e613773565b602002602001015160001c9050600081838508608086015180519192508291610eb9906003906137f5565b81518110610ec957610ec9613773565b602002602001018181525050505050505b610a9d81608001516002612d8a565b610ef4816003612d69565b15610efc5750565b60808101518051610f0f906003906137f5565b81518110610f1f57610f1f613773565b602002602001015160001c600003610f48576080810151805160009190610dda906003906137f5565b6080810151805160009190610f5f906001906137f5565b81518110610f6f57610f6f613773565b602002602001015160001c9050600082608001516002846080015151610f9591906137f5565b81518110610fa557610fa5613773565b602002602001015160001c9050600083608001516003856080015151610fcb91906137f5565b81518110610fdb57610fdb613773565b602002602001015160001c9050600081838509608086015180519192508291610eb9906003906137f5565b611011816002612d69565b156110195750565b6080810151805161102c906002906137f5565b8151811061103c5761103c613773565b60209081029190910101516080820151805161105a906001906137f5565b8151811061106a5761106a613773565b602002602001015160001c610a5f9190613983565b61108a816002612d69565b156110925750565b60808101518051600091906110a9906001906137f5565b815181106110b9576110b9613773565b602002602001015160001c90506000826080015160028460800151516110df91906137f5565b815181106110ef576110ef613773565b60209081029190910101516080840151805191925082840b91829190611117906002906137f5565b8151811061112757611127613773565b60200260200101818152505061114284608001516001612d8a565b846080018190525050505050565b61115b816002612d69565b156111635750565b60808101518051611176906002906137f5565b8151811061118657611186613773565b6020908102919091010151608082015180516111a4906001906137f5565b815181106111b4576111b4613773565b602002602001015160001c106111cb5760006111ce565b60015b6080820151805160ff9290921691610a72906002906137f5565b6111f3816002612d69565b156111fb5750565b6080810151805161120e906002906137f5565b8151811061121e5761121e613773565b60209081029190910101516080820151805161123c906001906137f5565b8151811061124c5761124c613773565b602002602001015160001c116111cb5760006111ce565b61126e816002612d69565b156112765750565b60808101518051611289906002906137f5565b8151811061129957611299613773565b6020908102919091010151608082015180516112b7906001906137f5565b815181106112c7576112c7613773565b602002602001015160001c126111cb5760006111ce565b6112e9816002612d69565b156112f15750565b60808101518051611304906002906137f5565b8151811061131457611314613773565b602090810291909101015160808201518051611332906001906137f5565b8151811061134257611342613773565b602002602001015160001c136111cb5760006111ce565b611364816002612d69565b1561136c5750565b6080810151805161137f906002906137f5565b8151811061138f5761138f613773565b6020908102919091010151608082015180516113ad906001906137f5565b815181106113bd576113bd613773565b602002602001015160001c146111cb5760006111ce565b6113df816001612d69565b156113e75750565b608081015180516113fa906001906137f5565b8151811061140a5761140a613773565b602002602001015160001c600014611423576000611426565b60015b6080820151805160ff9290921691611440906001906137f5565b8151811061145057611450613773565b60200260200101818152505050565b61146a816002612d69565b156114725750565b60808101518051611485906002906137f5565b8151811061149557611495613773565b6020026020010151816080015160018360800151516114b491906137f5565b815181106114c4576114c4613773565b60200260200101511681608001516002836080015151610a7291906137f5565b6114ef816002612d69565b156114f75750565b6080810151805161150a906002906137f5565b8151811061151a5761151a613773565b60200260200101518160800151600183608001515161153991906137f5565b8151811061154957611549613773565b60200260200101511781608001516002836080015151610a7291906137f5565b611574816002612d69565b1561157c5750565b6080810151805161158f906002906137f5565b8151811061159f5761159f613773565b6020026020010151816080015160018360800151516115be91906137f5565b815181106115ce576115ce613773565b60200260200101511881608001516002836080015151610a7291906137f5565b6115f9816001612d69565b156116015750565b60808101518051611614906001906137f5565b8151811061162457611624613773565b6020026020010151198160800151600183608001515161144091906137f5565b61164f816002612d69565b156116575750565b608081015180516000919061166e906001906137f5565b8151811061167e5761167e613773565b602002602001015160001c90506000826080015160028460800151516116a491906137f5565b815181106116b4576116b4613773565b60209081029190910101516080840151805191925082841a91829190611117906002906137f5565b6116e7816002612d69565b156116ef5750565b6080810151805160009190611706906001906137f5565b8151811061171657611716613773565b602002602001015160001c9050808260800151600284608001515161173b91906137f5565b8151811061174b5761174b613773565b6020026020010151901b8260800151600284608001515161176c91906137f5565b8151811061177c5761177c613773565b60200260200101818152505061179782608001516001612d8a565b82608001819052505050565b6117ae816002612d69565b156117b65750565b60808101518051600091906117cd906001906137f5565b815181106117dd576117dd613773565b602002602001015160001c9050808260800151600284608001515161180291906137f5565b8151811061181257611812613773565b6020026020010151901c8260800151600284608001515161176c91906137f5565b61183e816002612d69565b156118465750565b608081015180516000919061185d906001906137f5565b8151811061186d5761186d613773565b602002602001015160001c905060008260800151600284608001515161189391906137f5565b815181106118a3576118a3613773565b602002602001015160001c9050600081831d9050808460800151600286608001515161111791906137f5565b6118da816002612d69565b156118e25750565b60808101518051600091906118f9906001906137f5565b8151811061190957611909613773565b602002602001015160001c905060008260800151600284608001515161192f91906137f5565b8151811061193f5761193f613773565b602002602001015160001c905060008360c00151828461195f91906137b8565b106119805760c084015161197383856137b8565b61197d91906137f5565b90505b80156119d45760a08401516119c69061199a602084613877565b156119a65760016119a9565b60005b60ff166119b7602085613835565b6119c191906137b8565b612e46565b60a085018190525160c08501525b60006119e58560a001518585612f09565b80516020820120608087015180519293509091611a04906002906137f5565b81518110611a1457611a14613773565b602002602001018181525050611a2f85608001516001612d8a565b85608001819052505050505050565b611a49816001612fbc565b15611a515750565b611a6081608001516001612fe0565b608082018190528051309190611440906001906137f5565b611a83816001612d69565b15611a8b5750565b6080810151805160009190611aa2906001906137f5565b81518110611ab257611ab2613773565b6020908102919091010151608083015180519192506001600160a01b0383163191611adf906001906137f5565b81518110611aef57611aef613773565b6020026020010181815250505050565b611b0a816001612fbc565b15611b125750565b611b2181608001516001612fe0565b608082018190528051329190611440906001906137f5565b611b44816001612fbc565b15611b4c5750565b611b5b81608001516001612fe0565b608082018190528051339190611440906001906137f5565b611b7e816001612fbc565b15611b865750565b611b9581608001516001612fe0565b6080820181905260408201518151909190611440906001906137f5565b611bbd816001612d69565b15611bc55750565b6080810151805160009190611bdc906001906137f5565b81518110611bec57611bec613773565b602002602001015160001c90506000826020015151602083611c0e91906137b8565b10611c3357826020015151602083611c2691906137b8565b611c3091906137f5565b90505b8015611c4d57611c47836020015182613089565b60208401525b611c5b836020015183613142565b60808401518051611c6e906001906137f5565b81518110611c7e57611c7e613773565b602002602001018181525050505050565b611c9a816001612fbc565b15611ca25750565b611cb181608001516001612fe0565b608082018190526020820151518151909190611440906001906137f5565b611cda816001612fbc565b15611ce25750565b611cf181608001516001612fe0565b608082018190528151518151909190611440906001906137f5565b611d17816001612fbc565b15611d1f5750565b611d2e81608001516001612fe0565b6080820181905280513a9190611440906001906137f5565b611d51816001612d69565b15611d595750565b6080810151805160009190611d70906001906137f5565b81518110611d8057611d80613773565b602090810291909101015160808301518051919250823b91829190611c6e906001906137f5565b611db2816001612d69565b15611dba5750565b6080810151805160009190611dd1906001906137f5565b81518110611de157611de1613773565b602002602001015160001c9050804082608001516001846080015151611adf91906137f5565b611e12816001612fbc565b15611e1a5750565b611e2981608001516001612fe0565b608082018190528051419190611440906001906137f5565b611e4c816001612fbc565b15611e545750565b611e6381608001516001612fe0565b608082018190528051429190611440906001906137f5565b611e86816001612fbc565b15611e8e5750565b611e9d81608001516001612fe0565b608082018190528051439190611440906001906137f5565b611ec0816001612fbc565b15611ec85750565b611ed781608001516001612fe0565b608082018190528051469190611440906001906137f5565b611efa816001612fbc565b15611f025750565b611f1181608001516001612fe0565b608082018190528051479190611440906001906137f5565b611f34816001612fbc565b15611f3c5750565b611f4b81608001516001612fe0565b608082018190528051489190611440906001906137f5565b611f6e816001612d69565b15611f765750565b610a9d81608001516001612d8a565b611f90816001612d69565b15611f985750565b6080810151805160009190611faf906001906137f5565b81518110611fbf57611fbf613773565b602002602001015160001c905060008260c00151602083611fe091906137b8565b106120025760c0830151611ff56020846137b8565b611fff91906137f5565b90505b801561202a5760a083015161201c9061199a602084613877565b60a084018190525160c08401525b611c5b8360a0015183613142565b612043816002612d69565b1561204b5750565b6080810151805160009190612062906001906137f5565b8151811061207257612072613773565b602002602001015160001c905060008260c0015160208361209391906137b8565b106120b55760c08301516120a86020846137b8565b6120b291906137f5565b90505b80156120dd5760a08301516120cf9061199a602084613877565b60a084018190525160c08401525b6121208360a0015183856080015160028760800151516120fd91906137f5565b8151811061210d5761210d613773565b602002602001015160001c60001b6131a4565b61212f83608001516002612d8a565b8360800181905250505050565b612147816002612d69565b1561214f5750565b6080810151805160009190612166906001906137f5565b8151811061217657612176613773565b602002602001015160001c905060008260c0015160018361219791906137b8565b106121b95760c08301516121ac6001846137b8565b6121b691906137f5565b90505b80156121e15760a08301516121d39061199a602084613877565b60a084018190525160c08401525b6121208360a001518360f88660800151600288608001515161220391906137f5565b8151811061221357612213613773565b6020026020010151901b613208565b61222d816001612d69565b156122355750565b60008160e001515160000361225b576080820151805160009190611adf906001906137f5565b6000805b8360e00151518110156122d8576080840151805161227f906001906137f5565b8151811061228f5761228f613773565b60200260200101518460e0015182815181106122ad576122ad613773565b6020026020010151036122c657809150600192506122d8565b806122d081613996565b91505061225f565b508115156000036122fa576080830151805160009190611c6e906001906137f5565b826101000151818151811061231157612311613773565b602002602001015183608001516001856080015151611c6e91906137f5565b61233b816002612d69565b156123435750565b608081015180516000919061235a906001906137f5565b8151811061236a5761236a613773565b6020026020010151905060008260800151600284608001515161238d91906137f5565b8151811061239d5761239d613773565b6020026020010151905060008060005b8560e00151518110156123fc57848660e0015182815181106123d1576123d1613773565b6020026020010151036123ea57809250600191506123fc565b806123f481613996565b9150506123ad565b5080151560000361248d5761241c8560e001518661010001516001613237565b61010087015260e08601819052805185919061243a906001906137f5565b8151811061244a5761244a613773565b6020908102919091010152610100850151805184919061246c906001906137f5565b8151811061247c5761247c613773565b6020026020010181815250506124b2565b8285610100015183815181106124a5576124a5613773565b6020026020010181815250505b611a2f85608001516002612d8a565b6124cc816001612d69565b156124d45750565b60808101518051600091906124eb906001906137f5565b815181106124fb576124fb613773565b602002602001015160001c90508160000151818151811061251e5761251e613773565b6020910101516001600160f81b031916605b60f81b1461253c575050565b6125476001826137f5565b60608301526080820151611797906001612d8a565b612567816002612d69565b1561256f5750565b6080810151805160009190612586906001906137f5565b8151811061259657612596613773565b602002602001015160001c90506000826080015160028460800151516125bc91906137f5565b815181106125cc576125cc613773565b602002602001015160001c9050826000015182815181106125ef576125ef613773565b6020910101516001600160f81b031916605b60f81b1461260e57505050565b80600103612120576126216001836137f5565b606084015261212f83608001516002612d8a565b612640816001612fbc565b156126485750565b61265781608001516001612fe0565b6080820181905260608201518151909190611440906001906137f5565b61267f816001612fbc565b156126875750565b61269681608001516001612fe0565b6080820181905260a0820151518151909190611440906001906137f5565b6126bf826001612fbc565b156126c8575050565b805160009081906126da9060206137f5565b905060005b602081101561273e5781811061272c576126fa816008613808565b8461270584846137f5565b8151811061271557612715613773565b01602001516001600160f81b031916901c92909217915b8061273681613996565b9150506126df565b5061274e84608001516001612fe0565b608085018190528051839190612766906001906137f5565b8151811061277657612776613773565b60200260200101818152505050505050565b612793826001612fbc565b1561279c575050565b6127a68282612d69565b156127af575050565b60808201518051600091906127c59084906137f5565b815181106127d5576127d5613773565b602002602001015190506127ee83608001516001612fe0565b608084018190528051829190611c6e906001906137f5565b6128108282612d69565b15612819575050565b60808201518051829061282e906001906137f5565b61283891906137f5565b8151811061284857612848613773565b60200260200101518260800151600184608001515161286791906137f5565b8151811061287757612877613773565b60200260200101518360800151600185608001515161289691906137f5565b815181106128a6576128a6613773565b6020026020010184608001518460018760800151516128c591906137f5565b6128cf91906137f5565b815181106128df576128df613773565b6020908102919091010191909152525050565b612906826129018360026137b8565b612d69565b1561290f575050565b306000826001600160401b0381111561292a5761292a6139af565b604051908082528060200260200182016040528015612953578160200160208202803683370190505b50905060005b838110156129c757608085015180518290612976906003906137f5565b61298091906137f5565b8151811061299057612990613773565b60200260200101518282815181106129aa576129aa613773565b6020908102919091010152806129bf81613996565b915050612959565b5060808401518051600091906129df906001906137f5565b815181106129ef576129ef613773565b602002602001015160001c9050600085608001516002876080015151612a1591906137f5565b81518110612a2557612a25613773565b602002602001015160001c90506000816001600160401b03811115612a4c57612a4c6139af565b6040519080825280601f01601f191660200182016040528015612a76576020820181803683370190505b509050612a888760a001518484612f09565b9050612a9a8761012001516001613378565b610120880152600082612aae886020613808565b612ab99060206137b8565b612ac391906137b8565b9050806001600160401b03811115612add57612add6139af565b6040519080825280601f01601f191660200182016040528015612b07576020820181803683370190505b506101208901518051612b1c906001906137f5565b81518110612b2c57612b2c613773565b6020026020010181905250858583604051602001612b4c939291906139c5565b60408051601f198184030181529190526101208901518051612b70906001906137f5565b81518110612b8057612b80613773565b6020026020010181905250612ba58860800151886002612ba091906137b8565b612d8a565b88608001819052505050505050505050565b612bc2816002612d69565b15612bca5750565b6080810151805160009190612be1906001906137f5565b81518110612bf157612bf1613773565b602002602001015160001c9050600082608001516002846080015151612c1791906137f5565b81518110612c2757612c27613773565b602002602001015160001c9050612c438360a001518383612f09565b6101408401526080830151612c59906002612d8a565b60808401525050600061016090910152565b612c76816002612d69565b15612c7e5750565b6080810151805160009190612c95906001906137f5565b81518110612ca557612ca5613773565b602002602001015160001c9050600082608001516002846080015151612ccb91906137f5565b81518110612cdb57612cdb613773565b602002602001015160001c9050612cf78360a001518383612f09565b6101408401526080830151612d0d906002612d8a565b608084015250506001610180820152600061016090910152565b612d32816001612d69565b15612d3a5750565b612d4981608001516001612d8a565b608082015260408051600080825260208201909252825261016090910152565b6000818360800151511015612d8057506001612d84565b5060005b92915050565b60606000828451612d9b91906137f5565b6001600160401b03811115612db257612db26139af565b604051908082528060200260200182016040528015612ddb578160200160208202803683370190505b50905060005b838551612dee91906137f5565b811015612e3e57848181518110612e0757612e07613773565b6020026020010151828281518110612e2157612e21613773565b602090810291909101015280612e3681613996565b915050612de1565b509392505050565b60606000612e55836020613808565b8451612e6191906137b8565b6001600160401b03811115612e7857612e786139af565b6040519080825280601f01601f191660200182016040528015612ea2576020820181803683370190505b50905060005b8451811015612e3e57848181518110612ec357612ec3613773565b602001015160f81c60f81b828281518110612ee057612ee0613773565b60200101906001600160f81b031916908160001a90535080612f0181613996565b915050612ea8565b6060816001600160401b03811115612f2357612f236139af565b6040519080825280601f01601f191660200182016040528015612f4d576020820181803683370190505b50905060005b82811015612e3e5784612f6682866137b8565b81518110612f7657612f76613773565b602001015160f81c60f81b828281518110612f9357612f93613773565b60200101906001600160f81b031916908160001a90535080612fb481613996565b915050612f53565b600061040082846080015151612fd291906137b8565b1115612d8057506001612d84565b60606000828451612ff191906137b8565b6001600160401b03811115613008576130086139af565b604051908082528060200260200182016040528015613031578160200160208202803683370190505b50905060005b8451811015612e3e5784818151811061305257613052613773565b602002602001015182828151811061306c5761306c613773565b60209081029190910101528061308181613996565b915050613037565b6060600082845161309a91906137b8565b6001600160401b038111156130b1576130b16139af565b6040519080825280601f01601f1916602001820160405280156130db576020820181803683370190505b50905060005b8451811015612e3e578481815181106130fc576130fc613773565b602001015160f81c60f81b82828151811061311957613119613773565b60200101906001600160f81b031916908160001a9053508061313a81613996565b9150506130e1565b6000805b602081101561319d5761315a816008613808565b8461316583866137b8565b8151811061317557613175613773565b01602001516001600160f81b031916901c91909117908061319581613996565b915050613146565b5092915050565b60005b6020811015613202576131bb816008613808565b82901b846131c983866137b8565b815181106131d9576131d9613773565b60200101906001600160f81b031916908160001a905350806131fa81613996565b9150506131a7565b50505050565b8083838151811061321b5761321b613773565b60200101906001600160f81b031916908160001a905350505050565b606080600083865161324991906137b8565b6001600160401b03811115613260576132606139af565b604051908082528060200260200182016040528015613289578160200160208202803683370190505b509050600084865161329b91906137b8565b6001600160401b038111156132b2576132b26139af565b6040519080825280602002602001820160405280156132db578160200160208202803683370190505b50905060005b875181101561336b578781815181106132fc576132fc613773565b602002602001015183828151811061331657613316613773565b60200260200101818152505086818151811061333457613334613773565b602002602001015182828151811061334e5761334e613773565b60209081029190910101528061336381613996565b9150506132e1565b5090969095509350505050565b6060600082845161338991906137b8565b6001600160401b038111156133a0576133a06139af565b6040519080825280602002602001820160405280156133d357816020015b60608152602001906001900390816133be5790505b50905060005b8451811015612e3e578481815181106133f4576133f4613773565b602002602001015182828151811061340e5761340e613773565b6020026020010181905250808061342490613996565b9150506133d9565b604051806101a0016040528060608152602001606081526020016000815260200160008152602001606081526020016060815260200160008152602001606081526020016060815260200160608152602001606081526020016000151581526020016000151581525090565b60008083601f8401126134aa57600080fd5b5081356001600160401b038111156134c157600080fd5b6020830191508360208285010111156134d957600080fd5b9250929050565b6000806000806000606086880312156134f857600080fd5b85356001600160401b038082111561350f57600080fd5b61351b89838a01613498565b9097509550602088013591508082111561353457600080fd5b5061354188828901613498565b96999598509660400135949350505050565b60005b8381101561356e578181015183820152602001613556565b50506000910152565b6000815180845261358f816020860160208601613553565b601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b838110156135d3578151875295820195908201906001016135b7565b509495945050505050565b600082825180855260208086019550808260051b84010181860160005b8481101561362957601f19868403018952613617838351613577565b988401989250908301906001016135fb565b5090979650505050505050565b60208152600082516101a08060208501526136556101c0850183613577565b91506020850151601f19808685030160408701526136738483613577565b9350604087015160608701526060870151608087015260808701519150808685030160a08701526136a484836135a3565b935060a08701519150808685030160c08701526136c18483613577565b935060c087015160e087015260e087015191506101008187860301818801526136ea85846135a3565b94508088015192505061012081878603018188015261370985846135a3565b94508088015192505061014081878603018188015261372885846135de565b9450808801519250506101608187860301818801526137478584613577565b945080880151925050506101806137618187018315159052565b90950151151593019290925250919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60ff8281168282160390811115612d8457612d84613789565b80820180821115612d8457612d84613789565b600080858511156137db57600080fd5b838611156137e857600080fd5b5050820193919092039150565b81810381811115612d8457612d84613789565b8082028115828204841417612d8457612d84613789565b634e487b7160e01b600052601260045260246000fd5b6000826138445761384461381f565b500490565b6000826138585761385861381f565b600160ff1b82146000198414161561387257613872613789565b500590565b6000826138865761388661381f565b500690565b60008261389a5761389a61381f565b500790565b600181815b808511156138da5781600019048211156138c0576138c0613789565b808516156138cd57918102915b93841c93908002906138a4565b509250929050565b6000826138f157506001612d84565b816138fe57506000612d84565b8160018114613914576002811461391e5761393a565b6001915050612d84565b60ff84111561392f5761392f613789565b50506001821b612d84565b5060208310610133831016604e8410600b841016171561395d575081810a612d84565b613967838361389f565b806000190482111561397b5761397b613789565b029392505050565b600061398f83836138e2565b9392505050565b6000600182016139a8576139a8613789565b5060010190565b634e487b7160e01b600052604160045260246000fd5b83815260006020808301855182870160005b828110156139f3578151845292840192908401906001016139d7565b5050508451613a058183858901613553565b01969550505050505056fea264697066735822122037b0473cae1ec5c6e4ec581fce8d34330439290f9e68288c057e74adf81ca17c64736f6c63430008110033", 109 | "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a8c5421114610030575b600080fd5b61004361003e3660046134e0565b610059565b6040516100509190613636565b60405180910390f35b61006161342c565b61006961342c565b86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080516020601f870181900481028201810190925285815290869086908190840183828082843760009201829052506020860194909452505050604082018490526060820181905260c0820181905260016101608301526101808201525b60008787836060015181811061011957610119613773565b909101356001600160f81b03191691505060008190036101455760006101608301526109a9565b6109a9565b6001600160f81b03198116600160f81b0361016357610140826109e6565b6001600160f81b03198116600160f91b036101815761014082610aa5565b6001600160f81b03198116600360f81b0361019f5761014082610b1e565b6001600160f81b03198116600160fa1b036101bd5761014082610b97565b6001600160f81b03198116600560f81b036101db5761014082610c10565b6001600160f81b03198116600360f91b036101f95761014082610c89565b6001600160f81b03198116600760f81b036102175761014082610d02565b6001600160f81b03198116600160fb1b036102355761014082610d7b565b6001600160f81b03198116600960f81b036102535761014082610ee9565b6001600160f81b03198116600560f91b036102715761014082611006565b6001600160f81b03198116600b60f81b0361028f576101408261107f565b6001600160f81b03198116600160fc1b036102ad5761014082611150565b6001600160f81b03198116601160f81b036102cb57610140826111e8565b6001600160f81b03198116600960f91b036102e95761014082611263565b6001600160f81b03198116601360f81b0361030757610140826112de565b6001600160f81b03198116600560fa1b036103255761014082611359565b6001600160f81b03198116601560f81b0361034357610140826113d4565b6001600160f81b03198116600b60f91b03610361576101408261145f565b6001600160f81b03198116601760f81b0361037f57610140826114e4565b6001600160f81b03198116600360fb1b0361039d5761014082611569565b6001600160f81b03198116601960f81b036103bb57610140826115ee565b6001600160f81b03198116600d60f91b036103d95761014082611644565b6001600160f81b03198116601b60f81b036103f757610140826116dc565b6001600160f81b03198116600760fa1b0361041557610140826117a3565b6001600160f81b03198116601d60f81b036104335761014082611833565b6001600160f81b03198116600160fd1b0361045157610140826118cf565b6001600160f81b03198116600360fc1b0361046f5761014082611a3e565b6001600160f81b03198116603160f81b0361048d5761014082611a78565b6001600160f81b03198116601960f91b036104ab5761014082611aff565b6001600160f81b03198116603360f81b036104c95761014082611b39565b6001600160f81b03198116600d60fa1b036104e75761014082611b73565b6001600160f81b03198116603560f81b036105055761014082611bb2565b6001600160f81b03198116601b60f91b036105235761014082611c8f565b6001600160f81b03198116600760fb1b036105415761014082611ccf565b6001600160f81b03198116601d60f91b0361055f5761014082611d0c565b6001600160f81b03198116603b60f81b0361057d5761014082611d46565b6001600160f81b03198116600160fe1b0361059b5761014082611da7565b6001600160f81b03198116604160f81b036105b95761014082611e07565b6001600160f81b03198116602160f91b036105d75761014082611e41565b6001600160f81b03198116604360f81b036105f55761014082611e7b565b6001600160f81b03198116602360f91b036106135761014082611eb5565b6001600160f81b03198116604760f81b036106315761014082611eef565b6001600160f81b03198116600960fb1b0361064f5761014082611f29565b6001600160f81b03198116600560fc1b0361066d5761014082611f63565b6001600160f81b03198116605160f81b0361068b5761014082611f85565b6001600160f81b03198116602960f91b036106a95761014082612038565b6001600160f81b03198116605360f81b036106c7576101408261213c565b6001600160f81b03198116601560fa1b036106e55761014082612222565b6001600160f81b03198116605560f81b036107035761014082612330565b6001600160f81b03198116602b60f91b0361072157610140826124c1565b6001600160f81b03198116605760f81b0361073f576101408261255c565b6001600160f81b03198116600b60fb1b0361075d5761014082612635565b6001600160f81b03198116605960f81b0361077b5761014082612674565b605b60f81b6001600160f81b031982161461014057600360fd1b6001600160f81b03198216108015906107bc5750607f60f81b6001600160f81b0319821611155b1561086e5760006107d2605f60f884901c61379f565b60ff169050610852838a8a866060015160016107ee91906137b8565b90858860600151600161080191906137b8565b61080b91906137b8565b92610818939291906137cb565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506126b492505050565b808360600181815161086491906137b8565b9052506109a99050565b600160ff1b6001600160f81b031982161080159061089a5750608f60f81b6001600160f81b0319821611155b156108ba57610140826108b2607f60f885901c61379f565b60ff16612788565b600960fc1b6001600160f81b03198216108015906108e65750609f60f81b6001600160f81b0319821611155b1561090657610140826108fe608f60f885901c61379f565b60ff16612806565b600560fd1b6001600160f81b03198216108015906109325750602960fa1b6001600160f81b0319821611155b15610952576101408261094a60a060f885901c61379f565b60ff166128f2565b6001600160f81b0319811660f360f81b036109705761014082612bb7565b6001600160f81b0319811660fd60f81b0361098e5761014082612c6b565b6001600160f81b031980821690036109a9576109a982612d27565b8161016001516109b957506109dc565b6001826060018181516109cc91906137b8565b9052505060608101518611610101575b9695505050505050565b6109f1816002612d69565b156109f95750565b60808101518051610a0c906002906137f5565b81518110610a1c57610a1c613773565b602090810291909101015160808201518051610a3a906001906137f5565b81518110610a4a57610a4a613773565b602002602001015160001c610a5f91906137b8565b60808201518051610a72906002906137f5565b81518110610a8257610a82613773565b602002602001018181525050610a9d81608001516001612d8a565b608090910152565b610ab0816002612d69565b15610ab85750565b60808101518051610acb906002906137f5565b81518110610adb57610adb613773565b602090810291909101015160808201518051610af9906001906137f5565b81518110610b0957610b09613773565b602002602001015160001c610a5f9190613808565b610b29816002612d69565b15610b315750565b60808101518051610b44906002906137f5565b81518110610b5457610b54613773565b602090810291909101015160808201518051610b72906001906137f5565b81518110610b8257610b82613773565b602002602001015160001c610a5f91906137f5565b610ba2816002612d69565b15610baa5750565b60808101518051610bbd906002906137f5565b81518110610bcd57610bcd613773565b602090810291909101015160808201518051610beb906001906137f5565b81518110610bfb57610bfb613773565b602002602001015160001c610a5f9190613835565b610c1b816002612d69565b15610c235750565b60808101518051610c36906002906137f5565b81518110610c4657610c46613773565b602090810291909101015160808201518051610c64906001906137f5565b81518110610c7457610c74613773565b602002602001015160001c610a5f9190613849565b610c94816002612d69565b15610c9c5750565b60808101518051610caf906002906137f5565b81518110610cbf57610cbf613773565b602090810291909101015160808201518051610cdd906001906137f5565b81518110610ced57610ced613773565b602002602001015160001c610a5f9190613877565b610d0d816002612d69565b15610d155750565b60808101518051610d28906002906137f5565b81518110610d3857610d38613773565b602090810291909101015160808201518051610d56906001906137f5565b81518110610d6657610d66613773565b602002602001015160001c610a5f919061388b565b610d86816003612d69565b15610d8e5750565b60808101518051610da1906003906137f5565b81518110610db157610db1613773565b602002602001015160001c600003610dfb576080810151805160009190610dda906003906137f5565b81518110610dea57610dea613773565b602002602001018181525050610eda565b6080810151805160009190610e12906001906137f5565b81518110610e2257610e22613773565b602002602001015160001c9050600082608001516002846080015151610e4891906137f5565b81518110610e5857610e58613773565b602002602001015160001c9050600083608001516003856080015151610e7e91906137f5565b81518110610e8e57610e8e613773565b602002602001015160001c9050600081838508608086015180519192508291610eb9906003906137f5565b81518110610ec957610ec9613773565b602002602001018181525050505050505b610a9d81608001516002612d8a565b610ef4816003612d69565b15610efc5750565b60808101518051610f0f906003906137f5565b81518110610f1f57610f1f613773565b602002602001015160001c600003610f48576080810151805160009190610dda906003906137f5565b6080810151805160009190610f5f906001906137f5565b81518110610f6f57610f6f613773565b602002602001015160001c9050600082608001516002846080015151610f9591906137f5565b81518110610fa557610fa5613773565b602002602001015160001c9050600083608001516003856080015151610fcb91906137f5565b81518110610fdb57610fdb613773565b602002602001015160001c9050600081838509608086015180519192508291610eb9906003906137f5565b611011816002612d69565b156110195750565b6080810151805161102c906002906137f5565b8151811061103c5761103c613773565b60209081029190910101516080820151805161105a906001906137f5565b8151811061106a5761106a613773565b602002602001015160001c610a5f9190613983565b61108a816002612d69565b156110925750565b60808101518051600091906110a9906001906137f5565b815181106110b9576110b9613773565b602002602001015160001c90506000826080015160028460800151516110df91906137f5565b815181106110ef576110ef613773565b60209081029190910101516080840151805191925082840b91829190611117906002906137f5565b8151811061112757611127613773565b60200260200101818152505061114284608001516001612d8a565b846080018190525050505050565b61115b816002612d69565b156111635750565b60808101518051611176906002906137f5565b8151811061118657611186613773565b6020908102919091010151608082015180516111a4906001906137f5565b815181106111b4576111b4613773565b602002602001015160001c106111cb5760006111ce565b60015b6080820151805160ff9290921691610a72906002906137f5565b6111f3816002612d69565b156111fb5750565b6080810151805161120e906002906137f5565b8151811061121e5761121e613773565b60209081029190910101516080820151805161123c906001906137f5565b8151811061124c5761124c613773565b602002602001015160001c116111cb5760006111ce565b61126e816002612d69565b156112765750565b60808101518051611289906002906137f5565b8151811061129957611299613773565b6020908102919091010151608082015180516112b7906001906137f5565b815181106112c7576112c7613773565b602002602001015160001c126111cb5760006111ce565b6112e9816002612d69565b156112f15750565b60808101518051611304906002906137f5565b8151811061131457611314613773565b602090810291909101015160808201518051611332906001906137f5565b8151811061134257611342613773565b602002602001015160001c136111cb5760006111ce565b611364816002612d69565b1561136c5750565b6080810151805161137f906002906137f5565b8151811061138f5761138f613773565b6020908102919091010151608082015180516113ad906001906137f5565b815181106113bd576113bd613773565b602002602001015160001c146111cb5760006111ce565b6113df816001612d69565b156113e75750565b608081015180516113fa906001906137f5565b8151811061140a5761140a613773565b602002602001015160001c600014611423576000611426565b60015b6080820151805160ff9290921691611440906001906137f5565b8151811061145057611450613773565b60200260200101818152505050565b61146a816002612d69565b156114725750565b60808101518051611485906002906137f5565b8151811061149557611495613773565b6020026020010151816080015160018360800151516114b491906137f5565b815181106114c4576114c4613773565b60200260200101511681608001516002836080015151610a7291906137f5565b6114ef816002612d69565b156114f75750565b6080810151805161150a906002906137f5565b8151811061151a5761151a613773565b60200260200101518160800151600183608001515161153991906137f5565b8151811061154957611549613773565b60200260200101511781608001516002836080015151610a7291906137f5565b611574816002612d69565b1561157c5750565b6080810151805161158f906002906137f5565b8151811061159f5761159f613773565b6020026020010151816080015160018360800151516115be91906137f5565b815181106115ce576115ce613773565b60200260200101511881608001516002836080015151610a7291906137f5565b6115f9816001612d69565b156116015750565b60808101518051611614906001906137f5565b8151811061162457611624613773565b6020026020010151198160800151600183608001515161144091906137f5565b61164f816002612d69565b156116575750565b608081015180516000919061166e906001906137f5565b8151811061167e5761167e613773565b602002602001015160001c90506000826080015160028460800151516116a491906137f5565b815181106116b4576116b4613773565b60209081029190910101516080840151805191925082841a91829190611117906002906137f5565b6116e7816002612d69565b156116ef5750565b6080810151805160009190611706906001906137f5565b8151811061171657611716613773565b602002602001015160001c9050808260800151600284608001515161173b91906137f5565b8151811061174b5761174b613773565b6020026020010151901b8260800151600284608001515161176c91906137f5565b8151811061177c5761177c613773565b60200260200101818152505061179782608001516001612d8a565b82608001819052505050565b6117ae816002612d69565b156117b65750565b60808101518051600091906117cd906001906137f5565b815181106117dd576117dd613773565b602002602001015160001c9050808260800151600284608001515161180291906137f5565b8151811061181257611812613773565b6020026020010151901c8260800151600284608001515161176c91906137f5565b61183e816002612d69565b156118465750565b608081015180516000919061185d906001906137f5565b8151811061186d5761186d613773565b602002602001015160001c905060008260800151600284608001515161189391906137f5565b815181106118a3576118a3613773565b602002602001015160001c9050600081831d9050808460800151600286608001515161111791906137f5565b6118da816002612d69565b156118e25750565b60808101518051600091906118f9906001906137f5565b8151811061190957611909613773565b602002602001015160001c905060008260800151600284608001515161192f91906137f5565b8151811061193f5761193f613773565b602002602001015160001c905060008360c00151828461195f91906137b8565b106119805760c084015161197383856137b8565b61197d91906137f5565b90505b80156119d45760a08401516119c69061199a602084613877565b156119a65760016119a9565b60005b60ff166119b7602085613835565b6119c191906137b8565b612e46565b60a085018190525160c08501525b60006119e58560a001518585612f09565b80516020820120608087015180519293509091611a04906002906137f5565b81518110611a1457611a14613773565b602002602001018181525050611a2f85608001516001612d8a565b85608001819052505050505050565b611a49816001612fbc565b15611a515750565b611a6081608001516001612fe0565b608082018190528051309190611440906001906137f5565b611a83816001612d69565b15611a8b5750565b6080810151805160009190611aa2906001906137f5565b81518110611ab257611ab2613773565b6020908102919091010151608083015180519192506001600160a01b0383163191611adf906001906137f5565b81518110611aef57611aef613773565b6020026020010181815250505050565b611b0a816001612fbc565b15611b125750565b611b2181608001516001612fe0565b608082018190528051329190611440906001906137f5565b611b44816001612fbc565b15611b4c5750565b611b5b81608001516001612fe0565b608082018190528051339190611440906001906137f5565b611b7e816001612fbc565b15611b865750565b611b9581608001516001612fe0565b6080820181905260408201518151909190611440906001906137f5565b611bbd816001612d69565b15611bc55750565b6080810151805160009190611bdc906001906137f5565b81518110611bec57611bec613773565b602002602001015160001c90506000826020015151602083611c0e91906137b8565b10611c3357826020015151602083611c2691906137b8565b611c3091906137f5565b90505b8015611c4d57611c47836020015182613089565b60208401525b611c5b836020015183613142565b60808401518051611c6e906001906137f5565b81518110611c7e57611c7e613773565b602002602001018181525050505050565b611c9a816001612fbc565b15611ca25750565b611cb181608001516001612fe0565b608082018190526020820151518151909190611440906001906137f5565b611cda816001612fbc565b15611ce25750565b611cf181608001516001612fe0565b608082018190528151518151909190611440906001906137f5565b611d17816001612fbc565b15611d1f5750565b611d2e81608001516001612fe0565b6080820181905280513a9190611440906001906137f5565b611d51816001612d69565b15611d595750565b6080810151805160009190611d70906001906137f5565b81518110611d8057611d80613773565b602090810291909101015160808301518051919250823b91829190611c6e906001906137f5565b611db2816001612d69565b15611dba5750565b6080810151805160009190611dd1906001906137f5565b81518110611de157611de1613773565b602002602001015160001c9050804082608001516001846080015151611adf91906137f5565b611e12816001612fbc565b15611e1a5750565b611e2981608001516001612fe0565b608082018190528051419190611440906001906137f5565b611e4c816001612fbc565b15611e545750565b611e6381608001516001612fe0565b608082018190528051429190611440906001906137f5565b611e86816001612fbc565b15611e8e5750565b611e9d81608001516001612fe0565b608082018190528051439190611440906001906137f5565b611ec0816001612fbc565b15611ec85750565b611ed781608001516001612fe0565b608082018190528051469190611440906001906137f5565b611efa816001612fbc565b15611f025750565b611f1181608001516001612fe0565b608082018190528051479190611440906001906137f5565b611f34816001612fbc565b15611f3c5750565b611f4b81608001516001612fe0565b608082018190528051489190611440906001906137f5565b611f6e816001612d69565b15611f765750565b610a9d81608001516001612d8a565b611f90816001612d69565b15611f985750565b6080810151805160009190611faf906001906137f5565b81518110611fbf57611fbf613773565b602002602001015160001c905060008260c00151602083611fe091906137b8565b106120025760c0830151611ff56020846137b8565b611fff91906137f5565b90505b801561202a5760a083015161201c9061199a602084613877565b60a084018190525160c08401525b611c5b8360a0015183613142565b612043816002612d69565b1561204b5750565b6080810151805160009190612062906001906137f5565b8151811061207257612072613773565b602002602001015160001c905060008260c0015160208361209391906137b8565b106120b55760c08301516120a86020846137b8565b6120b291906137f5565b90505b80156120dd5760a08301516120cf9061199a602084613877565b60a084018190525160c08401525b6121208360a0015183856080015160028760800151516120fd91906137f5565b8151811061210d5761210d613773565b602002602001015160001c60001b6131a4565b61212f83608001516002612d8a565b8360800181905250505050565b612147816002612d69565b1561214f5750565b6080810151805160009190612166906001906137f5565b8151811061217657612176613773565b602002602001015160001c905060008260c0015160018361219791906137b8565b106121b95760c08301516121ac6001846137b8565b6121b691906137f5565b90505b80156121e15760a08301516121d39061199a602084613877565b60a084018190525160c08401525b6121208360a001518360f88660800151600288608001515161220391906137f5565b8151811061221357612213613773565b6020026020010151901b613208565b61222d816001612d69565b156122355750565b60008160e001515160000361225b576080820151805160009190611adf906001906137f5565b6000805b8360e00151518110156122d8576080840151805161227f906001906137f5565b8151811061228f5761228f613773565b60200260200101518460e0015182815181106122ad576122ad613773565b6020026020010151036122c657809150600192506122d8565b806122d081613996565b91505061225f565b508115156000036122fa576080830151805160009190611c6e906001906137f5565b826101000151818151811061231157612311613773565b602002602001015183608001516001856080015151611c6e91906137f5565b61233b816002612d69565b156123435750565b608081015180516000919061235a906001906137f5565b8151811061236a5761236a613773565b6020026020010151905060008260800151600284608001515161238d91906137f5565b8151811061239d5761239d613773565b6020026020010151905060008060005b8560e00151518110156123fc57848660e0015182815181106123d1576123d1613773565b6020026020010151036123ea57809250600191506123fc565b806123f481613996565b9150506123ad565b5080151560000361248d5761241c8560e001518661010001516001613237565b61010087015260e08601819052805185919061243a906001906137f5565b8151811061244a5761244a613773565b6020908102919091010152610100850151805184919061246c906001906137f5565b8151811061247c5761247c613773565b6020026020010181815250506124b2565b8285610100015183815181106124a5576124a5613773565b6020026020010181815250505b611a2f85608001516002612d8a565b6124cc816001612d69565b156124d45750565b60808101518051600091906124eb906001906137f5565b815181106124fb576124fb613773565b602002602001015160001c90508160000151818151811061251e5761251e613773565b6020910101516001600160f81b031916605b60f81b1461253c575050565b6125476001826137f5565b60608301526080820151611797906001612d8a565b612567816002612d69565b1561256f5750565b6080810151805160009190612586906001906137f5565b8151811061259657612596613773565b602002602001015160001c90506000826080015160028460800151516125bc91906137f5565b815181106125cc576125cc613773565b602002602001015160001c9050826000015182815181106125ef576125ef613773565b6020910101516001600160f81b031916605b60f81b1461260e57505050565b80600103612120576126216001836137f5565b606084015261212f83608001516002612d8a565b612640816001612fbc565b156126485750565b61265781608001516001612fe0565b6080820181905260608201518151909190611440906001906137f5565b61267f816001612fbc565b156126875750565b61269681608001516001612fe0565b6080820181905260a0820151518151909190611440906001906137f5565b6126bf826001612fbc565b156126c8575050565b805160009081906126da9060206137f5565b905060005b602081101561273e5781811061272c576126fa816008613808565b8461270584846137f5565b8151811061271557612715613773565b01602001516001600160f81b031916901c92909217915b8061273681613996565b9150506126df565b5061274e84608001516001612fe0565b608085018190528051839190612766906001906137f5565b8151811061277657612776613773565b60200260200101818152505050505050565b612793826001612fbc565b1561279c575050565b6127a68282612d69565b156127af575050565b60808201518051600091906127c59084906137f5565b815181106127d5576127d5613773565b602002602001015190506127ee83608001516001612fe0565b608084018190528051829190611c6e906001906137f5565b6128108282612d69565b15612819575050565b60808201518051829061282e906001906137f5565b61283891906137f5565b8151811061284857612848613773565b60200260200101518260800151600184608001515161286791906137f5565b8151811061287757612877613773565b60200260200101518360800151600185608001515161289691906137f5565b815181106128a6576128a6613773565b6020026020010184608001518460018760800151516128c591906137f5565b6128cf91906137f5565b815181106128df576128df613773565b6020908102919091010191909152525050565b612906826129018360026137b8565b612d69565b1561290f575050565b306000826001600160401b0381111561292a5761292a6139af565b604051908082528060200260200182016040528015612953578160200160208202803683370190505b50905060005b838110156129c757608085015180518290612976906003906137f5565b61298091906137f5565b8151811061299057612990613773565b60200260200101518282815181106129aa576129aa613773565b6020908102919091010152806129bf81613996565b915050612959565b5060808401518051600091906129df906001906137f5565b815181106129ef576129ef613773565b602002602001015160001c9050600085608001516002876080015151612a1591906137f5565b81518110612a2557612a25613773565b602002602001015160001c90506000816001600160401b03811115612a4c57612a4c6139af565b6040519080825280601f01601f191660200182016040528015612a76576020820181803683370190505b509050612a888760a001518484612f09565b9050612a9a8761012001516001613378565b610120880152600082612aae886020613808565b612ab99060206137b8565b612ac391906137b8565b9050806001600160401b03811115612add57612add6139af565b6040519080825280601f01601f191660200182016040528015612b07576020820181803683370190505b506101208901518051612b1c906001906137f5565b81518110612b2c57612b2c613773565b6020026020010181905250858583604051602001612b4c939291906139c5565b60408051601f198184030181529190526101208901518051612b70906001906137f5565b81518110612b8057612b80613773565b6020026020010181905250612ba58860800151886002612ba091906137b8565b612d8a565b88608001819052505050505050505050565b612bc2816002612d69565b15612bca5750565b6080810151805160009190612be1906001906137f5565b81518110612bf157612bf1613773565b602002602001015160001c9050600082608001516002846080015151612c1791906137f5565b81518110612c2757612c27613773565b602002602001015160001c9050612c438360a001518383612f09565b6101408401526080830151612c59906002612d8a565b60808401525050600061016090910152565b612c76816002612d69565b15612c7e5750565b6080810151805160009190612c95906001906137f5565b81518110612ca557612ca5613773565b602002602001015160001c9050600082608001516002846080015151612ccb91906137f5565b81518110612cdb57612cdb613773565b602002602001015160001c9050612cf78360a001518383612f09565b6101408401526080830151612d0d906002612d8a565b608084015250506001610180820152600061016090910152565b612d32816001612d69565b15612d3a5750565b612d4981608001516001612d8a565b608082015260408051600080825260208201909252825261016090910152565b6000818360800151511015612d8057506001612d84565b5060005b92915050565b60606000828451612d9b91906137f5565b6001600160401b03811115612db257612db26139af565b604051908082528060200260200182016040528015612ddb578160200160208202803683370190505b50905060005b838551612dee91906137f5565b811015612e3e57848181518110612e0757612e07613773565b6020026020010151828281518110612e2157612e21613773565b602090810291909101015280612e3681613996565b915050612de1565b509392505050565b60606000612e55836020613808565b8451612e6191906137b8565b6001600160401b03811115612e7857612e786139af565b6040519080825280601f01601f191660200182016040528015612ea2576020820181803683370190505b50905060005b8451811015612e3e57848181518110612ec357612ec3613773565b602001015160f81c60f81b828281518110612ee057612ee0613773565b60200101906001600160f81b031916908160001a90535080612f0181613996565b915050612ea8565b6060816001600160401b03811115612f2357612f236139af565b6040519080825280601f01601f191660200182016040528015612f4d576020820181803683370190505b50905060005b82811015612e3e5784612f6682866137b8565b81518110612f7657612f76613773565b602001015160f81c60f81b828281518110612f9357612f93613773565b60200101906001600160f81b031916908160001a90535080612fb481613996565b915050612f53565b600061040082846080015151612fd291906137b8565b1115612d8057506001612d84565b60606000828451612ff191906137b8565b6001600160401b03811115613008576130086139af565b604051908082528060200260200182016040528015613031578160200160208202803683370190505b50905060005b8451811015612e3e5784818151811061305257613052613773565b602002602001015182828151811061306c5761306c613773565b60209081029190910101528061308181613996565b915050613037565b6060600082845161309a91906137b8565b6001600160401b038111156130b1576130b16139af565b6040519080825280601f01601f1916602001820160405280156130db576020820181803683370190505b50905060005b8451811015612e3e578481815181106130fc576130fc613773565b602001015160f81c60f81b82828151811061311957613119613773565b60200101906001600160f81b031916908160001a9053508061313a81613996565b9150506130e1565b6000805b602081101561319d5761315a816008613808565b8461316583866137b8565b8151811061317557613175613773565b01602001516001600160f81b031916901c91909117908061319581613996565b915050613146565b5092915050565b60005b6020811015613202576131bb816008613808565b82901b846131c983866137b8565b815181106131d9576131d9613773565b60200101906001600160f81b031916908160001a905350806131fa81613996565b9150506131a7565b50505050565b8083838151811061321b5761321b613773565b60200101906001600160f81b031916908160001a905350505050565b606080600083865161324991906137b8565b6001600160401b03811115613260576132606139af565b604051908082528060200260200182016040528015613289578160200160208202803683370190505b509050600084865161329b91906137b8565b6001600160401b038111156132b2576132b26139af565b6040519080825280602002602001820160405280156132db578160200160208202803683370190505b50905060005b875181101561336b578781815181106132fc576132fc613773565b602002602001015183828151811061331657613316613773565b60200260200101818152505086818151811061333457613334613773565b602002602001015182828151811061334e5761334e613773565b60209081029190910101528061336381613996565b9150506132e1565b5090969095509350505050565b6060600082845161338991906137b8565b6001600160401b038111156133a0576133a06139af565b6040519080825280602002602001820160405280156133d357816020015b60608152602001906001900390816133be5790505b50905060005b8451811015612e3e578481815181106133f4576133f4613773565b602002602001015182828151811061340e5761340e613773565b6020026020010181905250808061342490613996565b9150506133d9565b604051806101a0016040528060608152602001606081526020016000815260200160008152602001606081526020016060815260200160008152602001606081526020016060815260200160608152602001606081526020016000151581526020016000151581525090565b60008083601f8401126134aa57600080fd5b5081356001600160401b038111156134c157600080fd5b6020830191508360208285010111156134d957600080fd5b9250929050565b6000806000806000606086880312156134f857600080fd5b85356001600160401b038082111561350f57600080fd5b61351b89838a01613498565b9097509550602088013591508082111561353457600080fd5b5061354188828901613498565b96999598509660400135949350505050565b60005b8381101561356e578181015183820152602001613556565b50506000910152565b6000815180845261358f816020860160208601613553565b601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b838110156135d3578151875295820195908201906001016135b7565b509495945050505050565b600082825180855260208086019550808260051b84010181860160005b8481101561362957601f19868403018952613617838351613577565b988401989250908301906001016135fb565b5090979650505050505050565b60208152600082516101a08060208501526136556101c0850183613577565b91506020850151601f19808685030160408701526136738483613577565b9350604087015160608701526060870151608087015260808701519150808685030160a08701526136a484836135a3565b935060a08701519150808685030160c08701526136c18483613577565b935060c087015160e087015260e087015191506101008187860301818801526136ea85846135a3565b94508088015192505061012081878603018188015261370985846135a3565b94508088015192505061014081878603018188015261372885846135de565b9450808801519250506101608187860301818801526137478584613577565b945080880151925050506101806137618187018315159052565b90950151151593019290925250919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60ff8281168282160390811115612d8457612d84613789565b80820180821115612d8457612d84613789565b600080858511156137db57600080fd5b838611156137e857600080fd5b5050820193919092039150565b81810381811115612d8457612d84613789565b8082028115828204841417612d8457612d84613789565b634e487b7160e01b600052601260045260246000fd5b6000826138445761384461381f565b500490565b6000826138585761385861381f565b600160ff1b82146000198414161561387257613872613789565b500590565b6000826138865761388661381f565b500690565b60008261389a5761389a61381f565b500790565b600181815b808511156138da5781600019048211156138c0576138c0613789565b808516156138cd57918102915b93841c93908002906138a4565b509250929050565b6000826138f157506001612d84565b816138fe57506000612d84565b8160018114613914576002811461391e5761393a565b6001915050612d84565b60ff84111561392f5761392f613789565b50506001821b612d84565b5060208310610133831016604e8410600b841016171561395d575081810a612d84565b613967838361389f565b806000190482111561397b5761397b613789565b029392505050565b600061398f83836138e2565b9392505050565b6000600182016139a8576139a8613789565b5060010190565b634e487b7160e01b600052604160045260246000fd5b83815260006020808301855182870160005b828110156139f3578151845292840192908401906001016139d7565b5050508451613a058183858901613553565b01969550505050505056fea264697066735822122037b0473cae1ec5c6e4ec581fce8d34330439290f9e68288c057e74adf81ca17c64736f6c63430008110033", 110 | "linkReferences": {}, 111 | "deployedLinkReferences": {} 112 | } 113 | -------------------------------------------------------------------------------- /frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 |
131 | pc:{" "}
132 | {pc_string}
133 |
134 | value (wei):{" "}
135 | {value_string}
136 |
{output_array}
149 |