├── public ├── robots.txt ├── favicon.ico ├── logo192.png ├── logo512.png ├── manifest.json └── index.html ├── squirrels.gif ├── .gitignore ├── src ├── App.css ├── index.css ├── reportWebVitals.js ├── index.js ├── App.js └── contracts │ └── NFTCollectible.json ├── README.md └── package.json /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /squirrels.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rounakbanik/nft-collectible-frontend/HEAD/squirrels.gif -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rounakbanik/nft-collectible-frontend/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rounakbanik/nft-collectible-frontend/HEAD/public/logo192.png -------------------------------------------------------------------------------- /public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rounakbanik/nft-collectible-frontend/HEAD/public/logo512.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /src/App.css: -------------------------------------------------------------------------------- 1 | .main-app { 2 | text-align: center; 3 | margin: 100px; 4 | } 5 | 6 | .cta-button { 7 | padding: 15px; 8 | border: none; 9 | border-radius: 12px; 10 | min-width: 250px; 11 | color: white; 12 | font-size: 18px; 13 | cursor: pointer; 14 | } 15 | 16 | .connect-wallet-button { 17 | background: rgb(32, 129, 226); 18 | } 19 | 20 | .mint-nft-button { 21 | background: orange; 22 | } -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | } 9 | 10 | code { 11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 12 | monospace; 13 | } 14 | -------------------------------------------------------------------------------- /src/reportWebVitals.js: -------------------------------------------------------------------------------- 1 | const reportWebVitals = onPerfEntry => { 2 | if (onPerfEntry && onPerfEntry instanceof Function) { 3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { 4 | getCLS(onPerfEntry); 5 | getFID(onPerfEntry); 6 | getFCP(onPerfEntry); 7 | getLCP(onPerfEntry); 8 | getTTFB(onPerfEntry); 9 | }); 10 | } 11 | }; 12 | 13 | export default reportWebVitals; 14 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.css'; 4 | import App from './App'; 5 | import reportWebVitals from './reportWebVitals'; 6 | 7 | ReactDOM.render( 8 | 9 | 10 | , 11 | document.getElementById('root') 12 | ); 13 | 14 | // If you want to start measuring performance in your app, pass a function 15 | // to log results (for example: reportWebVitals(console.log)) 16 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals 17 | reportWebVitals(); 18 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NFT Collectible Smart Contract 2 | 3 | This is a companion code repository to Scrappy Squirrels' [Medium article](https://medium.com/scrappy-squirrels/tutorial-building-a-web3-frontend-with-react-e0a87ea3bad) on building a web3 frontend with React. 4 | 5 | ## About Scrappy Squirrels 6 | 7 | 8 | 9 | This library was created as part of the Scrappy Squirrels Project. 10 | 11 | Scrappy Squirrels is a collection of 10,000 randomly generated NFTs on the Ethereum Blockchain. Scrappy Squirrels are meant for buyers, creators, and developers who are completely new to the NFT ecosystem. 12 | 13 | The community is built around learning about the NFT revolution, exploring its current use cases, discovering new applications, and finding members to collaborate on exciting projects with. 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nft-collectible-frontend", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@testing-library/jest-dom": "^5.11.4", 7 | "@testing-library/react": "^11.1.0", 8 | "@testing-library/user-event": "^12.1.10", 9 | "ethers": "^5.5.1", 10 | "react": "^17.0.2", 11 | "react-dom": "^17.0.2", 12 | "react-scripts": "4.0.3", 13 | "web-vitals": "^1.0.1" 14 | }, 15 | "scripts": { 16 | "start": "react-scripts start", 17 | "build": "react-scripts build", 18 | "test": "react-scripts test", 19 | "eject": "react-scripts eject" 20 | }, 21 | "eslintConfig": { 22 | "extends": [ 23 | "react-app", 24 | "react-app/jest" 25 | ] 26 | }, 27 | "browserslist": { 28 | "production": [ 29 | ">0.2%", 30 | "not dead", 31 | "not op_mini all" 32 | ], 33 | "development": [ 34 | "last 1 chrome version", 35 | "last 1 firefox version", 36 | "last 1 safari version" 37 | ] 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | Scrappy Squirrels Tutorial 28 | 29 | 30 | 31 |
32 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react'; 2 | import './App.css'; 3 | import contract from './contracts/NFTCollectible.json'; 4 | import { ethers } from 'ethers'; 5 | 6 | const contractAddress = "0x355638a4eCcb777794257f22f50c289d4189F245"; 7 | const abi = contract.abi; 8 | 9 | function App() { 10 | 11 | const [currentAccount, setCurrentAccount] = useState(null); 12 | 13 | const checkWalletIsConnected = async () => { 14 | const { ethereum } = window; 15 | 16 | if (!ethereum) { 17 | console.log("Make sure you have Metamask installed!"); 18 | return; 19 | } else { 20 | console.log("Wallet exists! We're ready to go!") 21 | } 22 | 23 | const accounts = await ethereum.request({ method: 'eth_accounts' }); 24 | 25 | if (accounts.length !== 0) { 26 | const account = accounts[0]; 27 | console.log("Found an authorized account: ", account); 28 | setCurrentAccount(account); 29 | } else { 30 | console.log("No authorized account found"); 31 | } 32 | } 33 | 34 | const connectWalletHandler = async () => { 35 | const { ethereum } = window; 36 | 37 | if (!ethereum) { 38 | alert("Please install Metamask!"); 39 | } 40 | 41 | try { 42 | const accounts = await ethereum.request({ method: 'eth_requestAccounts' }); 43 | console.log("Found an account! Address: ", accounts[0]); 44 | setCurrentAccount(accounts[0]); 45 | } catch (err) { 46 | console.log(err) 47 | } 48 | } 49 | 50 | const mintNftHandler = async () => { 51 | try { 52 | const { ethereum } = window; 53 | 54 | if (ethereum) { 55 | const provider = new ethers.providers.Web3Provider(ethereum); 56 | const signer = provider.getSigner(); 57 | const nftContract = new ethers.Contract(contractAddress, abi, signer); 58 | 59 | console.log("Initialize payment"); 60 | let nftTxn = await nftContract.mintNFTs(1, { value: ethers.utils.parseEther("0.01") }); 61 | 62 | console.log("Mining... please wait"); 63 | await nftTxn.wait(); 64 | 65 | console.log(`Mined, see transaction: https://rinkeby.etherscan.io/tx/${nftTxn.hash}`); 66 | 67 | } else { 68 | console.log("Ethereum object does not exist"); 69 | } 70 | 71 | } catch (err) { 72 | console.log(err); 73 | } 74 | } 75 | 76 | const connectWalletButton = () => { 77 | return ( 78 | 81 | ) 82 | } 83 | 84 | const mintNftButton = () => { 85 | return ( 86 | 89 | ) 90 | } 91 | 92 | useEffect(() => { 93 | checkWalletIsConnected(); 94 | }, []) 95 | 96 | return ( 97 |
98 |

Scrappy Squirrels Tutorial

99 |
100 | {currentAccount ? mintNftButton() : connectWalletButton()} 101 |
102 |
103 | ) 104 | } 105 | 106 | export default App; 107 | -------------------------------------------------------------------------------- /src/contracts/NFTCollectible.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "NFTCollectible", 4 | "sourceName": "contracts/NFTCollectible.sol", 5 | "abi": [ 6 | { 7 | "inputs": [ 8 | { 9 | "internalType": "string", 10 | "name": "baseURI", 11 | "type": "string" 12 | } 13 | ], 14 | "stateMutability": "nonpayable", 15 | "type": "constructor" 16 | }, 17 | { 18 | "anonymous": false, 19 | "inputs": [ 20 | { 21 | "indexed": true, 22 | "internalType": "address", 23 | "name": "owner", 24 | "type": "address" 25 | }, 26 | { 27 | "indexed": true, 28 | "internalType": "address", 29 | "name": "approved", 30 | "type": "address" 31 | }, 32 | { 33 | "indexed": true, 34 | "internalType": "uint256", 35 | "name": "tokenId", 36 | "type": "uint256" 37 | } 38 | ], 39 | "name": "Approval", 40 | "type": "event" 41 | }, 42 | { 43 | "anonymous": false, 44 | "inputs": [ 45 | { 46 | "indexed": true, 47 | "internalType": "address", 48 | "name": "owner", 49 | "type": "address" 50 | }, 51 | { 52 | "indexed": true, 53 | "internalType": "address", 54 | "name": "operator", 55 | "type": "address" 56 | }, 57 | { 58 | "indexed": false, 59 | "internalType": "bool", 60 | "name": "approved", 61 | "type": "bool" 62 | } 63 | ], 64 | "name": "ApprovalForAll", 65 | "type": "event" 66 | }, 67 | { 68 | "anonymous": false, 69 | "inputs": [ 70 | { 71 | "indexed": true, 72 | "internalType": "address", 73 | "name": "previousOwner", 74 | "type": "address" 75 | }, 76 | { 77 | "indexed": true, 78 | "internalType": "address", 79 | "name": "newOwner", 80 | "type": "address" 81 | } 82 | ], 83 | "name": "OwnershipTransferred", 84 | "type": "event" 85 | }, 86 | { 87 | "anonymous": false, 88 | "inputs": [ 89 | { 90 | "indexed": true, 91 | "internalType": "address", 92 | "name": "from", 93 | "type": "address" 94 | }, 95 | { 96 | "indexed": true, 97 | "internalType": "address", 98 | "name": "to", 99 | "type": "address" 100 | }, 101 | { 102 | "indexed": true, 103 | "internalType": "uint256", 104 | "name": "tokenId", 105 | "type": "uint256" 106 | } 107 | ], 108 | "name": "Transfer", 109 | "type": "event" 110 | }, 111 | { 112 | "inputs": [], 113 | "name": "MAX_PER_MINT", 114 | "outputs": [ 115 | { 116 | "internalType": "uint256", 117 | "name": "", 118 | "type": "uint256" 119 | } 120 | ], 121 | "stateMutability": "view", 122 | "type": "function" 123 | }, 124 | { 125 | "inputs": [], 126 | "name": "MAX_SUPPLY", 127 | "outputs": [ 128 | { 129 | "internalType": "uint256", 130 | "name": "", 131 | "type": "uint256" 132 | } 133 | ], 134 | "stateMutability": "view", 135 | "type": "function" 136 | }, 137 | { 138 | "inputs": [], 139 | "name": "PRICE", 140 | "outputs": [ 141 | { 142 | "internalType": "uint256", 143 | "name": "", 144 | "type": "uint256" 145 | } 146 | ], 147 | "stateMutability": "view", 148 | "type": "function" 149 | }, 150 | { 151 | "inputs": [ 152 | { 153 | "internalType": "address", 154 | "name": "to", 155 | "type": "address" 156 | }, 157 | { 158 | "internalType": "uint256", 159 | "name": "tokenId", 160 | "type": "uint256" 161 | } 162 | ], 163 | "name": "approve", 164 | "outputs": [], 165 | "stateMutability": "nonpayable", 166 | "type": "function" 167 | }, 168 | { 169 | "inputs": [ 170 | { 171 | "internalType": "address", 172 | "name": "owner", 173 | "type": "address" 174 | } 175 | ], 176 | "name": "balanceOf", 177 | "outputs": [ 178 | { 179 | "internalType": "uint256", 180 | "name": "", 181 | "type": "uint256" 182 | } 183 | ], 184 | "stateMutability": "view", 185 | "type": "function" 186 | }, 187 | { 188 | "inputs": [], 189 | "name": "baseTokenURI", 190 | "outputs": [ 191 | { 192 | "internalType": "string", 193 | "name": "", 194 | "type": "string" 195 | } 196 | ], 197 | "stateMutability": "view", 198 | "type": "function" 199 | }, 200 | { 201 | "inputs": [ 202 | { 203 | "internalType": "uint256", 204 | "name": "tokenId", 205 | "type": "uint256" 206 | } 207 | ], 208 | "name": "getApproved", 209 | "outputs": [ 210 | { 211 | "internalType": "address", 212 | "name": "", 213 | "type": "address" 214 | } 215 | ], 216 | "stateMutability": "view", 217 | "type": "function" 218 | }, 219 | { 220 | "inputs": [ 221 | { 222 | "internalType": "address", 223 | "name": "owner", 224 | "type": "address" 225 | }, 226 | { 227 | "internalType": "address", 228 | "name": "operator", 229 | "type": "address" 230 | } 231 | ], 232 | "name": "isApprovedForAll", 233 | "outputs": [ 234 | { 235 | "internalType": "bool", 236 | "name": "", 237 | "type": "bool" 238 | } 239 | ], 240 | "stateMutability": "view", 241 | "type": "function" 242 | }, 243 | { 244 | "inputs": [ 245 | { 246 | "internalType": "uint256", 247 | "name": "_count", 248 | "type": "uint256" 249 | } 250 | ], 251 | "name": "mintNFTs", 252 | "outputs": [], 253 | "stateMutability": "payable", 254 | "type": "function" 255 | }, 256 | { 257 | "inputs": [], 258 | "name": "name", 259 | "outputs": [ 260 | { 261 | "internalType": "string", 262 | "name": "", 263 | "type": "string" 264 | } 265 | ], 266 | "stateMutability": "view", 267 | "type": "function" 268 | }, 269 | { 270 | "inputs": [], 271 | "name": "owner", 272 | "outputs": [ 273 | { 274 | "internalType": "address", 275 | "name": "", 276 | "type": "address" 277 | } 278 | ], 279 | "stateMutability": "view", 280 | "type": "function" 281 | }, 282 | { 283 | "inputs": [ 284 | { 285 | "internalType": "uint256", 286 | "name": "tokenId", 287 | "type": "uint256" 288 | } 289 | ], 290 | "name": "ownerOf", 291 | "outputs": [ 292 | { 293 | "internalType": "address", 294 | "name": "", 295 | "type": "address" 296 | } 297 | ], 298 | "stateMutability": "view", 299 | "type": "function" 300 | }, 301 | { 302 | "inputs": [], 303 | "name": "renounceOwnership", 304 | "outputs": [], 305 | "stateMutability": "nonpayable", 306 | "type": "function" 307 | }, 308 | { 309 | "inputs": [], 310 | "name": "reserveNFTs", 311 | "outputs": [], 312 | "stateMutability": "nonpayable", 313 | "type": "function" 314 | }, 315 | { 316 | "inputs": [ 317 | { 318 | "internalType": "address", 319 | "name": "from", 320 | "type": "address" 321 | }, 322 | { 323 | "internalType": "address", 324 | "name": "to", 325 | "type": "address" 326 | }, 327 | { 328 | "internalType": "uint256", 329 | "name": "tokenId", 330 | "type": "uint256" 331 | } 332 | ], 333 | "name": "safeTransferFrom", 334 | "outputs": [], 335 | "stateMutability": "nonpayable", 336 | "type": "function" 337 | }, 338 | { 339 | "inputs": [ 340 | { 341 | "internalType": "address", 342 | "name": "from", 343 | "type": "address" 344 | }, 345 | { 346 | "internalType": "address", 347 | "name": "to", 348 | "type": "address" 349 | }, 350 | { 351 | "internalType": "uint256", 352 | "name": "tokenId", 353 | "type": "uint256" 354 | }, 355 | { 356 | "internalType": "bytes", 357 | "name": "_data", 358 | "type": "bytes" 359 | } 360 | ], 361 | "name": "safeTransferFrom", 362 | "outputs": [], 363 | "stateMutability": "nonpayable", 364 | "type": "function" 365 | }, 366 | { 367 | "inputs": [ 368 | { 369 | "internalType": "address", 370 | "name": "operator", 371 | "type": "address" 372 | }, 373 | { 374 | "internalType": "bool", 375 | "name": "approved", 376 | "type": "bool" 377 | } 378 | ], 379 | "name": "setApprovalForAll", 380 | "outputs": [], 381 | "stateMutability": "nonpayable", 382 | "type": "function" 383 | }, 384 | { 385 | "inputs": [ 386 | { 387 | "internalType": "string", 388 | "name": "_baseTokenURI", 389 | "type": "string" 390 | } 391 | ], 392 | "name": "setBaseURI", 393 | "outputs": [], 394 | "stateMutability": "nonpayable", 395 | "type": "function" 396 | }, 397 | { 398 | "inputs": [ 399 | { 400 | "internalType": "bytes4", 401 | "name": "interfaceId", 402 | "type": "bytes4" 403 | } 404 | ], 405 | "name": "supportsInterface", 406 | "outputs": [ 407 | { 408 | "internalType": "bool", 409 | "name": "", 410 | "type": "bool" 411 | } 412 | ], 413 | "stateMutability": "view", 414 | "type": "function" 415 | }, 416 | { 417 | "inputs": [], 418 | "name": "symbol", 419 | "outputs": [ 420 | { 421 | "internalType": "string", 422 | "name": "", 423 | "type": "string" 424 | } 425 | ], 426 | "stateMutability": "view", 427 | "type": "function" 428 | }, 429 | { 430 | "inputs": [ 431 | { 432 | "internalType": "uint256", 433 | "name": "index", 434 | "type": "uint256" 435 | } 436 | ], 437 | "name": "tokenByIndex", 438 | "outputs": [ 439 | { 440 | "internalType": "uint256", 441 | "name": "", 442 | "type": "uint256" 443 | } 444 | ], 445 | "stateMutability": "view", 446 | "type": "function" 447 | }, 448 | { 449 | "inputs": [ 450 | { 451 | "internalType": "address", 452 | "name": "owner", 453 | "type": "address" 454 | }, 455 | { 456 | "internalType": "uint256", 457 | "name": "index", 458 | "type": "uint256" 459 | } 460 | ], 461 | "name": "tokenOfOwnerByIndex", 462 | "outputs": [ 463 | { 464 | "internalType": "uint256", 465 | "name": "", 466 | "type": "uint256" 467 | } 468 | ], 469 | "stateMutability": "view", 470 | "type": "function" 471 | }, 472 | { 473 | "inputs": [ 474 | { 475 | "internalType": "uint256", 476 | "name": "tokenId", 477 | "type": "uint256" 478 | } 479 | ], 480 | "name": "tokenURI", 481 | "outputs": [ 482 | { 483 | "internalType": "string", 484 | "name": "", 485 | "type": "string" 486 | } 487 | ], 488 | "stateMutability": "view", 489 | "type": "function" 490 | }, 491 | { 492 | "inputs": [ 493 | { 494 | "internalType": "address", 495 | "name": "_owner", 496 | "type": "address" 497 | } 498 | ], 499 | "name": "tokensOfOwner", 500 | "outputs": [ 501 | { 502 | "internalType": "uint256[]", 503 | "name": "", 504 | "type": "uint256[]" 505 | } 506 | ], 507 | "stateMutability": "view", 508 | "type": "function" 509 | }, 510 | { 511 | "inputs": [], 512 | "name": "totalSupply", 513 | "outputs": [ 514 | { 515 | "internalType": "uint256", 516 | "name": "", 517 | "type": "uint256" 518 | } 519 | ], 520 | "stateMutability": "view", 521 | "type": "function" 522 | }, 523 | { 524 | "inputs": [ 525 | { 526 | "internalType": "address", 527 | "name": "from", 528 | "type": "address" 529 | }, 530 | { 531 | "internalType": "address", 532 | "name": "to", 533 | "type": "address" 534 | }, 535 | { 536 | "internalType": "uint256", 537 | "name": "tokenId", 538 | "type": "uint256" 539 | } 540 | ], 541 | "name": "transferFrom", 542 | "outputs": [], 543 | "stateMutability": "nonpayable", 544 | "type": "function" 545 | }, 546 | { 547 | "inputs": [ 548 | { 549 | "internalType": "address", 550 | "name": "newOwner", 551 | "type": "address" 552 | } 553 | ], 554 | "name": "transferOwnership", 555 | "outputs": [], 556 | "stateMutability": "nonpayable", 557 | "type": "function" 558 | }, 559 | { 560 | "inputs": [], 561 | "name": "withdraw", 562 | "outputs": [], 563 | "stateMutability": "payable", 564 | "type": "function" 565 | } 566 | ], 567 | "bytecode": "0x60806040523480156200001157600080fd5b506040516200485f3803806200485f8339818101604052810190620000379190620003d4565b6040518060400160405280600f81526020017f4e465420436f6c6c65637469626c6500000000000000000000000000000000008152506040518060400160405280600481526020017f4e465443000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000bb929190620002b2565b508060019080519060200190620000d4929190620002b2565b505050620000f7620000eb6200010f60201b60201c565b6200011760201b60201c565b6200010881620001dd60201b60201c565b506200060c565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001ed6200010f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002136200028860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200026c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002639062000440565b60405180910390fd5b80600c908051906020019062000284929190620002b2565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002c09062000508565b90600052602060002090601f016020900481019282620002e4576000855562000330565b82601f10620002ff57805160ff191683800117855562000330565b8280016001018555821562000330579182015b828111156200032f57825182559160200191906001019062000312565b5b5090506200033f919062000343565b5090565b5b808211156200035e57600081600090555060010162000344565b5090565b60006200037962000373846200048b565b62000462565b9050828152602081018484840111156200039257600080fd5b6200039f848285620004d2565b509392505050565b600082601f830112620003b957600080fd5b8151620003cb84826020860162000362565b91505092915050565b600060208284031215620003e757600080fd5b600082015167ffffffffffffffff8111156200040257600080fd5b6200041084828501620003a7565b91505092915050565b600062000428602083620004c1565b91506200043582620005e3565b602082019050919050565b600060208201905081810360008301526200045b8162000419565b9050919050565b60006200046e62000481565b90506200047c82826200053e565b919050565b6000604051905090565b600067ffffffffffffffff821115620004a957620004a8620005a3565b5b620004b482620005d2565b9050602081019050919050565b600082825260208201905092915050565b60005b83811015620004f2578082015181840152602081019050620004d5565b8381111562000502576000848401525b50505050565b600060028204905060018216806200052157607f821691505b6020821081141562000538576200053762000574565b5b50919050565b6200054982620005d2565b810181811067ffffffffffffffff821117156200056b576200056a620005a3565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b614243806200061c6000396000f3fe6080604052600436106101b75760003560e01c806355f804b3116100ec57806395d89b411161008a578063c87b56dd11610064578063c87b56dd146105de578063d547cfb71461061b578063e985e9c514610646578063f2fde38b14610683576101b7565b806395d89b4114610561578063a22cb4651461058c578063b88d4fde146105b5576101b7565b8063715018a6116100c6578063715018a6146104b75780638462151c146104ce5780638d859f3e1461050b5780638da5cb5b14610536576101b7565b806355f804b3146104145780636352211e1461043d57806370a082311461047a576101b7565b806323b872dd116101595780633b4b1381116101335780633b4b1381146103885780633ccfd60b146103a457806342842e0e146103ae5780634f6ccce7146103d7576101b7565b806323b872dd146102f75780632f745c591461032057806332cb6b0c1461035d576101b7565b8063095ea7b311610195578063095ea7b31461026157806309d42b301461028a578063144100c7146102b557806318160ddd146102cc576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612d5d565b6106ac565b6040516101f0919061339b565b60405180910390f35b34801561020557600080fd5b5061020e610726565b60405161021b91906133b6565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190612df0565b6107b8565b6040516102589190613312565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612d21565b61083d565b005b34801561029657600080fd5b5061029f610955565b6040516102ac91906136d8565b60405180910390f35b3480156102c157600080fd5b506102ca61095a565b005b3480156102d857600080fd5b506102e1610a65565b6040516102ee91906136d8565b60405180910390f35b34801561030357600080fd5b5061031e60048036038101906103199190612c1b565b610a72565b005b34801561032c57600080fd5b5061034760048036038101906103429190612d21565b610ad2565b60405161035491906136d8565b60405180910390f35b34801561036957600080fd5b50610372610b77565b60405161037f91906136d8565b60405180910390f35b6103a2600480360381019061039d9190612df0565b610b7c565b005b6103ac610cb7565b005b3480156103ba57600080fd5b506103d560048036038101906103d09190612c1b565b610e2b565b005b3480156103e357600080fd5b506103fe60048036038101906103f99190612df0565b610e4b565b60405161040b91906136d8565b60405180910390f35b34801561042057600080fd5b5061043b60048036038101906104369190612daf565b610ee2565b005b34801561044957600080fd5b50610464600480360381019061045f9190612df0565b610f78565b6040516104719190613312565b60405180910390f35b34801561048657600080fd5b506104a1600480360381019061049c9190612bb6565b61102a565b6040516104ae91906136d8565b60405180910390f35b3480156104c357600080fd5b506104cc6110e2565b005b3480156104da57600080fd5b506104f560048036038101906104f09190612bb6565b61116a565b6040516105029190613379565b60405180910390f35b34801561051757600080fd5b50610520611264565b60405161052d91906136d8565b60405180910390f35b34801561054257600080fd5b5061054b61126f565b6040516105589190613312565b60405180910390f35b34801561056d57600080fd5b50610576611299565b60405161058391906133b6565b60405180910390f35b34801561059857600080fd5b506105b360048036038101906105ae9190612ce5565b61132b565b005b3480156105c157600080fd5b506105dc60048036038101906105d79190612c6a565b6114ac565b005b3480156105ea57600080fd5b5061060560048036038101906106009190612df0565b61150e565b60405161061291906133b6565b60405180910390f35b34801561062757600080fd5b506106306115b5565b60405161063d91906133b6565b60405180910390f35b34801561065257600080fd5b5061066d60048036038101906106689190612bdf565b611643565b60405161067a919061339b565b60405180910390f35b34801561068f57600080fd5b506106aa60048036038101906106a59190612bb6565b6116d7565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061071f575061071e826117cf565b5b9050919050565b606060008054610735906139cc565b80601f0160208091040260200160405190810160405280929190818152602001828054610761906139cc565b80156107ae5780601f10610783576101008083540402835291602001916107ae565b820191906000526020600020905b81548152906001019060200180831161079157829003601f168201915b5050505050905090565b60006107c3826118b1565b610802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f9906135d8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061084882610f78565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b090613658565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108d861191d565b73ffffffffffffffffffffffffffffffffffffffff16148061090757506109068161090161191d565b611643565b5b610946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093d90613538565b60405180910390fd5b6109508383611925565b505050565b600581565b61096261191d565b73ffffffffffffffffffffffffffffffffffffffff1661098061126f565b73ffffffffffffffffffffffffffffffffffffffff16146109d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cd906135f8565b60405180910390fd5b60006109e2600b6119de565b905060646109fa600a836119ec90919063ffffffff16565b10610a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a31906133d8565b60405180910390fd5b60005b600a811015610a6157610a4e611a02565b8080610a5990613a2f565b915050610a3d565b5050565b6000600880549050905090565b610a83610a7d61191d565b82611a27565b610ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab990613698565b60405180910390fd5b610acd838383611b05565b505050565b6000610add8361102a565b8210610b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b15906133f8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b606481565b6000610b88600b6119de565b90506064610b9f83836119ec90919063ffffffff16565b1115610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd7906134d8565b60405180910390fd5b600082118015610bf1575060058211155b610c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c27906134f8565b60405180910390fd5b610c4a82662386f26fc10000611d6190919063ffffffff16565b341015610c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c83906134b8565b60405180910390fd5b60005b82811015610cb257610c9f611a02565b8080610caa90613a2f565b915050610c8f565b505050565b610cbf61191d565b73ffffffffffffffffffffffffffffffffffffffff16610cdd61126f565b73ffffffffffffffffffffffffffffffffffffffff1614610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a906135f8565b60405180910390fd5b600047905060008111610d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d72906135b8565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051610da1906132fd565b60006040518083038185875af1925050503d8060008114610dde576040519150601f19603f3d011682016040523d82523d6000602084013e610de3565b606091505b5050905080610e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1e90613678565b60405180910390fd5b5050565b610e46838383604051806020016040528060008152506114ac565b505050565b6000610e55610a65565b8210610e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8d906136b8565b60405180910390fd5b60088281548110610ed0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610eea61191d565b73ffffffffffffffffffffffffffffffffffffffff16610f0861126f565b73ffffffffffffffffffffffffffffffffffffffff1614610f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f55906135f8565b60405180910390fd5b80600c9080519060200190610f749291906129da565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611021576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101890613578565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290613558565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110ea61191d565b73ffffffffffffffffffffffffffffffffffffffff1661110861126f565b73ffffffffffffffffffffffffffffffffffffffff161461115e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611155906135f8565b60405180910390fd5b6111686000611d77565b565b606060006111778361102a565b905060008167ffffffffffffffff8111156111bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156111e95781602001602082028036833780820191505090505b50905060005b82811015611259576112018582610ad2565b82828151811061123a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061125190613a2f565b9150506111ef565b508092505050919050565b662386f26fc1000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112a8906139cc565b80601f01602080910402602001604051908101604052809291908181526020018280546112d4906139cc565b80156113215780601f106112f657610100808354040283529160200191611321565b820191906000526020600020905b81548152906001019060200180831161130457829003601f168201915b5050505050905090565b61133361191d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139890613498565b60405180910390fd5b80600560006113ae61191d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661145b61191d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114a0919061339b565b60405180910390a35050565b6114bd6114b761191d565b83611a27565b6114fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f390613698565b60405180910390fd5b61150884848484611e3d565b50505050565b6060611519826118b1565b611558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154f90613638565b60405180910390fd5b6000611562611e99565b9050600081511161158257604051806020016040528060008152506115ad565b8061158c84611f2b565b60405160200161159d9291906132d9565b6040516020818303038152906040525b915050919050565b600c80546115c2906139cc565b80601f01602080910402602001604051908101604052809291908181526020018280546115ee906139cc565b801561163b5780601f106116105761010080835404028352916020019161163b565b820191906000526020600020905b81548152906001019060200180831161161e57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116df61191d565b73ffffffffffffffffffffffffffffffffffffffff166116fd61126f565b73ffffffffffffffffffffffffffffffffffffffff1614611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a906135f8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ba90613438565b60405180910390fd5b6117cc81611d77565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061189a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806118aa57506118a9826120d8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661199883610f78565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600081836119fa9190613801565b905092915050565b6000611a0e600b6119de565b9050611a1a3382612142565b611a24600b612160565b50565b6000611a32826118b1565b611a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6890613518565b60405180910390fd5b6000611a7c83610f78565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611aeb57508373ffffffffffffffffffffffffffffffffffffffff16611ad3846107b8565b73ffffffffffffffffffffffffffffffffffffffff16145b80611afc5750611afb8185611643565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b2582610f78565b73ffffffffffffffffffffffffffffffffffffffff1614611b7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7290613618565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be290613478565b60405180910390fd5b611bf6838383612176565b611c01600082611925565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c5191906138e2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ca89190613801565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183611d6f9190613888565b905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e48848484611b05565b611e548484848461228a565b611e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8a90613418565b60405180910390fd5b50505050565b6060600c8054611ea8906139cc565b80601f0160208091040260200160405190810160405280929190818152602001828054611ed4906139cc565b8015611f215780601f10611ef657610100808354040283529160200191611f21565b820191906000526020600020905b815481529060010190602001808311611f0457829003601f168201915b5050505050905090565b60606000821415611f73576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120d3565b600082905060005b60008214611fa5578080611f8e90613a2f565b915050600a82611f9e9190613857565b9150611f7b565b60008167ffffffffffffffff811115611fe7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120195781602001600182028036833780820191505090505b5090505b600085146120cc5760018261203291906138e2565b9150600a856120419190613a78565b603061204d9190613801565b60f81b818381518110612089577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120c59190613857565b945061201d565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61215c828260405180602001604052806000815250612421565b5050565b6001816000016000828254019250508190555050565b61218183838361247c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121c4576121bf81612481565b612203565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146122025761220183826124ca565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122465761224181612637565b612285565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461228457612283828261277a565b5b5b505050565b60006122ab8473ffffffffffffffffffffffffffffffffffffffff166127f9565b15612414578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122d461191d565b8786866040518563ffffffff1660e01b81526004016122f6949392919061332d565b602060405180830381600087803b15801561231057600080fd5b505af192505050801561234157506040513d601f19601f8201168201806040525081019061233e9190612d86565b60015b6123c4573d8060008114612371576040519150601f19603f3d011682016040523d82523d6000602084013e612376565b606091505b506000815114156123bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b390613418565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612419565b600190505b949350505050565b61242b838361280c565b612438600084848461228a565b612477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246e90613418565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016124d78461102a565b6124e191906138e2565b90506000600760008481526020019081526020016000205490508181146125c6576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061264b91906138e2565b90506000600960008481526020019081526020016000205490506000600883815481106126a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106126e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061275e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006127858361102a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561287c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287390613598565b60405180910390fd5b612885816118b1565b156128c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bc90613458565b60405180910390fd5b6128d160008383612176565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129219190613801565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546129e6906139cc565b90600052602060002090601f016020900481019282612a085760008555612a4f565b82601f10612a2157805160ff1916838001178555612a4f565b82800160010185558215612a4f579182015b82811115612a4e578251825591602001919060010190612a33565b5b509050612a5c9190612a60565b5090565b5b80821115612a79576000816000905550600101612a61565b5090565b6000612a90612a8b84613718565b6136f3565b905082815260208101848484011115612aa857600080fd5b612ab384828561398a565b509392505050565b6000612ace612ac984613749565b6136f3565b905082815260208101848484011115612ae657600080fd5b612af184828561398a565b509392505050565b600081359050612b08816141b1565b92915050565b600081359050612b1d816141c8565b92915050565b600081359050612b32816141df565b92915050565b600081519050612b47816141df565b92915050565b600082601f830112612b5e57600080fd5b8135612b6e848260208601612a7d565b91505092915050565b600082601f830112612b8857600080fd5b8135612b98848260208601612abb565b91505092915050565b600081359050612bb0816141f6565b92915050565b600060208284031215612bc857600080fd5b6000612bd684828501612af9565b91505092915050565b60008060408385031215612bf257600080fd5b6000612c0085828601612af9565b9250506020612c1185828601612af9565b9150509250929050565b600080600060608486031215612c3057600080fd5b6000612c3e86828701612af9565b9350506020612c4f86828701612af9565b9250506040612c6086828701612ba1565b9150509250925092565b60008060008060808587031215612c8057600080fd5b6000612c8e87828801612af9565b9450506020612c9f87828801612af9565b9350506040612cb087828801612ba1565b925050606085013567ffffffffffffffff811115612ccd57600080fd5b612cd987828801612b4d565b91505092959194509250565b60008060408385031215612cf857600080fd5b6000612d0685828601612af9565b9250506020612d1785828601612b0e565b9150509250929050565b60008060408385031215612d3457600080fd5b6000612d4285828601612af9565b9250506020612d5385828601612ba1565b9150509250929050565b600060208284031215612d6f57600080fd5b6000612d7d84828501612b23565b91505092915050565b600060208284031215612d9857600080fd5b6000612da684828501612b38565b91505092915050565b600060208284031215612dc157600080fd5b600082013567ffffffffffffffff811115612ddb57600080fd5b612de784828501612b77565b91505092915050565b600060208284031215612e0257600080fd5b6000612e1084828501612ba1565b91505092915050565b6000612e2583836132bb565b60208301905092915050565b612e3a81613916565b82525050565b6000612e4b8261378a565b612e5581856137b8565b9350612e608361377a565b8060005b83811015612e91578151612e788882612e19565b9750612e83836137ab565b925050600181019050612e64565b5085935050505092915050565b612ea781613928565b82525050565b6000612eb882613795565b612ec281856137c9565b9350612ed2818560208601613999565b612edb81613b65565b840191505092915050565b6000612ef1826137a0565b612efb81856137e5565b9350612f0b818560208601613999565b612f1481613b65565b840191505092915050565b6000612f2a826137a0565b612f3481856137f6565b9350612f44818560208601613999565b80840191505092915050565b6000612f5d601f836137e5565b9150612f6882613b76565b602082019050919050565b6000612f80602b836137e5565b9150612f8b82613b9f565b604082019050919050565b6000612fa36032836137e5565b9150612fae82613bee565b604082019050919050565b6000612fc66026836137e5565b9150612fd182613c3d565b604082019050919050565b6000612fe9601c836137e5565b9150612ff482613c8c565b602082019050919050565b600061300c6024836137e5565b915061301782613cb5565b604082019050919050565b600061302f6019836137e5565b915061303a82613d04565b602082019050919050565b60006130526022836137e5565b915061305d82613d2d565b604082019050919050565b60006130756015836137e5565b915061308082613d7c565b602082019050919050565b60006130986025836137e5565b91506130a382613da5565b604082019050919050565b60006130bb602c836137e5565b91506130c682613df4565b604082019050919050565b60006130de6038836137e5565b91506130e982613e43565b604082019050919050565b6000613101602a836137e5565b915061310c82613e92565b604082019050919050565b60006131246029836137e5565b915061312f82613ee1565b604082019050919050565b60006131476020836137e5565b915061315282613f30565b602082019050919050565b600061316a6019836137e5565b915061317582613f59565b602082019050919050565b600061318d602c836137e5565b915061319882613f82565b604082019050919050565b60006131b06020836137e5565b91506131bb82613fd1565b602082019050919050565b60006131d36029836137e5565b91506131de82613ffa565b604082019050919050565b60006131f6602f836137e5565b915061320182614049565b604082019050919050565b60006132196021836137e5565b915061322482614098565b604082019050919050565b600061323c6000836137da565b9150613247826140e7565b600082019050919050565b600061325f6010836137e5565b915061326a826140ea565b602082019050919050565b60006132826031836137e5565b915061328d82614113565b604082019050919050565b60006132a5602c836137e5565b91506132b082614162565b604082019050919050565b6132c481613980565b82525050565b6132d381613980565b82525050565b60006132e58285612f1f565b91506132f18284612f1f565b91508190509392505050565b60006133088261322f565b9150819050919050565b60006020820190506133276000830184612e31565b92915050565b60006080820190506133426000830187612e31565b61334f6020830186612e31565b61335c60408301856132ca565b818103606083015261336e8184612ead565b905095945050505050565b600060208201905081810360008301526133938184612e40565b905092915050565b60006020820190506133b06000830184612e9e565b92915050565b600060208201905081810360008301526133d08184612ee6565b905092915050565b600060208201905081810360008301526133f181612f50565b9050919050565b6000602082019050818103600083015261341181612f73565b9050919050565b6000602082019050818103600083015261343181612f96565b9050919050565b6000602082019050818103600083015261345181612fb9565b9050919050565b6000602082019050818103600083015261347181612fdc565b9050919050565b6000602082019050818103600083015261349181612fff565b9050919050565b600060208201905081810360008301526134b181613022565b9050919050565b600060208201905081810360008301526134d181613045565b9050919050565b600060208201905081810360008301526134f181613068565b9050919050565b600060208201905081810360008301526135118161308b565b9050919050565b60006020820190508181036000830152613531816130ae565b9050919050565b60006020820190508181036000830152613551816130d1565b9050919050565b60006020820190508181036000830152613571816130f4565b9050919050565b6000602082019050818103600083015261359181613117565b9050919050565b600060208201905081810360008301526135b18161313a565b9050919050565b600060208201905081810360008301526135d18161315d565b9050919050565b600060208201905081810360008301526135f181613180565b9050919050565b60006020820190508181036000830152613611816131a3565b9050919050565b60006020820190508181036000830152613631816131c6565b9050919050565b60006020820190508181036000830152613651816131e9565b9050919050565b600060208201905081810360008301526136718161320c565b9050919050565b6000602082019050818103600083015261369181613252565b9050919050565b600060208201905081810360008301526136b181613275565b9050919050565b600060208201905081810360008301526136d181613298565b9050919050565b60006020820190506136ed60008301846132ca565b92915050565b60006136fd61370e565b905061370982826139fe565b919050565b6000604051905090565b600067ffffffffffffffff82111561373357613732613b36565b5b61373c82613b65565b9050602081019050919050565b600067ffffffffffffffff82111561376457613763613b36565b5b61376d82613b65565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061380c82613980565b915061381783613980565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561384c5761384b613aa9565b5b828201905092915050565b600061386282613980565b915061386d83613980565b92508261387d5761387c613ad8565b5b828204905092915050565b600061389382613980565b915061389e83613980565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138d7576138d6613aa9565b5b828202905092915050565b60006138ed82613980565b91506138f883613980565b92508282101561390b5761390a613aa9565b5b828203905092915050565b600061392182613960565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156139b757808201518184015260208101905061399c565b838111156139c6576000848401525b50505050565b600060028204905060018216806139e457607f821691505b602082108114156139f8576139f7613b07565b5b50919050565b613a0782613b65565b810181811067ffffffffffffffff82111715613a2657613a25613b36565b5b80604052505050565b6000613a3a82613980565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a6d57613a6c613aa9565b5b600182019050919050565b6000613a8382613980565b9150613a8e83613980565b925082613a9e57613a9d613ad8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4e6f7420656e6f756768204e465473206c65667420746f207265736572766500600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f7420656e6f75676820657468657220746f207075726368617365204e465460008201527f732e000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768204e465473206c656674210000000000000000000000600082015250565b7f43616e6e6f74206d696e7420737065636966696564206e756d626572206f662060008201527f4e4654732e000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4e6f206574686572206c65667420746f20776974686472617700000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6141ba81613916565b81146141c557600080fd5b50565b6141d181613928565b81146141dc57600080fd5b50565b6141e881613934565b81146141f357600080fd5b50565b6141ff81613980565b811461420a57600080fd5b5056fea2646970667358221220dbb56ffa0ef16d53b56dc70ac93f7b1c3eba45cd6b47475ad832e39dca7a355664736f6c63430008040033", 568 | "deployedBytecode": "0x6080604052600436106101b75760003560e01c806355f804b3116100ec57806395d89b411161008a578063c87b56dd11610064578063c87b56dd146105de578063d547cfb71461061b578063e985e9c514610646578063f2fde38b14610683576101b7565b806395d89b4114610561578063a22cb4651461058c578063b88d4fde146105b5576101b7565b8063715018a6116100c6578063715018a6146104b75780638462151c146104ce5780638d859f3e1461050b5780638da5cb5b14610536576101b7565b806355f804b3146104145780636352211e1461043d57806370a082311461047a576101b7565b806323b872dd116101595780633b4b1381116101335780633b4b1381146103885780633ccfd60b146103a457806342842e0e146103ae5780634f6ccce7146103d7576101b7565b806323b872dd146102f75780632f745c591461032057806332cb6b0c1461035d576101b7565b8063095ea7b311610195578063095ea7b31461026157806309d42b301461028a578063144100c7146102b557806318160ddd146102cc576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612d5d565b6106ac565b6040516101f0919061339b565b60405180910390f35b34801561020557600080fd5b5061020e610726565b60405161021b91906133b6565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190612df0565b6107b8565b6040516102589190613312565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612d21565b61083d565b005b34801561029657600080fd5b5061029f610955565b6040516102ac91906136d8565b60405180910390f35b3480156102c157600080fd5b506102ca61095a565b005b3480156102d857600080fd5b506102e1610a65565b6040516102ee91906136d8565b60405180910390f35b34801561030357600080fd5b5061031e60048036038101906103199190612c1b565b610a72565b005b34801561032c57600080fd5b5061034760048036038101906103429190612d21565b610ad2565b60405161035491906136d8565b60405180910390f35b34801561036957600080fd5b50610372610b77565b60405161037f91906136d8565b60405180910390f35b6103a2600480360381019061039d9190612df0565b610b7c565b005b6103ac610cb7565b005b3480156103ba57600080fd5b506103d560048036038101906103d09190612c1b565b610e2b565b005b3480156103e357600080fd5b506103fe60048036038101906103f99190612df0565b610e4b565b60405161040b91906136d8565b60405180910390f35b34801561042057600080fd5b5061043b60048036038101906104369190612daf565b610ee2565b005b34801561044957600080fd5b50610464600480360381019061045f9190612df0565b610f78565b6040516104719190613312565b60405180910390f35b34801561048657600080fd5b506104a1600480360381019061049c9190612bb6565b61102a565b6040516104ae91906136d8565b60405180910390f35b3480156104c357600080fd5b506104cc6110e2565b005b3480156104da57600080fd5b506104f560048036038101906104f09190612bb6565b61116a565b6040516105029190613379565b60405180910390f35b34801561051757600080fd5b50610520611264565b60405161052d91906136d8565b60405180910390f35b34801561054257600080fd5b5061054b61126f565b6040516105589190613312565b60405180910390f35b34801561056d57600080fd5b50610576611299565b60405161058391906133b6565b60405180910390f35b34801561059857600080fd5b506105b360048036038101906105ae9190612ce5565b61132b565b005b3480156105c157600080fd5b506105dc60048036038101906105d79190612c6a565b6114ac565b005b3480156105ea57600080fd5b5061060560048036038101906106009190612df0565b61150e565b60405161061291906133b6565b60405180910390f35b34801561062757600080fd5b506106306115b5565b60405161063d91906133b6565b60405180910390f35b34801561065257600080fd5b5061066d60048036038101906106689190612bdf565b611643565b60405161067a919061339b565b60405180910390f35b34801561068f57600080fd5b506106aa60048036038101906106a59190612bb6565b6116d7565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061071f575061071e826117cf565b5b9050919050565b606060008054610735906139cc565b80601f0160208091040260200160405190810160405280929190818152602001828054610761906139cc565b80156107ae5780601f10610783576101008083540402835291602001916107ae565b820191906000526020600020905b81548152906001019060200180831161079157829003601f168201915b5050505050905090565b60006107c3826118b1565b610802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f9906135d8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061084882610f78565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b090613658565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108d861191d565b73ffffffffffffffffffffffffffffffffffffffff16148061090757506109068161090161191d565b611643565b5b610946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093d90613538565b60405180910390fd5b6109508383611925565b505050565b600581565b61096261191d565b73ffffffffffffffffffffffffffffffffffffffff1661098061126f565b73ffffffffffffffffffffffffffffffffffffffff16146109d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cd906135f8565b60405180910390fd5b60006109e2600b6119de565b905060646109fa600a836119ec90919063ffffffff16565b10610a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a31906133d8565b60405180910390fd5b60005b600a811015610a6157610a4e611a02565b8080610a5990613a2f565b915050610a3d565b5050565b6000600880549050905090565b610a83610a7d61191d565b82611a27565b610ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab990613698565b60405180910390fd5b610acd838383611b05565b505050565b6000610add8361102a565b8210610b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b15906133f8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b606481565b6000610b88600b6119de565b90506064610b9f83836119ec90919063ffffffff16565b1115610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd7906134d8565b60405180910390fd5b600082118015610bf1575060058211155b610c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c27906134f8565b60405180910390fd5b610c4a82662386f26fc10000611d6190919063ffffffff16565b341015610c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c83906134b8565b60405180910390fd5b60005b82811015610cb257610c9f611a02565b8080610caa90613a2f565b915050610c8f565b505050565b610cbf61191d565b73ffffffffffffffffffffffffffffffffffffffff16610cdd61126f565b73ffffffffffffffffffffffffffffffffffffffff1614610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a906135f8565b60405180910390fd5b600047905060008111610d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d72906135b8565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051610da1906132fd565b60006040518083038185875af1925050503d8060008114610dde576040519150601f19603f3d011682016040523d82523d6000602084013e610de3565b606091505b5050905080610e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1e90613678565b60405180910390fd5b5050565b610e46838383604051806020016040528060008152506114ac565b505050565b6000610e55610a65565b8210610e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8d906136b8565b60405180910390fd5b60088281548110610ed0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610eea61191d565b73ffffffffffffffffffffffffffffffffffffffff16610f0861126f565b73ffffffffffffffffffffffffffffffffffffffff1614610f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f55906135f8565b60405180910390fd5b80600c9080519060200190610f749291906129da565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611021576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101890613578565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290613558565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110ea61191d565b73ffffffffffffffffffffffffffffffffffffffff1661110861126f565b73ffffffffffffffffffffffffffffffffffffffff161461115e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611155906135f8565b60405180910390fd5b6111686000611d77565b565b606060006111778361102a565b905060008167ffffffffffffffff8111156111bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156111e95781602001602082028036833780820191505090505b50905060005b82811015611259576112018582610ad2565b82828151811061123a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061125190613a2f565b9150506111ef565b508092505050919050565b662386f26fc1000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112a8906139cc565b80601f01602080910402602001604051908101604052809291908181526020018280546112d4906139cc565b80156113215780601f106112f657610100808354040283529160200191611321565b820191906000526020600020905b81548152906001019060200180831161130457829003601f168201915b5050505050905090565b61133361191d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139890613498565b60405180910390fd5b80600560006113ae61191d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661145b61191d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114a0919061339b565b60405180910390a35050565b6114bd6114b761191d565b83611a27565b6114fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f390613698565b60405180910390fd5b61150884848484611e3d565b50505050565b6060611519826118b1565b611558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154f90613638565b60405180910390fd5b6000611562611e99565b9050600081511161158257604051806020016040528060008152506115ad565b8061158c84611f2b565b60405160200161159d9291906132d9565b6040516020818303038152906040525b915050919050565b600c80546115c2906139cc565b80601f01602080910402602001604051908101604052809291908181526020018280546115ee906139cc565b801561163b5780601f106116105761010080835404028352916020019161163b565b820191906000526020600020905b81548152906001019060200180831161161e57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116df61191d565b73ffffffffffffffffffffffffffffffffffffffff166116fd61126f565b73ffffffffffffffffffffffffffffffffffffffff1614611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a906135f8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ba90613438565b60405180910390fd5b6117cc81611d77565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061189a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806118aa57506118a9826120d8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661199883610f78565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600081836119fa9190613801565b905092915050565b6000611a0e600b6119de565b9050611a1a3382612142565b611a24600b612160565b50565b6000611a32826118b1565b611a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6890613518565b60405180910390fd5b6000611a7c83610f78565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611aeb57508373ffffffffffffffffffffffffffffffffffffffff16611ad3846107b8565b73ffffffffffffffffffffffffffffffffffffffff16145b80611afc5750611afb8185611643565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b2582610f78565b73ffffffffffffffffffffffffffffffffffffffff1614611b7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7290613618565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be290613478565b60405180910390fd5b611bf6838383612176565b611c01600082611925565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c5191906138e2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ca89190613801565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183611d6f9190613888565b905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e48848484611b05565b611e548484848461228a565b611e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8a90613418565b60405180910390fd5b50505050565b6060600c8054611ea8906139cc565b80601f0160208091040260200160405190810160405280929190818152602001828054611ed4906139cc565b8015611f215780601f10611ef657610100808354040283529160200191611f21565b820191906000526020600020905b815481529060010190602001808311611f0457829003601f168201915b5050505050905090565b60606000821415611f73576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120d3565b600082905060005b60008214611fa5578080611f8e90613a2f565b915050600a82611f9e9190613857565b9150611f7b565b60008167ffffffffffffffff811115611fe7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120195781602001600182028036833780820191505090505b5090505b600085146120cc5760018261203291906138e2565b9150600a856120419190613a78565b603061204d9190613801565b60f81b818381518110612089577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120c59190613857565b945061201d565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61215c828260405180602001604052806000815250612421565b5050565b6001816000016000828254019250508190555050565b61218183838361247c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121c4576121bf81612481565b612203565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146122025761220183826124ca565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122465761224181612637565b612285565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461228457612283828261277a565b5b5b505050565b60006122ab8473ffffffffffffffffffffffffffffffffffffffff166127f9565b15612414578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122d461191d565b8786866040518563ffffffff1660e01b81526004016122f6949392919061332d565b602060405180830381600087803b15801561231057600080fd5b505af192505050801561234157506040513d601f19601f8201168201806040525081019061233e9190612d86565b60015b6123c4573d8060008114612371576040519150601f19603f3d011682016040523d82523d6000602084013e612376565b606091505b506000815114156123bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b390613418565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612419565b600190505b949350505050565b61242b838361280c565b612438600084848461228a565b612477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246e90613418565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016124d78461102a565b6124e191906138e2565b90506000600760008481526020019081526020016000205490508181146125c6576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061264b91906138e2565b90506000600960008481526020019081526020016000205490506000600883815481106126a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106126e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061275e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006127858361102a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561287c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287390613598565b60405180910390fd5b612885816118b1565b156128c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bc90613458565b60405180910390fd5b6128d160008383612176565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129219190613801565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546129e6906139cc565b90600052602060002090601f016020900481019282612a085760008555612a4f565b82601f10612a2157805160ff1916838001178555612a4f565b82800160010185558215612a4f579182015b82811115612a4e578251825591602001919060010190612a33565b5b509050612a5c9190612a60565b5090565b5b80821115612a79576000816000905550600101612a61565b5090565b6000612a90612a8b84613718565b6136f3565b905082815260208101848484011115612aa857600080fd5b612ab384828561398a565b509392505050565b6000612ace612ac984613749565b6136f3565b905082815260208101848484011115612ae657600080fd5b612af184828561398a565b509392505050565b600081359050612b08816141b1565b92915050565b600081359050612b1d816141c8565b92915050565b600081359050612b32816141df565b92915050565b600081519050612b47816141df565b92915050565b600082601f830112612b5e57600080fd5b8135612b6e848260208601612a7d565b91505092915050565b600082601f830112612b8857600080fd5b8135612b98848260208601612abb565b91505092915050565b600081359050612bb0816141f6565b92915050565b600060208284031215612bc857600080fd5b6000612bd684828501612af9565b91505092915050565b60008060408385031215612bf257600080fd5b6000612c0085828601612af9565b9250506020612c1185828601612af9565b9150509250929050565b600080600060608486031215612c3057600080fd5b6000612c3e86828701612af9565b9350506020612c4f86828701612af9565b9250506040612c6086828701612ba1565b9150509250925092565b60008060008060808587031215612c8057600080fd5b6000612c8e87828801612af9565b9450506020612c9f87828801612af9565b9350506040612cb087828801612ba1565b925050606085013567ffffffffffffffff811115612ccd57600080fd5b612cd987828801612b4d565b91505092959194509250565b60008060408385031215612cf857600080fd5b6000612d0685828601612af9565b9250506020612d1785828601612b0e565b9150509250929050565b60008060408385031215612d3457600080fd5b6000612d4285828601612af9565b9250506020612d5385828601612ba1565b9150509250929050565b600060208284031215612d6f57600080fd5b6000612d7d84828501612b23565b91505092915050565b600060208284031215612d9857600080fd5b6000612da684828501612b38565b91505092915050565b600060208284031215612dc157600080fd5b600082013567ffffffffffffffff811115612ddb57600080fd5b612de784828501612b77565b91505092915050565b600060208284031215612e0257600080fd5b6000612e1084828501612ba1565b91505092915050565b6000612e2583836132bb565b60208301905092915050565b612e3a81613916565b82525050565b6000612e4b8261378a565b612e5581856137b8565b9350612e608361377a565b8060005b83811015612e91578151612e788882612e19565b9750612e83836137ab565b925050600181019050612e64565b5085935050505092915050565b612ea781613928565b82525050565b6000612eb882613795565b612ec281856137c9565b9350612ed2818560208601613999565b612edb81613b65565b840191505092915050565b6000612ef1826137a0565b612efb81856137e5565b9350612f0b818560208601613999565b612f1481613b65565b840191505092915050565b6000612f2a826137a0565b612f3481856137f6565b9350612f44818560208601613999565b80840191505092915050565b6000612f5d601f836137e5565b9150612f6882613b76565b602082019050919050565b6000612f80602b836137e5565b9150612f8b82613b9f565b604082019050919050565b6000612fa36032836137e5565b9150612fae82613bee565b604082019050919050565b6000612fc66026836137e5565b9150612fd182613c3d565b604082019050919050565b6000612fe9601c836137e5565b9150612ff482613c8c565b602082019050919050565b600061300c6024836137e5565b915061301782613cb5565b604082019050919050565b600061302f6019836137e5565b915061303a82613d04565b602082019050919050565b60006130526022836137e5565b915061305d82613d2d565b604082019050919050565b60006130756015836137e5565b915061308082613d7c565b602082019050919050565b60006130986025836137e5565b91506130a382613da5565b604082019050919050565b60006130bb602c836137e5565b91506130c682613df4565b604082019050919050565b60006130de6038836137e5565b91506130e982613e43565b604082019050919050565b6000613101602a836137e5565b915061310c82613e92565b604082019050919050565b60006131246029836137e5565b915061312f82613ee1565b604082019050919050565b60006131476020836137e5565b915061315282613f30565b602082019050919050565b600061316a6019836137e5565b915061317582613f59565b602082019050919050565b600061318d602c836137e5565b915061319882613f82565b604082019050919050565b60006131b06020836137e5565b91506131bb82613fd1565b602082019050919050565b60006131d36029836137e5565b91506131de82613ffa565b604082019050919050565b60006131f6602f836137e5565b915061320182614049565b604082019050919050565b60006132196021836137e5565b915061322482614098565b604082019050919050565b600061323c6000836137da565b9150613247826140e7565b600082019050919050565b600061325f6010836137e5565b915061326a826140ea565b602082019050919050565b60006132826031836137e5565b915061328d82614113565b604082019050919050565b60006132a5602c836137e5565b91506132b082614162565b604082019050919050565b6132c481613980565b82525050565b6132d381613980565b82525050565b60006132e58285612f1f565b91506132f18284612f1f565b91508190509392505050565b60006133088261322f565b9150819050919050565b60006020820190506133276000830184612e31565b92915050565b60006080820190506133426000830187612e31565b61334f6020830186612e31565b61335c60408301856132ca565b818103606083015261336e8184612ead565b905095945050505050565b600060208201905081810360008301526133938184612e40565b905092915050565b60006020820190506133b06000830184612e9e565b92915050565b600060208201905081810360008301526133d08184612ee6565b905092915050565b600060208201905081810360008301526133f181612f50565b9050919050565b6000602082019050818103600083015261341181612f73565b9050919050565b6000602082019050818103600083015261343181612f96565b9050919050565b6000602082019050818103600083015261345181612fb9565b9050919050565b6000602082019050818103600083015261347181612fdc565b9050919050565b6000602082019050818103600083015261349181612fff565b9050919050565b600060208201905081810360008301526134b181613022565b9050919050565b600060208201905081810360008301526134d181613045565b9050919050565b600060208201905081810360008301526134f181613068565b9050919050565b600060208201905081810360008301526135118161308b565b9050919050565b60006020820190508181036000830152613531816130ae565b9050919050565b60006020820190508181036000830152613551816130d1565b9050919050565b60006020820190508181036000830152613571816130f4565b9050919050565b6000602082019050818103600083015261359181613117565b9050919050565b600060208201905081810360008301526135b18161313a565b9050919050565b600060208201905081810360008301526135d18161315d565b9050919050565b600060208201905081810360008301526135f181613180565b9050919050565b60006020820190508181036000830152613611816131a3565b9050919050565b60006020820190508181036000830152613631816131c6565b9050919050565b60006020820190508181036000830152613651816131e9565b9050919050565b600060208201905081810360008301526136718161320c565b9050919050565b6000602082019050818103600083015261369181613252565b9050919050565b600060208201905081810360008301526136b181613275565b9050919050565b600060208201905081810360008301526136d181613298565b9050919050565b60006020820190506136ed60008301846132ca565b92915050565b60006136fd61370e565b905061370982826139fe565b919050565b6000604051905090565b600067ffffffffffffffff82111561373357613732613b36565b5b61373c82613b65565b9050602081019050919050565b600067ffffffffffffffff82111561376457613763613b36565b5b61376d82613b65565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061380c82613980565b915061381783613980565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561384c5761384b613aa9565b5b828201905092915050565b600061386282613980565b915061386d83613980565b92508261387d5761387c613ad8565b5b828204905092915050565b600061389382613980565b915061389e83613980565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138d7576138d6613aa9565b5b828202905092915050565b60006138ed82613980565b91506138f883613980565b92508282101561390b5761390a613aa9565b5b828203905092915050565b600061392182613960565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156139b757808201518184015260208101905061399c565b838111156139c6576000848401525b50505050565b600060028204905060018216806139e457607f821691505b602082108114156139f8576139f7613b07565b5b50919050565b613a0782613b65565b810181811067ffffffffffffffff82111715613a2657613a25613b36565b5b80604052505050565b6000613a3a82613980565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a6d57613a6c613aa9565b5b600182019050919050565b6000613a8382613980565b9150613a8e83613980565b925082613a9e57613a9d613ad8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4e6f7420656e6f756768204e465473206c65667420746f207265736572766500600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f7420656e6f75676820657468657220746f207075726368617365204e465460008201527f732e000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768204e465473206c656674210000000000000000000000600082015250565b7f43616e6e6f74206d696e7420737065636966696564206e756d626572206f662060008201527f4e4654732e000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4e6f206574686572206c65667420746f20776974686472617700000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6141ba81613916565b81146141c557600080fd5b50565b6141d181613928565b81146141dc57600080fd5b50565b6141e881613934565b81146141f357600080fd5b50565b6141ff81613980565b811461420a57600080fd5b5056fea2646970667358221220dbb56ffa0ef16d53b56dc70ac93f7b1c3eba45cd6b47475ad832e39dca7a355664736f6c63430008040033", 569 | "linkReferences": {}, 570 | "deployedLinkReferences": {} 571 | } 572 | --------------------------------------------------------------------------------