From d616ae13ce0784a6fc155482b9f09708eaf6f183 Mon Sep 17 00:00:00 2001 From: Blaine Malone Date: Fri, 2 Aug 2024 11:03:16 -0400 Subject: [PATCH 01/59] fix(ci-builder-foundry-bump): Updating ci-builder. (#11325) --- versions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/versions.json b/versions.json index da14eb148d56..57327d62159d 100644 --- a/versions.json +++ b/versions.json @@ -1,6 +1,6 @@ { "abigen": "v1.10.25", - "foundry": "63fff3510408b552f11efb8196f48cfe6c1da664", + "foundry": "626221f5ef44b4af950a08e09bd714650d9eb77d", "geth": "v1.13.14", "eth2_testnet_genesis": "v0.10.0", "nvm": "v20.9.0", From 794c69213a4b84a7982c33d64b70ae941f82aa80 Mon Sep 17 00:00:00 2001 From: protolambda Date: Fri, 2 Aug 2024 13:44:45 -0600 Subject: [PATCH 02/59] Snapshots go scripts (#11338) * contracts-bedrock: Go version of generate-invariant-docs * contracts-bedrock: Go version of generate-snapshots --- packages/contracts-bedrock/package.json | 4 +- .../autogen/generate-invariant-docs.ts | 170 ----------- .../autogen/generate-invariant-docs/main.go | 264 ++++++++++++++++++ .../scripts/autogen/generate-snapshots.ts | 163 ----------- .../autogen/generate-snapshots/main.go | 251 +++++++++++++++++ 5 files changed, 517 insertions(+), 335 deletions(-) delete mode 100644 packages/contracts-bedrock/scripts/autogen/generate-invariant-docs.ts create mode 100644 packages/contracts-bedrock/scripts/autogen/generate-invariant-docs/main.go delete mode 100644 packages/contracts-bedrock/scripts/autogen/generate-snapshots.ts create mode 100644 packages/contracts-bedrock/scripts/autogen/generate-snapshots/main.go diff --git a/packages/contracts-bedrock/package.json b/packages/contracts-bedrock/package.json index 19ca43cde30a..c26b79e39e3d 100644 --- a/packages/contracts-bedrock/package.json +++ b/packages/contracts-bedrock/package.json @@ -17,7 +17,7 @@ "prebuild": "./scripts/checks/check-foundry-install.sh", "build": "forge build", "build:go-ffi": "(cd scripts/go-ffi && go build)", - "autogen:invariant-docs": "npx tsx scripts/autogen/generate-invariant-docs.ts", + "autogen:invariant-docs": "go run ./scripts/autogen/generate-invariant-docs .", "test": "pnpm build:go-ffi && forge test", "test:kontrol": "./test/kontrol/scripts/run-kontrol.sh script", "genesis": "forge script scripts/L2Genesis.s.sol:L2Genesis --sig 'runWithStateDump()'", @@ -29,7 +29,7 @@ "gas-snapshot": "pnpm build:go-ffi && pnpm gas-snapshot:no-build", "kontrol-summary": "./test/kontrol/scripts/make-summary-deployment.sh", "kontrol-summary-fp": "KONTROL_FP_DEPLOYMENT=true pnpm kontrol-summary", - "snapshots": "forge build && npx tsx scripts/autogen/generate-snapshots.ts && pnpm kontrol-summary-fp && pnpm kontrol-summary", + "snapshots": "forge build && go run ./scripts/autogen/generate-snapshots . && pnpm kontrol-summary-fp && pnpm kontrol-summary", "snapshots:check": "./scripts/checks/check-snapshots.sh", "semver-lock": "forge script scripts/SemverLock.s.sol", "validate-deploy-configs": "./scripts/checks/check-deploy-configs.sh", diff --git a/packages/contracts-bedrock/scripts/autogen/generate-invariant-docs.ts b/packages/contracts-bedrock/scripts/autogen/generate-invariant-docs.ts deleted file mode 100644 index 2c01e2617ef4..000000000000 --- a/packages/contracts-bedrock/scripts/autogen/generate-invariant-docs.ts +++ /dev/null @@ -1,170 +0,0 @@ -import fs from 'fs' -import path from 'path' - -const ROOT_DIR = path.join(__dirname, '..', '..') -const BASE_INVARIANTS_DIR = path.join(ROOT_DIR, 'test', 'invariants') -const BASE_DOCS_DIR = path.join(ROOT_DIR, 'invariant-docs') -const BASE_INVARIANT_GH_URL = '../test/invariants/' -const NATSPEC_INV = '@custom:invariant' - -// Represents an invariant test contract -type Contract = { - name: string - fileName: string - docs: InvariantDoc[] -} - -// Represents the documentation of an invariant -type InvariantDoc = { - header?: string - desc?: string - lineNo?: number -} - -const writtenFiles = [] - -// Lazy-parses all test files in the `test/invariants` directory -// to generate documentation on all invariant tests. -const docGen = (dir: string): void => { - // Grab all files within the invariants test dir - const files = fs.readdirSync(dir) - - // Array to store all found invariant documentation comments. - const docs: Contract[] = [] - - for (const fileName of files) { - // Read the contents of the invariant test file. - const fileContents = fs.readFileSync(path.join(dir, fileName)).toString() - - // Split the file into individual lines and trim whitespace. - const lines = fileContents.split('\n').map((line: string) => line.trim()) - - // Create an object to store all invariant test docs for the current contract - const name = fileName.replace('.t.sol', '') - const contract: Contract = { name, fileName, docs: [] } - - let currentDoc: InvariantDoc - - // Loop through all lines to find comments. - for (let i = 0; i < lines.length; i++) { - let line = lines[i] - - // We have an invariant doc - if (line.startsWith(`/// ${NATSPEC_INV}`)) { - // Assign the header of the invariant doc. - // TODO: Handle ambiguous case for `INVARIANT: ` prefix. - currentDoc = { - header: line.replace(`/// ${NATSPEC_INV}`, '').trim(), - desc: '', - } - - // If the header is multi-line, continue appending to the `currentDoc`'s header. - line = lines[++i] - while (line.startsWith(`///`) && line.trim() !== '///') { - currentDoc.header += ` ${line.replace(`///`, '').trim()}` - line = lines[++i] - } - - // Process the description - while ((line = lines[++i]).startsWith('///')) { - line = line.replace('///', '').trim() - - // If the line has any contents, insert it into the desc. - // Otherwise, consider it a linebreak. - currentDoc.desc += line.length > 0 ? `${line} ` : '\n' - } - - // Set the line number of the test - currentDoc.lineNo = i + 1 - - // Add the doc to the contract - contract.docs.push(currentDoc) - } - } - - // Add the contract to the array of docs - docs.push(contract) - } - - for (const contract of docs) { - const fileName = path.join(BASE_DOCS_DIR, `${contract.name}.md`) - const alreadyWritten = writtenFiles.includes(fileName) - - // If the file has already been written, append the extra docs to the end. - // Otherwise, write the file from scratch. - fs.writeFileSync( - fileName, - alreadyWritten - ? `${fs.readFileSync(fileName)}\n${renderContractDoc(contract, false)}` - : renderContractDoc(contract, true) - ) - - // If the file was just written for the first time, add it to the list of written files. - if (!alreadyWritten) { - writtenFiles.push(fileName) - } - } - - console.log( - `Generated invariant test documentation for:\n - ${ - docs.length - } contracts\n - ${docs.reduce( - (acc: number, contract: Contract) => acc + contract.docs.length, - 0 - )} invariant tests\nsuccessfully!` - ) -} - -// Generate a table of contents for all invariant docs and place it in the README. -const tocGen = (): void => { - const autoTOCPrefix = '\n' - const autoTOCPostfix = '\n' - - // Grab the name of all markdown files in `BASE_DOCS_DIR` except for `README.md`. - const files = fs - .readdirSync(BASE_DOCS_DIR) - .filter((fileName: string) => fileName !== 'README.md') - - // Generate a table of contents section. - const tocList = files - .map( - (fileName: string) => `- [${fileName.replace('.md', '')}](./${fileName})` - ) - .join('\n') - const toc = `${autoTOCPrefix}\n## Table of Contents\n${tocList}\n${autoTOCPostfix}` - - // Write the table of contents to the README. - const readmeContents = fs - .readFileSync(path.join(BASE_DOCS_DIR, 'README.md')) - .toString() - const above = readmeContents.split(autoTOCPrefix)[0] - const below = readmeContents.split(autoTOCPostfix)[1] - fs.writeFileSync( - path.join(BASE_DOCS_DIR, 'README.md'), - `${above}${toc}${below}` - ) -} - -// Render a `Contract` object into valid markdown. -const renderContractDoc = (contract: Contract, header: boolean): string => { - const _header = header ? `# \`${contract.name}\` Invariants\n` : '' - const docs = contract.docs - .map((doc: InvariantDoc) => { - const line = `${contract.fileName}#L${doc.lineNo}` - return `## ${doc.header}\n**Test:** [\`${line}\`](${BASE_INVARIANT_GH_URL}${line})\n\n${doc.desc}` - }) - .join('\n\n') - return `${_header}\n${docs}` -} - -// Generate the docs - -// Forge -console.log('Generating docs for forge invariants...') -docGen(BASE_INVARIANTS_DIR) - -// New line -console.log() - -// Generate an updated table of contents -tocGen() diff --git a/packages/contracts-bedrock/scripts/autogen/generate-invariant-docs/main.go b/packages/contracts-bedrock/scripts/autogen/generate-invariant-docs/main.go new file mode 100644 index 000000000000..f408095483b3 --- /dev/null +++ b/packages/contracts-bedrock/scripts/autogen/generate-invariant-docs/main.go @@ -0,0 +1,264 @@ +package main + +import ( + "flag" + "fmt" + "os" + "path/filepath" + "strings" +) + +const ( + NatspecInv = "@custom:invariant" + BaseInvariantGhUrl = "../test/invariants/" +) + +// Contract represents an invariant test contract +type Contract struct { + Name string + FileName string + Docs []InvariantDoc +} + +// InvariantDoc represents the documentation of an invariant +type InvariantDoc struct { + Header string + Desc string + LineNo int +} + +var writtenFiles []string + +// Generate the docs +func main() { + flag.Parse() + if flag.NArg() != 1 { + fmt.Println("Expected path of contracts-bedrock as CLI argument") + os.Exit(1) + } + rootDir := flag.Arg(0) + + invariantsDir := filepath.Join(rootDir, "test/invariants") + fmt.Printf("invariants dir: %s\n", invariantsDir) + docsDir := filepath.Join(rootDir, "invariant-docs") + fmt.Printf("invariant docs dir: %s\n", docsDir) + + // Forge + fmt.Println("Generating docs for forge invariants...") + if err := docGen(invariantsDir, docsDir); err != nil { + fmt.Printf("Failed to generate invariant docs: %v\n", err) + os.Exit(1) + } + + fmt.Println("Generating table-of-contents...") + // Generate an updated table of contents + if err := tocGen(docsDir); err != nil { + fmt.Printf("Failed to generate TOC of docs: %v\n", err) + os.Exit(1) + } + fmt.Println("Done!") +} + +// Lazy-parses all test files in the `test/invariants` directory +// to generate documentation on all invariant tests. +func docGen(invariantsDir, docsDir string) error { + + // Grab all files within the invariants test dir + files, err := os.ReadDir(invariantsDir) + if err != nil { + return fmt.Errorf("error reading directory: %w", err) + } + + // Array to store all found invariant documentation comments. + var docs []Contract + + for _, file := range files { + // Read the contents of the invariant test file. + fileName := file.Name() + filePath := filepath.Join(invariantsDir, fileName) + fileContents, err := os.ReadFile(filePath) + if err != nil { + return fmt.Errorf("error reading file %q: %w", filePath, err) + } + + // Split the file into individual lines and trim whitespace. + lines := strings.Split(string(fileContents), "\n") + for i, line := range lines { + lines[i] = strings.TrimSpace(line) + } + + // Create an object to store all invariant test docs for the current contract + name := strings.Replace(fileName, ".t.sol", "", 1) + contract := Contract{Name: name, FileName: fileName} + + var currentDoc InvariantDoc + + // Loop through all lines to find comments. + for i := 0; i < len(lines); i++ { + line := lines[i] + + // We have an invariant doc + if strings.HasPrefix(line, "/// "+NatspecInv) { + // Assign the header of the invariant doc. + currentDoc = InvariantDoc{ + Header: strings.TrimSpace(strings.Replace(line, "/// "+NatspecInv, "", 1)), + Desc: "", + } + i++ + + // If the header is multi-line, continue appending to the `currentDoc`'s header. + for { + if i >= len(lines) { + break + } + line = lines[i] + i++ + if !(strings.HasPrefix(line, "///") && strings.TrimSpace(line) != "///") { + break + } + currentDoc.Header += " " + strings.TrimSpace(strings.Replace(line, "///", "", 1)) + } + + // Process the description + for { + if i >= len(lines) { + break + } + line = lines[i] + i++ + if !strings.HasPrefix(line, "///") { + break + } + line = strings.TrimSpace(strings.Replace(line, "///", "", 1)) + + // If the line has any contents, insert it into the desc. + // Otherwise, consider it a linebreak. + if len(line) > 0 { + currentDoc.Desc += line + " " + } else { + currentDoc.Desc += "\n" + } + } + + // Set the line number of the test + currentDoc.LineNo = i + + // Add the doc to the contract + contract.Docs = append(contract.Docs, currentDoc) + } + } + + // Add the contract to the array of docs + docs = append(docs, contract) + } + + for _, contract := range docs { + filePath := filepath.Join(docsDir, contract.Name+".md") + alreadyWritten := contains(writtenFiles, filePath) + + // If the file has already been written, append the extra docs to the end. + // Otherwise, write the file from scratch. + var fileContent string + if alreadyWritten { + existingContent, err := os.ReadFile(filePath) + if err != nil { + return fmt.Errorf("error reading existing file %q: %w", filePath, err) + } + fileContent = string(existingContent) + "\n" + renderContractDoc(contract, false) + } else { + fileContent = renderContractDoc(contract, true) + } + + err = os.WriteFile(filePath, []byte(fileContent), 0644) + if err != nil { + return fmt.Errorf("error writing file %q: %w", filePath, err) + } + + if !alreadyWritten { + writtenFiles = append(writtenFiles, filePath) + } + } + + _, _ = fmt.Fprintf(os.Stderr, + "Generated invariant test documentation for:\n"+ + " - %d contracts\n"+ + " - %d invariant tests\n"+ + "successfully!\n", + len(docs), + func() int { + total := 0 + for _, contract := range docs { + total += len(contract.Docs) + } + return total + }(), + ) + return nil +} + +// Generate a table of contents for all invariant docs and place it in the README. +func tocGen(docsDir string) error { + autoTOCPrefix := "\n" + autoTOCPostfix := "\n" + + files, err := os.ReadDir(docsDir) + if err != nil { + return fmt.Errorf("error reading directory %q: %w", docsDir, err) + } + + // Generate a table of contents section. + var tocList []string + for _, file := range files { + fileName := file.Name() + if fileName != "README.md" { + tocList = append(tocList, fmt.Sprintf("- [%s](./%s)", strings.Replace(fileName, ".md", "", 1), fileName)) + } + } + toc := fmt.Sprintf("%s\n## Table of Contents\n%s\n%s", + autoTOCPrefix, strings.Join(tocList, "\n"), autoTOCPostfix) + + // Write the table of contents to the README. + readmePath := filepath.Join(docsDir, "README.md") + readmeContents, err := os.ReadFile(readmePath) + if err != nil { + return fmt.Errorf("error reading README file %q: %w", readmePath, err) + } + readmeParts := strings.Split(string(readmeContents), autoTOCPrefix) + above := readmeParts[0] + readmeParts = strings.Split(readmeParts[1], autoTOCPostfix) + below := readmeParts[1] + err = os.WriteFile(readmePath, []byte(above+toc+below), 0644) + if err != nil { + return fmt.Errorf("error writing README file %q: %w", readmePath, err) + } + return nil +} + +// Render a `Contract` object into valid markdown. +func renderContractDoc(contract Contract, header bool) string { + var sb strings.Builder + + if header { + sb.WriteString(fmt.Sprintf("# `%s` Invariants\n", contract.Name)) + } + sb.WriteString("\n") + + for i, doc := range contract.Docs { + line := fmt.Sprintf("%s#L%d", contract.FileName, doc.LineNo) + sb.WriteString(fmt.Sprintf("## %s\n**Test:** [`%s`](%s%s)\n\n%s", doc.Header, line, BaseInvariantGhUrl, line, doc.Desc)) + if i != len(contract.Docs)-1 { + sb.WriteString("\n\n") + } + } + + return sb.String() +} + +func contains(slice []string, item string) bool { + for _, v := range slice { + if v == item { + return true + } + } + return false +} diff --git a/packages/contracts-bedrock/scripts/autogen/generate-snapshots.ts b/packages/contracts-bedrock/scripts/autogen/generate-snapshots.ts deleted file mode 100644 index fcfc59b89950..000000000000 --- a/packages/contracts-bedrock/scripts/autogen/generate-snapshots.ts +++ /dev/null @@ -1,163 +0,0 @@ -import fs from 'fs' -import path from 'path' - -const root = path.join(__dirname, '..', '..') -const outdir = process.argv[2] || path.join(root, 'snapshots') -const forgeArtifactsDir = path.join(root, 'forge-artifacts') - -const getAllContractsSources = (): Array => { - const paths = [] - const readFilesRecursively = (dir: string) => { - const files = fs.readdirSync(dir) - - for (const file of files) { - const filePath = path.join(dir, file) - const fileStat = fs.statSync(filePath) - - if (fileStat.isDirectory()) { - readFilesRecursively(filePath) - } else { - paths.push(filePath) - } - } - } - readFilesRecursively(path.join(root, 'src')) - - return paths - .filter((x) => x.endsWith('.sol')) - .map((p: string) => path.basename(p)) - .sort() -} - -type ForgeArtifact = { - abi: object - ast: { - nodeType: string - nodes: any[] - } - storageLayout: { - storage: [{ type: string; label: string; offset: number; slot: number }] - types: { [key: string]: { label: string; numberOfBytes: number } } - } - bytecode: { - object: string - } -} - -type AbiSpecStorageLayoutEntry = { - label: string - slot: number - offset: number - bytes: number - type: string -} -const sortKeys = (obj: any) => { - if (typeof obj !== 'object' || obj === null) { - return obj - } - return Object.keys(obj) - .sort() - .reduce( - (acc, key) => { - acc[key] = sortKeys(obj[key]) - return acc - }, - Array.isArray(obj) ? [] : {} - ) -} - -// ContractName.0.9.8.json -> ContractName.sol -// ContractName.json -> ContractName.sol -const parseArtifactName = (artifactVersionFile: string): string => { - const match = artifactVersionFile.match(/(.*?)\.([0-9]+\.[0-9]+\.[0-9]+)?/) - if (!match) { - throw new Error(`Invalid artifact file name: ${artifactVersionFile}`) - } - return match[1] -} - -const main = async () => { - console.log(`writing abi and storage layout snapshots to ${outdir}`) - - const storageLayoutDir = path.join(outdir, 'storageLayout') - const abiDir = path.join(outdir, 'abi') - fs.rmSync(storageLayoutDir, { recursive: true }) - fs.rmSync(abiDir, { recursive: true }) - fs.mkdirSync(storageLayoutDir, { recursive: true }) - fs.mkdirSync(abiDir, { recursive: true }) - - const contractSources = getAllContractsSources() - const knownAbis = {} - - for (const contractFile of contractSources) { - const contractArtifacts = path.join(forgeArtifactsDir, contractFile) - for (const name of fs.readdirSync(contractArtifacts)) { - const data = fs.readFileSync(path.join(contractArtifacts, name)) - const artifact: ForgeArtifact = JSON.parse(data.toString()) - - const contractName = parseArtifactName(name) - - // HACK: This is a hack to ignore libraries and abstract contracts. Not robust against changes to solc's internal ast repr - if (artifact.ast === undefined) { - throw new Error( - "ast isn't present in forge-artifacts. Did you run forge build with `--ast`?" - ) - } - const isContract = artifact.ast.nodes.some((node: any) => { - return ( - node.nodeType === 'ContractDefinition' && - node.name === contractName && - node.contractKind === 'contract' && - (node.abstract === undefined || // solc < 0.6 doesn't have explicit abstract contracts - node.abstract === false) - ) - }) - if (!isContract) { - console.log(`ignoring library/interface ${contractName}`) - continue - } - - const storageLayout: AbiSpecStorageLayoutEntry[] = [] - for (const storageEntry of artifact.storageLayout.storage) { - // convert ast-based type to solidity type - const typ = artifact.storageLayout.types[storageEntry.type] - if (typ === undefined) { - throw new Error( - `undefined type for ${contractName}:${storageEntry.label}` - ) - } - storageLayout.push({ - label: storageEntry.label, - bytes: typ.numberOfBytes, - offset: storageEntry.offset, - slot: storageEntry.slot, - type: typ.label, - }) - } - - if (knownAbis[contractName] === undefined) { - knownAbis[contractName] = artifact.abi - } else if ( - JSON.stringify(knownAbis[contractName]) !== JSON.stringify(artifact.abi) - ) { - throw Error( - `detected multiple artifact versions with different ABIs for ${contractFile}` - ) - } else { - console.log(`detected multiple artifacts for ${contractName}`) - } - - // Sort snapshots for easier manual inspection - fs.writeFileSync( - `${abiDir}/${contractName}.json`, - JSON.stringify(sortKeys(artifact.abi), null, 2) - ) - fs.writeFileSync( - `${storageLayoutDir}/${contractName}.json`, - JSON.stringify(sortKeys(storageLayout), null, 2) - ) - } - } -} - -main() diff --git a/packages/contracts-bedrock/scripts/autogen/generate-snapshots/main.go b/packages/contracts-bedrock/scripts/autogen/generate-snapshots/main.go new file mode 100644 index 000000000000..c446af7a0c80 --- /dev/null +++ b/packages/contracts-bedrock/scripts/autogen/generate-snapshots/main.go @@ -0,0 +1,251 @@ +package main + +import ( + "bytes" + "encoding/json" + "flag" + "fmt" + "os" + "path/filepath" + "regexp" + "sort" +) + +type ForgeArtifact struct { + // ABI is a nested JSON data structure, including some objects/maps. + // We declare it as interface, and not raw-message, such that Go decodes into map[string]interface{} + // where possible. The JSON-encoder will then sort the keys (default Go JSON behavior on maps), + // to reproduce the sortKeys(abi) result of the legacy Typescript version of the snapshort-generator. + ABI interface{} `json:"abi"` + Ast *struct { + NodeType string `json:"nodeType"` + Nodes []struct { + NodeType string `json:"nodeType"` + Name string `json:"name"` + ContractKind string `json:"contractKind"` + Abstract bool `json:"abstract"` + } `json:"nodes"` + } `json:"ast"` + StorageLayout struct { + Storage []struct { + Type string `json:"type"` + Label json.RawMessage `json:"label"` + Offset json.RawMessage `json:"offset"` + Slot json.RawMessage `json:"slot"` + } `json:"storage"` + Types map[string]struct { + Label string `json:"label"` + NumberOfBytes json.RawMessage `json:"numberOfBytes"` + } `json:"types"` + } `json:"storageLayout"` + Bytecode struct { + Object string `json:"object"` + } `json:"bytecode"` +} + +type AbiSpecStorageLayoutEntry struct { + Bytes json.RawMessage `json:"bytes"` + Label json.RawMessage `json:"label"` + Offset json.RawMessage `json:"offset"` + Slot json.RawMessage `json:"slot"` + Type string `json:"type"` +} + +func main() { + flag.Parse() + if flag.NArg() != 1 { + fmt.Println("Expected path of contracts-bedrock as CLI argument") + os.Exit(1) + } + rootDir := flag.Arg(0) + err := generateSnapshots(rootDir) + if err != nil { + fmt.Printf("Failed to generate snapshots: %v\n", err) + os.Exit(1) + } +} + +func generateSnapshots(rootDir string) error { + + forgeArtifactsDir := filepath.Join(rootDir, "forge-artifacts") + srcDir := filepath.Join(rootDir, "src") + outDir := filepath.Join(rootDir, "snapshots") + + storageLayoutDir := filepath.Join(outDir, "storageLayout") + abiDir := filepath.Join(outDir, "abi") + + fmt.Printf("writing abi and storage layout snapshots to %s\n", outDir) + + // Clean and recreate directories + if err := os.RemoveAll(storageLayoutDir); err != nil { + return fmt.Errorf("failed to remove storage layout dir: %w", err) + } + if err := os.RemoveAll(abiDir); err != nil { + return fmt.Errorf("failed to remove ABI dir: %w", err) + } + if err := os.MkdirAll(storageLayoutDir, os.ModePerm); err != nil { + return fmt.Errorf("failed to create storage layout dir: %w", err) + } + if err := os.MkdirAll(abiDir, os.ModePerm); err != nil { + return fmt.Errorf("failed to create ABI dir: %w", err) + } + + contractSources, err := getAllContractsSources(srcDir) + if err != nil { + return fmt.Errorf("failed to retrieve contract sources: %w", err) + } + + knownAbis := make(map[string]interface{}) + + for _, contractFile := range contractSources { + contractArtifacts := filepath.Join(forgeArtifactsDir, contractFile) + files, err := os.ReadDir(contractArtifacts) + if err != nil { + return fmt.Errorf("failed to scan contract artifacts of %q: %w", contractFile, err) + } + + for _, file := range files { + artifactPath := filepath.Join(contractArtifacts, file.Name()) + data, err := os.ReadFile(artifactPath) + if err != nil { + return fmt.Errorf("failed to read artifact %q: %w", artifactPath, err) + } + var artifact ForgeArtifact + if err := json.Unmarshal(data, &artifact); err != nil { + return fmt.Errorf("failed to decode artifact %q: %w", artifactPath, err) + } + + contractName, err := parseArtifactName(file.Name()) + if err != nil { + return fmt.Errorf("failed to parse artifact name %q: %w", file.Name(), err) + } + + // HACK: This is a hack to ignore libraries and abstract contracts. Not robust against changes to solc's internal ast repr + if artifact.Ast == nil { + return fmt.Errorf("ast isn't present in forge-artifacts. Did you run forge build with `--ast`? Artifact: %s", artifactPath) + } + // Check if the artifact is a contract + isContract := false + for _, node := range artifact.Ast.Nodes { + if node.NodeType == "ContractDefinition" && + node.Name == contractName && + node.ContractKind == "contract" && + !node.Abstract { + isContract = true + break + } + } + if !isContract { + fmt.Printf("ignoring library/interface %s\n", contractName) + continue + } + + storageLayout := make([]AbiSpecStorageLayoutEntry, 0, len(artifact.StorageLayout.Storage)) + for _, storageEntry := range artifact.StorageLayout.Storage { + // convert ast-based type to solidity type + typ, ok := artifact.StorageLayout.Types[storageEntry.Type] + if !ok { + return fmt.Errorf("undefined type for %s:%s", contractName, storageEntry.Label) + } + storageLayout = append(storageLayout, AbiSpecStorageLayoutEntry{ + Label: storageEntry.Label, + Bytes: typ.NumberOfBytes, + Offset: storageEntry.Offset, + Slot: storageEntry.Slot, + Type: typ.Label, + }) + } + + if existingAbi, exists := knownAbis[contractName]; exists { + if !jsonEqual(existingAbi, artifact.ABI) { + return fmt.Errorf("detected multiple artifact versions with different ABIs for %s", contractFile) + } else { + fmt.Printf("detected multiple artifacts for %s\n", contractName) + } + } else { + knownAbis[contractName] = artifact.ABI + } + + // Sort and write snapshots + if err := writeJSON(filepath.Join(abiDir, contractName+".json"), artifact.ABI); err != nil { + return fmt.Errorf("failed to write ABI snapshot JSON of %q: %w", contractName, err) + } + + if err := writeJSON(filepath.Join(storageLayoutDir, contractName+".json"), storageLayout); err != nil { + return fmt.Errorf("failed to write storage layout snapshot JSON of %q: %w", contractName, err) + } + } + } + return nil +} + +func getAllContractsSources(srcDir string) ([]string, error) { + var paths []string + if err := readFilesRecursively(srcDir, &paths); err != nil { + return nil, fmt.Errorf("failed to retrieve files: %w", err) + } + + var solFiles []string + for _, p := range paths { + if filepath.Ext(p) == ".sol" { + solFiles = append(solFiles, filepath.Base(p)) + } + } + sort.Strings(solFiles) + return solFiles, nil +} + +func readFilesRecursively(dir string, paths *[]string) error { + files, err := os.ReadDir(dir) + if err != nil { + return err + } + + for _, file := range files { + filePath := filepath.Join(dir, file.Name()) + if file.IsDir() { + if err := readFilesRecursively(filePath, paths); err != nil { + return fmt.Errorf("failed to recurse into %q: %w", filePath, err) + } + } else { + *paths = append(*paths, filePath) + } + } + return nil +} + +// ContractName.0.9.8.json -> ContractName.sol +// ContractName.json -> ContractName.sol +func parseArtifactName(artifactVersionFile string) (string, error) { + re := regexp.MustCompile(`(.*?)\.([0-9]+\.[0-9]+\.[0-9]+)?`) + match := re.FindStringSubmatch(artifactVersionFile) + if len(match) < 2 { + return "", fmt.Errorf("invalid artifact file name: %q", artifactVersionFile) + } + return match[1], nil +} + +func writeJSON(filename string, data interface{}) error { + var out bytes.Buffer + enc := json.NewEncoder(&out) + enc.SetEscapeHTML(false) + enc.SetIndent("", " ") + err := enc.Encode(data) + if err != nil { + return fmt.Errorf("failed to encode data: %w", err) + } + jsonData := out.Bytes() + if len(jsonData) > 0 && jsonData[len(jsonData)-1] == '\n' { // strip newline + jsonData = jsonData[:len(jsonData)-1] + } + if err := os.WriteFile(filename, jsonData, 0644); err != nil { + return fmt.Errorf("failed to write file: %w", err) + } + return nil +} + +func jsonEqual(a, b interface{}) bool { + jsonA, errA := json.Marshal(a) + jsonB, errB := json.Marshal(b) + return errA == nil && errB == nil && string(jsonA) == string(jsonB) +} From e0c733d5382e60aaa525e3c7c1558e6401a3f798 Mon Sep 17 00:00:00 2001 From: Miki Noir Date: Fri, 2 Aug 2024 22:22:01 +0200 Subject: [PATCH 03/59] devnet: Update expired docs link (#11329) * delete expired docs link * use the official doc --- packages/contracts-bedrock/CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/contracts-bedrock/CONTRIBUTING.md b/packages/contracts-bedrock/CONTRIBUTING.md index 63c579dedf2f..b917d04fab3f 100644 --- a/packages/contracts-bedrock/CONTRIBUTING.md +++ b/packages/contracts-bedrock/CONTRIBUTING.md @@ -82,7 +82,7 @@ Documentation improvements are more than welcome! If you see a typo or feel that ### Deploying on Devnet -To deploy the smart contracts on a local devnet, run `make devnet-up` in the monorepo root. For more information on the local devnet, see [devnet.md](../../specs/meta/devnet.md). +To deploy the smart contracts on a local devnet, run `make devnet-up` in the monorepo root. For more information on the local devnet, see [dev-node](https://docs.optimism.io/chain/testing/dev-node). ### Tools From 95a26147115276b5578bf8b961373d1f347387fe Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Fri, 2 Aug 2024 13:22:20 -0700 Subject: [PATCH 04/59] doc: update style guide (#11290) * doc: update style guide * apply suggestion from code review Co-authored-by: Maurelian * Update packages/contracts-bedrock/STYLE_GUIDE.md --------- Co-authored-by: Maurelian --- packages/contracts-bedrock/STYLE_GUIDE.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/contracts-bedrock/STYLE_GUIDE.md b/packages/contracts-bedrock/STYLE_GUIDE.md index cbe3debb1b3a..1d8b84818b9b 100644 --- a/packages/contracts-bedrock/STYLE_GUIDE.md +++ b/packages/contracts-bedrock/STYLE_GUIDE.md @@ -104,9 +104,15 @@ Unless explicitly discussed otherwise, you MUST include the following basic upgr pattern for each new implementation contract: 1. Extend OpenZeppelin's `Initializable` base contract. -2. Include a `uint8 public constant VERSION = X` at the TOP of your contract. -3. Include a function `initialize` with the modifier `reinitializer(VERSION)`. -4. In the `constructor`, set any `immutable` variables and call the `initialize` function for setting mutables. +2. Include a function `initialize` with the modifier `initializer()`. +3. In the `constructor`: + 1. Call `_disableInitializers()` to ensure the implementation contract cannot be initialized. + 2. Set any immutables. However, we generally prefer to not use immutables to ensure the same implementation contracts can be used for all chains, and to allow chain operators to dynamically configure parameters + +Because `reinitializer(uint64 version)` is not used, the process for upgrading the implementation is to atomically: +1. Upgrade the implementation to the `StorageSetter` contract. +2. Use that to set the initialized slot (typically slot 0) to zero. +3. Upgrade the implementation to the desired new implementation and `initialize` it. ### Versioning From e1c7dbe2c420ffe13d352e7f47d8b5c5f09434b8 Mon Sep 17 00:00:00 2001 From: Sebastian Stammler Date: Fri, 2 Aug 2024 23:47:49 +0200 Subject: [PATCH 05/59] Add Granite and Holocene fork references (#11339) --- go.mod | 2 +- go.sum | 4 +-- op-node/rollup/chain_spec.go | 14 +++++++++ op-node/rollup/superchain.go | 1 + op-node/rollup/types.go | 56 ++++++++++++++++++++++++++++++++---- op-node/service.go | 8 ++++++ op-service/flags/flags.go | 28 ++++++++++++++---- 7 files changed, 98 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 5229f5abd28f..9c1fcc9a9622 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/crate-crypto/go-kzg-4844 v0.7.0 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3 - github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240717194452-c01722001e88 + github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240801182704-4810f97b7ee9 github.com/ethereum/go-ethereum v1.13.15 github.com/fsnotify/fsnotify v1.7.0 github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb diff --git a/go.sum b/go.sum index b1ea2d72af9c..ca1dd5329dd5 100644 --- a/go.sum +++ b/go.sum @@ -173,8 +173,8 @@ github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3 h1:RWHKLhCrQThMfch+QJ1Z github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3/go.mod h1:QziizLAiF0KqyLdNJYD7O5cpDlaFMNZzlxYNcWsJUxs= github.com/ethereum-optimism/op-geth v1.101315.3-rc.1 h1:Q/B0FBdtglzsFtqurvUsiNfH8isCOFFF/pf9ss0L4eY= github.com/ethereum-optimism/op-geth v1.101315.3-rc.1/go.mod h1:h5C5tP+7gkMrlUGENuiV5ddlwJ4RxLdmdapRuTAGlnw= -github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240717194452-c01722001e88 h1:pNwXkcFBM230tLKbw9mju6P568x20G6H0ka9y8pKe70= -github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240717194452-c01722001e88/go.mod h1:zy9f3TNPS7pwW4msMitF83fp0Wf452tZ6+Fg6d4JyXM= +github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240801182704-4810f97b7ee9 h1:Yqi7oOCWRN3SMl3rL5zGYSHIw2MyuTJ1nqokSi7ejfU= +github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240801182704-4810f97b7ee9/go.mod h1:zy9f3TNPS7pwW4msMitF83fp0Wf452tZ6+Fg6d4JyXM= github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= diff --git a/op-node/rollup/chain_spec.go b/op-node/rollup/chain_spec.go index a94a7cd1d05e..1a5675596a4b 100644 --- a/op-node/rollup/chain_spec.go +++ b/op-node/rollup/chain_spec.go @@ -35,6 +35,8 @@ const ( Delta ForkName = "delta" Ecotone ForkName = "ecotone" Fjord ForkName = "fjord" + Granite ForkName = "granite" + Holocene ForkName = "holocene" Interop ForkName = "interop" None ForkName = "none" ) @@ -46,6 +48,8 @@ var nextFork = map[ForkName]ForkName{ Delta: Ecotone, Ecotone: Fjord, Fjord: Interop, + Granite: Granite, + Holocene: Holocene, Interop: None, } @@ -125,6 +129,12 @@ func (s *ChainSpec) CheckForkActivation(log log.Logger, block eth.L2BlockRef) { if s.config.IsFjord(block.Time) { s.currentFork = Fjord } + if s.config.IsGranite(block.Time) { + s.currentFork = Fjord + } + if s.config.IsHolocene(block.Time) { + s.currentFork = Fjord + } if s.config.IsInterop(block.Time) { s.currentFork = Interop } @@ -145,6 +155,10 @@ func (s *ChainSpec) CheckForkActivation(log log.Logger, block eth.L2BlockRef) { foundActivationBlock = s.config.IsEcotoneActivationBlock(block.Time) case Fjord: foundActivationBlock = s.config.IsFjordActivationBlock(block.Time) + case Granite: + foundActivationBlock = s.config.IsGraniteActivationBlock(block.Time) + case Holocene: + foundActivationBlock = s.config.IsHoloceneActivationBlock(block.Time) case Interop: foundActivationBlock = s.config.IsInteropActivationBlock(block.Time) } diff --git a/op-node/rollup/superchain.go b/op-node/rollup/superchain.go index d5106103f4ed..ad16989fb64a 100644 --- a/op-node/rollup/superchain.go +++ b/op-node/rollup/superchain.go @@ -86,6 +86,7 @@ func LoadOPStackRollupConfig(chainID uint64) (*Config, error) { DeltaTime: chConfig.DeltaTime, EcotoneTime: chConfig.EcotoneTime, FjordTime: chConfig.FjordTime, + GraniteTime: chConfig.GraniteTime, BatchInboxAddress: common.Address(chConfig.BatchInboxAddr), DepositContractAddress: common.Address(addrs.OptimismPortalProxy), L1SystemConfigAddress: common.Address(addrs.SystemConfigProxy), diff --git a/op-node/rollup/types.go b/op-node/rollup/types.go index 6e3f8282dbbb..892bcfa86bc4 100644 --- a/op-node/rollup/types.go +++ b/op-node/rollup/types.go @@ -109,6 +109,14 @@ type Config struct { // Active if FjordTime != nil && L2 block timestamp >= *FjordTime, inactive otherwise. FjordTime *uint64 `json:"fjord_time,omitempty"` + // GraniteTime sets the activation time of the Granite network upgrade. + // Active if GraniteTime != nil && L2 block timestamp >= *GraniteTime, inactive otherwise. + GraniteTime *uint64 `json:"granite_time,omitempty"` + + // HoloceneTime sets the activation time of the Holocene network upgrade. + // Active if HoloceneTime != nil && L2 block timestamp >= *HoloceneTime, inactive otherwise. + HoloceneTime *uint64 `json:"holocene_time,omitempty"` + // InteropTime sets the activation time for an experimental feature-set, activated like a hardfork. // Active if InteropTime != nil && L2 block timestamp >= *InteropTime, inactive otherwise. InteropTime *uint64 `json:"interop_time,omitempty"` @@ -322,6 +330,12 @@ func (cfg *Config) Check() error { if err := checkFork(cfg.EcotoneTime, cfg.FjordTime, Ecotone, Fjord); err != nil { return err } + if err := checkFork(cfg.FjordTime, cfg.GraniteTime, Fjord, Granite); err != nil { + return err + } + if err := checkFork(cfg.GraniteTime, cfg.HoloceneTime, Granite, Holocene); err != nil { + return err + } return nil } @@ -410,12 +424,14 @@ func (c *Config) IsFjord(timestamp uint64) bool { return c.FjordTime != nil && timestamp >= *c.FjordTime } -// IsFjordActivationBlock returns whether the specified block is the first block subject to the -// Fjord upgrade. -func (c *Config) IsFjordActivationBlock(l2BlockTime uint64) bool { - return c.IsFjord(l2BlockTime) && - l2BlockTime >= c.BlockTime && - !c.IsFjord(l2BlockTime-c.BlockTime) +// IsGranite returns true if the Granite hardfork is active at or past the given timestamp. +func (c *Config) IsGranite(timestamp uint64) bool { + return c.GraniteTime != nil && timestamp >= *c.GraniteTime +} + +// IsHolocene returns true if the Holocene hardfork is active at or past the given timestamp. +func (c *Config) IsHolocene(timestamp uint64) bool { + return c.HoloceneTime != nil && timestamp >= *c.HoloceneTime } // IsInterop returns true if the Interop hardfork is active at or past the given timestamp. @@ -449,6 +465,30 @@ func (c *Config) IsEcotoneActivationBlock(l2BlockTime uint64) bool { !c.IsEcotone(l2BlockTime-c.BlockTime) } +// IsFjordActivationBlock returns whether the specified block is the first block subject to the +// Fjord upgrade. +func (c *Config) IsFjordActivationBlock(l2BlockTime uint64) bool { + return c.IsFjord(l2BlockTime) && + l2BlockTime >= c.BlockTime && + !c.IsFjord(l2BlockTime-c.BlockTime) +} + +// IsGraniteActivationBlock returns whether the specified block is the first block subject to the +// Granite upgrade. +func (c *Config) IsGraniteActivationBlock(l2BlockTime uint64) bool { + return c.IsGranite(l2BlockTime) && + l2BlockTime >= c.BlockTime && + !c.IsGranite(l2BlockTime-c.BlockTime) +} + +// IsHoloceneActivationBlock returns whether the specified block is the first block subject to the +// Holocene upgrade. +func (c *Config) IsHoloceneActivationBlock(l2BlockTime uint64) bool { + return c.IsHolocene(l2BlockTime) && + l2BlockTime >= c.BlockTime && + !c.IsHolocene(l2BlockTime-c.BlockTime) +} + func (c *Config) IsInteropActivationBlock(l2BlockTime uint64) bool { return c.IsInterop(l2BlockTime) && l2BlockTime >= c.BlockTime && @@ -564,6 +604,8 @@ func (c *Config) Description(l2Chains map[string]string) string { banner += fmt.Sprintf(" - Delta: %s\n", fmtForkTimeOrUnset(c.DeltaTime)) banner += fmt.Sprintf(" - Ecotone: %s\n", fmtForkTimeOrUnset(c.EcotoneTime)) banner += fmt.Sprintf(" - Fjord: %s\n", fmtForkTimeOrUnset(c.FjordTime)) + banner += fmt.Sprintf(" - Granite: %s\n", fmtForkTimeOrUnset(c.GraniteTime)) + banner += fmt.Sprintf(" - Holocene: %s\n", fmtForkTimeOrUnset(c.HoloceneTime)) banner += fmt.Sprintf(" - Interop: %s\n", fmtForkTimeOrUnset(c.InteropTime)) // Report the protocol version banner += fmt.Sprintf("Node supports up to OP-Stack Protocol Version: %s\n", OPStackSupport) @@ -598,6 +640,8 @@ func (c *Config) LogDescription(log log.Logger, l2Chains map[string]string) { "delta_time", fmtForkTimeOrUnset(c.DeltaTime), "ecotone_time", fmtForkTimeOrUnset(c.EcotoneTime), "fjord_time", fmtForkTimeOrUnset(c.FjordTime), + "granite_time", fmtForkTimeOrUnset(c.GraniteTime), + "holocene_time", fmtForkTimeOrUnset(c.HoloceneTime), "interop_time", fmtForkTimeOrUnset(c.InteropTime), "plasma_mode", c.PlasmaConfig != nil, ) diff --git a/op-node/service.go b/op-node/service.go index 28afbfbd3d3c..10a053d8e178 100644 --- a/op-node/service.go +++ b/op-node/service.go @@ -260,6 +260,14 @@ func applyOverrides(ctx *cli.Context, rollupConfig *rollup.Config) { fjord := ctx.Uint64(opflags.FjordOverrideFlagName) rollupConfig.FjordTime = &fjord } + if ctx.IsSet(opflags.GraniteOverrideFlagName) { + granite := ctx.Uint64(opflags.GraniteOverrideFlagName) + rollupConfig.GraniteTime = &granite + } + if ctx.IsSet(opflags.HoloceneOverrideFlagName) { + holocene := ctx.Uint64(opflags.HoloceneOverrideFlagName) + rollupConfig.HoloceneTime = &holocene + } } func NewSyncConfig(ctx *cli.Context, log log.Logger) (*sync.Config, error) { diff --git a/op-service/flags/flags.go b/op-service/flags/flags.go index f607bbf73dd6..f8be269303b3 100644 --- a/op-service/flags/flags.go +++ b/op-service/flags/flags.go @@ -11,12 +11,14 @@ import ( ) const ( - RollupConfigFlagName = "rollup.config" - NetworkFlagName = "network" - CanyonOverrideFlagName = "override.canyon" - DeltaOverrideFlagName = "override.delta" - EcotoneOverrideFlagName = "override.ecotone" - FjordOverrideFlagName = "override.fjord" + RollupConfigFlagName = "rollup.config" + NetworkFlagName = "network" + CanyonOverrideFlagName = "override.canyon" + DeltaOverrideFlagName = "override.delta" + EcotoneOverrideFlagName = "override.ecotone" + FjordOverrideFlagName = "override.fjord" + GraniteOverrideFlagName = "override.granite" + HoloceneOverrideFlagName = "override.holocene" ) func CLIFlags(envPrefix string, category string) []cli.Flag { @@ -49,6 +51,20 @@ func CLIFlags(envPrefix string, category string) []cli.Flag { Hidden: false, Category: category, }, + &cli.Uint64Flag{ + Name: GraniteOverrideFlagName, + Usage: "Manually specify the Granite fork timestamp, overriding the bundled setting", + EnvVars: opservice.PrefixEnvVar(envPrefix, "OVERRIDE_GRANITE"), + Hidden: false, + Category: category, + }, + &cli.Uint64Flag{ + Name: HoloceneOverrideFlagName, + Usage: "Manually specify the Holocene fork timestamp, overriding the bundled setting", + EnvVars: opservice.PrefixEnvVar(envPrefix, "OVERRIDE_HOLOCENE"), + Hidden: false, + Category: category, + }, CLINetworkFlag(envPrefix, category), CLIRollupConfigFlag(envPrefix, category), } From 1819733ea74ded6aeea2142ffc3b0f81eea89b32 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Fri, 2 Aug 2024 16:12:39 -0700 Subject: [PATCH 06/59] fix: set default forge gas limit (#11342) --- packages/contracts-bedrock/foundry.toml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/contracts-bedrock/foundry.toml b/packages/contracts-bedrock/foundry.toml index 4b1dbdeba780..e5d8513f254a 100644 --- a/packages/contracts-bedrock/foundry.toml +++ b/packages/contracts-bedrock/foundry.toml @@ -29,6 +29,12 @@ ast = true evm_version = "cancun" ignored_error_codes = ["transient-storage", "code-size", "init-code-size"] +# We set the gas limit to max int64 to avoid running out of gas during testing, since the default +# gas limit is 1B and some of our tests require more gas than that, such as `test_callWithMinGas_noLeakageLow_succeeds`. +# We use this gas limit since it was the default gas limit prior to https://github.com/foundry-rs/foundry/pull/8274. +# Due to toml-rs limitations, if you increase the gas limit above this value it must be a string. +gas_limit = 9223372036854775807 + # Test / Script Runner Settings ffi = true fs_permissions = [ From f1ae7ea1606e5c45199998279f75bf6cbbffea1d Mon Sep 17 00:00:00 2001 From: Inphi Date: Fri, 2 Aug 2024 16:43:31 -0700 Subject: [PATCH 07/59] chain-spec: Fix next fork (#11341) --- op-node/rollup/chain_spec.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/op-node/rollup/chain_spec.go b/op-node/rollup/chain_spec.go index 1a5675596a4b..bdd219e4ae2a 100644 --- a/op-node/rollup/chain_spec.go +++ b/op-node/rollup/chain_spec.go @@ -47,9 +47,9 @@ var nextFork = map[ForkName]ForkName{ Canyon: Delta, Delta: Ecotone, Ecotone: Fjord, - Fjord: Interop, - Granite: Granite, - Holocene: Holocene, + Fjord: Granite, + Granite: Holocene, + Holocene: Interop, Interop: None, } From 4c9811f2a6348a3cb426e9a7695cc443ab7ff4ab Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Fri, 2 Aug 2024 16:56:25 -0700 Subject: [PATCH 08/59] fix: add missing assume condition (#11344) --- packages/contracts-bedrock/test/L2/ETHLiquidity.t.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/contracts-bedrock/test/L2/ETHLiquidity.t.sol b/packages/contracts-bedrock/test/L2/ETHLiquidity.t.sol index 2a3d999a1df6..d9d2d92a8928 100644 --- a/packages/contracts-bedrock/test/L2/ETHLiquidity.t.sol +++ b/packages/contracts-bedrock/test/L2/ETHLiquidity.t.sol @@ -57,6 +57,7 @@ contract ETHLiquidity_Test is CommonTest { function testFuzz_burn_fromUnauthorizedCaller_fails(uint256 _amount, address _caller) public { // Assume vm.assume(_caller != address(superchainWeth)); + vm.assume(_caller != address(ethLiquidity)); _amount = bound(_amount, 0, type(uint248).max - 1); // Arrange From 5e317379fae65b76f5a6ee27581f0e62d2fe017a Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Sat, 3 Aug 2024 03:05:33 +0300 Subject: [PATCH 09/59] contracts-bedrock: remove typescript (#11340) * contracts-bedrock: remove typescript Moves to using Go from typescript, new code is autogenerated by claude. Can confirm that both work as expected. The `check-test-names` is not running in CI, it fails for both the Go and Typescript scripts. Maybe claude will be able to get the script to pass. * Update check-spacers.go Co-authored-by: semgrep-app[bot] <63493438+semgrep-app[bot]@users.noreply.github.com> * Update packages/contracts-bedrock/scripts/checks/check-test-names.go Co-authored-by: semgrep-app[bot] <63493438+semgrep-app[bot]@users.noreply.github.com> * contracts-bedrock: fix build * scripts: rename * scripts: rename * scripts: fixes --------- Co-authored-by: protolambda Co-authored-by: semgrep-app[bot] <63493438+semgrep-app[bot]@users.noreply.github.com> --- packages/contracts-bedrock/package.json | 4 +- .../scripts/checks/check-spacers.ts | 152 --------------- .../scripts/checks/check-test-names.ts | 130 ------------- .../scripts/checks/names/main.go | 164 ++++++++++++++++ .../scripts/checks/spacers/main.go | 176 ++++++++++++++++++ 5 files changed, 342 insertions(+), 284 deletions(-) delete mode 100644 packages/contracts-bedrock/scripts/checks/check-spacers.ts delete mode 100644 packages/contracts-bedrock/scripts/checks/check-test-names.ts create mode 100644 packages/contracts-bedrock/scripts/checks/names/main.go create mode 100644 packages/contracts-bedrock/scripts/checks/spacers/main.go diff --git a/packages/contracts-bedrock/package.json b/packages/contracts-bedrock/package.json index c26b79e39e3d..1cf9873abb6a 100644 --- a/packages/contracts-bedrock/package.json +++ b/packages/contracts-bedrock/package.json @@ -33,14 +33,14 @@ "snapshots:check": "./scripts/checks/check-snapshots.sh", "semver-lock": "forge script scripts/SemverLock.s.sol", "validate-deploy-configs": "./scripts/checks/check-deploy-configs.sh", - "validate-spacers:no-build": "npx tsx scripts/checks/check-spacers.ts", + "validate-spacers:no-build": "go run ./scripts/checks/spacers", "validate-spacers": "pnpm build && pnpm validate-spacers:no-build", "clean": "rm -rf ./artifacts ./forge-artifacts ./cache ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./scripts/go-ffi/go-ffi ./.testdata ./deployments/hardhat/*", "pre-pr:no-build": "pnpm gas-snapshot:no-build && pnpm snapshots && pnpm semver-lock && pnpm autogen:invariant-docs && pnpm lint", "pre-pr": "pnpm clean && pnpm build:go-ffi && pnpm build && pnpm pre-pr:no-build", "pre-pr:full": "pnpm test && pnpm validate-deploy-configs && pnpm validate-spacers && pnpm pre-pr", "lint:ts:check": "eslint . --max-warnings=0", - "lint:forge-tests:check": "npx tsx scripts/checks/check-test-names.ts", + "lint:forge-tests:check": "go run ./scripts/checks/names", "lint:contracts:check": "pnpm lint:fix && git diff --exit-code", "lint:check": "pnpm lint:contracts:check && pnpm lint:ts:check", "lint:ts:fix": "eslint --fix .", diff --git a/packages/contracts-bedrock/scripts/checks/check-spacers.ts b/packages/contracts-bedrock/scripts/checks/check-spacers.ts deleted file mode 100644 index 8967618131d3..000000000000 --- a/packages/contracts-bedrock/scripts/checks/check-spacers.ts +++ /dev/null @@ -1,152 +0,0 @@ -import fs from 'fs' -import path from 'path' - -/** - * Directory path to the artifacts. - * Can be configured as the first argument to the script or - * defaults to the forge-artifacts directory. - */ -const directoryPath = - process.argv[2] || path.join(__dirname, '..', '..', 'forge-artifacts') - -/** - * Returns true if the contract should be skipped when inspecting its storage layout. - * This is useful for abstract contracts that are meant to be inherited. - * The two particular targets are: - * - CrossDomainMessengerLegacySpacer0 - * - CrossDomainMessengerLegacySpacer1 - */ -const skipped = (contractName: string): boolean => { - return contractName.includes('CrossDomainMessengerLegacySpacer') -} - -/** - * Parses out variable info from the variable structure in standard compiler json output. - * - * @param variable Variable structure from standard compiler json output. - * @returns Parsed variable info. - */ -const parseVariableInfo = ( - variable: any -): { - name: string - slot: number - offset: number - length: number -} => { - // Figure out the length of the variable. - let variableLength: number - if (variable.type.startsWith('t_mapping')) { - variableLength = 32 - } else if (variable.type.startsWith('t_uint')) { - variableLength = variable.type.match(/uint([0-9]+)/)?.[1] / 8 - } else if (variable.type.startsWith('t_bytes_')) { - variableLength = 32 - } else if (variable.type.startsWith('t_bytes')) { - variableLength = parseInt(variable.type.match(/bytes([0-9]+)/)?.[1], 10) - } else if (variable.type.startsWith('t_address')) { - variableLength = 20 - } else if (variable.type.startsWith('t_bool')) { - variableLength = 1 - } else if (variable.type.startsWith('t_array')) { - // Figure out the size of the type inside of the array - // and then multiply that by the length of the array. - // This does not support recursion multiple times for simplicity - const type = variable.type.match(/^t_array\((\w+)\)/)?.[1] - const info = parseVariableInfo({ - label: variable.label, - offset: variable.offset, - slot: variable.slot, - type, - }) - const size = variable.type.match(/^t_array\(\w+\)([0-9]+)/)?.[1] - variableLength = info.length * parseInt(size, 10) - } else { - throw new Error( - `${variable.label}: unsupported type ${variable.type}, add it to the script` - ) - } - - return { - name: variable.label, - slot: parseInt(variable.slot, 10), - offset: variable.offset, - length: variableLength, - } -} - -/** - * Main logic of the script - * - Ensures that all of the spacer variables are named correctly - */ -const main = async () => { - const paths = [] - - const readFilesRecursively = (dir: string) => { - const files = fs.readdirSync(dir) - - for (const file of files) { - const filePath = path.join(dir, file) - const fileStat = fs.statSync(filePath) - - if (fileStat.isDirectory()) { - readFilesRecursively(filePath) - } else { - paths.push(filePath) - } - } - } - - readFilesRecursively(directoryPath) - - for (const filePath of paths) { - if (filePath.includes('t.sol')) { - continue - } - const raw = fs.readFileSync(filePath, 'utf8').toString() - const artifact = JSON.parse(raw) - - // Handle contracts without storage - const storageLayout = artifact.storageLayout || {} - if (storageLayout.storage) { - for (const variable of storageLayout.storage) { - const fqn = variable.contract - // Skip some abstract contracts - if (skipped(fqn)) { - continue - } - - // Check that the spacers are all named correctly - if (variable.label.startsWith('spacer_')) { - const [, slot, offset, length] = variable.label.split('_') - const variableInfo = parseVariableInfo(variable) - - // Check that the slot is correct. - if (parseInt(slot, 10) !== variableInfo.slot) { - throw new Error( - `${fqn} ${variable.label} is in slot ${variable.slot} but should be in ${slot}` - ) - } - - // Check that the offset is correct. - if (parseInt(offset, 10) !== variableInfo.offset) { - throw new Error( - `${fqn} ${variable.label} is at offset ${variable.offset} but should be at ${offset}` - ) - } - - // Check that the length is correct. - if (parseInt(length, 10) !== variableInfo.length) { - throw new Error( - `${fqn} ${variable.label} is ${variableInfo.length} bytes long but should be ${length}` - ) - } - - console.log(`${fqn}.${variable.label} is valid`) - } - } - } - } -} - -main() diff --git a/packages/contracts-bedrock/scripts/checks/check-test-names.ts b/packages/contracts-bedrock/scripts/checks/check-test-names.ts deleted file mode 100644 index b3270b1e63c1..000000000000 --- a/packages/contracts-bedrock/scripts/checks/check-test-names.ts +++ /dev/null @@ -1,130 +0,0 @@ -import fs from 'fs' -import path from 'path' -import { execSync } from 'child_process' - -type Check = (parts: string[]) => boolean -type Checks = Array<{ - check: Check - error: string -}> - -/** - * Series of function name checks. - */ -const checks: Checks = [ - { - error: 'test name parts should be in camelCase', - check: (parts: string[]): boolean => { - return parts.every((part) => { - return part[0] === part[0].toLowerCase() - }) - }, - }, - { - error: - 'test names should have either 3 or 4 parts, each separated by underscores', - check: (parts: string[]): boolean => { - return parts.length === 3 || parts.length === 4 - }, - }, - { - error: 'test names should begin with "test", "testFuzz", or "testDiff"', - check: (parts: string[]): boolean => { - return ['test', 'testFuzz', 'testDiff'].includes(parts[0]) - }, - }, - { - error: - 'test names should end with either "succeeds", "reverts", "fails", "works" or "benchmark[_num]"', - check: (parts: string[]): boolean => { - return ( - ['succeeds', 'reverts', 'fails', 'benchmark', 'works'].includes( - parts[parts.length - 1] - ) || - (parts[parts.length - 2] === 'benchmark' && - !isNaN(parseInt(parts[parts.length - 1], 10))) - ) - }, - }, - { - error: - 'failure tests should have 4 parts, third part should indicate the reason for failure', - check: (parts: string[]): boolean => { - return ( - parts.length === 4 || - !['reverts', 'fails'].includes(parts[parts.length - 1]) - ) - }, - }, -] - -/** - * Script for checking that all test functions are named correctly. - */ -const main = async () => { - const result = execSync('forge config --json') - const config = JSON.parse(result.toString()) - const out = config.out || 'out' - - const paths = [] - - const readFilesRecursively = (dir: string) => { - const files = fs.readdirSync(dir) - - for (const file of files) { - const filePath = path.join(dir, file) - const fileStat = fs.statSync(filePath) - - if (fileStat.isDirectory()) { - readFilesRecursively(filePath) - } else { - paths.push(filePath) - } - } - } - - readFilesRecursively(out) - - console.log('Success:') - const errors: string[] = [] - - for (const filepath of paths) { - const artifact = JSON.parse(fs.readFileSync(filepath, 'utf8')) - - let isTest = false - for (const element of artifact.abi) { - if (element.name === 'IS_TEST') { - isTest = true - break - } - } - - if (isTest) { - let success = true - for (const element of artifact.abi) { - // Skip non-functions and functions that don't start with "test". - if (element.type !== 'function' || !element.name.startsWith('test')) { - continue - } - - // Check the rest. - for (const { check, error } of checks) { - if (!check(element.name.split('_'))) { - errors.push(`${filepath}#${element.name}: ${error}`) - success = false - } - } - } - if (success) { - console.log(` - ${path.parse(filepath).name}`) - } - } - } - - if (errors.length > 0) { - console.error(errors.join('\n')) - process.exit(1) - } -} - -main() diff --git a/packages/contracts-bedrock/scripts/checks/names/main.go b/packages/contracts-bedrock/scripts/checks/names/main.go new file mode 100644 index 000000000000..1a0be03f33f2 --- /dev/null +++ b/packages/contracts-bedrock/scripts/checks/names/main.go @@ -0,0 +1,164 @@ +package main + +import ( + "encoding/json" + "fmt" + "os" + "os/exec" + "path/filepath" + "strconv" + "strings" + "unicode" +) + +type Check func(parts []string) bool + +type CheckInfo struct { + check Check + error string +} + +var checks = []CheckInfo{ + { + error: "test name parts should be in camelCase", + check: func(parts []string) bool { + for _, part := range parts { + if len(part) > 0 && unicode.IsUpper(rune(part[0])) { + return false + } + } + return true + }, + }, + { + error: "test names should have either 3 or 4 parts, each separated by underscores", + check: func(parts []string) bool { + return len(parts) == 3 || len(parts) == 4 + }, + }, + { + error: "test names should begin with \"test\", \"testFuzz\", or \"testDiff\"", + check: func(parts []string) bool { + return parts[0] == "test" || parts[0] == "testFuzz" || parts[0] == "testDiff" + }, + }, + { + error: "test names should end with either \"succeeds\", \"reverts\", \"fails\", \"works\" or \"benchmark[_num]\"", + check: func(parts []string) bool { + last := parts[len(parts)-1] + if last == "succeeds" || last == "reverts" || last == "fails" || last == "works" { + return true + } + if len(parts) >= 2 && parts[len(parts)-2] == "benchmark" { + _, err := strconv.Atoi(last) + return err == nil + } + return last == "benchmark" + }, + }, + { + error: "failure tests should have 4 parts, third part should indicate the reason for failure", + check: func(parts []string) bool { + last := parts[len(parts)-1] + return len(parts) == 4 || (last != "reverts" && last != "fails") + }, + }, +} + +func main() { + cmd := exec.Command("forge", "config", "--json") + output, err := cmd.Output() + if err != nil { + fmt.Printf("Error executing forge config: %v\n", err) + os.Exit(1) + } + + var config map[string]interface{} + err = json.Unmarshal(output, &config) + if err != nil { + fmt.Printf("Error parsing forge config: %v\n", err) + os.Exit(1) + } + + outDir, ok := config["out"].(string) + if !ok { + outDir = "out" + } + + fmt.Println("Success:") + var errors []string + + err = filepath.Walk(outDir, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + if info.IsDir() { + return nil + } + + data, err := os.ReadFile(path) + if err != nil { + return err + } + + var artifact map[string]interface{} + err = json.Unmarshal(data, &artifact) + if err != nil { + return nil // Skip files that are not valid JSON + } + + abi, ok := artifact["abi"].([]interface{}) + if !ok { + return nil + } + + isTest := false + for _, element := range abi { + if elem, ok := element.(map[string]interface{}); ok { + if elem["name"] == "IS_TEST" { + isTest = true + break + } + } + } + + if isTest { + success := true + for _, element := range abi { + if elem, ok := element.(map[string]interface{}); ok { + if elem["type"] == "function" { + name, ok := elem["name"].(string) + if !ok || !strings.HasPrefix(name, "test") { + continue + } + + parts := strings.Split(name, "_") + for _, check := range checks { + if !check.check(parts) { + errors = append(errors, fmt.Sprintf("%s#%s: %s", path, name, check.error)) + success = false + } + } + } + } + } + + if success { + fmt.Printf(" - %s\n", filepath.Base(path[:len(path)-len(filepath.Ext(path))])) + } + } + + return nil + }) + + if err != nil { + fmt.Printf("Error walking the path %q: %v\n", outDir, err) + os.Exit(1) + } + + if len(errors) > 0 { + fmt.Println(strings.Join(errors, "\n")) + os.Exit(1) + } +} diff --git a/packages/contracts-bedrock/scripts/checks/spacers/main.go b/packages/contracts-bedrock/scripts/checks/spacers/main.go new file mode 100644 index 000000000000..3360bda74d39 --- /dev/null +++ b/packages/contracts-bedrock/scripts/checks/spacers/main.go @@ -0,0 +1,176 @@ +package main + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "regexp" + "strconv" + "strings" +) + +// directoryPath is the path to the artifacts directory. +// It can be configured as the first argument to the script or +// defaults to the forge-artifacts directory. +var directoryPath string + +func init() { + if len(os.Args) > 1 { + directoryPath = os.Args[1] + } else { + currentDir, _ := os.Getwd() + directoryPath = filepath.Join(currentDir, "forge-artifacts") + } +} + +// skipped returns true if the contract should be skipped when inspecting its storage layout. +func skipped(contractName string) bool { + return strings.Contains(contractName, "CrossDomainMessengerLegacySpacer") +} + +// variableInfo represents the parsed variable information. +type variableInfo struct { + name string + slot int + offset int + length int +} + +// parseVariableInfo parses out variable info from the variable structure in standard compiler json output. +func parseVariableInfo(variable map[string]interface{}) (variableInfo, error) { + var info variableInfo + var err error + + info.name = variable["label"].(string) + info.slot, err = strconv.Atoi(variable["slot"].(string)) + if err != nil { + return info, err + } + info.offset = int(variable["offset"].(float64)) + + variableType := variable["type"].(string) + if strings.HasPrefix(variableType, "t_mapping") { + info.length = 32 + } else if strings.HasPrefix(variableType, "t_uint") { + re := regexp.MustCompile(`uint(\d+)`) + matches := re.FindStringSubmatch(variableType) + if len(matches) > 1 { + bitSize, _ := strconv.Atoi(matches[1]) + info.length = bitSize / 8 + } + } else if strings.HasPrefix(variableType, "t_bytes_") { + info.length = 32 + } else if strings.HasPrefix(variableType, "t_bytes") { + re := regexp.MustCompile(`bytes(\d+)`) + matches := re.FindStringSubmatch(variableType) + if len(matches) > 1 { + info.length, _ = strconv.Atoi(matches[1]) + } + } else if strings.HasPrefix(variableType, "t_address") { + info.length = 20 + } else if strings.HasPrefix(variableType, "t_bool") { + info.length = 1 + } else if strings.HasPrefix(variableType, "t_array") { + re := regexp.MustCompile(`^t_array\((\w+)\)(\d+)`) + matches := re.FindStringSubmatch(variableType) + if len(matches) > 2 { + innerType := matches[1] + size, _ := strconv.Atoi(matches[2]) + innerInfo, err := parseVariableInfo(map[string]interface{}{ + "label": variable["label"], + "offset": variable["offset"], + "slot": variable["slot"], + "type": innerType, + }) + if err != nil { + return info, err + } + info.length = innerInfo.length * size + } + } else { + return info, fmt.Errorf("%s: unsupported type %s, add it to the script", info.name, variableType) + } + + return info, nil +} + +func main() { + err := filepath.Walk(directoryPath, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + if info.IsDir() || strings.Contains(path, "t.sol") { + return nil + } + + raw, err := os.ReadFile(path) + if err != nil { + return err + } + + var artifact map[string]interface{} + err = json.Unmarshal(raw, &artifact) + if err != nil { + return err + } + + storageLayout, ok := artifact["storageLayout"].(map[string]interface{}) + if !ok { + return nil + } + + storage, ok := storageLayout["storage"].([]interface{}) + if !ok { + return nil + } + + for _, v := range storage { + variable := v.(map[string]interface{}) + fqn := variable["contract"].(string) + + if skipped(fqn) { + continue + } + + label := variable["label"].(string) + if strings.HasPrefix(label, "spacer_") { + parts := strings.Split(label, "_") + if len(parts) != 4 { + return fmt.Errorf("invalid spacer name format: %s", label) + } + + slot, _ := strconv.Atoi(parts[1]) + offset, _ := strconv.Atoi(parts[2]) + length, _ := strconv.Atoi(parts[3]) + + variableInfo, err := parseVariableInfo(variable) + if err != nil { + return err + } + + if slot != variableInfo.slot { + return fmt.Errorf("%s %s is in slot %d but should be in %d", fqn, label, variableInfo.slot, slot) + } + + if offset != variableInfo.offset { + return fmt.Errorf("%s %s is at offset %d but should be at %d", fqn, label, variableInfo.offset, offset) + } + + if length != variableInfo.length { + return fmt.Errorf("%s %s is %d bytes long but should be %d", fqn, label, variableInfo.length, length) + } + + fmt.Printf("%s.%s is valid\n", fqn, label) + } + } + + return nil + }) + + if err != nil { + fmt.Printf("Error: %v\n", err) + os.Exit(1) + } +} From e4c17d3827935869bf8f9c616271bce4e1762550 Mon Sep 17 00:00:00 2001 From: Inphi Date: Mon, 5 Aug 2024 09:48:08 -0700 Subject: [PATCH 10/59] Reduce ChannelTimeout to 50 in Granite (#11343) * Reduce ChannelTimeout to 50 in Granite * Capture granite genesis files. * Update snapshots. * Update op-geth dependency and resolve TODOs. * update op-geth dependency to rc.1 * fix TestGetRollupConfig --------- Co-authored-by: Adrian Sutton --- .circleci/config.yml | 6 + bedrock-devnet/devnet/__init__.py | 2 +- go.mod | 8 +- go.sum | 8 +- op-batcher/batcher/channel.go | 3 + op-batcher/batcher/service.go | 8 +- op-chain-ops/genesis/config.go | 34 +++- op-chain-ops/genesis/genesis.go | 3 +- op-chain-ops/genesis/layer_two.go | 1 + op-conductor/conductor/service_test.go | 3 +- op-e2e/actions/l2_sequencer.go | 7 + op-e2e/config/init.go | 1 + op-e2e/e2eutils/setup.go | 13 +- op-e2e/op_geth.go | 4 +- op-e2e/setup.go | 15 +- op-node/chaincfg/chains_test.go | 11 +- op-node/rollup/chain_spec.go | 11 +- op-node/rollup/chain_spec_test.go | 14 +- op-node/rollup/derive/channel_bank.go | 6 +- op-node/rollup/derive/channel_bank_test.go | 8 +- op-node/rollup/derive/pipeline.go | 17 +- op-node/rollup/sequencing/sequencer.go | 5 + op-node/rollup/superchain.go | 3 +- op-node/rollup/types.go | 14 +- op-node/rollup/types_test.go | 37 ++++- op-wheel/commands.go | 1 + packages/contracts-bedrock/README.md | 4 +- packages/contracts-bedrock/scripts/Config.sol | 9 +- .../contracts-bedrock/scripts/L2Genesis.s.sol | 4 + .../scripts/deploy/DeployConfig.s.sol | 6 +- .../snapshots/state-diff/Kontrol-31337.json | 150 +++++++++--------- 31 files changed, 285 insertions(+), 131 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ebc0f5c8ea9b..b323b41a2512 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -249,22 +249,26 @@ jobs: - ".devnet/allocs-l2-delta.json" - ".devnet/allocs-l2-ecotone.json" - ".devnet/allocs-l2-fjord.json" + - ".devnet/allocs-l2-granite.json" - ".devnet/addresses.json" - ".devnet-l2oo/allocs-l1.json" - ".devnet-l2oo/addresses.json" - ".devnet-l2oo/allocs-l2-delta.json" - ".devnet-l2oo/allocs-l2-ecotone.json" - ".devnet-l2oo/allocs-l2-fjord.json" + - ".devnet-l2oo/allocs-l2-granite.json" - ".devnet-plasma/allocs-l1.json" - ".devnet-plasma/addresses.json" - ".devnet-plasma/allocs-l2-delta.json" - ".devnet-plasma/allocs-l2-ecotone.json" - ".devnet-plasma/allocs-l2-fjord.json" + - ".devnet-plasma/allocs-l2-granite.json" - ".devnet-plasma-generic/allocs-l1.json" - ".devnet-plasma-generic/addresses.json" - ".devnet-plasma-generic/allocs-l2-delta.json" - ".devnet-plasma-generic/allocs-l2-ecotone.json" - ".devnet-plasma-generic/allocs-l2-fjord.json" + - ".devnet-plasma-generic/allocs-l2-granite.json" - "packages/contracts-bedrock/deploy-config/devnetL1.json" - "packages/contracts-bedrock/deployments/devnetL1" - notify-failures-on-develop @@ -891,6 +895,7 @@ jobs: cp /tmp/workspace/.devnet<>/allocs-l2-delta.json .devnet/allocs-l2-delta.json cp /tmp/workspace/.devnet<>/allocs-l2-ecotone.json .devnet/allocs-l2-ecotone.json cp /tmp/workspace/.devnet<>/allocs-l2-fjord.json .devnet/allocs-l2-fjord.json + cp /tmp/workspace/.devnet<>/allocs-l2-granite.json .devnet/allocs-l2-granite.json cp /tmp/workspace/.devnet<>/allocs-l1.json .devnet/allocs-l1.json cp /tmp/workspace/.devnet<>/addresses.json .devnet/addresses.json cp /tmp/workspace/packages/contracts-bedrock/deploy-config/devnetL1.json packages/contracts-bedrock/deploy-config/devnetL1.json @@ -1078,6 +1083,7 @@ jobs: - ".devnet/allocs-l2-delta.json" - ".devnet/allocs-l2-ecotone.json" - ".devnet/allocs-l2-fjord.json" + - ".devnet/allocs-l2-granite.json" - ".devnet/allocs-l1.json" - ".devnet/addresses.json" - "packages/contracts-bedrock/deploy-config/devnetL1.json" diff --git a/bedrock-devnet/devnet/__init__.py b/bedrock-devnet/devnet/__init__.py index 3c22de576104..fc265c48f690 100644 --- a/bedrock-devnet/devnet/__init__.py +++ b/bedrock-devnet/devnet/__init__.py @@ -22,7 +22,7 @@ log = logging.getLogger() # Global constants -FORKS = ["delta", "ecotone", "fjord"] +FORKS = ["delta", "ecotone", "fjord", "granite"] # Global environment variables DEVNET_NO_BUILD = os.getenv('DEVNET_NO_BUILD') == "true" diff --git a/go.mod b/go.mod index 9c1fcc9a9622..189a3db6ee4b 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/crate-crypto/go-kzg-4844 v0.7.0 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3 - github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240801182704-4810f97b7ee9 + github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240803025447-c92ef420eec2 github.com/ethereum/go-ethereum v1.13.15 github.com/fsnotify/fsnotify v1.7.0 github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb @@ -228,7 +228,7 @@ require ( rsc.io/tmplfunc v0.0.3 // indirect ) -replace github.com/ethereum/go-ethereum => github.com/ethereum-optimism/op-geth v1.101315.3-rc.1 +replace github.com/ethereum/go-ethereum => github.com/ethereum-optimism/op-geth v1.101316.0-rc.1 //replace github.com/ethereum/go-ethereum v1.13.9 => ../op-geth @@ -236,3 +236,7 @@ replace github.com/ethereum/go-ethereum => github.com/ethereum-optimism/op-geth // This release keeps breaking Go builds. Stop that. exclude github.com/kataras/iris/v12 v12.2.0-beta5 + +exclude github.com/kataras/iris/v12 v12.2.0 + +exclude github.com/kataras/iris/v12 v12.2.11 diff --git a/go.sum b/go.sum index ca1dd5329dd5..419bfa66ee6f 100644 --- a/go.sum +++ b/go.sum @@ -171,10 +171,10 @@ github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/ github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3 h1:RWHKLhCrQThMfch+QJ1Z8veEq5ZO3DfIhZ7xgRP9WTc= github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3/go.mod h1:QziizLAiF0KqyLdNJYD7O5cpDlaFMNZzlxYNcWsJUxs= -github.com/ethereum-optimism/op-geth v1.101315.3-rc.1 h1:Q/B0FBdtglzsFtqurvUsiNfH8isCOFFF/pf9ss0L4eY= -github.com/ethereum-optimism/op-geth v1.101315.3-rc.1/go.mod h1:h5C5tP+7gkMrlUGENuiV5ddlwJ4RxLdmdapRuTAGlnw= -github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240801182704-4810f97b7ee9 h1:Yqi7oOCWRN3SMl3rL5zGYSHIw2MyuTJ1nqokSi7ejfU= -github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240801182704-4810f97b7ee9/go.mod h1:zy9f3TNPS7pwW4msMitF83fp0Wf452tZ6+Fg6d4JyXM= +github.com/ethereum-optimism/op-geth v1.101316.0-rc.1 h1:S6Nw/faA4g6AicK5oQR5p2VUjq8AyTEilLfNGgprbGU= +github.com/ethereum-optimism/op-geth v1.101316.0-rc.1/go.mod h1:nZ3TvP4mhOsfKkrgaT3GrDO4oCn5awPXFHKpVHuO63s= +github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240803025447-c92ef420eec2 h1:ySJykDUyb8RbcfLL3pz0Cs5Ji6NMVT7kmAY634DOCoE= +github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240803025447-c92ef420eec2/go.mod h1:zy9f3TNPS7pwW4msMitF83fp0Wf452tZ6+Fg6d4JyXM= github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= diff --git a/op-batcher/batcher/channel.go b/op-batcher/batcher/channel.go index bf948ff45b65..9a5e6b4c6a2e 100644 --- a/op-batcher/batcher/channel.go +++ b/op-batcher/batcher/channel.go @@ -134,6 +134,9 @@ func (s *channel) updateInclusionBlocks() { func (s *channel) isTimedOut() bool { // Update min/max inclusion blocks for timeout check s.updateInclusionBlocks() + // Prior to the granite hard fork activating, the use of the shorter ChannelTimeout here may cause the batcher + // to believe the channel timed out when it was valid. It would then resubmit the blocks needlessly. + // This wastes batcher funds but doesn't cause any problems for the chain progressing safe head. return s.maxInclusionBlock-s.minInclusionBlock >= s.cfg.ChannelTimeout } diff --git a/op-batcher/batcher/service.go b/op-batcher/batcher/service.go index f83328b105a1..2c96bc37bfe3 100644 --- a/op-batcher/batcher/service.go +++ b/op-batcher/batcher/service.go @@ -185,9 +185,15 @@ func (bs *BatcherService) initRollupConfig(ctx context.Context) error { } func (bs *BatcherService) initChannelConfig(cfg *CLIConfig) error { + channelTimeout := bs.RollupConfig.ChannelTimeoutBedrock + // Use lower channel timeout if granite is scheduled. + // Ensures channels are restricted to the tighter timeout even if granite hasn't activated yet + if bs.RollupConfig.GraniteTime != nil { + channelTimeout = bs.RollupConfig.ChannelTimeoutGranite + } cc := ChannelConfig{ SeqWindowSize: bs.RollupConfig.SeqWindowSize, - ChannelTimeout: bs.RollupConfig.ChannelTimeout, + ChannelTimeout: channelTimeout, MaxChannelDuration: cfg.MaxChannelDuration, MaxFrameSize: cfg.MaxL1TxSize - 1, // account for version byte prefix; reset for blobs TargetNumFrames: cfg.TargetNumFrames, diff --git a/op-chain-ops/genesis/config.go b/op-chain-ops/genesis/config.go index 042acc0acf2b..7d3353d0e951 100644 --- a/op-chain-ops/genesis/config.go +++ b/op-chain-ops/genesis/config.go @@ -338,6 +338,9 @@ type UpgradeScheduleDeployConfig struct { // L2GenesisFjordTimeOffset is the number of seconds after genesis block that Fjord hard fork activates. // Set it to 0 to activate at genesis. Nil to disable Fjord. L2GenesisFjordTimeOffset *hexutil.Uint64 `json:"l2GenesisFjordTimeOffset,omitempty"` + // L2GenesisGraniteTimeOffset is the number of seconds after genesis block that Granite hard fork activates. + // Set it to 0 to activate at genesis. Nil to disable Granite. + L2GenesisGraniteTimeOffset *hexutil.Uint64 `json:"l2GenesisGraniteTimeOffset,omitempty"` // L2GenesisInteropTimeOffset is the number of seconds after genesis block that the Interop hard fork activates. // Set it to 0 to activate at genesis. Nil to disable Interop. L2GenesisInteropTimeOffset *hexutil.Uint64 `json:"l2GenesisInteropTimeOffset,omitempty"` @@ -382,6 +385,10 @@ func (d *UpgradeScheduleDeployConfig) FjordTime(genesisTime uint64) *uint64 { return offsetToUpgradeTime(d.L2GenesisFjordTimeOffset, genesisTime) } +func (d *UpgradeScheduleDeployConfig) GraniteTime(genesisTime uint64) *uint64 { + return offsetToUpgradeTime(d.L2GenesisGraniteTimeOffset, genesisTime) +} + func (d *UpgradeScheduleDeployConfig) InteropTime(genesisTime uint64) *uint64 { return offsetToUpgradeTime(d.L2GenesisInteropTimeOffset, genesisTime) } @@ -415,6 +422,9 @@ func (d *UpgradeScheduleDeployConfig) Check(log log.Logger) error { if err := checkFork(d.L2GenesisEcotoneTimeOffset, d.L2GenesisFjordTimeOffset, "ecotone", "fjord"); err != nil { return err } + if err := checkFork(d.L2GenesisFjordTimeOffset, d.L2GenesisGraniteTimeOffset, "fjord", "granite"); err != nil { + return err + } return nil } @@ -438,8 +448,10 @@ type L2CoreDeployConfig struct { MaxSequencerDrift uint64 `json:"maxSequencerDrift"` // SequencerWindowSize is the number of L1 blocks per sequencing window. SequencerWindowSize uint64 `json:"sequencerWindowSize"` - // ChannelTimeout is the number of L1 blocks that a frame stays valid when included in L1. - ChannelTimeout uint64 `json:"channelTimeout"` + // ChannelTimeoutBedrock is the number of L1 blocks that a frame stays valid when included in L1. + ChannelTimeoutBedrock uint64 `json:"channelTimeout"` + // ChannelTimeoutGranite is the number of L1 blocks that a frame stays valid when included in L1 after granite. + ChannelTimeoutGranite uint64 `json:"channelTimeoutGranite,omitempty"` // BatchInboxAddress is the L1 account that batches are sent to. BatchInboxAddress common.Address `json:"batchInboxAddress"` @@ -464,7 +476,7 @@ func (d *L2CoreDeployConfig) Check(log log.Logger) error { if d.SequencerWindowSize == 0 { return fmt.Errorf("%w: SequencerWindowSize cannot be 0", ErrInvalidDeployConfig) } - if d.ChannelTimeout == 0 { + if d.ChannelTimeoutBedrock == 0 { return fmt.Errorf("%w: ChannelTimeout cannot be 0", ErrInvalidDeployConfig) } if d.BatchInboxAddress == (common.Address{}) { @@ -534,7 +546,13 @@ type L2InitializationConfig struct { } func (d *L2InitializationConfig) Check(log log.Logger) error { - return checkConfigBundle(d, log) + if err := checkConfigBundle(d, log); err != nil { + return err + } + if d.ChannelTimeoutGranite == 0 && d.L2GenesisGraniteTimeOffset != nil { + return fmt.Errorf("%w: ChannelTimeoutGranite cannot be 0", ErrInvalidDeployConfig) + } + return nil } // DevL1DeployConfig is used to configure a L1 chain for development/testing purposes. @@ -804,7 +822,9 @@ func (d *DeployConfig) Check(log log.Logger) error { if d.L1BlockTime < d.L2BlockTime { return fmt.Errorf("L2 block time (%d) is larger than L1 block time (%d)", d.L2BlockTime, d.L1BlockTime) } - + if d.ChannelTimeoutGranite == 0 && d.L2GenesisGraniteTimeOffset != nil { + return fmt.Errorf("%w: ChannelTimeoutGranite cannot be 0", ErrInvalidDeployConfig) + } return checkConfigBundle(d, log) } @@ -869,7 +889,8 @@ func (d *DeployConfig) RollupConfig(l1StartBlock *types.Block, l2GenesisBlockHas BlockTime: d.L2BlockTime, MaxSequencerDrift: d.MaxSequencerDrift, SeqWindowSize: d.SequencerWindowSize, - ChannelTimeout: d.ChannelTimeout, + ChannelTimeoutBedrock: d.ChannelTimeoutBedrock, + ChannelTimeoutGranite: d.ChannelTimeoutGranite, L1ChainID: new(big.Int).SetUint64(d.L1ChainID), L2ChainID: new(big.Int).SetUint64(d.L2ChainID), BatchInboxAddress: d.BatchInboxAddress, @@ -880,6 +901,7 @@ func (d *DeployConfig) RollupConfig(l1StartBlock *types.Block, l2GenesisBlockHas DeltaTime: d.DeltaTime(l1StartBlock.Time()), EcotoneTime: d.EcotoneTime(l1StartBlock.Time()), FjordTime: d.FjordTime(l1StartBlock.Time()), + GraniteTime: d.GraniteTime(l1StartBlock.Time()), InteropTime: d.InteropTime(l1StartBlock.Time()), PlasmaConfig: plasma, }, nil diff --git a/op-chain-ops/genesis/genesis.go b/op-chain-ops/genesis/genesis.go index e652c189bb15..f517912e109a 100644 --- a/op-chain-ops/genesis/genesis.go +++ b/op-chain-ops/genesis/genesis.go @@ -67,11 +67,12 @@ func NewL2Genesis(config *DeployConfig, block *types.Block) (*core.Genesis, erro CancunTime: config.EcotoneTime(block.Time()), EcotoneTime: config.EcotoneTime(block.Time()), FjordTime: config.FjordTime(block.Time()), + GraniteTime: config.GraniteTime(block.Time()), InteropTime: config.InteropTime(block.Time()), Optimism: ¶ms.OptimismConfig{ EIP1559Denominator: eip1559Denom, EIP1559Elasticity: eip1559Elasticity, - EIP1559DenominatorCanyon: eip1559DenomCanyon, + EIP1559DenominatorCanyon: &eip1559DenomCanyon, }, } diff --git a/op-chain-ops/genesis/layer_two.go b/op-chain-ops/genesis/layer_two.go index a898afc70aaa..46c17a4f9c76 100644 --- a/op-chain-ops/genesis/layer_two.go +++ b/op-chain-ops/genesis/layer_two.go @@ -23,6 +23,7 @@ const ( L2AllocsDelta L2AllocsMode = "delta" L2AllocsEcotone L2AllocsMode = "ecotone" L2AllocsFjord L2AllocsMode = "fjord" + L2AllocsGranite L2AllocsMode = "granite" ) var ( diff --git a/op-conductor/conductor/service_test.go b/op-conductor/conductor/service_test.go index 4e19925baa4b..d0c256f000a4 100644 --- a/op-conductor/conductor/service_test.go +++ b/op-conductor/conductor/service_test.go @@ -64,7 +64,8 @@ func mockConfig(t *testing.T) Config { BlockTime: 2, MaxSequencerDrift: 600, SeqWindowSize: 3600, - ChannelTimeout: 300, + ChannelTimeoutBedrock: 300, + ChannelTimeoutGranite: 50, L1ChainID: big.NewInt(1), L2ChainID: big.NewInt(2), RegolithTime: &now, diff --git a/op-e2e/actions/l2_sequencer.go b/op-e2e/actions/l2_sequencer.go index afa54e2ea75c..8bf28631f546 100644 --- a/op-e2e/actions/l2_sequencer.go +++ b/op-e2e/actions/l2_sequencer.go @@ -202,3 +202,10 @@ func (s *L2Sequencer) ActBuildL2ToFjord(t Testing) { s.ActL2EndBlock(t) } } +func (s *L2Sequencer) ActBuildL2ToGranite(t Testing) { + require.NotNil(t, s.rollupCfg.GraniteTime, "cannot activate GraniteTime when it is not scheduled") + for s.L2Unsafe().Time < *s.rollupCfg.GraniteTime { + s.ActL2StartBlock(t) + s.ActL2EndBlock(t) + } +} diff --git a/op-e2e/config/init.go b/op-e2e/config/init.go index c5a38ad5a6af..54ad51d57a60 100644 --- a/op-e2e/config/init.go +++ b/op-e2e/config/init.go @@ -121,6 +121,7 @@ func init() { } l2Allocs[mode] = allocs } + mustL2Allocs(genesis.L2AllocsGranite) mustL2Allocs(genesis.L2AllocsFjord) mustL2Allocs(genesis.L2AllocsEcotone) mustL2Allocs(genesis.L2AllocsDelta) diff --git a/op-e2e/e2eutils/setup.go b/op-e2e/e2eutils/setup.go index a94070ed78e6..b33076da2cb1 100644 --- a/op-e2e/e2eutils/setup.go +++ b/op-e2e/e2eutils/setup.go @@ -59,7 +59,8 @@ func MakeDeployParams(t require.TestingT, tp *TestParams) *DeployParams { deployConfig := config.DeployConfig.Copy() deployConfig.MaxSequencerDrift = tp.MaxSequencerDrift deployConfig.SequencerWindowSize = tp.SequencerWindowSize - deployConfig.ChannelTimeout = tp.ChannelTimeout + deployConfig.ChannelTimeoutBedrock = tp.ChannelTimeout + deployConfig.ChannelTimeoutGranite = tp.ChannelTimeout deployConfig.L1BlockTime = tp.L1BlockTime deployConfig.UsePlasma = tp.UsePlasma ApplyDeployConfigForks(deployConfig) @@ -173,7 +174,8 @@ func Setup(t require.TestingT, deployParams *DeployParams, alloc *AllocParams) * BlockTime: deployConf.L2BlockTime, MaxSequencerDrift: deployConf.MaxSequencerDrift, SeqWindowSize: deployConf.SequencerWindowSize, - ChannelTimeout: deployConf.ChannelTimeout, + ChannelTimeoutBedrock: deployConf.ChannelTimeoutBedrock, + ChannelTimeoutGranite: deployConf.ChannelTimeoutGranite, L1ChainID: new(big.Int).SetUint64(deployConf.L1ChainID), L2ChainID: new(big.Int).SetUint64(deployConf.L2ChainID), BatchInboxAddress: deployConf.BatchInboxAddress, @@ -184,6 +186,7 @@ func Setup(t require.TestingT, deployParams *DeployParams, alloc *AllocParams) * DeltaTime: deployConf.DeltaTime(uint64(deployConf.L1GenesisBlockTimestamp)), EcotoneTime: deployConf.EcotoneTime(uint64(deployConf.L1GenesisBlockTimestamp)), FjordTime: deployConf.FjordTime(uint64(deployConf.L1GenesisBlockTimestamp)), + GraniteTime: deployConf.GraniteTime(uint64(deployConf.L1GenesisBlockTimestamp)), InteropTime: deployConf.InteropTime(uint64(deployConf.L1GenesisBlockTimestamp)), PlasmaConfig: pcfg, } @@ -214,7 +217,8 @@ func SystemConfigFromDeployConfig(deployConfig *genesis.DeployConfig) eth.System } func ApplyDeployConfigForks(deployConfig *genesis.DeployConfig) { - isFjord := os.Getenv("OP_E2E_USE_FJORD") == "true" + isGranite := os.Getenv("OP_E2E_USE_GRANITE") == "true" + isFjord := isGranite || os.Getenv("OP_E2E_USE_FJORD") == "true" isEcotone := isFjord || os.Getenv("OP_E2E_USE_ECOTONE") == "true" isDelta := isEcotone || os.Getenv("OP_E2E_USE_DELTA") == "true" if isDelta { @@ -226,6 +230,9 @@ func ApplyDeployConfigForks(deployConfig *genesis.DeployConfig) { if isFjord { deployConfig.L2GenesisFjordTimeOffset = new(hexutil.Uint64) } + if isGranite { + deployConfig.L2GenesisGraniteTimeOffset = new(hexutil.Uint64) + } // Canyon and lower is activated by default deployConfig.L2GenesisCanyonTimeOffset = new(hexutil.Uint64) deployConfig.L2GenesisRegolithTimeOffset = new(hexutil.Uint64) diff --git a/op-e2e/op_geth.go b/op-e2e/op_geth.go index 1f277e22a997..56a0a44e5549 100644 --- a/op-e2e/op_geth.go +++ b/op-e2e/op_geth.go @@ -60,7 +60,9 @@ func NewOpGeth(t testing.TB, ctx context.Context, cfg *SystemConfig) (*OpGeth, e var allocsMode genesis.L2AllocsMode allocsMode = genesis.L2AllocsDelta - if fjordTime := cfg.DeployConfig.FjordTime(l1Block.Time()); fjordTime != nil && *fjordTime <= 0 { + if graniteTime := cfg.DeployConfig.GraniteTime(l1Block.Time()); graniteTime != nil && *graniteTime <= 0 { + allocsMode = genesis.L2AllocsGranite + } else if fjordTime := cfg.DeployConfig.FjordTime(l1Block.Time()); fjordTime != nil && *fjordTime <= 0 { allocsMode = genesis.L2AllocsFjord } else if ecotoneTime := cfg.DeployConfig.EcotoneTime(l1Block.Time()); ecotoneTime != nil && *ecotoneTime <= 0 { allocsMode = genesis.L2AllocsEcotone diff --git a/op-e2e/setup.go b/op-e2e/setup.go index a443fa0405da..dd31c973a599 100644 --- a/op-e2e/setup.go +++ b/op-e2e/setup.go @@ -184,6 +184,7 @@ func RegolithSystemConfig(t *testing.T, regolithTimeOffset *hexutil.Uint64) Syst cfg.DeployConfig.L2GenesisDeltaTimeOffset = nil cfg.DeployConfig.L2GenesisEcotoneTimeOffset = nil cfg.DeployConfig.L2GenesisFjordTimeOffset = nil + cfg.DeployConfig.L2GenesisGraniteTimeOffset = nil // ADD NEW FORKS HERE! return cfg } @@ -214,6 +215,12 @@ func FjordSystemConfig(t *testing.T, fjordTimeOffset *hexutil.Uint64) SystemConf return cfg } +func GraniteSystemConfig(t *testing.T, graniteTimeOffset *hexutil.Uint64) SystemConfig { + cfg := EcotoneSystemConfig(t, &genesisTime) + cfg.DeployConfig.L2GenesisGraniteTimeOffset = graniteTimeOffset + return cfg +} + func writeDefaultJWT(t testing.TB) string { // Sadly the geth node config cannot load JWT secret from memory, it has to be a file jwtPath := path.Join(t.TempDir(), "jwt_secret") @@ -540,7 +547,9 @@ func (cfg SystemConfig) Start(t *testing.T, _opts ...SystemConfigOption) (*Syste l1Block := l1Genesis.ToBlock() var allocsMode genesis.L2AllocsMode allocsMode = genesis.L2AllocsDelta - if fjordTime := cfg.DeployConfig.FjordTime(l1Block.Time()); fjordTime != nil && *fjordTime <= 0 { + if graniteTime := cfg.DeployConfig.GraniteTime(l1Block.Time()); graniteTime != nil && *graniteTime <= 0 { + allocsMode = genesis.L2AllocsGranite + } else if fjordTime := cfg.DeployConfig.FjordTime(l1Block.Time()); fjordTime != nil && *fjordTime <= 0 { allocsMode = genesis.L2AllocsFjord } else if ecotoneTime := cfg.DeployConfig.EcotoneTime(l1Block.Time()); ecotoneTime != nil && *ecotoneTime <= 0 { allocsMode = genesis.L2AllocsEcotone @@ -585,7 +594,8 @@ func (cfg SystemConfig) Start(t *testing.T, _opts ...SystemConfigOption) (*Syste BlockTime: cfg.DeployConfig.L2BlockTime, MaxSequencerDrift: cfg.DeployConfig.MaxSequencerDrift, SeqWindowSize: cfg.DeployConfig.SequencerWindowSize, - ChannelTimeout: cfg.DeployConfig.ChannelTimeout, + ChannelTimeoutBedrock: cfg.DeployConfig.ChannelTimeoutBedrock, + ChannelTimeoutGranite: cfg.DeployConfig.ChannelTimeoutGranite, L1ChainID: cfg.L1ChainIDBig(), L2ChainID: cfg.L2ChainIDBig(), BatchInboxAddress: cfg.DeployConfig.BatchInboxAddress, @@ -596,6 +606,7 @@ func (cfg SystemConfig) Start(t *testing.T, _opts ...SystemConfigOption) (*Syste DeltaTime: cfg.DeployConfig.DeltaTime(uint64(cfg.DeployConfig.L1GenesisBlockTimestamp)), EcotoneTime: cfg.DeployConfig.EcotoneTime(uint64(cfg.DeployConfig.L1GenesisBlockTimestamp)), FjordTime: cfg.DeployConfig.FjordTime(uint64(cfg.DeployConfig.L1GenesisBlockTimestamp)), + GraniteTime: cfg.DeployConfig.GraniteTime(uint64(cfg.DeployConfig.L1GenesisBlockTimestamp)), InteropTime: cfg.DeployConfig.InteropTime(uint64(cfg.DeployConfig.L1GenesisBlockTimestamp)), ProtocolVersionsAddress: cfg.L1Deployments.ProtocolVersionsProxy, } diff --git a/op-node/chaincfg/chains_test.go b/op-node/chaincfg/chains_test.go index 3c152f1e56b5..7ac80202edbe 100644 --- a/op-node/chaincfg/chains_test.go +++ b/op-node/chaincfg/chains_test.go @@ -55,7 +55,8 @@ var mainnetCfg = rollup.Config{ BlockTime: 2, MaxSequencerDrift: 600, SeqWindowSize: 3600, - ChannelTimeout: 300, + ChannelTimeoutBedrock: 300, + ChannelTimeoutGranite: 50, L1ChainID: big.NewInt(1), L2ChainID: big.NewInt(10), BatchInboxAddress: common.HexToAddress("0xff00000000000000000000000000000000000010"), @@ -90,7 +91,8 @@ var sepoliaCfg = rollup.Config{ BlockTime: 2, MaxSequencerDrift: 600, SeqWindowSize: 3600, - ChannelTimeout: 300, + ChannelTimeoutBedrock: 300, + ChannelTimeoutGranite: 50, L1ChainID: big.NewInt(11155111), L2ChainID: big.NewInt(11155420), BatchInboxAddress: common.HexToAddress("0xff00000000000000000000000000000011155420"), @@ -101,6 +103,7 @@ var sepoliaCfg = rollup.Config{ DeltaTime: u64Ptr(1703203200), EcotoneTime: u64Ptr(1708534800), FjordTime: u64Ptr(1716998400), + GraniteTime: u64Ptr(1723478400), ProtocolVersionsAddress: common.HexToAddress("0x79ADD5713B383DAa0a138d3C4780C7A1804a8090"), } @@ -125,7 +128,8 @@ var sepoliaDev0Cfg = rollup.Config{ BlockTime: 2, MaxSequencerDrift: 600, SeqWindowSize: 3600, - ChannelTimeout: 300, + ChannelTimeoutBedrock: 300, + ChannelTimeoutGranite: 50, L1ChainID: big.NewInt(11155111), L2ChainID: big.NewInt(11155421), BatchInboxAddress: common.HexToAddress("0xff00000000000000000000000000000011155421"), @@ -136,6 +140,7 @@ var sepoliaDev0Cfg = rollup.Config{ DeltaTime: u64Ptr(0), EcotoneTime: u64Ptr(1706634000), FjordTime: u64Ptr(1715961600), + GraniteTime: u64Ptr(1723046400), ProtocolVersionsAddress: common.HexToAddress("0x252CbE9517F731C618961D890D534183822dcC8d"), } diff --git a/op-node/rollup/chain_spec.go b/op-node/rollup/chain_spec.go index bdd219e4ae2a..e4a0de07e260 100644 --- a/op-node/rollup/chain_spec.go +++ b/op-node/rollup/chain_spec.go @@ -77,8 +77,11 @@ func (s *ChainSpec) MaxChannelBankSize(t uint64) uint64 { } // ChannelTimeout returns the channel timeout constant. -func (s *ChainSpec) ChannelTimeout() uint64 { - return s.config.ChannelTimeout +func (s *ChainSpec) ChannelTimeout(t uint64) uint64 { + if s.config.IsGranite(t) { + return s.config.ChannelTimeoutGranite + } + return s.config.ChannelTimeoutBedrock } // MaxRLPBytesPerChannel returns the maximum amount of bytes that will be read from @@ -130,10 +133,10 @@ func (s *ChainSpec) CheckForkActivation(log log.Logger, block eth.L2BlockRef) { s.currentFork = Fjord } if s.config.IsGranite(block.Time) { - s.currentFork = Fjord + s.currentFork = Granite } if s.config.IsHolocene(block.Time) { - s.currentFork = Fjord + s.currentFork = Holocene } if s.config.IsInterop(block.Time) { s.currentFork = Interop diff --git a/op-node/rollup/chain_spec_test.go b/op-node/rollup/chain_spec_test.go index b6547835cdba..f42cd30ec643 100644 --- a/op-node/rollup/chain_spec_test.go +++ b/op-node/rollup/chain_spec_test.go @@ -36,7 +36,8 @@ var testConfig = Config{ BlockTime: 2, MaxSequencerDrift: 600, SeqWindowSize: 3600, - ChannelTimeout: 300, + ChannelTimeoutBedrock: 300, + ChannelTimeoutGranite: 50, L1ChainID: big.NewInt(1), L2ChainID: big.NewInt(10), RegolithTime: u64ptr(10), @@ -44,6 +45,7 @@ var testConfig = Config{ DeltaTime: u64ptr(30), EcotoneTime: u64ptr(40), FjordTime: u64ptr(50), + GraniteTime: u64ptr(60), InteropTime: nil, BatchInboxAddress: common.HexToAddress("0xff00000000000000000000000000000000000010"), DepositContractAddress: common.HexToAddress("0xbEb5Fc579115071764c7423A4f12eDde41f106Ed"), @@ -170,10 +172,16 @@ func TestCheckForkActivation(t *testing.T) { expectedCurrentFork: Canyon, expectedLog: "Detected hardfork activation block", }, + { + name: "Granite activation", + block: eth.L2BlockRef{Time: 60, Number: 8, Hash: common.Hash{0x7}}, + expectedCurrentFork: Granite, + expectedLog: "Detected hardfork activation block", + }, { name: "No more hardforks", - block: eth.L2BlockRef{Time: 700, Number: 8, Hash: common.Hash{0x8}}, - expectedCurrentFork: Fjord, + block: eth.L2BlockRef{Time: 700, Number: 9, Hash: common.Hash{0x8}}, + expectedCurrentFork: Granite, expectedLog: "", }, } diff --git a/op-node/rollup/derive/channel_bank.go b/op-node/rollup/derive/channel_bank.go index 2a821bb868b1..b2efb0d3ce16 100644 --- a/op-node/rollup/derive/channel_bank.go +++ b/op-node/rollup/derive/channel_bank.go @@ -98,7 +98,7 @@ func (cb *ChannelBank) IngestFrame(f Frame) { } // check if the channel is not timed out - if currentCh.OpenBlockNumber()+cb.spec.ChannelTimeout() < origin.Number { + if currentCh.OpenBlockNumber()+cb.spec.ChannelTimeout(origin.Time) < origin.Number { log.Warn("channel is timed out, ignore frame") return } @@ -125,7 +125,7 @@ func (cb *ChannelBank) Read() (data []byte, err error) { // channels at the head of the queue and we want to remove them all. first := cb.channelQueue[0] ch := cb.channels[first] - timedOut := ch.OpenBlockNumber()+cb.spec.ChannelTimeout() < cb.Origin().Number + timedOut := ch.OpenBlockNumber()+cb.spec.ChannelTimeout(cb.Origin().Time) < cb.Origin().Number if timedOut { cb.log.Info("channel timed out", "channel", first, "frames", len(ch.inputs)) cb.metrics.RecordChannelTimedOut() @@ -157,7 +157,7 @@ func (cb *ChannelBank) Read() (data []byte, err error) { func (cb *ChannelBank) tryReadChannelAtIndex(i int) (data []byte, err error) { chanID := cb.channelQueue[i] ch := cb.channels[chanID] - timedOut := ch.OpenBlockNumber()+cb.spec.ChannelTimeout() < cb.Origin().Number + timedOut := ch.OpenBlockNumber()+cb.spec.ChannelTimeout(cb.Origin().Time) < cb.Origin().Number if timedOut || !ch.IsReady() { return nil, io.EOF } diff --git a/op-node/rollup/derive/channel_bank_test.go b/op-node/rollup/derive/channel_bank_test.go index a4485834ece6..99c4381350ed 100644 --- a/op-node/rollup/derive/channel_bank_test.go +++ b/op-node/rollup/derive/channel_bank_test.go @@ -100,7 +100,7 @@ func TestChannelBankSimple(t *testing.T) { input.AddFrames("a:1:second") input.AddFrame(Frame{}, io.EOF) - cfg := &rollup.Config{ChannelTimeout: 10} + cfg := &rollup.Config{ChannelTimeoutBedrock: 10, ChannelTimeoutGranite: 10} cb := NewChannelBank(testlog.Logger(t, log.LevelCrit), cfg, input, nil, metrics.NoopMetrics) @@ -144,7 +144,7 @@ func TestChannelBankInterleavedPreCanyon(t *testing.T) { input.AddFrames("a:1:second") input.AddFrame(Frame{}, io.EOF) - cfg := &rollup.Config{ChannelTimeout: 10, CanyonTime: nil} + cfg := &rollup.Config{ChannelTimeoutBedrock: 10, ChannelTimeoutGranite: 10, CanyonTime: nil} cb := NewChannelBank(testlog.Logger(t, log.LevelCrit), cfg, input, nil, metrics.NoopMetrics) @@ -209,7 +209,7 @@ func TestChannelBankInterleaved(t *testing.T) { input.AddFrame(Frame{}, io.EOF) ct := uint64(0) - cfg := &rollup.Config{ChannelTimeout: 10, CanyonTime: &ct} + cfg := &rollup.Config{ChannelTimeoutBedrock: 10, ChannelTimeoutGranite: 10, CanyonTime: &ct} cb := NewChannelBank(testlog.Logger(t, log.LevelCrit), cfg, input, nil, metrics.NoopMetrics) @@ -269,7 +269,7 @@ func TestChannelBankDuplicates(t *testing.T) { input.AddFrames("a:1:second") input.AddFrame(Frame{}, io.EOF) - cfg := &rollup.Config{ChannelTimeout: 10} + cfg := &rollup.Config{ChannelTimeoutBedrock: 10, ChannelTimeoutGranite: 10} cb := NewChannelBank(testlog.Logger(t, log.LevelCrit), cfg, input, nil, metrics.NoopMetrics) diff --git a/op-node/rollup/derive/pipeline.go b/op-node/rollup/derive/pipeline.go index 7d74fb9da800..65103f51edcc 100644 --- a/op-node/rollup/derive/pipeline.go +++ b/op-node/rollup/derive/pipeline.go @@ -197,29 +197,36 @@ func (dp *DerivationPipeline) initialReset(ctx context.Context, resetL2Safe eth. dp.log.Info("Rewinding derivation-pipeline L1 traversal to handle reset") dp.metrics.RecordPipelineReset() + spec := rollup.NewChainSpec(dp.rollupCfg) // Walk back L2 chain to find the L1 origin that is old enough to start buffering channel data from. pipelineL2 := resetL2Safe l1Origin := resetL2Safe.L1Origin + + pipelineOrigin, err := dp.l1Fetcher.L1BlockRefByHash(ctx, l1Origin.Hash) + if err != nil { + return NewTemporaryError(fmt.Errorf("failed to fetch the new L1 progress: origin: %s; err: %w", pipelineL2.L1Origin, err)) + } + for { afterL2Genesis := pipelineL2.Number > dp.rollupCfg.Genesis.L2.Number afterL1Genesis := pipelineL2.L1Origin.Number > dp.rollupCfg.Genesis.L1.Number - afterChannelTimeout := pipelineL2.L1Origin.Number+dp.rollupCfg.ChannelTimeout > l1Origin.Number + afterChannelTimeout := pipelineL2.L1Origin.Number+spec.ChannelTimeout(pipelineOrigin.Time) > l1Origin.Number if afterL2Genesis && afterL1Genesis && afterChannelTimeout { parent, err := dp.l2.L2BlockRefByHash(ctx, pipelineL2.ParentHash) if err != nil { return NewResetError(fmt.Errorf("failed to fetch L2 parent block %s", pipelineL2.ParentID())) } pipelineL2 = parent + pipelineOrigin, err = dp.l1Fetcher.L1BlockRefByHash(ctx, pipelineL2.L1Origin.Hash) + if err != nil { + return NewTemporaryError(fmt.Errorf("failed to fetch the new L1 progress: origin: %s; err: %w", pipelineL2.L1Origin, err)) + } } else { break } } - pipelineOrigin, err := dp.l1Fetcher.L1BlockRefByHash(ctx, pipelineL2.L1Origin.Hash) - if err != nil { - return NewTemporaryError(fmt.Errorf("failed to fetch the new L1 progress: origin: %s; err: %w", pipelineL2.L1Origin, err)) - } sysCfg, err := dp.l2.SystemConfigByL2Hash(ctx, pipelineL2.Hash) if err != nil { return NewTemporaryError(fmt.Errorf("failed to fetch L1 config of L2 block %s: %w", pipelineL2.ID(), err)) diff --git a/op-node/rollup/sequencing/sequencer.go b/op-node/rollup/sequencing/sequencer.go index 74f5478e9fe5..0a02bcaf40b6 100644 --- a/op-node/rollup/sequencing/sequencer.go +++ b/op-node/rollup/sequencing/sequencer.go @@ -526,6 +526,11 @@ func (d *Sequencer) startBuildingBlock() { d.log.Info("Sequencing Fjord upgrade block") } + // For the Fjord activation block we shouldn't include any sequencer transactions. + if d.rollupCfg.IsGraniteActivationBlock(uint64(attrs.Timestamp)) { + d.log.Info("Sequencing Granite upgrade block") + } + d.log.Debug("prepared attributes for new block", "num", l2Head.Number+1, "time", uint64(attrs.Timestamp), "origin", l1Origin, "origin_time", l1Origin.Time, "noTxPool", attrs.NoTxPool) diff --git a/op-node/rollup/superchain.go b/op-node/rollup/superchain.go index ad16989fb64a..cd6f5d6169e8 100644 --- a/op-node/rollup/superchain.go +++ b/op-node/rollup/superchain.go @@ -78,7 +78,8 @@ func LoadOPStackRollupConfig(chainID uint64) (*Config, error) { BlockTime: chConfig.BlockTime, MaxSequencerDrift: 600, SeqWindowSize: chConfig.SequencerWindowSize, - ChannelTimeout: 300, + ChannelTimeoutBedrock: 300, + ChannelTimeoutGranite: 50, L1ChainID: new(big.Int).SetUint64(superChain.Config.L1.ChainID), L2ChainID: new(big.Int).SetUint64(chConfig.ChainID), RegolithTime: ®olithTime, diff --git a/op-node/rollup/types.go b/op-node/rollup/types.go index 892bcfa86bc4..f4d57db830ca 100644 --- a/op-node/rollup/types.go +++ b/op-node/rollup/types.go @@ -19,6 +19,7 @@ import ( var ( ErrBlockTimeZero = errors.New("block time cannot be 0") ErrMissingChannelTimeout = errors.New("channel timeout must be set, this should cover at least a L1 block time") + ErrInvalidGraniteChannelTimeout = errors.New("channel timeout granite must be less than channel timeout") ErrInvalidSeqWindowSize = errors.New("sequencing window size must at least be 2") ErrMissingGenesisL1Hash = errors.New("genesis L1 hash cannot be empty") ErrMissingGenesisL2Hash = errors.New("genesis L2 hash cannot be empty") @@ -81,7 +82,8 @@ type Config struct { // Number of epochs (L1 blocks) per sequencing window, including the epoch L1 origin block itself SeqWindowSize uint64 `json:"seq_window_size"` // Number of L1 blocks between when a channel can be opened and when it must be closed by. - ChannelTimeout uint64 `json:"channel_timeout"` + ChannelTimeoutBedrock uint64 `json:"channel_timeout"` + ChannelTimeoutGranite uint64 `json:"channel_timeout_granite"` // Required to verify L1 signatures L1ChainID *big.Int `json:"l1_chain_id"` // Required to identify the L2 network and create p2p signatures unique for this chain. @@ -266,9 +268,17 @@ func (cfg *Config) Check() error { if cfg.BlockTime == 0 { return ErrBlockTimeZero } - if cfg.ChannelTimeout == 0 { + if cfg.ChannelTimeoutBedrock == 0 { return ErrMissingChannelTimeout } + if cfg.GraniteTime != nil { + if cfg.ChannelTimeoutGranite == 0 { + return ErrMissingChannelTimeout + } + if cfg.ChannelTimeoutGranite > cfg.ChannelTimeoutBedrock { + return ErrInvalidGraniteChannelTimeout + } + } if cfg.SeqWindowSize < 2 { return ErrInvalidSeqWindowSize } diff --git a/op-node/rollup/types_test.go b/op-node/rollup/types_test.go index 46d232a3ad06..2b00e12fd7aa 100644 --- a/op-node/rollup/types_test.go +++ b/op-node/rollup/types_test.go @@ -42,7 +42,8 @@ func randConfig() *Config { BlockTime: 2, MaxSequencerDrift: 100, SeqWindowSize: 2, - ChannelTimeout: 123, + ChannelTimeoutBedrock: 123, + ChannelTimeoutGranite: 45, L1ChainID: big.NewInt(900), L2ChainID: big.NewInt(901), BatchInboxAddress: randAddr(), @@ -232,6 +233,15 @@ func TestActivations(t *testing.T) { return c.IsFjord(t) }, }, + { + name: "Granite", + setUpgradeTime: func(t *uint64, c *Config) { + c.GraniteTime = t + }, + checkEnabled: func(t uint64, c *Config) bool { + return c.IsGranite(t) + }, + }, { name: "Interop", setUpgradeTime: func(t *uint64, c *Config) { @@ -366,8 +376,27 @@ func TestConfig_Check(t *testing.T) { expectedErr: ErrBlockTimeZero, }, { - name: "ChannelTimeoutZero", - modifier: func(cfg *Config) { cfg.ChannelTimeout = 0 }, + name: "ChannelTimeoutBedrockZero", + modifier: func(cfg *Config) { cfg.ChannelTimeoutBedrock = 0 }, + expectedErr: ErrMissingChannelTimeout, + }, + { + name: "ChannelTimeoutGraniteZeroNotEnabled", + modifier: func(cfg *Config) { cfg.ChannelTimeoutGranite = 0 }, + expectedErr: nil, + }, + { + name: "ChannelTimeoutGraniteZeroEnabled", + modifier: func(cfg *Config) { + genesis := uint64(0) + cfg.ChannelTimeoutGranite = 0 + cfg.RegolithTime = &genesis + cfg.CanyonTime = &genesis + cfg.DeltaTime = &genesis + cfg.EcotoneTime = &genesis + cfg.FjordTime = &genesis + cfg.GraniteTime = &genesis + }, expectedErr: ErrMissingChannelTimeout, }, { @@ -466,7 +495,7 @@ func TestConfig_Check(t *testing.T) { cfg := randConfig() test.modifier(cfg) err := cfg.Check() - assert.Same(t, err, test.expectedErr) + assert.ErrorIs(t, err, test.expectedErr) }) } diff --git a/op-wheel/commands.go b/op-wheel/commands.go index 908e62275879..b7556cb1aea0 100644 --- a/op-wheel/commands.go +++ b/op-wheel/commands.go @@ -229,6 +229,7 @@ func rollupFromGethConfig(cfg *params.ChainConfig) *rollup.Config { RegolithTime: cfg.RegolithTime, CanyonTime: cfg.CanyonTime, EcotoneTime: cfg.EcotoneTime, + GraniteTime: cfg.GraniteTime, InteropTime: cfg.InteropTime, } } diff --git a/packages/contracts-bedrock/README.md b/packages/contracts-bedrock/README.md index 5957a3c49a8a..50566e98949f 100644 --- a/packages/contracts-bedrock/README.md +++ b/packages/contracts-bedrock/README.md @@ -321,8 +321,8 @@ Use the env var `DEPLOY_CONFIG_PATH` to use a particular deploy config file at r The script will read the latest active fork from the deploy config and the L2 genesis allocs generated will be compatible with this fork. The automatically detected fork can be overwritten by setting the environment variable -`FORK` either to the lower-case fork name (currently `delta`, `ecotone`, or `fjord`) or to `latest`, which will select -the latest fork available (currently `fjord`). +`FORK` either to the lower-case fork name (currently `delta`, `ecotone`, `fjord`, or `granite`) or to `latest`, which +will select the latest fork available (currently `granite`). By default, the script will dump the L2 genesis allocs of the detected or selected fork only, to the file at `STATE_DUMP_PATH`. The optional environment variable `OUTPUT_MODE` allows to modify this behavior by setting it to one of the following values: diff --git a/packages/contracts-bedrock/scripts/Config.sol b/packages/contracts-bedrock/scripts/Config.sol index 0bf567b3dd1c..d4253113ce8a 100644 --- a/packages/contracts-bedrock/scripts/Config.sol +++ b/packages/contracts-bedrock/scripts/Config.sol @@ -32,10 +32,11 @@ enum Fork { NONE, DELTA, ECOTONE, - FJORD + FJORD, + GRANITE } -Fork constant LATEST_FORK = Fork.FJORD; +Fork constant LATEST_FORK = Fork.GRANITE; library ForkUtils { function toString(Fork _fork) internal pure returns (string memory) { @@ -47,6 +48,8 @@ library ForkUtils { return "ecotone"; } else if (_fork == Fork.FJORD) { return "fjord"; + } else if (_fork == Fork.GRANITE) { + return "granite"; } else { return "unknown"; } @@ -153,6 +156,8 @@ library Config { return Fork.ECOTONE; } else if (forkHash == keccak256(bytes("fjord"))) { return Fork.FJORD; + } else if (forkHash == keccak256(bytes("granite"))) { + return Fork.GRANITE; } else { revert(string.concat("Config: unknown fork: ", forkStr)); } diff --git a/packages/contracts-bedrock/scripts/L2Genesis.s.sol b/packages/contracts-bedrock/scripts/L2Genesis.s.sol index e6397fec3c33..f68dd6232882 100644 --- a/packages/contracts-bedrock/scripts/L2Genesis.s.sol +++ b/packages/contracts-bedrock/scripts/L2Genesis.s.sol @@ -158,6 +158,10 @@ contract L2Genesis is Deployer { if (writeForkGenesisAllocs(_fork, Fork.FJORD, _mode)) { return; } + + if (writeForkGenesisAllocs(_fork, Fork.GRANITE, _mode)) { + return; + } } function writeForkGenesisAllocs(Fork _latest, Fork _current, OutputMode _mode) internal returns (bool isLatest_) { diff --git a/packages/contracts-bedrock/scripts/deploy/DeployConfig.s.sol b/packages/contracts-bedrock/scripts/deploy/DeployConfig.s.sol index 25869e97f080..76d4ad43ee83 100644 --- a/packages/contracts-bedrock/scripts/deploy/DeployConfig.s.sol +++ b/packages/contracts-bedrock/scripts/deploy/DeployConfig.s.sol @@ -30,6 +30,7 @@ contract DeployConfig is Script { uint256 public l2GenesisDeltaTimeOffset; uint256 public l2GenesisEcotoneTimeOffset; uint256 public l2GenesisFjordTimeOffset; + uint256 public l2GenesisGraniteTimeOffset; uint256 public maxSequencerDrift; uint256 public sequencerWindowSize; uint256 public channelTimeout; @@ -108,6 +109,7 @@ contract DeployConfig is Script { l2GenesisDeltaTimeOffset = _readOr(_json, "$.l2GenesisDeltaTimeOffset", NULL_OFFSET); l2GenesisEcotoneTimeOffset = _readOr(_json, "$.l2GenesisEcotoneTimeOffset", NULL_OFFSET); l2GenesisFjordTimeOffset = _readOr(_json, "$.l2GenesisFjordTimeOffset", NULL_OFFSET); + l2GenesisGraniteTimeOffset = _readOr(_json, "$.l2GenesisGraniteTimeOffset", NULL_OFFSET); maxSequencerDrift = stdJson.readUint(_json, "$.maxSequencerDrift"); sequencerWindowSize = stdJson.readUint(_json, "$.sequencerWindowSize"); @@ -243,7 +245,9 @@ contract DeployConfig is Script { } function latestGenesisFork() internal view returns (Fork) { - if (l2GenesisFjordTimeOffset == 0) { + if (l2GenesisGraniteTimeOffset == 0) { + return Fork.GRANITE; + } else if (l2GenesisFjordTimeOffset == 0) { return Fork.FJORD; } else if (l2GenesisEcotoneTimeOffset == 0) { return Fork.ECOTONE; diff --git a/packages/contracts-bedrock/snapshots/state-diff/Kontrol-31337.json b/packages/contracts-bedrock/snapshots/state-diff/Kontrol-31337.json index 33e6500b8647..18c9e3961984 100644 --- a/packages/contracts-bedrock/snapshots/state-diff/Kontrol-31337.json +++ b/packages/contracts-bedrock/snapshots/state-diff/Kontrol-31337.json @@ -1971,7 +1971,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000003e" + "slot": "0x000000000000000000000000000000000000000000000000000000000000003f" } ], "value": 0 @@ -1997,7 +1997,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000003f" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000040" } ], "value": 0 @@ -2458,7 +2458,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000003e" + "slot": "0x000000000000000000000000000000000000000000000000000000000000003f" } ], "value": 0 @@ -2536,7 +2536,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000003f" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000040" } ], "value": 0 @@ -2631,7 +2631,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000043" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000044" } ], "value": 0 @@ -4271,7 +4271,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000049" + "slot": "0x000000000000000000000000000000000000000000000000000000000000004a" } ], "value": 0 @@ -5809,7 +5809,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000049" + "slot": "0x000000000000000000000000000000000000000000000000000000000000004a" } ], "value": 0 @@ -6762,7 +6762,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000042" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000043" } ], "value": 0 @@ -6788,7 +6788,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000042" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000043" } ], "value": 0 @@ -6814,7 +6814,7 @@ "newValue": "0x000000000000000000000000000000000000000000000000000000000000000c", "previousValue": "0x000000000000000000000000000000000000000000000000000000000000000c", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000040" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000041" } ], "value": 0 @@ -6840,7 +6840,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000006", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000006", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000041" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000042" } ], "value": 0 @@ -7499,7 +7499,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000093a80", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000093a80", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000003a" + "slot": "0x000000000000000000000000000000000000000000000000000000000000003b" } ], "value": 0 @@ -7731,7 +7731,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000093a80", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000093a80", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000003a" + "slot": "0x000000000000000000000000000000000000000000000000000000000000003b" } ], "value": 0 @@ -7808,7 +7808,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000002710", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000002710", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000003b" + "slot": "0x000000000000000000000000000000000000000000000000000000000000003c" } ], "value": 0 @@ -7834,7 +7834,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000078", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000078", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000003c" + "slot": "0x000000000000000000000000000000000000000000000000000000000000003d" } ], "value": 0 @@ -8524,7 +8524,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000043" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000044" } ], "value": 0 @@ -9493,7 +9493,7 @@ "newValue": "0x0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc", "previousValue": "0x0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000001b" + "slot": "0x000000000000000000000000000000000000000000000000000000000000001c" } ], "value": 0 @@ -9519,7 +9519,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000049" + "slot": "0x000000000000000000000000000000000000000000000000000000000000004a" } ], "value": 0 @@ -9571,7 +9571,7 @@ "newValue": "0x000000000000000000000000000000000000000000000001000c5fc500000558", "previousValue": "0x000000000000000000000000000000000000000000000001000c5fc500000558", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000030" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000031" } ], "value": 0 @@ -9597,7 +9597,7 @@ "newValue": "0x000000000000000000000000000000000000000000000001000c5fc500000558", "previousValue": "0x000000000000000000000000000000000000000000000001000c5fc500000558", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000030" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000031" } ], "value": 0 @@ -9623,7 +9623,7 @@ "newValue": "0x00000000000000000000000000000000000000000000000000000000017d7840", "previousValue": "0x00000000000000000000000000000000000000000000000000000000017d7840", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000002f" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000030" } ], "value": 0 @@ -9649,7 +9649,7 @@ "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000019" + "slot": "0x000000000000000000000000000000000000000000000000000000000000001a" } ], "value": 0 @@ -9675,7 +9675,7 @@ "newValue": "0x000000000000000000000000ff00000000000000000000000000000000000000", "previousValue": "0x000000000000000000000000ff00000000000000000000000000000000000000", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000001a" + "slot": "0x000000000000000000000000000000000000000000000000000000000000001b" } ], "value": 0 @@ -10348,7 +10348,7 @@ "newValue": "0x000000000000000000000000000000000000000000000001000c5fc500000558", "previousValue": "0x000000000000000000000000000000000000000000000001000c5fc500000558", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000030" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000031" } ], "value": 0 @@ -10426,7 +10426,7 @@ "newValue": "0x000000000000000000000000000000000000000000000001000c5fc500000558", "previousValue": "0x000000000000000000000000000000000000000000000001000c5fc500000558", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000030" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000031" } ], "value": 0 @@ -10504,7 +10504,7 @@ "newValue": "0x0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc", "previousValue": "0x0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000001b" + "slot": "0x000000000000000000000000000000000000000000000000000000000000001c" } ], "value": 0 @@ -10582,7 +10582,7 @@ "newValue": "0x00000000000000000000000000000000000000000000000000000000017d7840", "previousValue": "0x00000000000000000000000000000000000000000000000000000000017d7840", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000002f" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000030" } ], "value": 0 @@ -10660,7 +10660,7 @@ "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000019" + "slot": "0x000000000000000000000000000000000000000000000000000000000000001a" } ], "value": 0 @@ -10790,7 +10790,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000003d" + "slot": "0x000000000000000000000000000000000000000000000000000000000000003e" } ], "value": 0 @@ -10868,7 +10868,7 @@ "newValue": "0x000000000000000000000000ff00000000000000000000000000000000000000", "previousValue": "0x000000000000000000000000ff00000000000000000000000000000000000000", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000001a" + "slot": "0x000000000000000000000000000000000000000000000000000000000000001b" } ], "value": 0 @@ -15034,7 +15034,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000006", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000006", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000001c" + "slot": "0x000000000000000000000000000000000000000000000000000000000000001d" } ], "value": 0 @@ -15086,7 +15086,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000001e" + "slot": "0x000000000000000000000000000000000000000000000000000000000000001f" } ], "value": 0 @@ -15112,7 +15112,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000001d" + "slot": "0x000000000000000000000000000000000000000000000000000000000000001e" }, { "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", @@ -15120,7 +15120,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000001d" + "slot": "0x000000000000000000000000000000000000000000000000000000000000001e" } ], "value": 0 @@ -15146,7 +15146,7 @@ "newValue": "0x00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8", "previousValue": "0x00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000001f" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000020" } ], "value": 0 @@ -15172,7 +15172,7 @@ "newValue": "0x0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63", "previousValue": "0x0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000020" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000021" } ], "value": 0 @@ -15198,7 +15198,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000024", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000024", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000021" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000022" } ], "value": 0 @@ -15581,7 +15581,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000001d" + "slot": "0x000000000000000000000000000000000000000000000000000000000000001e" }, { "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", @@ -15589,7 +15589,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000001d" + "slot": "0x000000000000000000000000000000000000000000000000000000000000001e" } ], "value": 0 @@ -15615,7 +15615,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000006", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000006", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000001c" + "slot": "0x000000000000000000000000000000000000000000000000000000000000001d" } ], "value": 0 @@ -15693,7 +15693,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000006", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000006", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000001c" + "slot": "0x000000000000000000000000000000000000000000000000000000000000001d" } ], "value": 0 @@ -15927,7 +15927,7 @@ "newValue": "0x00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8", "previousValue": "0x00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000001f" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000020" } ], "value": 0 @@ -16005,7 +16005,7 @@ "newValue": "0x00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8", "previousValue": "0x00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000001f" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000020" } ], "value": 0 @@ -16083,7 +16083,7 @@ "newValue": "0x0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63", "previousValue": "0x0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000020" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000021" } ], "value": 0 @@ -16161,7 +16161,7 @@ "newValue": "0x0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63", "previousValue": "0x0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000020" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000021" } ], "value": 0 @@ -16239,7 +16239,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000024", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000024", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000021" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000022" } ], "value": 0 @@ -16317,7 +16317,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000024", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000024", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000021" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000022" } ], "value": 0 @@ -16395,7 +16395,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000001e" + "slot": "0x000000000000000000000000000000000000000000000000000000000000001f" } ], "value": 0 @@ -17379,7 +17379,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000093a80", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000093a80", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000003a" + "slot": "0x000000000000000000000000000000000000000000000000000000000000003b" } ], "value": 0 @@ -17534,7 +17534,7 @@ "newValue": "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", "previousValue": "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000035" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000036" } ], "value": 0 @@ -17560,7 +17560,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000034" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000035" } ], "value": 0 @@ -17586,7 +17586,7 @@ "newValue": "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", "previousValue": "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000035" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000036" } ], "value": 0 @@ -17612,7 +17612,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000034" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000035" } ], "value": 0 @@ -17638,7 +17638,7 @@ "newValue": "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", "previousValue": "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000035" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000036" } ], "value": 0 @@ -17664,7 +17664,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000034" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000035" } ], "value": 0 @@ -17690,7 +17690,7 @@ "newValue": "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", "previousValue": "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000035" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000036" } ], "value": 0 @@ -17716,7 +17716,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000034" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000035" } ], "value": 0 @@ -17742,7 +17742,7 @@ "newValue": "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", "previousValue": "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000035" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000036" } ], "value": 0 @@ -17768,7 +17768,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000034" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000035" } ], "value": 0 @@ -18193,7 +18193,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000034" } ], "value": 0 @@ -18219,7 +18219,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000034" } ], "value": 0 @@ -18245,7 +18245,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000008", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000008", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000036" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000037" } ], "value": 0 @@ -18271,7 +18271,7 @@ "newValue": "0x00000000000000000000000000000000000000000000000000000000000004b0", "previousValue": "0x00000000000000000000000000000000000000000000000000000000000004b0", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000039" + "slot": "0x000000000000000000000000000000000000000000000000000000000000003a" } ], "value": 0 @@ -18349,7 +18349,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000004", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000004", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000037" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000038" } ], "value": 0 @@ -18375,7 +18375,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000038" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000039" } ], "value": 0 @@ -18563,7 +18563,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000034" } ], "value": 0 @@ -18589,7 +18589,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000034" } ], "value": 0 @@ -18615,7 +18615,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000008", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000008", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000036" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000037" } ], "value": 0 @@ -18641,7 +18641,7 @@ "newValue": "0x00000000000000000000000000000000000000000000000000000000000004b0", "previousValue": "0x00000000000000000000000000000000000000000000000000000000000004b0", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000039" + "slot": "0x000000000000000000000000000000000000000000000000000000000000003a" } ], "value": 0 @@ -18719,7 +18719,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000004", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000004", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000037" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000038" } ], "value": 0 @@ -18745,7 +18745,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000038" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000039" } ], "value": 0 @@ -18771,7 +18771,7 @@ "newValue": "0x00000000000000000000000000000000000000000000000000000000000004b0", "previousValue": "0x00000000000000000000000000000000000000000000000000000000000004b0", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000039" + "slot": "0x000000000000000000000000000000000000000000000000000000000000003a" } ], "value": 0 @@ -18823,7 +18823,7 @@ "newValue": "0x00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8", "previousValue": "0x00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000001f" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000020" } ], "value": 0 @@ -18849,7 +18849,7 @@ "newValue": "0x0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63", "previousValue": "0x0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63", "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000020" + "slot": "0x0000000000000000000000000000000000000000000000000000000000000021" } ], "value": 0 @@ -19423,7 +19423,7 @@ "newValue": "0x0000000000000000000000000000000000000000000000000000000000093a80", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000093a80", "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000003a" + "slot": "0x000000000000000000000000000000000000000000000000000000000000003b" } ], "value": 0 From c14a8b2abfa103880a006423d70932b86b0b0b5f Mon Sep 17 00:00:00 2001 From: smartcontracts Date: Mon, 5 Aug 2024 19:41:34 +0200 Subject: [PATCH 11/59] fix: SuperchainWETH fuzz testing chain ID error (#11352) Minor fix to fuzz testing for SuperchainWETH and related contracts. Recipient chain ID cannot be the same as the sending chain ID. Contracts throw an error when this is the case, causing fuzz tests to fail. --- packages/contracts-bedrock/invariant-docs/SuperchainWETH.md | 2 +- packages/contracts-bedrock/test/L2/SuperchainWETH.t.sol | 3 +++ .../contracts-bedrock/test/invariants/SuperchainWETH.t.sol | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/contracts-bedrock/invariant-docs/SuperchainWETH.md b/packages/contracts-bedrock/invariant-docs/SuperchainWETH.md index aaed4710b5dc..b9f569e30ef1 100644 --- a/packages/contracts-bedrock/invariant-docs/SuperchainWETH.md +++ b/packages/contracts-bedrock/invariant-docs/SuperchainWETH.md @@ -1,5 +1,5 @@ # `SuperchainWETH` Invariants ## Calls to sendERC20 should always succeed as long as the actor has less than uint248 wei which is much greater than the total ETH supply. Actor's balance should also not increase out of nowhere. -**Test:** [`SuperchainWETH.t.sol#L171`](../test/invariants/SuperchainWETH.t.sol#L171) +**Test:** [`SuperchainWETH.t.sol#L174`](../test/invariants/SuperchainWETH.t.sol#L174) diff --git a/packages/contracts-bedrock/test/L2/SuperchainWETH.t.sol b/packages/contracts-bedrock/test/L2/SuperchainWETH.t.sol index 2024f8ddbb40..889ff8e8e40f 100644 --- a/packages/contracts-bedrock/test/L2/SuperchainWETH.t.sol +++ b/packages/contracts-bedrock/test/L2/SuperchainWETH.t.sol @@ -133,6 +133,7 @@ contract SuperchainWETH_Test is CommonTest { public { // Assume + vm.assume(_chainId != block.chainid); _amount = bound(_amount, 0, type(uint248).max - 1); // Arrange @@ -169,6 +170,7 @@ contract SuperchainWETH_Test is CommonTest { /// @param _chainId The chain ID to send the WETH to. function testFuzz_sendERC20_sufficientFromCustomGasTokenChain_succeeds(uint256 _amount, uint256 _chainId) public { // Assume + vm.assume(_chainId != block.chainid); _amount = bound(_amount, 0, type(uint248).max - 1); // Arrange @@ -204,6 +206,7 @@ contract SuperchainWETH_Test is CommonTest { /// @param _chainId The chain ID to send the WETH to. function testFuzz_sendERC20_insufficientBalance_fails(uint256 _amount, uint256 _chainId) public { // Assume + vm.assume(_chainId != block.chainid); _amount = bound(_amount, 0, type(uint248).max - 1); // Arrange diff --git a/packages/contracts-bedrock/test/invariants/SuperchainWETH.t.sol b/packages/contracts-bedrock/test/invariants/SuperchainWETH.t.sol index 19318fbda6e1..8d5475d15040 100644 --- a/packages/contracts-bedrock/test/invariants/SuperchainWETH.t.sol +++ b/packages/contracts-bedrock/test/invariants/SuperchainWETH.t.sol @@ -87,6 +87,9 @@ contract SuperchainWETH_User is StdUtils { // Bound send amount to our WETH balance. _amount = bound(_amount, 0, weth.balanceOf(address(this))); + // Prevent receiving chain ID from being the same as the current chain ID. + _chainId = _chainId == block.chainid ? _chainId + 1 : _chainId; + // Send the amount. try weth.sendERC20(address(this), _amount, _chainId) { // Success. From 6e1d30d4fd60fd9eb6867d7bc64b2c8a5698eb64 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Tue, 6 Aug 2024 03:49:13 +1000 Subject: [PATCH 12/59] Apply error variable lint in op-node/p2p (#11354) --- op-node/p2p/gating/expiry.go | 4 ++-- op-node/p2p/gating/expiry_test.go | 14 +++++++------- op-node/p2p/store/iface.go | 6 +++--- op-node/p2p/store/ip_ban_book.go | 4 ++-- op-node/p2p/store/ip_ban_book_test.go | 2 +- op-node/p2p/store/mdbook.go | 2 +- op-node/p2p/store/peer_ban_book.go | 4 ++-- op-node/p2p/store/peer_ban_book_test.go | 2 +- op-node/p2p/store/records_book.go | 10 +++++----- op-node/p2p/store/scorebook.go | 2 +- op-node/p2p/sync.go | 10 +++++----- 11 files changed, 30 insertions(+), 30 deletions(-) diff --git a/op-node/p2p/gating/expiry.go b/op-node/p2p/gating/expiry.go index e6f1662b3597..b1d22ce87454 100644 --- a/op-node/p2p/gating/expiry.go +++ b/op-node/p2p/gating/expiry.go @@ -61,7 +61,7 @@ func (g *ExpiryConnectionGater) UnblockPeer(p peer.ID) error { func (g *ExpiryConnectionGater) peerBanExpiryCheck(p peer.ID) (allow bool) { // if the peer is blocked, check if it's time to unblock expiry, err := g.store.GetPeerBanExpiration(p) - if errors.Is(err, store.UnknownBanErr) { + if errors.Is(err, store.ErrUnknownBan) { return true // peer is allowed if it has not been banned } if err != nil { @@ -88,7 +88,7 @@ func (g *ExpiryConnectionGater) addrBanExpiryCheck(ma multiaddr.Multiaddr) (allo } // if just the IP is blocked, check if it's time to unblock expiry, err := g.store.GetIPBanExpiration(ip) - if errors.Is(err, store.UnknownBanErr) { + if errors.Is(err, store.ErrUnknownBan) { return true // IP is allowed if it has not been banned } if err != nil { diff --git a/op-node/p2p/gating/expiry_test.go b/op-node/p2p/gating/expiry_test.go index 453e1d3fe2cb..45b819aa0bf3 100644 --- a/op-node/p2p/gating/expiry_test.go +++ b/op-node/p2p/gating/expiry_test.go @@ -47,7 +47,7 @@ func TestExpiryConnectionGater_InterceptPeerDial(t *testing.T) { t.Run("unknown expiring ban", func(t *testing.T) { _, mockExpiryStore, mockGater, gater := expiryTestSetup(t) mockGater.EXPECT().InterceptPeerDial(mallory).Return(true) - mockExpiryStore.EXPECT().GetPeerBanExpiration(mallory).Return(time.Time{}, store.UnknownBanErr) + mockExpiryStore.EXPECT().GetPeerBanExpiration(mallory).Return(time.Time{}, store.ErrUnknownBan) allow := gater.InterceptPeerDial(mallory) require.True(t, allow) }) @@ -68,7 +68,7 @@ func TestExpiryConnectionGater_InterceptAddrDial(t *testing.T) { t.Run("expired IP ban", func(t *testing.T) { cl, mockExpiryStore, mockGater, gater := expiryTestSetup(t) mockGater.EXPECT().InterceptAddrDial(mallory, addr).Return(true) - mockExpiryStore.EXPECT().GetPeerBanExpiration(mallory).Return(time.Time{}, store.UnknownBanErr) + mockExpiryStore.EXPECT().GetPeerBanExpiration(mallory).Return(time.Time{}, store.ErrUnknownBan) mockExpiryStore.EXPECT().GetIPBanExpiration(ip.To4()).Return(cl.Now().Add(-time.Second), nil) mockExpiryStore.EXPECT().SetIPBanExpiration(ip.To4(), time.Time{}).Return(nil) allow := gater.InterceptAddrDial(mallory, addr) @@ -77,7 +77,7 @@ func TestExpiryConnectionGater_InterceptAddrDial(t *testing.T) { t.Run("active IP ban", func(t *testing.T) { cl, mockExpiryStore, mockGater, gater := expiryTestSetup(t) mockGater.EXPECT().InterceptAddrDial(mallory, addr).Return(true) - mockExpiryStore.EXPECT().GetPeerBanExpiration(mallory).Return(time.Time{}, store.UnknownBanErr) + mockExpiryStore.EXPECT().GetPeerBanExpiration(mallory).Return(time.Time{}, store.ErrUnknownBan) mockExpiryStore.EXPECT().GetIPBanExpiration(ip.To4()).Return(cl.Now().Add(time.Second), nil) allow := gater.InterceptAddrDial(mallory, addr) require.False(t, allow) @@ -85,8 +85,8 @@ func TestExpiryConnectionGater_InterceptAddrDial(t *testing.T) { t.Run("unknown IP ban expiry", func(t *testing.T) { _, mockExpiryStore, mockGater, gater := expiryTestSetup(t) mockGater.EXPECT().InterceptAddrDial(mallory, addr).Return(true) - mockExpiryStore.EXPECT().GetPeerBanExpiration(mallory).Return(time.Time{}, store.UnknownBanErr) - mockExpiryStore.EXPECT().GetIPBanExpiration(ip.To4()).Return(time.Time{}, store.UnknownBanErr) + mockExpiryStore.EXPECT().GetPeerBanExpiration(mallory).Return(time.Time{}, store.ErrUnknownBan) + mockExpiryStore.EXPECT().GetIPBanExpiration(ip.To4()).Return(time.Time{}, store.ErrUnknownBan) allow := gater.InterceptAddrDial(mallory, addr) require.True(t, allow) }) @@ -165,7 +165,7 @@ func TestExpiryConnectionGater_InterceptAccept(t *testing.T) { t.Run("unknown expiry", func(t *testing.T) { _, mockExpiryStore, mockGater, gater := expiryTestSetup(t) mockGater.EXPECT().InterceptAccept(mas).Return(true) - mockExpiryStore.EXPECT().GetIPBanExpiration(ip.To4()).Return(time.Time{}, store.UnknownBanErr) + mockExpiryStore.EXPECT().GetIPBanExpiration(ip.To4()).Return(time.Time{}, store.ErrUnknownBan) allow := gater.InterceptAccept(mas) require.True(t, allow) }) @@ -201,7 +201,7 @@ func TestExpiryConnectionGater_InterceptSecured(t *testing.T) { t.Run("unknown expiry", func(t *testing.T) { _, mockExpiryStore, mockGater, gater := expiryTestSetup(t) mockGater.EXPECT().InterceptSecured(network.DirInbound, mallory, mas).Return(true) - mockExpiryStore.EXPECT().GetPeerBanExpiration(mallory).Return(time.Time{}, store.UnknownBanErr) + mockExpiryStore.EXPECT().GetPeerBanExpiration(mallory).Return(time.Time{}, store.ErrUnknownBan) allow := gater.InterceptSecured(network.DirInbound, mallory, mas) require.True(t, allow) }) diff --git a/op-node/p2p/store/iface.go b/op-node/p2p/store/iface.go index 5961481bf28a..a83b5ae06e43 100644 --- a/op-node/p2p/store/iface.go +++ b/op-node/p2p/store/iface.go @@ -102,13 +102,13 @@ type ScoreDiff interface { Apply(score *scoreRecord) } -var UnknownBanErr = errors.New("unknown ban") +var ErrUnknownBan = errors.New("unknown ban") type PeerBanStore interface { // SetPeerBanExpiration create the peer ban with expiration time. // If expiry == time.Time{} then the ban is deleted. SetPeerBanExpiration(id peer.ID, expiry time.Time) error - // GetPeerBanExpiration gets the peer ban expiration time, or UnknownBanErr error if none exists. + // GetPeerBanExpiration gets the peer ban expiration time, or ErrUnknownBan error if none exists. GetPeerBanExpiration(id peer.ID) (time.Time, error) } @@ -116,7 +116,7 @@ type IPBanStore interface { // SetIPBanExpiration create the IP ban with expiration time. // If expiry == time.Time{} then the ban is deleted. SetIPBanExpiration(ip net.IP, expiry time.Time) error - // GetIPBanExpiration gets the IP ban expiration time, or UnknownBanErr error if none exists. + // GetIPBanExpiration gets the IP ban expiration time, or ErrUnknownBan error if none exists. GetIPBanExpiration(ip net.IP) (time.Time, error) } diff --git a/op-node/p2p/store/ip_ban_book.go b/op-node/p2p/store/ip_ban_book.go index 475bf21a791c..b1d1bc0e9194 100644 --- a/op-node/p2p/store/ip_ban_book.go +++ b/op-node/p2p/store/ip_ban_book.go @@ -71,8 +71,8 @@ func (d *ipBanBook) startGC() { func (d *ipBanBook) GetIPBanExpiration(ip net.IP) (time.Time, error) { rec, err := d.book.getRecord(ip.To16().String()) - if err == UnknownRecordErr { - return time.Time{}, UnknownBanErr + if err == ErrUnknownRecord { + return time.Time{}, ErrUnknownBan } if err != nil { return time.Time{}, err diff --git a/op-node/p2p/store/ip_ban_book_test.go b/op-node/p2p/store/ip_ban_book_test.go index 24d3574e0c93..d699c007eb5e 100644 --- a/op-node/p2p/store/ip_ban_book_test.go +++ b/op-node/p2p/store/ip_ban_book_test.go @@ -18,7 +18,7 @@ func TestGetUnknownIPBan(t *testing.T) { book := createMemoryIPBanBook(t) defer book.Close() exp, err := book.GetIPBanExpiration(net.IPv4(1, 2, 3, 4)) - require.Same(t, UnknownBanErr, err) + require.Same(t, ErrUnknownBan, err) require.Equal(t, time.Time{}, exp) } diff --git a/op-node/p2p/store/mdbook.go b/op-node/p2p/store/mdbook.go index 6c1362674956..50d63d2a4b62 100644 --- a/op-node/p2p/store/mdbook.go +++ b/op-node/p2p/store/mdbook.go @@ -69,7 +69,7 @@ func (m *metadataBook) startGC() { func (m *metadataBook) GetPeerMetadata(id peer.ID) (PeerMetadata, error) { record, err := m.book.getRecord(id) // If the record is not found, return an empty PeerMetadata - if err == UnknownRecordErr { + if err == ErrUnknownRecord { return PeerMetadata{}, nil } if err != nil { diff --git a/op-node/p2p/store/peer_ban_book.go b/op-node/p2p/store/peer_ban_book.go index 1e61f8c6eae9..7c30976d1b93 100644 --- a/op-node/p2p/store/peer_ban_book.go +++ b/op-node/p2p/store/peer_ban_book.go @@ -67,8 +67,8 @@ func (d *peerBanBook) startGC() { func (d *peerBanBook) GetPeerBanExpiration(id peer.ID) (time.Time, error) { rec, err := d.book.getRecord(id) - if err == UnknownRecordErr { - return time.Time{}, UnknownBanErr + if err == ErrUnknownRecord { + return time.Time{}, ErrUnknownBan } if err != nil { return time.Time{}, err diff --git a/op-node/p2p/store/peer_ban_book_test.go b/op-node/p2p/store/peer_ban_book_test.go index 580dea3a3e8e..f63206ff0076 100644 --- a/op-node/p2p/store/peer_ban_book_test.go +++ b/op-node/p2p/store/peer_ban_book_test.go @@ -17,7 +17,7 @@ func TestGetUnknownPeerBan(t *testing.T) { book := createMemoryPeerBanBook(t) defer book.Close() exp, err := book.GetPeerBanExpiration("a") - require.Same(t, UnknownBanErr, err) + require.Same(t, ErrUnknownBan, err) require.Equal(t, time.Time{}, exp) } diff --git a/op-node/p2p/store/records_book.go b/op-node/p2p/store/records_book.go index 9afac37abfbb..3772a180f6d0 100644 --- a/op-node/p2p/store/records_book.go +++ b/op-node/p2p/store/records_book.go @@ -30,7 +30,7 @@ type recordDiff[V record] interface { Apply(v V) } -var UnknownRecordErr = errors.New("unknown record") +var ErrUnknownRecord = errors.New("unknown record") // recordsBook is a generic K-V store to embed in the extended-peerstore. // It prunes old entries to keep the store small. @@ -103,13 +103,13 @@ func (d *recordsBook[K, V]) deleteRecord(key K) error { func (d *recordsBook[K, V]) getRecord(key K) (v V, err error) { if val, ok := d.cache.Get(key); ok { if d.hasExpired(val) { - return v, UnknownRecordErr + return v, ErrUnknownRecord } return val, nil } data, err := d.store.Get(d.ctx, d.dsKey(key)) if errors.Is(err, ds.ErrNotFound) { - return v, UnknownRecordErr + return v, ErrUnknownRecord } else if err != nil { return v, fmt.Errorf("failed to load value of key %v: %w", key, err) } @@ -118,7 +118,7 @@ func (d *recordsBook[K, V]) getRecord(key K) (v V, err error) { return v, fmt.Errorf("invalid value for key %v: %w", key, err) } if d.hasExpired(v) { - return v, UnknownRecordErr + return v, ErrUnknownRecord } d.cache.Add(key, v) return v, nil @@ -128,7 +128,7 @@ func (d *recordsBook[K, V]) SetRecord(key K, diff recordDiff[V]) (V, error) { d.Lock() defer d.Unlock() rec, err := d.getRecord(key) - if err == UnknownRecordErr { // instantiate new record if it does not exist yet + if err == ErrUnknownRecord { // instantiate new record if it does not exist yet rec = d.newRecord() } else if err != nil { return d.newRecord(), err diff --git a/op-node/p2p/store/scorebook.go b/op-node/p2p/store/scorebook.go index 68043ef8a9e1..b6ce90c09eb1 100644 --- a/op-node/p2p/store/scorebook.go +++ b/op-node/p2p/store/scorebook.go @@ -71,7 +71,7 @@ func (d *scoreBook) startGC() { func (d *scoreBook) GetPeerScores(id peer.ID) (PeerScores, error) { record, err := d.book.getRecord(id) - if err == UnknownRecordErr { + if err == ErrUnknownRecord { return PeerScores{}, nil // return zeroed scores by default } if err != nil { diff --git a/op-node/p2p/sync.go b/op-node/p2p/sync.go index b165e52f4c84..b838d000caf4 100644 --- a/op-node/p2p/sync.go +++ b/op-node/p2p/sync.go @@ -833,7 +833,7 @@ func (srv *ReqRespServer) HandleSyncRequest(ctx context.Context, log log.Logger, log.Warn("failed to serve p2p sync request", "req", req, "err", err) if errors.Is(err, ethereum.NotFound) { resultCode = ResultCodeNotFoundErr - } else if errors.Is(err, invalidRequestErr) { + } else if errors.Is(err, errInvalidRequest) { resultCode = ResultCodeInvalidErr } else { resultCode = ResultCodeUnknownErr @@ -846,7 +846,7 @@ func (srv *ReqRespServer) HandleSyncRequest(ctx context.Context, log log.Logger, srv.metrics.ServerPayloadByNumberEvent(req, resultCode, time.Since(start)) } -var invalidRequestErr = errors.New("invalid request") +var errInvalidRequest = errors.New("invalid request") func (srv *ReqRespServer) handleSyncRequest(ctx context.Context, stream network.Stream) (uint64, error) { peerId := stream.Conn().RemotePeer() @@ -892,14 +892,14 @@ func (srv *ReqRespServer) handleSyncRequest(ctx context.Context, stream network. // Check the request is within the expected range of blocks if req < srv.cfg.Genesis.L2.Number { - return req, fmt.Errorf("cannot serve request for L2 block %d before genesis %d: %w", req, srv.cfg.Genesis.L2.Number, invalidRequestErr) + return req, fmt.Errorf("cannot serve request for L2 block %d before genesis %d: %w", req, srv.cfg.Genesis.L2.Number, errInvalidRequest) } max, err := srv.cfg.TargetBlockNumber(uint64(time.Now().Unix())) if err != nil { - return req, fmt.Errorf("cannot determine max target block number to verify request: %w", invalidRequestErr) + return req, fmt.Errorf("cannot determine max target block number to verify request: %w", errInvalidRequest) } if req > max { - return req, fmt.Errorf("cannot serve request for L2 block %d after max expected block (%v): %w", req, max, invalidRequestErr) + return req, fmt.Errorf("cannot serve request for L2 block %d after max expected block (%v): %w", req, max, errInvalidRequest) } envelope, err := srv.l2.PayloadByNumber(ctx, req) From 4fcaf8261ab47fdc23258f95aa81d4cd81ec0a9e Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Mon, 5 Aug 2024 20:57:24 +0300 Subject: [PATCH 13/59] op-chain-ops: remove etherscan package (#11345) The `etherscan` package isn't maintained or used in the monorepo, so it should be deleted. --- op-chain-ops/etherscan/client.go | 221 ------------------------------- 1 file changed, 221 deletions(-) delete mode 100644 op-chain-ops/etherscan/client.go diff --git a/op-chain-ops/etherscan/client.go b/op-chain-ops/etherscan/client.go deleted file mode 100644 index 5d94a4cdd859..000000000000 --- a/op-chain-ops/etherscan/client.go +++ /dev/null @@ -1,221 +0,0 @@ -package etherscan - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "io" - "net/http" - "net/url" - "time" - - "github.com/ethereum-optimism/optimism/op-service/retry" -) - -type client struct { - baseUrl string - httpClient *http.Client -} - -type apiResponse struct { - Status string `json:"status"` - Message string `json:"message"` - Result json.RawMessage `json:"result"` -} - -type rpcResponse struct { - JsonRpc string `json:"jsonrpc"` - Id int `json:"id"` - Result json.RawMessage `json:"result"` -} - -type Transaction struct { - Hash string `json:"hash"` - Input string `json:"input"` - To string `json:"to"` -} - -const apiMaxRetries = 3 -const apiRetryDelay = time.Duration(2) * time.Second -const errRateLimited = "Max rate limit reached" - -func NewClient(baseUrl, apiKey string) *client { - return &client{ - baseUrl: baseUrl + "/api?apikey=" + apiKey + "&", - httpClient: &http.Client{ - Timeout: time.Second * 10, - }, - } -} - -func NewEthereumClient(apiKey string) *client { - return NewClient("https://api.etherscan.io", apiKey) -} - -func NewOptimismClient(apiKey string) *client { - return NewClient("https://api-optimistic.etherscan.io", apiKey) -} - -func (c *client) fetch(ctx context.Context, url string) ([]byte, error) { - req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) - if err != nil { - return nil, err - } - resp, err := c.httpClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - body, err := io.ReadAll(resp.Body) - if err != nil { - return nil, err - } - return body, nil -} - -func (c *client) fetchEtherscanApi(ctx context.Context, url string) (apiResponse, error) { - return retry.Do[apiResponse](ctx, apiMaxRetries, retry.Fixed(apiRetryDelay), func() (apiResponse, error) { - body, err := c.fetch(ctx, url) - if err != nil { - return apiResponse{}, err - } - - var response apiResponse - err = json.Unmarshal(body, &response) - if err != nil { - return apiResponse{}, fmt.Errorf("failed to unmarshal as apiResponse: %w", err) - } - - if response.Message != "OK" { - var resultString string - err = json.Unmarshal(response.Result, &resultString) - if err != nil { - return apiResponse{}, fmt.Errorf("response for %s not OK, returned message: %s", url, response.Message) - } - - if resultString == errRateLimited { - return apiResponse{}, errors.New(errRateLimited) - } - - return apiResponse{}, fmt.Errorf("there was an issue with the Etherscan request to %s, received response: %v", url, response) - } - - return response, nil - }) -} - -func (c *client) fetchEtherscanRpc(ctx context.Context, url string) (rpcResponse, error) { - return retry.Do[rpcResponse](ctx, apiMaxRetries, retry.Fixed(apiRetryDelay), func() (rpcResponse, error) { - body, err := c.fetch(ctx, url) - if err != nil { - return rpcResponse{}, err - } - - var response rpcResponse - err = json.Unmarshal(body, &response) - if err != nil { - return rpcResponse{}, fmt.Errorf("failed to unmarshal as rpcResponse: %w", err) - } - - var resultString string - _ = json.Unmarshal(response.Result, &resultString) - if resultString == errRateLimited { - return rpcResponse{}, errors.New(errRateLimited) - } - - return response, nil - }) -} - -func (c *client) FetchAbi(ctx context.Context, address string) (string, error) { - params := url.Values{} - params.Set("address", address) - url := constructUrl(c.baseUrl, "getabi", "contract", params) - response, err := c.fetchEtherscanApi(ctx, url) - if err != nil { - return "", err - } - - var abi string - err = json.Unmarshal(response.Result, &abi) - if err != nil { - return "", fmt.Errorf("API response result is not expected ABI string: %w", err) - } - - return abi, nil -} - -func (c *client) FetchDeployedBytecode(ctx context.Context, address string) (string, error) { - params := url.Values{} - params.Set("address", address) - url := constructUrl(c.baseUrl, "eth_getCode", "proxy", params) - response, err := c.fetchEtherscanRpc(ctx, url) - if err != nil { - return "", fmt.Errorf("error fetching deployed bytecode: %w", err) - } - - var bytecode string - err = json.Unmarshal(response.Result, &bytecode) - if err != nil { - return "", errors.New("API response result is not expected bytecode string") - } - - return bytecode, nil -} - -func (c *client) FetchDeploymentTxHash(ctx context.Context, address string) (string, error) { - params := url.Values{} - params.Set("contractaddresses", address) - url := constructUrl(c.baseUrl, "getcontractcreation", "contract", params) - response, err := c.fetchEtherscanApi(ctx, url) - if err != nil { - return "", err - } - - var results []struct { - Hash string `json:"txHash"` - } - err = json.Unmarshal(response.Result, &results) - if err != nil { - return "", fmt.Errorf("failed to unmarshal API response as []txInfo: %w", err) - } - - if len(results) == 0 { - return "", fmt.Errorf("API response result is an empty array") - } - - return results[0].Hash, nil -} - -func (c *client) FetchDeploymentTx(ctx context.Context, txHash string) (Transaction, error) { - params := url.Values{} - params.Set("txHash", txHash) - params.Set("tag", "latest") - url := constructUrl(c.baseUrl, "eth_getTransactionByHash", "proxy", params) - response, err := c.fetchEtherscanRpc(ctx, url) - if err != nil { - return Transaction{}, err - } - - resultBytes, err := json.Marshal(response.Result) - if err != nil { - return Transaction{}, fmt.Errorf("failed to marshal Result into JSON: %w", err) - } - - var tx Transaction - err = json.Unmarshal(resultBytes, &tx) - if err != nil { - return Transaction{}, fmt.Errorf("API response result is not expected txInfo struct: %w", err) - } - - return tx, nil -} - -func constructUrl(baseUrl, action, module string, params url.Values) string { - params.Set("action", action) - params.Set("module", module) - queryFragment := params.Encode() - return baseUrl + queryFragment -} From b65e1bfe6d9df80757c2e17d36ef6bab34dda89f Mon Sep 17 00:00:00 2001 From: Inphi Date: Mon, 5 Aug 2024 11:35:52 -0700 Subject: [PATCH 14/59] fix op-geth dependency (#11356) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 189a3db6ee4b..b3c471cb8dc5 100644 --- a/go.mod +++ b/go.mod @@ -228,7 +228,7 @@ require ( rsc.io/tmplfunc v0.0.3 // indirect ) -replace github.com/ethereum/go-ethereum => github.com/ethereum-optimism/op-geth v1.101316.0-rc.1 +replace github.com/ethereum/go-ethereum => github.com/ethereum-optimism/op-geth v1.101315.3-rc.2 //replace github.com/ethereum/go-ethereum v1.13.9 => ../op-geth diff --git a/go.sum b/go.sum index 419bfa66ee6f..da73ac62bb5e 100644 --- a/go.sum +++ b/go.sum @@ -171,8 +171,8 @@ github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/ github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3 h1:RWHKLhCrQThMfch+QJ1Z8veEq5ZO3DfIhZ7xgRP9WTc= github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3/go.mod h1:QziizLAiF0KqyLdNJYD7O5cpDlaFMNZzlxYNcWsJUxs= -github.com/ethereum-optimism/op-geth v1.101316.0-rc.1 h1:S6Nw/faA4g6AicK5oQR5p2VUjq8AyTEilLfNGgprbGU= -github.com/ethereum-optimism/op-geth v1.101316.0-rc.1/go.mod h1:nZ3TvP4mhOsfKkrgaT3GrDO4oCn5awPXFHKpVHuO63s= +github.com/ethereum-optimism/op-geth v1.101315.3-rc.2 h1:4Ne3RUZ09uqY5QnbVuDVD2Xt8JbxegCv3mkICt3aT6c= +github.com/ethereum-optimism/op-geth v1.101315.3-rc.2/go.mod h1:nZ3TvP4mhOsfKkrgaT3GrDO4oCn5awPXFHKpVHuO63s= github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240803025447-c92ef420eec2 h1:ySJykDUyb8RbcfLL3pz0Cs5Ji6NMVT7kmAY634DOCoE= github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240803025447-c92ef420eec2/go.mod h1:zy9f3TNPS7pwW4msMitF83fp0Wf452tZ6+Fg6d4JyXM= github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= From 38324e44f5f71b2a35833b5d0daafce909647295 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2024 18:58:07 +0000 Subject: [PATCH 15/59] dependabot(gomod): bump golang.org/x/sync from 0.7.0 to 0.8.0 (#11358) Bumps [golang.org/x/sync](https://github.com/golang/sync) from 0.7.0 to 0.8.0. - [Commits](https://github.com/golang/sync/compare/v0.7.0...v0.8.0) --- updated-dependencies: - dependency-name: golang.org/x/sync dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b3c471cb8dc5..546c6444fe63 100644 --- a/go.mod +++ b/go.mod @@ -44,7 +44,7 @@ require ( github.com/urfave/cli/v2 v2.27.3 golang.org/x/crypto v0.25.0 golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 - golang.org/x/sync v0.7.0 + golang.org/x/sync v0.8.0 golang.org/x/term v0.22.0 golang.org/x/time v0.5.0 ) diff --git a/go.sum b/go.sum index da73ac62bb5e..6f8338c21885 100644 --- a/go.sum +++ b/go.sum @@ -881,8 +881,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= From 0ab3e7ab5a9f025e980ae023f62733690b5c0d18 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2024 14:27:48 -0600 Subject: [PATCH 16/59] dependabot(gomod): bump golang.org/x/time from 0.5.0 to 0.6.0 (#11357) Bumps [golang.org/x/time](https://github.com/golang/time) from 0.5.0 to 0.6.0. - [Commits](https://github.com/golang/time/compare/v0.5.0...v0.6.0) --- updated-dependencies: - dependency-name: golang.org/x/time dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 546c6444fe63..8e6d7ed4f198 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 golang.org/x/sync v0.8.0 golang.org/x/term v0.22.0 - golang.org/x/time v0.5.0 + golang.org/x/time v0.6.0 ) require ( diff --git a/go.sum b/go.sum index 6f8338c21885..80ac4747d06b 100644 --- a/go.sum +++ b/go.sum @@ -974,8 +974,8 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= +golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From 9dc125a96f2d4f946df838a0388691caadac4787 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Mon, 5 Aug 2024 23:34:00 +0300 Subject: [PATCH 17/59] ci: bump ci builder `0.50.0` (#11334) * ci: bump ci builder `0.50.0` Bumps the `ci-builder` image with an updated version of foundry. Foundry update: https://github.com/ethereum-optimism/optimism/pull/11325 Docker build: https://app.circleci.com/pipelines/github/ethereum-optimism/optimism/60263/workflows/154fd94a-4029-4e2f-8bce-4ea4c6d25897 * contracts-bedrock: fix tests after new foundry version * contracts-bedrock: comment why skip * test: better comments * gas-snapshot: regenerate * snapshots: update * snapshots: update * fix(ctb): Align expected ptr in `Bytes.slice` test An update to `forge-std` causes `bound` to set the free memory pointer at an unaligned offset. This commit updates the test such that the expected pointer is correctly aligned, without an assumption on the starting ptr's alignment. --------- Co-authored-by: clabby --- .circleci/config.yml | 2 +- packages/contracts-bedrock/.gas-snapshot | 8 +- .../snapshots/state-diff/Kontrol-31337.json | 2670 ++++++++--------- .../test/L1/ResourceMetering.t.sol | 6 + .../proofs/utils/DeploymentSummary.sol | 138 +- .../proofs/utils/DeploymentSummaryCode.sol | 6 +- .../utils/DeploymentSummaryFaultProofs.sol | 138 +- .../DeploymentSummaryFaultProofsCode.sol | 6 +- .../test/libraries/Bytes.t.sol | 16 +- 9 files changed, 1502 insertions(+), 1488 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b323b41a2512..6931718f4879 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,7 @@ version: 2.1 parameters: ci_builder_image: type: string - default: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:v0.49.0 + default: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:v0.50.0 ci_builder_rust_image: type: string default: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder-rust:latest diff --git a/packages/contracts-bedrock/.gas-snapshot b/packages/contracts-bedrock/.gas-snapshot index a97f05678b58..b3ea3b88545e 100644 --- a/packages/contracts-bedrock/.gas-snapshot +++ b/packages/contracts-bedrock/.gas-snapshot @@ -1,7 +1,7 @@ -GasBenchMark_L1CrossDomainMessenger:test_sendMessage_benchmark_0() (gas: 369380) -GasBenchMark_L1CrossDomainMessenger:test_sendMessage_benchmark_1() (gas: 2967520) -GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_0() (gas: 561992) -GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_1() (gas: 4074035) +GasBenchMark_L1CrossDomainMessenger:test_sendMessage_benchmark_0() (gas: 369356) +GasBenchMark_L1CrossDomainMessenger:test_sendMessage_benchmark_1() (gas: 2967496) +GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_0() (gas: 564483) +GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_1() (gas: 4076526) GasBenchMark_L1StandardBridge_Deposit:test_depositETH_benchmark_0() (gas: 466947) GasBenchMark_L1StandardBridge_Deposit:test_depositETH_benchmark_1() (gas: 3512629) GasBenchMark_L1StandardBridge_Finalize:test_finalizeETHWithdrawal_benchmark() (gas: 72624) diff --git a/packages/contracts-bedrock/snapshots/state-diff/Kontrol-31337.json b/packages/contracts-bedrock/snapshots/state-diff/Kontrol-31337.json index 18c9e3961984..e6334a316aeb 100644 --- a/packages/contracts-bedrock/snapshots/state-diff/Kontrol-31337.json +++ b/packages/contracts-bedrock/snapshots/state-diff/Kontrol-31337.json @@ -36,7 +36,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x34A1D3fff3958843C43aD80F30b94c510645C316", + "account": "0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -70,7 +70,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", + "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -84,7 +84,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", + "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -130,12 +130,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x34A1D3fff3958843C43aD80F30b94c510645C316", + "account": "0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x1688f0b900000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1000000000000000000000000000000000000000000000000000000000000006047555c7c5eb40250af82c9713b290d445cad0893c01b18ae084f70d0b7b0d67d0000000000000000000000000000000000000000000000000000000000000164b63e800d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data": "0x1688f0b9000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3000000000000000000000000000000000000000000000000000000000000006047555c7c5eb40250af82c9713b290d445cad0893c01b18ae084f70d0b7b0d67d0000000000000000000000000000000000000000000000000000000000000164b63e800d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -146,13 +146,13 @@ "value": 0 }, { - "accessor": "0x34A1D3fff3958843C43aD80F30b94c510645C316", - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "accessor": "0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x608060405234801561001057600080fd5b5060405161016f38038061016f83398101604081905261002f916100b9565b6001600160a01b0381166100945760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642073696e676c65746f6e20616464726573732070726f766964604482015261195960f21b606482015260840160405180910390fd5b600080546001600160a01b0319166001600160a01b03929092169190911790556100e9565b6000602082840312156100cb57600080fd5b81516001600160a01b03811681146100e257600080fd5b9392505050565b6078806100f76000396000f3fe6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e00000000000000000000000000000000000000000000000000000000823503604d57808252602082f35b3682833781823684845af490503d82833e806066573d82fd5b503d81f3fea164736f6c634300080f000a00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", + "data": "0x608060405234801561001057600080fd5b5060405161016f38038061016f83398101604081905261002f916100b9565b6001600160a01b0381166100945760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642073696e676c65746f6e20616464726573732070726f766964604482015261195960f21b606482015260840160405180910390fd5b600080546001600160a01b0319166001600160a01b03929092169190911790556100e9565b6000602082840312156100cb57600080fd5b81516001600160a01b03811681146100e257600080fd5b9392505050565b6078806100f76000396000f3fe6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e00000000000000000000000000000000000000000000000000000000823503604d57808252602082f35b3682833781823684845af490503d82833e806066573d82fd5b503d81f3fea164736f6c634300080f000a000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", "deployedCode": "0x6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e00000000000000000000000000000000000000000000000000000000823503604d57808252602082f35b3682833781823684845af490503d82833e806066573d82fd5b503d81f3fea164736f6c634300080f000a", "initialized": true, "kind": "Create", @@ -161,7 +161,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -169,9 +169,9 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": true, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", + "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -180,8 +180,8 @@ "value": 0 }, { - "accessor": "0x34A1D3fff3958843C43aD80F30b94c510645C316", - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "accessor": "0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -195,10 +195,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", + "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" } @@ -206,8 +206,8 @@ "value": 0 }, { - "accessor": "0x34A1D3fff3958843C43aD80F30b94c510645C316", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", + "accessor": "0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496", + "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -221,7 +221,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -229,7 +229,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -237,7 +237,7 @@ "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -245,7 +245,7 @@ "slot": "0xe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": true, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -253,7 +253,7 @@ "slot": "0xe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -261,7 +261,7 @@ "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -269,7 +269,7 @@ "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -277,7 +277,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -285,7 +285,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -293,7 +293,7 @@ "slot": "0xcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -301,7 +301,7 @@ "slot": "0xcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -364,7 +364,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -378,7 +378,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -386,7 +386,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "isWrite": true, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -398,7 +398,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -412,7 +412,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "isWrite": false, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", @@ -475,7 +475,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -489,7 +489,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -497,7 +497,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": true, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -505,7 +505,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", @@ -513,7 +513,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": true, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", @@ -525,7 +525,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -539,7 +539,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", @@ -551,7 +551,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -565,7 +565,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -577,7 +577,7 @@ }, { "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -594,12 +594,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x0652b57a000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "data": "0x0652b57a00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -608,7 +608,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", @@ -616,7 +616,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -624,9 +624,9 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": true, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "newValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" @@ -636,7 +636,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -650,10 +650,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "newValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", + "previousValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" } @@ -713,7 +713,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -727,7 +727,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", @@ -739,7 +739,7 @@ }, { "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -756,12 +756,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0xf2fde38b0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "data": "0xf2fde38b0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -770,7 +770,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", @@ -778,7 +778,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", @@ -786,9 +786,9 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": true, - "newValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "newValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -832,12 +832,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610300000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "deployedCode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", "initialized": true, "kind": "Create", @@ -846,7 +846,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -854,9 +854,9 @@ "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" }, { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" @@ -1127,12 +1127,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000e49623609d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044400ada750000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000e49623609d0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044400ada750000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -1141,10 +1141,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", + "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" } @@ -1153,12 +1153,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", + "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000e49623609d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044400ada750000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000e49623609d0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044400ada750000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -1167,7 +1167,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -1175,7 +1175,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -1183,7 +1183,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -1191,7 +1191,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -1199,7 +1199,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -1207,7 +1207,7 @@ "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -1218,13 +1218,13 @@ "value": 0 }, { - "accessor": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x9623609d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044400ada750000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data": "0x9623609d0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044400ada750000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -1233,27 +1233,27 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", - "previousValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "newValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", + "previousValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x070dca21862da24de5bcba7acd697f207bda1c8caae3812d68f0baee0dd32f38" + "slot": "0x6bd95c70b8833b95e56b323d763e7bec801ddd693a6478a9d9eb91508b6b5689" } ], "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -1267,15 +1267,15 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" }, { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "isWrite": true, "newValue": "0x000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -1286,7 +1286,7 @@ "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "account": "0x068E44eB31e111028c41598E4535be7468674D0A", "chainInfo": { "chainId": 31337, @@ -1301,7 +1301,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -1309,7 +1309,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -1317,7 +1317,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -1325,7 +1325,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -1333,7 +1333,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -1341,7 +1341,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -1349,7 +1349,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "isWrite": true, "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -1357,7 +1357,7 @@ "slot": "0xd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe68" }, { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -1365,7 +1365,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -1403,7 +1403,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -1417,7 +1417,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "isWrite": false, "newValue": "0x000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a", "previousValue": "0x000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a", @@ -1443,7 +1443,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "isWrite": false, "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", @@ -1455,7 +1455,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -1469,7 +1469,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "isWrite": false, "newValue": "0x000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a", "previousValue": "0x000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a", @@ -1495,7 +1495,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -1541,12 +1541,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610300000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "deployedCode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", "initialized": true, "kind": "Create", @@ -1555,7 +1555,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -1563,9 +1563,9 @@ "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" }, { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" @@ -2004,12 +2004,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d000000000000000000000000416c42991d05b31e9a6dc209e91ad22b79d87ae6000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000647a1ac61e0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d0000000000000000000000004c52a6277b1b84121b3072c0c92b6be0b7cc10f1000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000647a1ac61e0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -2018,10 +2018,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", + "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" } @@ -2030,12 +2030,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", + "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d000000000000000000000000416c42991d05b31e9a6dc209e91ad22b79d87ae6000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000647a1ac61e0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d0000000000000000000000004c52a6277b1b84121b3072c0c92b6be0b7cc10f1000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000647a1ac61e0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -2044,7 +2044,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -2052,7 +2052,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -2060,7 +2060,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000002", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -2068,7 +2068,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -2076,7 +2076,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -2084,7 +2084,7 @@ "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -2095,13 +2095,13 @@ "value": 0 }, { - "accessor": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x9623609d000000000000000000000000416c42991d05b31e9a6dc209e91ad22b79d87ae6000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000647a1ac61e0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data": "0x9623609d0000000000000000000000004c52a6277b1b84121b3072c0c92b6be0b7cc10f1000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000647a1ac61e0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -2110,27 +2110,27 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", - "previousValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "newValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", + "previousValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x9d54a4eb6e745ee152f323ba7a05534bbe68629624a74c9623b7903663b002cf" + "slot": "0x72d7aa813380382c369363d977a28b043ac6e1983f989087faaa96aa4d8d4c12" } ], "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -2144,15 +2144,15 @@ "reverted": false, "storageAccesses": [ { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" }, { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": true, "newValue": "0x000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -2163,7 +2163,7 @@ "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", "chainInfo": { "chainId": 31337, @@ -2178,7 +2178,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -2186,7 +2186,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -2194,7 +2194,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -2202,7 +2202,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -2210,7 +2210,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -2218,7 +2218,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -2226,7 +2226,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -2234,7 +2234,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -2242,7 +2242,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -2250,39 +2250,39 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": true, "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -2290,7 +2290,7 @@ "slot": "0x4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace0" }, { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -2298,7 +2298,7 @@ "slot": "0xe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1a" }, { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -2306,7 +2306,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -2318,7 +2318,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -2332,7 +2332,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": false, "newValue": "0x000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f", "previousValue": "0x000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f", @@ -2387,7 +2387,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -2401,7 +2401,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": false, "newValue": "0x000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f", "previousValue": "0x000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f", @@ -2427,7 +2427,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": false, "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", @@ -2465,7 +2465,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -2479,7 +2479,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": false, "newValue": "0x000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f", "previousValue": "0x000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f", @@ -2505,7 +2505,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -2543,7 +2543,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -2557,7 +2557,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": false, "newValue": "0x000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f", "previousValue": "0x000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f", @@ -2583,7 +2583,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", + "account": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -2655,12 +2655,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610300000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "deployedCode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", "initialized": true, "kind": "Create", @@ -2669,7 +2669,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -2677,9 +2677,9 @@ "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" }, { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" @@ -2740,12 +2740,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610300000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "deployedCode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", "initialized": true, "kind": "Create", @@ -2754,7 +2754,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -2762,9 +2762,9 @@ "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" @@ -2825,12 +2825,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x608060405234801561001057600080fd5b50604051610a44380380610a4483398101604081905261002f9161005d565b610057817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b5061008d565b60006020828403121561006f57600080fd5b81516001600160a01b038116811461008657600080fd5b9392505050565b6109a88061009c6000396000f3fe60806040526004361061005e5760003560e01c8063893d20e811610043578063893d20e8146100b55780639b0b0fda146100f3578063aaf10f42146101135761006d565b806313af4035146100755780636c5d4ad0146100955761006d565b3661006d5761006b610128565b005b61006b610128565b34801561008157600080fd5b5061006b6100903660046107a2565b6103cb565b3480156100a157600080fd5b5061006b6100b036600461080e565b61045c565b3480156100c157600080fd5b506100ca610611565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ff57600080fd5b5061006b61010e3660046108dd565b6106a8565b34801561011f57600080fd5b506100ca610716565b60006101527fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101d4919061093a565b600060405180830381855afa9150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b5091509150818015610227575080516020145b156102d9576000818060200190518101906102429190610946565b905080156102d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006103037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff81166103a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102ce565b3660008037600080366000845af43d6000803e806103c5573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610424575033155b1561045457610451817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610451610128565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104b5575033155b156104545760006104e47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f82516020840120036104f8575050565b60405160009061052e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161095f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f796564000000000000000000000000000060648201526084016102ce565b61060b817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061063b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610672575033155b1561069d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b6106a5610128565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610701575033155b1561070a579055565b610712610128565b5050565b60006107407fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610777575033155b1561069d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107b457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107d857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561082057600080fd5b813567ffffffffffffffff8082111561083857600080fd5b818401915084601f83011261084c57600080fd5b81358181111561085e5761085e6107df565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156108a4576108a46107df565b816040528281528760208487010111156108bd57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108f057600080fd5b50508035926020909101359150565b6000815160005b818110156109205760208185018101518683015201610906565b8181111561092f576000828601525b509290920192915050565b60006107d882846108ff565b60006020828403121561095857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610993600d8301846108ff565b94935050505056fea164736f6c634300080f000a000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "data": "0x608060405234801561001057600080fd5b50604051610a44380380610a4483398101604081905261002f9161005d565b610057817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b5061008d565b60006020828403121561006f57600080fd5b81516001600160a01b038116811461008657600080fd5b9392505050565b6109a88061009c6000396000f3fe60806040526004361061005e5760003560e01c8063893d20e811610043578063893d20e8146100b55780639b0b0fda146100f3578063aaf10f42146101135761006d565b806313af4035146100755780636c5d4ad0146100955761006d565b3661006d5761006b610128565b005b61006b610128565b34801561008157600080fd5b5061006b6100903660046107a2565b6103cb565b3480156100a157600080fd5b5061006b6100b036600461080e565b61045c565b3480156100c157600080fd5b506100ca610611565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ff57600080fd5b5061006b61010e3660046108dd565b6106a8565b34801561011f57600080fd5b506100ca610716565b60006101527fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101d4919061093a565b600060405180830381855afa9150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b5091509150818015610227575080516020145b156102d9576000818060200190518101906102429190610946565b905080156102d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006103037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff81166103a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102ce565b3660008037600080366000845af43d6000803e806103c5573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610424575033155b1561045457610451817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610451610128565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104b5575033155b156104545760006104e47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f82516020840120036104f8575050565b60405160009061052e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161095f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f796564000000000000000000000000000060648201526084016102ce565b61060b817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061063b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610672575033155b1561069d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b6106a5610128565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610701575033155b1561070a579055565b610712610128565b5050565b60006107407fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610777575033155b1561069d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107b457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107d857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561082057600080fd5b813567ffffffffffffffff8082111561083857600080fd5b818401915084601f83011261084c57600080fd5b81358181111561085e5761085e6107df565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156108a4576108a46107df565b816040528281528760208487010111156108bd57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108f057600080fd5b50508035926020909101359150565b6000815160005b818110156109205760208185018101518683015201610906565b8181111561092f576000828601525b509290920192915050565b60006107d882846108ff565b60006020828403121561095857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610993600d8301846108ff565b94935050505056fea164736f6c634300080f000a00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "deployedCode": "0x60806040526004361061005e5760003560e01c8063893d20e811610043578063893d20e8146100b55780639b0b0fda146100f3578063aaf10f42146101135761006d565b806313af4035146100755780636c5d4ad0146100955761006d565b3661006d5761006b610128565b005b61006b610128565b34801561008157600080fd5b5061006b6100903660046107a2565b6103cb565b3480156100a157600080fd5b5061006b6100b036600461080e565b61045c565b3480156100c157600080fd5b506100ca610611565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ff57600080fd5b5061006b61010e3660046108dd565b6106a8565b34801561011f57600080fd5b506100ca610716565b60006101527fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101d4919061093a565b600060405180830381855afa9150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b5091509150818015610227575080516020145b156102d9576000818060200190518101906102429190610946565b905080156102d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006103037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff81166103a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102ce565b3660008037600080366000845af43d6000803e806103c5573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610424575033155b1561045457610451817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610451610128565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104b5575033155b156104545760006104e47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f82516020840120036104f8575050565b60405160009061052e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161095f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f796564000000000000000000000000000060648201526084016102ce565b61060b817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061063b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610672575033155b1561069d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b6106a5610128565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610701575033155b1561070a579055565b610712610128565b5050565b60006107407fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610777575033155b1561069d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107b457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107d857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561082057600080fd5b813567ffffffffffffffff8082111561083857600080fd5b818401915084601f83011261084c57600080fd5b81358181111561085e5761085e6107df565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156108a4576108a46107df565b816040528281528760208487010111156108bd57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108f057600080fd5b50508035926020909101359150565b6000815160005b818110156109205760208185018101518683015201610906565b8181111561092f576000828601525b509290920192915050565b60006107d882846108ff565b60006020828403121561095857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610993600d8301846108ff565b94935050505056fea164736f6c634300080f000a", "initialized": true, "kind": "Create", @@ -2839,9 +2839,9 @@ "reverted": false, "storageAccesses": [ { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" @@ -2902,12 +2902,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x608060405234801561001057600080fd5b506040516105f03803806105f083398101604081905261002f91610088565b30600090815260016020908152604080832080546001600160a01b0319166001600160a01b03871617905590829052902061006a8282610203565b5050506102c2565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561009b57600080fd5b82516001600160a01b03811681146100b257600080fd5b602084810151919350906001600160401b03808211156100d157600080fd5b818601915086601f8301126100e557600080fd5b8151818111156100f7576100f7610072565b604051601f8201601f19908116603f0116810190838211818310171561011f5761011f610072565b81604052828152898684870101111561013757600080fd5b600093505b82841015610159578484018601518185018701529285019261013c565b8284111561016a5760008684830101525b8096505050505050509250929050565b600181811c9082168061018e57607f821691505b6020821081036101ae57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fe57600081815260208120601f850160051c810160208610156101db5750805b601f850160051c820191505b818110156101fa578281556001016101e7565b5050505b505050565b81516001600160401b0381111561021c5761021c610072565b6102308161022a845461017a565b846101b4565b602080601f831160018114610265576000841561024d5750858301515b600019600386901b1c1916600185901b1785556101fa565b600085815260208120601f198616915b8281101561029457888601518255948401946001909101908401610275565b50858210156102b25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61031f806102d16000396000f3fe608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101e2565b602060405180830381865afa15801561008a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ae91906102c5565b905073ffffffffffffffffffffffffffffffffffffffff8116610157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f5265736f6c76656444656c656761746550726f78793a2074617267657420616460448201527f6472657373206d75737420626520696e697469616c697a656400000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff16600036604051610182929190610302565b600060405180830381855af49150503d80600081146101bd576040519150601f19603f3d011682016040523d82523d6000602084013e6101c2565b606091505b5090925090508115156001036101da57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061020457607f831692505b858310810361023a577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b878601838152602001818015610257576001811461028b576102b6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825284151560051b820196506102b6565b60008b81526020902060005b868110156102b057815484820152908501908901610297565b83019750505b50949998505050505050505050565b6000602082840312156102d757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff811681146102fb57600080fd5b9392505050565b818382376000910190815291905056fea164736f6c634300080f000a000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c30000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001a4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000", + "data": "0x608060405234801561001057600080fd5b506040516105f03803806105f083398101604081905261002f91610088565b30600090815260016020908152604080832080546001600160a01b0319166001600160a01b03871617905590829052902061006a8282610203565b5050506102c2565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561009b57600080fd5b82516001600160a01b03811681146100b257600080fd5b602084810151919350906001600160401b03808211156100d157600080fd5b818601915086601f8301126100e557600080fd5b8151818111156100f7576100f7610072565b604051601f8201601f19908116603f0116810190838211818310171561011f5761011f610072565b81604052828152898684870101111561013757600080fd5b600093505b82841015610159578484018601518185018701529285019261013c565b8284111561016a5760008684830101525b8096505050505050509250929050565b600181811c9082168061018e57607f821691505b6020821081036101ae57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fe57600081815260208120601f850160051c810160208610156101db5750805b601f850160051c820191505b818110156101fa578281556001016101e7565b5050505b505050565b81516001600160401b0381111561021c5761021c610072565b6102308161022a845461017a565b846101b4565b602080601f831160018114610265576000841561024d5750858301515b600019600386901b1c1916600185901b1785556101fa565b600085815260208120601f198616915b8281101561029457888601518255948401946001909101908401610275565b50858210156102b25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61031f806102d16000396000f3fe608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101e2565b602060405180830381865afa15801561008a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ae91906102c5565b905073ffffffffffffffffffffffffffffffffffffffff8116610157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f5265736f6c76656444656c656761746550726f78793a2074617267657420616460448201527f6472657373206d75737420626520696e697469616c697a656400000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff16600036604051610182929190610302565b600060405180830381855af49150503d80600081146101bd576040519150601f19603f3d011682016040523d82523d6000602084013e6101c2565b606091505b5090925090508115156001036101da57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061020457607f831692505b858310810361023a577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b878601838152602001818015610257576001811461028b576102b6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825284151560051b820196506102b6565b60008b81526020902060005b868110156102b057815484820152908501908901610297565b83019750505b50949998505050505050505050565b6000602082840312156102d757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff811681146102fb57600080fd5b9392505050565b818382376000910190815291905056fea164736f6c634300080f000a00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c40000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001a4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000", "deployedCode": "0x608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101e2565b602060405180830381865afa15801561008a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ae91906102c5565b905073ffffffffffffffffffffffffffffffffffffffff8116610157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f5265736f6c76656444656c656761746550726f78793a2074617267657420616460448201527f6472657373206d75737420626520696e697469616c697a656400000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff16600036604051610182929190610302565b600060405180830381855af49150503d80600081146101bd576040519150601f19603f3d011682016040523d82523d6000602084013e6101c2565b606091505b5090925090508115156001036101da57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061020457607f831692505b858310810361023a577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b878601838152602001818015610257576001811461028b576102b6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825284151560051b820196506102b6565b60008b81526020902060005b868110156102b057815484820152908501908901610297565b83019750505b50949998505050505050505050565b6000602082840312156102d757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff811681146102fb57600080fd5b9392505050565b818382376000910190815291905056fea164736f6c634300080f000a", "initialized": true, "kind": "Create", @@ -2916,36 +2916,36 @@ "reverted": false, "storageAccesses": [ { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0xa8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c" + "slot": "0x191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": true, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "newValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0xa8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c" + "slot": "0x191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0xeae32376463217751b8fa4dea8c38ab253664fa3605de6d85d2e790aa970f2b8" + "slot": "0x6822ddba83a78589c753bb747cf4919773ec1d36eeb0bb2a09d64b6d87adda0b" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": true, "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0xeae32376463217751b8fa4dea8c38ab253664fa3605de6d85d2e790aa970f2b8" + "slot": "0x6822ddba83a78589c753bb747cf4919773ec1d36eeb0bb2a09d64b6d87adda0b" } ], "value": 0 @@ -3003,12 +3003,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610300000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "deployedCode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", "initialized": true, "kind": "Create", @@ -3017,7 +3017,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3025,9 +3025,9 @@ "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" }, { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" @@ -3088,12 +3088,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610300000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "deployedCode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", "initialized": true, "kind": "Create", @@ -3102,7 +3102,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3110,9 +3110,9 @@ "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" }, { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" @@ -3173,12 +3173,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610300000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "deployedCode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", "initialized": true, "kind": "Create", @@ -3187,7 +3187,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3195,9 +3195,9 @@ "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" }, { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" @@ -3258,12 +3258,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610300000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "deployedCode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", "initialized": true, "kind": "Create", @@ -3272,7 +3272,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3280,9 +3280,9 @@ "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" }, { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" @@ -3343,12 +3343,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610300000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "deployedCode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", "initialized": true, "kind": "Create", @@ -3357,7 +3357,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3365,9 +3365,9 @@ "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" }, { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" @@ -3428,12 +3428,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610300000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "deployedCode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", "initialized": true, "kind": "Create", @@ -3442,7 +3442,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -3450,9 +3450,9 @@ "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" }, { - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" @@ -3513,7 +3513,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -3527,7 +3527,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "isWrite": false, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", @@ -3539,7 +3539,7 @@ }, { "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -3556,12 +3556,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0xf2fde38b000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "data": "0xf2fde38b00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -3570,7 +3570,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "isWrite": false, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", @@ -3578,7 +3578,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "isWrite": false, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", @@ -3586,9 +3586,9 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -3598,7 +3598,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -3612,10 +3612,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" } @@ -8377,7 +8377,7 @@ "chainId": 31337, "forkId": 0 }, - "data": "0x638627e586f5e36fe67a77519503a7c6da22f92b150d3c6055fd40bdcfe9ffd160a06040523480156200001157600080fd5b5060405162000fc938038062000fc983398101604081905262000034916200026b565b6001600160a01b0381166080526040805160008082526020820190925262000081916200007a565b620000666200022d565b8152602001906001900390816200005c5790505b5062000088565b50620002db565b600054610100900460ff1615808015620000a95750600054600160ff909116105b80620000d95750620000c6306200021e60201b620007c61760201c565b158015620000d9575060005460ff166001145b620001415760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b6000805460ff19166001179055801562000165576000805461ff0019166101001790555b60005b8251811015620001d25760008382815181106200018957620001896200029d565b60209081029190910181015180820151905163ffffffff166000908152600180845260409091208251815591909201519101555080620001c981620002b3565b91505062000168565b5080156200021a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6001600160a01b03163b151590565b6040518060400160405280600063ffffffff16815260200162000266604051806040016040528060008019168152602001600081525090565b905290565b6000602082840312156200027e57600080fd5b81516001600160a01b03811681146200029657600080fd5b9392505050565b634e487b7160e01b600052603260045260246000fd5b600060018201620002d457634e487b7160e01b600052601160045260246000fd5b5060010190565b608051610ccb620002fe6000396000818161013101526102000152610ccb6000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c8063838c2d1e11610050578063838c2d1e146100fa578063c303f0df14610104578063f2b4e6171461011757600080fd5b806354fd4d501461006c5780637258a807146100be575b600080fd5b6100a86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100b5919061085c565b60405180910390f35b6100e56100cc36600461088b565b6001602081905260009182526040909120805491015482565b604080519283526020830191909152016100b5565b61010261015b565b005b61010261011236600461094f565b6105d4565b60405173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001681526020016100b5565b600033905060008060008373ffffffffffffffffffffffffffffffffffffffff1663fa24f7436040518163ffffffff1660e01b8152600401600060405180830381865afa1580156101b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526101f69190810190610a68565b92509250925060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635f0150cb8585856040518463ffffffff1660e01b815260040161025b93929190610b39565b6040805180830381865afa158015610277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029b9190610b67565b5090508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f416e63686f72537461746552656769737472793a206661756c7420646973707560448201527f74652067616d65206e6f7420726567697374657265642077697468206661637460648201527f6f72790000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600160008563ffffffff1663ffffffff168152602001908152602001600020600101548573ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104169190610bc7565b11610422575050505050565b60028573ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561046f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104939190610c0f565b60028111156104a4576104a4610be0565b146104b0575050505050565b60405180604001604052806105308773ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052d9190610bc7565b90565b81526020018673ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610580573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a49190610bc7565b905263ffffffff909416600090815260016020818152604090922086518155959091015194019390935550505050565b600054610100900460ff16158080156105f45750600054600160ff909116105b8061060e5750303b15801561060e575060005460ff166001145b61069a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161037b565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156106f857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60005b825181101561075e57600083828151811061071857610718610c30565b60209081029190910181015180820151905163ffffffff16600090815260018084526040909120825181559190920151910155508061075681610c5f565b9150506106fb565b5080156107c257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60005b838110156107fd5781810151838201526020016107e5565b8381111561080c576000848401525b50505050565b6000815180845261082a8160208601602086016107e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061086f6020830184610812565b9392505050565b63ffffffff8116811461088857600080fd5b50565b60006020828403121561089d57600080fd5b813561086f81610876565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156108fa576108fa6108a8565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610947576109476108a8565b604052919050565b6000602080838503121561096257600080fd5b823567ffffffffffffffff8082111561097a57600080fd5b818501915085601f83011261098e57600080fd5b8135818111156109a0576109a06108a8565b6109ae848260051b01610900565b818152848101925060609182028401850191888311156109cd57600080fd5b938501935b82851015610a5c57848903818112156109eb5760008081fd5b6109f36108d7565b86356109fe81610876565b815260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301811315610a325760008081fd5b610a3a6108d7565b888a0135815290880135898201528189015285525093840193928501926109d2565b50979650505050505050565b600080600060608486031215610a7d57600080fd5b8351610a8881610876565b60208501516040860151919450925067ffffffffffffffff80821115610aad57600080fd5b818601915086601f830112610ac157600080fd5b815181811115610ad357610ad36108a8565b610b0460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610900565b9150808252876020828501011115610b1b57600080fd5b610b2c8160208401602086016107e2565b5080925050509250925092565b63ffffffff84168152826020820152606060408201526000610b5e6060830184610812565b95945050505050565b60008060408385031215610b7a57600080fd5b825173ffffffffffffffffffffffffffffffffffffffff81168114610b9e57600080fd5b602084015190925067ffffffffffffffff81168114610bbc57600080fd5b809150509250929050565b600060208284031215610bd957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215610c2157600080fd5b81516003811061086f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610cb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea164736f6c634300080f000a000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb", + "data": "0x638627e586f5e36fe67a77519503a7c6da22f92b150d3c6055fd40bdcfe9ffd160a06040523480156200001157600080fd5b5060405162000fc938038062000fc983398101604081905262000034916200026b565b6001600160a01b0381166080526040805160008082526020820190925262000081916200007a565b620000666200022d565b8152602001906001900390816200005c5790505b5062000088565b50620002db565b600054610100900460ff1615808015620000a95750600054600160ff909116105b80620000d95750620000c6306200021e60201b620007c61760201c565b158015620000d9575060005460ff166001145b620001415760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b6000805460ff19166001179055801562000165576000805461ff0019166101001790555b60005b8251811015620001d25760008382815181106200018957620001896200029d565b60209081029190910181015180820151905163ffffffff166000908152600180845260409091208251815591909201519101555080620001c981620002b3565b91505062000168565b5080156200021a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6001600160a01b03163b151590565b6040518060400160405280600063ffffffff16815260200162000266604051806040016040528060008019168152602001600081525090565b905290565b6000602082840312156200027e57600080fd5b81516001600160a01b03811681146200029657600080fd5b9392505050565b634e487b7160e01b600052603260045260246000fd5b600060018201620002d457634e487b7160e01b600052601160045260246000fd5b5060010190565b608051610ccb620002fe6000396000818161013101526102000152610ccb6000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c8063838c2d1e11610050578063838c2d1e146100fa578063c303f0df14610104578063f2b4e6171461011757600080fd5b806354fd4d501461006c5780637258a807146100be575b600080fd5b6100a86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100b5919061085c565b60405180910390f35b6100e56100cc36600461088b565b6001602081905260009182526040909120805491015482565b604080519283526020830191909152016100b5565b61010261015b565b005b61010261011236600461094f565b6105d4565b60405173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001681526020016100b5565b600033905060008060008373ffffffffffffffffffffffffffffffffffffffff1663fa24f7436040518163ffffffff1660e01b8152600401600060405180830381865afa1580156101b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526101f69190810190610a68565b92509250925060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635f0150cb8585856040518463ffffffff1660e01b815260040161025b93929190610b39565b6040805180830381865afa158015610277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029b9190610b67565b5090508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f416e63686f72537461746552656769737472793a206661756c7420646973707560448201527f74652067616d65206e6f7420726567697374657265642077697468206661637460648201527f6f72790000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600160008563ffffffff1663ffffffff168152602001908152602001600020600101548573ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104169190610bc7565b11610422575050505050565b60028573ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561046f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104939190610c0f565b60028111156104a4576104a4610be0565b146104b0575050505050565b60405180604001604052806105308773ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052d9190610bc7565b90565b81526020018673ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610580573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a49190610bc7565b905263ffffffff909416600090815260016020818152604090922086518155959091015194019390935550505050565b600054610100900460ff16158080156105f45750600054600160ff909116105b8061060e5750303b15801561060e575060005460ff166001145b61069a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161037b565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156106f857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60005b825181101561075e57600083828151811061071857610718610c30565b60209081029190910181015180820151905163ffffffff16600090815260018084526040909120825181559190920151910155508061075681610c5f565b9150506106fb565b5080156107c257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60005b838110156107fd5781810151838201526020016107e5565b8381111561080c576000848401525b50505050565b6000815180845261082a8160208601602086016107e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061086f6020830184610812565b9392505050565b63ffffffff8116811461088857600080fd5b50565b60006020828403121561089d57600080fd5b813561086f81610876565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156108fa576108fa6108a8565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610947576109476108a8565b604052919050565b6000602080838503121561096257600080fd5b823567ffffffffffffffff8082111561097a57600080fd5b818501915085601f83011261098e57600080fd5b8135818111156109a0576109a06108a8565b6109ae848260051b01610900565b818152848101925060609182028401850191888311156109cd57600080fd5b938501935b82851015610a5c57848903818112156109eb5760008081fd5b6109f36108d7565b86356109fe81610876565b815260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301811315610a325760008081fd5b610a3a6108d7565b888a0135815290880135898201528189015285525093840193928501926109d2565b50979650505050505050565b600080600060608486031215610a7d57600080fd5b8351610a8881610876565b60208501516040860151919450925067ffffffffffffffff80821115610aad57600080fd5b818601915086601f830112610ac157600080fd5b815181811115610ad357610ad36108a8565b610b0460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610900565b9150808252876020828501011115610b1b57600080fd5b610b2c8160208401602086016107e2565b5080925050509250925092565b63ffffffff84168152826020820152606060408201526000610b5e6060830184610812565b95945050505050565b60008060408385031215610b7a57600080fd5b825173ffffffffffffffffffffffffffffffffffffffff81168114610b9e57600080fd5b602084015190925067ffffffffffffffff81168114610bbc57600080fd5b809150509250929050565b600060208284031215610bd957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215610c2157600080fd5b81516003811061086f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610cb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea164736f6c634300080f000a0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -8389,13 +8389,13 @@ }, { "accessor": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "account": "0x610C37dd344e47D7848Da075a90128472140e80f", + "account": "0xE2a80256d1dAFe06683F231F8e9561639Aa0e9b9", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x60a06040523480156200001157600080fd5b5060405162000fc938038062000fc983398101604081905262000034916200026b565b6001600160a01b0381166080526040805160008082526020820190925262000081916200007a565b620000666200022d565b8152602001906001900390816200005c5790505b5062000088565b50620002db565b600054610100900460ff1615808015620000a95750600054600160ff909116105b80620000d95750620000c6306200021e60201b620007c61760201c565b158015620000d9575060005460ff166001145b620001415760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b6000805460ff19166001179055801562000165576000805461ff0019166101001790555b60005b8251811015620001d25760008382815181106200018957620001896200029d565b60209081029190910181015180820151905163ffffffff166000908152600180845260409091208251815591909201519101555080620001c981620002b3565b91505062000168565b5080156200021a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6001600160a01b03163b151590565b6040518060400160405280600063ffffffff16815260200162000266604051806040016040528060008019168152602001600081525090565b905290565b6000602082840312156200027e57600080fd5b81516001600160a01b03811681146200029657600080fd5b9392505050565b634e487b7160e01b600052603260045260246000fd5b600060018201620002d457634e487b7160e01b600052601160045260246000fd5b5060010190565b608051610ccb620002fe6000396000818161013101526102000152610ccb6000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c8063838c2d1e11610050578063838c2d1e146100fa578063c303f0df14610104578063f2b4e6171461011757600080fd5b806354fd4d501461006c5780637258a807146100be575b600080fd5b6100a86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100b5919061085c565b60405180910390f35b6100e56100cc36600461088b565b6001602081905260009182526040909120805491015482565b604080519283526020830191909152016100b5565b61010261015b565b005b61010261011236600461094f565b6105d4565b60405173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001681526020016100b5565b600033905060008060008373ffffffffffffffffffffffffffffffffffffffff1663fa24f7436040518163ffffffff1660e01b8152600401600060405180830381865afa1580156101b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526101f69190810190610a68565b92509250925060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635f0150cb8585856040518463ffffffff1660e01b815260040161025b93929190610b39565b6040805180830381865afa158015610277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029b9190610b67565b5090508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f416e63686f72537461746552656769737472793a206661756c7420646973707560448201527f74652067616d65206e6f7420726567697374657265642077697468206661637460648201527f6f72790000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600160008563ffffffff1663ffffffff168152602001908152602001600020600101548573ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104169190610bc7565b11610422575050505050565b60028573ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561046f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104939190610c0f565b60028111156104a4576104a4610be0565b146104b0575050505050565b60405180604001604052806105308773ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052d9190610bc7565b90565b81526020018673ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610580573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a49190610bc7565b905263ffffffff909416600090815260016020818152604090922086518155959091015194019390935550505050565b600054610100900460ff16158080156105f45750600054600160ff909116105b8061060e5750303b15801561060e575060005460ff166001145b61069a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161037b565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156106f857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60005b825181101561075e57600083828151811061071857610718610c30565b60209081029190910181015180820151905163ffffffff16600090815260018084526040909120825181559190920151910155508061075681610c5f565b9150506106fb565b5080156107c257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60005b838110156107fd5781810151838201526020016107e5565b8381111561080c576000848401525b50505050565b6000815180845261082a8160208601602086016107e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061086f6020830184610812565b9392505050565b63ffffffff8116811461088857600080fd5b50565b60006020828403121561089d57600080fd5b813561086f81610876565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156108fa576108fa6108a8565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610947576109476108a8565b604052919050565b6000602080838503121561096257600080fd5b823567ffffffffffffffff8082111561097a57600080fd5b818501915085601f83011261098e57600080fd5b8135818111156109a0576109a06108a8565b6109ae848260051b01610900565b818152848101925060609182028401850191888311156109cd57600080fd5b938501935b82851015610a5c57848903818112156109eb5760008081fd5b6109f36108d7565b86356109fe81610876565b815260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301811315610a325760008081fd5b610a3a6108d7565b888a0135815290880135898201528189015285525093840193928501926109d2565b50979650505050505050565b600080600060608486031215610a7d57600080fd5b8351610a8881610876565b60208501516040860151919450925067ffffffffffffffff80821115610aad57600080fd5b818601915086601f830112610ac157600080fd5b815181811115610ad357610ad36108a8565b610b0460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610900565b9150808252876020828501011115610b1b57600080fd5b610b2c8160208401602086016107e2565b5080925050509250925092565b63ffffffff84168152826020820152606060408201526000610b5e6060830184610812565b95945050505050565b60008060408385031215610b7a57600080fd5b825173ffffffffffffffffffffffffffffffffffffffff81168114610b9e57600080fd5b602084015190925067ffffffffffffffff81168114610bbc57600080fd5b809150509250929050565b600060208284031215610bd957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215610c2157600080fd5b81516003811061086f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610cb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea164736f6c634300080f000a000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb", - "deployedCode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c8063838c2d1e11610050578063838c2d1e146100fa578063c303f0df14610104578063f2b4e6171461011757600080fd5b806354fd4d501461006c5780637258a807146100be575b600080fd5b6100a86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100b5919061085c565b60405180910390f35b6100e56100cc36600461088b565b6001602081905260009182526040909120805491015482565b604080519283526020830191909152016100b5565b61010261015b565b005b61010261011236600461094f565b6105d4565b60405173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb1681526020016100b5565b600033905060008060008373ffffffffffffffffffffffffffffffffffffffff1663fa24f7436040518163ffffffff1660e01b8152600401600060405180830381865afa1580156101b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526101f69190810190610a68565b92509250925060007f000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb73ffffffffffffffffffffffffffffffffffffffff16635f0150cb8585856040518463ffffffff1660e01b815260040161025b93929190610b39565b6040805180830381865afa158015610277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029b9190610b67565b5090508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f416e63686f72537461746552656769737472793a206661756c7420646973707560448201527f74652067616d65206e6f7420726567697374657265642077697468206661637460648201527f6f72790000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600160008563ffffffff1663ffffffff168152602001908152602001600020600101548573ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104169190610bc7565b11610422575050505050565b60028573ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561046f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104939190610c0f565b60028111156104a4576104a4610be0565b146104b0575050505050565b60405180604001604052806105308773ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052d9190610bc7565b90565b81526020018673ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610580573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a49190610bc7565b905263ffffffff909416600090815260016020818152604090922086518155959091015194019390935550505050565b600054610100900460ff16158080156105f45750600054600160ff909116105b8061060e5750303b15801561060e575060005460ff166001145b61069a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161037b565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156106f857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60005b825181101561075e57600083828151811061071857610718610c30565b60209081029190910181015180820151905163ffffffff16600090815260018084526040909120825181559190920151910155508061075681610c5f565b9150506106fb565b5080156107c257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60005b838110156107fd5781810151838201526020016107e5565b8381111561080c576000848401525b50505050565b6000815180845261082a8160208601602086016107e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061086f6020830184610812565b9392505050565b63ffffffff8116811461088857600080fd5b50565b60006020828403121561089d57600080fd5b813561086f81610876565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156108fa576108fa6108a8565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610947576109476108a8565b604052919050565b6000602080838503121561096257600080fd5b823567ffffffffffffffff8082111561097a57600080fd5b818501915085601f83011261098e57600080fd5b8135818111156109a0576109a06108a8565b6109ae848260051b01610900565b818152848101925060609182028401850191888311156109cd57600080fd5b938501935b82851015610a5c57848903818112156109eb5760008081fd5b6109f36108d7565b86356109fe81610876565b815260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301811315610a325760008081fd5b610a3a6108d7565b888a0135815290880135898201528189015285525093840193928501926109d2565b50979650505050505050565b600080600060608486031215610a7d57600080fd5b8351610a8881610876565b60208501516040860151919450925067ffffffffffffffff80821115610aad57600080fd5b818601915086601f830112610ac157600080fd5b815181811115610ad357610ad36108a8565b610b0460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610900565b9150808252876020828501011115610b1b57600080fd5b610b2c8160208401602086016107e2565b5080925050509250925092565b63ffffffff84168152826020820152606060408201526000610b5e6060830184610812565b95945050505050565b60008060408385031215610b7a57600080fd5b825173ffffffffffffffffffffffffffffffffffffffff81168114610b9e57600080fd5b602084015190925067ffffffffffffffff81168114610bbc57600080fd5b809150509250929050565b600060208284031215610bd957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215610c2157600080fd5b81516003811061086f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610cb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea164736f6c634300080f000a", + "data": "0x60a06040523480156200001157600080fd5b5060405162000fc938038062000fc983398101604081905262000034916200026b565b6001600160a01b0381166080526040805160008082526020820190925262000081916200007a565b620000666200022d565b8152602001906001900390816200005c5790505b5062000088565b50620002db565b600054610100900460ff1615808015620000a95750600054600160ff909116105b80620000d95750620000c6306200021e60201b620007c61760201c565b158015620000d9575060005460ff166001145b620001415760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b6000805460ff19166001179055801562000165576000805461ff0019166101001790555b60005b8251811015620001d25760008382815181106200018957620001896200029d565b60209081029190910181015180820151905163ffffffff166000908152600180845260409091208251815591909201519101555080620001c981620002b3565b91505062000168565b5080156200021a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6001600160a01b03163b151590565b6040518060400160405280600063ffffffff16815260200162000266604051806040016040528060008019168152602001600081525090565b905290565b6000602082840312156200027e57600080fd5b81516001600160a01b03811681146200029657600080fd5b9392505050565b634e487b7160e01b600052603260045260246000fd5b600060018201620002d457634e487b7160e01b600052601160045260246000fd5b5060010190565b608051610ccb620002fe6000396000818161013101526102000152610ccb6000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c8063838c2d1e11610050578063838c2d1e146100fa578063c303f0df14610104578063f2b4e6171461011757600080fd5b806354fd4d501461006c5780637258a807146100be575b600080fd5b6100a86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100b5919061085c565b60405180910390f35b6100e56100cc36600461088b565b6001602081905260009182526040909120805491015482565b604080519283526020830191909152016100b5565b61010261015b565b005b61010261011236600461094f565b6105d4565b60405173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001681526020016100b5565b600033905060008060008373ffffffffffffffffffffffffffffffffffffffff1663fa24f7436040518163ffffffff1660e01b8152600401600060405180830381865afa1580156101b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526101f69190810190610a68565b92509250925060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635f0150cb8585856040518463ffffffff1660e01b815260040161025b93929190610b39565b6040805180830381865afa158015610277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029b9190610b67565b5090508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f416e63686f72537461746552656769737472793a206661756c7420646973707560448201527f74652067616d65206e6f7420726567697374657265642077697468206661637460648201527f6f72790000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600160008563ffffffff1663ffffffff168152602001908152602001600020600101548573ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104169190610bc7565b11610422575050505050565b60028573ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561046f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104939190610c0f565b60028111156104a4576104a4610be0565b146104b0575050505050565b60405180604001604052806105308773ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052d9190610bc7565b90565b81526020018673ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610580573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a49190610bc7565b905263ffffffff909416600090815260016020818152604090922086518155959091015194019390935550505050565b600054610100900460ff16158080156105f45750600054600160ff909116105b8061060e5750303b15801561060e575060005460ff166001145b61069a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161037b565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156106f857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60005b825181101561075e57600083828151811061071857610718610c30565b60209081029190910181015180820151905163ffffffff16600090815260018084526040909120825181559190920151910155508061075681610c5f565b9150506106fb565b5080156107c257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60005b838110156107fd5781810151838201526020016107e5565b8381111561080c576000848401525b50505050565b6000815180845261082a8160208601602086016107e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061086f6020830184610812565b9392505050565b63ffffffff8116811461088857600080fd5b50565b60006020828403121561089d57600080fd5b813561086f81610876565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156108fa576108fa6108a8565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610947576109476108a8565b604052919050565b6000602080838503121561096257600080fd5b823567ffffffffffffffff8082111561097a57600080fd5b818501915085601f83011261098e57600080fd5b8135818111156109a0576109a06108a8565b6109ae848260051b01610900565b818152848101925060609182028401850191888311156109cd57600080fd5b938501935b82851015610a5c57848903818112156109eb5760008081fd5b6109f36108d7565b86356109fe81610876565b815260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301811315610a325760008081fd5b610a3a6108d7565b888a0135815290880135898201528189015285525093840193928501926109d2565b50979650505050505050565b600080600060608486031215610a7d57600080fd5b8351610a8881610876565b60208501516040860151919450925067ffffffffffffffff80821115610aad57600080fd5b818601915086601f830112610ac157600080fd5b815181811115610ad357610ad36108a8565b610b0460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610900565b9150808252876020828501011115610b1b57600080fd5b610b2c8160208401602086016107e2565b5080925050509250925092565b63ffffffff84168152826020820152606060408201526000610b5e6060830184610812565b95945050505050565b60008060408385031215610b7a57600080fd5b825173ffffffffffffffffffffffffffffffffffffffff81168114610b9e57600080fd5b602084015190925067ffffffffffffffff81168114610bbc57600080fd5b809150509250929050565b600060208284031215610bd957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215610c2157600080fd5b81516003811061086f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610cb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea164736f6c634300080f000a0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d", + "deployedCode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c8063838c2d1e11610050578063838c2d1e146100fa578063c303f0df14610104578063f2b4e6171461011757600080fd5b806354fd4d501461006c5780637258a807146100be575b600080fd5b6100a86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100b5919061085c565b60405180910390f35b6100e56100cc36600461088b565b6001602081905260009182526040909120805491015482565b604080519283526020830191909152016100b5565b61010261015b565b005b61010261011236600461094f565b6105d4565b60405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d1681526020016100b5565b600033905060008060008373ffffffffffffffffffffffffffffffffffffffff1663fa24f7436040518163ffffffff1660e01b8152600401600060405180830381865afa1580156101b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526101f69190810190610a68565b92509250925060007f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d73ffffffffffffffffffffffffffffffffffffffff16635f0150cb8585856040518463ffffffff1660e01b815260040161025b93929190610b39565b6040805180830381865afa158015610277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029b9190610b67565b5090508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f416e63686f72537461746552656769737472793a206661756c7420646973707560448201527f74652067616d65206e6f7420726567697374657265642077697468206661637460648201527f6f72790000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600160008563ffffffff1663ffffffff168152602001908152602001600020600101548573ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104169190610bc7565b11610422575050505050565b60028573ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561046f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104939190610c0f565b60028111156104a4576104a4610be0565b146104b0575050505050565b60405180604001604052806105308773ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052d9190610bc7565b90565b81526020018673ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610580573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a49190610bc7565b905263ffffffff909416600090815260016020818152604090922086518155959091015194019390935550505050565b600054610100900460ff16158080156105f45750600054600160ff909116105b8061060e5750303b15801561060e575060005460ff166001145b61069a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161037b565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156106f857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60005b825181101561075e57600083828151811061071857610718610c30565b60209081029190910181015180820151905163ffffffff16600090815260018084526040909120825181559190920151910155508061075681610c5f565b9150506106fb565b5080156107c257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60005b838110156107fd5781810151838201526020016107e5565b8381111561080c576000848401525b50505050565b6000815180845261082a8160208601602086016107e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061086f6020830184610812565b9392505050565b63ffffffff8116811461088857600080fd5b50565b60006020828403121561089d57600080fd5b813561086f81610876565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156108fa576108fa6108a8565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610947576109476108a8565b604052919050565b6000602080838503121561096257600080fd5b823567ffffffffffffffff8082111561097a57600080fd5b818501915085601f83011261098e57600080fd5b8135818111156109a0576109a06108a8565b6109ae848260051b01610900565b818152848101925060609182028401850191888311156109cd57600080fd5b938501935b82851015610a5c57848903818112156109eb5760008081fd5b6109f36108d7565b86356109fe81610876565b815260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301811315610a325760008081fd5b610a3a6108d7565b888a0135815290880135898201528189015285525093840193928501926109d2565b50979650505050505050565b600080600060608486031215610a7d57600080fd5b8351610a8881610876565b60208501516040860151919450925067ffffffffffffffff80821115610aad57600080fd5b818601915086601f830112610ac157600080fd5b815181811115610ad357610ad36108a8565b610b0460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610900565b9150808252876020828501011115610b1b57600080fd5b610b2c8160208401602086016107e2565b5080925050509250925092565b63ffffffff84168152826020820152606060408201526000610b5e6060830184610812565b95945050505050565b60008060408385031215610b7a57600080fd5b825173ffffffffffffffffffffffffffffffffffffffff81168114610b9e57600080fd5b602084015190925067ffffffffffffffff81168114610bbc57600080fd5b809150509250929050565b600060208284031215610bd957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215610c2157600080fd5b81516003811061086f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610cb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea164736f6c634300080f000a", "initialized": true, "kind": "Create", "newBalance": 0, @@ -8403,7 +8403,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x610C37dd344e47D7848Da075a90128472140e80f", + "account": "0xE2a80256d1dAFe06683F231F8e9561639Aa0e9b9", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -8411,7 +8411,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x610C37dd344e47D7848Da075a90128472140e80f", + "account": "0xE2a80256d1dAFe06683F231F8e9561639Aa0e9b9", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -8419,7 +8419,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x610C37dd344e47D7848Da075a90128472140e80f", + "account": "0xE2a80256d1dAFe06683F231F8e9561639Aa0e9b9", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -8427,7 +8427,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x610C37dd344e47D7848Da075a90128472140e80f", + "account": "0xE2a80256d1dAFe06683F231F8e9561639Aa0e9b9", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -8435,7 +8435,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x610C37dd344e47D7848Da075a90128472140e80f", + "account": "0xE2a80256d1dAFe06683F231F8e9561639Aa0e9b9", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -8443,7 +8443,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x610C37dd344e47D7848Da075a90128472140e80f", + "account": "0xE2a80256d1dAFe06683F231F8e9561639Aa0e9b9", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -8451,7 +8451,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x610C37dd344e47D7848Da075a90128472140e80f", + "account": "0xE2a80256d1dAFe06683F231F8e9561639Aa0e9b9", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -8459,7 +8459,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x610C37dd344e47D7848Da075a90128472140e80f", + "account": "0xE2a80256d1dAFe06683F231F8e9561639Aa0e9b9", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -8548,12 +8548,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d000000000000000000000000978e3286eb805934215a88694d80b09aded68d90000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d813100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d58650000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d813100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df990000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -8562,10 +8562,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", + "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" } @@ -8574,12 +8574,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", + "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d000000000000000000000000978e3286eb805934215a88694d80b09aded68d90000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d813100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d58650000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d813100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df990000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -8588,7 +8588,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000002", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000002", @@ -8596,7 +8596,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000002", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000002", @@ -8604,7 +8604,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000003", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000002", @@ -8612,7 +8612,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -8620,7 +8620,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -8628,7 +8628,7 @@ "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -8639,13 +8639,13 @@ "value": 0 }, { - "accessor": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x9623609d000000000000000000000000978e3286eb805934215a88694d80b09aded68d90000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d813100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d58650000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900000000000000000000000000000000000000000000000000000000", + "data": "0x9623609d0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d813100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df990000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab035100000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -8654,32 +8654,32 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", - "previousValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "newValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", + "previousValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x9302c2c5f397028777ab180924fb28ceaf3af9b6a91b43410c4c0afe36476877" + "slot": "0x727598a658f6983be3a9f29beef55aaee89ef8a176baeeacbe7edf5ff94a781b" } ], "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x4f1ef286000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d813100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d58650000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900000000000000000000000000000000000000000000000000000000", + "data": "0x4f1ef286000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d813100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000064c0c53b8b00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df990000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab035100000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -8688,15 +8688,15 @@ "reverted": false, "storageAccesses": [ { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" }, { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": true, "newValue": "0x000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d8131", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -8707,13 +8707,13 @@ "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "account": "0xbdD90485FCbcac869D5b5752179815a3103d8131", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0xc0c53b8b000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d58650000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", + "data": "0xc0c53b8b00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df990000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -8722,7 +8722,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -8730,7 +8730,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -8738,7 +8738,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -8746,7 +8746,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -8754,7 +8754,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -8762,7 +8762,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -8770,7 +8770,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -8778,15 +8778,15 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000036" }, { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": true, - "newValue": "0x000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d5865", + "newValue": "0x00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df99", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000036" }, { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -8794,15 +8794,15 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000037" }, { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": true, - "newValue": "0x0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb", + "newValue": "0x0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000037" }, { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -8810,15 +8810,15 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000035" }, { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": true, - "newValue": "0x0000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900", + "newValue": "0x00000000000000000000004f559f30f5eb88d635fde1548c4267db8fab035100", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000035" }, { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -8826,7 +8826,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" }, { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -8834,7 +8834,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" }, { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": true, "newValue": "0x000000000000000000000000000000000000000000000000000000000000dead", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -8842,7 +8842,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" }, { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -8850,7 +8850,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -8858,7 +8858,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" }, { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": true, "newValue": "0x000000000000000100000000000000000000000000000000000000003b9aca00", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -8866,7 +8866,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" }, { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -8874,7 +8874,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -8886,7 +8886,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -8900,7 +8900,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, "newValue": "0x000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d8131", "previousValue": "0x000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d8131", @@ -8972,7 +8972,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -8986,7 +8986,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, "newValue": "0x000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d8131", "previousValue": "0x000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d8131", @@ -9012,10 +9012,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, - "newValue": "0x000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d5865", - "previousValue": "0x000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d5865", + "newValue": "0x00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df99", + "previousValue": "0x00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df99", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000036" } @@ -9024,7 +9024,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -9038,7 +9038,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, "newValue": "0x000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d8131", "previousValue": "0x000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d8131", @@ -9064,10 +9064,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, - "newValue": "0x0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb", - "previousValue": "0x0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb", + "newValue": "0x0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", + "previousValue": "0x0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000037" } @@ -9076,7 +9076,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -9090,7 +9090,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, "newValue": "0x000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d8131", "previousValue": "0x000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d8131", @@ -9116,10 +9116,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, - "newValue": "0x0000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900", - "previousValue": "0x0000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900", + "newValue": "0x00000000000000000000004f559f30f5eb88d635fde1548c4267db8fab035100", + "previousValue": "0x00000000000000000000004f559f30f5eb88d635fde1548c4267db8fab035100", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000035" } @@ -9127,8 +9127,8 @@ "value": 0 }, { - "accessor": "0x978e3286EB805934215a88694d80b09aDed68D90", - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "accessor": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -9142,7 +9142,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "isWrite": false, "newValue": "0x000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a", "previousValue": "0x000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a", @@ -9153,7 +9153,7 @@ "value": 0 }, { - "accessor": "0x978e3286EB805934215a88694d80b09aDed68D90", + "accessor": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "account": "0x068E44eB31e111028c41598E4535be7468674D0A", "chainInfo": { "chainId": 31337, @@ -9168,7 +9168,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "isWrite": false, "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", @@ -9180,7 +9180,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -9194,7 +9194,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, "newValue": "0x000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d8131", "previousValue": "0x000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d8131", @@ -9220,10 +9220,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, - "newValue": "0x0000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900", - "previousValue": "0x0000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900", + "newValue": "0x00000000000000000000004f559f30f5eb88d635fde1548c4267db8fab035100", + "previousValue": "0x00000000000000000000004f559f30f5eb88d635fde1548c4267db8fab035100", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000035" } @@ -9232,7 +9232,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -9246,7 +9246,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "isWrite": false, "newValue": "0x000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a", "previousValue": "0x000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a", @@ -9272,7 +9272,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -9284,7 +9284,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -9298,7 +9298,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, "newValue": "0x000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d8131", "previousValue": "0x000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d8131", @@ -9324,10 +9324,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, - "newValue": "0x0000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900", - "previousValue": "0x0000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900", + "newValue": "0x00000000000000000000004f559f30f5eb88d635fde1548c4267db8fab035100", + "previousValue": "0x00000000000000000000004f559f30f5eb88d635fde1548c4267db8fab035100", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000035" } @@ -9335,8 +9335,8 @@ "value": 0 }, { - "accessor": "0x978e3286EB805934215a88694d80b09aDed68D90", - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "accessor": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -9350,7 +9350,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "isWrite": false, "newValue": "0x000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a", "previousValue": "0x000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a", @@ -9361,7 +9361,7 @@ "value": 0 }, { - "accessor": "0x978e3286EB805934215a88694d80b09aDed68D90", + "accessor": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "account": "0x068E44eB31e111028c41598E4535be7468674D0A", "chainInfo": { "chainId": 31337, @@ -9376,7 +9376,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", + "account": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -9388,7 +9388,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -9402,7 +9402,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, "newValue": "0x000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d8131", "previousValue": "0x000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d8131", @@ -9428,7 +9428,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", + "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", "isWrite": false, "newValue": "0x000000000000000000000000000000000000000000000000000000000000dead", "previousValue": "0x000000000000000000000000000000000000000000000000000000000000dead", @@ -9682,12 +9682,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000003249623609d0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000284db9040fa0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000055800000000000000000000000000000000000000000000000000000000000c5fc50000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb000000000000000000000000978e3286eb805934215a88694d80b09aded68d9000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000003249623609d0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa600000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000284db9040fa0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000055800000000000000000000000000000000000000000000000000000000000c5fc50000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d586500000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -9696,10 +9696,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", + "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" } @@ -9708,12 +9708,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", + "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000003249623609d0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000284db9040fa0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000055800000000000000000000000000000000000000000000000000000000000c5fc50000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb000000000000000000000000978e3286eb805934215a88694d80b09aded68d9000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000003249623609d0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa600000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000284db9040fa0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000055800000000000000000000000000000000000000000000000000000000000c5fc50000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d586500000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -9722,7 +9722,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000003", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000003", @@ -9730,7 +9730,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000003", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000003", @@ -9738,7 +9738,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000004", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000003", @@ -9746,7 +9746,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -9754,7 +9754,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -9762,7 +9762,7 @@ "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -9773,13 +9773,13 @@ "value": 0 }, { - "accessor": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x9623609d0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000284db9040fa0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000055800000000000000000000000000000000000000000000000000000000000c5fc50000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb000000000000000000000000978e3286eb805934215a88694d80b09aded68d9000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000000000000", + "data": "0x9623609d0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa600000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000284db9040fa0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000055800000000000000000000000000000000000000000000000000000000000c5fc50000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d586500000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -9788,32 +9788,32 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", - "previousValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "newValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", + "previousValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0xd3deaf3a60ea46c2d27b806d7db934a156a6d7fcbf10bbe9f1bbdd2a215a1261" + "slot": "0xa8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c" } ], "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x4f1ef28600000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000284db9040fa0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000055800000000000000000000000000000000000000000000000000000000000c5fc50000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb000000000000000000000000978e3286eb805934215a88694d80b09aded68d9000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000000000000", + "data": "0x4f1ef28600000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000284db9040fa0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000055800000000000000000000000000000000000000000000000000000000000c5fc50000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d586500000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -9822,15 +9822,15 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": true, "newValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -9841,13 +9841,13 @@ "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "account": "0x67866A5052E5302aaD08e9f352331fd8622eB6DC", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0xdb9040fa0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000055800000000000000000000000000000000000000000000000000000000000c5fc50000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb000000000000000000000000978e3286eb805934215a88694d80b09aded68d9000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "data": "0xdb9040fa0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000055800000000000000000000000000000000000000000000000000000000000c5fc50000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d586500000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -9856,7 +9856,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -9864,7 +9864,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -9872,7 +9872,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -9880,7 +9880,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -9888,7 +9888,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -9896,7 +9896,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -9904,7 +9904,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -9912,7 +9912,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -9920,7 +9920,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -9928,39 +9928,39 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": true, "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": true, "newValue": "0x0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -9968,7 +9968,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000067" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -9976,7 +9976,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000068" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": true, "newValue": "0x00000000000000000000000000000000000c5fc5000005580000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -9984,7 +9984,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000068" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": true, "newValue": "0x010000000000000000000000000000000000000000000000000c5fc500000558", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -9992,7 +9992,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000066" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -10000,7 +10000,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000065" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -10008,7 +10008,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000069" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x00000000000000000000000000000000000c5fc5000005580000000000000000", "previousValue": "0x00000000000000000000000000000000000c5fc5000005580000000000000000", @@ -10016,7 +10016,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000068" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": true, "newValue": "0x00000000000000000000000000000000000c5fc50000055800000000017d7840", "previousValue": "0x00000000000000000000000000000000000c5fc5000005580000000000000000", @@ -10024,7 +10024,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000068" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": true, "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -10032,7 +10032,7 @@ "slot": "0x65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": true, "newValue": "0x000000000000000000000000ff00000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -10040,55 +10040,55 @@ "slot": "0x71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc597" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": true, - "newValue": "0x0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", + "newValue": "0x000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580636" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": true, - "newValue": "0x000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f", + "newValue": "0x000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d5865", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a7" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": true, - "newValue": "0x0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4", + "newValue": "0x00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6376" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": true, - "newValue": "0x000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb", + "newValue": "0x0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa906" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": true, - "newValue": "0x000000000000000000000000978e3286eb805934215a88694d80b09aded68d90", + "newValue": "0x0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ac" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": true, - "newValue": "0x00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", + "newValue": "0x000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0xa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320c" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -10096,7 +10096,7 @@ "slot": "0xa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -10104,7 +10104,7 @@ "slot": "0xa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x00000000000000000000000000000000000c5fc50000055800000000017d7840", "previousValue": "0x00000000000000000000000000000000000c5fc50000055800000000017d7840", @@ -10112,7 +10112,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000068" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -10120,7 +10120,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000069" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": true, "newValue": "0x0000ffffffffffffffffffffffffffffffff000f42403b9aca00080a01312d00", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -10128,7 +10128,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000069" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x0000ffffffffffffffffffffffffffffffff000f42403b9aca00080a01312d00", "previousValue": "0x0000ffffffffffffffffffffffffffffffff000f42403b9aca00080a01312d00", @@ -10136,7 +10136,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000069" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -10144,7 +10144,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -10156,7 +10156,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -10170,7 +10170,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", "previousValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", @@ -10199,7 +10199,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -10213,7 +10213,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", "previousValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", @@ -10239,7 +10239,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x0000ffffffffffffffffffffffffffffffff000f42403b9aca00080a01312d00", "previousValue": "0x0000ffffffffffffffffffffffffffffffff000f42403b9aca00080a01312d00", @@ -10277,7 +10277,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -10291,7 +10291,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", "previousValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", @@ -10317,7 +10317,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", @@ -10355,7 +10355,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -10369,7 +10369,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", "previousValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", @@ -10395,7 +10395,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x00000000000000000000000000000000000c5fc50000055800000000017d7840", "previousValue": "0x00000000000000000000000000000000000c5fc50000055800000000017d7840", @@ -10433,7 +10433,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -10447,7 +10447,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", "previousValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", @@ -10473,7 +10473,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x00000000000000000000000000000000000c5fc50000055800000000017d7840", "previousValue": "0x00000000000000000000000000000000000c5fc50000055800000000017d7840", @@ -10511,7 +10511,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -10525,7 +10525,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", "previousValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", @@ -10551,7 +10551,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc", "previousValue": "0x0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc", @@ -10589,7 +10589,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -10603,7 +10603,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", "previousValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", @@ -10629,7 +10629,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x00000000000000000000000000000000000c5fc50000055800000000017d7840", "previousValue": "0x00000000000000000000000000000000000c5fc50000055800000000017d7840", @@ -10667,7 +10667,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -10681,7 +10681,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", "previousValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", @@ -10707,7 +10707,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", @@ -10719,7 +10719,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -10733,7 +10733,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", "previousValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", @@ -10759,7 +10759,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x010000000000000000000000000000000000000000000000000c5fc500000558", "previousValue": "0x010000000000000000000000000000000000000000000000000c5fc500000558", @@ -10797,7 +10797,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -10811,7 +10811,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", "previousValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", @@ -10837,7 +10837,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -10875,7 +10875,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -10889,7 +10889,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", "previousValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", @@ -10915,7 +10915,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x000000000000000000000000ff00000000000000000000000000000000000000", "previousValue": "0x000000000000000000000000ff00000000000000000000000000000000000000", @@ -10927,7 +10927,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -10941,7 +10941,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", "previousValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", @@ -10967,10 +10967,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, - "newValue": "0x0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", - "previousValue": "0x0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", + "newValue": "0x000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f", + "previousValue": "0x000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f", "reverted": false, "slot": "0x383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580636" } @@ -10979,7 +10979,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -10993,7 +10993,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", "previousValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", @@ -11019,10 +11019,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, - "newValue": "0x000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f", - "previousValue": "0x000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f", + "newValue": "0x000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d5865", + "previousValue": "0x000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d5865", "reverted": false, "slot": "0x46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a7" } @@ -11031,7 +11031,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -11045,7 +11045,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", "previousValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", @@ -11071,10 +11071,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, - "newValue": "0x0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4", - "previousValue": "0x0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4", + "newValue": "0x00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", + "previousValue": "0x00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", "reverted": false, "slot": "0x9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6376" } @@ -11083,7 +11083,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -11097,7 +11097,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", "previousValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", @@ -11123,10 +11123,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, - "newValue": "0x000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb", - "previousValue": "0x000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb", + "newValue": "0x0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d", + "previousValue": "0x0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d", "reverted": false, "slot": "0x52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa906" } @@ -11135,7 +11135,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -11149,7 +11149,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", "previousValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", @@ -11175,10 +11175,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, - "newValue": "0x000000000000000000000000978e3286eb805934215a88694d80b09aded68d90", - "previousValue": "0x000000000000000000000000978e3286eb805934215a88694d80b09aded68d90", + "newValue": "0x0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4", + "previousValue": "0x0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4", "reverted": false, "slot": "0x4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ac" } @@ -11187,7 +11187,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -11201,7 +11201,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, "newValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", "previousValue": "0x00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc", @@ -11227,10 +11227,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", + "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", "isWrite": false, - "newValue": "0x00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", - "previousValue": "0x00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", + "newValue": "0x000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb", + "previousValue": "0x000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb", "reverted": false, "slot": "0xa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320c" } @@ -11273,12 +11273,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6bd9f5160000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4", + "data": "0x6bd9f51600000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", "deployedCode": "0x", "initialized": true, "kind": "StaticCall", @@ -11287,24 +11287,24 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x727598a658f6983be3a9f29beef55aaee89ef8a176baeeacbe7edf5ff94a781b" + "slot": "0x540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3" } ], "value": 0 }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000448d52d4a00000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000448d52d4a000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -11313,10 +11313,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", + "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" } @@ -11325,12 +11325,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", + "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000448d52d4a00000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000448d52d4a000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -11339,7 +11339,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000004", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000004", @@ -11347,7 +11347,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000004", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000004", @@ -11355,7 +11355,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000005", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000004", @@ -11363,7 +11363,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -11371,7 +11371,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -11379,7 +11379,7 @@ "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -11390,13 +11390,13 @@ "value": 0 }, { - "accessor": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x8d52d4a00000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e40000000000000000000000000000000000000000000000000000000000000001", + "data": "0x8d52d4a000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d0000000000000000000000000000000000000000000000000000000000000001", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -11405,40 +11405,40 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", - "previousValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "newValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", + "previousValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x727598a658f6983be3a9f29beef55aaee89ef8a176baeeacbe7edf5ff94a781b" + "slot": "0x540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x727598a658f6983be3a9f29beef55aaee89ef8a176baeeacbe7edf5ff94a781b" + "slot": "0x540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3" } ], "value": 0 }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6bd9f5160000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4", + "data": "0x6bd9f51600000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", "deployedCode": "0x", "initialized": true, "kind": "StaticCall", @@ -11447,24 +11447,24 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "reverted": false, - "slot": "0x727598a658f6983be3a9f29beef55aaee89ef8a176baeeacbe7edf5ff94a781b" + "slot": "0x540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3" } ], "value": 0 }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000b7900b27be8f0e0ff65d1c3a4671e1220437dd2b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d708090000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000b7900b27be8f0e0ff65d1c3a4671e1220437dd2b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab03510000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -11473,10 +11473,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", + "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" } @@ -11485,12 +11485,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", + "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000b7900b27be8f0e0ff65d1c3a4671e1220437dd2b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d708090000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000b7900b27be8f0e0ff65d1c3a4671e1220437dd2b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab03510000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -11499,7 +11499,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000005", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000005", @@ -11507,7 +11507,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000005", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000005", @@ -11515,7 +11515,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000006", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000005", @@ -11523,7 +11523,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -11531,7 +11531,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -11539,7 +11539,7 @@ "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -11550,13 +11550,13 @@ "value": 0 }, { - "accessor": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x9623609d0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000b7900b27be8f0e0ff65d1c3a4671e1220437dd2b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d708090000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb00000000000000000000000000000000000000000000000000000000", + "data": "0x9623609d00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000b7900b27be8f0e0ff65d1c3a4671e1220437dd2b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab03510000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa600000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -11565,43 +11565,43 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", - "previousValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "newValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", + "previousValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "reverted": false, - "slot": "0x727598a658f6983be3a9f29beef55aaee89ef8a176baeeacbe7edf5ff94a781b" + "slot": "0x540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", - "previousValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "newValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", + "previousValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "reverted": false, - "slot": "0x727598a658f6983be3a9f29beef55aaee89ef8a176baeeacbe7edf5ff94a781b" + "slot": "0x540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3" } ], "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -11617,8 +11617,8 @@ "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -11632,15 +11632,15 @@ "reverted": false, "storageAccesses": [ { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" }, { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": true, "newValue": "0x000000000000000000000000b7900b27be8f0e0ff65d1c3a4671e1220437dd2b", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -11651,13 +11651,13 @@ "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0xc0c53b8b0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d708090000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb", + "data": "0xc0c53b8b000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab03510000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -11666,10 +11666,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" } @@ -11677,8 +11677,8 @@ "value": 0 }, { - "accessor": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -11692,10 +11692,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "newValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", + "previousValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" } @@ -11703,8 +11703,8 @@ "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -11718,7 +11718,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, "newValue": "0x000000000000000000000000b7900b27be8f0e0ff65d1c3a4671e1220437dd2b", "previousValue": "0x000000000000000000000000b7900b27be8f0e0ff65d1c3a4671e1220437dd2b", @@ -11729,13 +11729,13 @@ "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "account": "0xb7900B27Be8f0E0fF65d1C3A4671e1220437dd2b", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0xc0c53b8b0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d708090000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb", + "data": "0xc0c53b8b000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab03510000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -11744,7 +11744,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -11752,7 +11752,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -11760,7 +11760,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -11768,7 +11768,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -11776,7 +11776,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -11784,7 +11784,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -11792,7 +11792,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -11800,15 +11800,15 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" }, { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": true, - "newValue": "0x000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", + "newValue": "0x0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" }, { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -11816,15 +11816,15 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": true, - "newValue": "0x0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb", + "newValue": "0x0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -11832,7 +11832,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -11840,15 +11840,15 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" }, { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": true, - "newValue": "0x0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", + "newValue": "0x000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" }, { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -11856,7 +11856,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" }, { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": true, "newValue": "0x0000000000000000000000004200000000000000000000000000000000000010", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -11864,7 +11864,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" }, { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -11872,7 +11872,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -11884,7 +11884,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -11898,10 +11898,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" } @@ -11909,8 +11909,8 @@ "value": 0 }, { - "accessor": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -11924,10 +11924,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "newValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", + "previousValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" } @@ -11936,7 +11936,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -11950,7 +11950,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, "newValue": "0x000000000000000000000000b7900b27be8f0e0ff65d1c3a4671e1220437dd2b", "previousValue": "0x000000000000000000000000b7900b27be8f0e0ff65d1c3a4671e1220437dd2b", @@ -11979,7 +11979,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -11993,10 +11993,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" } @@ -12004,8 +12004,8 @@ "value": 0 }, { - "accessor": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -12019,10 +12019,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "newValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", + "previousValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" } @@ -12031,7 +12031,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -12045,7 +12045,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, "newValue": "0x000000000000000000000000b7900b27be8f0e0ff65d1c3a4671e1220437dd2b", "previousValue": "0x000000000000000000000000b7900b27be8f0e0ff65d1c3a4671e1220437dd2b", @@ -12071,10 +12071,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, - "newValue": "0x0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", - "previousValue": "0x0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", + "newValue": "0x000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f", + "previousValue": "0x000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" } @@ -12083,7 +12083,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -12097,10 +12097,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" } @@ -12108,8 +12108,8 @@ "value": 0 }, { - "accessor": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -12123,10 +12123,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "newValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", + "previousValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" } @@ -12135,7 +12135,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -12149,7 +12149,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, "newValue": "0x000000000000000000000000b7900b27be8f0e0ff65d1c3a4671e1220437dd2b", "previousValue": "0x000000000000000000000000b7900b27be8f0e0ff65d1c3a4671e1220437dd2b", @@ -12175,10 +12175,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, - "newValue": "0x0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", - "previousValue": "0x0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", + "newValue": "0x000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f", + "previousValue": "0x000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" } @@ -12187,7 +12187,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -12201,10 +12201,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" } @@ -12212,8 +12212,8 @@ "value": 0 }, { - "accessor": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -12227,10 +12227,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "newValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", + "previousValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" } @@ -12239,7 +12239,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -12253,7 +12253,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, "newValue": "0x000000000000000000000000b7900b27be8f0e0ff65d1c3a4671e1220437dd2b", "previousValue": "0x000000000000000000000000b7900b27be8f0e0ff65d1c3a4671e1220437dd2b", @@ -12279,7 +12279,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, "newValue": "0x0000000000000000000000004200000000000000000000000000000000000010", "previousValue": "0x0000000000000000000000004200000000000000000000000000000000000010", @@ -12291,7 +12291,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -12305,10 +12305,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" } @@ -12316,8 +12316,8 @@ "value": 0 }, { - "accessor": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -12331,10 +12331,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "newValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", + "previousValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" } @@ -12343,7 +12343,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -12357,7 +12357,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, "newValue": "0x000000000000000000000000b7900b27be8f0e0ff65d1c3a4671e1220437dd2b", "previousValue": "0x000000000000000000000000b7900b27be8f0e0ff65d1c3a4671e1220437dd2b", @@ -12383,7 +12383,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, "newValue": "0x0000000000000000000000004200000000000000000000000000000000000010", "previousValue": "0x0000000000000000000000004200000000000000000000000000000000000010", @@ -12395,7 +12395,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -12409,10 +12409,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" } @@ -12420,8 +12420,8 @@ "value": 0 }, { - "accessor": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -12435,10 +12435,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "newValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", + "previousValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" } @@ -12447,7 +12447,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -12461,7 +12461,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, "newValue": "0x000000000000000000000000b7900b27be8f0e0ff65d1c3a4671e1220437dd2b", "previousValue": "0x000000000000000000000000b7900b27be8f0e0ff65d1c3a4671e1220437dd2b", @@ -12487,10 +12487,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", + "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", "isWrite": false, - "newValue": "0x000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", - "previousValue": "0x000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", + "newValue": "0x0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351", + "previousValue": "0x0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" } @@ -12533,12 +12533,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000e49623609d000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000005c4f5e749a61a9503c4aae8a9393e89609a0e80400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc9550000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000e49623609d000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d58650000000000000000000000005c4f5e749a61a9503c4aae8a9393e89609a0e80400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -12547,10 +12547,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", + "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" } @@ -12559,12 +12559,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", + "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000e49623609d000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000005c4f5e749a61a9503c4aae8a9393e89609a0e80400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc9550000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000e49623609d000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d58650000000000000000000000005c4f5e749a61a9503c4aae8a9393e89609a0e80400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -12573,7 +12573,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000006", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000006", @@ -12581,7 +12581,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000006", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000006", @@ -12589,7 +12589,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000007", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000006", @@ -12597,7 +12597,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -12605,7 +12605,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -12613,7 +12613,7 @@ "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -12624,13 +12624,13 @@ "value": 0 }, { - "accessor": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x9623609d000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000005c4f5e749a61a9503c4aae8a9393e89609a0e80400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc9550000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900000000000000000000000000000000000000000000000000000000", + "data": "0x9623609d000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d58650000000000000000000000005c4f5e749a61a9503c4aae8a9393e89609a0e80400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab035100000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -12639,32 +12639,32 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", - "previousValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "newValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", + "previousValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284" + "slot": "0x9ab6929e7d0104b9744ecf48c9c83f65e34bb9eb80c70a88b6b8885e3bf62b15" } ], "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x4f1ef2860000000000000000000000005c4f5e749a61a9503c4aae8a9393e89609a0e80400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000044485cc9550000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900000000000000000000000000000000000000000000000000000000", + "data": "0x4f1ef2860000000000000000000000005c4f5e749a61a9503c4aae8a9393e89609a0e80400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab035100000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -12673,15 +12673,15 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" }, { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": true, "newValue": "0x0000000000000000000000005c4f5e749a61a9503c4aae8a9393e89609a0e804", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -12692,13 +12692,13 @@ "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "account": "0x5C4F5e749A61a9503c4AAE8a9393e89609a0e804", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x485cc9550000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", + "data": "0x485cc955000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -12707,7 +12707,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -12715,7 +12715,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -12723,7 +12723,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -12731,7 +12731,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -12739,7 +12739,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -12747,7 +12747,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -12755,7 +12755,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -12763,15 +12763,15 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" }, { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": true, - "newValue": "0x000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", + "newValue": "0x0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" }, { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -12779,7 +12779,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -12787,15 +12787,15 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" }, { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": true, - "newValue": "0x0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", + "newValue": "0x000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" }, { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -12803,7 +12803,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000002" }, { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": true, "newValue": "0x0000000000000000000000004200000000000000000000000000000000000014", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -12811,7 +12811,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000002" }, { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -12819,7 +12819,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -12831,7 +12831,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -12845,7 +12845,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": false, "newValue": "0x0000000000000000000000005c4f5e749a61a9503c4aae8a9393e89609a0e804", "previousValue": "0x0000000000000000000000005c4f5e749a61a9503c4aae8a9393e89609a0e804", @@ -12874,7 +12874,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -12888,7 +12888,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": false, "newValue": "0x0000000000000000000000005c4f5e749a61a9503c4aae8a9393e89609a0e804", "previousValue": "0x0000000000000000000000005c4f5e749a61a9503c4aae8a9393e89609a0e804", @@ -12914,7 +12914,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": false, "newValue": "0x0000000000000000000000004200000000000000000000000000000000000014", "previousValue": "0x0000000000000000000000004200000000000000000000000000000000000014", @@ -12926,7 +12926,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -12940,7 +12940,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": false, "newValue": "0x0000000000000000000000005c4f5e749a61a9503c4aae8a9393e89609a0e804", "previousValue": "0x0000000000000000000000005c4f5e749a61a9503c4aae8a9393e89609a0e804", @@ -12966,7 +12966,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": false, "newValue": "0x0000000000000000000000004200000000000000000000000000000000000014", "previousValue": "0x0000000000000000000000004200000000000000000000000000000000000014", @@ -12978,7 +12978,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -12992,7 +12992,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": false, "newValue": "0x0000000000000000000000005c4f5e749a61a9503c4aae8a9393e89609a0e804", "previousValue": "0x0000000000000000000000005c4f5e749a61a9503c4aae8a9393e89609a0e804", @@ -13018,10 +13018,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": false, - "newValue": "0x0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", - "previousValue": "0x0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", + "newValue": "0x000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f", + "previousValue": "0x000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" } @@ -13030,7 +13030,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -13044,7 +13044,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": false, "newValue": "0x0000000000000000000000005c4f5e749a61a9503c4aae8a9393e89609a0e804", "previousValue": "0x0000000000000000000000005c4f5e749a61a9503c4aae8a9393e89609a0e804", @@ -13070,10 +13070,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": false, - "newValue": "0x0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", - "previousValue": "0x0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", + "newValue": "0x000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f", + "previousValue": "0x000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" } @@ -13082,7 +13082,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -13096,7 +13096,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": false, "newValue": "0x0000000000000000000000005c4f5e749a61a9503c4aae8a9393e89609a0e804", "previousValue": "0x0000000000000000000000005c4f5e749a61a9503c4aae8a9393e89609a0e804", @@ -13122,10 +13122,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", "isWrite": false, - "newValue": "0x000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", - "previousValue": "0x000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", + "newValue": "0x0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351", + "previousValue": "0x0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" } @@ -13168,12 +13168,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000c49623609d00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d00000000000000000000000039aea2dd53f2d01c15877acc2791af6bdd7ad56700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000c49623609d000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb00000000000000000000000039aea2dd53f2d01c15877acc2791af6bdd7ad56700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de800000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -13182,10 +13182,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", + "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" } @@ -13194,12 +13194,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", + "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000c49623609d00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d00000000000000000000000039aea2dd53f2d01c15877acc2791af6bdd7ad56700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000c49623609d000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb00000000000000000000000039aea2dd53f2d01c15877acc2791af6bdd7ad56700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de800000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -13208,7 +13208,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000007", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000007", @@ -13216,7 +13216,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000007", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000007", @@ -13224,7 +13224,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000008", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000007", @@ -13232,7 +13232,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -13240,7 +13240,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -13248,7 +13248,7 @@ "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -13259,13 +13259,13 @@ "value": 0 }, { - "accessor": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x9623609d00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d00000000000000000000000039aea2dd53f2d01c15877acc2791af6bdd7ad56700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e400000000000000000000000000000000000000000000000000000000", + "data": "0x9623609d000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb00000000000000000000000039aea2dd53f2d01c15877acc2791af6bdd7ad56700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de800000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d00000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -13274,32 +13274,32 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", - "previousValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "newValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", + "previousValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3" + "slot": "0xf6cecbacbfeb99e6ab0f02c22fd8a103f8837deb80af03d481ac5bc8d5475f58" } ], "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", + "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x4f1ef28600000000000000000000000039aea2dd53f2d01c15877acc2791af6bdd7ad56700000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e400000000000000000000000000000000000000000000000000000000", + "data": "0x4f1ef28600000000000000000000000039aea2dd53f2d01c15877acc2791af6bdd7ad56700000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000024c4d66de800000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d00000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -13308,15 +13308,15 @@ "reverted": false, "storageAccesses": [ { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" }, { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", "isWrite": true, "newValue": "0x00000000000000000000000039aea2dd53f2d01c15877acc2791af6bdd7ad567", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -13327,13 +13327,13 @@ "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "account": "0x39Aea2Dd53f2d01c15877aCc2791af6BDD7aD567", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0xc4d66de80000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4", + "data": "0xc4d66de800000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -13342,7 +13342,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -13350,7 +13350,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -13358,7 +13358,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -13366,7 +13366,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -13374,7 +13374,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -13382,7 +13382,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -13390,7 +13390,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -13398,15 +13398,15 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" }, { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", "isWrite": true, - "newValue": "0x0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4", + "newValue": "0x00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" }, { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -13414,7 +13414,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -13426,7 +13426,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -13440,7 +13440,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", "isWrite": false, "newValue": "0x00000000000000000000000039aea2dd53f2d01c15877acc2791af6bdd7ad567", "previousValue": "0x00000000000000000000000039aea2dd53f2d01c15877acc2791af6bdd7ad567", @@ -13469,7 +13469,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -13483,7 +13483,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", "isWrite": false, "newValue": "0x00000000000000000000000039aea2dd53f2d01c15877acc2791af6bdd7ad567", "previousValue": "0x00000000000000000000000039aea2dd53f2d01c15877acc2791af6bdd7ad567", @@ -13509,10 +13509,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", "isWrite": false, - "newValue": "0x0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4", - "previousValue": "0x0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4", + "newValue": "0x00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", + "previousValue": "0x00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" } @@ -13521,7 +13521,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -13535,7 +13535,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", "isWrite": false, "newValue": "0x00000000000000000000000039aea2dd53f2d01c15877acc2791af6bdd7ad567", "previousValue": "0x00000000000000000000000039aea2dd53f2d01c15877acc2791af6bdd7ad567", @@ -13561,10 +13561,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", + "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", "isWrite": false, - "newValue": "0x0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4", - "previousValue": "0x0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4", + "newValue": "0x00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", + "previousValue": "0x00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" } @@ -13607,12 +13607,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6bd9f5160000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", + "data": "0x6bd9f516000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f", "deployedCode": "0x", "initialized": true, "kind": "StaticCall", @@ -13621,24 +13621,24 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0xa8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c" + "slot": "0x191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284" } ], "value": 0 }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000448d52d4a00000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000448d52d4a0000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -13647,10 +13647,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", + "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" } @@ -13659,12 +13659,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", + "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000448d52d4a00000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000448d52d4a0000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -13673,7 +13673,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000008", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000008", @@ -13681,7 +13681,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000008", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000008", @@ -13689,7 +13689,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000009", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000008", @@ -13697,7 +13697,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -13705,7 +13705,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -13713,7 +13713,7 @@ "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -13724,13 +13724,13 @@ "value": 0 }, { - "accessor": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x8d52d4a00000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000000000000000000000000000000000000000000002", + "data": "0x8d52d4a0000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000000000000000000000000000000000000000000002", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -13739,40 +13739,40 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", - "previousValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "newValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", + "previousValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0xa8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c" + "slot": "0x191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000002", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0xa8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c" + "slot": "0x191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284" } ], "value": 0 }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6bd9f5160000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", + "data": "0x6bd9f516000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f", "deployedCode": "0x", "initialized": true, "kind": "StaticCall", @@ -13781,19 +13781,19 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000002", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000002", "reverted": false, - "slot": "0xa8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c" + "slot": "0x191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284" } ], "value": 0 }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -13807,7 +13807,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -13815,7 +13815,7 @@ "slot": "0xa90bdf0e44f0927a7a755fa7e7503fcc3da69ee33c69f36790fa0e0ef2db4745" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -13827,12 +13827,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000084860f7cda0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001a4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000084860f7cda000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001a4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -13841,10 +13841,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", + "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" } @@ -13853,12 +13853,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", + "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000084860f7cda0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001a4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000084860f7cda000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001a4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -13867,7 +13867,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000009", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000009", @@ -13875,7 +13875,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000009", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000009", @@ -13883,7 +13883,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": true, "newValue": "0x000000000000000000000000000000000000000000000000000000000000000a", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000009", @@ -13891,7 +13891,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -13899,7 +13899,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -13907,7 +13907,7 @@ "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -13918,13 +13918,13 @@ "value": 0 }, { - "accessor": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x860f7cda0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001a4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000", + "data": "0x860f7cda000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001a4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -13933,40 +13933,40 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", - "previousValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "newValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", + "previousValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x7cda2d9a7dd1a58982b7fac9315bdc1ed8c92aeb9c22cd8555aaa54972f01ccb" + "slot": "0x89a8cb4d9b6f179480a9e676431122d6ba6a5fb2aa9462528e7e48e497a5c045" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": true, "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x7cda2d9a7dd1a58982b7fac9315bdc1ed8c92aeb9c22cd8555aaa54972f01ccb" + "slot": "0x89a8cb4d9b6f179480a9e676431122d6ba6a5fb2aa9462528e7e48e497a5c045" } ], "value": 0 }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x238181ae0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", + "data": "0x238181ae000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f", "deployedCode": "0x", "initialized": true, "kind": "StaticCall", @@ -13975,40 +13975,40 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "reverted": false, - "slot": "0x7cda2d9a7dd1a58982b7fac9315bdc1ed8c92aeb9c22cd8555aaa54972f01ccb" + "slot": "0x89a8cb4d9b6f179480a9e676431122d6ba6a5fb2aa9462528e7e48e497a5c045" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "reverted": false, - "slot": "0x7cda2d9a7dd1a58982b7fac9315bdc1ed8c92aeb9c22cd8555aaa54972f01ccb" + "slot": "0x89a8cb4d9b6f179480a9e676431122d6ba6a5fb2aa9462528e7e48e497a5c045" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "reverted": false, - "slot": "0x7cda2d9a7dd1a58982b7fac9315bdc1ed8c92aeb9c22cd8555aaa54972f01ccb" + "slot": "0x89a8cb4d9b6f179480a9e676431122d6ba6a5fb2aa9462528e7e48e497a5c045" } ], "value": 0 }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6000000000000000000000000094e6508ba9d9bf1ce421fff3de06ae56e67901b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f000000000000000000000000094e6508ba9d9bf1ce421fff3de06ae56e67901b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab03510000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e40000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -14017,10 +14017,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", + "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" } @@ -14029,12 +14029,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", + "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6000000000000000000000000094e6508ba9d9bf1ce421fff3de06ae56e67901b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f000000000000000000000000094e6508ba9d9bf1ce421fff3de06ae56e67901b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab03510000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e40000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -14043,7 +14043,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x000000000000000000000000000000000000000000000000000000000000000a", "previousValue": "0x000000000000000000000000000000000000000000000000000000000000000a", @@ -14051,7 +14051,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x000000000000000000000000000000000000000000000000000000000000000a", "previousValue": "0x000000000000000000000000000000000000000000000000000000000000000a", @@ -14059,7 +14059,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": true, "newValue": "0x000000000000000000000000000000000000000000000000000000000000000b", "previousValue": "0x000000000000000000000000000000000000000000000000000000000000000a", @@ -14067,7 +14067,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -14075,7 +14075,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -14083,7 +14083,7 @@ "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -14094,13 +14094,13 @@ "value": 0 }, { - "accessor": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x9623609d0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6000000000000000000000000094e6508ba9d9bf1ce421fff3de06ae56e67901b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb00000000000000000000000000000000000000000000000000000000", + "data": "0x9623609d000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f000000000000000000000000094e6508ba9d9bf1ce421fff3de06ae56e67901b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab03510000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e40000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa600000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -14109,66 +14109,66 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", - "previousValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "newValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", + "previousValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000002", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000002", "reverted": false, - "slot": "0xa8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c" + "slot": "0x191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", - "previousValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "newValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", + "previousValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000002", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000002", "reverted": false, - "slot": "0xa8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c" + "slot": "0x191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "reverted": false, - "slot": "0x7cda2d9a7dd1a58982b7fac9315bdc1ed8c92aeb9c22cd8555aaa54972f01ccb" + "slot": "0x89a8cb4d9b6f179480a9e676431122d6ba6a5fb2aa9462528e7e48e497a5c045" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "reverted": false, - "slot": "0x7cda2d9a7dd1a58982b7fac9315bdc1ed8c92aeb9c22cd8555aaa54972f01ccb" + "slot": "0x89a8cb4d9b6f179480a9e676431122d6ba6a5fb2aa9462528e7e48e497a5c045" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "reverted": false, - "slot": "0x7cda2d9a7dd1a58982b7fac9315bdc1ed8c92aeb9c22cd8555aaa54972f01ccb" + "slot": "0x89a8cb4d9b6f179480a9e676431122d6ba6a5fb2aa9462528e7e48e497a5c045" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "newValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", + "previousValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" } @@ -14176,8 +14176,8 @@ "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -14193,8 +14193,8 @@ "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -14208,15 +14208,15 @@ "reverted": false, "storageAccesses": [ { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -14224,7 +14224,7 @@ "slot": "0x515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e" }, { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "isWrite": true, "newValue": "0x000000000000000000000000094e6508ba9d9bf1ce421fff3de06ae56e67901b", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -14235,13 +14235,13 @@ "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0xc0c53b8b000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb", + "data": "0xc0c53b8b0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab03510000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e40000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -14250,27 +14250,27 @@ "reverted": false, "storageAccesses": [ { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "newValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", + "previousValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", "reverted": false, - "slot": "0xa8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c" + "slot": "0x191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "reverted": false, - "slot": "0xeae32376463217751b8fa4dea8c38ab253664fa3605de6d85d2e790aa970f2b8" + "slot": "0x6822ddba83a78589c753bb747cf4919773ec1d36eeb0bb2a09d64b6d87adda0b" } ], "value": 0 }, { - "accessor": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "accessor": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -14284,7 +14284,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "isWrite": false, "newValue": "0x000000000000000000000000094e6508ba9d9bf1ce421fff3de06ae56e67901b", "previousValue": "0x000000000000000000000000094e6508ba9d9bf1ce421fff3de06ae56e67901b", @@ -14295,13 +14295,13 @@ "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "account": "0x094e6508ba9d9bf1ce421fff3dE06aE56e67901b", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0xc0c53b8b000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb", + "data": "0xc0c53b8b0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab03510000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e40000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -14310,7 +14310,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -14318,7 +14318,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -14326,7 +14326,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -14334,7 +14334,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": true, "newValue": "0x0000000000000000000000010000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -14342,7 +14342,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, "newValue": "0x0000000000000000000000010000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000010000000000000000000000000000000000000000", @@ -14350,7 +14350,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": true, "newValue": "0x0000000000000000000001010000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000010000000000000000000000000000000000000000", @@ -14358,7 +14358,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -14366,15 +14366,15 @@ "slot": "0x00000000000000000000000000000000000000000000000000000000000000fb" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": true, - "newValue": "0x000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", + "newValue": "0x0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x00000000000000000000000000000000000000000000000000000000000000fb" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -14382,15 +14382,15 @@ "slot": "0x00000000000000000000000000000000000000000000000000000000000000fc" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": true, - "newValue": "0x000000000000000000000000978e3286eb805934215a88694d80b09aded68d90", + "newValue": "0x0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x00000000000000000000000000000000000000000000000000000000000000fc" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -14398,15 +14398,15 @@ "slot": "0x00000000000000000000000000000000000000000000000000000000000000fd" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": true, - "newValue": "0x0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb", + "newValue": "0x0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x00000000000000000000000000000000000000000000000000000000000000fd" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, "newValue": "0x0000000000000000000001010000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000001010000000000000000000000000000000000000000", @@ -14414,7 +14414,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -14422,7 +14422,7 @@ "slot": "0x00000000000000000000000000000000000000000000000000000000000000cc" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -14430,7 +14430,7 @@ "slot": "0x00000000000000000000000000000000000000000000000000000000000000cc" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": true, "newValue": "0x000000000000000000000000000000000000000000000000000000000000dead", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -14438,7 +14438,7 @@ "slot": "0x00000000000000000000000000000000000000000000000000000000000000cc" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -14446,7 +14446,7 @@ "slot": "0x00000000000000000000000000000000000000000000000000000000000000cf" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": true, "newValue": "0x0000000000000000000000004200000000000000000000000000000000000007", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -14454,7 +14454,7 @@ "slot": "0x00000000000000000000000000000000000000000000000000000000000000cf" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, "newValue": "0x0000000000000000000001010000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000001010000000000000000000000000000000000000000", @@ -14462,7 +14462,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": true, "newValue": "0x0000000000000000000000010000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000001010000000000000000000000000000000000000000", @@ -14474,7 +14474,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -14488,27 +14488,27 @@ "reverted": false, "storageAccesses": [ { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "newValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", + "previousValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", "reverted": false, - "slot": "0xa8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c" + "slot": "0x191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "reverted": false, - "slot": "0xeae32376463217751b8fa4dea8c38ab253664fa3605de6d85d2e790aa970f2b8" + "slot": "0x6822ddba83a78589c753bb747cf4919773ec1d36eeb0bb2a09d64b6d87adda0b" } ], "value": 0 }, { - "accessor": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "accessor": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -14522,7 +14522,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "isWrite": false, "newValue": "0x000000000000000000000000094e6508ba9d9bf1ce421fff3de06ae56e67901b", "previousValue": "0x000000000000000000000000094e6508ba9d9bf1ce421fff3de06ae56e67901b", @@ -14551,7 +14551,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -14565,27 +14565,27 @@ "reverted": false, "storageAccesses": [ { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "newValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", + "previousValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", "reverted": false, - "slot": "0xa8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c" + "slot": "0x191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "reverted": false, - "slot": "0xeae32376463217751b8fa4dea8c38ab253664fa3605de6d85d2e790aa970f2b8" + "slot": "0x6822ddba83a78589c753bb747cf4919773ec1d36eeb0bb2a09d64b6d87adda0b" } ], "value": 0 }, { - "accessor": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "accessor": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -14599,7 +14599,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "isWrite": false, "newValue": "0x000000000000000000000000094e6508ba9d9bf1ce421fff3de06ae56e67901b", "previousValue": "0x000000000000000000000000094e6508ba9d9bf1ce421fff3de06ae56e67901b", @@ -14625,7 +14625,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, "newValue": "0x0000000000000000000000004200000000000000000000000000000000000007", "previousValue": "0x0000000000000000000000004200000000000000000000000000000000000007", @@ -14637,7 +14637,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -14651,27 +14651,27 @@ "reverted": false, "storageAccesses": [ { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "newValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", + "previousValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", "reverted": false, - "slot": "0xa8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c" + "slot": "0x191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "reverted": false, - "slot": "0xeae32376463217751b8fa4dea8c38ab253664fa3605de6d85d2e790aa970f2b8" + "slot": "0x6822ddba83a78589c753bb747cf4919773ec1d36eeb0bb2a09d64b6d87adda0b" } ], "value": 0 }, { - "accessor": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "accessor": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -14685,7 +14685,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "isWrite": false, "newValue": "0x000000000000000000000000094e6508ba9d9bf1ce421fff3de06ae56e67901b", "previousValue": "0x000000000000000000000000094e6508ba9d9bf1ce421fff3de06ae56e67901b", @@ -14711,7 +14711,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, "newValue": "0x0000000000000000000000004200000000000000000000000000000000000007", "previousValue": "0x0000000000000000000000004200000000000000000000000000000000000007", @@ -14723,7 +14723,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -14737,27 +14737,27 @@ "reverted": false, "storageAccesses": [ { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "newValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", + "previousValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", "reverted": false, - "slot": "0xa8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c" + "slot": "0x191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "reverted": false, - "slot": "0xeae32376463217751b8fa4dea8c38ab253664fa3605de6d85d2e790aa970f2b8" + "slot": "0x6822ddba83a78589c753bb747cf4919773ec1d36eeb0bb2a09d64b6d87adda0b" } ], "value": 0 }, { - "accessor": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "accessor": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -14771,7 +14771,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "isWrite": false, "newValue": "0x000000000000000000000000094e6508ba9d9bf1ce421fff3de06ae56e67901b", "previousValue": "0x000000000000000000000000094e6508ba9d9bf1ce421fff3de06ae56e67901b", @@ -14797,10 +14797,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, - "newValue": "0x000000000000000000000000978e3286eb805934215a88694d80b09aded68d90", - "previousValue": "0x000000000000000000000000978e3286eb805934215a88694d80b09aded68d90", + "newValue": "0x0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4", + "previousValue": "0x0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4", "reverted": false, "slot": "0x00000000000000000000000000000000000000000000000000000000000000fc" } @@ -14809,7 +14809,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -14823,27 +14823,27 @@ "reverted": false, "storageAccesses": [ { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "newValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", + "previousValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", "reverted": false, - "slot": "0xa8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c" + "slot": "0x191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "reverted": false, - "slot": "0xeae32376463217751b8fa4dea8c38ab253664fa3605de6d85d2e790aa970f2b8" + "slot": "0x6822ddba83a78589c753bb747cf4919773ec1d36eeb0bb2a09d64b6d87adda0b" } ], "value": 0 }, { - "accessor": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "accessor": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -14857,7 +14857,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "isWrite": false, "newValue": "0x000000000000000000000000094e6508ba9d9bf1ce421fff3de06ae56e67901b", "previousValue": "0x000000000000000000000000094e6508ba9d9bf1ce421fff3de06ae56e67901b", @@ -14883,10 +14883,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, - "newValue": "0x000000000000000000000000978e3286eb805934215a88694d80b09aded68d90", - "previousValue": "0x000000000000000000000000978e3286eb805934215a88694d80b09aded68d90", + "newValue": "0x0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4", + "previousValue": "0x0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4", "reverted": false, "slot": "0x00000000000000000000000000000000000000000000000000000000000000fc" } @@ -14895,7 +14895,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -14909,27 +14909,27 @@ "reverted": false, "storageAccesses": [ { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "newValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", + "previousValue": "0x00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4", "reverted": false, - "slot": "0xa8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c" + "slot": "0x191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284" }, { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", "reverted": false, - "slot": "0xeae32376463217751b8fa4dea8c38ab253664fa3605de6d85d2e790aa970f2b8" + "slot": "0x6822ddba83a78589c753bb747cf4919773ec1d36eeb0bb2a09d64b6d87adda0b" } ], "value": 0 }, { - "accessor": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "accessor": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -14943,7 +14943,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", + "account": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", "isWrite": false, "newValue": "0x000000000000000000000000094e6508ba9d9bf1ce421fff3de06ae56e67901b", "previousValue": "0x000000000000000000000000094e6508ba9d9bf1ce421fff3de06ae56e67901b", @@ -14969,10 +14969,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", + "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", "isWrite": false, - "newValue": "0x000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", - "previousValue": "0x000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", + "newValue": "0x0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351", + "previousValue": "0x0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351", "reverted": false, "slot": "0x00000000000000000000000000000000000000000000000000000000000000fb" } @@ -15205,12 +15205,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001849623609d000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d586500000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e41c89c97d000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c80000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b630000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001849623609d00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df9900000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e41c89c97d000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c80000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b630000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -15219,10 +15219,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", + "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" } @@ -15231,12 +15231,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", + "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001849623609d000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d586500000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e41c89c97d000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c80000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b630000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001849623609d00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df9900000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e41c89c97d000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c80000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b630000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -15245,7 +15245,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x000000000000000000000000000000000000000000000000000000000000000b", "previousValue": "0x000000000000000000000000000000000000000000000000000000000000000b", @@ -15253,7 +15253,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x000000000000000000000000000000000000000000000000000000000000000b", "previousValue": "0x000000000000000000000000000000000000000000000000000000000000000b", @@ -15261,7 +15261,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": true, "newValue": "0x000000000000000000000000000000000000000000000000000000000000000c", "previousValue": "0x000000000000000000000000000000000000000000000000000000000000000b", @@ -15269,7 +15269,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -15277,7 +15277,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -15285,7 +15285,7 @@ "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -15296,13 +15296,13 @@ "value": 0 }, { - "accessor": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x9623609d000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d586500000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e41c89c97d000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c80000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000", + "data": "0x9623609d00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df9900000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e41c89c97d000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c80000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -15311,27 +15311,27 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", - "previousValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "newValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", + "previousValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x9ab6929e7d0104b9744ecf48c9c83f65e34bb9eb80c70a88b6b8885e3bf62b15" + "slot": "0x134d4d69ca1de3e4a1fde55b9ed577a7c39fd3329d50f2f437a3bff291bb9473" } ], "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -15345,15 +15345,15 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" }, { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": true, "newValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -15364,7 +15364,7 @@ "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", "chainInfo": { "chainId": 31337, @@ -15379,7 +15379,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -15387,7 +15387,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -15395,7 +15395,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -15403,7 +15403,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -15411,7 +15411,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -15419,7 +15419,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -15427,7 +15427,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000006", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -15435,7 +15435,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" }, { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000002", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -15443,7 +15443,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -15451,7 +15451,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" }, { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -15459,7 +15459,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000002" }, { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -15467,7 +15467,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000007" }, { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": true, "newValue": "0x00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -15475,7 +15475,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000007" }, { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -15483,7 +15483,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000006" }, { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": true, "newValue": "0x0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -15491,7 +15491,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000006" }, { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000024", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -15499,7 +15499,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000008" }, { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -15507,7 +15507,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -15519,7 +15519,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -15533,7 +15533,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", "previousValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", @@ -15622,7 +15622,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -15636,7 +15636,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", "previousValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", @@ -15662,7 +15662,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000006", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000006", @@ -15700,7 +15700,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -15714,7 +15714,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", "previousValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", @@ -15740,7 +15740,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000006", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000006", @@ -15778,7 +15778,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -15792,7 +15792,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", "previousValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", @@ -15818,7 +15818,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000002", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000002", @@ -15856,7 +15856,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -15870,7 +15870,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", "previousValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", @@ -15896,7 +15896,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000002", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000002", @@ -15934,7 +15934,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -15948,7 +15948,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", "previousValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", @@ -15974,7 +15974,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8", "previousValue": "0x00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8", @@ -16012,7 +16012,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -16026,7 +16026,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", "previousValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", @@ -16052,7 +16052,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8", "previousValue": "0x00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8", @@ -16090,7 +16090,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -16104,7 +16104,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", "previousValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", @@ -16130,7 +16130,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63", "previousValue": "0x0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63", @@ -16168,7 +16168,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -16182,7 +16182,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", "previousValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", @@ -16208,7 +16208,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63", "previousValue": "0x0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63", @@ -16246,7 +16246,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -16260,7 +16260,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", "previousValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", @@ -16286,7 +16286,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000024", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000024", @@ -16324,7 +16324,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -16338,7 +16338,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", "previousValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", @@ -16364,7 +16364,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000024", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000024", @@ -16402,7 +16402,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -16416,7 +16416,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", "previousValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", @@ -16442,7 +16442,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -16454,7 +16454,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -16468,7 +16468,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", "previousValue": "0x00000000000000000000000019652082f846171168daf378c4fd3ee85a0d4a60", @@ -16494,7 +16494,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865", + "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -16540,12 +16540,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000c49623609d000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb00000000000000000000000020b168142354cee65a32f6d8cf3033e59229976500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000c49623609d0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d00000000000000000000000020b168142354cee65a32f6d8cf3033e59229976500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -16554,10 +16554,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", + "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" } @@ -16566,12 +16566,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", + "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000c49623609d000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb00000000000000000000000020b168142354cee65a32f6d8cf3033e59229976500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000c49623609d0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d00000000000000000000000020b168142354cee65a32f6d8cf3033e59229976500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -16580,7 +16580,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x000000000000000000000000000000000000000000000000000000000000000c", "previousValue": "0x000000000000000000000000000000000000000000000000000000000000000c", @@ -16588,7 +16588,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x000000000000000000000000000000000000000000000000000000000000000c", "previousValue": "0x000000000000000000000000000000000000000000000000000000000000000c", @@ -16596,7 +16596,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": true, "newValue": "0x000000000000000000000000000000000000000000000000000000000000000d", "previousValue": "0x000000000000000000000000000000000000000000000000000000000000000c", @@ -16604,7 +16604,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -16612,7 +16612,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -16620,7 +16620,7 @@ "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -16631,13 +16631,13 @@ "value": 0 }, { - "accessor": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x9623609d000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb00000000000000000000000020b168142354cee65a32f6d8cf3033e59229976500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000", + "data": "0x9623609d0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d00000000000000000000000020b168142354cee65a32f6d8cf3033e59229976500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -16646,27 +16646,27 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", - "previousValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "newValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", + "previousValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0xf6cecbacbfeb99e6ab0f02c22fd8a103f8837deb80af03d481ac5bc8d5475f58" + "slot": "0x67ba7d8bdda390f76c7887f0749c8ddd97a5488c0685a6600f6146d45a37e9e3" } ], "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -16680,15 +16680,15 @@ "reverted": false, "storageAccesses": [ { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" }, { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": true, "newValue": "0x00000000000000000000000020b168142354cee65a32f6d8cf3033e592299765", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -16699,7 +16699,7 @@ "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "account": "0x20B168142354Cee65a32f6D8cf3033E592299765", "chainInfo": { "chainId": 31337, @@ -16714,7 +16714,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -16722,7 +16722,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -16730,7 +16730,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -16738,7 +16738,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -16746,7 +16746,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -16754,7 +16754,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -16762,7 +16762,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -16770,7 +16770,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -16778,7 +16778,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -16786,31 +16786,31 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": true, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -16818,7 +16818,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -16830,7 +16830,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -16844,7 +16844,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x00000000000000000000000020b168142354cee65a32f6d8cf3033e592299765", "previousValue": "0x00000000000000000000000020b168142354cee65a32f6d8cf3033e592299765", @@ -16873,7 +16873,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -16887,7 +16887,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x00000000000000000000000020b168142354cee65a32f6d8cf3033e592299765", "previousValue": "0x00000000000000000000000020b168142354cee65a32f6d8cf3033e592299765", @@ -16913,7 +16913,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", @@ -16959,12 +16959,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000e49623609d0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d00000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc9550000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000e49623609d000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd9200000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc9550000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f380000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -16973,10 +16973,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", + "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" } @@ -16985,12 +16985,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", + "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000e49623609d0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d00000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc9550000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000e49623609d000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd9200000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc9550000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f380000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -16999,7 +16999,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x000000000000000000000000000000000000000000000000000000000000000d", "previousValue": "0x000000000000000000000000000000000000000000000000000000000000000d", @@ -17007,7 +17007,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x000000000000000000000000000000000000000000000000000000000000000d", "previousValue": "0x000000000000000000000000000000000000000000000000000000000000000d", @@ -17015,7 +17015,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": true, "newValue": "0x000000000000000000000000000000000000000000000000000000000000000e", "previousValue": "0x000000000000000000000000000000000000000000000000000000000000000d", @@ -17023,7 +17023,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -17031,7 +17031,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -17039,7 +17039,7 @@ "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -17050,13 +17050,13 @@ "value": 0 }, { - "accessor": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x9623609d0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d00000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc9550000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900000000000000000000000000000000000000000000000000000000", + "data": "0x9623609d000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd9200000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc9550000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f380000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab035100000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -17065,32 +17065,32 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", - "previousValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "newValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", + "previousValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x67ba7d8bdda390f76c7887f0749c8ddd97a5488c0685a6600f6146d45a37e9e3" + "slot": "0x6c22ba077ba2894f0240d58c3ef000efde161f39c3d967610259aa4c063ae31b" } ], "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x4f1ef28600000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c900000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000044485cc9550000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900000000000000000000000000000000000000000000000000000000", + "data": "0x4f1ef28600000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c900000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000044485cc9550000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f380000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab035100000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -17099,15 +17099,15 @@ "reverted": false, "storageAccesses": [ { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" }, { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": true, "newValue": "0x00000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c9", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -17118,13 +17118,13 @@ "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "account": "0x49BBFf1629824A1e7993Ab5c17AFa45D24AB28c9", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x485cc9550000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", + "data": "0x485cc9550000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f380000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -17133,7 +17133,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -17141,7 +17141,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -17149,7 +17149,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -17157,7 +17157,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -17165,7 +17165,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -17173,7 +17173,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -17181,7 +17181,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -17189,7 +17189,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -17197,7 +17197,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -17205,31 +17205,31 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": true, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -17237,15 +17237,15 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000068" }, { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": true, - "newValue": "0x000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", + "newValue": "0x0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000068" }, { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -17253,7 +17253,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -17265,7 +17265,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -17279,7 +17279,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, "newValue": "0x00000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c9", "previousValue": "0x00000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c9", @@ -17308,7 +17308,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -17322,7 +17322,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, "newValue": "0x00000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c9", "previousValue": "0x00000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c9", @@ -17348,7 +17348,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", @@ -17386,7 +17386,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -17400,7 +17400,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, "newValue": "0x00000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c9", "previousValue": "0x00000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c9", @@ -17429,7 +17429,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -17443,7 +17443,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, "newValue": "0x00000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c9", "previousValue": "0x00000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c9", @@ -17469,10 +17469,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, - "newValue": "0x000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", - "previousValue": "0x000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", + "newValue": "0x0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351", + "previousValue": "0x0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000068" } @@ -17775,12 +17775,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000002c49623609d00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df99000000000000000000000000610c37dd344e47d7848da075a90128472140e80f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000224c303f0df000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fedeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000002c49623609d000000000000000000000000d6eaf4c146261653ee059077b78ed088add54309000000000000000000000000e2a80256d1dafe06683f231f8e9561639aa0e9b900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000224c303f0df000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fedeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -17789,10 +17789,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", + "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", + "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" } @@ -17801,12 +17801,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", + "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000002c49623609d00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df99000000000000000000000000610c37dd344e47d7848da075a90128472140e80f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000224c303f0df000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fedeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", + "data": "0x6a76120200000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000002c49623609d000000000000000000000000d6eaf4c146261653ee059077b78ed088add54309000000000000000000000000e2a80256d1dafe06683f231f8e9561639aa0e9b900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000224c303f0df000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fedeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -17815,7 +17815,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x000000000000000000000000000000000000000000000000000000000000000e", "previousValue": "0x000000000000000000000000000000000000000000000000000000000000000e", @@ -17823,7 +17823,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x000000000000000000000000000000000000000000000000000000000000000e", "previousValue": "0x000000000000000000000000000000000000000000000000000000000000000e", @@ -17831,7 +17831,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": true, "newValue": "0x000000000000000000000000000000000000000000000000000000000000000f", "previousValue": "0x000000000000000000000000000000000000000000000000000000000000000e", @@ -17839,7 +17839,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -17847,7 +17847,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -17855,7 +17855,7 @@ "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" }, { - "account": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", + "account": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -17866,13 +17866,13 @@ "value": 0 }, { - "accessor": "0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "accessor": "0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x9623609d00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df99000000000000000000000000610c37dd344e47d7848da075a90128472140e80f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000224c303f0df000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fedeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data": "0x9623609d000000000000000000000000d6eaf4c146261653ee059077b78ed088add54309000000000000000000000000e2a80256d1dafe06683f231f8e9561639aa0e9b900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000224c303f0df000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fedeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -17881,32 +17881,32 @@ "reverted": false, "storageAccesses": [ { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, - "newValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", - "previousValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "newValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", + "previousValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", + "account": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, - "slot": "0x134d4d69ca1de3e4a1fde55b9ed577a7c39fd3329d50f2f437a3bff291bb9473" + "slot": "0xf08d105018e9af96f1d26510b09691f8b2194940cdd630ffcaf9fa37fb25c6a6" } ], "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x4f1ef286000000000000000000000000610c37dd344e47d7848da075a90128472140e80f00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000224c303f0df000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fedeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "data": "0x4f1ef286000000000000000000000000e2a80256d1dafe06683f231f8e9561639aa0e9b900000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000224c303f0df000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fedeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -17915,17 +17915,17 @@ "reverted": false, "storageAccesses": [ { - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", + "newValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", + "previousValue": "0x00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1", "reverted": false, "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" }, { - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "isWrite": true, - "newValue": "0x000000000000000000000000610c37dd344e47d7848da075a90128472140e80f", + "newValue": "0x000000000000000000000000e2a80256d1dafe06683f231f8e9561639aa0e9b9", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" @@ -17934,8 +17934,8 @@ "value": 0 }, { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0x610C37dd344e47D7848Da075a90128472140e80f", + "accessor": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", + "account": "0xE2a80256d1dAFe06683F231F8e9561639Aa0e9b9", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -17949,7 +17949,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -17957,7 +17957,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -17965,7 +17965,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -17973,7 +17973,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -17981,7 +17981,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -17989,7 +17989,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -17997,7 +17997,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "isWrite": true, "newValue": "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -18005,7 +18005,7 @@ "slot": "0xa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49" }, { - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -18013,7 +18013,7 @@ "slot": "0xa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4a" }, { - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "isWrite": true, "newValue": "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -18021,7 +18021,7 @@ "slot": "0xcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f" }, { - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -18029,7 +18029,7 @@ "slot": "0xcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b6887930" }, { - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "isWrite": true, "newValue": "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -18037,7 +18037,7 @@ "slot": "0x24a9e90595537a4321bf3a8fd43f02c179fe79a94dde54a8c1a057e2967a4d0b" }, { - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -18045,7 +18045,7 @@ "slot": "0x24a9e90595537a4321bf3a8fd43f02c179fe79a94dde54a8c1a057e2967a4d0c" }, { - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "isWrite": true, "newValue": "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -18053,7 +18053,7 @@ "slot": "0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec330f" }, { - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -18061,7 +18061,7 @@ "slot": "0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec3310" }, { - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "isWrite": true, "newValue": "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -18069,7 +18069,7 @@ "slot": "0x1d32deecea32fd1365d10df47fc6666a05871102e61a115a5c569bca7e5de14d" }, { - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -18077,7 +18077,7 @@ "slot": "0x1d32deecea32fd1365d10df47fc6666a05871102e61a115a5c569bca7e5de14e" }, { - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -18085,7 +18085,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "isWrite": true, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", @@ -18097,7 +18097,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -18111,10 +18111,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", + "account": "0xd6EAF4c146261653EE059077B78ED088Add54309", "isWrite": false, - "newValue": "0x000000000000000000000000610c37dd344e47d7848da075a90128472140e80f", - "previousValue": "0x000000000000000000000000610c37dd344e47d7848da075a90128472140e80f", + "newValue": "0x000000000000000000000000e2a80256d1dafe06683f231f8e9561639aa0e9b9", + "previousValue": "0x000000000000000000000000e2a80256d1dafe06683f231f8e9561639aa0e9b9", "reverted": false, "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" } @@ -18123,7 +18123,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x610C37dd344e47D7848Da075a90128472140e80f", + "account": "0xE2a80256d1dAFe06683F231F8e9561639Aa0e9b9", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -18278,7 +18278,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -18292,7 +18292,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x00000000000000000000000020b168142354cee65a32f6d8cf3033e592299765", "previousValue": "0x00000000000000000000000020b168142354cee65a32f6d8cf3033e592299765", @@ -18318,7 +18318,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -18408,13 +18408,13 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xcE8C32b1493DB37767fAF988dEC9E80089f4f33c", + "account": "0x357A483a8923686E7fA454Ee93bbc11aFB114743", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6101c06040523480156200001257600080fd5b5060405162005f7438038062005f74833981016040819052620000359162000187565b620000436001607e62000248565b60ff168811156200006757604051633beff19960e11b815260040160405180910390fd5b878710620000885760405163e62ccf3960e01b815260040160405180910390fd5b620000a7856001600160401b03166200014e60201b62000c891760201c565b6001600160401b0316620000cf876001600160401b03166200014e60201b62000c891760201c565b6001600160401b03161115620000f85760405163235dfb2b60e21b815260040160405180910390fd5b63ffffffff9099166101205260809790975260a09590955260c0939093526001600160401b039182166101a0521660e0526001600160a01b0390811661010052908116610140521661016052610180526200027a565b90565b80516001600160401b03811681146200016957600080fd5b919050565b6001600160a01b03811681146200018457600080fd5b50565b6000806000806000806000806000806101408b8d031215620001a857600080fd5b8a5163ffffffff81168114620001bd57600080fd5b809a505060208b0151985060408b0151975060608b01519650620001e460808c0162000151565b9550620001f460a08c0162000151565b945060c08b015162000206816200016e565b60e08c015190945062000219816200016e565b6101008c01519093506200022d816200016e565b809250506101208b015190509295989b9194979a5092959850565b600060ff821660ff8416808210156200027157634e487b7160e01b600052601160045260246000fd5b90039392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051615b82620003f2600039600081816106bb01528181611e9001528181611f4e0152611f78015260008181610a1e01526137960152600081816106130152818161178a01526124b00152600081816105270152818161194c01528181612349015281816128b20152613c5601526000818161088d0152818161246f01526138250152600081816104b40152818161310a015261345f015260008181610a7101528181610f6001528181611e2a01528181611ebb01528181611fb001528181612abe0152612b00015260008181610aa401528181611c7301528181611d9901528181611f1901528181612f5d0152818161365e01528181613d4d01528181614473015281816145a1015281816146a20152614777015260008181610b4b01528181611d3c01528181612bce01528181612c5401528181612e530152612f7e015260008181610786015261301c0152615b826000f3fe6080604052600436106102f25760003560e01c806370872aa51161018f578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b18578063fa315aa914610b3c578063fe2bbeb214610b6f57600080fd5b8063ec5e630814610a95578063eff0f59214610ac8578063f8f43ff614610af857600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a0f578063d8cc1a3c14610a42578063dabd396d14610a6257600080fd5b8063c6f0308c14610937578063cf09e0d0146109c1578063d5d44d80146109e257600080fd5b80638d450a9511610143578063bcef3b551161011d578063bcef3b55146108b7578063bd8da956146108f7578063c395e1ca1461091757600080fd5b80638d450a9514610777578063a445ece6146107aa578063bbdc02db1461087657600080fd5b80638129fc1c116101745780638129fc1c1461071a5780638980e0cc146107225780638b85902b1461073757600080fd5b806370872aa5146106f25780637b0f0adc1461070757600080fd5b80633fc8cef3116102485780635c0cba33116101fc5780636361506d116101d65780636361506d1461066c5780636b6716c0146106ac5780636f034409146106df57600080fd5b80635c0cba3314610604578063609d33341461063757806360e274641461064c57600080fd5b806354fd4d501161022d57806354fd4d501461055e57806357da950e146105b45780635a5fa2d9146105e457600080fd5b80633fc8cef314610518578063472777c61461054b57600080fd5b80632810e1d6116102aa57806337b1b2291161028457806337b1b229146104655780633a768463146104a55780633e3ac912146104d857600080fd5b80632810e1d6146103de5780632ad69aeb146103f357806330dbe5701461041357600080fd5b806319effeb4116102db57806319effeb414610339578063200d2ed21461038457806325fc2ace146103bf57600080fd5b806301935130146102f757806303c2924d14610319575b600080fd5b34801561030357600080fd5b5061031761031236600461532d565b610b9f565b005b34801561032557600080fd5b50610317610334366004615388565b610ec0565b34801561034557600080fd5b506000546103669068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561039057600080fd5b506000546103b290700100000000000000000000000000000000900460ff1681565b60405161037b91906153d9565b3480156103cb57600080fd5b506008545b60405190815260200161037b565b3480156103ea57600080fd5b506103b2611566565b3480156103ff57600080fd5b506103d061040e366004615388565b61180b565b34801561041f57600080fd5b506001546104409073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161037b565b34801561047157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610440565b3480156104b157600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610440565b3480156104e457600080fd5b50600054610508907201000000000000000000000000000000000000900460ff1681565b604051901515815260200161037b565b34801561052457600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610440565b61031761055936600461541a565b611841565b34801561056a57600080fd5b506105a76040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161037b91906154b1565b3480156105c057600080fd5b506008546009546105cf919082565b6040805192835260208301919091520161037b565b3480156105f057600080fd5b506103d06105ff3660046154c4565b611853565b34801561061057600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610440565b34801561064357600080fd5b506105a761188d565b34801561065857600080fd5b50610317610667366004615502565b61189b565b34801561067857600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103d0565b3480156106b857600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610366565b6103176106ed366004615534565b611a42565b3480156106fe57600080fd5b506009546103d0565b61031761071536600461541a565b6123e3565b6103176123f0565b34801561072e57600080fd5b506002546103d0565b34801561074357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103d0565b34801561078357600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103d0565b3480156107b657600080fd5b506108226107c53660046154c4565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff16606082015260800161037b565b34801561088257600080fd5b5060405163ffffffff7f000000000000000000000000000000000000000000000000000000000000000016815260200161037b565b3480156108c357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103d0565b34801561090357600080fd5b506103666109123660046154c4565b612949565b34801561092357600080fd5b506103d0610932366004615573565b612b28565b34801561094357600080fd5b506109576109523660046154c4565b612d0b565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e00161037b565b3480156109cd57600080fd5b506000546103669067ffffffffffffffff1681565b3480156109ee57600080fd5b506103d06109fd366004615502565b60036020526000908152604090205481565b348015610a1b57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103d0565b348015610a4e57600080fd5b50610317610a5d3660046155a5565b612da2565b348015610a6e57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610366565b348015610aa157600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103d0565b348015610ad457600080fd5b50610508610ae33660046154c4565b60046020526000908152604090205460ff1681565b348015610b0457600080fd5b50610317610b1336600461541a565b6133d1565b348015610b2457600080fd5b50610b2d613823565b60405161037b9392919061562f565b348015610b4857600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103d0565b348015610b7b57600080fd5b50610508610b8a3660046154c4565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610bcb57610bcb6153aa565b14610c02576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610c55576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c8c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610ca3610c9e36869003860186615683565b613883565b14610cda576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610cef929190615710565b604051809103902014610d2e576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d77610d7284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506138df92505050565b61394c565b90506000610d9e82600881518110610d9157610d91615720565b6020026020010151613b02565b9050602081511115610ddc576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610e51576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610eec57610eec6153aa565b14610f23576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610f3857610f38615720565b906000526020600020906005020190506000610f5384612949565b905067ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081169082161015610fbc576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611005576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561102257508515155b156110bd578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110555781611071565b600186015473ffffffffffffffffffffffffffffffffffffffff165b905061107d8187613bb6565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff166060830152611160576fffffffffffffffffffffffffffffffff6040820152600181526000869003611160578195505b600086826020015163ffffffff16611178919061577e565b90506000838211611189578161118b565b835b602084015190915063ffffffff165b818110156112d75760008682815481106111b6576111b6615720565b6000918252602080832090910154808352600690915260409091205490915060ff1661120e576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061122357611223615720565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112805750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b156112c257600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b505080806112cf90615796565b91505061119a565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9093169290921790915584900361155b57606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558915801561145757506000547201000000000000000000000000000000000000900460ff165b156114cc5760015473ffffffffffffffffffffffffffffffffffffffff1661147f818a613bb6565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff909116178855611559565b61151373ffffffffffffffffffffffffffffffffffffffff8216156114f1578161150d565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89613bb6565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff166002811115611594576115946153aa565b146115cb576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff1661162f576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008154811061165b5761165b615720565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611696576001611699565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff9091161770010000000000000000000000000000000083600281111561174a5761174a6153aa565b02179055600281111561175f5761175f6153aa565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156117f057600080fd5b505af1158015611804573d6000803e3d6000fd5b5050505090565b6005602052816000526040600020818154811061182757600080fd5b90600052602060002001600091509150505481565b905090565b61184e8383836001611a42565b505050565b6000818152600760209081526040808320600590925282208054825461188490610100900463ffffffff16826157ce565b95945050505050565b606061183c60546020613cb7565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812080549082905590819003611900576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063f3fef3a390604401600060405180830381600087803b15801561199057600080fd5b505af11580156119a4573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a02576040519150601f19603f3d011682016040523d82523d6000602084013e611a07565b606091505b505090508061184e576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054700100000000000000000000000000000000900460ff166002811115611a6e57611a6e6153aa565b14611aa5576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110611aba57611aba615720565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514611ba1576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000611c61826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580611c9c5750611c997f0000000000000000000000000000000000000000000000000000000000000000600261577e565b81145b8015611ca6575084155b15611cdd576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015611d03575086155b15611d3a576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115611d94576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dbf7f0000000000000000000000000000000000000000000000000000000000000000600161577e565b8103611dd157611dd186888588613d09565b34611ddb83612b28565b14611e12576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e1d88612949565b905067ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811690821603611e85576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016611ee591906157e5565b67ffffffffffffffff16611f008267ffffffffffffffff1690565b67ffffffffffffffff161115611fe2576000611f3d60017f00000000000000000000000000000000000000000000000000000000000000006157ce565b8314611f735767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016611fa8565b611fa87f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16600261580e565b9050611fde817f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff166157e5565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526004602052604090205490915060ff1615612060576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008b815260200190815260200160002060016002805490506122f691906157ce565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263d0e30db09234926004808301939282900301818588803b15801561238e57600080fd5b505af11580156123a2573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b61184e8383836000611a42565b60005471010000000000000000000000000000000000900460ff1615612442576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000000166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690637258a807906024016040805180830381865afa1580156124f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251a919061583e565b909250905081612556576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461258957639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036054013511612623576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f00000000000000000000000000000000000000000000000000000000000000009092169363d0e30db093926004828101939282900301818588803b1580156128f857600080fd5b505af115801561290c573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b600080600054700100000000000000000000000000000000900460ff166002811115612977576129776153aa565b146129ae576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600283815481106129c3576129c3615720565b600091825260208220600590910201805490925063ffffffff90811614612a3257815460028054909163ffffffff16908110612a0157612a01615720565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090612a6a90700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b612a7e9067ffffffffffffffff16426157ce565b612a9d612a5d846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16612ab1919061577e565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff168167ffffffffffffffff1611612afe5780611884565b7f000000000000000000000000000000000000000000000000000000000000000095945050505050565b600080612bc7836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000000811115612c26576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000612c418383615891565b9050670de0b6b3a76400006000612c78827f00000000000000000000000000000000000000000000000000000000000000006158a5565b90506000612c96612c91670de0b6b3a7640000866158a5565b613eba565b90506000612ca48484614115565b90506000612cb28383614164565b90506000612cbf82614192565b90506000612cde82612cd9670de0b6b3a76400008f6158a5565b61437a565b90506000612cec8b83614164565b9050612cf8818d6158a5565b9f9e505050505050505050505050505050565b60028181548110612d1b57600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff166002811115612dce57612dce6153aa565b14612e05576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110612e1a57612e1a615720565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050612e797f0000000000000000000000000000000000000000000000000000000000000000600161577e565b612f15826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614612f4f576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080891561304657612fa27f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006157ce565b6001901b612fc1846fffffffffffffffffffffffffffffffff166143b4565b6fffffffffffffffffffffffffffffffff16612fdd91906158e2565b1561301a5761301161300260016fffffffffffffffffffffffffffffffff87166158f6565b865463ffffffff166000614453565b6003015461303c565b7f00000000000000000000000000000000000000000000000000000000000000005b9150849050613070565b6003850154915061306d6130026fffffffffffffffffffffffffffffffff8616600161591f565b90505b600882901b60088a8a604051613087929190615710565b6040518091039020901b146130c8576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006130d38c614537565b905060006130e2836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e14ced329061315c908f908f908f908f908a9060040161599c565b6020604051808303816000875af115801561317b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319f91906159d6565b60048501549114915060009060029061324a906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6132e6896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6132f091906159ef565b6132fa9190615a12565b60ff16159050811515810361333b576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff1615613392576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff1660028111156133fd576133fd6153aa565b14613434576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008061344386614566565b935093509350935060006134598585858561496f565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134ec9190615a34565b9050600189036135e45773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84613548367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af11580156135ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135de91906159d6565b5061155b565b600289036136105773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489613548565b6003890361363c5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487613548565b600489036137585760006136826fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000000614a29565b60095461368f919061577e565b61369a90600161577e565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561372d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061375191906159d6565b505061155b565b600589036137f1576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000000060c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a40161359b565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360140135606061387c61188d565b9050909192565b600081600001518260200151836040015184606001516040516020016138c2949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6040805180820190915260008082526020820152815160000361392e576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b6060600080600061395c85614ad7565b919450925090506001816001811115613977576139776153aa565b146139ae576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516139ba838561577e565b146139f1576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081613a085790505093506000835b8651811015613af657600080613a7b6040518060400160405280858c60000151613a5f91906157ce565b8152602001858c60200151613a74919061577e565b9052614ad7565b509150915060405180604001604052808383613a97919061577e565b8152602001848b60200151613aac919061577e565b815250888581518110613ac157613ac1615720565b6020908102919091010152613ad760018561577e565b9350613ae3818361577e565b613aed908461577e565b92505050613a35565b50845250919392505050565b60606000806000613b1285614ad7565b919450925090506000816001811115613b2d57613b2d6153aa565b14613b64576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b6e828461577e565b855114613ba7576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61188485602001518484614f75565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff90931692839290613c0590849061577e565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690637eee288d90604401600060405180830381600087803b158015613c9a57600080fd5b505af1158015613cae573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b6000613d286fffffffffffffffffffffffffffffffff8416600161591f565b90506000613d3882866001614453565b9050600086901a8380613e245750613d7160027f00000000000000000000000000000000000000000000000000000000000000006158e2565b6004830154600290613e15906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b613e1f9190615a12565b60ff16145b15613e7c5760ff811660011480613e3e575060ff81166002145b613e77576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161261a565b613cae565b60ff811615613cae576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161261a565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b1760008213613f1957631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a76400000215820261415257637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b6000816000190483118202156141825763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d782136141c057919050565b680755bf798b4a1bf1e582126141de5763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b60006143ab670de0b6b3a76400008361439286613eba565b61439c9190615a51565b6143a69190615b0d565b614192565b90505b92915050565b600080614441837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b6000808261449c576144976fffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000061500a565b6144b7565b6144b7856fffffffffffffffffffffffffffffffff16615196565b9050600284815481106144cc576144cc615720565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461452f57815460028054909163ffffffff1690811061451a5761451a615720565b906000526020600020906005020191506144dd565b509392505050565b600080600080600061454886614566565b935093509350935061455c8484848461496f565b9695505050505050565b600080600080600085905060006002828154811061458657614586615720565b600091825260209091206004600590920201908101549091507f00000000000000000000000000000000000000000000000000000000000000009061465d906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611614697576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f00000000000000000000000000000000000000000000000000000000000000009061475e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156147d357825463ffffffff1661479d7f0000000000000000000000000000000000000000000000000000000000000000600161577e565b83036147a7578391505b600281815481106147ba576147ba615720565b906000526020600020906005020193508094505061469b565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661483c614827856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561490b576000614874836fffffffffffffffffffffffffffffffff166143b4565b6fffffffffffffffffffffffffffffffff1611156148df5760006148b66148ae60016fffffffffffffffffffffffffffffffff86166158f6565b896001614453565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506148e59050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614961565b600061492d6148ae6fffffffffffffffffffffffffffffffff8516600161591f565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff8416156149dc5760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611884565b8282604051602001614a0a9291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b600080614ab6847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614b1a576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614b3f576000600160009450945094505050614f6e565b60b78111614c55576000614b546080836157ce565b905080876000015111614b93576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614c0b57507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614c42576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614f6e915050565b60bf8111614db3576000614c6a60b7836157ce565b905080876000015111614ca9576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614d0b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614d53576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614d5d818461577e565b895111614d96576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614da183600161577e565b9750955060009450614f6e9350505050565b60f78111614e18576000614dc860c0836157ce565b905080876000015111614e07576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614f6e915050565b6000614e2560f7836157ce565b905080876000015111614e64576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614ec6576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614f0e576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f18818461577e565b895111614f51576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f5c83600161577e565b9750955060019450614f6e9350505050565b9193909250565b60608167ffffffffffffffff811115614f9057614f90615654565b6040519080825280601f01601f191660200182016040528015614fba576020820181803683370190505b5090508115615003576000614fcf848661577e565b90506020820160005b84811015614ff0578281015182820152602001614fd8565b84811115614fff576000858301525b5050505b9392505050565b6000816150a9846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116150bf5763b34b5c226000526004601cfd5b6150c883615196565b905081615167826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116143ae576143ab61517d83600161577e565b6fffffffffffffffffffffffffffffffff83169061523b565b6000811960018301168161522a827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b6000806152c8847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f8401126152f657600080fd5b50813567ffffffffffffffff81111561530e57600080fd5b60208301915083602082850101111561532657600080fd5b9250929050565b600080600083850360a081121561534357600080fd5b608081121561535157600080fd5b50839250608084013567ffffffffffffffff81111561536f57600080fd5b61537b868287016152e4565b9497909650939450505050565b6000806040838503121561539b57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310615414577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060006060848603121561542f57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b8181101561546c57602081850181015186830182015201615450565b8181111561547e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006143ab6020830184615446565b6000602082840312156154d657600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146154ff57600080fd5b50565b60006020828403121561551457600080fd5b8135615003816154dd565b8035801515811461552f57600080fd5b919050565b6000806000806080858703121561554a57600080fd5b8435935060208501359250604085013591506155686060860161551f565b905092959194509250565b60006020828403121561558557600080fd5b81356fffffffffffffffffffffffffffffffff8116811461500357600080fd5b600080600080600080608087890312156155be57600080fd5b863595506155ce6020880161551f565b9450604087013567ffffffffffffffff808211156155eb57600080fd5b6155f78a838b016152e4565b9096509450606089013591508082111561561057600080fd5b5061561d89828a016152e4565b979a9699509497509295939492505050565b63ffffffff841681528260208201526060604082015260006118846060830184615446565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561569557600080fd5b6040516080810181811067ffffffffffffffff821117156156df577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156157915761579161574f565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157c7576157c761574f565b5060010190565b6000828210156157e0576157e061574f565b500390565b600067ffffffffffffffff838116908316818110156158065761580661574f565b039392505050565b600067ffffffffffffffff808316818516818304811182151516156158355761583561574f565b02949350505050565b6000806040838503121561585157600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826158a0576158a0615862565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156158dd576158dd61574f565b500290565b6000826158f1576158f1615862565b500690565b60006fffffffffffffffffffffffffffffffff838116908316818110156158065761580661574f565b60006fffffffffffffffffffffffffffffffff80831681851680830382111561594a5761594a61574f565b01949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6060815260006159b0606083018789615953565b82810360208401526159c3818688615953565b9150508260408301529695505050505050565b6000602082840312156159e857600080fd5b5051919050565b600060ff821660ff841680821015615a0957615a0961574f565b90039392505050565b600060ff831680615a2557615a25615862565b8060ff84160691505092915050565b600060208284031215615a4657600080fd5b8151615003816154dd565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615a9257615a9261574f565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615acd57615acd61574f565b60008712925087820587128484161615615ae957615ae961574f565b87850587128184161615615aff57615aff61574f565b505050929093029392505050565b600082615b1c57615b1c615862565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615b7057615b7061574f565b50059056fea164736f6c634300080f000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b0000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d407730000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df990000000000000000000000000000000000000000000000000000000000000385", - "deployedCode": "0x6080604052600436106102f25760003560e01c806370872aa51161018f578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b18578063fa315aa914610b3c578063fe2bbeb214610b6f57600080fd5b8063ec5e630814610a95578063eff0f59214610ac8578063f8f43ff614610af857600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a0f578063d8cc1a3c14610a42578063dabd396d14610a6257600080fd5b8063c6f0308c14610937578063cf09e0d0146109c1578063d5d44d80146109e257600080fd5b80638d450a9511610143578063bcef3b551161011d578063bcef3b55146108b7578063bd8da956146108f7578063c395e1ca1461091757600080fd5b80638d450a9514610777578063a445ece6146107aa578063bbdc02db1461087657600080fd5b80638129fc1c116101745780638129fc1c1461071a5780638980e0cc146107225780638b85902b1461073757600080fd5b806370872aa5146106f25780637b0f0adc1461070757600080fd5b80633fc8cef3116102485780635c0cba33116101fc5780636361506d116101d65780636361506d1461066c5780636b6716c0146106ac5780636f034409146106df57600080fd5b80635c0cba3314610604578063609d33341461063757806360e274641461064c57600080fd5b806354fd4d501161022d57806354fd4d501461055e57806357da950e146105b45780635a5fa2d9146105e457600080fd5b80633fc8cef314610518578063472777c61461054b57600080fd5b80632810e1d6116102aa57806337b1b2291161028457806337b1b229146104655780633a768463146104a55780633e3ac912146104d857600080fd5b80632810e1d6146103de5780632ad69aeb146103f357806330dbe5701461041357600080fd5b806319effeb4116102db57806319effeb414610339578063200d2ed21461038457806325fc2ace146103bf57600080fd5b806301935130146102f757806303c2924d14610319575b600080fd5b34801561030357600080fd5b5061031761031236600461532d565b610b9f565b005b34801561032557600080fd5b50610317610334366004615388565b610ec0565b34801561034557600080fd5b506000546103669068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561039057600080fd5b506000546103b290700100000000000000000000000000000000900460ff1681565b60405161037b91906153d9565b3480156103cb57600080fd5b506008545b60405190815260200161037b565b3480156103ea57600080fd5b506103b2611566565b3480156103ff57600080fd5b506103d061040e366004615388565b61180b565b34801561041f57600080fd5b506001546104409073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161037b565b34801561047157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610440565b3480156104b157600080fd5b507f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d40773610440565b3480156104e457600080fd5b50600054610508907201000000000000000000000000000000000000900460ff1681565b604051901515815260200161037b565b34801561052457600080fd5b507f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d610440565b61031761055936600461541a565b611841565b34801561056a57600080fd5b506105a76040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161037b91906154b1565b3480156105c057600080fd5b506008546009546105cf919082565b6040805192835260208301919091520161037b565b3480156105f057600080fd5b506103d06105ff3660046154c4565b611853565b34801561061057600080fd5b507f00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df99610440565b34801561064357600080fd5b506105a761188d565b34801561065857600080fd5b50610317610667366004615502565b61189b565b34801561067857600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103d0565b3480156106b857600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610366565b6103176106ed366004615534565b611a42565b3480156106fe57600080fd5b506009546103d0565b61031761071536600461541a565b6123e3565b6103176123f0565b34801561072e57600080fd5b506002546103d0565b34801561074357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103d0565b34801561078357600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103d0565b3480156107b657600080fd5b506108226107c53660046154c4565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff16606082015260800161037b565b34801561088257600080fd5b5060405163ffffffff7f000000000000000000000000000000000000000000000000000000000000000016815260200161037b565b3480156108c357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103d0565b34801561090357600080fd5b506103666109123660046154c4565b612949565b34801561092357600080fd5b506103d0610932366004615573565b612b28565b34801561094357600080fd5b506109576109523660046154c4565b612d0b565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e00161037b565b3480156109cd57600080fd5b506000546103669067ffffffffffffffff1681565b3480156109ee57600080fd5b506103d06109fd366004615502565b60036020526000908152604090205481565b348015610a1b57600080fd5b507f00000000000000000000000000000000000000000000000000000000000003856103d0565b348015610a4e57600080fd5b50610317610a5d3660046155a5565b612da2565b348015610a6e57600080fd5b507f00000000000000000000000000000000000000000000000000000000000004b0610366565b348015610aa157600080fd5b507f00000000000000000000000000000000000000000000000000000000000000046103d0565b348015610ad457600080fd5b50610508610ae33660046154c4565b60046020526000908152604090205460ff1681565b348015610b0457600080fd5b50610317610b1336600461541a565b6133d1565b348015610b2457600080fd5b50610b2d613823565b60405161037b9392919061562f565b348015610b4857600080fd5b507f00000000000000000000000000000000000000000000000000000000000000086103d0565b348015610b7b57600080fd5b50610508610b8a3660046154c4565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610bcb57610bcb6153aa565b14610c02576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610c55576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c8c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610ca3610c9e36869003860186615683565b613883565b14610cda576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610cef929190615710565b604051809103902014610d2e576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d77610d7284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506138df92505050565b61394c565b90506000610d9e82600881518110610d9157610d91615720565b6020026020010151613b02565b9050602081511115610ddc576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610e51576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610eec57610eec6153aa565b14610f23576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610f3857610f38615720565b906000526020600020906005020190506000610f5384612949565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b081169082161015610fbc576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611005576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561102257508515155b156110bd578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110555781611071565b600186015473ffffffffffffffffffffffffffffffffffffffff165b905061107d8187613bb6565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff166060830152611160576fffffffffffffffffffffffffffffffff6040820152600181526000869003611160578195505b600086826020015163ffffffff16611178919061577e565b90506000838211611189578161118b565b835b602084015190915063ffffffff165b818110156112d75760008682815481106111b6576111b6615720565b6000918252602080832090910154808352600690915260409091205490915060ff1661120e576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061122357611223615720565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112805750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b156112c257600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b505080806112cf90615796565b91505061119a565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9093169290921790915584900361155b57606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558915801561145757506000547201000000000000000000000000000000000000900460ff165b156114cc5760015473ffffffffffffffffffffffffffffffffffffffff1661147f818a613bb6565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff909116178855611559565b61151373ffffffffffffffffffffffffffffffffffffffff8216156114f1578161150d565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89613bb6565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff166002811115611594576115946153aa565b146115cb576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff1661162f576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008154811061165b5761165b615720565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611696576001611699565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff9091161770010000000000000000000000000000000083600281111561174a5761174a6153aa565b02179055600281111561175f5761175f6153aa565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df9973ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156117f057600080fd5b505af1158015611804573d6000803e3d6000fd5b5050505090565b6005602052816000526040600020818154811061182757600080fd5b90600052602060002001600091509150505481565b905090565b61184e8383836001611a42565b505050565b6000818152600760209081526040808320600590925282208054825461188490610100900463ffffffff16826157ce565b95945050505050565b606061183c60546020613cb7565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812080549082905590819003611900576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d169063f3fef3a390604401600060405180830381600087803b15801561199057600080fd5b505af11580156119a4573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a02576040519150601f19603f3d011682016040523d82523d6000602084013e611a07565b606091505b505090508061184e576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054700100000000000000000000000000000000900460ff166002811115611a6e57611a6e6153aa565b14611aa5576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110611aba57611aba615720565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514611ba1576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000611c61826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580611c9c5750611c997f0000000000000000000000000000000000000000000000000000000000000004600261577e565b81145b8015611ca6575084155b15611cdd576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015611d03575086155b15611d3a576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000008811115611d94576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dbf7f0000000000000000000000000000000000000000000000000000000000000004600161577e565b8103611dd157611dd186888588613d09565b34611ddb83612b28565b14611e12576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e1d88612949565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b0811690821603611e85576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b016611ee591906157e5565b67ffffffffffffffff16611f008267ffffffffffffffff1690565b67ffffffffffffffff161115611fe2576000611f3d60017f00000000000000000000000000000000000000000000000000000000000000046157ce565b8314611f735767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016611fa8565b611fa87f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16600261580e565b9050611fde817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff166157e5565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526004602052604090205490915060ff1615612060576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008b815260200190815260200160002060016002805490506122f691906157ce565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d169263d0e30db09234926004808301939282900301818588803b15801561238e57600080fd5b505af11580156123a2573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b61184e8383836000611a42565b60005471010000000000000000000000000000000000900460ff1615612442576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000000166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df991690637258a807906024016040805180830381865afa1580156124f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251a919061583e565b909250905081612556576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461258957639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036054013511612623576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d9092169363d0e30db093926004828101939282900301818588803b1580156128f857600080fd5b505af115801561290c573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b600080600054700100000000000000000000000000000000900460ff166002811115612977576129776153aa565b146129ae576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600283815481106129c3576129c3615720565b600091825260208220600590910201805490925063ffffffff90811614612a3257815460028054909163ffffffff16908110612a0157612a01615720565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090612a6a90700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b612a7e9067ffffffffffffffff16426157ce565b612a9d612a5d846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16612ab1919061577e565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b01667ffffffffffffffff168167ffffffffffffffff1611612afe5780611884565b7f00000000000000000000000000000000000000000000000000000000000004b095945050505050565b600080612bc7836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000008811115612c26576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000612c418383615891565b9050670de0b6b3a76400006000612c78827f00000000000000000000000000000000000000000000000000000000000000086158a5565b90506000612c96612c91670de0b6b3a7640000866158a5565b613eba565b90506000612ca48484614115565b90506000612cb28383614164565b90506000612cbf82614192565b90506000612cde82612cd9670de0b6b3a76400008f6158a5565b61437a565b90506000612cec8b83614164565b9050612cf8818d6158a5565b9f9e505050505050505050505050505050565b60028181548110612d1b57600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff166002811115612dce57612dce6153aa565b14612e05576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110612e1a57612e1a615720565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050612e797f0000000000000000000000000000000000000000000000000000000000000008600161577e565b612f15826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614612f4f576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080891561304657612fa27f00000000000000000000000000000000000000000000000000000000000000047f00000000000000000000000000000000000000000000000000000000000000086157ce565b6001901b612fc1846fffffffffffffffffffffffffffffffff166143b4565b6fffffffffffffffffffffffffffffffff16612fdd91906158e2565b1561301a5761301161300260016fffffffffffffffffffffffffffffffff87166158f6565b865463ffffffff166000614453565b6003015461303c565b7f00000000000000000000000000000000000000000000000000000000000000005b9150849050613070565b6003850154915061306d6130026fffffffffffffffffffffffffffffffff8616600161591f565b90505b600882901b60088a8a604051613087929190615710565b6040518091039020901b146130c8576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006130d38c614537565b905060006130e2836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d4077373ffffffffffffffffffffffffffffffffffffffff169063e14ced329061315c908f908f908f908f908a9060040161599c565b6020604051808303816000875af115801561317b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319f91906159d6565b60048501549114915060009060029061324a906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6132e6896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6132f091906159ef565b6132fa9190615a12565b60ff16159050811515810361333b576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff1615613392576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff1660028111156133fd576133fd6153aa565b14613434576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008061344386614566565b935093509350935060006134598585858561496f565b905060007f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d4077373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134ec9190615a34565b9050600189036135e45773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84613548367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af11580156135ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135de91906159d6565b5061155b565b600289036136105773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489613548565b6003890361363c5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487613548565b600489036137585760006136826fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000004614a29565b60095461368f919061577e565b61369a90600161577e565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561372d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061375191906159d6565b505061155b565b600589036137f1576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000038560c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a40161359b565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360140135606061387c61188d565b9050909192565b600081600001518260200151836040015184606001516040516020016138c2949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6040805180820190915260008082526020820152815160000361392e576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b6060600080600061395c85614ad7565b919450925090506001816001811115613977576139776153aa565b146139ae576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516139ba838561577e565b146139f1576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081613a085790505093506000835b8651811015613af657600080613a7b6040518060400160405280858c60000151613a5f91906157ce565b8152602001858c60200151613a74919061577e565b9052614ad7565b509150915060405180604001604052808383613a97919061577e565b8152602001848b60200151613aac919061577e565b815250888581518110613ac157613ac1615720565b6020908102919091010152613ad760018561577e565b9350613ae3818361577e565b613aed908461577e565b92505050613a35565b50845250919392505050565b60606000806000613b1285614ad7565b919450925090506000816001811115613b2d57613b2d6153aa565b14613b64576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b6e828461577e565b855114613ba7576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61188485602001518484614f75565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff90931692839290613c0590849061577e565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d1690637eee288d90604401600060405180830381600087803b158015613c9a57600080fd5b505af1158015613cae573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b6000613d286fffffffffffffffffffffffffffffffff8416600161591f565b90506000613d3882866001614453565b9050600086901a8380613e245750613d7160027f00000000000000000000000000000000000000000000000000000000000000046158e2565b6004830154600290613e15906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b613e1f9190615a12565b60ff16145b15613e7c5760ff811660011480613e3e575060ff81166002145b613e77576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161261a565b613cae565b60ff811615613cae576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161261a565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b1760008213613f1957631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a76400000215820261415257637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b6000816000190483118202156141825763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d782136141c057919050565b680755bf798b4a1bf1e582126141de5763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b60006143ab670de0b6b3a76400008361439286613eba565b61439c9190615a51565b6143a69190615b0d565b614192565b90505b92915050565b600080614441837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b6000808261449c576144976fffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000461500a565b6144b7565b6144b7856fffffffffffffffffffffffffffffffff16615196565b9050600284815481106144cc576144cc615720565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461452f57815460028054909163ffffffff1690811061451a5761451a615720565b906000526020600020906005020191506144dd565b509392505050565b600080600080600061454886614566565b935093509350935061455c8484848461496f565b9695505050505050565b600080600080600085905060006002828154811061458657614586615720565b600091825260209091206004600590920201908101549091507f00000000000000000000000000000000000000000000000000000000000000049061465d906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611614697576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f00000000000000000000000000000000000000000000000000000000000000049061475e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156147d357825463ffffffff1661479d7f0000000000000000000000000000000000000000000000000000000000000004600161577e565b83036147a7578391505b600281815481106147ba576147ba615720565b906000526020600020906005020193508094505061469b565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661483c614827856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561490b576000614874836fffffffffffffffffffffffffffffffff166143b4565b6fffffffffffffffffffffffffffffffff1611156148df5760006148b66148ae60016fffffffffffffffffffffffffffffffff86166158f6565b896001614453565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506148e59050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614961565b600061492d6148ae6fffffffffffffffffffffffffffffffff8516600161591f565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff8416156149dc5760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611884565b8282604051602001614a0a9291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b600080614ab6847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614b1a576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614b3f576000600160009450945094505050614f6e565b60b78111614c55576000614b546080836157ce565b905080876000015111614b93576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614c0b57507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614c42576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614f6e915050565b60bf8111614db3576000614c6a60b7836157ce565b905080876000015111614ca9576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614d0b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614d53576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614d5d818461577e565b895111614d96576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614da183600161577e565b9750955060009450614f6e9350505050565b60f78111614e18576000614dc860c0836157ce565b905080876000015111614e07576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614f6e915050565b6000614e2560f7836157ce565b905080876000015111614e64576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614ec6576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614f0e576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f18818461577e565b895111614f51576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f5c83600161577e565b9750955060019450614f6e9350505050565b9193909250565b60608167ffffffffffffffff811115614f9057614f90615654565b6040519080825280601f01601f191660200182016040528015614fba576020820181803683370190505b5090508115615003576000614fcf848661577e565b90506020820160005b84811015614ff0578281015182820152602001614fd8565b84811115614fff576000858301525b5050505b9392505050565b6000816150a9846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116150bf5763b34b5c226000526004601cfd5b6150c883615196565b905081615167826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116143ae576143ab61517d83600161577e565b6fffffffffffffffffffffffffffffffff83169061523b565b6000811960018301168161522a827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b6000806152c8847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f8401126152f657600080fd5b50813567ffffffffffffffff81111561530e57600080fd5b60208301915083602082850101111561532657600080fd5b9250929050565b600080600083850360a081121561534357600080fd5b608081121561535157600080fd5b50839250608084013567ffffffffffffffff81111561536f57600080fd5b61537b868287016152e4565b9497909650939450505050565b6000806040838503121561539b57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310615414577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060006060848603121561542f57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b8181101561546c57602081850181015186830182015201615450565b8181111561547e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006143ab6020830184615446565b6000602082840312156154d657600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146154ff57600080fd5b50565b60006020828403121561551457600080fd5b8135615003816154dd565b8035801515811461552f57600080fd5b919050565b6000806000806080858703121561554a57600080fd5b8435935060208501359250604085013591506155686060860161551f565b905092959194509250565b60006020828403121561558557600080fd5b81356fffffffffffffffffffffffffffffffff8116811461500357600080fd5b600080600080600080608087890312156155be57600080fd5b863595506155ce6020880161551f565b9450604087013567ffffffffffffffff808211156155eb57600080fd5b6155f78a838b016152e4565b9096509450606089013591508082111561561057600080fd5b5061561d89828a016152e4565b979a9699509497509295939492505050565b63ffffffff841681528260208201526060604082015260006118846060830184615446565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561569557600080fd5b6040516080810181811067ffffffffffffffff821117156156df577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156157915761579161574f565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157c7576157c761574f565b5060010190565b6000828210156157e0576157e061574f565b500390565b600067ffffffffffffffff838116908316818110156158065761580661574f565b039392505050565b600067ffffffffffffffff808316818516818304811182151516156158355761583561574f565b02949350505050565b6000806040838503121561585157600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826158a0576158a0615862565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156158dd576158dd61574f565b500290565b6000826158f1576158f1615862565b500690565b60006fffffffffffffffffffffffffffffffff838116908316818110156158065761580661574f565b60006fffffffffffffffffffffffffffffffff80831681851680830382111561594a5761594a61574f565b01949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6060815260006159b0606083018789615953565b82810360208401526159c3818688615953565b9150508260408301529695505050505050565b6000602082840312156159e857600080fd5b5051919050565b600060ff821660ff841680821015615a0957615a0961574f565b90039392505050565b600060ff831680615a2557615a25615862565b8060ff84160691505092915050565b600060208284031215615a4657600080fd5b8151615003816154dd565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615a9257615a9261574f565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615acd57615acd61574f565b60008712925087820587128484161615615ae957615ae961574f565b87850587128184161615615aff57615aff61574f565b505050929093029392505050565b600082615b1c57615b1c615862565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615b7057615b7061574f565b50059056fea164736f6c634300080f000a", + "data": "0x6101c06040523480156200001257600080fd5b5060405162005f7438038062005f74833981016040819052620000359162000187565b620000436001607e62000248565b60ff168811156200006757604051633beff19960e11b815260040160405180910390fd5b878710620000885760405163e62ccf3960e01b815260040160405180910390fd5b620000a7856001600160401b03166200014e60201b62000c891760201c565b6001600160401b0316620000cf876001600160401b03166200014e60201b62000c891760201c565b6001600160401b03161115620000f85760405163235dfb2b60e21b815260040160405180910390fd5b63ffffffff9099166101205260809790975260a09590955260c0939093526001600160401b039182166101a0521660e0526001600160a01b0390811661010052908116610140521661016052610180526200027a565b90565b80516001600160401b03811681146200016957600080fd5b919050565b6001600160a01b03811681146200018457600080fd5b50565b6000806000806000806000806000806101408b8d031215620001a857600080fd5b8a5163ffffffff81168114620001bd57600080fd5b809a505060208b0151985060408b0151975060608b01519650620001e460808c0162000151565b9550620001f460a08c0162000151565b945060c08b015162000206816200016e565b60e08c015190945062000219816200016e565b6101008c01519093506200022d816200016e565b809250506101208b015190509295989b9194979a5092959850565b600060ff821660ff8416808210156200027157634e487b7160e01b600052601160045260246000fd5b90039392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051615b82620003f2600039600081816106bb01528181611e9001528181611f4e0152611f78015260008181610a1e01526137960152600081816106130152818161178a01526124b00152600081816105270152818161194c01528181612349015281816128b20152613c5601526000818161088d0152818161246f01526138250152600081816104b40152818161310a015261345f015260008181610a7101528181610f6001528181611e2a01528181611ebb01528181611fb001528181612abe0152612b00015260008181610aa401528181611c7301528181611d9901528181611f1901528181612f5d0152818161365e01528181613d4d01528181614473015281816145a1015281816146a20152614777015260008181610b4b01528181611d3c01528181612bce01528181612c5401528181612e530152612f7e015260008181610786015261301c0152615b826000f3fe6080604052600436106102f25760003560e01c806370872aa51161018f578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b18578063fa315aa914610b3c578063fe2bbeb214610b6f57600080fd5b8063ec5e630814610a95578063eff0f59214610ac8578063f8f43ff614610af857600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a0f578063d8cc1a3c14610a42578063dabd396d14610a6257600080fd5b8063c6f0308c14610937578063cf09e0d0146109c1578063d5d44d80146109e257600080fd5b80638d450a9511610143578063bcef3b551161011d578063bcef3b55146108b7578063bd8da956146108f7578063c395e1ca1461091757600080fd5b80638d450a9514610777578063a445ece6146107aa578063bbdc02db1461087657600080fd5b80638129fc1c116101745780638129fc1c1461071a5780638980e0cc146107225780638b85902b1461073757600080fd5b806370872aa5146106f25780637b0f0adc1461070757600080fd5b80633fc8cef3116102485780635c0cba33116101fc5780636361506d116101d65780636361506d1461066c5780636b6716c0146106ac5780636f034409146106df57600080fd5b80635c0cba3314610604578063609d33341461063757806360e274641461064c57600080fd5b806354fd4d501161022d57806354fd4d501461055e57806357da950e146105b45780635a5fa2d9146105e457600080fd5b80633fc8cef314610518578063472777c61461054b57600080fd5b80632810e1d6116102aa57806337b1b2291161028457806337b1b229146104655780633a768463146104a55780633e3ac912146104d857600080fd5b80632810e1d6146103de5780632ad69aeb146103f357806330dbe5701461041357600080fd5b806319effeb4116102db57806319effeb414610339578063200d2ed21461038457806325fc2ace146103bf57600080fd5b806301935130146102f757806303c2924d14610319575b600080fd5b34801561030357600080fd5b5061031761031236600461532d565b610b9f565b005b34801561032557600080fd5b50610317610334366004615388565b610ec0565b34801561034557600080fd5b506000546103669068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561039057600080fd5b506000546103b290700100000000000000000000000000000000900460ff1681565b60405161037b91906153d9565b3480156103cb57600080fd5b506008545b60405190815260200161037b565b3480156103ea57600080fd5b506103b2611566565b3480156103ff57600080fd5b506103d061040e366004615388565b61180b565b34801561041f57600080fd5b506001546104409073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161037b565b34801561047157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610440565b3480156104b157600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610440565b3480156104e457600080fd5b50600054610508907201000000000000000000000000000000000000900460ff1681565b604051901515815260200161037b565b34801561052457600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610440565b61031761055936600461541a565b611841565b34801561056a57600080fd5b506105a76040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161037b91906154b1565b3480156105c057600080fd5b506008546009546105cf919082565b6040805192835260208301919091520161037b565b3480156105f057600080fd5b506103d06105ff3660046154c4565b611853565b34801561061057600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610440565b34801561064357600080fd5b506105a761188d565b34801561065857600080fd5b50610317610667366004615502565b61189b565b34801561067857600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103d0565b3480156106b857600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610366565b6103176106ed366004615534565b611a42565b3480156106fe57600080fd5b506009546103d0565b61031761071536600461541a565b6123e3565b6103176123f0565b34801561072e57600080fd5b506002546103d0565b34801561074357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103d0565b34801561078357600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103d0565b3480156107b657600080fd5b506108226107c53660046154c4565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff16606082015260800161037b565b34801561088257600080fd5b5060405163ffffffff7f000000000000000000000000000000000000000000000000000000000000000016815260200161037b565b3480156108c357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103d0565b34801561090357600080fd5b506103666109123660046154c4565b612949565b34801561092357600080fd5b506103d0610932366004615573565b612b28565b34801561094357600080fd5b506109576109523660046154c4565b612d0b565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e00161037b565b3480156109cd57600080fd5b506000546103669067ffffffffffffffff1681565b3480156109ee57600080fd5b506103d06109fd366004615502565b60036020526000908152604090205481565b348015610a1b57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103d0565b348015610a4e57600080fd5b50610317610a5d3660046155a5565b612da2565b348015610a6e57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610366565b348015610aa157600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103d0565b348015610ad457600080fd5b50610508610ae33660046154c4565b60046020526000908152604090205460ff1681565b348015610b0457600080fd5b50610317610b1336600461541a565b6133d1565b348015610b2457600080fd5b50610b2d613823565b60405161037b9392919061562f565b348015610b4857600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103d0565b348015610b7b57600080fd5b50610508610b8a3660046154c4565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610bcb57610bcb6153aa565b14610c02576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610c55576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c8c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610ca3610c9e36869003860186615683565b613883565b14610cda576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610cef929190615710565b604051809103902014610d2e576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d77610d7284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506138df92505050565b61394c565b90506000610d9e82600881518110610d9157610d91615720565b6020026020010151613b02565b9050602081511115610ddc576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610e51576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610eec57610eec6153aa565b14610f23576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610f3857610f38615720565b906000526020600020906005020190506000610f5384612949565b905067ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081169082161015610fbc576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611005576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561102257508515155b156110bd578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110555781611071565b600186015473ffffffffffffffffffffffffffffffffffffffff165b905061107d8187613bb6565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff166060830152611160576fffffffffffffffffffffffffffffffff6040820152600181526000869003611160578195505b600086826020015163ffffffff16611178919061577e565b90506000838211611189578161118b565b835b602084015190915063ffffffff165b818110156112d75760008682815481106111b6576111b6615720565b6000918252602080832090910154808352600690915260409091205490915060ff1661120e576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061122357611223615720565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112805750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b156112c257600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b505080806112cf90615796565b91505061119a565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9093169290921790915584900361155b57606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558915801561145757506000547201000000000000000000000000000000000000900460ff165b156114cc5760015473ffffffffffffffffffffffffffffffffffffffff1661147f818a613bb6565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff909116178855611559565b61151373ffffffffffffffffffffffffffffffffffffffff8216156114f1578161150d565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89613bb6565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff166002811115611594576115946153aa565b146115cb576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff1661162f576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008154811061165b5761165b615720565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611696576001611699565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff9091161770010000000000000000000000000000000083600281111561174a5761174a6153aa565b02179055600281111561175f5761175f6153aa565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156117f057600080fd5b505af1158015611804573d6000803e3d6000fd5b5050505090565b6005602052816000526040600020818154811061182757600080fd5b90600052602060002001600091509150505481565b905090565b61184e8383836001611a42565b505050565b6000818152600760209081526040808320600590925282208054825461188490610100900463ffffffff16826157ce565b95945050505050565b606061183c60546020613cb7565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812080549082905590819003611900576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063f3fef3a390604401600060405180830381600087803b15801561199057600080fd5b505af11580156119a4573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a02576040519150601f19603f3d011682016040523d82523d6000602084013e611a07565b606091505b505090508061184e576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054700100000000000000000000000000000000900460ff166002811115611a6e57611a6e6153aa565b14611aa5576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110611aba57611aba615720565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514611ba1576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000611c61826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580611c9c5750611c997f0000000000000000000000000000000000000000000000000000000000000000600261577e565b81145b8015611ca6575084155b15611cdd576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015611d03575086155b15611d3a576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115611d94576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dbf7f0000000000000000000000000000000000000000000000000000000000000000600161577e565b8103611dd157611dd186888588613d09565b34611ddb83612b28565b14611e12576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e1d88612949565b905067ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811690821603611e85576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016611ee591906157e5565b67ffffffffffffffff16611f008267ffffffffffffffff1690565b67ffffffffffffffff161115611fe2576000611f3d60017f00000000000000000000000000000000000000000000000000000000000000006157ce565b8314611f735767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016611fa8565b611fa87f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16600261580e565b9050611fde817f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff166157e5565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526004602052604090205490915060ff1615612060576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008b815260200190815260200160002060016002805490506122f691906157ce565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263d0e30db09234926004808301939282900301818588803b15801561238e57600080fd5b505af11580156123a2573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b61184e8383836000611a42565b60005471010000000000000000000000000000000000900460ff1615612442576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000000166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690637258a807906024016040805180830381865afa1580156124f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251a919061583e565b909250905081612556576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461258957639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036054013511612623576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f00000000000000000000000000000000000000000000000000000000000000009092169363d0e30db093926004828101939282900301818588803b1580156128f857600080fd5b505af115801561290c573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b600080600054700100000000000000000000000000000000900460ff166002811115612977576129776153aa565b146129ae576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600283815481106129c3576129c3615720565b600091825260208220600590910201805490925063ffffffff90811614612a3257815460028054909163ffffffff16908110612a0157612a01615720565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090612a6a90700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b612a7e9067ffffffffffffffff16426157ce565b612a9d612a5d846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16612ab1919061577e565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff168167ffffffffffffffff1611612afe5780611884565b7f000000000000000000000000000000000000000000000000000000000000000095945050505050565b600080612bc7836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000000811115612c26576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000612c418383615891565b9050670de0b6b3a76400006000612c78827f00000000000000000000000000000000000000000000000000000000000000006158a5565b90506000612c96612c91670de0b6b3a7640000866158a5565b613eba565b90506000612ca48484614115565b90506000612cb28383614164565b90506000612cbf82614192565b90506000612cde82612cd9670de0b6b3a76400008f6158a5565b61437a565b90506000612cec8b83614164565b9050612cf8818d6158a5565b9f9e505050505050505050505050505050565b60028181548110612d1b57600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff166002811115612dce57612dce6153aa565b14612e05576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110612e1a57612e1a615720565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050612e797f0000000000000000000000000000000000000000000000000000000000000000600161577e565b612f15826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614612f4f576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080891561304657612fa27f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006157ce565b6001901b612fc1846fffffffffffffffffffffffffffffffff166143b4565b6fffffffffffffffffffffffffffffffff16612fdd91906158e2565b1561301a5761301161300260016fffffffffffffffffffffffffffffffff87166158f6565b865463ffffffff166000614453565b6003015461303c565b7f00000000000000000000000000000000000000000000000000000000000000005b9150849050613070565b6003850154915061306d6130026fffffffffffffffffffffffffffffffff8616600161591f565b90505b600882901b60088a8a604051613087929190615710565b6040518091039020901b146130c8576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006130d38c614537565b905060006130e2836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e14ced329061315c908f908f908f908f908a9060040161599c565b6020604051808303816000875af115801561317b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319f91906159d6565b60048501549114915060009060029061324a906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6132e6896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6132f091906159ef565b6132fa9190615a12565b60ff16159050811515810361333b576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff1615613392576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff1660028111156133fd576133fd6153aa565b14613434576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008061344386614566565b935093509350935060006134598585858561496f565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134ec9190615a34565b9050600189036135e45773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84613548367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af11580156135ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135de91906159d6565b5061155b565b600289036136105773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489613548565b6003890361363c5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487613548565b600489036137585760006136826fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000000614a29565b60095461368f919061577e565b61369a90600161577e565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561372d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061375191906159d6565b505061155b565b600589036137f1576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000000060c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a40161359b565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360140135606061387c61188d565b9050909192565b600081600001518260200151836040015184606001516040516020016138c2949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6040805180820190915260008082526020820152815160000361392e576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b6060600080600061395c85614ad7565b919450925090506001816001811115613977576139776153aa565b146139ae576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516139ba838561577e565b146139f1576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081613a085790505093506000835b8651811015613af657600080613a7b6040518060400160405280858c60000151613a5f91906157ce565b8152602001858c60200151613a74919061577e565b9052614ad7565b509150915060405180604001604052808383613a97919061577e565b8152602001848b60200151613aac919061577e565b815250888581518110613ac157613ac1615720565b6020908102919091010152613ad760018561577e565b9350613ae3818361577e565b613aed908461577e565b92505050613a35565b50845250919392505050565b60606000806000613b1285614ad7565b919450925090506000816001811115613b2d57613b2d6153aa565b14613b64576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b6e828461577e565b855114613ba7576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61188485602001518484614f75565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff90931692839290613c0590849061577e565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690637eee288d90604401600060405180830381600087803b158015613c9a57600080fd5b505af1158015613cae573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b6000613d286fffffffffffffffffffffffffffffffff8416600161591f565b90506000613d3882866001614453565b9050600086901a8380613e245750613d7160027f00000000000000000000000000000000000000000000000000000000000000006158e2565b6004830154600290613e15906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b613e1f9190615a12565b60ff16145b15613e7c5760ff811660011480613e3e575060ff81166002145b613e77576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161261a565b613cae565b60ff811615613cae576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161261a565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b1760008213613f1957631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a76400000215820261415257637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b6000816000190483118202156141825763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d782136141c057919050565b680755bf798b4a1bf1e582126141de5763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b60006143ab670de0b6b3a76400008361439286613eba565b61439c9190615a51565b6143a69190615b0d565b614192565b90505b92915050565b600080614441837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b6000808261449c576144976fffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000061500a565b6144b7565b6144b7856fffffffffffffffffffffffffffffffff16615196565b9050600284815481106144cc576144cc615720565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461452f57815460028054909163ffffffff1690811061451a5761451a615720565b906000526020600020906005020191506144dd565b509392505050565b600080600080600061454886614566565b935093509350935061455c8484848461496f565b9695505050505050565b600080600080600085905060006002828154811061458657614586615720565b600091825260209091206004600590920201908101549091507f00000000000000000000000000000000000000000000000000000000000000009061465d906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611614697576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f00000000000000000000000000000000000000000000000000000000000000009061475e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156147d357825463ffffffff1661479d7f0000000000000000000000000000000000000000000000000000000000000000600161577e565b83036147a7578391505b600281815481106147ba576147ba615720565b906000526020600020906005020193508094505061469b565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661483c614827856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561490b576000614874836fffffffffffffffffffffffffffffffff166143b4565b6fffffffffffffffffffffffffffffffff1611156148df5760006148b66148ae60016fffffffffffffffffffffffffffffffff86166158f6565b896001614453565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506148e59050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614961565b600061492d6148ae6fffffffffffffffffffffffffffffffff8516600161591f565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff8416156149dc5760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611884565b8282604051602001614a0a9291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b600080614ab6847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614b1a576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614b3f576000600160009450945094505050614f6e565b60b78111614c55576000614b546080836157ce565b905080876000015111614b93576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614c0b57507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614c42576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614f6e915050565b60bf8111614db3576000614c6a60b7836157ce565b905080876000015111614ca9576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614d0b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614d53576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614d5d818461577e565b895111614d96576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614da183600161577e565b9750955060009450614f6e9350505050565b60f78111614e18576000614dc860c0836157ce565b905080876000015111614e07576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614f6e915050565b6000614e2560f7836157ce565b905080876000015111614e64576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614ec6576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614f0e576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f18818461577e565b895111614f51576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f5c83600161577e565b9750955060019450614f6e9350505050565b9193909250565b60608167ffffffffffffffff811115614f9057614f90615654565b6040519080825280601f01601f191660200182016040528015614fba576020820181803683370190505b5090508115615003576000614fcf848661577e565b90506020820160005b84811015614ff0578281015182820152602001614fd8565b84811115614fff576000858301525b5050505b9392505050565b6000816150a9846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116150bf5763b34b5c226000526004601cfd5b6150c883615196565b905081615167826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116143ae576143ab61517d83600161577e565b6fffffffffffffffffffffffffffffffff83169061523b565b6000811960018301168161522a827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b6000806152c8847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f8401126152f657600080fd5b50813567ffffffffffffffff81111561530e57600080fd5b60208301915083602082850101111561532657600080fd5b9250929050565b600080600083850360a081121561534357600080fd5b608081121561535157600080fd5b50839250608084013567ffffffffffffffff81111561536f57600080fd5b61537b868287016152e4565b9497909650939450505050565b6000806040838503121561539b57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310615414577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060006060848603121561542f57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b8181101561546c57602081850181015186830182015201615450565b8181111561547e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006143ab6020830184615446565b6000602082840312156154d657600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146154ff57600080fd5b50565b60006020828403121561551457600080fd5b8135615003816154dd565b8035801515811461552f57600080fd5b919050565b6000806000806080858703121561554a57600080fd5b8435935060208501359250604085013591506155686060860161551f565b905092959194509250565b60006020828403121561558557600080fd5b81356fffffffffffffffffffffffffffffffff8116811461500357600080fd5b600080600080600080608087890312156155be57600080fd5b863595506155ce6020880161551f565b9450604087013567ffffffffffffffff808211156155eb57600080fd5b6155f78a838b016152e4565b9096509450606089013591508082111561561057600080fd5b5061561d89828a016152e4565b979a9699509497509295939492505050565b63ffffffff841681528260208201526060604082015260006118846060830184615446565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561569557600080fd5b6040516080810181811067ffffffffffffffff821117156156df577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156157915761579161574f565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157c7576157c761574f565b5060010190565b6000828210156157e0576157e061574f565b500390565b600067ffffffffffffffff838116908316818110156158065761580661574f565b039392505050565b600067ffffffffffffffff808316818516818304811182151516156158355761583561574f565b02949350505050565b6000806040838503121561585157600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826158a0576158a0615862565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156158dd576158dd61574f565b500290565b6000826158f1576158f1615862565b500690565b60006fffffffffffffffffffffffffffffffff838116908316818110156158065761580661574f565b60006fffffffffffffffffffffffffffffffff80831681851680830382111561594a5761594a61574f565b01949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6060815260006159b0606083018789615953565b82810360208401526159c3818688615953565b9150508260408301529695505050505050565b6000602082840312156159e857600080fd5b5051919050565b600060ff821660ff841680821015615a0957615a0961574f565b90039392505050565b600060ff831680615a2557615a25615862565b8060ff84160691505092915050565b600060208284031215615a4657600080fd5b8151615003816154dd565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615a9257615a9261574f565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615acd57615acd61574f565b60008712925087820587128484161615615ae957615ae961574f565b87850587128184161615615aff57615aff61574f565b505050929093029392505050565b600082615b1c57615b1c615862565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615b7057615b7061574f565b50059056fea164736f6c634300080f000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b0000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d40773000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92000000000000000000000000d6eaf4c146261653ee059077b78ed088add543090000000000000000000000000000000000000000000000000000000000000385", + "deployedCode": "0x6080604052600436106102f25760003560e01c806370872aa51161018f578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b18578063fa315aa914610b3c578063fe2bbeb214610b6f57600080fd5b8063ec5e630814610a95578063eff0f59214610ac8578063f8f43ff614610af857600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a0f578063d8cc1a3c14610a42578063dabd396d14610a6257600080fd5b8063c6f0308c14610937578063cf09e0d0146109c1578063d5d44d80146109e257600080fd5b80638d450a9511610143578063bcef3b551161011d578063bcef3b55146108b7578063bd8da956146108f7578063c395e1ca1461091757600080fd5b80638d450a9514610777578063a445ece6146107aa578063bbdc02db1461087657600080fd5b80638129fc1c116101745780638129fc1c1461071a5780638980e0cc146107225780638b85902b1461073757600080fd5b806370872aa5146106f25780637b0f0adc1461070757600080fd5b80633fc8cef3116102485780635c0cba33116101fc5780636361506d116101d65780636361506d1461066c5780636b6716c0146106ac5780636f034409146106df57600080fd5b80635c0cba3314610604578063609d33341461063757806360e274641461064c57600080fd5b806354fd4d501161022d57806354fd4d501461055e57806357da950e146105b45780635a5fa2d9146105e457600080fd5b80633fc8cef314610518578063472777c61461054b57600080fd5b80632810e1d6116102aa57806337b1b2291161028457806337b1b229146104655780633a768463146104a55780633e3ac912146104d857600080fd5b80632810e1d6146103de5780632ad69aeb146103f357806330dbe5701461041357600080fd5b806319effeb4116102db57806319effeb414610339578063200d2ed21461038457806325fc2ace146103bf57600080fd5b806301935130146102f757806303c2924d14610319575b600080fd5b34801561030357600080fd5b5061031761031236600461532d565b610b9f565b005b34801561032557600080fd5b50610317610334366004615388565b610ec0565b34801561034557600080fd5b506000546103669068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561039057600080fd5b506000546103b290700100000000000000000000000000000000900460ff1681565b60405161037b91906153d9565b3480156103cb57600080fd5b506008545b60405190815260200161037b565b3480156103ea57600080fd5b506103b2611566565b3480156103ff57600080fd5b506103d061040e366004615388565b61180b565b34801561041f57600080fd5b506001546104409073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161037b565b34801561047157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610440565b3480156104b157600080fd5b507f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d40773610440565b3480156104e457600080fd5b50600054610508907201000000000000000000000000000000000000900460ff1681565b604051901515815260200161037b565b34801561052457600080fd5b507f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92610440565b61031761055936600461541a565b611841565b34801561056a57600080fd5b506105a76040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161037b91906154b1565b3480156105c057600080fd5b506008546009546105cf919082565b6040805192835260208301919091520161037b565b3480156105f057600080fd5b506103d06105ff3660046154c4565b611853565b34801561061057600080fd5b507f000000000000000000000000d6eaf4c146261653ee059077b78ed088add54309610440565b34801561064357600080fd5b506105a761188d565b34801561065857600080fd5b50610317610667366004615502565b61189b565b34801561067857600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103d0565b3480156106b857600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610366565b6103176106ed366004615534565b611a42565b3480156106fe57600080fd5b506009546103d0565b61031761071536600461541a565b6123e3565b6103176123f0565b34801561072e57600080fd5b506002546103d0565b34801561074357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103d0565b34801561078357600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103d0565b3480156107b657600080fd5b506108226107c53660046154c4565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff16606082015260800161037b565b34801561088257600080fd5b5060405163ffffffff7f000000000000000000000000000000000000000000000000000000000000000016815260200161037b565b3480156108c357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103d0565b34801561090357600080fd5b506103666109123660046154c4565b612949565b34801561092357600080fd5b506103d0610932366004615573565b612b28565b34801561094357600080fd5b506109576109523660046154c4565b612d0b565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e00161037b565b3480156109cd57600080fd5b506000546103669067ffffffffffffffff1681565b3480156109ee57600080fd5b506103d06109fd366004615502565b60036020526000908152604090205481565b348015610a1b57600080fd5b507f00000000000000000000000000000000000000000000000000000000000003856103d0565b348015610a4e57600080fd5b50610317610a5d3660046155a5565b612da2565b348015610a6e57600080fd5b507f00000000000000000000000000000000000000000000000000000000000004b0610366565b348015610aa157600080fd5b507f00000000000000000000000000000000000000000000000000000000000000046103d0565b348015610ad457600080fd5b50610508610ae33660046154c4565b60046020526000908152604090205460ff1681565b348015610b0457600080fd5b50610317610b1336600461541a565b6133d1565b348015610b2457600080fd5b50610b2d613823565b60405161037b9392919061562f565b348015610b4857600080fd5b507f00000000000000000000000000000000000000000000000000000000000000086103d0565b348015610b7b57600080fd5b50610508610b8a3660046154c4565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610bcb57610bcb6153aa565b14610c02576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610c55576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c8c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610ca3610c9e36869003860186615683565b613883565b14610cda576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610cef929190615710565b604051809103902014610d2e576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d77610d7284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506138df92505050565b61394c565b90506000610d9e82600881518110610d9157610d91615720565b6020026020010151613b02565b9050602081511115610ddc576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610e51576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610eec57610eec6153aa565b14610f23576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610f3857610f38615720565b906000526020600020906005020190506000610f5384612949565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b081169082161015610fbc576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611005576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561102257508515155b156110bd578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110555781611071565b600186015473ffffffffffffffffffffffffffffffffffffffff165b905061107d8187613bb6565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff166060830152611160576fffffffffffffffffffffffffffffffff6040820152600181526000869003611160578195505b600086826020015163ffffffff16611178919061577e565b90506000838211611189578161118b565b835b602084015190915063ffffffff165b818110156112d75760008682815481106111b6576111b6615720565b6000918252602080832090910154808352600690915260409091205490915060ff1661120e576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061122357611223615720565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112805750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b156112c257600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b505080806112cf90615796565b91505061119a565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9093169290921790915584900361155b57606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558915801561145757506000547201000000000000000000000000000000000000900460ff165b156114cc5760015473ffffffffffffffffffffffffffffffffffffffff1661147f818a613bb6565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff909116178855611559565b61151373ffffffffffffffffffffffffffffffffffffffff8216156114f1578161150d565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89613bb6565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff166002811115611594576115946153aa565b146115cb576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff1661162f576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008154811061165b5761165b615720565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611696576001611699565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff9091161770010000000000000000000000000000000083600281111561174a5761174a6153aa565b02179055600281111561175f5761175f6153aa565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f000000000000000000000000d6eaf4c146261653ee059077b78ed088add5430973ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156117f057600080fd5b505af1158015611804573d6000803e3d6000fd5b5050505090565b6005602052816000526040600020818154811061182757600080fd5b90600052602060002001600091509150505481565b905090565b61184e8383836001611a42565b505050565b6000818152600760209081526040808320600590925282208054825461188490610100900463ffffffff16826157ce565b95945050505050565b606061183c60546020613cb7565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812080549082905590819003611900576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92169063f3fef3a390604401600060405180830381600087803b15801561199057600080fd5b505af11580156119a4573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a02576040519150601f19603f3d011682016040523d82523d6000602084013e611a07565b606091505b505090508061184e576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054700100000000000000000000000000000000900460ff166002811115611a6e57611a6e6153aa565b14611aa5576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110611aba57611aba615720565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514611ba1576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000611c61826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580611c9c5750611c997f0000000000000000000000000000000000000000000000000000000000000004600261577e565b81145b8015611ca6575084155b15611cdd576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015611d03575086155b15611d3a576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000008811115611d94576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dbf7f0000000000000000000000000000000000000000000000000000000000000004600161577e565b8103611dd157611dd186888588613d09565b34611ddb83612b28565b14611e12576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e1d88612949565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b0811690821603611e85576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b016611ee591906157e5565b67ffffffffffffffff16611f008267ffffffffffffffff1690565b67ffffffffffffffff161115611fe2576000611f3d60017f00000000000000000000000000000000000000000000000000000000000000046157ce565b8314611f735767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016611fa8565b611fa87f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16600261580e565b9050611fde817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff166157e5565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526004602052604090205490915060ff1615612060576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008b815260200190815260200160002060016002805490506122f691906157ce565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92169263d0e30db09234926004808301939282900301818588803b15801561238e57600080fd5b505af11580156123a2573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b61184e8383836000611a42565b60005471010000000000000000000000000000000000900460ff1615612442576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000000166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000d6eaf4c146261653ee059077b78ed088add543091690637258a807906024016040805180830381865afa1580156124f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251a919061583e565b909250905081612556576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461258957639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036054013511612623576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd929092169363d0e30db093926004828101939282900301818588803b1580156128f857600080fd5b505af115801561290c573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b600080600054700100000000000000000000000000000000900460ff166002811115612977576129776153aa565b146129ae576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600283815481106129c3576129c3615720565b600091825260208220600590910201805490925063ffffffff90811614612a3257815460028054909163ffffffff16908110612a0157612a01615720565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090612a6a90700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b612a7e9067ffffffffffffffff16426157ce565b612a9d612a5d846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16612ab1919061577e565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b01667ffffffffffffffff168167ffffffffffffffff1611612afe5780611884565b7f00000000000000000000000000000000000000000000000000000000000004b095945050505050565b600080612bc7836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000008811115612c26576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000612c418383615891565b9050670de0b6b3a76400006000612c78827f00000000000000000000000000000000000000000000000000000000000000086158a5565b90506000612c96612c91670de0b6b3a7640000866158a5565b613eba565b90506000612ca48484614115565b90506000612cb28383614164565b90506000612cbf82614192565b90506000612cde82612cd9670de0b6b3a76400008f6158a5565b61437a565b90506000612cec8b83614164565b9050612cf8818d6158a5565b9f9e505050505050505050505050505050565b60028181548110612d1b57600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff166002811115612dce57612dce6153aa565b14612e05576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110612e1a57612e1a615720565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050612e797f0000000000000000000000000000000000000000000000000000000000000008600161577e565b612f15826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614612f4f576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080891561304657612fa27f00000000000000000000000000000000000000000000000000000000000000047f00000000000000000000000000000000000000000000000000000000000000086157ce565b6001901b612fc1846fffffffffffffffffffffffffffffffff166143b4565b6fffffffffffffffffffffffffffffffff16612fdd91906158e2565b1561301a5761301161300260016fffffffffffffffffffffffffffffffff87166158f6565b865463ffffffff166000614453565b6003015461303c565b7f00000000000000000000000000000000000000000000000000000000000000005b9150849050613070565b6003850154915061306d6130026fffffffffffffffffffffffffffffffff8616600161591f565b90505b600882901b60088a8a604051613087929190615710565b6040518091039020901b146130c8576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006130d38c614537565b905060006130e2836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d4077373ffffffffffffffffffffffffffffffffffffffff169063e14ced329061315c908f908f908f908f908a9060040161599c565b6020604051808303816000875af115801561317b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319f91906159d6565b60048501549114915060009060029061324a906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6132e6896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6132f091906159ef565b6132fa9190615a12565b60ff16159050811515810361333b576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff1615613392576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff1660028111156133fd576133fd6153aa565b14613434576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008061344386614566565b935093509350935060006134598585858561496f565b905060007f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d4077373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134ec9190615a34565b9050600189036135e45773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84613548367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af11580156135ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135de91906159d6565b5061155b565b600289036136105773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489613548565b6003890361363c5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487613548565b600489036137585760006136826fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000004614a29565b60095461368f919061577e565b61369a90600161577e565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561372d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061375191906159d6565b505061155b565b600589036137f1576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000038560c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a40161359b565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360140135606061387c61188d565b9050909192565b600081600001518260200151836040015184606001516040516020016138c2949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6040805180820190915260008082526020820152815160000361392e576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b6060600080600061395c85614ad7565b919450925090506001816001811115613977576139776153aa565b146139ae576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516139ba838561577e565b146139f1576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081613a085790505093506000835b8651811015613af657600080613a7b6040518060400160405280858c60000151613a5f91906157ce565b8152602001858c60200151613a74919061577e565b9052614ad7565b509150915060405180604001604052808383613a97919061577e565b8152602001848b60200151613aac919061577e565b815250888581518110613ac157613ac1615720565b6020908102919091010152613ad760018561577e565b9350613ae3818361577e565b613aed908461577e565b92505050613a35565b50845250919392505050565b60606000806000613b1285614ad7565b919450925090506000816001811115613b2d57613b2d6153aa565b14613b64576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b6e828461577e565b855114613ba7576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61188485602001518484614f75565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff90931692839290613c0590849061577e565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd921690637eee288d90604401600060405180830381600087803b158015613c9a57600080fd5b505af1158015613cae573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b6000613d286fffffffffffffffffffffffffffffffff8416600161591f565b90506000613d3882866001614453565b9050600086901a8380613e245750613d7160027f00000000000000000000000000000000000000000000000000000000000000046158e2565b6004830154600290613e15906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b613e1f9190615a12565b60ff16145b15613e7c5760ff811660011480613e3e575060ff81166002145b613e77576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161261a565b613cae565b60ff811615613cae576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161261a565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b1760008213613f1957631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a76400000215820261415257637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b6000816000190483118202156141825763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d782136141c057919050565b680755bf798b4a1bf1e582126141de5763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b60006143ab670de0b6b3a76400008361439286613eba565b61439c9190615a51565b6143a69190615b0d565b614192565b90505b92915050565b600080614441837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b6000808261449c576144976fffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000461500a565b6144b7565b6144b7856fffffffffffffffffffffffffffffffff16615196565b9050600284815481106144cc576144cc615720565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461452f57815460028054909163ffffffff1690811061451a5761451a615720565b906000526020600020906005020191506144dd565b509392505050565b600080600080600061454886614566565b935093509350935061455c8484848461496f565b9695505050505050565b600080600080600085905060006002828154811061458657614586615720565b600091825260209091206004600590920201908101549091507f00000000000000000000000000000000000000000000000000000000000000049061465d906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611614697576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f00000000000000000000000000000000000000000000000000000000000000049061475e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156147d357825463ffffffff1661479d7f0000000000000000000000000000000000000000000000000000000000000004600161577e565b83036147a7578391505b600281815481106147ba576147ba615720565b906000526020600020906005020193508094505061469b565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661483c614827856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561490b576000614874836fffffffffffffffffffffffffffffffff166143b4565b6fffffffffffffffffffffffffffffffff1611156148df5760006148b66148ae60016fffffffffffffffffffffffffffffffff86166158f6565b896001614453565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506148e59050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614961565b600061492d6148ae6fffffffffffffffffffffffffffffffff8516600161591f565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff8416156149dc5760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611884565b8282604051602001614a0a9291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b600080614ab6847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614b1a576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614b3f576000600160009450945094505050614f6e565b60b78111614c55576000614b546080836157ce565b905080876000015111614b93576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614c0b57507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614c42576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614f6e915050565b60bf8111614db3576000614c6a60b7836157ce565b905080876000015111614ca9576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614d0b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614d53576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614d5d818461577e565b895111614d96576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614da183600161577e565b9750955060009450614f6e9350505050565b60f78111614e18576000614dc860c0836157ce565b905080876000015111614e07576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614f6e915050565b6000614e2560f7836157ce565b905080876000015111614e64576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614ec6576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614f0e576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f18818461577e565b895111614f51576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f5c83600161577e565b9750955060019450614f6e9350505050565b9193909250565b60608167ffffffffffffffff811115614f9057614f90615654565b6040519080825280601f01601f191660200182016040528015614fba576020820181803683370190505b5090508115615003576000614fcf848661577e565b90506020820160005b84811015614ff0578281015182820152602001614fd8565b84811115614fff576000858301525b5050505b9392505050565b6000816150a9846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116150bf5763b34b5c226000526004601cfd5b6150c883615196565b905081615167826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116143ae576143ab61517d83600161577e565b6fffffffffffffffffffffffffffffffff83169061523b565b6000811960018301168161522a827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b6000806152c8847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f8401126152f657600080fd5b50813567ffffffffffffffff81111561530e57600080fd5b60208301915083602082850101111561532657600080fd5b9250929050565b600080600083850360a081121561534357600080fd5b608081121561535157600080fd5b50839250608084013567ffffffffffffffff81111561536f57600080fd5b61537b868287016152e4565b9497909650939450505050565b6000806040838503121561539b57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310615414577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060006060848603121561542f57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b8181101561546c57602081850181015186830182015201615450565b8181111561547e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006143ab6020830184615446565b6000602082840312156154d657600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146154ff57600080fd5b50565b60006020828403121561551457600080fd5b8135615003816154dd565b8035801515811461552f57600080fd5b919050565b6000806000806080858703121561554a57600080fd5b8435935060208501359250604085013591506155686060860161551f565b905092959194509250565b60006020828403121561558557600080fd5b81356fffffffffffffffffffffffffffffffff8116811461500357600080fd5b600080600080600080608087890312156155be57600080fd5b863595506155ce6020880161551f565b9450604087013567ffffffffffffffff808211156155eb57600080fd5b6155f78a838b016152e4565b9096509450606089013591508082111561561057600080fd5b5061561d89828a016152e4565b979a9699509497509295939492505050565b63ffffffff841681528260208201526060604082015260006118846060830184615446565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561569557600080fd5b6040516080810181811067ffffffffffffffff821117156156df577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156157915761579161574f565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157c7576157c761574f565b5060010190565b6000828210156157e0576157e061574f565b500390565b600067ffffffffffffffff838116908316818110156158065761580661574f565b039392505050565b600067ffffffffffffffff808316818516818304811182151516156158355761583561574f565b02949350505050565b6000806040838503121561585157600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826158a0576158a0615862565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156158dd576158dd61574f565b500290565b6000826158f1576158f1615862565b500690565b60006fffffffffffffffffffffffffffffffff838116908316818110156158065761580661574f565b60006fffffffffffffffffffffffffffffffff80831681851680830382111561594a5761594a61574f565b01949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6060815260006159b0606083018789615953565b82810360208401526159c3818688615953565b9150508260408301529695505050505050565b6000602082840312156159e857600080fd5b5051919050565b600060ff821660ff841680821015615a0957615a0961574f565b90039392505050565b600060ff831680615a2557615a25615862565b8060ff84160691505092915050565b600060208284031215615a4657600080fd5b8151615003816154dd565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615a9257615a9261574f565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615acd57615acd61574f565b60008712925087820587128484161615615ae957615ae961574f565b87850587128184161615615aff57615aff61574f565b505050929093029392505050565b600082615b1c57615b1c615862565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615b7057615b7061574f565b50059056fea164736f6c634300080f000a", "initialized": true, "kind": "Create", "newBalance": 0, @@ -18425,7 +18425,7 @@ }, { "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -18442,12 +18442,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x14f6b1a30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ce8c32b1493db37767faf988dec9e80089f4f33c", + "data": "0x14f6b1a30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000357a483a8923686e7fa454ee93bbc11afb114743", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -18456,7 +18456,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x00000000000000000000000020b168142354cee65a32f6d8cf3033e592299765", "previousValue": "0x00000000000000000000000020b168142354cee65a32f6d8cf3033e592299765", @@ -18473,7 +18473,7 @@ "chainId": 31337, "forkId": 0 }, - "data": "0x14f6b1a30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ce8c32b1493db37767faf988dec9e80089f4f33c", + "data": "0x14f6b1a30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000357a483a8923686e7fa454ee93bbc11afb114743", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -18482,7 +18482,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", @@ -18490,7 +18490,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -18498,9 +18498,9 @@ "slot": "0xffdfc1249c027f9191656349feb0761381bb32c9f557e01f419fd08754bf5a1b" }, { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": true, - "newValue": "0x000000000000000000000000ce8c32b1493db37767faf988dec9e80089f4f33c", + "newValue": "0x000000000000000000000000357a483a8923686e7fa454ee93bbc11afb114743", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0xffdfc1249c027f9191656349feb0761381bb32c9f557e01f419fd08754bf5a1b" @@ -18648,7 +18648,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -18662,7 +18662,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x00000000000000000000000020b168142354cee65a32f6d8cf3033e592299765", "previousValue": "0x00000000000000000000000020b168142354cee65a32f6d8cf3033e592299765", @@ -18688,7 +18688,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -18856,13 +18856,13 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x357A483a8923686E7fA454Ee93bbc11aFB114743", + "account": "0xb6b1579AA54e2F61e621a40d5F2704D717B3544F", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x6102006040523480156200001257600080fd5b5060405162006269380380620062698339810160408190526200003591620001ac565b8b8b8b8b8b8b8b8b8b8b6200004d6001607e62000289565b60ff168811156200007157604051633beff19960e11b815260040160405180910390fd5b878710620000925760405163e62ccf3960e01b815260040160405180910390fd5b620000b1856001600160401b03166200017460201b62000d051760201c565b6001600160401b0316620000d9876001600160401b03166200017460201b62000d051760201c565b6001600160401b03161115620001025760405163235dfb2b60e21b815260040160405180910390fd5b63ffffffff9099166101205260809790975260a09590955260c0939093526001600160401b039182166101a0521660e0526001600160a01b03908116610100529081166101405290811661016052610180919091529182166101c052166101e05250620002bb98505050505050505050565b90565b80516001600160401b03811681146200018f57600080fd5b919050565b80516001600160a01b03811681146200018f57600080fd5b6000806000806000806000806000806000806101808d8f031215620001d057600080fd5b8c5163ffffffff81168114620001e557600080fd5b809c505060208d01519a5060408d0151995060608d015198506200020c60808e0162000177565b97506200021c60a08e0162000177565b96506200022c60c08e0162000194565b95506200023c60e08e0162000194565b94506200024d6101008e0162000194565b93506101208d01519250620002666101408e0162000194565b9150620002776101608e0162000194565b90509295989b509295989b509295989b565b600060ff821660ff841680821015620002b257634e487b7160e01b600052601160045260246000fd5b90039392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e051615dfd6200046c6000396000818161058301528181611b1501526120b50152600081816108ce01528181611ad601528181611ba4015261207601526000818161070401528181612ea901528181612f670152612f91015260008181610a9a01526124e801526000818161065c0152818161180601526134bc01526000818161053d015281816119c8015281816129a80152818161336201526138be01526000818161090901528181612577015261347b0152600081816104ca015281816121b101526141b7015260008181610aed01528181610fdc01528181611d7a01528181611dbc01528181612e4301528181612ed40152612fc9015260008181610b20015281816123b001528181612c8c01528181612db201528181612f320152818161400a015281816144b9015281816145ba0152818161468f01528181614f660152615192015260008181610bc701528181611e8a01528181611f1001528181612d5501528181613f00015261402b0152600081816107cf01526140c90152615dfd6000f3fe6080604052600436106103085760003560e01c806370872aa51161019a578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b94578063fa315aa914610bb8578063fe2bbeb214610beb57600080fd5b8063ec5e630814610b11578063eff0f59214610b44578063f8f43ff614610b7457600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a8b578063d8cc1a3c14610abe578063dabd396d14610ade57600080fd5b8063c6f0308c146109b3578063cf09e0d014610a3d578063d5d44d8014610a5e57600080fd5b8063a445ece611610143578063bcef3b551161011d578063bcef3b5514610933578063bd8da95614610973578063c395e1ca1461099357600080fd5b8063a445ece6146107f3578063a8e4fb90146108bf578063bbdc02db146108f257600080fd5b80638980e0cc116101745780638980e0cc1461076b5780638b85902b146107805780638d450a95146107c057600080fd5b806370872aa51461073b5780637b0f0adc146107505780638129fc1c1461076357600080fd5b80633fc8cef31161025e5780635c0cba33116102075780636361506d116101e15780636361506d146106b55780636b6716c0146106f55780636f0344091461072857600080fd5b80635c0cba331461064d578063609d33341461068057806360e274641461069557600080fd5b806354fd4d501161023857806354fd4d50146105a757806357da950e146105fd5780635a5fa2d91461062d57600080fd5b80633fc8cef31461052e578063472777c614610561578063534db0e21461057457600080fd5b80632810e1d6116102c057806337b1b2291161029a57806337b1b2291461047b5780633a768463146104bb5780633e3ac912146104ee57600080fd5b80632810e1d6146103f45780632ad69aeb1461040957806330dbe5701461042957600080fd5b806319effeb4116102f157806319effeb41461034f578063200d2ed21461039a57806325fc2ace146103d557600080fd5b8063019351301461030d57806303c2924d1461032f575b600080fd5b34801561031957600080fd5b5061032d6103283660046155a8565b610c1b565b005b34801561033b57600080fd5b5061032d61034a366004615603565b610f3c565b34801561035b57600080fd5b5060005461037c9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156103a657600080fd5b506000546103c890700100000000000000000000000000000000900460ff1681565b6040516103919190615654565b3480156103e157600080fd5b506008545b604051908152602001610391565b34801561040057600080fd5b506103c86115e2565b34801561041557600080fd5b506103e6610424366004615603565b611887565b34801561043557600080fd5b506001546104569073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610391565b34801561048757600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610456565b3480156104c757600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610456565b3480156104fa57600080fd5b5060005461051e907201000000000000000000000000000000000000900460ff1681565b6040519015158152602001610391565b34801561053a57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610456565b61032d61056f366004615695565b6118bd565b34801561058057600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610456565b3480156105b357600080fd5b506105f06040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b604051610391919061572c565b34801561060957600080fd5b50600854600954610618919082565b60408051928352602083019190915201610391565b34801561063957600080fd5b506103e661064836600461573f565b6118cf565b34801561065957600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610456565b34801561068c57600080fd5b506105f0611909565b3480156106a157600080fd5b5061032d6106b036600461577d565b611917565b3480156106c157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103e6565b34801561070157600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061037c565b61032d6107363660046157af565b611abe565b34801561074757600080fd5b506009546103e6565b61032d61075e366004615695565b611b7f565b61032d611b8c565b34801561077757600080fd5b506002546103e6565b34801561078c57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103e6565b3480156107cc57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103e6565b3480156107ff57600080fd5b5061086b61080e36600461573f565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff166060820152608001610391565b3480156108cb57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610456565b3480156108fe57600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610391565b34801561093f57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103e6565b34801561097f57600080fd5b5061037c61098e36600461573f565b611c05565b34801561099f57600080fd5b506103e66109ae3660046157ee565b611de4565b3480156109bf57600080fd5b506109d36109ce36600461573f565b611fc7565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610391565b348015610a4957600080fd5b5060005461037c9067ffffffffffffffff1681565b348015610a6a57600080fd5b506103e6610a7936600461577d565b60036020526000908152604090205481565b348015610a9757600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103e6565b348015610aca57600080fd5b5061032d610ad9366004615820565b61205e565b348015610aea57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061037c565b348015610b1d57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103e6565b348015610b5057600080fd5b5061051e610b5f36600461573f565b60046020526000908152604090205460ff1681565b348015610b8057600080fd5b5061032d610b8f366004615695565b612123565b348015610ba057600080fd5b50610ba9612575565b604051610391939291906158aa565b348015610bc457600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103e6565b348015610bf757600080fd5b5061051e610c0636600461573f565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610c4757610c47615625565b14610c7e576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610cd1576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d08367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610d1f610d1a368690038601866158fe565b6125d5565b14610d56576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610d6b92919061598b565b604051809103902014610daa576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610df3610dee84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061263192505050565b61269e565b90506000610e1a82600881518110610e0d57610e0d61599b565b6020026020010151612854565b9050602081511115610e58576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610ecd576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610f6857610f68615625565b14610f9f576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610fb457610fb461599b565b906000526020600020906005020190506000610fcf84611c05565b905067ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081169082161015611038576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611081576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561109e57508515155b15611139578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110d157816110ed565b600186015473ffffffffffffffffffffffffffffffffffffffff165b90506110f98187612908565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff1660608301526111dc576fffffffffffffffffffffffffffffffff60408201526001815260008690036111dc578195505b600086826020015163ffffffff166111f491906159f9565b905060008382116112055781611207565b835b602084015190915063ffffffff165b818110156113535760008682815481106112325761123261599b565b6000918252602080832090910154808352600690915260409091205490915060ff1661128a576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061129f5761129f61599b565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112fc5750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b1561133e57600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b5050808061134b90615a11565b915050611216565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909316929092179091558490036115d757606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055891580156114d357506000547201000000000000000000000000000000000000900460ff165b156115485760015473ffffffffffffffffffffffffffffffffffffffff166114fb818a612908565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff9091161788556115d5565b61158f73ffffffffffffffffffffffffffffffffffffffff82161561156d5781611589565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89612908565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff16600281111561161057611610615625565b14611647576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff166116ab576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660026000815481106116d7576116d761599b565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611712576001611715565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff909116177001000000000000000000000000000000008360028111156117c6576117c6615625565b0217905560028111156117db576117db615625565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561186c57600080fd5b505af1158015611880573d6000803e3d6000fd5b5050505090565b600560205281600052604060002081815481106118a357600080fd5b90600052602060002001600091509150505481565b905090565b6118ca8383836001611abe565b505050565b6000818152600760209081526040808320600590925282208054825461190090610100900463ffffffff1682615a49565b95945050505050565b60606118b860546020612a09565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604081208054908290559081900361197c576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063f3fef3a390604401600060405180830381600087803b158015611a0c57600080fd5b505af1158015611a20573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a7e576040519150601f19603f3d011682016040523d82523d6000602084013e611a83565b606091505b50509050806118ca576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161480611b3757503373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016145b611b6d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7984848484612a5b565b50505050565b6118ca8383836000611abe565b3273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614611bfb576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c036133fc565b565b600080600054700100000000000000000000000000000000900460ff166002811115611c3357611c33615625565b14611c6a576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110611c7f57611c7f61599b565b600091825260208220600590910201805490925063ffffffff90811614611cee57815460028054909163ffffffff16908110611cbd57611cbd61599b565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090611d2690700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b611d3a9067ffffffffffffffff1642615a49565b611d59611d19846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16611d6d91906159f9565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff168167ffffffffffffffff1611611dba5780611900565b7f000000000000000000000000000000000000000000000000000000000000000095945050505050565b600080611e83836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000000811115611ee2576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000611efd8383615a8f565b9050670de0b6b3a76400006000611f34827f0000000000000000000000000000000000000000000000000000000000000000615aa3565b90506000611f52611f4d670de0b6b3a764000086615aa3565b613955565b90506000611f608484613bb0565b90506000611f6e8383613bff565b90506000611f7b82613c2d565b90506000611f9a82611f95670de0b6b3a76400008f615aa3565b613e15565b90506000611fa88b83613bff565b9050611fb4818d615aa3565b9f9e505050505050505050505050505050565b60028181548110611fd757600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614806120d757503373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016145b61210d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61211b868686868686613e4f565b505050505050565b60008054700100000000000000000000000000000000900460ff16600281111561214f5761214f615625565b14612186576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000806121958661447e565b935093509350935060006121ab85858585614887565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561221a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223e9190615ae0565b9050600189036123365773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8461229a367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af115801561230c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123309190615afd565b506115d7565b600289036123625773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848961229a565b6003890361238e5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848761229a565b600489036124aa5760006123d46fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000000614941565b6009546123e191906159f9565b6123ec9060016159f9565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561247f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a39190615afd565b50506115d7565b60058903612543576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000000060c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a4016122ed565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560606125ce611909565b9050909192565b60008160000151826020015183604001518460600151604051602001612614949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60408051808201909152600080825260208201528151600003612680576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b606060008060006126ae856149ef565b9194509250905060018160018111156126c9576126c9615625565b14612700576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845161270c83856159f9565b14612743576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b604080518082019091526000808252602082015281526020019060019003908161275a5790505093506000835b8651811015612848576000806127cd6040518060400160405280858c600001516127b19190615a49565b8152602001858c602001516127c691906159f9565b90526149ef565b5091509150604051806040016040528083836127e991906159f9565b8152602001848b602001516127fe91906159f9565b8152508885815181106128135761281361599b565b60209081029190910101526128296001856159f9565b935061283581836159f9565b61283f90846159f9565b92505050612787565b50845250919392505050565b60606000806000612864856149ef565b91945092509050600081600181111561287f5761287f615625565b146128b6576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128c082846159f9565b8551146128f9576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61190085602001518484614e8d565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff909316928392906129579084906159f9565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690637eee288d90604401600060405180830381600087803b1580156129ec57600080fd5b505af1158015612a00573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b60008054700100000000000000000000000000000000900460ff166002811115612a8757612a87615625565b14612abe576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110612ad357612ad361599b565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514612bba576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000612c7a826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580612cb55750612cb27f000000000000000000000000000000000000000000000000000000000000000060026159f9565b81145b8015612cbf575084155b15612cf6576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015612d1c575086155b15612d53576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115612dad576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dd87f000000000000000000000000000000000000000000000000000000000000000060016159f9565b8103612dea57612dea86888588614f22565b34612df483611de4565b14612e2b576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612e3688611c05565b905067ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811690821603612e9e576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016612efe9190615b16565b67ffffffffffffffff16612f198267ffffffffffffffff1690565b67ffffffffffffffff161115612ffb576000612f5660017f0000000000000000000000000000000000000000000000000000000000000000615a49565b8314612f8c5767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016612fc1565b612fc17f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff166002615b3f565b9050612ff7817f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16615b16565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526004602052604090205490915060ff1615613079576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008b8152602001908152602001600020600160028054905061330f9190615a49565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263d0e30db09234926004808301939282900301818588803b1580156133a757600080fd5b505af11580156133bb573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b60005471010000000000000000000000000000000000900460ff161561344e576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000000166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690637258a807906024016040805180830381865afa158015613502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135269190615b6f565b909250905081613562576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461359557639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401351161362f576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f00000000000000000000000000000000000000000000000000000000000000009092169363d0e30db093926004828101939282900301818588803b15801561390457600080fd5b505af1158015613918573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b17600082136139b457631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a764000002158202613bed57637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b600081600019048311820215613c1d5763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d78213613c5b57919050565b680755bf798b4a1bf1e58212613c795763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000613e46670de0b6b3a764000083613e2d86613955565b613e379190615b93565b613e419190615c4f565b613c2d565b90505b92915050565b60008054700100000000000000000000000000000000900460ff166002811115613e7b57613e7b615625565b14613eb2576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110613ec757613ec761599b565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050613f267f000000000000000000000000000000000000000000000000000000000000000060016159f9565b613fc2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614613ffc576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156140f35761404f7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000615a49565b6001901b61406e846fffffffffffffffffffffffffffffffff166150d3565b6fffffffffffffffffffffffffffffffff1661408a9190615cb7565b156140c7576140be6140af60016fffffffffffffffffffffffffffffffff8716615ccb565b865463ffffffff166000615172565b600301546140e9565b7f00000000000000000000000000000000000000000000000000000000000000005b915084905061411d565b6003850154915061411a6140af6fffffffffffffffffffffffffffffffff86166001615cf4565b90505b600882901b60088a8a60405161413492919061598b565b6040518091039020901b14614175576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006141808c615256565b9050600061418f836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e14ced3290614209908f908f908f908f908a90600401615d71565b6020604051808303816000875af1158015614228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061424c9190615afd565b6004850154911491506000906002906142f7906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b614393896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b61439d9190615dab565b6143a79190615dce565b60ff1615905081151581036143e8576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff161561443f576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b600080600080600085905060006002828154811061449e5761449e61599b565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000000090614575906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116145af576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000090614676906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156146eb57825463ffffffff166146b57f000000000000000000000000000000000000000000000000000000000000000060016159f9565b83036146bf578391505b600281815481106146d2576146d261599b565b90600052602060002090600502019350809450506145b3565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661475461473f856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561482357600061478c836fffffffffffffffffffffffffffffffff166150d3565b6fffffffffffffffffffffffffffffffff1611156147f75760006147ce6147c660016fffffffffffffffffffffffffffffffff8616615ccb565b896001615172565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506147fd9050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614879565b60006148456147c66fffffffffffffffffffffffffffffffff85166001615cf4565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff8416156148f45760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611900565b82826040516020016149229291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b6000806149ce847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614a32576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614a57576000600160009450945094505050614e86565b60b78111614b6d576000614a6c608083615a49565b905080876000015111614aab576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614b2357507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614b5a576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614e86915050565b60bf8111614ccb576000614b8260b783615a49565b905080876000015111614bc1576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614c23576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614c6b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614c7581846159f9565b895111614cae576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614cb98360016159f9565b9750955060009450614e869350505050565b60f78111614d30576000614ce060c083615a49565b905080876000015111614d1f576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614e86915050565b6000614d3d60f783615a49565b905080876000015111614d7c576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614dde576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614e26576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e3081846159f9565b895111614e69576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e748360016159f9565b9750955060019450614e869350505050565b9193909250565b60608167ffffffffffffffff811115614ea857614ea86158cf565b6040519080825280601f01601f191660200182016040528015614ed2576020820181803683370190505b5090508115614f1b576000614ee784866159f9565b90506020820160005b84811015614f08578281015182820152602001614ef0565b84811115614f17576000858301525b5050505b9392505050565b6000614f416fffffffffffffffffffffffffffffffff84166001615cf4565b90506000614f5182866001615172565b9050600086901a838061503d5750614f8a60027f0000000000000000000000000000000000000000000000000000000000000000615cb7565b600483015460029061502e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6150389190615dce565b60ff16145b156150955760ff811660011480615057575060ff81166002145b615090576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401613626565b612a00565b60ff811615612a00576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401613626565b600080615160837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b600080826151bb576151b66fffffffffffffffffffffffffffffffff86167f0000000000000000000000000000000000000000000000000000000000000000615285565b6151d6565b6151d6856fffffffffffffffffffffffffffffffff16615411565b9050600284815481106151eb576151eb61599b565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461524e57815460028054909163ffffffff169081106152395761523961599b565b906000526020600020906005020191506151fc565b509392505050565b60008060008060006152678661447e565b935093509350935061527b84848484614887565b9695505050505050565b600081615324846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff161161533a5763b34b5c226000526004601cfd5b61534383615411565b9050816153e2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611613e4957613e466153f88360016159f9565b6fffffffffffffffffffffffffffffffff8316906154b6565b600081196001830116816154a5827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b600080615543847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f84011261557157600080fd5b50813567ffffffffffffffff81111561558957600080fd5b6020830191508360208285010111156155a157600080fd5b9250929050565b600080600083850360a08112156155be57600080fd5b60808112156155cc57600080fd5b50839250608084013567ffffffffffffffff8111156155ea57600080fd5b6155f68682870161555f565b9497909650939450505050565b6000806040838503121561561657600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061568f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806000606084860312156156aa57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b818110156156e7576020818501810151868301820152016156cb565b818111156156f9576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613e4660208301846156c1565b60006020828403121561575157600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461577a57600080fd5b50565b60006020828403121561578f57600080fd5b8135614f1b81615758565b803580151581146157aa57600080fd5b919050565b600080600080608085870312156157c557600080fd5b8435935060208501359250604085013591506157e36060860161579a565b905092959194509250565b60006020828403121561580057600080fd5b81356fffffffffffffffffffffffffffffffff81168114614f1b57600080fd5b6000806000806000806080878903121561583957600080fd5b863595506158496020880161579a565b9450604087013567ffffffffffffffff8082111561586657600080fd5b6158728a838b0161555f565b9096509450606089013591508082111561588b57600080fd5b5061589889828a0161555f565b979a9699509497509295939492505050565b63ffffffff8416815282602082015260606040820152600061190060608301846156c1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561591057600080fd5b6040516080810181811067ffffffffffffffff8211171561595a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115615a0c57615a0c6159ca565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a4257615a426159ca565b5060010190565b600082821015615a5b57615a5b6159ca565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615a9e57615a9e615a60565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615adb57615adb6159ca565b500290565b600060208284031215615af257600080fd5b8151614f1b81615758565b600060208284031215615b0f57600080fd5b5051919050565b600067ffffffffffffffff83811690831681811015615b3757615b376159ca565b039392505050565b600067ffffffffffffffff80831681851681830481118215151615615b6657615b666159ca565b02949350505050565b60008060408385031215615b8257600080fd5b505080516020909101519092909150565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615bd457615bd46159ca565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615c0f57615c0f6159ca565b60008712925087820587128484161615615c2b57615c2b6159ca565b87850587128184161615615c4157615c416159ca565b505050929093029392505050565b600082615c5e57615c5e615a60565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615cb257615cb26159ca565b500590565b600082615cc657615cc6615a60565b500690565b60006fffffffffffffffffffffffffffffffff83811690831681811015615b3757615b376159ca565b60006fffffffffffffffffffffffffffffffff808316818516808303821115615d1f57615d1f6159ca565b01949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b606081526000615d85606083018789615d28565b8281036020840152615d98818688615d28565b9150508260408301529695505050505050565b600060ff821660ff841680821015615dc557615dc56159ca565b90039392505050565b600060ff831680615de157615de1615a60565b8060ff8416069150509291505056fea164736f6c634300080f000a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b0000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d407730000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df99000000000000000000000000000000000000000000000000000000000000038500000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c80000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63", - "deployedCode": "0x6080604052600436106103085760003560e01c806370872aa51161019a578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b94578063fa315aa914610bb8578063fe2bbeb214610beb57600080fd5b8063ec5e630814610b11578063eff0f59214610b44578063f8f43ff614610b7457600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a8b578063d8cc1a3c14610abe578063dabd396d14610ade57600080fd5b8063c6f0308c146109b3578063cf09e0d014610a3d578063d5d44d8014610a5e57600080fd5b8063a445ece611610143578063bcef3b551161011d578063bcef3b5514610933578063bd8da95614610973578063c395e1ca1461099357600080fd5b8063a445ece6146107f3578063a8e4fb90146108bf578063bbdc02db146108f257600080fd5b80638980e0cc116101745780638980e0cc1461076b5780638b85902b146107805780638d450a95146107c057600080fd5b806370872aa51461073b5780637b0f0adc146107505780638129fc1c1461076357600080fd5b80633fc8cef31161025e5780635c0cba33116102075780636361506d116101e15780636361506d146106b55780636b6716c0146106f55780636f0344091461072857600080fd5b80635c0cba331461064d578063609d33341461068057806360e274641461069557600080fd5b806354fd4d501161023857806354fd4d50146105a757806357da950e146105fd5780635a5fa2d91461062d57600080fd5b80633fc8cef31461052e578063472777c614610561578063534db0e21461057457600080fd5b80632810e1d6116102c057806337b1b2291161029a57806337b1b2291461047b5780633a768463146104bb5780633e3ac912146104ee57600080fd5b80632810e1d6146103f45780632ad69aeb1461040957806330dbe5701461042957600080fd5b806319effeb4116102f157806319effeb41461034f578063200d2ed21461039a57806325fc2ace146103d557600080fd5b8063019351301461030d57806303c2924d1461032f575b600080fd5b34801561031957600080fd5b5061032d6103283660046155a8565b610c1b565b005b34801561033b57600080fd5b5061032d61034a366004615603565b610f3c565b34801561035b57600080fd5b5060005461037c9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156103a657600080fd5b506000546103c890700100000000000000000000000000000000900460ff1681565b6040516103919190615654565b3480156103e157600080fd5b506008545b604051908152602001610391565b34801561040057600080fd5b506103c86115e2565b34801561041557600080fd5b506103e6610424366004615603565b611887565b34801561043557600080fd5b506001546104569073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610391565b34801561048757600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610456565b3480156104c757600080fd5b507f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d40773610456565b3480156104fa57600080fd5b5060005461051e907201000000000000000000000000000000000000900460ff1681565b6040519015158152602001610391565b34801561053a57600080fd5b507f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d610456565b61032d61056f366004615695565b6118bd565b34801561058057600080fd5b507f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63610456565b3480156105b357600080fd5b506105f06040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b604051610391919061572c565b34801561060957600080fd5b50600854600954610618919082565b60408051928352602083019190915201610391565b34801561063957600080fd5b506103e661064836600461573f565b6118cf565b34801561065957600080fd5b507f00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df99610456565b34801561068c57600080fd5b506105f0611909565b3480156106a157600080fd5b5061032d6106b036600461577d565b611917565b3480156106c157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103e6565b34801561070157600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061037c565b61032d6107363660046157af565b611abe565b34801561074757600080fd5b506009546103e6565b61032d61075e366004615695565b611b7f565b61032d611b8c565b34801561077757600080fd5b506002546103e6565b34801561078c57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103e6565b3480156107cc57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103e6565b3480156107ff57600080fd5b5061086b61080e36600461573f565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff166060820152608001610391565b3480156108cb57600080fd5b507f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8610456565b3480156108fe57600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000001168152602001610391565b34801561093f57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103e6565b34801561097f57600080fd5b5061037c61098e36600461573f565b611c05565b34801561099f57600080fd5b506103e66109ae3660046157ee565b611de4565b3480156109bf57600080fd5b506109d36109ce36600461573f565b611fc7565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610391565b348015610a4957600080fd5b5060005461037c9067ffffffffffffffff1681565b348015610a6a57600080fd5b506103e6610a7936600461577d565b60036020526000908152604090205481565b348015610a9757600080fd5b507f00000000000000000000000000000000000000000000000000000000000003856103e6565b348015610aca57600080fd5b5061032d610ad9366004615820565b61205e565b348015610aea57600080fd5b507f00000000000000000000000000000000000000000000000000000000000004b061037c565b348015610b1d57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000046103e6565b348015610b5057600080fd5b5061051e610b5f36600461573f565b60046020526000908152604090205460ff1681565b348015610b8057600080fd5b5061032d610b8f366004615695565b612123565b348015610ba057600080fd5b50610ba9612575565b604051610391939291906158aa565b348015610bc457600080fd5b507f00000000000000000000000000000000000000000000000000000000000000086103e6565b348015610bf757600080fd5b5061051e610c0636600461573f565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610c4757610c47615625565b14610c7e576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610cd1576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d08367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610d1f610d1a368690038601866158fe565b6125d5565b14610d56576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610d6b92919061598b565b604051809103902014610daa576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610df3610dee84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061263192505050565b61269e565b90506000610e1a82600881518110610e0d57610e0d61599b565b6020026020010151612854565b9050602081511115610e58576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610ecd576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610f6857610f68615625565b14610f9f576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610fb457610fb461599b565b906000526020600020906005020190506000610fcf84611c05565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b081169082161015611038576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611081576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561109e57508515155b15611139578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110d157816110ed565b600186015473ffffffffffffffffffffffffffffffffffffffff165b90506110f98187612908565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff1660608301526111dc576fffffffffffffffffffffffffffffffff60408201526001815260008690036111dc578195505b600086826020015163ffffffff166111f491906159f9565b905060008382116112055781611207565b835b602084015190915063ffffffff165b818110156113535760008682815481106112325761123261599b565b6000918252602080832090910154808352600690915260409091205490915060ff1661128a576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061129f5761129f61599b565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112fc5750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b1561133e57600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b5050808061134b90615a11565b915050611216565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909316929092179091558490036115d757606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055891580156114d357506000547201000000000000000000000000000000000000900460ff165b156115485760015473ffffffffffffffffffffffffffffffffffffffff166114fb818a612908565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff9091161788556115d5565b61158f73ffffffffffffffffffffffffffffffffffffffff82161561156d5781611589565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89612908565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff16600281111561161057611610615625565b14611647576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff166116ab576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660026000815481106116d7576116d761599b565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611712576001611715565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff909116177001000000000000000000000000000000008360028111156117c6576117c6615625565b0217905560028111156117db576117db615625565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df9973ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561186c57600080fd5b505af1158015611880573d6000803e3d6000fd5b5050505090565b600560205281600052604060002081815481106118a357600080fd5b90600052602060002001600091509150505481565b905090565b6118ca8383836001611abe565b505050565b6000818152600760209081526040808320600590925282208054825461190090610100900463ffffffff1682615a49565b95945050505050565b60606118b860546020612a09565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604081208054908290559081900361197c576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d169063f3fef3a390604401600060405180830381600087803b158015611a0c57600080fd5b505af1158015611a20573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a7e576040519150601f19603f3d011682016040523d82523d6000602084013e611a83565b606091505b50509050806118ca576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8161480611b3757503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b6316145b611b6d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7984848484612a5b565b50505050565b6118ca8383836000611abe565b3273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614611bfb576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c036133fc565b565b600080600054700100000000000000000000000000000000900460ff166002811115611c3357611c33615625565b14611c6a576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110611c7f57611c7f61599b565b600091825260208220600590910201805490925063ffffffff90811614611cee57815460028054909163ffffffff16908110611cbd57611cbd61599b565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090611d2690700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b611d3a9067ffffffffffffffff1642615a49565b611d59611d19846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16611d6d91906159f9565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b01667ffffffffffffffff168167ffffffffffffffff1611611dba5780611900565b7f00000000000000000000000000000000000000000000000000000000000004b095945050505050565b600080611e83836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000008811115611ee2576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000611efd8383615a8f565b9050670de0b6b3a76400006000611f34827f0000000000000000000000000000000000000000000000000000000000000008615aa3565b90506000611f52611f4d670de0b6b3a764000086615aa3565b613955565b90506000611f608484613bb0565b90506000611f6e8383613bff565b90506000611f7b82613c2d565b90506000611f9a82611f95670de0b6b3a76400008f615aa3565b613e15565b90506000611fa88b83613bff565b9050611fb4818d615aa3565b9f9e505050505050505050505050505050565b60028181548110611fd757600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614806120d757503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b6316145b61210d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61211b868686868686613e4f565b505050505050565b60008054700100000000000000000000000000000000900460ff16600281111561214f5761214f615625565b14612186576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000806121958661447e565b935093509350935060006121ab85858585614887565b905060007f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d4077373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561221a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223e9190615ae0565b9050600189036123365773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8461229a367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af115801561230c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123309190615afd565b506115d7565b600289036123625773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848961229a565b6003890361238e5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848761229a565b600489036124aa5760006123d46fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000004614941565b6009546123e191906159f9565b6123ec9060016159f9565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561247f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a39190615afd565b50506115d7565b60058903612543576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000038560c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a4016122ed565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000001367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560606125ce611909565b9050909192565b60008160000151826020015183604001518460600151604051602001612614949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60408051808201909152600080825260208201528151600003612680576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b606060008060006126ae856149ef565b9194509250905060018160018111156126c9576126c9615625565b14612700576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845161270c83856159f9565b14612743576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b604080518082019091526000808252602082015281526020019060019003908161275a5790505093506000835b8651811015612848576000806127cd6040518060400160405280858c600001516127b19190615a49565b8152602001858c602001516127c691906159f9565b90526149ef565b5091509150604051806040016040528083836127e991906159f9565b8152602001848b602001516127fe91906159f9565b8152508885815181106128135761281361599b565b60209081029190910101526128296001856159f9565b935061283581836159f9565b61283f90846159f9565b92505050612787565b50845250919392505050565b60606000806000612864856149ef565b91945092509050600081600181111561287f5761287f615625565b146128b6576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128c082846159f9565b8551146128f9576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61190085602001518484614e8d565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff909316928392906129579084906159f9565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d1690637eee288d90604401600060405180830381600087803b1580156129ec57600080fd5b505af1158015612a00573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b60008054700100000000000000000000000000000000900460ff166002811115612a8757612a87615625565b14612abe576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110612ad357612ad361599b565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514612bba576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000612c7a826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580612cb55750612cb27f000000000000000000000000000000000000000000000000000000000000000460026159f9565b81145b8015612cbf575084155b15612cf6576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015612d1c575086155b15612d53576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000008811115612dad576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dd87f000000000000000000000000000000000000000000000000000000000000000460016159f9565b8103612dea57612dea86888588614f22565b34612df483611de4565b14612e2b576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612e3688611c05565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b0811690821603612e9e576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b016612efe9190615b16565b67ffffffffffffffff16612f198267ffffffffffffffff1690565b67ffffffffffffffff161115612ffb576000612f5660017f0000000000000000000000000000000000000000000000000000000000000004615a49565b8314612f8c5767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016612fc1565b612fc17f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff166002615b3f565b9050612ff7817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff16615b16565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526004602052604090205490915060ff1615613079576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008b8152602001908152602001600020600160028054905061330f9190615a49565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d169263d0e30db09234926004808301939282900301818588803b1580156133a757600080fd5b505af11580156133bb573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b60005471010000000000000000000000000000000000900460ff161561344e576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000001166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df991690637258a807906024016040805180830381865afa158015613502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135269190615b6f565b909250905081613562576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461359557639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401351161362f576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d9092169363d0e30db093926004828101939282900301818588803b15801561390457600080fd5b505af1158015613918573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b17600082136139b457631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a764000002158202613bed57637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b600081600019048311820215613c1d5763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d78213613c5b57919050565b680755bf798b4a1bf1e58212613c795763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000613e46670de0b6b3a764000083613e2d86613955565b613e379190615b93565b613e419190615c4f565b613c2d565b90505b92915050565b60008054700100000000000000000000000000000000900460ff166002811115613e7b57613e7b615625565b14613eb2576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110613ec757613ec761599b565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050613f267f000000000000000000000000000000000000000000000000000000000000000860016159f9565b613fc2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614613ffc576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156140f35761404f7f00000000000000000000000000000000000000000000000000000000000000047f0000000000000000000000000000000000000000000000000000000000000008615a49565b6001901b61406e846fffffffffffffffffffffffffffffffff166150d3565b6fffffffffffffffffffffffffffffffff1661408a9190615cb7565b156140c7576140be6140af60016fffffffffffffffffffffffffffffffff8716615ccb565b865463ffffffff166000615172565b600301546140e9565b7f00000000000000000000000000000000000000000000000000000000000000005b915084905061411d565b6003850154915061411a6140af6fffffffffffffffffffffffffffffffff86166001615cf4565b90505b600882901b60088a8a60405161413492919061598b565b6040518091039020901b14614175576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006141808c615256565b9050600061418f836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d4077373ffffffffffffffffffffffffffffffffffffffff169063e14ced3290614209908f908f908f908f908a90600401615d71565b6020604051808303816000875af1158015614228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061424c9190615afd565b6004850154911491506000906002906142f7906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b614393896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b61439d9190615dab565b6143a79190615dce565b60ff1615905081151581036143e8576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff161561443f576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b600080600080600085905060006002828154811061449e5761449e61599b565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000000490614575906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116145af576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000490614676906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156146eb57825463ffffffff166146b57f000000000000000000000000000000000000000000000000000000000000000460016159f9565b83036146bf578391505b600281815481106146d2576146d261599b565b90600052602060002090600502019350809450506145b3565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661475461473f856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561482357600061478c836fffffffffffffffffffffffffffffffff166150d3565b6fffffffffffffffffffffffffffffffff1611156147f75760006147ce6147c660016fffffffffffffffffffffffffffffffff8616615ccb565b896001615172565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506147fd9050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614879565b60006148456147c66fffffffffffffffffffffffffffffffff85166001615cf4565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff8416156148f45760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611900565b82826040516020016149229291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b6000806149ce847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614a32576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614a57576000600160009450945094505050614e86565b60b78111614b6d576000614a6c608083615a49565b905080876000015111614aab576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614b2357507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614b5a576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614e86915050565b60bf8111614ccb576000614b8260b783615a49565b905080876000015111614bc1576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614c23576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614c6b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614c7581846159f9565b895111614cae576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614cb98360016159f9565b9750955060009450614e869350505050565b60f78111614d30576000614ce060c083615a49565b905080876000015111614d1f576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614e86915050565b6000614d3d60f783615a49565b905080876000015111614d7c576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614dde576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614e26576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e3081846159f9565b895111614e69576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e748360016159f9565b9750955060019450614e869350505050565b9193909250565b60608167ffffffffffffffff811115614ea857614ea86158cf565b6040519080825280601f01601f191660200182016040528015614ed2576020820181803683370190505b5090508115614f1b576000614ee784866159f9565b90506020820160005b84811015614f08578281015182820152602001614ef0565b84811115614f17576000858301525b5050505b9392505050565b6000614f416fffffffffffffffffffffffffffffffff84166001615cf4565b90506000614f5182866001615172565b9050600086901a838061503d5750614f8a60027f0000000000000000000000000000000000000000000000000000000000000004615cb7565b600483015460029061502e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6150389190615dce565b60ff16145b156150955760ff811660011480615057575060ff81166002145b615090576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401613626565b612a00565b60ff811615612a00576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401613626565b600080615160837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b600080826151bb576151b66fffffffffffffffffffffffffffffffff86167f0000000000000000000000000000000000000000000000000000000000000004615285565b6151d6565b6151d6856fffffffffffffffffffffffffffffffff16615411565b9050600284815481106151eb576151eb61599b565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461524e57815460028054909163ffffffff169081106152395761523961599b565b906000526020600020906005020191506151fc565b509392505050565b60008060008060006152678661447e565b935093509350935061527b84848484614887565b9695505050505050565b600081615324846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff161161533a5763b34b5c226000526004601cfd5b61534383615411565b9050816153e2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611613e4957613e466153f88360016159f9565b6fffffffffffffffffffffffffffffffff8316906154b6565b600081196001830116816154a5827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b600080615543847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f84011261557157600080fd5b50813567ffffffffffffffff81111561558957600080fd5b6020830191508360208285010111156155a157600080fd5b9250929050565b600080600083850360a08112156155be57600080fd5b60808112156155cc57600080fd5b50839250608084013567ffffffffffffffff8111156155ea57600080fd5b6155f68682870161555f565b9497909650939450505050565b6000806040838503121561561657600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061568f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806000606084860312156156aa57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b818110156156e7576020818501810151868301820152016156cb565b818111156156f9576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613e4660208301846156c1565b60006020828403121561575157600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461577a57600080fd5b50565b60006020828403121561578f57600080fd5b8135614f1b81615758565b803580151581146157aa57600080fd5b919050565b600080600080608085870312156157c557600080fd5b8435935060208501359250604085013591506157e36060860161579a565b905092959194509250565b60006020828403121561580057600080fd5b81356fffffffffffffffffffffffffffffffff81168114614f1b57600080fd5b6000806000806000806080878903121561583957600080fd5b863595506158496020880161579a565b9450604087013567ffffffffffffffff8082111561586657600080fd5b6158728a838b0161555f565b9096509450606089013591508082111561588b57600080fd5b5061589889828a0161555f565b979a9699509497509295939492505050565b63ffffffff8416815282602082015260606040820152600061190060608301846156c1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561591057600080fd5b6040516080810181811067ffffffffffffffff8211171561595a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115615a0c57615a0c6159ca565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a4257615a426159ca565b5060010190565b600082821015615a5b57615a5b6159ca565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615a9e57615a9e615a60565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615adb57615adb6159ca565b500290565b600060208284031215615af257600080fd5b8151614f1b81615758565b600060208284031215615b0f57600080fd5b5051919050565b600067ffffffffffffffff83811690831681811015615b3757615b376159ca565b039392505050565b600067ffffffffffffffff80831681851681830481118215151615615b6657615b666159ca565b02949350505050565b60008060408385031215615b8257600080fd5b505080516020909101519092909150565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615bd457615bd46159ca565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615c0f57615c0f6159ca565b60008712925087820587128484161615615c2b57615c2b6159ca565b87850587128184161615615c4157615c416159ca565b505050929093029392505050565b600082615c5e57615c5e615a60565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615cb257615cb26159ca565b500590565b600082615cc657615cc6615a60565b500690565b60006fffffffffffffffffffffffffffffffff83811690831681811015615b3757615b376159ca565b60006fffffffffffffffffffffffffffffffff808316818516808303821115615d1f57615d1f6159ca565b01949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b606081526000615d85606083018789615d28565b8281036020840152615d98818688615d28565b9150508260408301529695505050505050565b600060ff821660ff841680821015615dc557615dc56159ca565b90039392505050565b600060ff831680615de157615de1615a60565b8060ff8416069150509291505056fea164736f6c634300080f000a", + "data": "0x6102006040523480156200001257600080fd5b5060405162006269380380620062698339810160408190526200003591620001ac565b8b8b8b8b8b8b8b8b8b8b6200004d6001607e62000289565b60ff168811156200007157604051633beff19960e11b815260040160405180910390fd5b878710620000925760405163e62ccf3960e01b815260040160405180910390fd5b620000b1856001600160401b03166200017460201b62000d051760201c565b6001600160401b0316620000d9876001600160401b03166200017460201b62000d051760201c565b6001600160401b03161115620001025760405163235dfb2b60e21b815260040160405180910390fd5b63ffffffff9099166101205260809790975260a09590955260c0939093526001600160401b039182166101a0521660e0526001600160a01b03908116610100529081166101405290811661016052610180919091529182166101c052166101e05250620002bb98505050505050505050565b90565b80516001600160401b03811681146200018f57600080fd5b919050565b80516001600160a01b03811681146200018f57600080fd5b6000806000806000806000806000806000806101808d8f031215620001d057600080fd5b8c5163ffffffff81168114620001e557600080fd5b809c505060208d01519a5060408d0151995060608d015198506200020c60808e0162000177565b97506200021c60a08e0162000177565b96506200022c60c08e0162000194565b95506200023c60e08e0162000194565b94506200024d6101008e0162000194565b93506101208d01519250620002666101408e0162000194565b9150620002776101608e0162000194565b90509295989b509295989b509295989b565b600060ff821660ff841680821015620002b257634e487b7160e01b600052601160045260246000fd5b90039392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e051615dfd6200046c6000396000818161058301528181611b1501526120b50152600081816108ce01528181611ad601528181611ba4015261207601526000818161070401528181612ea901528181612f670152612f91015260008181610a9a01526124e801526000818161065c0152818161180601526134bc01526000818161053d015281816119c8015281816129a80152818161336201526138be01526000818161090901528181612577015261347b0152600081816104ca015281816121b101526141b7015260008181610aed01528181610fdc01528181611d7a01528181611dbc01528181612e4301528181612ed40152612fc9015260008181610b20015281816123b001528181612c8c01528181612db201528181612f320152818161400a015281816144b9015281816145ba0152818161468f01528181614f660152615192015260008181610bc701528181611e8a01528181611f1001528181612d5501528181613f00015261402b0152600081816107cf01526140c90152615dfd6000f3fe6080604052600436106103085760003560e01c806370872aa51161019a578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b94578063fa315aa914610bb8578063fe2bbeb214610beb57600080fd5b8063ec5e630814610b11578063eff0f59214610b44578063f8f43ff614610b7457600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a8b578063d8cc1a3c14610abe578063dabd396d14610ade57600080fd5b8063c6f0308c146109b3578063cf09e0d014610a3d578063d5d44d8014610a5e57600080fd5b8063a445ece611610143578063bcef3b551161011d578063bcef3b5514610933578063bd8da95614610973578063c395e1ca1461099357600080fd5b8063a445ece6146107f3578063a8e4fb90146108bf578063bbdc02db146108f257600080fd5b80638980e0cc116101745780638980e0cc1461076b5780638b85902b146107805780638d450a95146107c057600080fd5b806370872aa51461073b5780637b0f0adc146107505780638129fc1c1461076357600080fd5b80633fc8cef31161025e5780635c0cba33116102075780636361506d116101e15780636361506d146106b55780636b6716c0146106f55780636f0344091461072857600080fd5b80635c0cba331461064d578063609d33341461068057806360e274641461069557600080fd5b806354fd4d501161023857806354fd4d50146105a757806357da950e146105fd5780635a5fa2d91461062d57600080fd5b80633fc8cef31461052e578063472777c614610561578063534db0e21461057457600080fd5b80632810e1d6116102c057806337b1b2291161029a57806337b1b2291461047b5780633a768463146104bb5780633e3ac912146104ee57600080fd5b80632810e1d6146103f45780632ad69aeb1461040957806330dbe5701461042957600080fd5b806319effeb4116102f157806319effeb41461034f578063200d2ed21461039a57806325fc2ace146103d557600080fd5b8063019351301461030d57806303c2924d1461032f575b600080fd5b34801561031957600080fd5b5061032d6103283660046155a8565b610c1b565b005b34801561033b57600080fd5b5061032d61034a366004615603565b610f3c565b34801561035b57600080fd5b5060005461037c9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156103a657600080fd5b506000546103c890700100000000000000000000000000000000900460ff1681565b6040516103919190615654565b3480156103e157600080fd5b506008545b604051908152602001610391565b34801561040057600080fd5b506103c86115e2565b34801561041557600080fd5b506103e6610424366004615603565b611887565b34801561043557600080fd5b506001546104569073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610391565b34801561048757600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610456565b3480156104c757600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610456565b3480156104fa57600080fd5b5060005461051e907201000000000000000000000000000000000000900460ff1681565b6040519015158152602001610391565b34801561053a57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610456565b61032d61056f366004615695565b6118bd565b34801561058057600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610456565b3480156105b357600080fd5b506105f06040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b604051610391919061572c565b34801561060957600080fd5b50600854600954610618919082565b60408051928352602083019190915201610391565b34801561063957600080fd5b506103e661064836600461573f565b6118cf565b34801561065957600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610456565b34801561068c57600080fd5b506105f0611909565b3480156106a157600080fd5b5061032d6106b036600461577d565b611917565b3480156106c157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103e6565b34801561070157600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061037c565b61032d6107363660046157af565b611abe565b34801561074757600080fd5b506009546103e6565b61032d61075e366004615695565b611b7f565b61032d611b8c565b34801561077757600080fd5b506002546103e6565b34801561078c57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103e6565b3480156107cc57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103e6565b3480156107ff57600080fd5b5061086b61080e36600461573f565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff166060820152608001610391565b3480156108cb57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610456565b3480156108fe57600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610391565b34801561093f57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103e6565b34801561097f57600080fd5b5061037c61098e36600461573f565b611c05565b34801561099f57600080fd5b506103e66109ae3660046157ee565b611de4565b3480156109bf57600080fd5b506109d36109ce36600461573f565b611fc7565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610391565b348015610a4957600080fd5b5060005461037c9067ffffffffffffffff1681565b348015610a6a57600080fd5b506103e6610a7936600461577d565b60036020526000908152604090205481565b348015610a9757600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103e6565b348015610aca57600080fd5b5061032d610ad9366004615820565b61205e565b348015610aea57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061037c565b348015610b1d57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103e6565b348015610b5057600080fd5b5061051e610b5f36600461573f565b60046020526000908152604090205460ff1681565b348015610b8057600080fd5b5061032d610b8f366004615695565b612123565b348015610ba057600080fd5b50610ba9612575565b604051610391939291906158aa565b348015610bc457600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103e6565b348015610bf757600080fd5b5061051e610c0636600461573f565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610c4757610c47615625565b14610c7e576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610cd1576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d08367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610d1f610d1a368690038601866158fe565b6125d5565b14610d56576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610d6b92919061598b565b604051809103902014610daa576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610df3610dee84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061263192505050565b61269e565b90506000610e1a82600881518110610e0d57610e0d61599b565b6020026020010151612854565b9050602081511115610e58576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610ecd576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610f6857610f68615625565b14610f9f576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610fb457610fb461599b565b906000526020600020906005020190506000610fcf84611c05565b905067ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081169082161015611038576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611081576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561109e57508515155b15611139578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110d157816110ed565b600186015473ffffffffffffffffffffffffffffffffffffffff165b90506110f98187612908565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff1660608301526111dc576fffffffffffffffffffffffffffffffff60408201526001815260008690036111dc578195505b600086826020015163ffffffff166111f491906159f9565b905060008382116112055781611207565b835b602084015190915063ffffffff165b818110156113535760008682815481106112325761123261599b565b6000918252602080832090910154808352600690915260409091205490915060ff1661128a576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061129f5761129f61599b565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112fc5750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b1561133e57600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b5050808061134b90615a11565b915050611216565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909316929092179091558490036115d757606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055891580156114d357506000547201000000000000000000000000000000000000900460ff165b156115485760015473ffffffffffffffffffffffffffffffffffffffff166114fb818a612908565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff9091161788556115d5565b61158f73ffffffffffffffffffffffffffffffffffffffff82161561156d5781611589565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89612908565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff16600281111561161057611610615625565b14611647576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff166116ab576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660026000815481106116d7576116d761599b565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611712576001611715565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff909116177001000000000000000000000000000000008360028111156117c6576117c6615625565b0217905560028111156117db576117db615625565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561186c57600080fd5b505af1158015611880573d6000803e3d6000fd5b5050505090565b600560205281600052604060002081815481106118a357600080fd5b90600052602060002001600091509150505481565b905090565b6118ca8383836001611abe565b505050565b6000818152600760209081526040808320600590925282208054825461190090610100900463ffffffff1682615a49565b95945050505050565b60606118b860546020612a09565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604081208054908290559081900361197c576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063f3fef3a390604401600060405180830381600087803b158015611a0c57600080fd5b505af1158015611a20573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a7e576040519150601f19603f3d011682016040523d82523d6000602084013e611a83565b606091505b50509050806118ca576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161480611b3757503373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016145b611b6d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7984848484612a5b565b50505050565b6118ca8383836000611abe565b3273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614611bfb576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c036133fc565b565b600080600054700100000000000000000000000000000000900460ff166002811115611c3357611c33615625565b14611c6a576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110611c7f57611c7f61599b565b600091825260208220600590910201805490925063ffffffff90811614611cee57815460028054909163ffffffff16908110611cbd57611cbd61599b565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090611d2690700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b611d3a9067ffffffffffffffff1642615a49565b611d59611d19846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16611d6d91906159f9565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff168167ffffffffffffffff1611611dba5780611900565b7f000000000000000000000000000000000000000000000000000000000000000095945050505050565b600080611e83836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000000811115611ee2576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000611efd8383615a8f565b9050670de0b6b3a76400006000611f34827f0000000000000000000000000000000000000000000000000000000000000000615aa3565b90506000611f52611f4d670de0b6b3a764000086615aa3565b613955565b90506000611f608484613bb0565b90506000611f6e8383613bff565b90506000611f7b82613c2d565b90506000611f9a82611f95670de0b6b3a76400008f615aa3565b613e15565b90506000611fa88b83613bff565b9050611fb4818d615aa3565b9f9e505050505050505050505050505050565b60028181548110611fd757600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614806120d757503373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016145b61210d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61211b868686868686613e4f565b505050505050565b60008054700100000000000000000000000000000000900460ff16600281111561214f5761214f615625565b14612186576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000806121958661447e565b935093509350935060006121ab85858585614887565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561221a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223e9190615ae0565b9050600189036123365773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8461229a367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af115801561230c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123309190615afd565b506115d7565b600289036123625773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848961229a565b6003890361238e5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848761229a565b600489036124aa5760006123d46fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000000614941565b6009546123e191906159f9565b6123ec9060016159f9565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561247f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a39190615afd565b50506115d7565b60058903612543576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000000060c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a4016122ed565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560606125ce611909565b9050909192565b60008160000151826020015183604001518460600151604051602001612614949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60408051808201909152600080825260208201528151600003612680576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b606060008060006126ae856149ef565b9194509250905060018160018111156126c9576126c9615625565b14612700576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845161270c83856159f9565b14612743576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b604080518082019091526000808252602082015281526020019060019003908161275a5790505093506000835b8651811015612848576000806127cd6040518060400160405280858c600001516127b19190615a49565b8152602001858c602001516127c691906159f9565b90526149ef565b5091509150604051806040016040528083836127e991906159f9565b8152602001848b602001516127fe91906159f9565b8152508885815181106128135761281361599b565b60209081029190910101526128296001856159f9565b935061283581836159f9565b61283f90846159f9565b92505050612787565b50845250919392505050565b60606000806000612864856149ef565b91945092509050600081600181111561287f5761287f615625565b146128b6576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128c082846159f9565b8551146128f9576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61190085602001518484614e8d565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff909316928392906129579084906159f9565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690637eee288d90604401600060405180830381600087803b1580156129ec57600080fd5b505af1158015612a00573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b60008054700100000000000000000000000000000000900460ff166002811115612a8757612a87615625565b14612abe576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110612ad357612ad361599b565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514612bba576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000612c7a826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580612cb55750612cb27f000000000000000000000000000000000000000000000000000000000000000060026159f9565b81145b8015612cbf575084155b15612cf6576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015612d1c575086155b15612d53576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115612dad576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dd87f000000000000000000000000000000000000000000000000000000000000000060016159f9565b8103612dea57612dea86888588614f22565b34612df483611de4565b14612e2b576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612e3688611c05565b905067ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811690821603612e9e576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016612efe9190615b16565b67ffffffffffffffff16612f198267ffffffffffffffff1690565b67ffffffffffffffff161115612ffb576000612f5660017f0000000000000000000000000000000000000000000000000000000000000000615a49565b8314612f8c5767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016612fc1565b612fc17f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff166002615b3f565b9050612ff7817f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16615b16565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526004602052604090205490915060ff1615613079576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008b8152602001908152602001600020600160028054905061330f9190615a49565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263d0e30db09234926004808301939282900301818588803b1580156133a757600080fd5b505af11580156133bb573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b60005471010000000000000000000000000000000000900460ff161561344e576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000000166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690637258a807906024016040805180830381865afa158015613502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135269190615b6f565b909250905081613562576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461359557639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401351161362f576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f00000000000000000000000000000000000000000000000000000000000000009092169363d0e30db093926004828101939282900301818588803b15801561390457600080fd5b505af1158015613918573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b17600082136139b457631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a764000002158202613bed57637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b600081600019048311820215613c1d5763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d78213613c5b57919050565b680755bf798b4a1bf1e58212613c795763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000613e46670de0b6b3a764000083613e2d86613955565b613e379190615b93565b613e419190615c4f565b613c2d565b90505b92915050565b60008054700100000000000000000000000000000000900460ff166002811115613e7b57613e7b615625565b14613eb2576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110613ec757613ec761599b565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050613f267f000000000000000000000000000000000000000000000000000000000000000060016159f9565b613fc2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614613ffc576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156140f35761404f7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000615a49565b6001901b61406e846fffffffffffffffffffffffffffffffff166150d3565b6fffffffffffffffffffffffffffffffff1661408a9190615cb7565b156140c7576140be6140af60016fffffffffffffffffffffffffffffffff8716615ccb565b865463ffffffff166000615172565b600301546140e9565b7f00000000000000000000000000000000000000000000000000000000000000005b915084905061411d565b6003850154915061411a6140af6fffffffffffffffffffffffffffffffff86166001615cf4565b90505b600882901b60088a8a60405161413492919061598b565b6040518091039020901b14614175576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006141808c615256565b9050600061418f836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e14ced3290614209908f908f908f908f908a90600401615d71565b6020604051808303816000875af1158015614228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061424c9190615afd565b6004850154911491506000906002906142f7906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b614393896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b61439d9190615dab565b6143a79190615dce565b60ff1615905081151581036143e8576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff161561443f576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b600080600080600085905060006002828154811061449e5761449e61599b565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000000090614575906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116145af576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000090614676906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156146eb57825463ffffffff166146b57f000000000000000000000000000000000000000000000000000000000000000060016159f9565b83036146bf578391505b600281815481106146d2576146d261599b565b90600052602060002090600502019350809450506145b3565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661475461473f856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561482357600061478c836fffffffffffffffffffffffffffffffff166150d3565b6fffffffffffffffffffffffffffffffff1611156147f75760006147ce6147c660016fffffffffffffffffffffffffffffffff8616615ccb565b896001615172565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506147fd9050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614879565b60006148456147c66fffffffffffffffffffffffffffffffff85166001615cf4565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff8416156148f45760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611900565b82826040516020016149229291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b6000806149ce847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614a32576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614a57576000600160009450945094505050614e86565b60b78111614b6d576000614a6c608083615a49565b905080876000015111614aab576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614b2357507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614b5a576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614e86915050565b60bf8111614ccb576000614b8260b783615a49565b905080876000015111614bc1576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614c23576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614c6b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614c7581846159f9565b895111614cae576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614cb98360016159f9565b9750955060009450614e869350505050565b60f78111614d30576000614ce060c083615a49565b905080876000015111614d1f576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614e86915050565b6000614d3d60f783615a49565b905080876000015111614d7c576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614dde576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614e26576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e3081846159f9565b895111614e69576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e748360016159f9565b9750955060019450614e869350505050565b9193909250565b60608167ffffffffffffffff811115614ea857614ea86158cf565b6040519080825280601f01601f191660200182016040528015614ed2576020820181803683370190505b5090508115614f1b576000614ee784866159f9565b90506020820160005b84811015614f08578281015182820152602001614ef0565b84811115614f17576000858301525b5050505b9392505050565b6000614f416fffffffffffffffffffffffffffffffff84166001615cf4565b90506000614f5182866001615172565b9050600086901a838061503d5750614f8a60027f0000000000000000000000000000000000000000000000000000000000000000615cb7565b600483015460029061502e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6150389190615dce565b60ff16145b156150955760ff811660011480615057575060ff81166002145b615090576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401613626565b612a00565b60ff811615612a00576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401613626565b600080615160837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b600080826151bb576151b66fffffffffffffffffffffffffffffffff86167f0000000000000000000000000000000000000000000000000000000000000000615285565b6151d6565b6151d6856fffffffffffffffffffffffffffffffff16615411565b9050600284815481106151eb576151eb61599b565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461524e57815460028054909163ffffffff169081106152395761523961599b565b906000526020600020906005020191506151fc565b509392505050565b60008060008060006152678661447e565b935093509350935061527b84848484614887565b9695505050505050565b600081615324846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff161161533a5763b34b5c226000526004601cfd5b61534383615411565b9050816153e2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611613e4957613e466153f88360016159f9565b6fffffffffffffffffffffffffffffffff8316906154b6565b600081196001830116816154a5827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b600080615543847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f84011261557157600080fd5b50813567ffffffffffffffff81111561558957600080fd5b6020830191508360208285010111156155a157600080fd5b9250929050565b600080600083850360a08112156155be57600080fd5b60808112156155cc57600080fd5b50839250608084013567ffffffffffffffff8111156155ea57600080fd5b6155f68682870161555f565b9497909650939450505050565b6000806040838503121561561657600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061568f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806000606084860312156156aa57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b818110156156e7576020818501810151868301820152016156cb565b818111156156f9576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613e4660208301846156c1565b60006020828403121561575157600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461577a57600080fd5b50565b60006020828403121561578f57600080fd5b8135614f1b81615758565b803580151581146157aa57600080fd5b919050565b600080600080608085870312156157c557600080fd5b8435935060208501359250604085013591506157e36060860161579a565b905092959194509250565b60006020828403121561580057600080fd5b81356fffffffffffffffffffffffffffffffff81168114614f1b57600080fd5b6000806000806000806080878903121561583957600080fd5b863595506158496020880161579a565b9450604087013567ffffffffffffffff8082111561586657600080fd5b6158728a838b0161555f565b9096509450606089013591508082111561588b57600080fd5b5061589889828a0161555f565b979a9699509497509295939492505050565b63ffffffff8416815282602082015260606040820152600061190060608301846156c1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561591057600080fd5b6040516080810181811067ffffffffffffffff8211171561595a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115615a0c57615a0c6159ca565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a4257615a426159ca565b5060010190565b600082821015615a5b57615a5b6159ca565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615a9e57615a9e615a60565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615adb57615adb6159ca565b500290565b600060208284031215615af257600080fd5b8151614f1b81615758565b600060208284031215615b0f57600080fd5b5051919050565b600067ffffffffffffffff83811690831681811015615b3757615b376159ca565b039392505050565b600067ffffffffffffffff80831681851681830481118215151615615b6657615b666159ca565b02949350505050565b60008060408385031215615b8257600080fd5b505080516020909101519092909150565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615bd457615bd46159ca565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615c0f57615c0f6159ca565b60008712925087820587128484161615615c2b57615c2b6159ca565b87850587128184161615615c4157615c416159ca565b505050929093029392505050565b600082615c5e57615c5e615a60565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615cb257615cb26159ca565b500590565b600082615cc657615cc6615a60565b500690565b60006fffffffffffffffffffffffffffffffff83811690831681811015615b3757615b376159ca565b60006fffffffffffffffffffffffffffffffff808316818516808303821115615d1f57615d1f6159ca565b01949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b606081526000615d85606083018789615d28565b8281036020840152615d98818688615d28565b9150508260408301529695505050505050565b600060ff821660ff841680821015615dc557615dc56159ca565b90039392505050565b600060ff831680615de157615de1615a60565b8060ff8416069150509291505056fea164736f6c634300080f000a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b0000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d40773000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92000000000000000000000000d6eaf4c146261653ee059077b78ed088add54309000000000000000000000000000000000000000000000000000000000000038500000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c80000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63", + "deployedCode": "0x6080604052600436106103085760003560e01c806370872aa51161019a578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b94578063fa315aa914610bb8578063fe2bbeb214610beb57600080fd5b8063ec5e630814610b11578063eff0f59214610b44578063f8f43ff614610b7457600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a8b578063d8cc1a3c14610abe578063dabd396d14610ade57600080fd5b8063c6f0308c146109b3578063cf09e0d014610a3d578063d5d44d8014610a5e57600080fd5b8063a445ece611610143578063bcef3b551161011d578063bcef3b5514610933578063bd8da95614610973578063c395e1ca1461099357600080fd5b8063a445ece6146107f3578063a8e4fb90146108bf578063bbdc02db146108f257600080fd5b80638980e0cc116101745780638980e0cc1461076b5780638b85902b146107805780638d450a95146107c057600080fd5b806370872aa51461073b5780637b0f0adc146107505780638129fc1c1461076357600080fd5b80633fc8cef31161025e5780635c0cba33116102075780636361506d116101e15780636361506d146106b55780636b6716c0146106f55780636f0344091461072857600080fd5b80635c0cba331461064d578063609d33341461068057806360e274641461069557600080fd5b806354fd4d501161023857806354fd4d50146105a757806357da950e146105fd5780635a5fa2d91461062d57600080fd5b80633fc8cef31461052e578063472777c614610561578063534db0e21461057457600080fd5b80632810e1d6116102c057806337b1b2291161029a57806337b1b2291461047b5780633a768463146104bb5780633e3ac912146104ee57600080fd5b80632810e1d6146103f45780632ad69aeb1461040957806330dbe5701461042957600080fd5b806319effeb4116102f157806319effeb41461034f578063200d2ed21461039a57806325fc2ace146103d557600080fd5b8063019351301461030d57806303c2924d1461032f575b600080fd5b34801561031957600080fd5b5061032d6103283660046155a8565b610c1b565b005b34801561033b57600080fd5b5061032d61034a366004615603565b610f3c565b34801561035b57600080fd5b5060005461037c9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156103a657600080fd5b506000546103c890700100000000000000000000000000000000900460ff1681565b6040516103919190615654565b3480156103e157600080fd5b506008545b604051908152602001610391565b34801561040057600080fd5b506103c86115e2565b34801561041557600080fd5b506103e6610424366004615603565b611887565b34801561043557600080fd5b506001546104569073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610391565b34801561048757600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610456565b3480156104c757600080fd5b507f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d40773610456565b3480156104fa57600080fd5b5060005461051e907201000000000000000000000000000000000000900460ff1681565b6040519015158152602001610391565b34801561053a57600080fd5b507f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92610456565b61032d61056f366004615695565b6118bd565b34801561058057600080fd5b507f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63610456565b3480156105b357600080fd5b506105f06040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b604051610391919061572c565b34801561060957600080fd5b50600854600954610618919082565b60408051928352602083019190915201610391565b34801561063957600080fd5b506103e661064836600461573f565b6118cf565b34801561065957600080fd5b507f000000000000000000000000d6eaf4c146261653ee059077b78ed088add54309610456565b34801561068c57600080fd5b506105f0611909565b3480156106a157600080fd5b5061032d6106b036600461577d565b611917565b3480156106c157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103e6565b34801561070157600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061037c565b61032d6107363660046157af565b611abe565b34801561074757600080fd5b506009546103e6565b61032d61075e366004615695565b611b7f565b61032d611b8c565b34801561077757600080fd5b506002546103e6565b34801561078c57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103e6565b3480156107cc57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103e6565b3480156107ff57600080fd5b5061086b61080e36600461573f565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff166060820152608001610391565b3480156108cb57600080fd5b507f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8610456565b3480156108fe57600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000001168152602001610391565b34801561093f57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103e6565b34801561097f57600080fd5b5061037c61098e36600461573f565b611c05565b34801561099f57600080fd5b506103e66109ae3660046157ee565b611de4565b3480156109bf57600080fd5b506109d36109ce36600461573f565b611fc7565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610391565b348015610a4957600080fd5b5060005461037c9067ffffffffffffffff1681565b348015610a6a57600080fd5b506103e6610a7936600461577d565b60036020526000908152604090205481565b348015610a9757600080fd5b507f00000000000000000000000000000000000000000000000000000000000003856103e6565b348015610aca57600080fd5b5061032d610ad9366004615820565b61205e565b348015610aea57600080fd5b507f00000000000000000000000000000000000000000000000000000000000004b061037c565b348015610b1d57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000046103e6565b348015610b5057600080fd5b5061051e610b5f36600461573f565b60046020526000908152604090205460ff1681565b348015610b8057600080fd5b5061032d610b8f366004615695565b612123565b348015610ba057600080fd5b50610ba9612575565b604051610391939291906158aa565b348015610bc457600080fd5b507f00000000000000000000000000000000000000000000000000000000000000086103e6565b348015610bf757600080fd5b5061051e610c0636600461573f565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610c4757610c47615625565b14610c7e576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610cd1576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d08367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610d1f610d1a368690038601866158fe565b6125d5565b14610d56576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610d6b92919061598b565b604051809103902014610daa576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610df3610dee84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061263192505050565b61269e565b90506000610e1a82600881518110610e0d57610e0d61599b565b6020026020010151612854565b9050602081511115610e58576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610ecd576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610f6857610f68615625565b14610f9f576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610fb457610fb461599b565b906000526020600020906005020190506000610fcf84611c05565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b081169082161015611038576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611081576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561109e57508515155b15611139578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110d157816110ed565b600186015473ffffffffffffffffffffffffffffffffffffffff165b90506110f98187612908565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff1660608301526111dc576fffffffffffffffffffffffffffffffff60408201526001815260008690036111dc578195505b600086826020015163ffffffff166111f491906159f9565b905060008382116112055781611207565b835b602084015190915063ffffffff165b818110156113535760008682815481106112325761123261599b565b6000918252602080832090910154808352600690915260409091205490915060ff1661128a576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061129f5761129f61599b565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112fc5750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b1561133e57600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b5050808061134b90615a11565b915050611216565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909316929092179091558490036115d757606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055891580156114d357506000547201000000000000000000000000000000000000900460ff165b156115485760015473ffffffffffffffffffffffffffffffffffffffff166114fb818a612908565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff9091161788556115d5565b61158f73ffffffffffffffffffffffffffffffffffffffff82161561156d5781611589565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89612908565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff16600281111561161057611610615625565b14611647576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff166116ab576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660026000815481106116d7576116d761599b565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611712576001611715565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff909116177001000000000000000000000000000000008360028111156117c6576117c6615625565b0217905560028111156117db576117db615625565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f000000000000000000000000d6eaf4c146261653ee059077b78ed088add5430973ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561186c57600080fd5b505af1158015611880573d6000803e3d6000fd5b5050505090565b600560205281600052604060002081815481106118a357600080fd5b90600052602060002001600091509150505481565b905090565b6118ca8383836001611abe565b505050565b6000818152600760209081526040808320600590925282208054825461190090610100900463ffffffff1682615a49565b95945050505050565b60606118b860546020612a09565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604081208054908290559081900361197c576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92169063f3fef3a390604401600060405180830381600087803b158015611a0c57600080fd5b505af1158015611a20573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a7e576040519150601f19603f3d011682016040523d82523d6000602084013e611a83565b606091505b50509050806118ca576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8161480611b3757503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b6316145b611b6d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7984848484612a5b565b50505050565b6118ca8383836000611abe565b3273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614611bfb576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c036133fc565b565b600080600054700100000000000000000000000000000000900460ff166002811115611c3357611c33615625565b14611c6a576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110611c7f57611c7f61599b565b600091825260208220600590910201805490925063ffffffff90811614611cee57815460028054909163ffffffff16908110611cbd57611cbd61599b565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090611d2690700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b611d3a9067ffffffffffffffff1642615a49565b611d59611d19846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16611d6d91906159f9565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b01667ffffffffffffffff168167ffffffffffffffff1611611dba5780611900565b7f00000000000000000000000000000000000000000000000000000000000004b095945050505050565b600080611e83836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000008811115611ee2576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000611efd8383615a8f565b9050670de0b6b3a76400006000611f34827f0000000000000000000000000000000000000000000000000000000000000008615aa3565b90506000611f52611f4d670de0b6b3a764000086615aa3565b613955565b90506000611f608484613bb0565b90506000611f6e8383613bff565b90506000611f7b82613c2d565b90506000611f9a82611f95670de0b6b3a76400008f615aa3565b613e15565b90506000611fa88b83613bff565b9050611fb4818d615aa3565b9f9e505050505050505050505050505050565b60028181548110611fd757600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614806120d757503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b6316145b61210d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61211b868686868686613e4f565b505050505050565b60008054700100000000000000000000000000000000900460ff16600281111561214f5761214f615625565b14612186576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000806121958661447e565b935093509350935060006121ab85858585614887565b905060007f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d4077373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561221a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223e9190615ae0565b9050600189036123365773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8461229a367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af115801561230c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123309190615afd565b506115d7565b600289036123625773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848961229a565b6003890361238e5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848761229a565b600489036124aa5760006123d46fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000004614941565b6009546123e191906159f9565b6123ec9060016159f9565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561247f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a39190615afd565b50506115d7565b60058903612543576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000038560c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a4016122ed565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000001367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560606125ce611909565b9050909192565b60008160000151826020015183604001518460600151604051602001612614949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60408051808201909152600080825260208201528151600003612680576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b606060008060006126ae856149ef565b9194509250905060018160018111156126c9576126c9615625565b14612700576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845161270c83856159f9565b14612743576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b604080518082019091526000808252602082015281526020019060019003908161275a5790505093506000835b8651811015612848576000806127cd6040518060400160405280858c600001516127b19190615a49565b8152602001858c602001516127c691906159f9565b90526149ef565b5091509150604051806040016040528083836127e991906159f9565b8152602001848b602001516127fe91906159f9565b8152508885815181106128135761281361599b565b60209081029190910101526128296001856159f9565b935061283581836159f9565b61283f90846159f9565b92505050612787565b50845250919392505050565b60606000806000612864856149ef565b91945092509050600081600181111561287f5761287f615625565b146128b6576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128c082846159f9565b8551146128f9576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61190085602001518484614e8d565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff909316928392906129579084906159f9565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd921690637eee288d90604401600060405180830381600087803b1580156129ec57600080fd5b505af1158015612a00573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b60008054700100000000000000000000000000000000900460ff166002811115612a8757612a87615625565b14612abe576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110612ad357612ad361599b565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514612bba576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000612c7a826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580612cb55750612cb27f000000000000000000000000000000000000000000000000000000000000000460026159f9565b81145b8015612cbf575084155b15612cf6576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015612d1c575086155b15612d53576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000008811115612dad576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dd87f000000000000000000000000000000000000000000000000000000000000000460016159f9565b8103612dea57612dea86888588614f22565b34612df483611de4565b14612e2b576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612e3688611c05565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b0811690821603612e9e576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b016612efe9190615b16565b67ffffffffffffffff16612f198267ffffffffffffffff1690565b67ffffffffffffffff161115612ffb576000612f5660017f0000000000000000000000000000000000000000000000000000000000000004615a49565b8314612f8c5767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016612fc1565b612fc17f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff166002615b3f565b9050612ff7817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff16615b16565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526004602052604090205490915060ff1615613079576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008b8152602001908152602001600020600160028054905061330f9190615a49565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92169263d0e30db09234926004808301939282900301818588803b1580156133a757600080fd5b505af11580156133bb573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b60005471010000000000000000000000000000000000900460ff161561344e576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000001166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000d6eaf4c146261653ee059077b78ed088add543091690637258a807906024016040805180830381865afa158015613502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135269190615b6f565b909250905081613562576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461359557639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401351161362f576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd929092169363d0e30db093926004828101939282900301818588803b15801561390457600080fd5b505af1158015613918573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b17600082136139b457631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a764000002158202613bed57637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b600081600019048311820215613c1d5763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d78213613c5b57919050565b680755bf798b4a1bf1e58212613c795763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000613e46670de0b6b3a764000083613e2d86613955565b613e379190615b93565b613e419190615c4f565b613c2d565b90505b92915050565b60008054700100000000000000000000000000000000900460ff166002811115613e7b57613e7b615625565b14613eb2576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110613ec757613ec761599b565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050613f267f000000000000000000000000000000000000000000000000000000000000000860016159f9565b613fc2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614613ffc576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156140f35761404f7f00000000000000000000000000000000000000000000000000000000000000047f0000000000000000000000000000000000000000000000000000000000000008615a49565b6001901b61406e846fffffffffffffffffffffffffffffffff166150d3565b6fffffffffffffffffffffffffffffffff1661408a9190615cb7565b156140c7576140be6140af60016fffffffffffffffffffffffffffffffff8716615ccb565b865463ffffffff166000615172565b600301546140e9565b7f00000000000000000000000000000000000000000000000000000000000000005b915084905061411d565b6003850154915061411a6140af6fffffffffffffffffffffffffffffffff86166001615cf4565b90505b600882901b60088a8a60405161413492919061598b565b6040518091039020901b14614175576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006141808c615256565b9050600061418f836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d4077373ffffffffffffffffffffffffffffffffffffffff169063e14ced3290614209908f908f908f908f908a90600401615d71565b6020604051808303816000875af1158015614228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061424c9190615afd565b6004850154911491506000906002906142f7906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b614393896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b61439d9190615dab565b6143a79190615dce565b60ff1615905081151581036143e8576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff161561443f576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b600080600080600085905060006002828154811061449e5761449e61599b565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000000490614575906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116145af576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000490614676906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156146eb57825463ffffffff166146b57f000000000000000000000000000000000000000000000000000000000000000460016159f9565b83036146bf578391505b600281815481106146d2576146d261599b565b90600052602060002090600502019350809450506145b3565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661475461473f856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561482357600061478c836fffffffffffffffffffffffffffffffff166150d3565b6fffffffffffffffffffffffffffffffff1611156147f75760006147ce6147c660016fffffffffffffffffffffffffffffffff8616615ccb565b896001615172565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506147fd9050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614879565b60006148456147c66fffffffffffffffffffffffffffffffff85166001615cf4565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff8416156148f45760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611900565b82826040516020016149229291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b6000806149ce847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614a32576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614a57576000600160009450945094505050614e86565b60b78111614b6d576000614a6c608083615a49565b905080876000015111614aab576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614b2357507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614b5a576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614e86915050565b60bf8111614ccb576000614b8260b783615a49565b905080876000015111614bc1576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614c23576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614c6b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614c7581846159f9565b895111614cae576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614cb98360016159f9565b9750955060009450614e869350505050565b60f78111614d30576000614ce060c083615a49565b905080876000015111614d1f576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614e86915050565b6000614d3d60f783615a49565b905080876000015111614d7c576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614dde576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614e26576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e3081846159f9565b895111614e69576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e748360016159f9565b9750955060019450614e869350505050565b9193909250565b60608167ffffffffffffffff811115614ea857614ea86158cf565b6040519080825280601f01601f191660200182016040528015614ed2576020820181803683370190505b5090508115614f1b576000614ee784866159f9565b90506020820160005b84811015614f08578281015182820152602001614ef0565b84811115614f17576000858301525b5050505b9392505050565b6000614f416fffffffffffffffffffffffffffffffff84166001615cf4565b90506000614f5182866001615172565b9050600086901a838061503d5750614f8a60027f0000000000000000000000000000000000000000000000000000000000000004615cb7565b600483015460029061502e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6150389190615dce565b60ff16145b156150955760ff811660011480615057575060ff81166002145b615090576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401613626565b612a00565b60ff811615612a00576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401613626565b600080615160837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b600080826151bb576151b66fffffffffffffffffffffffffffffffff86167f0000000000000000000000000000000000000000000000000000000000000004615285565b6151d6565b6151d6856fffffffffffffffffffffffffffffffff16615411565b9050600284815481106151eb576151eb61599b565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461524e57815460028054909163ffffffff169081106152395761523961599b565b906000526020600020906005020191506151fc565b509392505050565b60008060008060006152678661447e565b935093509350935061527b84848484614887565b9695505050505050565b600081615324846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff161161533a5763b34b5c226000526004601cfd5b61534383615411565b9050816153e2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611613e4957613e466153f88360016159f9565b6fffffffffffffffffffffffffffffffff8316906154b6565b600081196001830116816154a5827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b600080615543847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f84011261557157600080fd5b50813567ffffffffffffffff81111561558957600080fd5b6020830191508360208285010111156155a157600080fd5b9250929050565b600080600083850360a08112156155be57600080fd5b60808112156155cc57600080fd5b50839250608084013567ffffffffffffffff8111156155ea57600080fd5b6155f68682870161555f565b9497909650939450505050565b6000806040838503121561561657600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061568f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806000606084860312156156aa57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b818110156156e7576020818501810151868301820152016156cb565b818111156156f9576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613e4660208301846156c1565b60006020828403121561575157600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461577a57600080fd5b50565b60006020828403121561578f57600080fd5b8135614f1b81615758565b803580151581146157aa57600080fd5b919050565b600080600080608085870312156157c557600080fd5b8435935060208501359250604085013591506157e36060860161579a565b905092959194509250565b60006020828403121561580057600080fd5b81356fffffffffffffffffffffffffffffffff81168114614f1b57600080fd5b6000806000806000806080878903121561583957600080fd5b863595506158496020880161579a565b9450604087013567ffffffffffffffff8082111561586657600080fd5b6158728a838b0161555f565b9096509450606089013591508082111561588b57600080fd5b5061589889828a0161555f565b979a9699509497509295939492505050565b63ffffffff8416815282602082015260606040820152600061190060608301846156c1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561591057600080fd5b6040516080810181811067ffffffffffffffff8211171561595a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115615a0c57615a0c6159ca565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a4257615a426159ca565b5060010190565b600082821015615a5b57615a5b6159ca565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615a9e57615a9e615a60565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615adb57615adb6159ca565b500290565b600060208284031215615af257600080fd5b8151614f1b81615758565b600060208284031215615b0f57600080fd5b5051919050565b600067ffffffffffffffff83811690831681811015615b3757615b376159ca565b039392505050565b600067ffffffffffffffff80831681851681830481118215151615615b6657615b666159ca565b02949350505050565b60008060408385031215615b8257600080fd5b505080516020909101519092909150565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615bd457615bd46159ca565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615c0f57615c0f6159ca565b60008712925087820587128484161615615c2b57615c2b6159ca565b87850587128184161615615c4157615c416159ca565b505050929093029392505050565b600082615c5e57615c5e615a60565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615cb257615cb26159ca565b500590565b600082615cc657615cc6615a60565b500690565b60006fffffffffffffffffffffffffffffffff83811690831681811015615b3757615b376159ca565b60006fffffffffffffffffffffffffffffffff808316818516808303821115615d1f57615d1f6159ca565b01949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b606081526000615d85606083018789615d28565b8281036020840152615d98818688615d28565b9150508260408301529695505050505050565b600060ff821660ff841680821015615dc557615dc56159ca565b90039392505050565b600060ff831680615de157615de1615a60565b8060ff8416069150509291505056fea164736f6c634300080f000a", "initialized": true, "kind": "Create", "newBalance": 0, @@ -18873,7 +18873,7 @@ }, { "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -18890,12 +18890,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0x14f6b1a30000000000000000000000000000000000000000000000000000000000000001000000000000000000000000357a483a8923686e7fa454ee93bbc11afb114743", + "data": "0x14f6b1a30000000000000000000000000000000000000000000000000000000000000001000000000000000000000000b6b1579aa54e2f61e621a40d5f2704d717b3544f", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -18904,7 +18904,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x00000000000000000000000020b168142354cee65a32f6d8cf3033e592299765", "previousValue": "0x00000000000000000000000020b168142354cee65a32f6d8cf3033e592299765", @@ -18921,7 +18921,7 @@ "chainId": 31337, "forkId": 0 }, - "data": "0x14f6b1a30000000000000000000000000000000000000000000000000000000000000001000000000000000000000000357a483a8923686e7fa454ee93bbc11afb114743", + "data": "0x14f6b1a30000000000000000000000000000000000000000000000000000000000000001000000000000000000000000b6b1579aa54e2f61e621a40d5f2704d717b3544f", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -18930,7 +18930,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", @@ -18938,7 +18938,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -18946,9 +18946,9 @@ "slot": "0x4d5a9bd2e41301728d41c8e705190becb4e74abe869f75bdb405b63716a35f9e" }, { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": true, - "newValue": "0x000000000000000000000000357a483a8923686e7fa454ee93bbc11afb114743", + "newValue": "0x000000000000000000000000b6b1579aa54e2f61e621a40d5f2704d717b3544f", "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", "reverted": false, "slot": "0x4d5a9bd2e41301728d41c8e705190becb4e74abe869f75bdb405b63716a35f9e" @@ -18992,7 +18992,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -19006,7 +19006,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x00000000000000000000000020b168142354cee65a32f6d8cf3033e592299765", "previousValue": "0x00000000000000000000000020b168142354cee65a32f6d8cf3033e592299765", @@ -19032,7 +19032,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", @@ -19044,7 +19044,7 @@ }, { "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -19061,12 +19061,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0xf2fde38b0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "data": "0xf2fde38b0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -19075,7 +19075,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x00000000000000000000000020b168142354cee65a32f6d8cf3033e592299765", "previousValue": "0x00000000000000000000000020b168142354cee65a32f6d8cf3033e592299765", @@ -19092,7 +19092,7 @@ "chainId": 31337, "forkId": 0 }, - "data": "0xf2fde38b0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "data": "0xf2fde38b0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -19101,7 +19101,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", @@ -19109,7 +19109,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", @@ -19117,9 +19117,9 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": true, - "newValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "newValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" @@ -19129,7 +19129,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -19143,7 +19143,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, "newValue": "0x00000000000000000000000020b168142354cee65a32f6d8cf3033e592299765", "previousValue": "0x00000000000000000000000020b168142354cee65a32f6d8cf3033e592299765", @@ -19169,10 +19169,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0xc7B87b2b892EA5C3CfF47168881FE168C00377FB", + "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", "isWrite": false, - "newValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", - "previousValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "newValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", + "previousValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" } @@ -19215,7 +19215,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -19229,7 +19229,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, "newValue": "0x00000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c9", "previousValue": "0x00000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c9", @@ -19255,7 +19255,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", @@ -19267,7 +19267,7 @@ }, { "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -19284,12 +19284,12 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "chainInfo": { "chainId": 31337, "forkId": 0 }, - "data": "0xf2fde38b0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "data": "0xf2fde38b0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "deployedCode": "0x", "initialized": true, "kind": "Call", @@ -19298,7 +19298,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, "newValue": "0x00000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c9", "previousValue": "0x00000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c9", @@ -19315,7 +19315,7 @@ "chainId": 31337, "forkId": 0 }, - "data": "0xf2fde38b0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "data": "0xf2fde38b0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "deployedCode": "0x", "initialized": true, "kind": "DelegateCall", @@ -19324,7 +19324,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", @@ -19332,7 +19332,7 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", @@ -19340,9 +19340,9 @@ "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" }, { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": true, - "newValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "newValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" @@ -19352,7 +19352,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -19366,7 +19366,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, "newValue": "0x00000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c9", "previousValue": "0x00000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c9", @@ -19392,10 +19392,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, - "newValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", - "previousValue": "0x0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3", + "newValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", + "previousValue": "0x0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" } @@ -19430,7 +19430,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -19444,7 +19444,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, "newValue": "0x00000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c9", "previousValue": "0x00000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c9", @@ -19473,7 +19473,7 @@ }, { "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "chainInfo": { "chainId": 31337, "forkId": 0 @@ -19487,7 +19487,7 @@ "reverted": false, "storageAccesses": [ { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, "newValue": "0x00000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c9", "previousValue": "0x00000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c9", @@ -19513,10 +19513,10 @@ "reverted": false, "storageAccesses": [ { - "account": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", + "account": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", "isWrite": false, - "newValue": "0x000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", - "previousValue": "0x000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", + "newValue": "0x0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351", + "previousValue": "0x0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351", "reverted": false, "slot": "0x0000000000000000000000000000000000000000000000000000000000000068" } diff --git a/packages/contracts-bedrock/test/L1/ResourceMetering.t.sol b/packages/contracts-bedrock/test/L1/ResourceMetering.t.sol index 63b208b9c255..f4bca39ea418 100644 --- a/packages/contracts-bedrock/test/L1/ResourceMetering.t.sol +++ b/packages/contracts-bedrock/test/L1/ResourceMetering.t.sol @@ -281,7 +281,13 @@ contract ArtifactResourceMetering_Test is Test { /// @dev Generates a CSV file. No more than the L1 block gas limit should /// be supplied to the `meter` function to avoid long execution time. + /// This test is skipped because there is no need to run it every time. + /// It generates a CSV file on disk that can be used to analyze the + /// gas usage and cost of the `ResourceMetering` contract. The next time + /// that the gas usage needs to be analyzed, the skip may be removed. function test_meter_generateArtifact_succeeds() external { + vm.skip({ skipTest: true }); + vm.writeLine( outfile, "prevBaseFee,prevBoughtGas,prevBlockNumDiff,l1BaseFee,requestedGas,gasConsumed,ethPrice,usdCost,success" diff --git a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummary.sol b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummary.sol index 15c23fb0faeb..63f4389a7bcf 100644 --- a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummary.sol +++ b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummary.sol @@ -12,40 +12,40 @@ contract DeploymentSummary is DeploymentSummaryCode { address private constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code")))); Vm private constant vm = Vm(VM_ADDRESS); - address internal constant addressManagerAddress = 0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3; - address internal constant anchorStateRegistryAddress = 0x610C37dd344e47D7848Da075a90128472140e80f; - address internal constant anchorStateRegistryProxyAddress = 0x39Af23E00F1e662025aA01b0cEdA19542B78DF99; + address internal constant addressManagerAddress = 0x50EEf481cae4250d252Ae577A09bF514f224C6C4; + address internal constant anchorStateRegistryAddress = 0xE2a80256d1dAFe06683F231F8e9561639Aa0e9b9; + address internal constant anchorStateRegistryProxyAddress = 0xd6EAF4c146261653EE059077B78ED088Add54309; address internal constant delayedWETHAddress = 0x49BBFf1629824A1e7993Ab5c17AFa45D24AB28c9; - address internal constant delayedWETHProxyAddress = 0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d; + address internal constant delayedWETHProxyAddress = 0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92; address internal constant disputeGameFactoryAddress = 0x20B168142354Cee65a32f6D8cf3033E592299765; - address internal constant disputeGameFactoryProxyAddress = 0xc7B87b2b892EA5C3CfF47168881FE168C00377FB; + address internal constant disputeGameFactoryProxyAddress = 0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d; address internal constant l1CrossDomainMessengerAddress = 0x094e6508ba9d9bf1ce421fff3dE06aE56e67901b; - address internal constant l1CrossDomainMessengerProxyAddress = 0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6; + address internal constant l1CrossDomainMessengerProxyAddress = 0xDeF3bca8c80064589E6787477FFa7Dd616B5574F; address internal constant l1ERC721BridgeAddress = 0x5C4F5e749A61a9503c4AAE8a9393e89609a0e804; - address internal constant l1ERC721BridgeProxyAddress = 0xDeF3bca8c80064589E6787477FFa7Dd616B5574F; + address internal constant l1ERC721BridgeProxyAddress = 0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865; address internal constant l1StandardBridgeAddress = 0xb7900B27Be8f0E0fF65d1C3A4671e1220437dd2b; - address internal constant l1StandardBridgeProxyAddress = 0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4; + address internal constant l1StandardBridgeProxyAddress = 0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D; address internal constant l2OutputOracleAddress = 0x19652082F846171168Daf378C4fD3ee85a0D4A60; - address internal constant l2OutputOracleProxyAddress = 0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865; + address internal constant l2OutputOracleProxyAddress = 0x39Af23E00F1e662025aA01b0cEdA19542B78DF99; address internal constant mipsAddress = 0xB3A0348310a0ff78E5FbDB7f14BB7d3e02d40773; address internal constant optimismMintableERC20FactoryAddress = 0x39Aea2Dd53f2d01c15877aCc2791af6BDD7aD567; - address internal constant optimismMintableERC20FactoryProxyAddress = 0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D; + address internal constant optimismMintableERC20FactoryProxyAddress = 0xc7B87b2b892EA5C3CfF47168881FE168C00377FB; address internal constant optimismPortalAddress = 0xbdD90485FCbcac869D5b5752179815a3103d8131; address internal constant optimismPortal2Address = 0x542e5F5d3934b6A8A8B4219cbc99D3D87a7137E1; - address internal constant optimismPortalProxyAddress = 0x978e3286EB805934215a88694d80b09aDed68D90; + address internal constant optimismPortalProxyAddress = 0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4; address internal constant preimageOracleAddress = 0x3bd7E801E51d48c5d94Ea68e8B801DFFC275De75; address internal constant protocolVersionsAddress = 0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F; - address internal constant protocolVersionsProxyAddress = 0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6; - address internal constant proxyAdminAddress = 0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76; - address internal constant safeProxyFactoryAddress = 0x34A1D3fff3958843C43aD80F30b94c510645C316; - address internal constant safeSingletonAddress = 0x90193C961A926261B756D1E5bb255e67ff9498A1; + address internal constant protocolVersionsProxyAddress = 0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1; + address internal constant proxyAdminAddress = 0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1; + address internal constant safeProxyFactoryAddress = 0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496; + address internal constant safeSingletonAddress = 0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3; address internal constant superchainConfigAddress = 0x068E44eB31e111028c41598E4535be7468674D0A; - address internal constant superchainConfigProxyAddress = 0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809; + address internal constant superchainConfigProxyAddress = 0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351; address internal constant systemConfigAddress = 0x67866A5052E5302aaD08e9f352331fd8622eB6DC; - address internal constant systemConfigProxyAddress = 0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb; - address internal constant systemOwnerSafeAddress = 0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3; - address internal constant acc32Address = 0xcE8C32b1493DB37767fAF988dEC9E80089f4f33c; - address internal constant acc33Address = 0x357A483a8923686E7fA454Ee93bbc11aFB114743; + address internal constant systemConfigProxyAddress = 0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6; + address internal constant systemOwnerSafeAddress = 0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD; + address internal constant acc32Address = 0x357A483a8923686E7fA454Ee93bbc11aFB114743; + address internal constant acc33Address = 0xb6b1579AA54e2F61e621a40d5F2704D717B3544F; function recreateDeployment() public { bytes32 slot; @@ -57,7 +57,7 @@ contract DeploymentSummary is DeploymentSummaryCode { vm.store(safeSingletonAddress, slot, value); vm.etch(systemOwnerSafeAddress, systemOwnerSafeCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - value = hex"00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1"; + value = hex"000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"e90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0"; value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38"; @@ -83,14 +83,14 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000003"; - value = hex"000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3"; + value = hex"00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - value = hex"0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3"; + value = hex"0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd"; vm.store(proxyAdminAddress, slot, value); vm.etch(superchainConfigProxyAddress, superchainConfigProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(superchainConfigProxyAddress, slot, value); vm.etch(superchainConfigAddress, superchainConfigCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; @@ -122,7 +122,7 @@ contract DeploymentSummary is DeploymentSummaryCode { vm.store(superchainConfigProxyAddress, slot, value); vm.etch(protocolVersionsProxyAddress, protocolVersionsProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(protocolVersionsProxyAddress, slot, value); vm.etch(protocolVersionsAddress, protocolVersionsCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; @@ -153,7 +153,7 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(protocolVersionsProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(protocolVersionsProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; @@ -163,49 +163,49 @@ contract DeploymentSummary is DeploymentSummaryCode { vm.store(protocolVersionsProxyAddress, slot, value); vm.etch(optimismPortalProxyAddress, optimismPortalProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(optimismPortalProxyAddress, slot, value); vm.etch(systemConfigProxyAddress, systemConfigProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(systemConfigProxyAddress, slot, value); vm.etch(l1StandardBridgeProxyAddress, l1StandardBridgeProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(l1StandardBridgeProxyAddress, slot, value); vm.etch(l1CrossDomainMessengerProxyAddress, l1CrossDomainMessengerProxyCode); - slot = hex"a8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c"; - value = hex"000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3"; + slot = hex"191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284"; + value = hex"00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); - slot = hex"eae32376463217751b8fa4dea8c38ab253664fa3605de6d85d2e790aa970f2b8"; + slot = hex"6822ddba83a78589c753bb747cf4919773ec1d36eeb0bb2a09d64b6d87adda0b"; value = hex"4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); vm.etch(optimismMintableERC20FactoryProxyAddress, optimismMintableERC20FactoryProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); vm.etch(l1ERC721BridgeProxyAddress, l1ERC721BridgeProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(l1ERC721BridgeProxyAddress, slot, value); vm.etch(disputeGameFactoryProxyAddress, disputeGameFactoryProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(disputeGameFactoryProxyAddress, slot, value); vm.etch(l2OutputOracleProxyAddress, l2OutputOracleProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(l2OutputOracleProxyAddress, slot, value); vm.etch(delayedWETHProxyAddress, delayedWETHProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(delayedWETHProxyAddress, slot, value); vm.etch(anchorStateRegistryProxyAddress, anchorStateRegistryProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(anchorStateRegistryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(addressManagerAddress, slot, value); vm.etch(l1CrossDomainMessengerAddress, l1CrossDomainMessengerCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; @@ -440,13 +440,13 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(optimismPortalProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000036"; - value = hex"000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d5865"; + value = hex"00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df99"; vm.store(optimismPortalProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000037"; - value = hex"0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb"; + value = hex"0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6"; vm.store(optimismPortalProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000035"; - value = hex"0000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900"; + value = hex"00000000000000000000004f559f30f5eb88d635fde1548c4267db8fab035100"; vm.store(optimismPortalProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000032"; value = hex"000000000000000000000000000000000000000000000000000000000000dead"; @@ -470,7 +470,7 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; @@ -494,22 +494,22 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"000000000000000000000000ff00000000000000000000000000000000000000"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580636"; - value = hex"0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6"; + value = hex"000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a7"; - value = hex"000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f"; + value = hex"000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d5865"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6376"; - value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4"; + value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa906"; - value = hex"000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb"; + value = hex"0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ac"; - value = hex"000000000000000000000000978e3286eb805934215a88694d80b09aded68d90"; + value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"a04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320c"; - value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d"; + value = hex"000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"a11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -523,7 +523,7 @@ contract DeploymentSummary is DeploymentSummaryCode { slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; value = hex"0000000000000000000000000000000000000000000000000000000000000005"; vm.store(systemOwnerSafeAddress, slot, value); - slot = hex"727598a658f6983be3a9f29beef55aaee89ef8a176baeeacbe7edf5ff94a781b"; + slot = hex"540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; @@ -539,13 +539,13 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000032"; - value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809"; + value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb"; + value = hex"0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000003"; - value = hex"0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6"; + value = hex"000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000004"; value = hex"0000000000000000000000004200000000000000000000000000000000000010"; @@ -566,10 +566,10 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(l1ERC721BridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000032"; - value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809"; + value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; vm.store(l1ERC721BridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; - value = hex"0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6"; + value = hex"000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f"; vm.store(l1ERC721BridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000002"; value = hex"0000000000000000000000004200000000000000000000000000000000000014"; @@ -590,7 +590,7 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; - value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4"; + value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d"; vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -598,13 +598,13 @@ contract DeploymentSummary is DeploymentSummaryCode { slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; value = hex"0000000000000000000000000000000000000000000000000000000000000009"; vm.store(systemOwnerSafeAddress, slot, value); - slot = hex"a8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c"; + slot = hex"191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284"; value = hex"0000000000000000000000000000000000000000000000000000000000000002"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; value = hex"000000000000000000000000000000000000000000000000000000000000000a"; vm.store(systemOwnerSafeAddress, slot, value); - slot = hex"7cda2d9a7dd1a58982b7fac9315bdc1ed8c92aeb9c22cd8555aaa54972f01ccb"; + slot = hex"89a8cb4d9b6f179480a9e676431122d6ba6a5fb2aa9462528e7e48e497a5c045"; value = hex"4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; @@ -620,13 +620,13 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000001010000000000000000000000000000000000000000"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"00000000000000000000000000000000000000000000000000000000000000fb"; - value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809"; + value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"00000000000000000000000000000000000000000000000000000000000000fc"; - value = hex"000000000000000000000000978e3286eb805934215a88694d80b09aded68d90"; + value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"00000000000000000000000000000000000000000000000000000000000000fd"; - value = hex"0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb"; + value = hex"0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"00000000000000000000000000000000000000000000000000000000000000cc"; value = hex"000000000000000000000000000000000000000000000000000000000000dead"; @@ -686,7 +686,7 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(disputeGameFactoryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(disputeGameFactoryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38"; @@ -707,13 +707,13 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(delayedWETHProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(delayedWETHProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38"; vm.store(delayedWETHProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000068"; - value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809"; + value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; vm.store(delayedWETHProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -722,7 +722,7 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"000000000000000000000000000000000000000000000000000000000000000f"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; - value = hex"000000000000000000000000610c37dd344e47d7848da075a90128472140e80f"; + value = hex"000000000000000000000000e2a80256d1dafe06683f231f8e9561639aa0e9b9"; vm.store(anchorStateRegistryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -750,17 +750,17 @@ contract DeploymentSummary is DeploymentSummaryCode { vm.store(anchorStateRegistryProxyAddress, slot, value); vm.etch(acc32Address, acc32Code); slot = hex"ffdfc1249c027f9191656349feb0761381bb32c9f557e01f419fd08754bf5a1b"; - value = hex"000000000000000000000000ce8c32b1493db37767faf988dec9e80089f4f33c"; + value = hex"000000000000000000000000357a483a8923686e7fa454ee93bbc11afb114743"; vm.store(disputeGameFactoryProxyAddress, slot, value); vm.etch(acc33Address, acc33Code); slot = hex"4d5a9bd2e41301728d41c8e705190becb4e74abe869f75bdb405b63716a35f9e"; - value = hex"000000000000000000000000357a483a8923686e7fa454ee93bbc11afb114743"; + value = hex"000000000000000000000000b6b1579aa54e2f61e621a40d5f2704d717b3544f"; vm.store(disputeGameFactoryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3"; + value = hex"0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd"; vm.store(disputeGameFactoryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3"; + value = hex"0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd"; vm.store(delayedWETHProxyAddress, slot, value); } } diff --git a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryCode.sol b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryCode.sol index a7f02ba75016..4e8b67367eaf 100644 --- a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryCode.sol +++ b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryCode.sol @@ -67,9 +67,9 @@ contract DeploymentSummaryCode { bytes internal constant mipsCode = hex"608060405234801561001057600080fd5b50600436106100415760003560e01c806354fd4d50146100465780637dc0d1d014610098578063e14ced32146100dc575b600080fd5b6100826040518060400160405280600c81526020017f312e312e302d626574612e36000000000000000000000000000000000000000081525081565b60405161008f9190612120565b60405180910390f35b60405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000003bd7e801e51d48c5d94ea68e8b801dffc275de7516815260200161008f565b6100ef6100ea3660046121d5565b6100fd565b60405190815260200161008f565b6000610107612096565b6080811461011457600080fd5b6040516106001461012457600080fd5b6084871461013157600080fd5b6101a4851461013f57600080fd5b8635608052602087013560a052604087013560e090811c60c09081526044890135821c82526048890135821c61010052604c890135821c610120526050890135821c61014052605489013590911c61016052605888013560f890811c610180526059890135901c6101a052605a880135901c6101c0526102006101e0819052606288019060005b60208110156101ea57823560e01c82526004909201916020909101906001016101c6565b5050508061012001511561020857610200610360565b915050610357565b6101408101805160010167ffffffffffffffff16905260006101a49050600080600061023d856060015186600001518661047c565b9250925092508163ffffffff16600014801561025f57508063ffffffff16600c145b156102795761026d876104a3565b95505050505050610357565b60006102f3866040805160808101825260008082526020820181905291810182905260608101919091526040518060800160405280836060015163ffffffff168152602001836080015163ffffffff1681526020018360a0015163ffffffff1681526020018360c0015163ffffffff168152509050919050565b61016087015187519192506103109183919061052488888861087b565b8652805163ffffffff9081166060808901919091526020830151821660808901526040830151821660a08901528201511660c087015261034e610360565b96505050505050505b95945050505050565b60408051608051815260a051602082015260dc519181019190915260fc51604482015261011c51604882015261013c51604c82015261015c51605082015261017c5160548201526101805161019f5160588301526101a0516101bf5160598401526101d851605a840152600092610200929091606283019190855b60208110156103ff57601c86015184526020909501946004909301926001016103db565b506000835283830384a060009450806001811461041f5760039550610447565b82801561043757600181146104405760029650610445565b60009650610445565b600196505b505b50505081900390207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660f89190911b17919050565b600080600061048c858786610c61565b96603f601a89901c81169750881695509350505050565b60006104ad612096565b608090506000806000806104e48561016001516040810151608082015160a083015160c084015160e0909401519294919390929091565b509350935093509350600080610ffa63ffffffff168663ffffffff16036105295761051485858960e00151610d15565b63ffffffff1660e08a0152909250905061078a565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03363ffffffff871601610562576340000000915061078a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefe863ffffffff871601610598576001915061078a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffef6a63ffffffff8716016105ec57600161012088015260ff85166101008801526105df610360565b9998505050505050505050565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05d63ffffffff8716016106e85760006040518061012001604052808763ffffffff1681526020018663ffffffff1681526020018563ffffffff16815260200189602001518152602001896040015163ffffffff1681526020018b81526020017f0000000000000000000000003bd7e801e51d48c5d94ea68e8b801dffc275de7573ffffffffffffffffffffffffffffffffffffffff1681526020016106ba6101a4600160ff16610380020190565b8152895160209091015290506106cf81610d57565b8b5263ffffffff1660408b0152909350915061078a9050565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05c63ffffffff87160161074d5760208701516040880151610733918791879187916105248d51610fcf565b63ffffffff1660408b015260208a0152909250905061078a565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02963ffffffff87160161078a5761078485856110c5565b90925090505b6000610804886040805160808101825260008082526020820181905291810182905260608101919091526040518060800160405280836060015163ffffffff168152602001836080015163ffffffff1681526020018360a0015163ffffffff1681526020018360c0015163ffffffff168152509050919050565b61016089015163ffffffff85811660408084019190915285821660e0909301929092526020830180518083168086526004909101831682526060808e01919091529051821660808d015291830151811660a08c0152908201511660c08a0152905061086d610360565b9a9950505050505050505050565b84600263ffffffff8416148061089757508263ffffffff166003145b156108e95760006002856303ffffff1663ffffffff16901b896020015163f0000000161790506108e389898663ffffffff166002146108d757601f6108da565b60005b60ff168461117a565b50610c56565b600080601f601087901c8116908a90601589901c166020811061090e5761090e612249565b602002015192508063ffffffff8716158061092f57508663ffffffff16601c145b15610961578a8263ffffffff166020811061094c5761094c612249565b6020020151925050601f600b88901c16610a18565b60208763ffffffff1610156109c3578663ffffffff16600c148061098b57508663ffffffff16600d145b8061099c57508663ffffffff16600e145b156109ad578761ffff169250610a18565b6109bc8861ffff166010611252565b9250610a18565b60288763ffffffff161015806109df57508663ffffffff166022145b806109f057508663ffffffff166026145b15610a18578a8263ffffffff1660208110610a0d57610a0d612249565b602002015192508190505b60048763ffffffff1610158015610a35575060088763ffffffff16105b80610a4657508663ffffffff166001145b15610a6257610a598c8c898b86896112c5565b50505050610c56565b63ffffffff6000602089831610610ac757610a828a61ffff166010611252565b9095019463fffffffc8616610a988d828e610c61565b915060288a63ffffffff1610158015610ab857508963ffffffff16603014155b15610ac557809250600093505b505b6000610ad78b8b8b8a8a876114b3565b63ffffffff1690508963ffffffff166000148015610afc575060088963ffffffff1610155b8015610b0e5750601c8963ffffffff16105b15610bd6578863ffffffff1660081480610b2e57508863ffffffff166009145b15610b6157610b558f8f8b63ffffffff16600814610b4c5786610b4f565b60005b8a61117a565b50505050505050610c56565b8863ffffffff16600a03610b8357610b558f8f868a63ffffffff8b1615611bd2565b8863ffffffff16600b03610ba657610b558f8f868a63ffffffff8b161515611bd2565b60108963ffffffff1610158015610bc35750601c8963ffffffff16105b15610bd657610b558f8f8b8a8a89611ca2565b8963ffffffff166038148015610bf1575063ffffffff851615155b15610c215760018e8663ffffffff1660208110610c1057610c10612249565b63ffffffff90921660209290920201525b8263ffffffff1663ffffffff14610c4057610c3d838d83611f5b565b97505b610c4e8f8f86846001611bd2565b505050505050505b979650505050505050565b6000610c6c82611ffd565b6003831615610c7a57600080fd5b6020820191358360051c8160005b601b811015610ce05760208601953583821c6001168015610cb05760018114610cc557610cd6565b60008481526020839052604090209350610cd6565b600082815260208590526040902093505b5050600101610c88565b50868114610cf657630badf00d60005260206000fd5b5050601f93909316601c0360031b9290921c63ffffffff169392505050565b6000808284610fff811615610d2f57610fff811661100003015b8663ffffffff16600003610d495784935090810190610d4d565b8693505b5093509350939050565b6101008101516080820151825160009283929163ffffffff1615610fc857845163ffffffff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb01610f82576000610dc3866101000151876020015163fffffffc168860e00151610c61565b606087015190915060001a600103610e4557610e3f86606001518760a0015160408051600093845233602052918152606090922091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b60608701525b6000808760c0015173ffffffffffffffffffffffffffffffffffffffff1663e03110e189606001518a608001516040518363ffffffff1660e01b8152600401610e9e92919091825263ffffffff16602082015260400190565b6040805180830381865afa158015610eba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ede9190612278565b60208a015160408b01519294509092509060038216600481900384811015610f04578094505b5083821015610f11578193505b8460088502610100031c9450846008828660040303021b9450600180600883600403021b036001806008878560040303021b03915081198116905085811988161796505050610f6f8a6020015163fffffffc168b60e0015187611f5b565b9298505050938601939250610fc8915050565b845163ffffffff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd01610fbc5784604001519350610fc8565b63ffffffff9350600992505b9193509193565b600080858563ffffffff8b1660011480610fef575063ffffffff8b166002145b80611000575063ffffffff8b166004145b1561100d578893506110b7565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa63ffffffff8c16016110ab57600061104d868c63fffffffc1689610c61565b90508860038c166004038b81101561106357809b505b8b965086900360089081029290921c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600193880293841b0116911b179150600090506110b7565b63ffffffff9350600992505b975097509750979350505050565b60008063ffffffff83166003036111685763ffffffff841615806110ef575063ffffffff84166005145b80611100575063ffffffff84166003145b1561110e5760009150611173565b63ffffffff841660011480611129575063ffffffff84166002145b8061113a575063ffffffff84166006145b8061114b575063ffffffff84166004145b156111595760019150611173565b5063ffffffff90506009611173565b5063ffffffff905060165b9250929050565b836000015160040163ffffffff16846020015163ffffffff16146111ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6a756d7020696e2064656c617920736c6f74000000000000000000000000000060448201526064015b60405180910390fd5b835160208501805163ffffffff908116875283811690915283161561124b5780600801848463ffffffff166020811061123a5761123a612249565b63ffffffff90921660209290920201525b5050505050565b600063ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80850183169190911c821615159160016020869003821681901b830191861691821b92911b01826112af5760006112b1565b815b90861663ffffffff16179250505092915050565b6000866000015160040163ffffffff16876020015163ffffffff1614611347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6272616e636820696e2064656c617920736c6f7400000000000000000000000060448201526064016111f6565b8463ffffffff166004148061136257508463ffffffff166005145b156113d9576000868463ffffffff166020811061138157611381612249565b602002015190508063ffffffff168363ffffffff161480156113a957508563ffffffff166004145b806113d157508063ffffffff168363ffffffff16141580156113d157508563ffffffff166005145b915050611456565b8463ffffffff166006036113f65760008260030b13159050611456565b8463ffffffff166007036114125760008260030b139050611456565b8463ffffffff1660010361145657601f601085901c16600081900361143b5760008360030b1291505b8063ffffffff166001036114545760008360030b121591505b505b8651602088015163ffffffff168852811561149757600261147c8661ffff166010611252565b63ffffffff90811690911b82016004011660208901526114a9565b60208801805160040163ffffffff1690525b5050505050505050565b600063ffffffff861615806114e0575060088663ffffffff16101580156114e05750600f8663ffffffff16105b156118e9578560088114611523576009811461152c57600a811461153557600b811461153e57600c811461154757600d811461155057600e81146115595761155e565b6020955061155e565b6021955061155e565b602a955061155e565b602b955061155e565b6024955061155e565b6025955061155e565b602695505b508463ffffffff16600003611583575063ffffffff8216601f600688901c161b611bc8565b8463ffffffff166002036115a7575063ffffffff8216601f600688901c161c611bc8565b8463ffffffff166003036115db57601f600688901c166115d363ffffffff8516821c6020839003611252565b915050611bc8565b8463ffffffff166004036115fb575063ffffffff8216601f84161b611bc8565b8463ffffffff1660060361161b575063ffffffff8216601f84161c611bc8565b8463ffffffff1660070361164c576116458463ffffffff168463ffffffff16901c85602003611252565b9050611bc8565b8463ffffffff16600803611661575082611bc8565b8463ffffffff16600903611676575082611bc8565b8463ffffffff16600a0361168b575082611bc8565b8463ffffffff16600b036116a0575082611bc8565b8463ffffffff16600c036116b5575082611bc8565b8463ffffffff16600f036116ca575082611bc8565b8463ffffffff166010036116df575082611bc8565b8463ffffffff166011036116f4575082611bc8565b8463ffffffff16601203611709575082611bc8565b8463ffffffff1660130361171e575082611bc8565b8463ffffffff16601803611733575082611bc8565b8463ffffffff16601903611748575082611bc8565b8463ffffffff16601a0361175d575082611bc8565b8463ffffffff16601b03611772575082611bc8565b8463ffffffff166020036117895750828201611bc8565b8463ffffffff166021036117a05750828201611bc8565b8463ffffffff166022036117b75750818303611bc8565b8463ffffffff166023036117ce5750818303611bc8565b8463ffffffff166024036117e55750828216611bc8565b8463ffffffff166025036117fc5750828217611bc8565b8463ffffffff166026036118135750828218611bc8565b8463ffffffff1660270361182b575082821719611bc8565b8463ffffffff16602a0361185a578260030b8460030b1261184d576000611850565b60015b60ff169050611bc8565b8463ffffffff16602b03611882578263ffffffff168463ffffffff161061184d576000611850565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c696420696e737472756374696f6e0000000000000000000000000060448201526064016111f6565b611882565b8563ffffffff16601c03611962578463ffffffff1660020361190e5750828202611bc8565b8463ffffffff166020148061192957508463ffffffff166021145b156118e4578463ffffffff16602003611940579219925b60005b6380000000851615611645576401fffffffe600195861b169401611943565b8563ffffffff16600f03611983575065ffffffff0000601083901b16611bc8565b8563ffffffff166020036119b7576116458460031660080260180363ffffffff168363ffffffff16901c60ff166008611252565b8563ffffffff166021036119ec576116458460021660080260100363ffffffff168363ffffffff16901c61ffff166010611252565b8563ffffffff16602203611a1a575063ffffffff60086003851602811681811b198416918316901b17611bc8565b8563ffffffff16602303611a2f575080611bc8565b8563ffffffff16602403611a60578360031660080260180363ffffffff168263ffffffff16901c60ff169050611bc8565b8563ffffffff16602503611a92578360021660080260100363ffffffff168263ffffffff16901c61ffff169050611bc8565b8563ffffffff16602603611ac3575063ffffffff60086003851602601803811681811c198416918316901c17611bc8565b8563ffffffff16602803611af8575060ff63ffffffff60086003861602601803811682811b9091188316918416901b17611bc8565b8563ffffffff16602903611b2e575061ffff63ffffffff60086002861602601003811682811b9091188316918416901b17611bc8565b8563ffffffff16602a03611b5c575063ffffffff60086003851602811681811c198316918416901c17611bc8565b8563ffffffff16602b03611b71575081611bc8565b8563ffffffff16602e03611ba2575063ffffffff60086003851602601803811681811b198316918416901b17611bc8565b8563ffffffff16603003611bb7575080611bc8565b8563ffffffff166038036118825750815b9695505050505050565b60208363ffffffff1610611c42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f76616c696420726567697374657200000000000000000000000000000000000060448201526064016111f6565b63ffffffff831615801590611c545750805b15611c835781848463ffffffff1660208110611c7257611c72612249565b63ffffffff90921660209290920201525b5050505060208101805163ffffffff8082169093526004019091169052565b60008463ffffffff16601003611cbd57506060860151611f03565b8463ffffffff16601103611cdc5763ffffffff84166060880152611f03565b8463ffffffff16601203611cf557506040860151611f03565b8463ffffffff16601303611d145763ffffffff84166040880152611f03565b8463ffffffff16601803611d485763ffffffff600385810b9085900b02602081901c821660608a0152166040880152611f03565b8463ffffffff16601903611d795763ffffffff84811681851602602081901c821660608a0152166040880152611f03565b8463ffffffff16601a03611e3c578260030b600003611df4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d4950533a206469766973696f6e206279207a65726f0000000000000000000060448201526064016111f6565b8260030b8460030b81611e0957611e0961229c565b0763ffffffff166060880152600383810b9085900b81611e2b57611e2b61229c565b0563ffffffff166040880152611f03565b8463ffffffff16601b03611f03578263ffffffff16600003611eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d4950533a206469766973696f6e206279207a65726f0000000000000000000060448201526064016111f6565b8263ffffffff168463ffffffff1681611ed557611ed561229c565b0663ffffffff908116606089015283811690851681611ef657611ef661229c565b0463ffffffff1660408801525b63ffffffff821615611f395780868363ffffffff1660208110611f2857611f28612249565b63ffffffff90921660209290920201525b50505060208401805163ffffffff808216909652600401909416909352505050565b6000611f6683611ffd565b6003841615611f7457600080fd5b6020830192601f8516601c0360031b83811b913563ffffffff90911b1916178460051c60005b601b811015611ff25760208601953582821c6001168015611fc25760018114611fd757611fe8565b60008581526020839052604090209450611fe8565b600082815260208690526040902094505b5050600101611f9a565b509095945050505050565b366103808201811015612092576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f636865636b207468617420746865726520697320656e6f7567682063616c6c6460448201527f617461000000000000000000000000000000000000000000000000000000000060648201526084016111f6565b5050565b6040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081019190915261016081016120fc612101565b905290565b6040518061040001604052806020906020820280368337509192915050565b600060208083528351808285015260005b8181101561214d57858101830151858201604001528201612131565b8181111561215f576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008083601f8401126121a557600080fd5b50813567ffffffffffffffff8111156121bd57600080fd5b60208301915083602082850101111561117357600080fd5b6000806000806000606086880312156121ed57600080fd5b853567ffffffffffffffff8082111561220557600080fd5b61221189838a01612193565b9097509550602088013591508082111561222a57600080fd5b5061223788828901612193565b96999598509660400135949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000806040838503121561228b57600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea164736f6c634300080f000a"; bytes internal constant anchorStateRegistryCode = - hex"608060405234801561001057600080fd5b50600436106100675760003560e01c8063838c2d1e11610050578063838c2d1e146100fa578063c303f0df14610104578063f2b4e6171461011757600080fd5b806354fd4d501461006c5780637258a807146100be575b600080fd5b6100a86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100b5919061085c565b60405180910390f35b6100e56100cc36600461088b565b6001602081905260009182526040909120805491015482565b604080519283526020830191909152016100b5565b61010261015b565b005b61010261011236600461094f565b6105d4565b60405173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb1681526020016100b5565b600033905060008060008373ffffffffffffffffffffffffffffffffffffffff1663fa24f7436040518163ffffffff1660e01b8152600401600060405180830381865afa1580156101b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526101f69190810190610a68565b92509250925060007f000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb73ffffffffffffffffffffffffffffffffffffffff16635f0150cb8585856040518463ffffffff1660e01b815260040161025b93929190610b39565b6040805180830381865afa158015610277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029b9190610b67565b5090508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f416e63686f72537461746552656769737472793a206661756c7420646973707560448201527f74652067616d65206e6f7420726567697374657265642077697468206661637460648201527f6f72790000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600160008563ffffffff1663ffffffff168152602001908152602001600020600101548573ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104169190610bc7565b11610422575050505050565b60028573ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561046f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104939190610c0f565b60028111156104a4576104a4610be0565b146104b0575050505050565b60405180604001604052806105308773ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052d9190610bc7565b90565b81526020018673ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610580573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a49190610bc7565b905263ffffffff909416600090815260016020818152604090922086518155959091015194019390935550505050565b600054610100900460ff16158080156105f45750600054600160ff909116105b8061060e5750303b15801561060e575060005460ff166001145b61069a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161037b565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156106f857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60005b825181101561075e57600083828151811061071857610718610c30565b60209081029190910181015180820151905163ffffffff16600090815260018084526040909120825181559190920151910155508061075681610c5f565b9150506106fb565b5080156107c257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60005b838110156107fd5781810151838201526020016107e5565b8381111561080c576000848401525b50505050565b6000815180845261082a8160208601602086016107e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061086f6020830184610812565b9392505050565b63ffffffff8116811461088857600080fd5b50565b60006020828403121561089d57600080fd5b813561086f81610876565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156108fa576108fa6108a8565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610947576109476108a8565b604052919050565b6000602080838503121561096257600080fd5b823567ffffffffffffffff8082111561097a57600080fd5b818501915085601f83011261098e57600080fd5b8135818111156109a0576109a06108a8565b6109ae848260051b01610900565b818152848101925060609182028401850191888311156109cd57600080fd5b938501935b82851015610a5c57848903818112156109eb5760008081fd5b6109f36108d7565b86356109fe81610876565b815260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301811315610a325760008081fd5b610a3a6108d7565b888a0135815290880135898201528189015285525093840193928501926109d2565b50979650505050505050565b600080600060608486031215610a7d57600080fd5b8351610a8881610876565b60208501516040860151919450925067ffffffffffffffff80821115610aad57600080fd5b818601915086601f830112610ac157600080fd5b815181811115610ad357610ad36108a8565b610b0460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610900565b9150808252876020828501011115610b1b57600080fd5b610b2c8160208401602086016107e2565b5080925050509250925092565b63ffffffff84168152826020820152606060408201526000610b5e6060830184610812565b95945050505050565b60008060408385031215610b7a57600080fd5b825173ffffffffffffffffffffffffffffffffffffffff81168114610b9e57600080fd5b602084015190925067ffffffffffffffff81168114610bbc57600080fd5b809150509250929050565b600060208284031215610bd957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215610c2157600080fd5b81516003811061086f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610cb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea164736f6c634300080f000a"; + hex"608060405234801561001057600080fd5b50600436106100675760003560e01c8063838c2d1e11610050578063838c2d1e146100fa578063c303f0df14610104578063f2b4e6171461011757600080fd5b806354fd4d501461006c5780637258a807146100be575b600080fd5b6100a86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100b5919061085c565b60405180910390f35b6100e56100cc36600461088b565b6001602081905260009182526040909120805491015482565b604080519283526020830191909152016100b5565b61010261015b565b005b61010261011236600461094f565b6105d4565b60405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d1681526020016100b5565b600033905060008060008373ffffffffffffffffffffffffffffffffffffffff1663fa24f7436040518163ffffffff1660e01b8152600401600060405180830381865afa1580156101b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526101f69190810190610a68565b92509250925060007f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d73ffffffffffffffffffffffffffffffffffffffff16635f0150cb8585856040518463ffffffff1660e01b815260040161025b93929190610b39565b6040805180830381865afa158015610277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029b9190610b67565b5090508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f416e63686f72537461746552656769737472793a206661756c7420646973707560448201527f74652067616d65206e6f7420726567697374657265642077697468206661637460648201527f6f72790000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600160008563ffffffff1663ffffffff168152602001908152602001600020600101548573ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104169190610bc7565b11610422575050505050565b60028573ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561046f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104939190610c0f565b60028111156104a4576104a4610be0565b146104b0575050505050565b60405180604001604052806105308773ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052d9190610bc7565b90565b81526020018673ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610580573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a49190610bc7565b905263ffffffff909416600090815260016020818152604090922086518155959091015194019390935550505050565b600054610100900460ff16158080156105f45750600054600160ff909116105b8061060e5750303b15801561060e575060005460ff166001145b61069a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161037b565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156106f857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60005b825181101561075e57600083828151811061071857610718610c30565b60209081029190910181015180820151905163ffffffff16600090815260018084526040909120825181559190920151910155508061075681610c5f565b9150506106fb565b5080156107c257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60005b838110156107fd5781810151838201526020016107e5565b8381111561080c576000848401525b50505050565b6000815180845261082a8160208601602086016107e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061086f6020830184610812565b9392505050565b63ffffffff8116811461088857600080fd5b50565b60006020828403121561089d57600080fd5b813561086f81610876565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156108fa576108fa6108a8565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610947576109476108a8565b604052919050565b6000602080838503121561096257600080fd5b823567ffffffffffffffff8082111561097a57600080fd5b818501915085601f83011261098e57600080fd5b8135818111156109a0576109a06108a8565b6109ae848260051b01610900565b818152848101925060609182028401850191888311156109cd57600080fd5b938501935b82851015610a5c57848903818112156109eb5760008081fd5b6109f36108d7565b86356109fe81610876565b815260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301811315610a325760008081fd5b610a3a6108d7565b888a0135815290880135898201528189015285525093840193928501926109d2565b50979650505050505050565b600080600060608486031215610a7d57600080fd5b8351610a8881610876565b60208501516040860151919450925067ffffffffffffffff80821115610aad57600080fd5b818601915086601f830112610ac157600080fd5b815181811115610ad357610ad36108a8565b610b0460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610900565b9150808252876020828501011115610b1b57600080fd5b610b2c8160208401602086016107e2565b5080925050509250925092565b63ffffffff84168152826020820152606060408201526000610b5e6060830184610812565b95945050505050565b60008060408385031215610b7a57600080fd5b825173ffffffffffffffffffffffffffffffffffffffff81168114610b9e57600080fd5b602084015190925067ffffffffffffffff81168114610bbc57600080fd5b809150509250929050565b600060208284031215610bd957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215610c2157600080fd5b81516003811061086f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610cb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea164736f6c634300080f000a"; bytes internal constant acc32Code = - hex"6080604052600436106102f25760003560e01c806370872aa51161018f578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b18578063fa315aa914610b3c578063fe2bbeb214610b6f57600080fd5b8063ec5e630814610a95578063eff0f59214610ac8578063f8f43ff614610af857600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a0f578063d8cc1a3c14610a42578063dabd396d14610a6257600080fd5b8063c6f0308c14610937578063cf09e0d0146109c1578063d5d44d80146109e257600080fd5b80638d450a9511610143578063bcef3b551161011d578063bcef3b55146108b7578063bd8da956146108f7578063c395e1ca1461091757600080fd5b80638d450a9514610777578063a445ece6146107aa578063bbdc02db1461087657600080fd5b80638129fc1c116101745780638129fc1c1461071a5780638980e0cc146107225780638b85902b1461073757600080fd5b806370872aa5146106f25780637b0f0adc1461070757600080fd5b80633fc8cef3116102485780635c0cba33116101fc5780636361506d116101d65780636361506d1461066c5780636b6716c0146106ac5780636f034409146106df57600080fd5b80635c0cba3314610604578063609d33341461063757806360e274641461064c57600080fd5b806354fd4d501161022d57806354fd4d501461055e57806357da950e146105b45780635a5fa2d9146105e457600080fd5b80633fc8cef314610518578063472777c61461054b57600080fd5b80632810e1d6116102aa57806337b1b2291161028457806337b1b229146104655780633a768463146104a55780633e3ac912146104d857600080fd5b80632810e1d6146103de5780632ad69aeb146103f357806330dbe5701461041357600080fd5b806319effeb4116102db57806319effeb414610339578063200d2ed21461038457806325fc2ace146103bf57600080fd5b806301935130146102f757806303c2924d14610319575b600080fd5b34801561030357600080fd5b5061031761031236600461532d565b610b9f565b005b34801561032557600080fd5b50610317610334366004615388565b610ec0565b34801561034557600080fd5b506000546103669068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561039057600080fd5b506000546103b290700100000000000000000000000000000000900460ff1681565b60405161037b91906153d9565b3480156103cb57600080fd5b506008545b60405190815260200161037b565b3480156103ea57600080fd5b506103b2611566565b3480156103ff57600080fd5b506103d061040e366004615388565b61180b565b34801561041f57600080fd5b506001546104409073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161037b565b34801561047157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610440565b3480156104b157600080fd5b507f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d40773610440565b3480156104e457600080fd5b50600054610508907201000000000000000000000000000000000000900460ff1681565b604051901515815260200161037b565b34801561052457600080fd5b507f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d610440565b61031761055936600461541a565b611841565b34801561056a57600080fd5b506105a76040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161037b91906154b1565b3480156105c057600080fd5b506008546009546105cf919082565b6040805192835260208301919091520161037b565b3480156105f057600080fd5b506103d06105ff3660046154c4565b611853565b34801561061057600080fd5b507f00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df99610440565b34801561064357600080fd5b506105a761188d565b34801561065857600080fd5b50610317610667366004615502565b61189b565b34801561067857600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103d0565b3480156106b857600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610366565b6103176106ed366004615534565b611a42565b3480156106fe57600080fd5b506009546103d0565b61031761071536600461541a565b6123e3565b6103176123f0565b34801561072e57600080fd5b506002546103d0565b34801561074357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103d0565b34801561078357600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103d0565b3480156107b657600080fd5b506108226107c53660046154c4565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff16606082015260800161037b565b34801561088257600080fd5b5060405163ffffffff7f000000000000000000000000000000000000000000000000000000000000000016815260200161037b565b3480156108c357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103d0565b34801561090357600080fd5b506103666109123660046154c4565b612949565b34801561092357600080fd5b506103d0610932366004615573565b612b28565b34801561094357600080fd5b506109576109523660046154c4565b612d0b565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e00161037b565b3480156109cd57600080fd5b506000546103669067ffffffffffffffff1681565b3480156109ee57600080fd5b506103d06109fd366004615502565b60036020526000908152604090205481565b348015610a1b57600080fd5b507f00000000000000000000000000000000000000000000000000000000000003856103d0565b348015610a4e57600080fd5b50610317610a5d3660046155a5565b612da2565b348015610a6e57600080fd5b507f00000000000000000000000000000000000000000000000000000000000004b0610366565b348015610aa157600080fd5b507f00000000000000000000000000000000000000000000000000000000000000046103d0565b348015610ad457600080fd5b50610508610ae33660046154c4565b60046020526000908152604090205460ff1681565b348015610b0457600080fd5b50610317610b1336600461541a565b6133d1565b348015610b2457600080fd5b50610b2d613823565b60405161037b9392919061562f565b348015610b4857600080fd5b507f00000000000000000000000000000000000000000000000000000000000000086103d0565b348015610b7b57600080fd5b50610508610b8a3660046154c4565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610bcb57610bcb6153aa565b14610c02576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610c55576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c8c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610ca3610c9e36869003860186615683565b613883565b14610cda576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610cef929190615710565b604051809103902014610d2e576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d77610d7284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506138df92505050565b61394c565b90506000610d9e82600881518110610d9157610d91615720565b6020026020010151613b02565b9050602081511115610ddc576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610e51576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610eec57610eec6153aa565b14610f23576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610f3857610f38615720565b906000526020600020906005020190506000610f5384612949565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b081169082161015610fbc576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611005576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561102257508515155b156110bd578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110555781611071565b600186015473ffffffffffffffffffffffffffffffffffffffff165b905061107d8187613bb6565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff166060830152611160576fffffffffffffffffffffffffffffffff6040820152600181526000869003611160578195505b600086826020015163ffffffff16611178919061577e565b90506000838211611189578161118b565b835b602084015190915063ffffffff165b818110156112d75760008682815481106111b6576111b6615720565b6000918252602080832090910154808352600690915260409091205490915060ff1661120e576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061122357611223615720565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112805750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b156112c257600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b505080806112cf90615796565b91505061119a565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9093169290921790915584900361155b57606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558915801561145757506000547201000000000000000000000000000000000000900460ff165b156114cc5760015473ffffffffffffffffffffffffffffffffffffffff1661147f818a613bb6565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff909116178855611559565b61151373ffffffffffffffffffffffffffffffffffffffff8216156114f1578161150d565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89613bb6565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff166002811115611594576115946153aa565b146115cb576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff1661162f576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008154811061165b5761165b615720565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611696576001611699565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff9091161770010000000000000000000000000000000083600281111561174a5761174a6153aa565b02179055600281111561175f5761175f6153aa565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df9973ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156117f057600080fd5b505af1158015611804573d6000803e3d6000fd5b5050505090565b6005602052816000526040600020818154811061182757600080fd5b90600052602060002001600091509150505481565b905090565b61184e8383836001611a42565b505050565b6000818152600760209081526040808320600590925282208054825461188490610100900463ffffffff16826157ce565b95945050505050565b606061183c60546020613cb7565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812080549082905590819003611900576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d169063f3fef3a390604401600060405180830381600087803b15801561199057600080fd5b505af11580156119a4573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a02576040519150601f19603f3d011682016040523d82523d6000602084013e611a07565b606091505b505090508061184e576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054700100000000000000000000000000000000900460ff166002811115611a6e57611a6e6153aa565b14611aa5576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110611aba57611aba615720565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514611ba1576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000611c61826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580611c9c5750611c997f0000000000000000000000000000000000000000000000000000000000000004600261577e565b81145b8015611ca6575084155b15611cdd576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015611d03575086155b15611d3a576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000008811115611d94576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dbf7f0000000000000000000000000000000000000000000000000000000000000004600161577e565b8103611dd157611dd186888588613d09565b34611ddb83612b28565b14611e12576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e1d88612949565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b0811690821603611e85576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b016611ee591906157e5565b67ffffffffffffffff16611f008267ffffffffffffffff1690565b67ffffffffffffffff161115611fe2576000611f3d60017f00000000000000000000000000000000000000000000000000000000000000046157ce565b8314611f735767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016611fa8565b611fa87f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16600261580e565b9050611fde817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff166157e5565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526004602052604090205490915060ff1615612060576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008b815260200190815260200160002060016002805490506122f691906157ce565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d169263d0e30db09234926004808301939282900301818588803b15801561238e57600080fd5b505af11580156123a2573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b61184e8383836000611a42565b60005471010000000000000000000000000000000000900460ff1615612442576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000000166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df991690637258a807906024016040805180830381865afa1580156124f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251a919061583e565b909250905081612556576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461258957639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036054013511612623576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d9092169363d0e30db093926004828101939282900301818588803b1580156128f857600080fd5b505af115801561290c573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b600080600054700100000000000000000000000000000000900460ff166002811115612977576129776153aa565b146129ae576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600283815481106129c3576129c3615720565b600091825260208220600590910201805490925063ffffffff90811614612a3257815460028054909163ffffffff16908110612a0157612a01615720565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090612a6a90700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b612a7e9067ffffffffffffffff16426157ce565b612a9d612a5d846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16612ab1919061577e565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b01667ffffffffffffffff168167ffffffffffffffff1611612afe5780611884565b7f00000000000000000000000000000000000000000000000000000000000004b095945050505050565b600080612bc7836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000008811115612c26576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000612c418383615891565b9050670de0b6b3a76400006000612c78827f00000000000000000000000000000000000000000000000000000000000000086158a5565b90506000612c96612c91670de0b6b3a7640000866158a5565b613eba565b90506000612ca48484614115565b90506000612cb28383614164565b90506000612cbf82614192565b90506000612cde82612cd9670de0b6b3a76400008f6158a5565b61437a565b90506000612cec8b83614164565b9050612cf8818d6158a5565b9f9e505050505050505050505050505050565b60028181548110612d1b57600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff166002811115612dce57612dce6153aa565b14612e05576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110612e1a57612e1a615720565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050612e797f0000000000000000000000000000000000000000000000000000000000000008600161577e565b612f15826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614612f4f576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080891561304657612fa27f00000000000000000000000000000000000000000000000000000000000000047f00000000000000000000000000000000000000000000000000000000000000086157ce565b6001901b612fc1846fffffffffffffffffffffffffffffffff166143b4565b6fffffffffffffffffffffffffffffffff16612fdd91906158e2565b1561301a5761301161300260016fffffffffffffffffffffffffffffffff87166158f6565b865463ffffffff166000614453565b6003015461303c565b7f00000000000000000000000000000000000000000000000000000000000000005b9150849050613070565b6003850154915061306d6130026fffffffffffffffffffffffffffffffff8616600161591f565b90505b600882901b60088a8a604051613087929190615710565b6040518091039020901b146130c8576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006130d38c614537565b905060006130e2836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d4077373ffffffffffffffffffffffffffffffffffffffff169063e14ced329061315c908f908f908f908f908a9060040161599c565b6020604051808303816000875af115801561317b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319f91906159d6565b60048501549114915060009060029061324a906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6132e6896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6132f091906159ef565b6132fa9190615a12565b60ff16159050811515810361333b576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff1615613392576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff1660028111156133fd576133fd6153aa565b14613434576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008061344386614566565b935093509350935060006134598585858561496f565b905060007f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d4077373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134ec9190615a34565b9050600189036135e45773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84613548367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af11580156135ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135de91906159d6565b5061155b565b600289036136105773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489613548565b6003890361363c5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487613548565b600489036137585760006136826fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000004614a29565b60095461368f919061577e565b61369a90600161577e565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561372d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061375191906159d6565b505061155b565b600589036137f1576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000038560c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a40161359b565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360140135606061387c61188d565b9050909192565b600081600001518260200151836040015184606001516040516020016138c2949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6040805180820190915260008082526020820152815160000361392e576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b6060600080600061395c85614ad7565b919450925090506001816001811115613977576139776153aa565b146139ae576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516139ba838561577e565b146139f1576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081613a085790505093506000835b8651811015613af657600080613a7b6040518060400160405280858c60000151613a5f91906157ce565b8152602001858c60200151613a74919061577e565b9052614ad7565b509150915060405180604001604052808383613a97919061577e565b8152602001848b60200151613aac919061577e565b815250888581518110613ac157613ac1615720565b6020908102919091010152613ad760018561577e565b9350613ae3818361577e565b613aed908461577e565b92505050613a35565b50845250919392505050565b60606000806000613b1285614ad7565b919450925090506000816001811115613b2d57613b2d6153aa565b14613b64576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b6e828461577e565b855114613ba7576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61188485602001518484614f75565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff90931692839290613c0590849061577e565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d1690637eee288d90604401600060405180830381600087803b158015613c9a57600080fd5b505af1158015613cae573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b6000613d286fffffffffffffffffffffffffffffffff8416600161591f565b90506000613d3882866001614453565b9050600086901a8380613e245750613d7160027f00000000000000000000000000000000000000000000000000000000000000046158e2565b6004830154600290613e15906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b613e1f9190615a12565b60ff16145b15613e7c5760ff811660011480613e3e575060ff81166002145b613e77576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161261a565b613cae565b60ff811615613cae576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161261a565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b1760008213613f1957631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a76400000215820261415257637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b6000816000190483118202156141825763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d782136141c057919050565b680755bf798b4a1bf1e582126141de5763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b60006143ab670de0b6b3a76400008361439286613eba565b61439c9190615a51565b6143a69190615b0d565b614192565b90505b92915050565b600080614441837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b6000808261449c576144976fffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000461500a565b6144b7565b6144b7856fffffffffffffffffffffffffffffffff16615196565b9050600284815481106144cc576144cc615720565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461452f57815460028054909163ffffffff1690811061451a5761451a615720565b906000526020600020906005020191506144dd565b509392505050565b600080600080600061454886614566565b935093509350935061455c8484848461496f565b9695505050505050565b600080600080600085905060006002828154811061458657614586615720565b600091825260209091206004600590920201908101549091507f00000000000000000000000000000000000000000000000000000000000000049061465d906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611614697576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f00000000000000000000000000000000000000000000000000000000000000049061475e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156147d357825463ffffffff1661479d7f0000000000000000000000000000000000000000000000000000000000000004600161577e565b83036147a7578391505b600281815481106147ba576147ba615720565b906000526020600020906005020193508094505061469b565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661483c614827856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561490b576000614874836fffffffffffffffffffffffffffffffff166143b4565b6fffffffffffffffffffffffffffffffff1611156148df5760006148b66148ae60016fffffffffffffffffffffffffffffffff86166158f6565b896001614453565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506148e59050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614961565b600061492d6148ae6fffffffffffffffffffffffffffffffff8516600161591f565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff8416156149dc5760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611884565b8282604051602001614a0a9291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b600080614ab6847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614b1a576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614b3f576000600160009450945094505050614f6e565b60b78111614c55576000614b546080836157ce565b905080876000015111614b93576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614c0b57507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614c42576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614f6e915050565b60bf8111614db3576000614c6a60b7836157ce565b905080876000015111614ca9576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614d0b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614d53576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614d5d818461577e565b895111614d96576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614da183600161577e565b9750955060009450614f6e9350505050565b60f78111614e18576000614dc860c0836157ce565b905080876000015111614e07576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614f6e915050565b6000614e2560f7836157ce565b905080876000015111614e64576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614ec6576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614f0e576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f18818461577e565b895111614f51576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f5c83600161577e565b9750955060019450614f6e9350505050565b9193909250565b60608167ffffffffffffffff811115614f9057614f90615654565b6040519080825280601f01601f191660200182016040528015614fba576020820181803683370190505b5090508115615003576000614fcf848661577e565b90506020820160005b84811015614ff0578281015182820152602001614fd8565b84811115614fff576000858301525b5050505b9392505050565b6000816150a9846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116150bf5763b34b5c226000526004601cfd5b6150c883615196565b905081615167826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116143ae576143ab61517d83600161577e565b6fffffffffffffffffffffffffffffffff83169061523b565b6000811960018301168161522a827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b6000806152c8847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f8401126152f657600080fd5b50813567ffffffffffffffff81111561530e57600080fd5b60208301915083602082850101111561532657600080fd5b9250929050565b600080600083850360a081121561534357600080fd5b608081121561535157600080fd5b50839250608084013567ffffffffffffffff81111561536f57600080fd5b61537b868287016152e4565b9497909650939450505050565b6000806040838503121561539b57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310615414577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060006060848603121561542f57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b8181101561546c57602081850181015186830182015201615450565b8181111561547e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006143ab6020830184615446565b6000602082840312156154d657600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146154ff57600080fd5b50565b60006020828403121561551457600080fd5b8135615003816154dd565b8035801515811461552f57600080fd5b919050565b6000806000806080858703121561554a57600080fd5b8435935060208501359250604085013591506155686060860161551f565b905092959194509250565b60006020828403121561558557600080fd5b81356fffffffffffffffffffffffffffffffff8116811461500357600080fd5b600080600080600080608087890312156155be57600080fd5b863595506155ce6020880161551f565b9450604087013567ffffffffffffffff808211156155eb57600080fd5b6155f78a838b016152e4565b9096509450606089013591508082111561561057600080fd5b5061561d89828a016152e4565b979a9699509497509295939492505050565b63ffffffff841681528260208201526060604082015260006118846060830184615446565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561569557600080fd5b6040516080810181811067ffffffffffffffff821117156156df577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156157915761579161574f565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157c7576157c761574f565b5060010190565b6000828210156157e0576157e061574f565b500390565b600067ffffffffffffffff838116908316818110156158065761580661574f565b039392505050565b600067ffffffffffffffff808316818516818304811182151516156158355761583561574f565b02949350505050565b6000806040838503121561585157600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826158a0576158a0615862565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156158dd576158dd61574f565b500290565b6000826158f1576158f1615862565b500690565b60006fffffffffffffffffffffffffffffffff838116908316818110156158065761580661574f565b60006fffffffffffffffffffffffffffffffff80831681851680830382111561594a5761594a61574f565b01949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6060815260006159b0606083018789615953565b82810360208401526159c3818688615953565b9150508260408301529695505050505050565b6000602082840312156159e857600080fd5b5051919050565b600060ff821660ff841680821015615a0957615a0961574f565b90039392505050565b600060ff831680615a2557615a25615862565b8060ff84160691505092915050565b600060208284031215615a4657600080fd5b8151615003816154dd565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615a9257615a9261574f565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615acd57615acd61574f565b60008712925087820587128484161615615ae957615ae961574f565b87850587128184161615615aff57615aff61574f565b505050929093029392505050565b600082615b1c57615b1c615862565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615b7057615b7061574f565b50059056fea164736f6c634300080f000a"; + hex"6080604052600436106102f25760003560e01c806370872aa51161018f578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b18578063fa315aa914610b3c578063fe2bbeb214610b6f57600080fd5b8063ec5e630814610a95578063eff0f59214610ac8578063f8f43ff614610af857600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a0f578063d8cc1a3c14610a42578063dabd396d14610a6257600080fd5b8063c6f0308c14610937578063cf09e0d0146109c1578063d5d44d80146109e257600080fd5b80638d450a9511610143578063bcef3b551161011d578063bcef3b55146108b7578063bd8da956146108f7578063c395e1ca1461091757600080fd5b80638d450a9514610777578063a445ece6146107aa578063bbdc02db1461087657600080fd5b80638129fc1c116101745780638129fc1c1461071a5780638980e0cc146107225780638b85902b1461073757600080fd5b806370872aa5146106f25780637b0f0adc1461070757600080fd5b80633fc8cef3116102485780635c0cba33116101fc5780636361506d116101d65780636361506d1461066c5780636b6716c0146106ac5780636f034409146106df57600080fd5b80635c0cba3314610604578063609d33341461063757806360e274641461064c57600080fd5b806354fd4d501161022d57806354fd4d501461055e57806357da950e146105b45780635a5fa2d9146105e457600080fd5b80633fc8cef314610518578063472777c61461054b57600080fd5b80632810e1d6116102aa57806337b1b2291161028457806337b1b229146104655780633a768463146104a55780633e3ac912146104d857600080fd5b80632810e1d6146103de5780632ad69aeb146103f357806330dbe5701461041357600080fd5b806319effeb4116102db57806319effeb414610339578063200d2ed21461038457806325fc2ace146103bf57600080fd5b806301935130146102f757806303c2924d14610319575b600080fd5b34801561030357600080fd5b5061031761031236600461532d565b610b9f565b005b34801561032557600080fd5b50610317610334366004615388565b610ec0565b34801561034557600080fd5b506000546103669068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561039057600080fd5b506000546103b290700100000000000000000000000000000000900460ff1681565b60405161037b91906153d9565b3480156103cb57600080fd5b506008545b60405190815260200161037b565b3480156103ea57600080fd5b506103b2611566565b3480156103ff57600080fd5b506103d061040e366004615388565b61180b565b34801561041f57600080fd5b506001546104409073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161037b565b34801561047157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610440565b3480156104b157600080fd5b507f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d40773610440565b3480156104e457600080fd5b50600054610508907201000000000000000000000000000000000000900460ff1681565b604051901515815260200161037b565b34801561052457600080fd5b507f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92610440565b61031761055936600461541a565b611841565b34801561056a57600080fd5b506105a76040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161037b91906154b1565b3480156105c057600080fd5b506008546009546105cf919082565b6040805192835260208301919091520161037b565b3480156105f057600080fd5b506103d06105ff3660046154c4565b611853565b34801561061057600080fd5b507f000000000000000000000000d6eaf4c146261653ee059077b78ed088add54309610440565b34801561064357600080fd5b506105a761188d565b34801561065857600080fd5b50610317610667366004615502565b61189b565b34801561067857600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103d0565b3480156106b857600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610366565b6103176106ed366004615534565b611a42565b3480156106fe57600080fd5b506009546103d0565b61031761071536600461541a565b6123e3565b6103176123f0565b34801561072e57600080fd5b506002546103d0565b34801561074357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103d0565b34801561078357600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103d0565b3480156107b657600080fd5b506108226107c53660046154c4565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff16606082015260800161037b565b34801561088257600080fd5b5060405163ffffffff7f000000000000000000000000000000000000000000000000000000000000000016815260200161037b565b3480156108c357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103d0565b34801561090357600080fd5b506103666109123660046154c4565b612949565b34801561092357600080fd5b506103d0610932366004615573565b612b28565b34801561094357600080fd5b506109576109523660046154c4565b612d0b565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e00161037b565b3480156109cd57600080fd5b506000546103669067ffffffffffffffff1681565b3480156109ee57600080fd5b506103d06109fd366004615502565b60036020526000908152604090205481565b348015610a1b57600080fd5b507f00000000000000000000000000000000000000000000000000000000000003856103d0565b348015610a4e57600080fd5b50610317610a5d3660046155a5565b612da2565b348015610a6e57600080fd5b507f00000000000000000000000000000000000000000000000000000000000004b0610366565b348015610aa157600080fd5b507f00000000000000000000000000000000000000000000000000000000000000046103d0565b348015610ad457600080fd5b50610508610ae33660046154c4565b60046020526000908152604090205460ff1681565b348015610b0457600080fd5b50610317610b1336600461541a565b6133d1565b348015610b2457600080fd5b50610b2d613823565b60405161037b9392919061562f565b348015610b4857600080fd5b507f00000000000000000000000000000000000000000000000000000000000000086103d0565b348015610b7b57600080fd5b50610508610b8a3660046154c4565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610bcb57610bcb6153aa565b14610c02576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610c55576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c8c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610ca3610c9e36869003860186615683565b613883565b14610cda576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610cef929190615710565b604051809103902014610d2e576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d77610d7284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506138df92505050565b61394c565b90506000610d9e82600881518110610d9157610d91615720565b6020026020010151613b02565b9050602081511115610ddc576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610e51576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610eec57610eec6153aa565b14610f23576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610f3857610f38615720565b906000526020600020906005020190506000610f5384612949565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b081169082161015610fbc576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611005576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561102257508515155b156110bd578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110555781611071565b600186015473ffffffffffffffffffffffffffffffffffffffff165b905061107d8187613bb6565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff166060830152611160576fffffffffffffffffffffffffffffffff6040820152600181526000869003611160578195505b600086826020015163ffffffff16611178919061577e565b90506000838211611189578161118b565b835b602084015190915063ffffffff165b818110156112d75760008682815481106111b6576111b6615720565b6000918252602080832090910154808352600690915260409091205490915060ff1661120e576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061122357611223615720565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112805750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b156112c257600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b505080806112cf90615796565b91505061119a565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9093169290921790915584900361155b57606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558915801561145757506000547201000000000000000000000000000000000000900460ff165b156114cc5760015473ffffffffffffffffffffffffffffffffffffffff1661147f818a613bb6565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff909116178855611559565b61151373ffffffffffffffffffffffffffffffffffffffff8216156114f1578161150d565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89613bb6565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff166002811115611594576115946153aa565b146115cb576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff1661162f576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008154811061165b5761165b615720565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611696576001611699565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff9091161770010000000000000000000000000000000083600281111561174a5761174a6153aa565b02179055600281111561175f5761175f6153aa565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f000000000000000000000000d6eaf4c146261653ee059077b78ed088add5430973ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156117f057600080fd5b505af1158015611804573d6000803e3d6000fd5b5050505090565b6005602052816000526040600020818154811061182757600080fd5b90600052602060002001600091509150505481565b905090565b61184e8383836001611a42565b505050565b6000818152600760209081526040808320600590925282208054825461188490610100900463ffffffff16826157ce565b95945050505050565b606061183c60546020613cb7565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812080549082905590819003611900576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92169063f3fef3a390604401600060405180830381600087803b15801561199057600080fd5b505af11580156119a4573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a02576040519150601f19603f3d011682016040523d82523d6000602084013e611a07565b606091505b505090508061184e576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054700100000000000000000000000000000000900460ff166002811115611a6e57611a6e6153aa565b14611aa5576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110611aba57611aba615720565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514611ba1576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000611c61826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580611c9c5750611c997f0000000000000000000000000000000000000000000000000000000000000004600261577e565b81145b8015611ca6575084155b15611cdd576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015611d03575086155b15611d3a576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000008811115611d94576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dbf7f0000000000000000000000000000000000000000000000000000000000000004600161577e565b8103611dd157611dd186888588613d09565b34611ddb83612b28565b14611e12576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e1d88612949565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b0811690821603611e85576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b016611ee591906157e5565b67ffffffffffffffff16611f008267ffffffffffffffff1690565b67ffffffffffffffff161115611fe2576000611f3d60017f00000000000000000000000000000000000000000000000000000000000000046157ce565b8314611f735767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016611fa8565b611fa87f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16600261580e565b9050611fde817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff166157e5565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526004602052604090205490915060ff1615612060576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008b815260200190815260200160002060016002805490506122f691906157ce565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92169263d0e30db09234926004808301939282900301818588803b15801561238e57600080fd5b505af11580156123a2573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b61184e8383836000611a42565b60005471010000000000000000000000000000000000900460ff1615612442576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000000166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000d6eaf4c146261653ee059077b78ed088add543091690637258a807906024016040805180830381865afa1580156124f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251a919061583e565b909250905081612556576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461258957639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036054013511612623576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd929092169363d0e30db093926004828101939282900301818588803b1580156128f857600080fd5b505af115801561290c573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b600080600054700100000000000000000000000000000000900460ff166002811115612977576129776153aa565b146129ae576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600283815481106129c3576129c3615720565b600091825260208220600590910201805490925063ffffffff90811614612a3257815460028054909163ffffffff16908110612a0157612a01615720565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090612a6a90700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b612a7e9067ffffffffffffffff16426157ce565b612a9d612a5d846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16612ab1919061577e565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b01667ffffffffffffffff168167ffffffffffffffff1611612afe5780611884565b7f00000000000000000000000000000000000000000000000000000000000004b095945050505050565b600080612bc7836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000008811115612c26576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000612c418383615891565b9050670de0b6b3a76400006000612c78827f00000000000000000000000000000000000000000000000000000000000000086158a5565b90506000612c96612c91670de0b6b3a7640000866158a5565b613eba565b90506000612ca48484614115565b90506000612cb28383614164565b90506000612cbf82614192565b90506000612cde82612cd9670de0b6b3a76400008f6158a5565b61437a565b90506000612cec8b83614164565b9050612cf8818d6158a5565b9f9e505050505050505050505050505050565b60028181548110612d1b57600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff166002811115612dce57612dce6153aa565b14612e05576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110612e1a57612e1a615720565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050612e797f0000000000000000000000000000000000000000000000000000000000000008600161577e565b612f15826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614612f4f576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080891561304657612fa27f00000000000000000000000000000000000000000000000000000000000000047f00000000000000000000000000000000000000000000000000000000000000086157ce565b6001901b612fc1846fffffffffffffffffffffffffffffffff166143b4565b6fffffffffffffffffffffffffffffffff16612fdd91906158e2565b1561301a5761301161300260016fffffffffffffffffffffffffffffffff87166158f6565b865463ffffffff166000614453565b6003015461303c565b7f00000000000000000000000000000000000000000000000000000000000000005b9150849050613070565b6003850154915061306d6130026fffffffffffffffffffffffffffffffff8616600161591f565b90505b600882901b60088a8a604051613087929190615710565b6040518091039020901b146130c8576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006130d38c614537565b905060006130e2836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d4077373ffffffffffffffffffffffffffffffffffffffff169063e14ced329061315c908f908f908f908f908a9060040161599c565b6020604051808303816000875af115801561317b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319f91906159d6565b60048501549114915060009060029061324a906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6132e6896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6132f091906159ef565b6132fa9190615a12565b60ff16159050811515810361333b576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff1615613392576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff1660028111156133fd576133fd6153aa565b14613434576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008061344386614566565b935093509350935060006134598585858561496f565b905060007f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d4077373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134ec9190615a34565b9050600189036135e45773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84613548367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af11580156135ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135de91906159d6565b5061155b565b600289036136105773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489613548565b6003890361363c5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487613548565b600489036137585760006136826fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000004614a29565b60095461368f919061577e565b61369a90600161577e565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561372d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061375191906159d6565b505061155b565b600589036137f1576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000038560c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a40161359b565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360140135606061387c61188d565b9050909192565b600081600001518260200151836040015184606001516040516020016138c2949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6040805180820190915260008082526020820152815160000361392e576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b6060600080600061395c85614ad7565b919450925090506001816001811115613977576139776153aa565b146139ae576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516139ba838561577e565b146139f1576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081613a085790505093506000835b8651811015613af657600080613a7b6040518060400160405280858c60000151613a5f91906157ce565b8152602001858c60200151613a74919061577e565b9052614ad7565b509150915060405180604001604052808383613a97919061577e565b8152602001848b60200151613aac919061577e565b815250888581518110613ac157613ac1615720565b6020908102919091010152613ad760018561577e565b9350613ae3818361577e565b613aed908461577e565b92505050613a35565b50845250919392505050565b60606000806000613b1285614ad7565b919450925090506000816001811115613b2d57613b2d6153aa565b14613b64576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b6e828461577e565b855114613ba7576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61188485602001518484614f75565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff90931692839290613c0590849061577e565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd921690637eee288d90604401600060405180830381600087803b158015613c9a57600080fd5b505af1158015613cae573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b6000613d286fffffffffffffffffffffffffffffffff8416600161591f565b90506000613d3882866001614453565b9050600086901a8380613e245750613d7160027f00000000000000000000000000000000000000000000000000000000000000046158e2565b6004830154600290613e15906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b613e1f9190615a12565b60ff16145b15613e7c5760ff811660011480613e3e575060ff81166002145b613e77576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161261a565b613cae565b60ff811615613cae576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161261a565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b1760008213613f1957631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a76400000215820261415257637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b6000816000190483118202156141825763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d782136141c057919050565b680755bf798b4a1bf1e582126141de5763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b60006143ab670de0b6b3a76400008361439286613eba565b61439c9190615a51565b6143a69190615b0d565b614192565b90505b92915050565b600080614441837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b6000808261449c576144976fffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000461500a565b6144b7565b6144b7856fffffffffffffffffffffffffffffffff16615196565b9050600284815481106144cc576144cc615720565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461452f57815460028054909163ffffffff1690811061451a5761451a615720565b906000526020600020906005020191506144dd565b509392505050565b600080600080600061454886614566565b935093509350935061455c8484848461496f565b9695505050505050565b600080600080600085905060006002828154811061458657614586615720565b600091825260209091206004600590920201908101549091507f00000000000000000000000000000000000000000000000000000000000000049061465d906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611614697576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f00000000000000000000000000000000000000000000000000000000000000049061475e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156147d357825463ffffffff1661479d7f0000000000000000000000000000000000000000000000000000000000000004600161577e565b83036147a7578391505b600281815481106147ba576147ba615720565b906000526020600020906005020193508094505061469b565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661483c614827856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561490b576000614874836fffffffffffffffffffffffffffffffff166143b4565b6fffffffffffffffffffffffffffffffff1611156148df5760006148b66148ae60016fffffffffffffffffffffffffffffffff86166158f6565b896001614453565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506148e59050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614961565b600061492d6148ae6fffffffffffffffffffffffffffffffff8516600161591f565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff8416156149dc5760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611884565b8282604051602001614a0a9291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b600080614ab6847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614b1a576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614b3f576000600160009450945094505050614f6e565b60b78111614c55576000614b546080836157ce565b905080876000015111614b93576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614c0b57507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614c42576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614f6e915050565b60bf8111614db3576000614c6a60b7836157ce565b905080876000015111614ca9576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614d0b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614d53576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614d5d818461577e565b895111614d96576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614da183600161577e565b9750955060009450614f6e9350505050565b60f78111614e18576000614dc860c0836157ce565b905080876000015111614e07576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614f6e915050565b6000614e2560f7836157ce565b905080876000015111614e64576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614ec6576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614f0e576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f18818461577e565b895111614f51576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f5c83600161577e565b9750955060019450614f6e9350505050565b9193909250565b60608167ffffffffffffffff811115614f9057614f90615654565b6040519080825280601f01601f191660200182016040528015614fba576020820181803683370190505b5090508115615003576000614fcf848661577e565b90506020820160005b84811015614ff0578281015182820152602001614fd8565b84811115614fff576000858301525b5050505b9392505050565b6000816150a9846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116150bf5763b34b5c226000526004601cfd5b6150c883615196565b905081615167826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116143ae576143ab61517d83600161577e565b6fffffffffffffffffffffffffffffffff83169061523b565b6000811960018301168161522a827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b6000806152c8847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f8401126152f657600080fd5b50813567ffffffffffffffff81111561530e57600080fd5b60208301915083602082850101111561532657600080fd5b9250929050565b600080600083850360a081121561534357600080fd5b608081121561535157600080fd5b50839250608084013567ffffffffffffffff81111561536f57600080fd5b61537b868287016152e4565b9497909650939450505050565b6000806040838503121561539b57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310615414577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060006060848603121561542f57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b8181101561546c57602081850181015186830182015201615450565b8181111561547e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006143ab6020830184615446565b6000602082840312156154d657600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146154ff57600080fd5b50565b60006020828403121561551457600080fd5b8135615003816154dd565b8035801515811461552f57600080fd5b919050565b6000806000806080858703121561554a57600080fd5b8435935060208501359250604085013591506155686060860161551f565b905092959194509250565b60006020828403121561558557600080fd5b81356fffffffffffffffffffffffffffffffff8116811461500357600080fd5b600080600080600080608087890312156155be57600080fd5b863595506155ce6020880161551f565b9450604087013567ffffffffffffffff808211156155eb57600080fd5b6155f78a838b016152e4565b9096509450606089013591508082111561561057600080fd5b5061561d89828a016152e4565b979a9699509497509295939492505050565b63ffffffff841681528260208201526060604082015260006118846060830184615446565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561569557600080fd5b6040516080810181811067ffffffffffffffff821117156156df577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156157915761579161574f565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157c7576157c761574f565b5060010190565b6000828210156157e0576157e061574f565b500390565b600067ffffffffffffffff838116908316818110156158065761580661574f565b039392505050565b600067ffffffffffffffff808316818516818304811182151516156158355761583561574f565b02949350505050565b6000806040838503121561585157600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826158a0576158a0615862565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156158dd576158dd61574f565b500290565b6000826158f1576158f1615862565b500690565b60006fffffffffffffffffffffffffffffffff838116908316818110156158065761580661574f565b60006fffffffffffffffffffffffffffffffff80831681851680830382111561594a5761594a61574f565b01949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6060815260006159b0606083018789615953565b82810360208401526159c3818688615953565b9150508260408301529695505050505050565b6000602082840312156159e857600080fd5b5051919050565b600060ff821660ff841680821015615a0957615a0961574f565b90039392505050565b600060ff831680615a2557615a25615862565b8060ff84160691505092915050565b600060208284031215615a4657600080fd5b8151615003816154dd565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615a9257615a9261574f565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615acd57615acd61574f565b60008712925087820587128484161615615ae957615ae961574f565b87850587128184161615615aff57615aff61574f565b505050929093029392505050565b600082615b1c57615b1c615862565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615b7057615b7061574f565b50059056fea164736f6c634300080f000a"; bytes internal constant acc33Code = - hex"6080604052600436106103085760003560e01c806370872aa51161019a578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b94578063fa315aa914610bb8578063fe2bbeb214610beb57600080fd5b8063ec5e630814610b11578063eff0f59214610b44578063f8f43ff614610b7457600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a8b578063d8cc1a3c14610abe578063dabd396d14610ade57600080fd5b8063c6f0308c146109b3578063cf09e0d014610a3d578063d5d44d8014610a5e57600080fd5b8063a445ece611610143578063bcef3b551161011d578063bcef3b5514610933578063bd8da95614610973578063c395e1ca1461099357600080fd5b8063a445ece6146107f3578063a8e4fb90146108bf578063bbdc02db146108f257600080fd5b80638980e0cc116101745780638980e0cc1461076b5780638b85902b146107805780638d450a95146107c057600080fd5b806370872aa51461073b5780637b0f0adc146107505780638129fc1c1461076357600080fd5b80633fc8cef31161025e5780635c0cba33116102075780636361506d116101e15780636361506d146106b55780636b6716c0146106f55780636f0344091461072857600080fd5b80635c0cba331461064d578063609d33341461068057806360e274641461069557600080fd5b806354fd4d501161023857806354fd4d50146105a757806357da950e146105fd5780635a5fa2d91461062d57600080fd5b80633fc8cef31461052e578063472777c614610561578063534db0e21461057457600080fd5b80632810e1d6116102c057806337b1b2291161029a57806337b1b2291461047b5780633a768463146104bb5780633e3ac912146104ee57600080fd5b80632810e1d6146103f45780632ad69aeb1461040957806330dbe5701461042957600080fd5b806319effeb4116102f157806319effeb41461034f578063200d2ed21461039a57806325fc2ace146103d557600080fd5b8063019351301461030d57806303c2924d1461032f575b600080fd5b34801561031957600080fd5b5061032d6103283660046155a8565b610c1b565b005b34801561033b57600080fd5b5061032d61034a366004615603565b610f3c565b34801561035b57600080fd5b5060005461037c9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156103a657600080fd5b506000546103c890700100000000000000000000000000000000900460ff1681565b6040516103919190615654565b3480156103e157600080fd5b506008545b604051908152602001610391565b34801561040057600080fd5b506103c86115e2565b34801561041557600080fd5b506103e6610424366004615603565b611887565b34801561043557600080fd5b506001546104569073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610391565b34801561048757600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610456565b3480156104c757600080fd5b507f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d40773610456565b3480156104fa57600080fd5b5060005461051e907201000000000000000000000000000000000000900460ff1681565b6040519015158152602001610391565b34801561053a57600080fd5b507f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d610456565b61032d61056f366004615695565b6118bd565b34801561058057600080fd5b507f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63610456565b3480156105b357600080fd5b506105f06040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b604051610391919061572c565b34801561060957600080fd5b50600854600954610618919082565b60408051928352602083019190915201610391565b34801561063957600080fd5b506103e661064836600461573f565b6118cf565b34801561065957600080fd5b507f00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df99610456565b34801561068c57600080fd5b506105f0611909565b3480156106a157600080fd5b5061032d6106b036600461577d565b611917565b3480156106c157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103e6565b34801561070157600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061037c565b61032d6107363660046157af565b611abe565b34801561074757600080fd5b506009546103e6565b61032d61075e366004615695565b611b7f565b61032d611b8c565b34801561077757600080fd5b506002546103e6565b34801561078c57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103e6565b3480156107cc57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103e6565b3480156107ff57600080fd5b5061086b61080e36600461573f565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff166060820152608001610391565b3480156108cb57600080fd5b507f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8610456565b3480156108fe57600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000001168152602001610391565b34801561093f57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103e6565b34801561097f57600080fd5b5061037c61098e36600461573f565b611c05565b34801561099f57600080fd5b506103e66109ae3660046157ee565b611de4565b3480156109bf57600080fd5b506109d36109ce36600461573f565b611fc7565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610391565b348015610a4957600080fd5b5060005461037c9067ffffffffffffffff1681565b348015610a6a57600080fd5b506103e6610a7936600461577d565b60036020526000908152604090205481565b348015610a9757600080fd5b507f00000000000000000000000000000000000000000000000000000000000003856103e6565b348015610aca57600080fd5b5061032d610ad9366004615820565b61205e565b348015610aea57600080fd5b507f00000000000000000000000000000000000000000000000000000000000004b061037c565b348015610b1d57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000046103e6565b348015610b5057600080fd5b5061051e610b5f36600461573f565b60046020526000908152604090205460ff1681565b348015610b8057600080fd5b5061032d610b8f366004615695565b612123565b348015610ba057600080fd5b50610ba9612575565b604051610391939291906158aa565b348015610bc457600080fd5b507f00000000000000000000000000000000000000000000000000000000000000086103e6565b348015610bf757600080fd5b5061051e610c0636600461573f565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610c4757610c47615625565b14610c7e576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610cd1576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d08367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610d1f610d1a368690038601866158fe565b6125d5565b14610d56576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610d6b92919061598b565b604051809103902014610daa576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610df3610dee84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061263192505050565b61269e565b90506000610e1a82600881518110610e0d57610e0d61599b565b6020026020010151612854565b9050602081511115610e58576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610ecd576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610f6857610f68615625565b14610f9f576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610fb457610fb461599b565b906000526020600020906005020190506000610fcf84611c05565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b081169082161015611038576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611081576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561109e57508515155b15611139578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110d157816110ed565b600186015473ffffffffffffffffffffffffffffffffffffffff165b90506110f98187612908565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff1660608301526111dc576fffffffffffffffffffffffffffffffff60408201526001815260008690036111dc578195505b600086826020015163ffffffff166111f491906159f9565b905060008382116112055781611207565b835b602084015190915063ffffffff165b818110156113535760008682815481106112325761123261599b565b6000918252602080832090910154808352600690915260409091205490915060ff1661128a576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061129f5761129f61599b565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112fc5750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b1561133e57600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b5050808061134b90615a11565b915050611216565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909316929092179091558490036115d757606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055891580156114d357506000547201000000000000000000000000000000000000900460ff165b156115485760015473ffffffffffffffffffffffffffffffffffffffff166114fb818a612908565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff9091161788556115d5565b61158f73ffffffffffffffffffffffffffffffffffffffff82161561156d5781611589565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89612908565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff16600281111561161057611610615625565b14611647576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff166116ab576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660026000815481106116d7576116d761599b565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611712576001611715565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff909116177001000000000000000000000000000000008360028111156117c6576117c6615625565b0217905560028111156117db576117db615625565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df9973ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561186c57600080fd5b505af1158015611880573d6000803e3d6000fd5b5050505090565b600560205281600052604060002081815481106118a357600080fd5b90600052602060002001600091509150505481565b905090565b6118ca8383836001611abe565b505050565b6000818152600760209081526040808320600590925282208054825461190090610100900463ffffffff1682615a49565b95945050505050565b60606118b860546020612a09565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604081208054908290559081900361197c576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d169063f3fef3a390604401600060405180830381600087803b158015611a0c57600080fd5b505af1158015611a20573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a7e576040519150601f19603f3d011682016040523d82523d6000602084013e611a83565b606091505b50509050806118ca576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8161480611b3757503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b6316145b611b6d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7984848484612a5b565b50505050565b6118ca8383836000611abe565b3273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614611bfb576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c036133fc565b565b600080600054700100000000000000000000000000000000900460ff166002811115611c3357611c33615625565b14611c6a576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110611c7f57611c7f61599b565b600091825260208220600590910201805490925063ffffffff90811614611cee57815460028054909163ffffffff16908110611cbd57611cbd61599b565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090611d2690700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b611d3a9067ffffffffffffffff1642615a49565b611d59611d19846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16611d6d91906159f9565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b01667ffffffffffffffff168167ffffffffffffffff1611611dba5780611900565b7f00000000000000000000000000000000000000000000000000000000000004b095945050505050565b600080611e83836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000008811115611ee2576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000611efd8383615a8f565b9050670de0b6b3a76400006000611f34827f0000000000000000000000000000000000000000000000000000000000000008615aa3565b90506000611f52611f4d670de0b6b3a764000086615aa3565b613955565b90506000611f608484613bb0565b90506000611f6e8383613bff565b90506000611f7b82613c2d565b90506000611f9a82611f95670de0b6b3a76400008f615aa3565b613e15565b90506000611fa88b83613bff565b9050611fb4818d615aa3565b9f9e505050505050505050505050505050565b60028181548110611fd757600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614806120d757503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b6316145b61210d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61211b868686868686613e4f565b505050505050565b60008054700100000000000000000000000000000000900460ff16600281111561214f5761214f615625565b14612186576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000806121958661447e565b935093509350935060006121ab85858585614887565b905060007f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d4077373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561221a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223e9190615ae0565b9050600189036123365773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8461229a367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af115801561230c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123309190615afd565b506115d7565b600289036123625773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848961229a565b6003890361238e5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848761229a565b600489036124aa5760006123d46fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000004614941565b6009546123e191906159f9565b6123ec9060016159f9565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561247f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a39190615afd565b50506115d7565b60058903612543576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000038560c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a4016122ed565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000001367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560606125ce611909565b9050909192565b60008160000151826020015183604001518460600151604051602001612614949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60408051808201909152600080825260208201528151600003612680576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b606060008060006126ae856149ef565b9194509250905060018160018111156126c9576126c9615625565b14612700576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845161270c83856159f9565b14612743576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b604080518082019091526000808252602082015281526020019060019003908161275a5790505093506000835b8651811015612848576000806127cd6040518060400160405280858c600001516127b19190615a49565b8152602001858c602001516127c691906159f9565b90526149ef565b5091509150604051806040016040528083836127e991906159f9565b8152602001848b602001516127fe91906159f9565b8152508885815181106128135761281361599b565b60209081029190910101526128296001856159f9565b935061283581836159f9565b61283f90846159f9565b92505050612787565b50845250919392505050565b60606000806000612864856149ef565b91945092509050600081600181111561287f5761287f615625565b146128b6576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128c082846159f9565b8551146128f9576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61190085602001518484614e8d565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff909316928392906129579084906159f9565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d1690637eee288d90604401600060405180830381600087803b1580156129ec57600080fd5b505af1158015612a00573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b60008054700100000000000000000000000000000000900460ff166002811115612a8757612a87615625565b14612abe576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110612ad357612ad361599b565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514612bba576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000612c7a826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580612cb55750612cb27f000000000000000000000000000000000000000000000000000000000000000460026159f9565b81145b8015612cbf575084155b15612cf6576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015612d1c575086155b15612d53576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000008811115612dad576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dd87f000000000000000000000000000000000000000000000000000000000000000460016159f9565b8103612dea57612dea86888588614f22565b34612df483611de4565b14612e2b576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612e3688611c05565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b0811690821603612e9e576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b016612efe9190615b16565b67ffffffffffffffff16612f198267ffffffffffffffff1690565b67ffffffffffffffff161115612ffb576000612f5660017f0000000000000000000000000000000000000000000000000000000000000004615a49565b8314612f8c5767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016612fc1565b612fc17f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff166002615b3f565b9050612ff7817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff16615b16565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526004602052604090205490915060ff1615613079576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008b8152602001908152602001600020600160028054905061330f9190615a49565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d169263d0e30db09234926004808301939282900301818588803b1580156133a757600080fd5b505af11580156133bb573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b60005471010000000000000000000000000000000000900460ff161561344e576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000001166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df991690637258a807906024016040805180830381865afa158015613502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135269190615b6f565b909250905081613562576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461359557639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401351161362f576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d9092169363d0e30db093926004828101939282900301818588803b15801561390457600080fd5b505af1158015613918573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b17600082136139b457631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a764000002158202613bed57637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b600081600019048311820215613c1d5763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d78213613c5b57919050565b680755bf798b4a1bf1e58212613c795763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000613e46670de0b6b3a764000083613e2d86613955565b613e379190615b93565b613e419190615c4f565b613c2d565b90505b92915050565b60008054700100000000000000000000000000000000900460ff166002811115613e7b57613e7b615625565b14613eb2576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110613ec757613ec761599b565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050613f267f000000000000000000000000000000000000000000000000000000000000000860016159f9565b613fc2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614613ffc576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156140f35761404f7f00000000000000000000000000000000000000000000000000000000000000047f0000000000000000000000000000000000000000000000000000000000000008615a49565b6001901b61406e846fffffffffffffffffffffffffffffffff166150d3565b6fffffffffffffffffffffffffffffffff1661408a9190615cb7565b156140c7576140be6140af60016fffffffffffffffffffffffffffffffff8716615ccb565b865463ffffffff166000615172565b600301546140e9565b7f00000000000000000000000000000000000000000000000000000000000000005b915084905061411d565b6003850154915061411a6140af6fffffffffffffffffffffffffffffffff86166001615cf4565b90505b600882901b60088a8a60405161413492919061598b565b6040518091039020901b14614175576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006141808c615256565b9050600061418f836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d4077373ffffffffffffffffffffffffffffffffffffffff169063e14ced3290614209908f908f908f908f908a90600401615d71565b6020604051808303816000875af1158015614228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061424c9190615afd565b6004850154911491506000906002906142f7906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b614393896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b61439d9190615dab565b6143a79190615dce565b60ff1615905081151581036143e8576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff161561443f576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b600080600080600085905060006002828154811061449e5761449e61599b565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000000490614575906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116145af576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000490614676906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156146eb57825463ffffffff166146b57f000000000000000000000000000000000000000000000000000000000000000460016159f9565b83036146bf578391505b600281815481106146d2576146d261599b565b90600052602060002090600502019350809450506145b3565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661475461473f856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561482357600061478c836fffffffffffffffffffffffffffffffff166150d3565b6fffffffffffffffffffffffffffffffff1611156147f75760006147ce6147c660016fffffffffffffffffffffffffffffffff8616615ccb565b896001615172565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506147fd9050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614879565b60006148456147c66fffffffffffffffffffffffffffffffff85166001615cf4565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff8416156148f45760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611900565b82826040516020016149229291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b6000806149ce847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614a32576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614a57576000600160009450945094505050614e86565b60b78111614b6d576000614a6c608083615a49565b905080876000015111614aab576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614b2357507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614b5a576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614e86915050565b60bf8111614ccb576000614b8260b783615a49565b905080876000015111614bc1576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614c23576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614c6b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614c7581846159f9565b895111614cae576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614cb98360016159f9565b9750955060009450614e869350505050565b60f78111614d30576000614ce060c083615a49565b905080876000015111614d1f576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614e86915050565b6000614d3d60f783615a49565b905080876000015111614d7c576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614dde576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614e26576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e3081846159f9565b895111614e69576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e748360016159f9565b9750955060019450614e869350505050565b9193909250565b60608167ffffffffffffffff811115614ea857614ea86158cf565b6040519080825280601f01601f191660200182016040528015614ed2576020820181803683370190505b5090508115614f1b576000614ee784866159f9565b90506020820160005b84811015614f08578281015182820152602001614ef0565b84811115614f17576000858301525b5050505b9392505050565b6000614f416fffffffffffffffffffffffffffffffff84166001615cf4565b90506000614f5182866001615172565b9050600086901a838061503d5750614f8a60027f0000000000000000000000000000000000000000000000000000000000000004615cb7565b600483015460029061502e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6150389190615dce565b60ff16145b156150955760ff811660011480615057575060ff81166002145b615090576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401613626565b612a00565b60ff811615612a00576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401613626565b600080615160837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b600080826151bb576151b66fffffffffffffffffffffffffffffffff86167f0000000000000000000000000000000000000000000000000000000000000004615285565b6151d6565b6151d6856fffffffffffffffffffffffffffffffff16615411565b9050600284815481106151eb576151eb61599b565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461524e57815460028054909163ffffffff169081106152395761523961599b565b906000526020600020906005020191506151fc565b509392505050565b60008060008060006152678661447e565b935093509350935061527b84848484614887565b9695505050505050565b600081615324846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff161161533a5763b34b5c226000526004601cfd5b61534383615411565b9050816153e2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611613e4957613e466153f88360016159f9565b6fffffffffffffffffffffffffffffffff8316906154b6565b600081196001830116816154a5827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b600080615543847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f84011261557157600080fd5b50813567ffffffffffffffff81111561558957600080fd5b6020830191508360208285010111156155a157600080fd5b9250929050565b600080600083850360a08112156155be57600080fd5b60808112156155cc57600080fd5b50839250608084013567ffffffffffffffff8111156155ea57600080fd5b6155f68682870161555f565b9497909650939450505050565b6000806040838503121561561657600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061568f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806000606084860312156156aa57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b818110156156e7576020818501810151868301820152016156cb565b818111156156f9576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613e4660208301846156c1565b60006020828403121561575157600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461577a57600080fd5b50565b60006020828403121561578f57600080fd5b8135614f1b81615758565b803580151581146157aa57600080fd5b919050565b600080600080608085870312156157c557600080fd5b8435935060208501359250604085013591506157e36060860161579a565b905092959194509250565b60006020828403121561580057600080fd5b81356fffffffffffffffffffffffffffffffff81168114614f1b57600080fd5b6000806000806000806080878903121561583957600080fd5b863595506158496020880161579a565b9450604087013567ffffffffffffffff8082111561586657600080fd5b6158728a838b0161555f565b9096509450606089013591508082111561588b57600080fd5b5061589889828a0161555f565b979a9699509497509295939492505050565b63ffffffff8416815282602082015260606040820152600061190060608301846156c1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561591057600080fd5b6040516080810181811067ffffffffffffffff8211171561595a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115615a0c57615a0c6159ca565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a4257615a426159ca565b5060010190565b600082821015615a5b57615a5b6159ca565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615a9e57615a9e615a60565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615adb57615adb6159ca565b500290565b600060208284031215615af257600080fd5b8151614f1b81615758565b600060208284031215615b0f57600080fd5b5051919050565b600067ffffffffffffffff83811690831681811015615b3757615b376159ca565b039392505050565b600067ffffffffffffffff80831681851681830481118215151615615b6657615b666159ca565b02949350505050565b60008060408385031215615b8257600080fd5b505080516020909101519092909150565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615bd457615bd46159ca565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615c0f57615c0f6159ca565b60008712925087820587128484161615615c2b57615c2b6159ca565b87850587128184161615615c4157615c416159ca565b505050929093029392505050565b600082615c5e57615c5e615a60565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615cb257615cb26159ca565b500590565b600082615cc657615cc6615a60565b500690565b60006fffffffffffffffffffffffffffffffff83811690831681811015615b3757615b376159ca565b60006fffffffffffffffffffffffffffffffff808316818516808303821115615d1f57615d1f6159ca565b01949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b606081526000615d85606083018789615d28565b8281036020840152615d98818688615d28565b9150508260408301529695505050505050565b600060ff821660ff841680821015615dc557615dc56159ca565b90039392505050565b600060ff831680615de157615de1615a60565b8060ff8416069150509291505056fea164736f6c634300080f000a"; + hex"6080604052600436106103085760003560e01c806370872aa51161019a578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b94578063fa315aa914610bb8578063fe2bbeb214610beb57600080fd5b8063ec5e630814610b11578063eff0f59214610b44578063f8f43ff614610b7457600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a8b578063d8cc1a3c14610abe578063dabd396d14610ade57600080fd5b8063c6f0308c146109b3578063cf09e0d014610a3d578063d5d44d8014610a5e57600080fd5b8063a445ece611610143578063bcef3b551161011d578063bcef3b5514610933578063bd8da95614610973578063c395e1ca1461099357600080fd5b8063a445ece6146107f3578063a8e4fb90146108bf578063bbdc02db146108f257600080fd5b80638980e0cc116101745780638980e0cc1461076b5780638b85902b146107805780638d450a95146107c057600080fd5b806370872aa51461073b5780637b0f0adc146107505780638129fc1c1461076357600080fd5b80633fc8cef31161025e5780635c0cba33116102075780636361506d116101e15780636361506d146106b55780636b6716c0146106f55780636f0344091461072857600080fd5b80635c0cba331461064d578063609d33341461068057806360e274641461069557600080fd5b806354fd4d501161023857806354fd4d50146105a757806357da950e146105fd5780635a5fa2d91461062d57600080fd5b80633fc8cef31461052e578063472777c614610561578063534db0e21461057457600080fd5b80632810e1d6116102c057806337b1b2291161029a57806337b1b2291461047b5780633a768463146104bb5780633e3ac912146104ee57600080fd5b80632810e1d6146103f45780632ad69aeb1461040957806330dbe5701461042957600080fd5b806319effeb4116102f157806319effeb41461034f578063200d2ed21461039a57806325fc2ace146103d557600080fd5b8063019351301461030d57806303c2924d1461032f575b600080fd5b34801561031957600080fd5b5061032d6103283660046155a8565b610c1b565b005b34801561033b57600080fd5b5061032d61034a366004615603565b610f3c565b34801561035b57600080fd5b5060005461037c9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156103a657600080fd5b506000546103c890700100000000000000000000000000000000900460ff1681565b6040516103919190615654565b3480156103e157600080fd5b506008545b604051908152602001610391565b34801561040057600080fd5b506103c86115e2565b34801561041557600080fd5b506103e6610424366004615603565b611887565b34801561043557600080fd5b506001546104569073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610391565b34801561048757600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610456565b3480156104c757600080fd5b507f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d40773610456565b3480156104fa57600080fd5b5060005461051e907201000000000000000000000000000000000000900460ff1681565b6040519015158152602001610391565b34801561053a57600080fd5b507f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92610456565b61032d61056f366004615695565b6118bd565b34801561058057600080fd5b507f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63610456565b3480156105b357600080fd5b506105f06040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b604051610391919061572c565b34801561060957600080fd5b50600854600954610618919082565b60408051928352602083019190915201610391565b34801561063957600080fd5b506103e661064836600461573f565b6118cf565b34801561065957600080fd5b507f000000000000000000000000d6eaf4c146261653ee059077b78ed088add54309610456565b34801561068c57600080fd5b506105f0611909565b3480156106a157600080fd5b5061032d6106b036600461577d565b611917565b3480156106c157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103e6565b34801561070157600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061037c565b61032d6107363660046157af565b611abe565b34801561074757600080fd5b506009546103e6565b61032d61075e366004615695565b611b7f565b61032d611b8c565b34801561077757600080fd5b506002546103e6565b34801561078c57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103e6565b3480156107cc57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103e6565b3480156107ff57600080fd5b5061086b61080e36600461573f565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff166060820152608001610391565b3480156108cb57600080fd5b507f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8610456565b3480156108fe57600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000001168152602001610391565b34801561093f57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103e6565b34801561097f57600080fd5b5061037c61098e36600461573f565b611c05565b34801561099f57600080fd5b506103e66109ae3660046157ee565b611de4565b3480156109bf57600080fd5b506109d36109ce36600461573f565b611fc7565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610391565b348015610a4957600080fd5b5060005461037c9067ffffffffffffffff1681565b348015610a6a57600080fd5b506103e6610a7936600461577d565b60036020526000908152604090205481565b348015610a9757600080fd5b507f00000000000000000000000000000000000000000000000000000000000003856103e6565b348015610aca57600080fd5b5061032d610ad9366004615820565b61205e565b348015610aea57600080fd5b507f00000000000000000000000000000000000000000000000000000000000004b061037c565b348015610b1d57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000046103e6565b348015610b5057600080fd5b5061051e610b5f36600461573f565b60046020526000908152604090205460ff1681565b348015610b8057600080fd5b5061032d610b8f366004615695565b612123565b348015610ba057600080fd5b50610ba9612575565b604051610391939291906158aa565b348015610bc457600080fd5b507f00000000000000000000000000000000000000000000000000000000000000086103e6565b348015610bf757600080fd5b5061051e610c0636600461573f565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610c4757610c47615625565b14610c7e576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610cd1576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d08367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610d1f610d1a368690038601866158fe565b6125d5565b14610d56576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610d6b92919061598b565b604051809103902014610daa576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610df3610dee84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061263192505050565b61269e565b90506000610e1a82600881518110610e0d57610e0d61599b565b6020026020010151612854565b9050602081511115610e58576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610ecd576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610f6857610f68615625565b14610f9f576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610fb457610fb461599b565b906000526020600020906005020190506000610fcf84611c05565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b081169082161015611038576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611081576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561109e57508515155b15611139578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110d157816110ed565b600186015473ffffffffffffffffffffffffffffffffffffffff165b90506110f98187612908565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff1660608301526111dc576fffffffffffffffffffffffffffffffff60408201526001815260008690036111dc578195505b600086826020015163ffffffff166111f491906159f9565b905060008382116112055781611207565b835b602084015190915063ffffffff165b818110156113535760008682815481106112325761123261599b565b6000918252602080832090910154808352600690915260409091205490915060ff1661128a576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061129f5761129f61599b565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112fc5750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b1561133e57600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b5050808061134b90615a11565b915050611216565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909316929092179091558490036115d757606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055891580156114d357506000547201000000000000000000000000000000000000900460ff165b156115485760015473ffffffffffffffffffffffffffffffffffffffff166114fb818a612908565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff9091161788556115d5565b61158f73ffffffffffffffffffffffffffffffffffffffff82161561156d5781611589565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89612908565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff16600281111561161057611610615625565b14611647576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff166116ab576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660026000815481106116d7576116d761599b565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611712576001611715565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff909116177001000000000000000000000000000000008360028111156117c6576117c6615625565b0217905560028111156117db576117db615625565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f000000000000000000000000d6eaf4c146261653ee059077b78ed088add5430973ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561186c57600080fd5b505af1158015611880573d6000803e3d6000fd5b5050505090565b600560205281600052604060002081815481106118a357600080fd5b90600052602060002001600091509150505481565b905090565b6118ca8383836001611abe565b505050565b6000818152600760209081526040808320600590925282208054825461190090610100900463ffffffff1682615a49565b95945050505050565b60606118b860546020612a09565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604081208054908290559081900361197c576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92169063f3fef3a390604401600060405180830381600087803b158015611a0c57600080fd5b505af1158015611a20573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a7e576040519150601f19603f3d011682016040523d82523d6000602084013e611a83565b606091505b50509050806118ca576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8161480611b3757503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b6316145b611b6d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7984848484612a5b565b50505050565b6118ca8383836000611abe565b3273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614611bfb576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c036133fc565b565b600080600054700100000000000000000000000000000000900460ff166002811115611c3357611c33615625565b14611c6a576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110611c7f57611c7f61599b565b600091825260208220600590910201805490925063ffffffff90811614611cee57815460028054909163ffffffff16908110611cbd57611cbd61599b565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090611d2690700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b611d3a9067ffffffffffffffff1642615a49565b611d59611d19846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16611d6d91906159f9565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b01667ffffffffffffffff168167ffffffffffffffff1611611dba5780611900565b7f00000000000000000000000000000000000000000000000000000000000004b095945050505050565b600080611e83836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000008811115611ee2576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000611efd8383615a8f565b9050670de0b6b3a76400006000611f34827f0000000000000000000000000000000000000000000000000000000000000008615aa3565b90506000611f52611f4d670de0b6b3a764000086615aa3565b613955565b90506000611f608484613bb0565b90506000611f6e8383613bff565b90506000611f7b82613c2d565b90506000611f9a82611f95670de0b6b3a76400008f615aa3565b613e15565b90506000611fa88b83613bff565b9050611fb4818d615aa3565b9f9e505050505050505050505050505050565b60028181548110611fd757600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614806120d757503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b6316145b61210d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61211b868686868686613e4f565b505050505050565b60008054700100000000000000000000000000000000900460ff16600281111561214f5761214f615625565b14612186576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000806121958661447e565b935093509350935060006121ab85858585614887565b905060007f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d4077373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561221a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223e9190615ae0565b9050600189036123365773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8461229a367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af115801561230c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123309190615afd565b506115d7565b600289036123625773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848961229a565b6003890361238e5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848761229a565b600489036124aa5760006123d46fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000004614941565b6009546123e191906159f9565b6123ec9060016159f9565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561247f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a39190615afd565b50506115d7565b60058903612543576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000038560c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a4016122ed565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000001367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560606125ce611909565b9050909192565b60008160000151826020015183604001518460600151604051602001612614949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60408051808201909152600080825260208201528151600003612680576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b606060008060006126ae856149ef565b9194509250905060018160018111156126c9576126c9615625565b14612700576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845161270c83856159f9565b14612743576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b604080518082019091526000808252602082015281526020019060019003908161275a5790505093506000835b8651811015612848576000806127cd6040518060400160405280858c600001516127b19190615a49565b8152602001858c602001516127c691906159f9565b90526149ef565b5091509150604051806040016040528083836127e991906159f9565b8152602001848b602001516127fe91906159f9565b8152508885815181106128135761281361599b565b60209081029190910101526128296001856159f9565b935061283581836159f9565b61283f90846159f9565b92505050612787565b50845250919392505050565b60606000806000612864856149ef565b91945092509050600081600181111561287f5761287f615625565b146128b6576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128c082846159f9565b8551146128f9576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61190085602001518484614e8d565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff909316928392906129579084906159f9565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd921690637eee288d90604401600060405180830381600087803b1580156129ec57600080fd5b505af1158015612a00573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b60008054700100000000000000000000000000000000900460ff166002811115612a8757612a87615625565b14612abe576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110612ad357612ad361599b565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514612bba576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000612c7a826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580612cb55750612cb27f000000000000000000000000000000000000000000000000000000000000000460026159f9565b81145b8015612cbf575084155b15612cf6576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015612d1c575086155b15612d53576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000008811115612dad576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dd87f000000000000000000000000000000000000000000000000000000000000000460016159f9565b8103612dea57612dea86888588614f22565b34612df483611de4565b14612e2b576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612e3688611c05565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b0811690821603612e9e576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b016612efe9190615b16565b67ffffffffffffffff16612f198267ffffffffffffffff1690565b67ffffffffffffffff161115612ffb576000612f5660017f0000000000000000000000000000000000000000000000000000000000000004615a49565b8314612f8c5767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016612fc1565b612fc17f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff166002615b3f565b9050612ff7817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff16615b16565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526004602052604090205490915060ff1615613079576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008b8152602001908152602001600020600160028054905061330f9190615a49565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92169263d0e30db09234926004808301939282900301818588803b1580156133a757600080fd5b505af11580156133bb573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b60005471010000000000000000000000000000000000900460ff161561344e576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000001166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000d6eaf4c146261653ee059077b78ed088add543091690637258a807906024016040805180830381865afa158015613502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135269190615b6f565b909250905081613562576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461359557639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401351161362f576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd929092169363d0e30db093926004828101939282900301818588803b15801561390457600080fd5b505af1158015613918573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b17600082136139b457631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a764000002158202613bed57637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b600081600019048311820215613c1d5763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d78213613c5b57919050565b680755bf798b4a1bf1e58212613c795763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000613e46670de0b6b3a764000083613e2d86613955565b613e379190615b93565b613e419190615c4f565b613c2d565b90505b92915050565b60008054700100000000000000000000000000000000900460ff166002811115613e7b57613e7b615625565b14613eb2576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110613ec757613ec761599b565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050613f267f000000000000000000000000000000000000000000000000000000000000000860016159f9565b613fc2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614613ffc576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156140f35761404f7f00000000000000000000000000000000000000000000000000000000000000047f0000000000000000000000000000000000000000000000000000000000000008615a49565b6001901b61406e846fffffffffffffffffffffffffffffffff166150d3565b6fffffffffffffffffffffffffffffffff1661408a9190615cb7565b156140c7576140be6140af60016fffffffffffffffffffffffffffffffff8716615ccb565b865463ffffffff166000615172565b600301546140e9565b7f00000000000000000000000000000000000000000000000000000000000000005b915084905061411d565b6003850154915061411a6140af6fffffffffffffffffffffffffffffffff86166001615cf4565b90505b600882901b60088a8a60405161413492919061598b565b6040518091039020901b14614175576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006141808c615256565b9050600061418f836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d4077373ffffffffffffffffffffffffffffffffffffffff169063e14ced3290614209908f908f908f908f908a90600401615d71565b6020604051808303816000875af1158015614228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061424c9190615afd565b6004850154911491506000906002906142f7906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b614393896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b61439d9190615dab565b6143a79190615dce565b60ff1615905081151581036143e8576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff161561443f576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b600080600080600085905060006002828154811061449e5761449e61599b565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000000490614575906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116145af576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000490614676906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156146eb57825463ffffffff166146b57f000000000000000000000000000000000000000000000000000000000000000460016159f9565b83036146bf578391505b600281815481106146d2576146d261599b565b90600052602060002090600502019350809450506145b3565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661475461473f856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561482357600061478c836fffffffffffffffffffffffffffffffff166150d3565b6fffffffffffffffffffffffffffffffff1611156147f75760006147ce6147c660016fffffffffffffffffffffffffffffffff8616615ccb565b896001615172565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506147fd9050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614879565b60006148456147c66fffffffffffffffffffffffffffffffff85166001615cf4565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff8416156148f45760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611900565b82826040516020016149229291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b6000806149ce847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614a32576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614a57576000600160009450945094505050614e86565b60b78111614b6d576000614a6c608083615a49565b905080876000015111614aab576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614b2357507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614b5a576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614e86915050565b60bf8111614ccb576000614b8260b783615a49565b905080876000015111614bc1576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614c23576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614c6b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614c7581846159f9565b895111614cae576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614cb98360016159f9565b9750955060009450614e869350505050565b60f78111614d30576000614ce060c083615a49565b905080876000015111614d1f576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614e86915050565b6000614d3d60f783615a49565b905080876000015111614d7c576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614dde576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614e26576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e3081846159f9565b895111614e69576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e748360016159f9565b9750955060019450614e869350505050565b9193909250565b60608167ffffffffffffffff811115614ea857614ea86158cf565b6040519080825280601f01601f191660200182016040528015614ed2576020820181803683370190505b5090508115614f1b576000614ee784866159f9565b90506020820160005b84811015614f08578281015182820152602001614ef0565b84811115614f17576000858301525b5050505b9392505050565b6000614f416fffffffffffffffffffffffffffffffff84166001615cf4565b90506000614f5182866001615172565b9050600086901a838061503d5750614f8a60027f0000000000000000000000000000000000000000000000000000000000000004615cb7565b600483015460029061502e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6150389190615dce565b60ff16145b156150955760ff811660011480615057575060ff81166002145b615090576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401613626565b612a00565b60ff811615612a00576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401613626565b600080615160837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b600080826151bb576151b66fffffffffffffffffffffffffffffffff86167f0000000000000000000000000000000000000000000000000000000000000004615285565b6151d6565b6151d6856fffffffffffffffffffffffffffffffff16615411565b9050600284815481106151eb576151eb61599b565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461524e57815460028054909163ffffffff169081106152395761523961599b565b906000526020600020906005020191506151fc565b509392505050565b60008060008060006152678661447e565b935093509350935061527b84848484614887565b9695505050505050565b600081615324846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff161161533a5763b34b5c226000526004601cfd5b61534383615411565b9050816153e2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611613e4957613e466153f88360016159f9565b6fffffffffffffffffffffffffffffffff8316906154b6565b600081196001830116816154a5827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b600080615543847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f84011261557157600080fd5b50813567ffffffffffffffff81111561558957600080fd5b6020830191508360208285010111156155a157600080fd5b9250929050565b600080600083850360a08112156155be57600080fd5b60808112156155cc57600080fd5b50839250608084013567ffffffffffffffff8111156155ea57600080fd5b6155f68682870161555f565b9497909650939450505050565b6000806040838503121561561657600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061568f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806000606084860312156156aa57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b818110156156e7576020818501810151868301820152016156cb565b818111156156f9576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613e4660208301846156c1565b60006020828403121561575157600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461577a57600080fd5b50565b60006020828403121561578f57600080fd5b8135614f1b81615758565b803580151581146157aa57600080fd5b919050565b600080600080608085870312156157c557600080fd5b8435935060208501359250604085013591506157e36060860161579a565b905092959194509250565b60006020828403121561580057600080fd5b81356fffffffffffffffffffffffffffffffff81168114614f1b57600080fd5b6000806000806000806080878903121561583957600080fd5b863595506158496020880161579a565b9450604087013567ffffffffffffffff8082111561586657600080fd5b6158728a838b0161555f565b9096509450606089013591508082111561588b57600080fd5b5061589889828a0161555f565b979a9699509497509295939492505050565b63ffffffff8416815282602082015260606040820152600061190060608301846156c1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561591057600080fd5b6040516080810181811067ffffffffffffffff8211171561595a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115615a0c57615a0c6159ca565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a4257615a426159ca565b5060010190565b600082821015615a5b57615a5b6159ca565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615a9e57615a9e615a60565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615adb57615adb6159ca565b500290565b600060208284031215615af257600080fd5b8151614f1b81615758565b600060208284031215615b0f57600080fd5b5051919050565b600067ffffffffffffffff83811690831681811015615b3757615b376159ca565b039392505050565b600067ffffffffffffffff80831681851681830481118215151615615b6657615b666159ca565b02949350505050565b60008060408385031215615b8257600080fd5b505080516020909101519092909150565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615bd457615bd46159ca565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615c0f57615c0f6159ca565b60008712925087820587128484161615615c2b57615c2b6159ca565b87850587128184161615615c4157615c416159ca565b505050929093029392505050565b600082615c5e57615c5e615a60565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615cb257615cb26159ca565b500590565b600082615cc657615cc6615a60565b500690565b60006fffffffffffffffffffffffffffffffff83811690831681811015615b3757615b376159ca565b60006fffffffffffffffffffffffffffffffff808316818516808303821115615d1f57615d1f6159ca565b01949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b606081526000615d85606083018789615d28565b8281036020840152615d98818688615d28565b9150508260408301529695505050505050565b600060ff821660ff841680821015615dc557615dc56159ca565b90039392505050565b600060ff831680615de157615de1615a60565b8060ff8416069150509291505056fea164736f6c634300080f000a"; } diff --git a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofs.sol b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofs.sol index 783648baf54b..577d93d2d2df 100644 --- a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofs.sol +++ b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofs.sol @@ -12,40 +12,40 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { address private constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code")))); Vm private constant vm = Vm(VM_ADDRESS); - address internal constant addressManagerAddress = 0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3; - address internal constant anchorStateRegistryAddress = 0x610C37dd344e47D7848Da075a90128472140e80f; - address internal constant anchorStateRegistryProxyAddress = 0x39Af23E00F1e662025aA01b0cEdA19542B78DF99; + address internal constant addressManagerAddress = 0x50EEf481cae4250d252Ae577A09bF514f224C6C4; + address internal constant anchorStateRegistryAddress = 0xE2a80256d1dAFe06683F231F8e9561639Aa0e9b9; + address internal constant anchorStateRegistryProxyAddress = 0xd6EAF4c146261653EE059077B78ED088Add54309; address internal constant delayedWETHAddress = 0x49BBFf1629824A1e7993Ab5c17AFa45D24AB28c9; - address internal constant delayedWETHProxyAddress = 0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d; + address internal constant delayedWETHProxyAddress = 0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92; address internal constant disputeGameFactoryAddress = 0x20B168142354Cee65a32f6D8cf3033E592299765; - address internal constant disputeGameFactoryProxyAddress = 0xc7B87b2b892EA5C3CfF47168881FE168C00377FB; + address internal constant disputeGameFactoryProxyAddress = 0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d; address internal constant l1CrossDomainMessengerAddress = 0x094e6508ba9d9bf1ce421fff3dE06aE56e67901b; - address internal constant l1CrossDomainMessengerProxyAddress = 0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6; + address internal constant l1CrossDomainMessengerProxyAddress = 0xDeF3bca8c80064589E6787477FFa7Dd616B5574F; address internal constant l1ERC721BridgeAddress = 0x5C4F5e749A61a9503c4AAE8a9393e89609a0e804; - address internal constant l1ERC721BridgeProxyAddress = 0xDeF3bca8c80064589E6787477FFa7Dd616B5574F; + address internal constant l1ERC721BridgeProxyAddress = 0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865; address internal constant l1StandardBridgeAddress = 0xb7900B27Be8f0E0fF65d1C3A4671e1220437dd2b; - address internal constant l1StandardBridgeProxyAddress = 0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4; + address internal constant l1StandardBridgeProxyAddress = 0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D; address internal constant l2OutputOracleAddress = 0x19652082F846171168Daf378C4fD3ee85a0D4A60; - address internal constant l2OutputOracleProxyAddress = 0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865; + address internal constant l2OutputOracleProxyAddress = 0x39Af23E00F1e662025aA01b0cEdA19542B78DF99; address internal constant mipsAddress = 0xB3A0348310a0ff78E5FbDB7f14BB7d3e02d40773; address internal constant optimismMintableERC20FactoryAddress = 0x39Aea2Dd53f2d01c15877aCc2791af6BDD7aD567; - address internal constant optimismMintableERC20FactoryProxyAddress = 0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D; + address internal constant optimismMintableERC20FactoryProxyAddress = 0xc7B87b2b892EA5C3CfF47168881FE168C00377FB; address internal constant optimismPortalAddress = 0xbdD90485FCbcac869D5b5752179815a3103d8131; address internal constant optimismPortal2Address = 0x542e5F5d3934b6A8A8B4219cbc99D3D87a7137E1; - address internal constant optimismPortalProxyAddress = 0x978e3286EB805934215a88694d80b09aDed68D90; + address internal constant optimismPortalProxyAddress = 0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4; address internal constant preimageOracleAddress = 0x3bd7E801E51d48c5d94Ea68e8B801DFFC275De75; address internal constant protocolVersionsAddress = 0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F; - address internal constant protocolVersionsProxyAddress = 0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6; - address internal constant proxyAdminAddress = 0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76; - address internal constant safeProxyFactoryAddress = 0x34A1D3fff3958843C43aD80F30b94c510645C316; - address internal constant safeSingletonAddress = 0x90193C961A926261B756D1E5bb255e67ff9498A1; + address internal constant protocolVersionsProxyAddress = 0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1; + address internal constant proxyAdminAddress = 0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1; + address internal constant safeProxyFactoryAddress = 0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496; + address internal constant safeSingletonAddress = 0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3; address internal constant superchainConfigAddress = 0x068E44eB31e111028c41598E4535be7468674D0A; - address internal constant superchainConfigProxyAddress = 0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809; + address internal constant superchainConfigProxyAddress = 0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351; address internal constant systemConfigAddress = 0x67866A5052E5302aaD08e9f352331fd8622eB6DC; - address internal constant systemConfigProxyAddress = 0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb; - address internal constant systemOwnerSafeAddress = 0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3; - address internal constant acc32Address = 0xcE8C32b1493DB37767fAF988dEC9E80089f4f33c; - address internal constant acc33Address = 0x357A483a8923686E7fA454Ee93bbc11aFB114743; + address internal constant systemConfigProxyAddress = 0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6; + address internal constant systemOwnerSafeAddress = 0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD; + address internal constant acc32Address = 0x357A483a8923686E7fA454Ee93bbc11aFB114743; + address internal constant acc33Address = 0xb6b1579AA54e2F61e621a40d5F2704D717B3544F; function recreateDeployment() public { bytes32 slot; @@ -57,7 +57,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { vm.store(safeSingletonAddress, slot, value); vm.etch(systemOwnerSafeAddress, systemOwnerSafeCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - value = hex"00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1"; + value = hex"000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"e90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0"; value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38"; @@ -83,14 +83,14 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000003"; - value = hex"000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3"; + value = hex"00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - value = hex"0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3"; + value = hex"0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd"; vm.store(proxyAdminAddress, slot, value); vm.etch(superchainConfigProxyAddress, superchainConfigProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(superchainConfigProxyAddress, slot, value); vm.etch(superchainConfigAddress, superchainConfigCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; @@ -122,7 +122,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { vm.store(superchainConfigProxyAddress, slot, value); vm.etch(protocolVersionsProxyAddress, protocolVersionsProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(protocolVersionsProxyAddress, slot, value); vm.etch(protocolVersionsAddress, protocolVersionsCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; @@ -153,7 +153,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(protocolVersionsProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(protocolVersionsProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; @@ -163,49 +163,49 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { vm.store(protocolVersionsProxyAddress, slot, value); vm.etch(optimismPortalProxyAddress, optimismPortalProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(optimismPortalProxyAddress, slot, value); vm.etch(systemConfigProxyAddress, systemConfigProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(systemConfigProxyAddress, slot, value); vm.etch(l1StandardBridgeProxyAddress, l1StandardBridgeProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(l1StandardBridgeProxyAddress, slot, value); vm.etch(l1CrossDomainMessengerProxyAddress, l1CrossDomainMessengerProxyCode); - slot = hex"a8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c"; - value = hex"000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3"; + slot = hex"191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284"; + value = hex"00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); - slot = hex"eae32376463217751b8fa4dea8c38ab253664fa3605de6d85d2e790aa970f2b8"; + slot = hex"6822ddba83a78589c753bb747cf4919773ec1d36eeb0bb2a09d64b6d87adda0b"; value = hex"4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); vm.etch(optimismMintableERC20FactoryProxyAddress, optimismMintableERC20FactoryProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); vm.etch(l1ERC721BridgeProxyAddress, l1ERC721BridgeProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(l1ERC721BridgeProxyAddress, slot, value); vm.etch(disputeGameFactoryProxyAddress, disputeGameFactoryProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(disputeGameFactoryProxyAddress, slot, value); vm.etch(l2OutputOracleProxyAddress, l2OutputOracleProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(l2OutputOracleProxyAddress, slot, value); vm.etch(delayedWETHProxyAddress, delayedWETHProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(delayedWETHProxyAddress, slot, value); vm.etch(anchorStateRegistryProxyAddress, anchorStateRegistryProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(anchorStateRegistryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(addressManagerAddress, slot, value); vm.etch(l1CrossDomainMessengerAddress, l1CrossDomainMessengerCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; @@ -440,13 +440,13 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(optimismPortalProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000038"; - value = hex"000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb"; + value = hex"0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d"; vm.store(optimismPortalProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000037"; - value = hex"0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb"; + value = hex"0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6"; vm.store(optimismPortalProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000035"; - value = hex"0000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900"; + value = hex"00000000000000000000004f559f30f5eb88d635fde1548c4267db8fab035100"; vm.store(optimismPortalProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000032"; value = hex"000000000000000000000000000000000000000000000000000000000000dead"; @@ -473,7 +473,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; @@ -497,22 +497,22 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"000000000000000000000000ff00000000000000000000000000000000000000"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580636"; - value = hex"0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6"; + value = hex"000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a7"; - value = hex"000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f"; + value = hex"000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d5865"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6376"; - value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4"; + value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa906"; - value = hex"000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb"; + value = hex"0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ac"; - value = hex"000000000000000000000000978e3286eb805934215a88694d80b09aded68d90"; + value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"a04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320c"; - value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d"; + value = hex"000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"a11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -526,7 +526,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; value = hex"0000000000000000000000000000000000000000000000000000000000000005"; vm.store(systemOwnerSafeAddress, slot, value); - slot = hex"727598a658f6983be3a9f29beef55aaee89ef8a176baeeacbe7edf5ff94a781b"; + slot = hex"540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; @@ -542,13 +542,13 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000032"; - value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809"; + value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb"; + value = hex"0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000003"; - value = hex"0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6"; + value = hex"000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000004"; value = hex"0000000000000000000000004200000000000000000000000000000000000010"; @@ -569,10 +569,10 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(l1ERC721BridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000032"; - value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809"; + value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; vm.store(l1ERC721BridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; - value = hex"0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6"; + value = hex"000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f"; vm.store(l1ERC721BridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000002"; value = hex"0000000000000000000000004200000000000000000000000000000000000014"; @@ -593,7 +593,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; - value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4"; + value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d"; vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -601,13 +601,13 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; value = hex"0000000000000000000000000000000000000000000000000000000000000009"; vm.store(systemOwnerSafeAddress, slot, value); - slot = hex"a8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c"; + slot = hex"191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284"; value = hex"0000000000000000000000000000000000000000000000000000000000000002"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; value = hex"000000000000000000000000000000000000000000000000000000000000000a"; vm.store(systemOwnerSafeAddress, slot, value); - slot = hex"7cda2d9a7dd1a58982b7fac9315bdc1ed8c92aeb9c22cd8555aaa54972f01ccb"; + slot = hex"89a8cb4d9b6f179480a9e676431122d6ba6a5fb2aa9462528e7e48e497a5c045"; value = hex"4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; @@ -623,13 +623,13 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000001010000000000000000000000000000000000000000"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"00000000000000000000000000000000000000000000000000000000000000fb"; - value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809"; + value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"00000000000000000000000000000000000000000000000000000000000000fc"; - value = hex"000000000000000000000000978e3286eb805934215a88694d80b09aded68d90"; + value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"00000000000000000000000000000000000000000000000000000000000000fd"; - value = hex"0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb"; + value = hex"0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"00000000000000000000000000000000000000000000000000000000000000cc"; value = hex"000000000000000000000000000000000000000000000000000000000000dead"; @@ -689,7 +689,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(disputeGameFactoryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(disputeGameFactoryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38"; @@ -710,13 +710,13 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(delayedWETHProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(delayedWETHProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38"; vm.store(delayedWETHProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000068"; - value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809"; + value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; vm.store(delayedWETHProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -725,7 +725,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"000000000000000000000000000000000000000000000000000000000000000f"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; - value = hex"000000000000000000000000610c37dd344e47d7848da075a90128472140e80f"; + value = hex"000000000000000000000000e2a80256d1dafe06683f231f8e9561639aa0e9b9"; vm.store(anchorStateRegistryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -753,17 +753,17 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { vm.store(anchorStateRegistryProxyAddress, slot, value); vm.etch(acc32Address, acc32Code); slot = hex"ffdfc1249c027f9191656349feb0761381bb32c9f557e01f419fd08754bf5a1b"; - value = hex"000000000000000000000000ce8c32b1493db37767faf988dec9e80089f4f33c"; + value = hex"000000000000000000000000357a483a8923686e7fa454ee93bbc11afb114743"; vm.store(disputeGameFactoryProxyAddress, slot, value); vm.etch(acc33Address, acc33Code); slot = hex"4d5a9bd2e41301728d41c8e705190becb4e74abe869f75bdb405b63716a35f9e"; - value = hex"000000000000000000000000357a483a8923686e7fa454ee93bbc11afb114743"; + value = hex"000000000000000000000000b6b1579aa54e2f61e621a40d5f2704d717b3544f"; vm.store(disputeGameFactoryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3"; + value = hex"0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd"; vm.store(disputeGameFactoryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3"; + value = hex"0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd"; vm.store(delayedWETHProxyAddress, slot, value); } } diff --git a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofsCode.sol b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofsCode.sol index e7e66d84c2e0..26ff5c65038c 100644 --- a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofsCode.sol +++ b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofsCode.sol @@ -67,9 +67,9 @@ contract DeploymentSummaryFaultProofsCode { bytes internal constant mipsCode = hex"608060405234801561001057600080fd5b50600436106100415760003560e01c806354fd4d50146100465780637dc0d1d014610098578063e14ced32146100dc575b600080fd5b6100826040518060400160405280600c81526020017f312e312e302d626574612e36000000000000000000000000000000000000000081525081565b60405161008f9190612120565b60405180910390f35b60405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000003bd7e801e51d48c5d94ea68e8b801dffc275de7516815260200161008f565b6100ef6100ea3660046121d5565b6100fd565b60405190815260200161008f565b6000610107612096565b6080811461011457600080fd5b6040516106001461012457600080fd5b6084871461013157600080fd5b6101a4851461013f57600080fd5b8635608052602087013560a052604087013560e090811c60c09081526044890135821c82526048890135821c61010052604c890135821c610120526050890135821c61014052605489013590911c61016052605888013560f890811c610180526059890135901c6101a052605a880135901c6101c0526102006101e0819052606288019060005b60208110156101ea57823560e01c82526004909201916020909101906001016101c6565b5050508061012001511561020857610200610360565b915050610357565b6101408101805160010167ffffffffffffffff16905260006101a49050600080600061023d856060015186600001518661047c565b9250925092508163ffffffff16600014801561025f57508063ffffffff16600c145b156102795761026d876104a3565b95505050505050610357565b60006102f3866040805160808101825260008082526020820181905291810182905260608101919091526040518060800160405280836060015163ffffffff168152602001836080015163ffffffff1681526020018360a0015163ffffffff1681526020018360c0015163ffffffff168152509050919050565b61016087015187519192506103109183919061052488888861087b565b8652805163ffffffff9081166060808901919091526020830151821660808901526040830151821660a08901528201511660c087015261034e610360565b96505050505050505b95945050505050565b60408051608051815260a051602082015260dc519181019190915260fc51604482015261011c51604882015261013c51604c82015261015c51605082015261017c5160548201526101805161019f5160588301526101a0516101bf5160598401526101d851605a840152600092610200929091606283019190855b60208110156103ff57601c86015184526020909501946004909301926001016103db565b506000835283830384a060009450806001811461041f5760039550610447565b82801561043757600181146104405760029650610445565b60009650610445565b600196505b505b50505081900390207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660f89190911b17919050565b600080600061048c858786610c61565b96603f601a89901c81169750881695509350505050565b60006104ad612096565b608090506000806000806104e48561016001516040810151608082015160a083015160c084015160e0909401519294919390929091565b509350935093509350600080610ffa63ffffffff168663ffffffff16036105295761051485858960e00151610d15565b63ffffffff1660e08a0152909250905061078a565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03363ffffffff871601610562576340000000915061078a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefe863ffffffff871601610598576001915061078a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffef6a63ffffffff8716016105ec57600161012088015260ff85166101008801526105df610360565b9998505050505050505050565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05d63ffffffff8716016106e85760006040518061012001604052808763ffffffff1681526020018663ffffffff1681526020018563ffffffff16815260200189602001518152602001896040015163ffffffff1681526020018b81526020017f0000000000000000000000003bd7e801e51d48c5d94ea68e8b801dffc275de7573ffffffffffffffffffffffffffffffffffffffff1681526020016106ba6101a4600160ff16610380020190565b8152895160209091015290506106cf81610d57565b8b5263ffffffff1660408b0152909350915061078a9050565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05c63ffffffff87160161074d5760208701516040880151610733918791879187916105248d51610fcf565b63ffffffff1660408b015260208a0152909250905061078a565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02963ffffffff87160161078a5761078485856110c5565b90925090505b6000610804886040805160808101825260008082526020820181905291810182905260608101919091526040518060800160405280836060015163ffffffff168152602001836080015163ffffffff1681526020018360a0015163ffffffff1681526020018360c0015163ffffffff168152509050919050565b61016089015163ffffffff85811660408084019190915285821660e0909301929092526020830180518083168086526004909101831682526060808e01919091529051821660808d015291830151811660a08c0152908201511660c08a0152905061086d610360565b9a9950505050505050505050565b84600263ffffffff8416148061089757508263ffffffff166003145b156108e95760006002856303ffffff1663ffffffff16901b896020015163f0000000161790506108e389898663ffffffff166002146108d757601f6108da565b60005b60ff168461117a565b50610c56565b600080601f601087901c8116908a90601589901c166020811061090e5761090e612249565b602002015192508063ffffffff8716158061092f57508663ffffffff16601c145b15610961578a8263ffffffff166020811061094c5761094c612249565b6020020151925050601f600b88901c16610a18565b60208763ffffffff1610156109c3578663ffffffff16600c148061098b57508663ffffffff16600d145b8061099c57508663ffffffff16600e145b156109ad578761ffff169250610a18565b6109bc8861ffff166010611252565b9250610a18565b60288763ffffffff161015806109df57508663ffffffff166022145b806109f057508663ffffffff166026145b15610a18578a8263ffffffff1660208110610a0d57610a0d612249565b602002015192508190505b60048763ffffffff1610158015610a35575060088763ffffffff16105b80610a4657508663ffffffff166001145b15610a6257610a598c8c898b86896112c5565b50505050610c56565b63ffffffff6000602089831610610ac757610a828a61ffff166010611252565b9095019463fffffffc8616610a988d828e610c61565b915060288a63ffffffff1610158015610ab857508963ffffffff16603014155b15610ac557809250600093505b505b6000610ad78b8b8b8a8a876114b3565b63ffffffff1690508963ffffffff166000148015610afc575060088963ffffffff1610155b8015610b0e5750601c8963ffffffff16105b15610bd6578863ffffffff1660081480610b2e57508863ffffffff166009145b15610b6157610b558f8f8b63ffffffff16600814610b4c5786610b4f565b60005b8a61117a565b50505050505050610c56565b8863ffffffff16600a03610b8357610b558f8f868a63ffffffff8b1615611bd2565b8863ffffffff16600b03610ba657610b558f8f868a63ffffffff8b161515611bd2565b60108963ffffffff1610158015610bc35750601c8963ffffffff16105b15610bd657610b558f8f8b8a8a89611ca2565b8963ffffffff166038148015610bf1575063ffffffff851615155b15610c215760018e8663ffffffff1660208110610c1057610c10612249565b63ffffffff90921660209290920201525b8263ffffffff1663ffffffff14610c4057610c3d838d83611f5b565b97505b610c4e8f8f86846001611bd2565b505050505050505b979650505050505050565b6000610c6c82611ffd565b6003831615610c7a57600080fd5b6020820191358360051c8160005b601b811015610ce05760208601953583821c6001168015610cb05760018114610cc557610cd6565b60008481526020839052604090209350610cd6565b600082815260208590526040902093505b5050600101610c88565b50868114610cf657630badf00d60005260206000fd5b5050601f93909316601c0360031b9290921c63ffffffff169392505050565b6000808284610fff811615610d2f57610fff811661100003015b8663ffffffff16600003610d495784935090810190610d4d565b8693505b5093509350939050565b6101008101516080820151825160009283929163ffffffff1615610fc857845163ffffffff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb01610f82576000610dc3866101000151876020015163fffffffc168860e00151610c61565b606087015190915060001a600103610e4557610e3f86606001518760a0015160408051600093845233602052918152606090922091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b60608701525b6000808760c0015173ffffffffffffffffffffffffffffffffffffffff1663e03110e189606001518a608001516040518363ffffffff1660e01b8152600401610e9e92919091825263ffffffff16602082015260400190565b6040805180830381865afa158015610eba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ede9190612278565b60208a015160408b01519294509092509060038216600481900384811015610f04578094505b5083821015610f11578193505b8460088502610100031c9450846008828660040303021b9450600180600883600403021b036001806008878560040303021b03915081198116905085811988161796505050610f6f8a6020015163fffffffc168b60e0015187611f5b565b9298505050938601939250610fc8915050565b845163ffffffff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd01610fbc5784604001519350610fc8565b63ffffffff9350600992505b9193509193565b600080858563ffffffff8b1660011480610fef575063ffffffff8b166002145b80611000575063ffffffff8b166004145b1561100d578893506110b7565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa63ffffffff8c16016110ab57600061104d868c63fffffffc1689610c61565b90508860038c166004038b81101561106357809b505b8b965086900360089081029290921c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600193880293841b0116911b179150600090506110b7565b63ffffffff9350600992505b975097509750979350505050565b60008063ffffffff83166003036111685763ffffffff841615806110ef575063ffffffff84166005145b80611100575063ffffffff84166003145b1561110e5760009150611173565b63ffffffff841660011480611129575063ffffffff84166002145b8061113a575063ffffffff84166006145b8061114b575063ffffffff84166004145b156111595760019150611173565b5063ffffffff90506009611173565b5063ffffffff905060165b9250929050565b836000015160040163ffffffff16846020015163ffffffff16146111ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6a756d7020696e2064656c617920736c6f74000000000000000000000000000060448201526064015b60405180910390fd5b835160208501805163ffffffff908116875283811690915283161561124b5780600801848463ffffffff166020811061123a5761123a612249565b63ffffffff90921660209290920201525b5050505050565b600063ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80850183169190911c821615159160016020869003821681901b830191861691821b92911b01826112af5760006112b1565b815b90861663ffffffff16179250505092915050565b6000866000015160040163ffffffff16876020015163ffffffff1614611347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6272616e636820696e2064656c617920736c6f7400000000000000000000000060448201526064016111f6565b8463ffffffff166004148061136257508463ffffffff166005145b156113d9576000868463ffffffff166020811061138157611381612249565b602002015190508063ffffffff168363ffffffff161480156113a957508563ffffffff166004145b806113d157508063ffffffff168363ffffffff16141580156113d157508563ffffffff166005145b915050611456565b8463ffffffff166006036113f65760008260030b13159050611456565b8463ffffffff166007036114125760008260030b139050611456565b8463ffffffff1660010361145657601f601085901c16600081900361143b5760008360030b1291505b8063ffffffff166001036114545760008360030b121591505b505b8651602088015163ffffffff168852811561149757600261147c8661ffff166010611252565b63ffffffff90811690911b82016004011660208901526114a9565b60208801805160040163ffffffff1690525b5050505050505050565b600063ffffffff861615806114e0575060088663ffffffff16101580156114e05750600f8663ffffffff16105b156118e9578560088114611523576009811461152c57600a811461153557600b811461153e57600c811461154757600d811461155057600e81146115595761155e565b6020955061155e565b6021955061155e565b602a955061155e565b602b955061155e565b6024955061155e565b6025955061155e565b602695505b508463ffffffff16600003611583575063ffffffff8216601f600688901c161b611bc8565b8463ffffffff166002036115a7575063ffffffff8216601f600688901c161c611bc8565b8463ffffffff166003036115db57601f600688901c166115d363ffffffff8516821c6020839003611252565b915050611bc8565b8463ffffffff166004036115fb575063ffffffff8216601f84161b611bc8565b8463ffffffff1660060361161b575063ffffffff8216601f84161c611bc8565b8463ffffffff1660070361164c576116458463ffffffff168463ffffffff16901c85602003611252565b9050611bc8565b8463ffffffff16600803611661575082611bc8565b8463ffffffff16600903611676575082611bc8565b8463ffffffff16600a0361168b575082611bc8565b8463ffffffff16600b036116a0575082611bc8565b8463ffffffff16600c036116b5575082611bc8565b8463ffffffff16600f036116ca575082611bc8565b8463ffffffff166010036116df575082611bc8565b8463ffffffff166011036116f4575082611bc8565b8463ffffffff16601203611709575082611bc8565b8463ffffffff1660130361171e575082611bc8565b8463ffffffff16601803611733575082611bc8565b8463ffffffff16601903611748575082611bc8565b8463ffffffff16601a0361175d575082611bc8565b8463ffffffff16601b03611772575082611bc8565b8463ffffffff166020036117895750828201611bc8565b8463ffffffff166021036117a05750828201611bc8565b8463ffffffff166022036117b75750818303611bc8565b8463ffffffff166023036117ce5750818303611bc8565b8463ffffffff166024036117e55750828216611bc8565b8463ffffffff166025036117fc5750828217611bc8565b8463ffffffff166026036118135750828218611bc8565b8463ffffffff1660270361182b575082821719611bc8565b8463ffffffff16602a0361185a578260030b8460030b1261184d576000611850565b60015b60ff169050611bc8565b8463ffffffff16602b03611882578263ffffffff168463ffffffff161061184d576000611850565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c696420696e737472756374696f6e0000000000000000000000000060448201526064016111f6565b611882565b8563ffffffff16601c03611962578463ffffffff1660020361190e5750828202611bc8565b8463ffffffff166020148061192957508463ffffffff166021145b156118e4578463ffffffff16602003611940579219925b60005b6380000000851615611645576401fffffffe600195861b169401611943565b8563ffffffff16600f03611983575065ffffffff0000601083901b16611bc8565b8563ffffffff166020036119b7576116458460031660080260180363ffffffff168363ffffffff16901c60ff166008611252565b8563ffffffff166021036119ec576116458460021660080260100363ffffffff168363ffffffff16901c61ffff166010611252565b8563ffffffff16602203611a1a575063ffffffff60086003851602811681811b198416918316901b17611bc8565b8563ffffffff16602303611a2f575080611bc8565b8563ffffffff16602403611a60578360031660080260180363ffffffff168263ffffffff16901c60ff169050611bc8565b8563ffffffff16602503611a92578360021660080260100363ffffffff168263ffffffff16901c61ffff169050611bc8565b8563ffffffff16602603611ac3575063ffffffff60086003851602601803811681811c198416918316901c17611bc8565b8563ffffffff16602803611af8575060ff63ffffffff60086003861602601803811682811b9091188316918416901b17611bc8565b8563ffffffff16602903611b2e575061ffff63ffffffff60086002861602601003811682811b9091188316918416901b17611bc8565b8563ffffffff16602a03611b5c575063ffffffff60086003851602811681811c198316918416901c17611bc8565b8563ffffffff16602b03611b71575081611bc8565b8563ffffffff16602e03611ba2575063ffffffff60086003851602601803811681811b198316918416901b17611bc8565b8563ffffffff16603003611bb7575080611bc8565b8563ffffffff166038036118825750815b9695505050505050565b60208363ffffffff1610611c42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f76616c696420726567697374657200000000000000000000000000000000000060448201526064016111f6565b63ffffffff831615801590611c545750805b15611c835781848463ffffffff1660208110611c7257611c72612249565b63ffffffff90921660209290920201525b5050505060208101805163ffffffff8082169093526004019091169052565b60008463ffffffff16601003611cbd57506060860151611f03565b8463ffffffff16601103611cdc5763ffffffff84166060880152611f03565b8463ffffffff16601203611cf557506040860151611f03565b8463ffffffff16601303611d145763ffffffff84166040880152611f03565b8463ffffffff16601803611d485763ffffffff600385810b9085900b02602081901c821660608a0152166040880152611f03565b8463ffffffff16601903611d795763ffffffff84811681851602602081901c821660608a0152166040880152611f03565b8463ffffffff16601a03611e3c578260030b600003611df4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d4950533a206469766973696f6e206279207a65726f0000000000000000000060448201526064016111f6565b8260030b8460030b81611e0957611e0961229c565b0763ffffffff166060880152600383810b9085900b81611e2b57611e2b61229c565b0563ffffffff166040880152611f03565b8463ffffffff16601b03611f03578263ffffffff16600003611eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d4950533a206469766973696f6e206279207a65726f0000000000000000000060448201526064016111f6565b8263ffffffff168463ffffffff1681611ed557611ed561229c565b0663ffffffff908116606089015283811690851681611ef657611ef661229c565b0463ffffffff1660408801525b63ffffffff821615611f395780868363ffffffff1660208110611f2857611f28612249565b63ffffffff90921660209290920201525b50505060208401805163ffffffff808216909652600401909416909352505050565b6000611f6683611ffd565b6003841615611f7457600080fd5b6020830192601f8516601c0360031b83811b913563ffffffff90911b1916178460051c60005b601b811015611ff25760208601953582821c6001168015611fc25760018114611fd757611fe8565b60008581526020839052604090209450611fe8565b600082815260208690526040902094505b5050600101611f9a565b509095945050505050565b366103808201811015612092576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f636865636b207468617420746865726520697320656e6f7567682063616c6c6460448201527f617461000000000000000000000000000000000000000000000000000000000060648201526084016111f6565b5050565b6040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081019190915261016081016120fc612101565b905290565b6040518061040001604052806020906020820280368337509192915050565b600060208083528351808285015260005b8181101561214d57858101830151858201604001528201612131565b8181111561215f576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008083601f8401126121a557600080fd5b50813567ffffffffffffffff8111156121bd57600080fd5b60208301915083602082850101111561117357600080fd5b6000806000806000606086880312156121ed57600080fd5b853567ffffffffffffffff8082111561220557600080fd5b61221189838a01612193565b9097509550602088013591508082111561222a57600080fd5b5061223788828901612193565b96999598509660400135949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000806040838503121561228b57600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea164736f6c634300080f000a"; bytes internal constant anchorStateRegistryCode = - hex"608060405234801561001057600080fd5b50600436106100675760003560e01c8063838c2d1e11610050578063838c2d1e146100fa578063c303f0df14610104578063f2b4e6171461011757600080fd5b806354fd4d501461006c5780637258a807146100be575b600080fd5b6100a86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100b5919061085c565b60405180910390f35b6100e56100cc36600461088b565b6001602081905260009182526040909120805491015482565b604080519283526020830191909152016100b5565b61010261015b565b005b61010261011236600461094f565b6105d4565b60405173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb1681526020016100b5565b600033905060008060008373ffffffffffffffffffffffffffffffffffffffff1663fa24f7436040518163ffffffff1660e01b8152600401600060405180830381865afa1580156101b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526101f69190810190610a68565b92509250925060007f000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb73ffffffffffffffffffffffffffffffffffffffff16635f0150cb8585856040518463ffffffff1660e01b815260040161025b93929190610b39565b6040805180830381865afa158015610277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029b9190610b67565b5090508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f416e63686f72537461746552656769737472793a206661756c7420646973707560448201527f74652067616d65206e6f7420726567697374657265642077697468206661637460648201527f6f72790000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600160008563ffffffff1663ffffffff168152602001908152602001600020600101548573ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104169190610bc7565b11610422575050505050565b60028573ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561046f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104939190610c0f565b60028111156104a4576104a4610be0565b146104b0575050505050565b60405180604001604052806105308773ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052d9190610bc7565b90565b81526020018673ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610580573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a49190610bc7565b905263ffffffff909416600090815260016020818152604090922086518155959091015194019390935550505050565b600054610100900460ff16158080156105f45750600054600160ff909116105b8061060e5750303b15801561060e575060005460ff166001145b61069a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161037b565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156106f857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60005b825181101561075e57600083828151811061071857610718610c30565b60209081029190910181015180820151905163ffffffff16600090815260018084526040909120825181559190920151910155508061075681610c5f565b9150506106fb565b5080156107c257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60005b838110156107fd5781810151838201526020016107e5565b8381111561080c576000848401525b50505050565b6000815180845261082a8160208601602086016107e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061086f6020830184610812565b9392505050565b63ffffffff8116811461088857600080fd5b50565b60006020828403121561089d57600080fd5b813561086f81610876565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156108fa576108fa6108a8565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610947576109476108a8565b604052919050565b6000602080838503121561096257600080fd5b823567ffffffffffffffff8082111561097a57600080fd5b818501915085601f83011261098e57600080fd5b8135818111156109a0576109a06108a8565b6109ae848260051b01610900565b818152848101925060609182028401850191888311156109cd57600080fd5b938501935b82851015610a5c57848903818112156109eb5760008081fd5b6109f36108d7565b86356109fe81610876565b815260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301811315610a325760008081fd5b610a3a6108d7565b888a0135815290880135898201528189015285525093840193928501926109d2565b50979650505050505050565b600080600060608486031215610a7d57600080fd5b8351610a8881610876565b60208501516040860151919450925067ffffffffffffffff80821115610aad57600080fd5b818601915086601f830112610ac157600080fd5b815181811115610ad357610ad36108a8565b610b0460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610900565b9150808252876020828501011115610b1b57600080fd5b610b2c8160208401602086016107e2565b5080925050509250925092565b63ffffffff84168152826020820152606060408201526000610b5e6060830184610812565b95945050505050565b60008060408385031215610b7a57600080fd5b825173ffffffffffffffffffffffffffffffffffffffff81168114610b9e57600080fd5b602084015190925067ffffffffffffffff81168114610bbc57600080fd5b809150509250929050565b600060208284031215610bd957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215610c2157600080fd5b81516003811061086f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610cb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea164736f6c634300080f000a"; + hex"608060405234801561001057600080fd5b50600436106100675760003560e01c8063838c2d1e11610050578063838c2d1e146100fa578063c303f0df14610104578063f2b4e6171461011757600080fd5b806354fd4d501461006c5780637258a807146100be575b600080fd5b6100a86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100b5919061085c565b60405180910390f35b6100e56100cc36600461088b565b6001602081905260009182526040909120805491015482565b604080519283526020830191909152016100b5565b61010261015b565b005b61010261011236600461094f565b6105d4565b60405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d1681526020016100b5565b600033905060008060008373ffffffffffffffffffffffffffffffffffffffff1663fa24f7436040518163ffffffff1660e01b8152600401600060405180830381865afa1580156101b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526101f69190810190610a68565b92509250925060007f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d73ffffffffffffffffffffffffffffffffffffffff16635f0150cb8585856040518463ffffffff1660e01b815260040161025b93929190610b39565b6040805180830381865afa158015610277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029b9190610b67565b5090508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f416e63686f72537461746552656769737472793a206661756c7420646973707560448201527f74652067616d65206e6f7420726567697374657265642077697468206661637460648201527f6f72790000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600160008563ffffffff1663ffffffff168152602001908152602001600020600101548573ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104169190610bc7565b11610422575050505050565b60028573ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561046f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104939190610c0f565b60028111156104a4576104a4610be0565b146104b0575050505050565b60405180604001604052806105308773ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052d9190610bc7565b90565b81526020018673ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610580573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a49190610bc7565b905263ffffffff909416600090815260016020818152604090922086518155959091015194019390935550505050565b600054610100900460ff16158080156105f45750600054600160ff909116105b8061060e5750303b15801561060e575060005460ff166001145b61069a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161037b565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156106f857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60005b825181101561075e57600083828151811061071857610718610c30565b60209081029190910181015180820151905163ffffffff16600090815260018084526040909120825181559190920151910155508061075681610c5f565b9150506106fb565b5080156107c257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60005b838110156107fd5781810151838201526020016107e5565b8381111561080c576000848401525b50505050565b6000815180845261082a8160208601602086016107e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061086f6020830184610812565b9392505050565b63ffffffff8116811461088857600080fd5b50565b60006020828403121561089d57600080fd5b813561086f81610876565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156108fa576108fa6108a8565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610947576109476108a8565b604052919050565b6000602080838503121561096257600080fd5b823567ffffffffffffffff8082111561097a57600080fd5b818501915085601f83011261098e57600080fd5b8135818111156109a0576109a06108a8565b6109ae848260051b01610900565b818152848101925060609182028401850191888311156109cd57600080fd5b938501935b82851015610a5c57848903818112156109eb5760008081fd5b6109f36108d7565b86356109fe81610876565b815260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301811315610a325760008081fd5b610a3a6108d7565b888a0135815290880135898201528189015285525093840193928501926109d2565b50979650505050505050565b600080600060608486031215610a7d57600080fd5b8351610a8881610876565b60208501516040860151919450925067ffffffffffffffff80821115610aad57600080fd5b818601915086601f830112610ac157600080fd5b815181811115610ad357610ad36108a8565b610b0460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610900565b9150808252876020828501011115610b1b57600080fd5b610b2c8160208401602086016107e2565b5080925050509250925092565b63ffffffff84168152826020820152606060408201526000610b5e6060830184610812565b95945050505050565b60008060408385031215610b7a57600080fd5b825173ffffffffffffffffffffffffffffffffffffffff81168114610b9e57600080fd5b602084015190925067ffffffffffffffff81168114610bbc57600080fd5b809150509250929050565b600060208284031215610bd957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215610c2157600080fd5b81516003811061086f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610cb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea164736f6c634300080f000a"; bytes internal constant acc32Code = - hex"6080604052600436106102f25760003560e01c806370872aa51161018f578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b18578063fa315aa914610b3c578063fe2bbeb214610b6f57600080fd5b8063ec5e630814610a95578063eff0f59214610ac8578063f8f43ff614610af857600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a0f578063d8cc1a3c14610a42578063dabd396d14610a6257600080fd5b8063c6f0308c14610937578063cf09e0d0146109c1578063d5d44d80146109e257600080fd5b80638d450a9511610143578063bcef3b551161011d578063bcef3b55146108b7578063bd8da956146108f7578063c395e1ca1461091757600080fd5b80638d450a9514610777578063a445ece6146107aa578063bbdc02db1461087657600080fd5b80638129fc1c116101745780638129fc1c1461071a5780638980e0cc146107225780638b85902b1461073757600080fd5b806370872aa5146106f25780637b0f0adc1461070757600080fd5b80633fc8cef3116102485780635c0cba33116101fc5780636361506d116101d65780636361506d1461066c5780636b6716c0146106ac5780636f034409146106df57600080fd5b80635c0cba3314610604578063609d33341461063757806360e274641461064c57600080fd5b806354fd4d501161022d57806354fd4d501461055e57806357da950e146105b45780635a5fa2d9146105e457600080fd5b80633fc8cef314610518578063472777c61461054b57600080fd5b80632810e1d6116102aa57806337b1b2291161028457806337b1b229146104655780633a768463146104a55780633e3ac912146104d857600080fd5b80632810e1d6146103de5780632ad69aeb146103f357806330dbe5701461041357600080fd5b806319effeb4116102db57806319effeb414610339578063200d2ed21461038457806325fc2ace146103bf57600080fd5b806301935130146102f757806303c2924d14610319575b600080fd5b34801561030357600080fd5b5061031761031236600461532d565b610b9f565b005b34801561032557600080fd5b50610317610334366004615388565b610ec0565b34801561034557600080fd5b506000546103669068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561039057600080fd5b506000546103b290700100000000000000000000000000000000900460ff1681565b60405161037b91906153d9565b3480156103cb57600080fd5b506008545b60405190815260200161037b565b3480156103ea57600080fd5b506103b2611566565b3480156103ff57600080fd5b506103d061040e366004615388565b61180b565b34801561041f57600080fd5b506001546104409073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161037b565b34801561047157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610440565b3480156104b157600080fd5b507f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d40773610440565b3480156104e457600080fd5b50600054610508907201000000000000000000000000000000000000900460ff1681565b604051901515815260200161037b565b34801561052457600080fd5b507f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d610440565b61031761055936600461541a565b611841565b34801561056a57600080fd5b506105a76040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161037b91906154b1565b3480156105c057600080fd5b506008546009546105cf919082565b6040805192835260208301919091520161037b565b3480156105f057600080fd5b506103d06105ff3660046154c4565b611853565b34801561061057600080fd5b507f00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df99610440565b34801561064357600080fd5b506105a761188d565b34801561065857600080fd5b50610317610667366004615502565b61189b565b34801561067857600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103d0565b3480156106b857600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610366565b6103176106ed366004615534565b611a42565b3480156106fe57600080fd5b506009546103d0565b61031761071536600461541a565b6123e3565b6103176123f0565b34801561072e57600080fd5b506002546103d0565b34801561074357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103d0565b34801561078357600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103d0565b3480156107b657600080fd5b506108226107c53660046154c4565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff16606082015260800161037b565b34801561088257600080fd5b5060405163ffffffff7f000000000000000000000000000000000000000000000000000000000000000016815260200161037b565b3480156108c357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103d0565b34801561090357600080fd5b506103666109123660046154c4565b612949565b34801561092357600080fd5b506103d0610932366004615573565b612b28565b34801561094357600080fd5b506109576109523660046154c4565b612d0b565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e00161037b565b3480156109cd57600080fd5b506000546103669067ffffffffffffffff1681565b3480156109ee57600080fd5b506103d06109fd366004615502565b60036020526000908152604090205481565b348015610a1b57600080fd5b507f00000000000000000000000000000000000000000000000000000000000003856103d0565b348015610a4e57600080fd5b50610317610a5d3660046155a5565b612da2565b348015610a6e57600080fd5b507f00000000000000000000000000000000000000000000000000000000000004b0610366565b348015610aa157600080fd5b507f00000000000000000000000000000000000000000000000000000000000000046103d0565b348015610ad457600080fd5b50610508610ae33660046154c4565b60046020526000908152604090205460ff1681565b348015610b0457600080fd5b50610317610b1336600461541a565b6133d1565b348015610b2457600080fd5b50610b2d613823565b60405161037b9392919061562f565b348015610b4857600080fd5b507f00000000000000000000000000000000000000000000000000000000000000086103d0565b348015610b7b57600080fd5b50610508610b8a3660046154c4565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610bcb57610bcb6153aa565b14610c02576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610c55576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c8c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610ca3610c9e36869003860186615683565b613883565b14610cda576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610cef929190615710565b604051809103902014610d2e576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d77610d7284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506138df92505050565b61394c565b90506000610d9e82600881518110610d9157610d91615720565b6020026020010151613b02565b9050602081511115610ddc576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610e51576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610eec57610eec6153aa565b14610f23576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610f3857610f38615720565b906000526020600020906005020190506000610f5384612949565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b081169082161015610fbc576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611005576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561102257508515155b156110bd578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110555781611071565b600186015473ffffffffffffffffffffffffffffffffffffffff165b905061107d8187613bb6565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff166060830152611160576fffffffffffffffffffffffffffffffff6040820152600181526000869003611160578195505b600086826020015163ffffffff16611178919061577e565b90506000838211611189578161118b565b835b602084015190915063ffffffff165b818110156112d75760008682815481106111b6576111b6615720565b6000918252602080832090910154808352600690915260409091205490915060ff1661120e576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061122357611223615720565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112805750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b156112c257600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b505080806112cf90615796565b91505061119a565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9093169290921790915584900361155b57606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558915801561145757506000547201000000000000000000000000000000000000900460ff165b156114cc5760015473ffffffffffffffffffffffffffffffffffffffff1661147f818a613bb6565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff909116178855611559565b61151373ffffffffffffffffffffffffffffffffffffffff8216156114f1578161150d565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89613bb6565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff166002811115611594576115946153aa565b146115cb576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff1661162f576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008154811061165b5761165b615720565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611696576001611699565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff9091161770010000000000000000000000000000000083600281111561174a5761174a6153aa565b02179055600281111561175f5761175f6153aa565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df9973ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156117f057600080fd5b505af1158015611804573d6000803e3d6000fd5b5050505090565b6005602052816000526040600020818154811061182757600080fd5b90600052602060002001600091509150505481565b905090565b61184e8383836001611a42565b505050565b6000818152600760209081526040808320600590925282208054825461188490610100900463ffffffff16826157ce565b95945050505050565b606061183c60546020613cb7565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812080549082905590819003611900576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d169063f3fef3a390604401600060405180830381600087803b15801561199057600080fd5b505af11580156119a4573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a02576040519150601f19603f3d011682016040523d82523d6000602084013e611a07565b606091505b505090508061184e576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054700100000000000000000000000000000000900460ff166002811115611a6e57611a6e6153aa565b14611aa5576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110611aba57611aba615720565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514611ba1576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000611c61826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580611c9c5750611c997f0000000000000000000000000000000000000000000000000000000000000004600261577e565b81145b8015611ca6575084155b15611cdd576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015611d03575086155b15611d3a576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000008811115611d94576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dbf7f0000000000000000000000000000000000000000000000000000000000000004600161577e565b8103611dd157611dd186888588613d09565b34611ddb83612b28565b14611e12576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e1d88612949565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b0811690821603611e85576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b016611ee591906157e5565b67ffffffffffffffff16611f008267ffffffffffffffff1690565b67ffffffffffffffff161115611fe2576000611f3d60017f00000000000000000000000000000000000000000000000000000000000000046157ce565b8314611f735767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016611fa8565b611fa87f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16600261580e565b9050611fde817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff166157e5565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526004602052604090205490915060ff1615612060576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008b815260200190815260200160002060016002805490506122f691906157ce565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d169263d0e30db09234926004808301939282900301818588803b15801561238e57600080fd5b505af11580156123a2573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b61184e8383836000611a42565b60005471010000000000000000000000000000000000900460ff1615612442576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000000166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df991690637258a807906024016040805180830381865afa1580156124f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251a919061583e565b909250905081612556576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461258957639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036054013511612623576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d9092169363d0e30db093926004828101939282900301818588803b1580156128f857600080fd5b505af115801561290c573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b600080600054700100000000000000000000000000000000900460ff166002811115612977576129776153aa565b146129ae576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600283815481106129c3576129c3615720565b600091825260208220600590910201805490925063ffffffff90811614612a3257815460028054909163ffffffff16908110612a0157612a01615720565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090612a6a90700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b612a7e9067ffffffffffffffff16426157ce565b612a9d612a5d846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16612ab1919061577e565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b01667ffffffffffffffff168167ffffffffffffffff1611612afe5780611884565b7f00000000000000000000000000000000000000000000000000000000000004b095945050505050565b600080612bc7836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000008811115612c26576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000612c418383615891565b9050670de0b6b3a76400006000612c78827f00000000000000000000000000000000000000000000000000000000000000086158a5565b90506000612c96612c91670de0b6b3a7640000866158a5565b613eba565b90506000612ca48484614115565b90506000612cb28383614164565b90506000612cbf82614192565b90506000612cde82612cd9670de0b6b3a76400008f6158a5565b61437a565b90506000612cec8b83614164565b9050612cf8818d6158a5565b9f9e505050505050505050505050505050565b60028181548110612d1b57600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff166002811115612dce57612dce6153aa565b14612e05576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110612e1a57612e1a615720565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050612e797f0000000000000000000000000000000000000000000000000000000000000008600161577e565b612f15826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614612f4f576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080891561304657612fa27f00000000000000000000000000000000000000000000000000000000000000047f00000000000000000000000000000000000000000000000000000000000000086157ce565b6001901b612fc1846fffffffffffffffffffffffffffffffff166143b4565b6fffffffffffffffffffffffffffffffff16612fdd91906158e2565b1561301a5761301161300260016fffffffffffffffffffffffffffffffff87166158f6565b865463ffffffff166000614453565b6003015461303c565b7f00000000000000000000000000000000000000000000000000000000000000005b9150849050613070565b6003850154915061306d6130026fffffffffffffffffffffffffffffffff8616600161591f565b90505b600882901b60088a8a604051613087929190615710565b6040518091039020901b146130c8576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006130d38c614537565b905060006130e2836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d4077373ffffffffffffffffffffffffffffffffffffffff169063e14ced329061315c908f908f908f908f908a9060040161599c565b6020604051808303816000875af115801561317b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319f91906159d6565b60048501549114915060009060029061324a906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6132e6896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6132f091906159ef565b6132fa9190615a12565b60ff16159050811515810361333b576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff1615613392576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff1660028111156133fd576133fd6153aa565b14613434576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008061344386614566565b935093509350935060006134598585858561496f565b905060007f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d4077373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134ec9190615a34565b9050600189036135e45773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84613548367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af11580156135ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135de91906159d6565b5061155b565b600289036136105773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489613548565b6003890361363c5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487613548565b600489036137585760006136826fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000004614a29565b60095461368f919061577e565b61369a90600161577e565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561372d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061375191906159d6565b505061155b565b600589036137f1576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000038560c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a40161359b565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360140135606061387c61188d565b9050909192565b600081600001518260200151836040015184606001516040516020016138c2949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6040805180820190915260008082526020820152815160000361392e576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b6060600080600061395c85614ad7565b919450925090506001816001811115613977576139776153aa565b146139ae576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516139ba838561577e565b146139f1576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081613a085790505093506000835b8651811015613af657600080613a7b6040518060400160405280858c60000151613a5f91906157ce565b8152602001858c60200151613a74919061577e565b9052614ad7565b509150915060405180604001604052808383613a97919061577e565b8152602001848b60200151613aac919061577e565b815250888581518110613ac157613ac1615720565b6020908102919091010152613ad760018561577e565b9350613ae3818361577e565b613aed908461577e565b92505050613a35565b50845250919392505050565b60606000806000613b1285614ad7565b919450925090506000816001811115613b2d57613b2d6153aa565b14613b64576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b6e828461577e565b855114613ba7576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61188485602001518484614f75565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff90931692839290613c0590849061577e565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d1690637eee288d90604401600060405180830381600087803b158015613c9a57600080fd5b505af1158015613cae573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b6000613d286fffffffffffffffffffffffffffffffff8416600161591f565b90506000613d3882866001614453565b9050600086901a8380613e245750613d7160027f00000000000000000000000000000000000000000000000000000000000000046158e2565b6004830154600290613e15906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b613e1f9190615a12565b60ff16145b15613e7c5760ff811660011480613e3e575060ff81166002145b613e77576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161261a565b613cae565b60ff811615613cae576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161261a565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b1760008213613f1957631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a76400000215820261415257637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b6000816000190483118202156141825763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d782136141c057919050565b680755bf798b4a1bf1e582126141de5763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b60006143ab670de0b6b3a76400008361439286613eba565b61439c9190615a51565b6143a69190615b0d565b614192565b90505b92915050565b600080614441837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b6000808261449c576144976fffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000461500a565b6144b7565b6144b7856fffffffffffffffffffffffffffffffff16615196565b9050600284815481106144cc576144cc615720565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461452f57815460028054909163ffffffff1690811061451a5761451a615720565b906000526020600020906005020191506144dd565b509392505050565b600080600080600061454886614566565b935093509350935061455c8484848461496f565b9695505050505050565b600080600080600085905060006002828154811061458657614586615720565b600091825260209091206004600590920201908101549091507f00000000000000000000000000000000000000000000000000000000000000049061465d906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611614697576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f00000000000000000000000000000000000000000000000000000000000000049061475e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156147d357825463ffffffff1661479d7f0000000000000000000000000000000000000000000000000000000000000004600161577e565b83036147a7578391505b600281815481106147ba576147ba615720565b906000526020600020906005020193508094505061469b565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661483c614827856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561490b576000614874836fffffffffffffffffffffffffffffffff166143b4565b6fffffffffffffffffffffffffffffffff1611156148df5760006148b66148ae60016fffffffffffffffffffffffffffffffff86166158f6565b896001614453565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506148e59050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614961565b600061492d6148ae6fffffffffffffffffffffffffffffffff8516600161591f565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff8416156149dc5760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611884565b8282604051602001614a0a9291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b600080614ab6847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614b1a576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614b3f576000600160009450945094505050614f6e565b60b78111614c55576000614b546080836157ce565b905080876000015111614b93576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614c0b57507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614c42576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614f6e915050565b60bf8111614db3576000614c6a60b7836157ce565b905080876000015111614ca9576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614d0b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614d53576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614d5d818461577e565b895111614d96576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614da183600161577e565b9750955060009450614f6e9350505050565b60f78111614e18576000614dc860c0836157ce565b905080876000015111614e07576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614f6e915050565b6000614e2560f7836157ce565b905080876000015111614e64576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614ec6576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614f0e576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f18818461577e565b895111614f51576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f5c83600161577e565b9750955060019450614f6e9350505050565b9193909250565b60608167ffffffffffffffff811115614f9057614f90615654565b6040519080825280601f01601f191660200182016040528015614fba576020820181803683370190505b5090508115615003576000614fcf848661577e565b90506020820160005b84811015614ff0578281015182820152602001614fd8565b84811115614fff576000858301525b5050505b9392505050565b6000816150a9846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116150bf5763b34b5c226000526004601cfd5b6150c883615196565b905081615167826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116143ae576143ab61517d83600161577e565b6fffffffffffffffffffffffffffffffff83169061523b565b6000811960018301168161522a827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b6000806152c8847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f8401126152f657600080fd5b50813567ffffffffffffffff81111561530e57600080fd5b60208301915083602082850101111561532657600080fd5b9250929050565b600080600083850360a081121561534357600080fd5b608081121561535157600080fd5b50839250608084013567ffffffffffffffff81111561536f57600080fd5b61537b868287016152e4565b9497909650939450505050565b6000806040838503121561539b57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310615414577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060006060848603121561542f57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b8181101561546c57602081850181015186830182015201615450565b8181111561547e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006143ab6020830184615446565b6000602082840312156154d657600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146154ff57600080fd5b50565b60006020828403121561551457600080fd5b8135615003816154dd565b8035801515811461552f57600080fd5b919050565b6000806000806080858703121561554a57600080fd5b8435935060208501359250604085013591506155686060860161551f565b905092959194509250565b60006020828403121561558557600080fd5b81356fffffffffffffffffffffffffffffffff8116811461500357600080fd5b600080600080600080608087890312156155be57600080fd5b863595506155ce6020880161551f565b9450604087013567ffffffffffffffff808211156155eb57600080fd5b6155f78a838b016152e4565b9096509450606089013591508082111561561057600080fd5b5061561d89828a016152e4565b979a9699509497509295939492505050565b63ffffffff841681528260208201526060604082015260006118846060830184615446565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561569557600080fd5b6040516080810181811067ffffffffffffffff821117156156df577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156157915761579161574f565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157c7576157c761574f565b5060010190565b6000828210156157e0576157e061574f565b500390565b600067ffffffffffffffff838116908316818110156158065761580661574f565b039392505050565b600067ffffffffffffffff808316818516818304811182151516156158355761583561574f565b02949350505050565b6000806040838503121561585157600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826158a0576158a0615862565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156158dd576158dd61574f565b500290565b6000826158f1576158f1615862565b500690565b60006fffffffffffffffffffffffffffffffff838116908316818110156158065761580661574f565b60006fffffffffffffffffffffffffffffffff80831681851680830382111561594a5761594a61574f565b01949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6060815260006159b0606083018789615953565b82810360208401526159c3818688615953565b9150508260408301529695505050505050565b6000602082840312156159e857600080fd5b5051919050565b600060ff821660ff841680821015615a0957615a0961574f565b90039392505050565b600060ff831680615a2557615a25615862565b8060ff84160691505092915050565b600060208284031215615a4657600080fd5b8151615003816154dd565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615a9257615a9261574f565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615acd57615acd61574f565b60008712925087820587128484161615615ae957615ae961574f565b87850587128184161615615aff57615aff61574f565b505050929093029392505050565b600082615b1c57615b1c615862565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615b7057615b7061574f565b50059056fea164736f6c634300080f000a"; + hex"6080604052600436106102f25760003560e01c806370872aa51161018f578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b18578063fa315aa914610b3c578063fe2bbeb214610b6f57600080fd5b8063ec5e630814610a95578063eff0f59214610ac8578063f8f43ff614610af857600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a0f578063d8cc1a3c14610a42578063dabd396d14610a6257600080fd5b8063c6f0308c14610937578063cf09e0d0146109c1578063d5d44d80146109e257600080fd5b80638d450a9511610143578063bcef3b551161011d578063bcef3b55146108b7578063bd8da956146108f7578063c395e1ca1461091757600080fd5b80638d450a9514610777578063a445ece6146107aa578063bbdc02db1461087657600080fd5b80638129fc1c116101745780638129fc1c1461071a5780638980e0cc146107225780638b85902b1461073757600080fd5b806370872aa5146106f25780637b0f0adc1461070757600080fd5b80633fc8cef3116102485780635c0cba33116101fc5780636361506d116101d65780636361506d1461066c5780636b6716c0146106ac5780636f034409146106df57600080fd5b80635c0cba3314610604578063609d33341461063757806360e274641461064c57600080fd5b806354fd4d501161022d57806354fd4d501461055e57806357da950e146105b45780635a5fa2d9146105e457600080fd5b80633fc8cef314610518578063472777c61461054b57600080fd5b80632810e1d6116102aa57806337b1b2291161028457806337b1b229146104655780633a768463146104a55780633e3ac912146104d857600080fd5b80632810e1d6146103de5780632ad69aeb146103f357806330dbe5701461041357600080fd5b806319effeb4116102db57806319effeb414610339578063200d2ed21461038457806325fc2ace146103bf57600080fd5b806301935130146102f757806303c2924d14610319575b600080fd5b34801561030357600080fd5b5061031761031236600461532d565b610b9f565b005b34801561032557600080fd5b50610317610334366004615388565b610ec0565b34801561034557600080fd5b506000546103669068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561039057600080fd5b506000546103b290700100000000000000000000000000000000900460ff1681565b60405161037b91906153d9565b3480156103cb57600080fd5b506008545b60405190815260200161037b565b3480156103ea57600080fd5b506103b2611566565b3480156103ff57600080fd5b506103d061040e366004615388565b61180b565b34801561041f57600080fd5b506001546104409073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161037b565b34801561047157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610440565b3480156104b157600080fd5b507f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d40773610440565b3480156104e457600080fd5b50600054610508907201000000000000000000000000000000000000900460ff1681565b604051901515815260200161037b565b34801561052457600080fd5b507f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92610440565b61031761055936600461541a565b611841565b34801561056a57600080fd5b506105a76040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161037b91906154b1565b3480156105c057600080fd5b506008546009546105cf919082565b6040805192835260208301919091520161037b565b3480156105f057600080fd5b506103d06105ff3660046154c4565b611853565b34801561061057600080fd5b507f000000000000000000000000d6eaf4c146261653ee059077b78ed088add54309610440565b34801561064357600080fd5b506105a761188d565b34801561065857600080fd5b50610317610667366004615502565b61189b565b34801561067857600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103d0565b3480156106b857600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610366565b6103176106ed366004615534565b611a42565b3480156106fe57600080fd5b506009546103d0565b61031761071536600461541a565b6123e3565b6103176123f0565b34801561072e57600080fd5b506002546103d0565b34801561074357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103d0565b34801561078357600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103d0565b3480156107b657600080fd5b506108226107c53660046154c4565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff16606082015260800161037b565b34801561088257600080fd5b5060405163ffffffff7f000000000000000000000000000000000000000000000000000000000000000016815260200161037b565b3480156108c357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103d0565b34801561090357600080fd5b506103666109123660046154c4565b612949565b34801561092357600080fd5b506103d0610932366004615573565b612b28565b34801561094357600080fd5b506109576109523660046154c4565b612d0b565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e00161037b565b3480156109cd57600080fd5b506000546103669067ffffffffffffffff1681565b3480156109ee57600080fd5b506103d06109fd366004615502565b60036020526000908152604090205481565b348015610a1b57600080fd5b507f00000000000000000000000000000000000000000000000000000000000003856103d0565b348015610a4e57600080fd5b50610317610a5d3660046155a5565b612da2565b348015610a6e57600080fd5b507f00000000000000000000000000000000000000000000000000000000000004b0610366565b348015610aa157600080fd5b507f00000000000000000000000000000000000000000000000000000000000000046103d0565b348015610ad457600080fd5b50610508610ae33660046154c4565b60046020526000908152604090205460ff1681565b348015610b0457600080fd5b50610317610b1336600461541a565b6133d1565b348015610b2457600080fd5b50610b2d613823565b60405161037b9392919061562f565b348015610b4857600080fd5b507f00000000000000000000000000000000000000000000000000000000000000086103d0565b348015610b7b57600080fd5b50610508610b8a3660046154c4565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610bcb57610bcb6153aa565b14610c02576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610c55576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c8c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610ca3610c9e36869003860186615683565b613883565b14610cda576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610cef929190615710565b604051809103902014610d2e576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d77610d7284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506138df92505050565b61394c565b90506000610d9e82600881518110610d9157610d91615720565b6020026020010151613b02565b9050602081511115610ddc576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610e51576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610eec57610eec6153aa565b14610f23576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610f3857610f38615720565b906000526020600020906005020190506000610f5384612949565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b081169082161015610fbc576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611005576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561102257508515155b156110bd578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110555781611071565b600186015473ffffffffffffffffffffffffffffffffffffffff165b905061107d8187613bb6565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff166060830152611160576fffffffffffffffffffffffffffffffff6040820152600181526000869003611160578195505b600086826020015163ffffffff16611178919061577e565b90506000838211611189578161118b565b835b602084015190915063ffffffff165b818110156112d75760008682815481106111b6576111b6615720565b6000918252602080832090910154808352600690915260409091205490915060ff1661120e576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061122357611223615720565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112805750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b156112c257600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b505080806112cf90615796565b91505061119a565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9093169290921790915584900361155b57606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558915801561145757506000547201000000000000000000000000000000000000900460ff165b156114cc5760015473ffffffffffffffffffffffffffffffffffffffff1661147f818a613bb6565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff909116178855611559565b61151373ffffffffffffffffffffffffffffffffffffffff8216156114f1578161150d565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89613bb6565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff166002811115611594576115946153aa565b146115cb576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff1661162f576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008154811061165b5761165b615720565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611696576001611699565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff9091161770010000000000000000000000000000000083600281111561174a5761174a6153aa565b02179055600281111561175f5761175f6153aa565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f000000000000000000000000d6eaf4c146261653ee059077b78ed088add5430973ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156117f057600080fd5b505af1158015611804573d6000803e3d6000fd5b5050505090565b6005602052816000526040600020818154811061182757600080fd5b90600052602060002001600091509150505481565b905090565b61184e8383836001611a42565b505050565b6000818152600760209081526040808320600590925282208054825461188490610100900463ffffffff16826157ce565b95945050505050565b606061183c60546020613cb7565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812080549082905590819003611900576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92169063f3fef3a390604401600060405180830381600087803b15801561199057600080fd5b505af11580156119a4573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a02576040519150601f19603f3d011682016040523d82523d6000602084013e611a07565b606091505b505090508061184e576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054700100000000000000000000000000000000900460ff166002811115611a6e57611a6e6153aa565b14611aa5576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110611aba57611aba615720565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514611ba1576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000611c61826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580611c9c5750611c997f0000000000000000000000000000000000000000000000000000000000000004600261577e565b81145b8015611ca6575084155b15611cdd576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015611d03575086155b15611d3a576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000008811115611d94576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dbf7f0000000000000000000000000000000000000000000000000000000000000004600161577e565b8103611dd157611dd186888588613d09565b34611ddb83612b28565b14611e12576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e1d88612949565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b0811690821603611e85576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b016611ee591906157e5565b67ffffffffffffffff16611f008267ffffffffffffffff1690565b67ffffffffffffffff161115611fe2576000611f3d60017f00000000000000000000000000000000000000000000000000000000000000046157ce565b8314611f735767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016611fa8565b611fa87f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16600261580e565b9050611fde817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff166157e5565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526004602052604090205490915060ff1615612060576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008b815260200190815260200160002060016002805490506122f691906157ce565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92169263d0e30db09234926004808301939282900301818588803b15801561238e57600080fd5b505af11580156123a2573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b61184e8383836000611a42565b60005471010000000000000000000000000000000000900460ff1615612442576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000000166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000d6eaf4c146261653ee059077b78ed088add543091690637258a807906024016040805180830381865afa1580156124f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251a919061583e565b909250905081612556576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461258957639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036054013511612623576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd929092169363d0e30db093926004828101939282900301818588803b1580156128f857600080fd5b505af115801561290c573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b600080600054700100000000000000000000000000000000900460ff166002811115612977576129776153aa565b146129ae576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600283815481106129c3576129c3615720565b600091825260208220600590910201805490925063ffffffff90811614612a3257815460028054909163ffffffff16908110612a0157612a01615720565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090612a6a90700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b612a7e9067ffffffffffffffff16426157ce565b612a9d612a5d846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16612ab1919061577e565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b01667ffffffffffffffff168167ffffffffffffffff1611612afe5780611884565b7f00000000000000000000000000000000000000000000000000000000000004b095945050505050565b600080612bc7836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000008811115612c26576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000612c418383615891565b9050670de0b6b3a76400006000612c78827f00000000000000000000000000000000000000000000000000000000000000086158a5565b90506000612c96612c91670de0b6b3a7640000866158a5565b613eba565b90506000612ca48484614115565b90506000612cb28383614164565b90506000612cbf82614192565b90506000612cde82612cd9670de0b6b3a76400008f6158a5565b61437a565b90506000612cec8b83614164565b9050612cf8818d6158a5565b9f9e505050505050505050505050505050565b60028181548110612d1b57600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff166002811115612dce57612dce6153aa565b14612e05576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110612e1a57612e1a615720565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050612e797f0000000000000000000000000000000000000000000000000000000000000008600161577e565b612f15826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614612f4f576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080891561304657612fa27f00000000000000000000000000000000000000000000000000000000000000047f00000000000000000000000000000000000000000000000000000000000000086157ce565b6001901b612fc1846fffffffffffffffffffffffffffffffff166143b4565b6fffffffffffffffffffffffffffffffff16612fdd91906158e2565b1561301a5761301161300260016fffffffffffffffffffffffffffffffff87166158f6565b865463ffffffff166000614453565b6003015461303c565b7f00000000000000000000000000000000000000000000000000000000000000005b9150849050613070565b6003850154915061306d6130026fffffffffffffffffffffffffffffffff8616600161591f565b90505b600882901b60088a8a604051613087929190615710565b6040518091039020901b146130c8576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006130d38c614537565b905060006130e2836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d4077373ffffffffffffffffffffffffffffffffffffffff169063e14ced329061315c908f908f908f908f908a9060040161599c565b6020604051808303816000875af115801561317b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319f91906159d6565b60048501549114915060009060029061324a906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6132e6896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6132f091906159ef565b6132fa9190615a12565b60ff16159050811515810361333b576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff1615613392576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff1660028111156133fd576133fd6153aa565b14613434576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008061344386614566565b935093509350935060006134598585858561496f565b905060007f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d4077373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134ec9190615a34565b9050600189036135e45773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84613548367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af11580156135ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135de91906159d6565b5061155b565b600289036136105773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489613548565b6003890361363c5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487613548565b600489036137585760006136826fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000004614a29565b60095461368f919061577e565b61369a90600161577e565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561372d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061375191906159d6565b505061155b565b600589036137f1576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000038560c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a40161359b565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360140135606061387c61188d565b9050909192565b600081600001518260200151836040015184606001516040516020016138c2949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6040805180820190915260008082526020820152815160000361392e576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b6060600080600061395c85614ad7565b919450925090506001816001811115613977576139776153aa565b146139ae576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516139ba838561577e565b146139f1576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081613a085790505093506000835b8651811015613af657600080613a7b6040518060400160405280858c60000151613a5f91906157ce565b8152602001858c60200151613a74919061577e565b9052614ad7565b509150915060405180604001604052808383613a97919061577e565b8152602001848b60200151613aac919061577e565b815250888581518110613ac157613ac1615720565b6020908102919091010152613ad760018561577e565b9350613ae3818361577e565b613aed908461577e565b92505050613a35565b50845250919392505050565b60606000806000613b1285614ad7565b919450925090506000816001811115613b2d57613b2d6153aa565b14613b64576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b6e828461577e565b855114613ba7576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61188485602001518484614f75565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff90931692839290613c0590849061577e565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd921690637eee288d90604401600060405180830381600087803b158015613c9a57600080fd5b505af1158015613cae573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b6000613d286fffffffffffffffffffffffffffffffff8416600161591f565b90506000613d3882866001614453565b9050600086901a8380613e245750613d7160027f00000000000000000000000000000000000000000000000000000000000000046158e2565b6004830154600290613e15906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b613e1f9190615a12565b60ff16145b15613e7c5760ff811660011480613e3e575060ff81166002145b613e77576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161261a565b613cae565b60ff811615613cae576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161261a565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b1760008213613f1957631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a76400000215820261415257637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b6000816000190483118202156141825763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d782136141c057919050565b680755bf798b4a1bf1e582126141de5763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b60006143ab670de0b6b3a76400008361439286613eba565b61439c9190615a51565b6143a69190615b0d565b614192565b90505b92915050565b600080614441837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b6000808261449c576144976fffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000461500a565b6144b7565b6144b7856fffffffffffffffffffffffffffffffff16615196565b9050600284815481106144cc576144cc615720565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461452f57815460028054909163ffffffff1690811061451a5761451a615720565b906000526020600020906005020191506144dd565b509392505050565b600080600080600061454886614566565b935093509350935061455c8484848461496f565b9695505050505050565b600080600080600085905060006002828154811061458657614586615720565b600091825260209091206004600590920201908101549091507f00000000000000000000000000000000000000000000000000000000000000049061465d906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611614697576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f00000000000000000000000000000000000000000000000000000000000000049061475e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156147d357825463ffffffff1661479d7f0000000000000000000000000000000000000000000000000000000000000004600161577e565b83036147a7578391505b600281815481106147ba576147ba615720565b906000526020600020906005020193508094505061469b565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661483c614827856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561490b576000614874836fffffffffffffffffffffffffffffffff166143b4565b6fffffffffffffffffffffffffffffffff1611156148df5760006148b66148ae60016fffffffffffffffffffffffffffffffff86166158f6565b896001614453565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506148e59050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614961565b600061492d6148ae6fffffffffffffffffffffffffffffffff8516600161591f565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff8416156149dc5760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611884565b8282604051602001614a0a9291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b600080614ab6847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614b1a576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614b3f576000600160009450945094505050614f6e565b60b78111614c55576000614b546080836157ce565b905080876000015111614b93576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614c0b57507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614c42576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614f6e915050565b60bf8111614db3576000614c6a60b7836157ce565b905080876000015111614ca9576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614d0b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614d53576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614d5d818461577e565b895111614d96576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614da183600161577e565b9750955060009450614f6e9350505050565b60f78111614e18576000614dc860c0836157ce565b905080876000015111614e07576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614f6e915050565b6000614e2560f7836157ce565b905080876000015111614e64576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614ec6576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614f0e576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f18818461577e565b895111614f51576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f5c83600161577e565b9750955060019450614f6e9350505050565b9193909250565b60608167ffffffffffffffff811115614f9057614f90615654565b6040519080825280601f01601f191660200182016040528015614fba576020820181803683370190505b5090508115615003576000614fcf848661577e565b90506020820160005b84811015614ff0578281015182820152602001614fd8565b84811115614fff576000858301525b5050505b9392505050565b6000816150a9846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116150bf5763b34b5c226000526004601cfd5b6150c883615196565b905081615167826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116143ae576143ab61517d83600161577e565b6fffffffffffffffffffffffffffffffff83169061523b565b6000811960018301168161522a827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b6000806152c8847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f8401126152f657600080fd5b50813567ffffffffffffffff81111561530e57600080fd5b60208301915083602082850101111561532657600080fd5b9250929050565b600080600083850360a081121561534357600080fd5b608081121561535157600080fd5b50839250608084013567ffffffffffffffff81111561536f57600080fd5b61537b868287016152e4565b9497909650939450505050565b6000806040838503121561539b57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310615414577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060006060848603121561542f57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b8181101561546c57602081850181015186830182015201615450565b8181111561547e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006143ab6020830184615446565b6000602082840312156154d657600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146154ff57600080fd5b50565b60006020828403121561551457600080fd5b8135615003816154dd565b8035801515811461552f57600080fd5b919050565b6000806000806080858703121561554a57600080fd5b8435935060208501359250604085013591506155686060860161551f565b905092959194509250565b60006020828403121561558557600080fd5b81356fffffffffffffffffffffffffffffffff8116811461500357600080fd5b600080600080600080608087890312156155be57600080fd5b863595506155ce6020880161551f565b9450604087013567ffffffffffffffff808211156155eb57600080fd5b6155f78a838b016152e4565b9096509450606089013591508082111561561057600080fd5b5061561d89828a016152e4565b979a9699509497509295939492505050565b63ffffffff841681528260208201526060604082015260006118846060830184615446565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561569557600080fd5b6040516080810181811067ffffffffffffffff821117156156df577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156157915761579161574f565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157c7576157c761574f565b5060010190565b6000828210156157e0576157e061574f565b500390565b600067ffffffffffffffff838116908316818110156158065761580661574f565b039392505050565b600067ffffffffffffffff808316818516818304811182151516156158355761583561574f565b02949350505050565b6000806040838503121561585157600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826158a0576158a0615862565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156158dd576158dd61574f565b500290565b6000826158f1576158f1615862565b500690565b60006fffffffffffffffffffffffffffffffff838116908316818110156158065761580661574f565b60006fffffffffffffffffffffffffffffffff80831681851680830382111561594a5761594a61574f565b01949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6060815260006159b0606083018789615953565b82810360208401526159c3818688615953565b9150508260408301529695505050505050565b6000602082840312156159e857600080fd5b5051919050565b600060ff821660ff841680821015615a0957615a0961574f565b90039392505050565b600060ff831680615a2557615a25615862565b8060ff84160691505092915050565b600060208284031215615a4657600080fd5b8151615003816154dd565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615a9257615a9261574f565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615acd57615acd61574f565b60008712925087820587128484161615615ae957615ae961574f565b87850587128184161615615aff57615aff61574f565b505050929093029392505050565b600082615b1c57615b1c615862565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615b7057615b7061574f565b50059056fea164736f6c634300080f000a"; bytes internal constant acc33Code = - hex"6080604052600436106103085760003560e01c806370872aa51161019a578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b94578063fa315aa914610bb8578063fe2bbeb214610beb57600080fd5b8063ec5e630814610b11578063eff0f59214610b44578063f8f43ff614610b7457600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a8b578063d8cc1a3c14610abe578063dabd396d14610ade57600080fd5b8063c6f0308c146109b3578063cf09e0d014610a3d578063d5d44d8014610a5e57600080fd5b8063a445ece611610143578063bcef3b551161011d578063bcef3b5514610933578063bd8da95614610973578063c395e1ca1461099357600080fd5b8063a445ece6146107f3578063a8e4fb90146108bf578063bbdc02db146108f257600080fd5b80638980e0cc116101745780638980e0cc1461076b5780638b85902b146107805780638d450a95146107c057600080fd5b806370872aa51461073b5780637b0f0adc146107505780638129fc1c1461076357600080fd5b80633fc8cef31161025e5780635c0cba33116102075780636361506d116101e15780636361506d146106b55780636b6716c0146106f55780636f0344091461072857600080fd5b80635c0cba331461064d578063609d33341461068057806360e274641461069557600080fd5b806354fd4d501161023857806354fd4d50146105a757806357da950e146105fd5780635a5fa2d91461062d57600080fd5b80633fc8cef31461052e578063472777c614610561578063534db0e21461057457600080fd5b80632810e1d6116102c057806337b1b2291161029a57806337b1b2291461047b5780633a768463146104bb5780633e3ac912146104ee57600080fd5b80632810e1d6146103f45780632ad69aeb1461040957806330dbe5701461042957600080fd5b806319effeb4116102f157806319effeb41461034f578063200d2ed21461039a57806325fc2ace146103d557600080fd5b8063019351301461030d57806303c2924d1461032f575b600080fd5b34801561031957600080fd5b5061032d6103283660046155a8565b610c1b565b005b34801561033b57600080fd5b5061032d61034a366004615603565b610f3c565b34801561035b57600080fd5b5060005461037c9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156103a657600080fd5b506000546103c890700100000000000000000000000000000000900460ff1681565b6040516103919190615654565b3480156103e157600080fd5b506008545b604051908152602001610391565b34801561040057600080fd5b506103c86115e2565b34801561041557600080fd5b506103e6610424366004615603565b611887565b34801561043557600080fd5b506001546104569073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610391565b34801561048757600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610456565b3480156104c757600080fd5b507f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d40773610456565b3480156104fa57600080fd5b5060005461051e907201000000000000000000000000000000000000900460ff1681565b6040519015158152602001610391565b34801561053a57600080fd5b507f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d610456565b61032d61056f366004615695565b6118bd565b34801561058057600080fd5b507f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63610456565b3480156105b357600080fd5b506105f06040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b604051610391919061572c565b34801561060957600080fd5b50600854600954610618919082565b60408051928352602083019190915201610391565b34801561063957600080fd5b506103e661064836600461573f565b6118cf565b34801561065957600080fd5b507f00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df99610456565b34801561068c57600080fd5b506105f0611909565b3480156106a157600080fd5b5061032d6106b036600461577d565b611917565b3480156106c157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103e6565b34801561070157600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061037c565b61032d6107363660046157af565b611abe565b34801561074757600080fd5b506009546103e6565b61032d61075e366004615695565b611b7f565b61032d611b8c565b34801561077757600080fd5b506002546103e6565b34801561078c57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103e6565b3480156107cc57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103e6565b3480156107ff57600080fd5b5061086b61080e36600461573f565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff166060820152608001610391565b3480156108cb57600080fd5b507f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8610456565b3480156108fe57600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000001168152602001610391565b34801561093f57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103e6565b34801561097f57600080fd5b5061037c61098e36600461573f565b611c05565b34801561099f57600080fd5b506103e66109ae3660046157ee565b611de4565b3480156109bf57600080fd5b506109d36109ce36600461573f565b611fc7565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610391565b348015610a4957600080fd5b5060005461037c9067ffffffffffffffff1681565b348015610a6a57600080fd5b506103e6610a7936600461577d565b60036020526000908152604090205481565b348015610a9757600080fd5b507f00000000000000000000000000000000000000000000000000000000000003856103e6565b348015610aca57600080fd5b5061032d610ad9366004615820565b61205e565b348015610aea57600080fd5b507f00000000000000000000000000000000000000000000000000000000000004b061037c565b348015610b1d57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000046103e6565b348015610b5057600080fd5b5061051e610b5f36600461573f565b60046020526000908152604090205460ff1681565b348015610b8057600080fd5b5061032d610b8f366004615695565b612123565b348015610ba057600080fd5b50610ba9612575565b604051610391939291906158aa565b348015610bc457600080fd5b507f00000000000000000000000000000000000000000000000000000000000000086103e6565b348015610bf757600080fd5b5061051e610c0636600461573f565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610c4757610c47615625565b14610c7e576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610cd1576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d08367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610d1f610d1a368690038601866158fe565b6125d5565b14610d56576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610d6b92919061598b565b604051809103902014610daa576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610df3610dee84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061263192505050565b61269e565b90506000610e1a82600881518110610e0d57610e0d61599b565b6020026020010151612854565b9050602081511115610e58576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610ecd576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610f6857610f68615625565b14610f9f576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610fb457610fb461599b565b906000526020600020906005020190506000610fcf84611c05565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b081169082161015611038576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611081576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561109e57508515155b15611139578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110d157816110ed565b600186015473ffffffffffffffffffffffffffffffffffffffff165b90506110f98187612908565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff1660608301526111dc576fffffffffffffffffffffffffffffffff60408201526001815260008690036111dc578195505b600086826020015163ffffffff166111f491906159f9565b905060008382116112055781611207565b835b602084015190915063ffffffff165b818110156113535760008682815481106112325761123261599b565b6000918252602080832090910154808352600690915260409091205490915060ff1661128a576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061129f5761129f61599b565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112fc5750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b1561133e57600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b5050808061134b90615a11565b915050611216565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909316929092179091558490036115d757606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055891580156114d357506000547201000000000000000000000000000000000000900460ff165b156115485760015473ffffffffffffffffffffffffffffffffffffffff166114fb818a612908565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff9091161788556115d5565b61158f73ffffffffffffffffffffffffffffffffffffffff82161561156d5781611589565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89612908565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff16600281111561161057611610615625565b14611647576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff166116ab576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660026000815481106116d7576116d761599b565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611712576001611715565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff909116177001000000000000000000000000000000008360028111156117c6576117c6615625565b0217905560028111156117db576117db615625565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df9973ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561186c57600080fd5b505af1158015611880573d6000803e3d6000fd5b5050505090565b600560205281600052604060002081815481106118a357600080fd5b90600052602060002001600091509150505481565b905090565b6118ca8383836001611abe565b505050565b6000818152600760209081526040808320600590925282208054825461190090610100900463ffffffff1682615a49565b95945050505050565b60606118b860546020612a09565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604081208054908290559081900361197c576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d169063f3fef3a390604401600060405180830381600087803b158015611a0c57600080fd5b505af1158015611a20573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a7e576040519150601f19603f3d011682016040523d82523d6000602084013e611a83565b606091505b50509050806118ca576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8161480611b3757503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b6316145b611b6d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7984848484612a5b565b50505050565b6118ca8383836000611abe565b3273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614611bfb576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c036133fc565b565b600080600054700100000000000000000000000000000000900460ff166002811115611c3357611c33615625565b14611c6a576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110611c7f57611c7f61599b565b600091825260208220600590910201805490925063ffffffff90811614611cee57815460028054909163ffffffff16908110611cbd57611cbd61599b565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090611d2690700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b611d3a9067ffffffffffffffff1642615a49565b611d59611d19846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16611d6d91906159f9565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b01667ffffffffffffffff168167ffffffffffffffff1611611dba5780611900565b7f00000000000000000000000000000000000000000000000000000000000004b095945050505050565b600080611e83836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000008811115611ee2576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000611efd8383615a8f565b9050670de0b6b3a76400006000611f34827f0000000000000000000000000000000000000000000000000000000000000008615aa3565b90506000611f52611f4d670de0b6b3a764000086615aa3565b613955565b90506000611f608484613bb0565b90506000611f6e8383613bff565b90506000611f7b82613c2d565b90506000611f9a82611f95670de0b6b3a76400008f615aa3565b613e15565b90506000611fa88b83613bff565b9050611fb4818d615aa3565b9f9e505050505050505050505050505050565b60028181548110611fd757600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614806120d757503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b6316145b61210d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61211b868686868686613e4f565b505050505050565b60008054700100000000000000000000000000000000900460ff16600281111561214f5761214f615625565b14612186576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000806121958661447e565b935093509350935060006121ab85858585614887565b905060007f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d4077373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561221a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223e9190615ae0565b9050600189036123365773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8461229a367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af115801561230c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123309190615afd565b506115d7565b600289036123625773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848961229a565b6003890361238e5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848761229a565b600489036124aa5760006123d46fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000004614941565b6009546123e191906159f9565b6123ec9060016159f9565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561247f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a39190615afd565b50506115d7565b60058903612543576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000038560c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a4016122ed565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000001367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560606125ce611909565b9050909192565b60008160000151826020015183604001518460600151604051602001612614949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60408051808201909152600080825260208201528151600003612680576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b606060008060006126ae856149ef565b9194509250905060018160018111156126c9576126c9615625565b14612700576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845161270c83856159f9565b14612743576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b604080518082019091526000808252602082015281526020019060019003908161275a5790505093506000835b8651811015612848576000806127cd6040518060400160405280858c600001516127b19190615a49565b8152602001858c602001516127c691906159f9565b90526149ef565b5091509150604051806040016040528083836127e991906159f9565b8152602001848b602001516127fe91906159f9565b8152508885815181106128135761281361599b565b60209081029190910101526128296001856159f9565b935061283581836159f9565b61283f90846159f9565b92505050612787565b50845250919392505050565b60606000806000612864856149ef565b91945092509050600081600181111561287f5761287f615625565b146128b6576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128c082846159f9565b8551146128f9576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61190085602001518484614e8d565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff909316928392906129579084906159f9565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d1690637eee288d90604401600060405180830381600087803b1580156129ec57600080fd5b505af1158015612a00573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b60008054700100000000000000000000000000000000900460ff166002811115612a8757612a87615625565b14612abe576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110612ad357612ad361599b565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514612bba576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000612c7a826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580612cb55750612cb27f000000000000000000000000000000000000000000000000000000000000000460026159f9565b81145b8015612cbf575084155b15612cf6576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015612d1c575086155b15612d53576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000008811115612dad576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dd87f000000000000000000000000000000000000000000000000000000000000000460016159f9565b8103612dea57612dea86888588614f22565b34612df483611de4565b14612e2b576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612e3688611c05565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b0811690821603612e9e576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b016612efe9190615b16565b67ffffffffffffffff16612f198267ffffffffffffffff1690565b67ffffffffffffffff161115612ffb576000612f5660017f0000000000000000000000000000000000000000000000000000000000000004615a49565b8314612f8c5767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016612fc1565b612fc17f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff166002615b3f565b9050612ff7817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff16615b16565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526004602052604090205490915060ff1615613079576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008b8152602001908152602001600020600160028054905061330f9190615a49565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d169263d0e30db09234926004808301939282900301818588803b1580156133a757600080fd5b505af11580156133bb573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b60005471010000000000000000000000000000000000900460ff161561344e576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000001166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df991690637258a807906024016040805180830381865afa158015613502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135269190615b6f565b909250905081613562576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461359557639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401351161362f576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d9092169363d0e30db093926004828101939282900301818588803b15801561390457600080fd5b505af1158015613918573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b17600082136139b457631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a764000002158202613bed57637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b600081600019048311820215613c1d5763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d78213613c5b57919050565b680755bf798b4a1bf1e58212613c795763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000613e46670de0b6b3a764000083613e2d86613955565b613e379190615b93565b613e419190615c4f565b613c2d565b90505b92915050565b60008054700100000000000000000000000000000000900460ff166002811115613e7b57613e7b615625565b14613eb2576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110613ec757613ec761599b565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050613f267f000000000000000000000000000000000000000000000000000000000000000860016159f9565b613fc2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614613ffc576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156140f35761404f7f00000000000000000000000000000000000000000000000000000000000000047f0000000000000000000000000000000000000000000000000000000000000008615a49565b6001901b61406e846fffffffffffffffffffffffffffffffff166150d3565b6fffffffffffffffffffffffffffffffff1661408a9190615cb7565b156140c7576140be6140af60016fffffffffffffffffffffffffffffffff8716615ccb565b865463ffffffff166000615172565b600301546140e9565b7f00000000000000000000000000000000000000000000000000000000000000005b915084905061411d565b6003850154915061411a6140af6fffffffffffffffffffffffffffffffff86166001615cf4565b90505b600882901b60088a8a60405161413492919061598b565b6040518091039020901b14614175576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006141808c615256565b9050600061418f836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d4077373ffffffffffffffffffffffffffffffffffffffff169063e14ced3290614209908f908f908f908f908a90600401615d71565b6020604051808303816000875af1158015614228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061424c9190615afd565b6004850154911491506000906002906142f7906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b614393896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b61439d9190615dab565b6143a79190615dce565b60ff1615905081151581036143e8576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff161561443f576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b600080600080600085905060006002828154811061449e5761449e61599b565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000000490614575906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116145af576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000490614676906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156146eb57825463ffffffff166146b57f000000000000000000000000000000000000000000000000000000000000000460016159f9565b83036146bf578391505b600281815481106146d2576146d261599b565b90600052602060002090600502019350809450506145b3565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661475461473f856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561482357600061478c836fffffffffffffffffffffffffffffffff166150d3565b6fffffffffffffffffffffffffffffffff1611156147f75760006147ce6147c660016fffffffffffffffffffffffffffffffff8616615ccb565b896001615172565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506147fd9050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614879565b60006148456147c66fffffffffffffffffffffffffffffffff85166001615cf4565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff8416156148f45760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611900565b82826040516020016149229291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b6000806149ce847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614a32576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614a57576000600160009450945094505050614e86565b60b78111614b6d576000614a6c608083615a49565b905080876000015111614aab576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614b2357507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614b5a576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614e86915050565b60bf8111614ccb576000614b8260b783615a49565b905080876000015111614bc1576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614c23576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614c6b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614c7581846159f9565b895111614cae576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614cb98360016159f9565b9750955060009450614e869350505050565b60f78111614d30576000614ce060c083615a49565b905080876000015111614d1f576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614e86915050565b6000614d3d60f783615a49565b905080876000015111614d7c576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614dde576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614e26576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e3081846159f9565b895111614e69576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e748360016159f9565b9750955060019450614e869350505050565b9193909250565b60608167ffffffffffffffff811115614ea857614ea86158cf565b6040519080825280601f01601f191660200182016040528015614ed2576020820181803683370190505b5090508115614f1b576000614ee784866159f9565b90506020820160005b84811015614f08578281015182820152602001614ef0565b84811115614f17576000858301525b5050505b9392505050565b6000614f416fffffffffffffffffffffffffffffffff84166001615cf4565b90506000614f5182866001615172565b9050600086901a838061503d5750614f8a60027f0000000000000000000000000000000000000000000000000000000000000004615cb7565b600483015460029061502e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6150389190615dce565b60ff16145b156150955760ff811660011480615057575060ff81166002145b615090576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401613626565b612a00565b60ff811615612a00576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401613626565b600080615160837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b600080826151bb576151b66fffffffffffffffffffffffffffffffff86167f0000000000000000000000000000000000000000000000000000000000000004615285565b6151d6565b6151d6856fffffffffffffffffffffffffffffffff16615411565b9050600284815481106151eb576151eb61599b565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461524e57815460028054909163ffffffff169081106152395761523961599b565b906000526020600020906005020191506151fc565b509392505050565b60008060008060006152678661447e565b935093509350935061527b84848484614887565b9695505050505050565b600081615324846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff161161533a5763b34b5c226000526004601cfd5b61534383615411565b9050816153e2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611613e4957613e466153f88360016159f9565b6fffffffffffffffffffffffffffffffff8316906154b6565b600081196001830116816154a5827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b600080615543847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f84011261557157600080fd5b50813567ffffffffffffffff81111561558957600080fd5b6020830191508360208285010111156155a157600080fd5b9250929050565b600080600083850360a08112156155be57600080fd5b60808112156155cc57600080fd5b50839250608084013567ffffffffffffffff8111156155ea57600080fd5b6155f68682870161555f565b9497909650939450505050565b6000806040838503121561561657600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061568f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806000606084860312156156aa57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b818110156156e7576020818501810151868301820152016156cb565b818111156156f9576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613e4660208301846156c1565b60006020828403121561575157600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461577a57600080fd5b50565b60006020828403121561578f57600080fd5b8135614f1b81615758565b803580151581146157aa57600080fd5b919050565b600080600080608085870312156157c557600080fd5b8435935060208501359250604085013591506157e36060860161579a565b905092959194509250565b60006020828403121561580057600080fd5b81356fffffffffffffffffffffffffffffffff81168114614f1b57600080fd5b6000806000806000806080878903121561583957600080fd5b863595506158496020880161579a565b9450604087013567ffffffffffffffff8082111561586657600080fd5b6158728a838b0161555f565b9096509450606089013591508082111561588b57600080fd5b5061589889828a0161555f565b979a9699509497509295939492505050565b63ffffffff8416815282602082015260606040820152600061190060608301846156c1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561591057600080fd5b6040516080810181811067ffffffffffffffff8211171561595a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115615a0c57615a0c6159ca565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a4257615a426159ca565b5060010190565b600082821015615a5b57615a5b6159ca565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615a9e57615a9e615a60565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615adb57615adb6159ca565b500290565b600060208284031215615af257600080fd5b8151614f1b81615758565b600060208284031215615b0f57600080fd5b5051919050565b600067ffffffffffffffff83811690831681811015615b3757615b376159ca565b039392505050565b600067ffffffffffffffff80831681851681830481118215151615615b6657615b666159ca565b02949350505050565b60008060408385031215615b8257600080fd5b505080516020909101519092909150565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615bd457615bd46159ca565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615c0f57615c0f6159ca565b60008712925087820587128484161615615c2b57615c2b6159ca565b87850587128184161615615c4157615c416159ca565b505050929093029392505050565b600082615c5e57615c5e615a60565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615cb257615cb26159ca565b500590565b600082615cc657615cc6615a60565b500690565b60006fffffffffffffffffffffffffffffffff83811690831681811015615b3757615b376159ca565b60006fffffffffffffffffffffffffffffffff808316818516808303821115615d1f57615d1f6159ca565b01949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b606081526000615d85606083018789615d28565b8281036020840152615d98818688615d28565b9150508260408301529695505050505050565b600060ff821660ff841680821015615dc557615dc56159ca565b90039392505050565b600060ff831680615de157615de1615a60565b8060ff8416069150509291505056fea164736f6c634300080f000a"; + hex"6080604052600436106103085760003560e01c806370872aa51161019a578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b94578063fa315aa914610bb8578063fe2bbeb214610beb57600080fd5b8063ec5e630814610b11578063eff0f59214610b44578063f8f43ff614610b7457600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a8b578063d8cc1a3c14610abe578063dabd396d14610ade57600080fd5b8063c6f0308c146109b3578063cf09e0d014610a3d578063d5d44d8014610a5e57600080fd5b8063a445ece611610143578063bcef3b551161011d578063bcef3b5514610933578063bd8da95614610973578063c395e1ca1461099357600080fd5b8063a445ece6146107f3578063a8e4fb90146108bf578063bbdc02db146108f257600080fd5b80638980e0cc116101745780638980e0cc1461076b5780638b85902b146107805780638d450a95146107c057600080fd5b806370872aa51461073b5780637b0f0adc146107505780638129fc1c1461076357600080fd5b80633fc8cef31161025e5780635c0cba33116102075780636361506d116101e15780636361506d146106b55780636b6716c0146106f55780636f0344091461072857600080fd5b80635c0cba331461064d578063609d33341461068057806360e274641461069557600080fd5b806354fd4d501161023857806354fd4d50146105a757806357da950e146105fd5780635a5fa2d91461062d57600080fd5b80633fc8cef31461052e578063472777c614610561578063534db0e21461057457600080fd5b80632810e1d6116102c057806337b1b2291161029a57806337b1b2291461047b5780633a768463146104bb5780633e3ac912146104ee57600080fd5b80632810e1d6146103f45780632ad69aeb1461040957806330dbe5701461042957600080fd5b806319effeb4116102f157806319effeb41461034f578063200d2ed21461039a57806325fc2ace146103d557600080fd5b8063019351301461030d57806303c2924d1461032f575b600080fd5b34801561031957600080fd5b5061032d6103283660046155a8565b610c1b565b005b34801561033b57600080fd5b5061032d61034a366004615603565b610f3c565b34801561035b57600080fd5b5060005461037c9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156103a657600080fd5b506000546103c890700100000000000000000000000000000000900460ff1681565b6040516103919190615654565b3480156103e157600080fd5b506008545b604051908152602001610391565b34801561040057600080fd5b506103c86115e2565b34801561041557600080fd5b506103e6610424366004615603565b611887565b34801561043557600080fd5b506001546104569073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610391565b34801561048757600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610456565b3480156104c757600080fd5b507f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d40773610456565b3480156104fa57600080fd5b5060005461051e907201000000000000000000000000000000000000900460ff1681565b6040519015158152602001610391565b34801561053a57600080fd5b507f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92610456565b61032d61056f366004615695565b6118bd565b34801561058057600080fd5b507f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63610456565b3480156105b357600080fd5b506105f06040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b604051610391919061572c565b34801561060957600080fd5b50600854600954610618919082565b60408051928352602083019190915201610391565b34801561063957600080fd5b506103e661064836600461573f565b6118cf565b34801561065957600080fd5b507f000000000000000000000000d6eaf4c146261653ee059077b78ed088add54309610456565b34801561068c57600080fd5b506105f0611909565b3480156106a157600080fd5b5061032d6106b036600461577d565b611917565b3480156106c157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103e6565b34801561070157600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061037c565b61032d6107363660046157af565b611abe565b34801561074757600080fd5b506009546103e6565b61032d61075e366004615695565b611b7f565b61032d611b8c565b34801561077757600080fd5b506002546103e6565b34801561078c57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103e6565b3480156107cc57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103e6565b3480156107ff57600080fd5b5061086b61080e36600461573f565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff166060820152608001610391565b3480156108cb57600080fd5b507f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8610456565b3480156108fe57600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000001168152602001610391565b34801561093f57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103e6565b34801561097f57600080fd5b5061037c61098e36600461573f565b611c05565b34801561099f57600080fd5b506103e66109ae3660046157ee565b611de4565b3480156109bf57600080fd5b506109d36109ce36600461573f565b611fc7565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610391565b348015610a4957600080fd5b5060005461037c9067ffffffffffffffff1681565b348015610a6a57600080fd5b506103e6610a7936600461577d565b60036020526000908152604090205481565b348015610a9757600080fd5b507f00000000000000000000000000000000000000000000000000000000000003856103e6565b348015610aca57600080fd5b5061032d610ad9366004615820565b61205e565b348015610aea57600080fd5b507f00000000000000000000000000000000000000000000000000000000000004b061037c565b348015610b1d57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000046103e6565b348015610b5057600080fd5b5061051e610b5f36600461573f565b60046020526000908152604090205460ff1681565b348015610b8057600080fd5b5061032d610b8f366004615695565b612123565b348015610ba057600080fd5b50610ba9612575565b604051610391939291906158aa565b348015610bc457600080fd5b507f00000000000000000000000000000000000000000000000000000000000000086103e6565b348015610bf757600080fd5b5061051e610c0636600461573f565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610c4757610c47615625565b14610c7e576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610cd1576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d08367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610d1f610d1a368690038601866158fe565b6125d5565b14610d56576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610d6b92919061598b565b604051809103902014610daa576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610df3610dee84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061263192505050565b61269e565b90506000610e1a82600881518110610e0d57610e0d61599b565b6020026020010151612854565b9050602081511115610e58576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610ecd576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610f6857610f68615625565b14610f9f576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610fb457610fb461599b565b906000526020600020906005020190506000610fcf84611c05565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b081169082161015611038576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611081576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561109e57508515155b15611139578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110d157816110ed565b600186015473ffffffffffffffffffffffffffffffffffffffff165b90506110f98187612908565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff1660608301526111dc576fffffffffffffffffffffffffffffffff60408201526001815260008690036111dc578195505b600086826020015163ffffffff166111f491906159f9565b905060008382116112055781611207565b835b602084015190915063ffffffff165b818110156113535760008682815481106112325761123261599b565b6000918252602080832090910154808352600690915260409091205490915060ff1661128a576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061129f5761129f61599b565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112fc5750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b1561133e57600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b5050808061134b90615a11565b915050611216565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909316929092179091558490036115d757606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055891580156114d357506000547201000000000000000000000000000000000000900460ff165b156115485760015473ffffffffffffffffffffffffffffffffffffffff166114fb818a612908565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff9091161788556115d5565b61158f73ffffffffffffffffffffffffffffffffffffffff82161561156d5781611589565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89612908565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff16600281111561161057611610615625565b14611647576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff166116ab576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660026000815481106116d7576116d761599b565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611712576001611715565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff909116177001000000000000000000000000000000008360028111156117c6576117c6615625565b0217905560028111156117db576117db615625565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f000000000000000000000000d6eaf4c146261653ee059077b78ed088add5430973ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561186c57600080fd5b505af1158015611880573d6000803e3d6000fd5b5050505090565b600560205281600052604060002081815481106118a357600080fd5b90600052602060002001600091509150505481565b905090565b6118ca8383836001611abe565b505050565b6000818152600760209081526040808320600590925282208054825461190090610100900463ffffffff1682615a49565b95945050505050565b60606118b860546020612a09565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604081208054908290559081900361197c576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92169063f3fef3a390604401600060405180830381600087803b158015611a0c57600080fd5b505af1158015611a20573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a7e576040519150601f19603f3d011682016040523d82523d6000602084013e611a83565b606091505b50509050806118ca576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8161480611b3757503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b6316145b611b6d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7984848484612a5b565b50505050565b6118ca8383836000611abe565b3273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614611bfb576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c036133fc565b565b600080600054700100000000000000000000000000000000900460ff166002811115611c3357611c33615625565b14611c6a576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110611c7f57611c7f61599b565b600091825260208220600590910201805490925063ffffffff90811614611cee57815460028054909163ffffffff16908110611cbd57611cbd61599b565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090611d2690700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b611d3a9067ffffffffffffffff1642615a49565b611d59611d19846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16611d6d91906159f9565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b01667ffffffffffffffff168167ffffffffffffffff1611611dba5780611900565b7f00000000000000000000000000000000000000000000000000000000000004b095945050505050565b600080611e83836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000008811115611ee2576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000611efd8383615a8f565b9050670de0b6b3a76400006000611f34827f0000000000000000000000000000000000000000000000000000000000000008615aa3565b90506000611f52611f4d670de0b6b3a764000086615aa3565b613955565b90506000611f608484613bb0565b90506000611f6e8383613bff565b90506000611f7b82613c2d565b90506000611f9a82611f95670de0b6b3a76400008f615aa3565b613e15565b90506000611fa88b83613bff565b9050611fb4818d615aa3565b9f9e505050505050505050505050505050565b60028181548110611fd757600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614806120d757503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b6316145b61210d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61211b868686868686613e4f565b505050505050565b60008054700100000000000000000000000000000000900460ff16600281111561214f5761214f615625565b14612186576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000806121958661447e565b935093509350935060006121ab85858585614887565b905060007f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d4077373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561221a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223e9190615ae0565b9050600189036123365773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8461229a367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af115801561230c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123309190615afd565b506115d7565b600289036123625773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848961229a565b6003890361238e5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848761229a565b600489036124aa5760006123d46fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000004614941565b6009546123e191906159f9565b6123ec9060016159f9565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561247f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a39190615afd565b50506115d7565b60058903612543576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000038560c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a4016122ed565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000001367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560606125ce611909565b9050909192565b60008160000151826020015183604001518460600151604051602001612614949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60408051808201909152600080825260208201528151600003612680576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b606060008060006126ae856149ef565b9194509250905060018160018111156126c9576126c9615625565b14612700576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845161270c83856159f9565b14612743576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b604080518082019091526000808252602082015281526020019060019003908161275a5790505093506000835b8651811015612848576000806127cd6040518060400160405280858c600001516127b19190615a49565b8152602001858c602001516127c691906159f9565b90526149ef565b5091509150604051806040016040528083836127e991906159f9565b8152602001848b602001516127fe91906159f9565b8152508885815181106128135761281361599b565b60209081029190910101526128296001856159f9565b935061283581836159f9565b61283f90846159f9565b92505050612787565b50845250919392505050565b60606000806000612864856149ef565b91945092509050600081600181111561287f5761287f615625565b146128b6576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128c082846159f9565b8551146128f9576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61190085602001518484614e8d565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff909316928392906129579084906159f9565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd921690637eee288d90604401600060405180830381600087803b1580156129ec57600080fd5b505af1158015612a00573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b60008054700100000000000000000000000000000000900460ff166002811115612a8757612a87615625565b14612abe576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110612ad357612ad361599b565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514612bba576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000612c7a826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580612cb55750612cb27f000000000000000000000000000000000000000000000000000000000000000460026159f9565b81145b8015612cbf575084155b15612cf6576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015612d1c575086155b15612d53576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000008811115612dad576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dd87f000000000000000000000000000000000000000000000000000000000000000460016159f9565b8103612dea57612dea86888588614f22565b34612df483611de4565b14612e2b576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612e3688611c05565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b0811690821603612e9e576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b016612efe9190615b16565b67ffffffffffffffff16612f198267ffffffffffffffff1690565b67ffffffffffffffff161115612ffb576000612f5660017f0000000000000000000000000000000000000000000000000000000000000004615a49565b8314612f8c5767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016612fc1565b612fc17f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff166002615b3f565b9050612ff7817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff16615b16565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526004602052604090205490915060ff1615613079576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008b8152602001908152602001600020600160028054905061330f9190615a49565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92169263d0e30db09234926004808301939282900301818588803b1580156133a757600080fd5b505af11580156133bb573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b60005471010000000000000000000000000000000000900460ff161561344e576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000001166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000d6eaf4c146261653ee059077b78ed088add543091690637258a807906024016040805180830381865afa158015613502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135269190615b6f565b909250905081613562576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461359557639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401351161362f576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd929092169363d0e30db093926004828101939282900301818588803b15801561390457600080fd5b505af1158015613918573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b17600082136139b457631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a764000002158202613bed57637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b600081600019048311820215613c1d5763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d78213613c5b57919050565b680755bf798b4a1bf1e58212613c795763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000613e46670de0b6b3a764000083613e2d86613955565b613e379190615b93565b613e419190615c4f565b613c2d565b90505b92915050565b60008054700100000000000000000000000000000000900460ff166002811115613e7b57613e7b615625565b14613eb2576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110613ec757613ec761599b565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050613f267f000000000000000000000000000000000000000000000000000000000000000860016159f9565b613fc2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614613ffc576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156140f35761404f7f00000000000000000000000000000000000000000000000000000000000000047f0000000000000000000000000000000000000000000000000000000000000008615a49565b6001901b61406e846fffffffffffffffffffffffffffffffff166150d3565b6fffffffffffffffffffffffffffffffff1661408a9190615cb7565b156140c7576140be6140af60016fffffffffffffffffffffffffffffffff8716615ccb565b865463ffffffff166000615172565b600301546140e9565b7f00000000000000000000000000000000000000000000000000000000000000005b915084905061411d565b6003850154915061411a6140af6fffffffffffffffffffffffffffffffff86166001615cf4565b90505b600882901b60088a8a60405161413492919061598b565b6040518091039020901b14614175576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006141808c615256565b9050600061418f836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000b3a0348310a0ff78e5fbdb7f14bb7d3e02d4077373ffffffffffffffffffffffffffffffffffffffff169063e14ced3290614209908f908f908f908f908a90600401615d71565b6020604051808303816000875af1158015614228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061424c9190615afd565b6004850154911491506000906002906142f7906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b614393896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b61439d9190615dab565b6143a79190615dce565b60ff1615905081151581036143e8576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff161561443f576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b600080600080600085905060006002828154811061449e5761449e61599b565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000000490614575906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116145af576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000490614676906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156146eb57825463ffffffff166146b57f000000000000000000000000000000000000000000000000000000000000000460016159f9565b83036146bf578391505b600281815481106146d2576146d261599b565b90600052602060002090600502019350809450506145b3565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661475461473f856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561482357600061478c836fffffffffffffffffffffffffffffffff166150d3565b6fffffffffffffffffffffffffffffffff1611156147f75760006147ce6147c660016fffffffffffffffffffffffffffffffff8616615ccb565b896001615172565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506147fd9050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614879565b60006148456147c66fffffffffffffffffffffffffffffffff85166001615cf4565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff8416156148f45760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611900565b82826040516020016149229291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b6000806149ce847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614a32576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614a57576000600160009450945094505050614e86565b60b78111614b6d576000614a6c608083615a49565b905080876000015111614aab576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614b2357507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614b5a576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614e86915050565b60bf8111614ccb576000614b8260b783615a49565b905080876000015111614bc1576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614c23576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614c6b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614c7581846159f9565b895111614cae576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614cb98360016159f9565b9750955060009450614e869350505050565b60f78111614d30576000614ce060c083615a49565b905080876000015111614d1f576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614e86915050565b6000614d3d60f783615a49565b905080876000015111614d7c576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614dde576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614e26576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e3081846159f9565b895111614e69576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e748360016159f9565b9750955060019450614e869350505050565b9193909250565b60608167ffffffffffffffff811115614ea857614ea86158cf565b6040519080825280601f01601f191660200182016040528015614ed2576020820181803683370190505b5090508115614f1b576000614ee784866159f9565b90506020820160005b84811015614f08578281015182820152602001614ef0565b84811115614f17576000858301525b5050505b9392505050565b6000614f416fffffffffffffffffffffffffffffffff84166001615cf4565b90506000614f5182866001615172565b9050600086901a838061503d5750614f8a60027f0000000000000000000000000000000000000000000000000000000000000004615cb7565b600483015460029061502e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6150389190615dce565b60ff16145b156150955760ff811660011480615057575060ff81166002145b615090576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401613626565b612a00565b60ff811615612a00576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401613626565b600080615160837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b600080826151bb576151b66fffffffffffffffffffffffffffffffff86167f0000000000000000000000000000000000000000000000000000000000000004615285565b6151d6565b6151d6856fffffffffffffffffffffffffffffffff16615411565b9050600284815481106151eb576151eb61599b565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461524e57815460028054909163ffffffff169081106152395761523961599b565b906000526020600020906005020191506151fc565b509392505050565b60008060008060006152678661447e565b935093509350935061527b84848484614887565b9695505050505050565b600081615324846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff161161533a5763b34b5c226000526004601cfd5b61534383615411565b9050816153e2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611613e4957613e466153f88360016159f9565b6fffffffffffffffffffffffffffffffff8316906154b6565b600081196001830116816154a5827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b600080615543847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f84011261557157600080fd5b50813567ffffffffffffffff81111561558957600080fd5b6020830191508360208285010111156155a157600080fd5b9250929050565b600080600083850360a08112156155be57600080fd5b60808112156155cc57600080fd5b50839250608084013567ffffffffffffffff8111156155ea57600080fd5b6155f68682870161555f565b9497909650939450505050565b6000806040838503121561561657600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061568f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806000606084860312156156aa57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b818110156156e7576020818501810151868301820152016156cb565b818111156156f9576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613e4660208301846156c1565b60006020828403121561575157600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461577a57600080fd5b50565b60006020828403121561578f57600080fd5b8135614f1b81615758565b803580151581146157aa57600080fd5b919050565b600080600080608085870312156157c557600080fd5b8435935060208501359250604085013591506157e36060860161579a565b905092959194509250565b60006020828403121561580057600080fd5b81356fffffffffffffffffffffffffffffffff81168114614f1b57600080fd5b6000806000806000806080878903121561583957600080fd5b863595506158496020880161579a565b9450604087013567ffffffffffffffff8082111561586657600080fd5b6158728a838b0161555f565b9096509450606089013591508082111561588b57600080fd5b5061589889828a0161555f565b979a9699509497509295939492505050565b63ffffffff8416815282602082015260606040820152600061190060608301846156c1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561591057600080fd5b6040516080810181811067ffffffffffffffff8211171561595a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115615a0c57615a0c6159ca565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a4257615a426159ca565b5060010190565b600082821015615a5b57615a5b6159ca565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615a9e57615a9e615a60565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615adb57615adb6159ca565b500290565b600060208284031215615af257600080fd5b8151614f1b81615758565b600060208284031215615b0f57600080fd5b5051919050565b600067ffffffffffffffff83811690831681811015615b3757615b376159ca565b039392505050565b600067ffffffffffffffff80831681851681830481118215151615615b6657615b666159ca565b02949350505050565b60008060408385031215615b8257600080fd5b505080516020909101519092909150565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615bd457615bd46159ca565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615c0f57615c0f6159ca565b60008712925087820587128484161615615c2b57615c2b6159ca565b87850587128184161615615c4157615c416159ca565b505050929093029392505050565b600082615c5e57615c5e615a60565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615cb257615cb26159ca565b500590565b600082615cc657615cc6615a60565b500690565b60006fffffffffffffffffffffffffffffffff83811690831681811015615b3757615b376159ca565b60006fffffffffffffffffffffffffffffffff808316818516808303821115615d1f57615d1f6159ca565b01949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b606081526000615d85606083018789615d28565b8281036020840152615d98818688615d28565b9150508260408301529695505050505050565b600060ff821660ff841680821015615dc557615dc56159ca565b90039392505050565b600060ff831680615de157615de1615a60565b8060ff8416069150509291505056fea164736f6c634300080f000a"; } diff --git a/packages/contracts-bedrock/test/libraries/Bytes.t.sol b/packages/contracts-bedrock/test/libraries/Bytes.t.sol index 2cfbfd3dff60..e38d369ab55d 100644 --- a/packages/contracts-bedrock/test/libraries/Bytes.t.sol +++ b/packages/contracts-bedrock/test/libraries/Bytes.t.sol @@ -67,19 +67,23 @@ contract Bytes_slice_Test is Test { /// @notice Tests that the `slice` function correctly updates the free memory pointer depending /// on the length of the slice. + /// The calls to `bound` are to reduce the number of times that `assume` is triggered. function testFuzz_slice_memorySafety_succeeds(bytes memory _input, uint256 _start, uint256 _length) public { + vm.assume(_input.length > 0); + // The start should never be more than the length of the input bytes array - 1 - vm.assume(_start < _input.length); + _start = bound(_start, 0, _input.length - 1); + // The length should never be more than the length of the input bytes array - the starting // slice index. - vm.assume(_length <= _input.length - _start); + _length = bound(_length, 0, _input.length - _start); // Grab the free memory pointer before the slice operation uint64 initPtr; assembly { initPtr := mload(0x40) } - uint64 expectedPtr = uint64(initPtr + 0x20 + ((_length + 0x1f) & ~uint256(0x1f))); + uint64 expectedPtr = uint64((initPtr + 0x20 + _length + 0x1f) & ~uint256(0x1f)); // Ensure that all memory outside of the expected range is safe. vm.expectSafeMemory(initPtr, expectedPtr); @@ -107,7 +111,7 @@ contract Bytes_slice_Test is Test { // Note that we use a slightly less efficient, but equivalent method of rounding // up `_length` to the next multiple of 32 than is used in the `slice` function. // This is to diff test the method used in `slice`. - uint64 _expectedPtr = uint64(initPtr + 0x20 + (((_length + 0x1F) >> 5) << 5)); + uint64 _expectedPtr = uint64(((initPtr + 0x20 + _length + 0x1F) >> 5) << 5); assertEq(finalPtr, _expectedPtr); // Sanity check for equivalence of the rounding methods. @@ -144,11 +148,15 @@ contract Bytes_slice_TestFail is Test { /// @notice Tests that, when given a start index `n` that is greater than /// `type(uint256).max - n`, the `slice` function reverts. + /// The calls to `bound` are to reduce the number of times that `assume` is triggered. function testFuzz_slice_rangeOverflows_reverts(bytes memory _input, uint256 _start, uint256 _length) public { // Ensure that `_length` is a realistic length of a slice. This is to make sure // we revert on the correct require statement. + _length = bound(_length, 0, _input.length == 0 ? 0 : _input.length - 1); vm.assume(_length < _input.length); + // Ensure that `_start` will overflow if `_length` is added to it. + _start = bound(_start, type(uint256).max - _length, type(uint256).max); vm.assume(_start > type(uint256).max - _length); vm.expectRevert("slice_overflow"); From df33bf11aeb4521ca0e1adb0977710159b692993 Mon Sep 17 00:00:00 2001 From: Adrian Sutton Date: Tue, 6 Aug 2024 06:58:20 +1000 Subject: [PATCH 18/59] op-challenger: Modify run_trace to run a block prior to the safe head (#11349) --- op-challenger/runner/runner.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/op-challenger/runner/runner.go b/op-challenger/runner/runner.go index 01aee19b1781..ea16681ed7cc 100644 --- a/op-challenger/runner/runner.go +++ b/op-challenger/runner/runner.go @@ -169,11 +169,21 @@ func (r *Runner) createGameInputs(ctx context.Context, client *sources.RollupCli if status.SafeL2.Number == 0 { return utils.LocalGameInputs{}, errors.New("safe head is 0") } - claimOutput, err := client.OutputAtBlock(ctx, status.SafeL2.Number) + blockNumber := status.SafeL2.Number + // When possible, execute the first block in the submitted batch + if status.SafeL1.Number > 0 { + priorSafeHead, err := client.SafeHeadAtL1Block(ctx, status.SafeL1.Number-1) + if err != nil { + r.log.Warn("Failed to get prior safe head", "err", err) + } else if priorSafeHead.SafeHead.Number != 0 { // Sanity check to avoid trying to execute genesis + blockNumber = priorSafeHead.SafeHead.Number + 1 + } + } + claimOutput, err := client.OutputAtBlock(ctx, blockNumber) if err != nil { return utils.LocalGameInputs{}, fmt.Errorf("failed to get claim output: %w", err) } - parentOutput, err := client.OutputAtBlock(ctx, status.SafeL2.Number-1) + parentOutput, err := client.OutputAtBlock(ctx, blockNumber-1) if err != nil { return utils.LocalGameInputs{}, fmt.Errorf("failed to get claim output: %w", err) } @@ -182,7 +192,7 @@ func (r *Runner) createGameInputs(ctx context.Context, client *sources.RollupCli L2Head: parentOutput.BlockRef.Hash, L2OutputRoot: common.Hash(parentOutput.OutputRoot), L2Claim: common.Hash(claimOutput.OutputRoot), - L2BlockNumber: new(big.Int).SetUint64(status.SafeL2.Number), + L2BlockNumber: new(big.Int).SetUint64(blockNumber), } return localInputs, nil } From f940301caf531996eee4172e710b0decb7b78dde Mon Sep 17 00:00:00 2001 From: Adrian Sutton Date: Tue, 6 Aug 2024 08:30:55 +1000 Subject: [PATCH 19/59] op-challenger: Add metric to report memory used in the cannon VM (#11350) * op-challenger: Add metric to report memory used in the cannon VM * op-challenger: Remove config override. --- cannon/mipsevm/debug.go | 9 +++-- cannon/mipsevm/memory/memory.go | 6 ++- cannon/mipsevm/multithreaded/instrumented.go | 2 + cannon/mipsevm/singlethreaded/instrumented.go | 2 + op-challenger/config/config.go | 1 + op-challenger/config/config_test.go | 10 +++++ op-challenger/flags/flags.go | 1 + op-challenger/game/fault/trace/vm/executor.go | 22 +++++++++++ op-challenger/metrics/metrics.go | 13 +++++++ op-challenger/metrics/noop.go | 1 + op-challenger/runner/metrics.go | 37 ++++++++++++++++--- 11 files changed, 95 insertions(+), 9 deletions(-) diff --git a/cannon/mipsevm/debug.go b/cannon/mipsevm/debug.go index 8c2246b9d580..f05b770c0ea1 100644 --- a/cannon/mipsevm/debug.go +++ b/cannon/mipsevm/debug.go @@ -1,7 +1,10 @@ package mipsevm +import "github.com/ethereum/go-ethereum/common/hexutil" + type DebugInfo struct { - Pages int `json:"pages"` - NumPreimageRequests int `json:"num_preimage_requests"` - TotalPreimageSize int `json:"total_preimage_size"` + Pages int `json:"pages"` + MemoryUsed hexutil.Uint64 `json:"memory_used"` + NumPreimageRequests int `json:"num_preimage_requests"` + TotalPreimageSize int `json:"total_preimage_size"` } diff --git a/cannon/mipsevm/memory/memory.go b/cannon/mipsevm/memory/memory.go index c782bdd00c61..e02720a2c0d6 100644 --- a/cannon/mipsevm/memory/memory.go +++ b/cannon/mipsevm/memory/memory.go @@ -323,8 +323,12 @@ func (m *Memory) ReadMemoryRange(addr uint32, count uint32) io.Reader { return &memReader{m: m, addr: addr, count: count} } +func (m *Memory) UsageRaw() uint64 { + return uint64(len(m.pages)) * PageSize +} + func (m *Memory) Usage() string { - total := uint64(len(m.pages)) * PageSize + total := m.UsageRaw() const unit = 1024 if total < unit { return fmt.Sprintf("%d B", total) diff --git a/cannon/mipsevm/multithreaded/instrumented.go b/cannon/mipsevm/multithreaded/instrumented.go index f318fae2c9d2..3eedab08a5ef 100644 --- a/cannon/mipsevm/multithreaded/instrumented.go +++ b/cannon/mipsevm/multithreaded/instrumented.go @@ -3,6 +3,7 @@ package multithreaded import ( "io" + "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/log" "github.com/ethereum-optimism/optimism/cannon/mipsevm" @@ -106,6 +107,7 @@ func (m *InstrumentedState) GetState() mipsevm.FPVMState { func (m *InstrumentedState) GetDebugInfo() *mipsevm.DebugInfo { return &mipsevm.DebugInfo{ Pages: m.state.Memory.PageCount(), + MemoryUsed: hexutil.Uint64(m.state.Memory.UsageRaw()), NumPreimageRequests: m.preimageOracle.NumPreimageRequests(), TotalPreimageSize: m.preimageOracle.TotalPreimageSize(), } diff --git a/cannon/mipsevm/singlethreaded/instrumented.go b/cannon/mipsevm/singlethreaded/instrumented.go index e6c6de8ff441..657dd0e5e904 100644 --- a/cannon/mipsevm/singlethreaded/instrumented.go +++ b/cannon/mipsevm/singlethreaded/instrumented.go @@ -7,6 +7,7 @@ import ( "github.com/ethereum-optimism/optimism/cannon/mipsevm/exec" "github.com/ethereum-optimism/optimism/cannon/mipsevm/program" "github.com/ethereum-optimism/optimism/op-service/jsonutil" + "github.com/ethereum/go-ethereum/common/hexutil" ) type InstrumentedState struct { @@ -109,6 +110,7 @@ func (m *InstrumentedState) GetState() mipsevm.FPVMState { func (m *InstrumentedState) GetDebugInfo() *mipsevm.DebugInfo { return &mipsevm.DebugInfo{ Pages: m.state.Memory.PageCount(), + MemoryUsed: hexutil.Uint64(m.state.Memory.UsageRaw()), NumPreimageRequests: m.preimageOracle.NumPreimageRequests(), TotalPreimageSize: m.preimageOracle.TotalPreimageSize(), } diff --git a/op-challenger/config/config.go b/op-challenger/config/config.go index f2725663cd30..2d8e16e0d50e 100644 --- a/op-challenger/config/config.go +++ b/op-challenger/config/config.go @@ -142,6 +142,7 @@ func NewConfig( L2: l2EthRpc, SnapshotFreq: DefaultCannonSnapshotFreq, InfoFreq: DefaultCannonInfoFreq, + DebugInfo: true, }, Asterisc: vm.Config{ VmType: types.TraceTypeAsterisc, diff --git a/op-challenger/config/config_test.go b/op-challenger/config/config_test.go index 9c60262c6a76..4181fd069bed 100644 --- a/op-challenger/config/config_test.go +++ b/op-challenger/config/config_test.go @@ -213,6 +213,11 @@ func TestCannonRequiredArgs(t *testing.T) { cfg.Cannon.Network = "unknown" require.ErrorIs(t, cfg.Check(), ErrCannonNetworkUnknown) }) + + t.Run(fmt.Sprintf("TestDebugInfoEnabled-%v", traceType), func(t *testing.T) { + cfg := validConfig(traceType) + require.True(t, cfg.Cannon.DebugInfo) + }) } } @@ -319,6 +324,11 @@ func TestAsteriscRequiredArgs(t *testing.T) { cfg.Asterisc.Network = "unknown" require.ErrorIs(t, cfg.Check(), ErrAsteriscNetworkUnknown) }) + + t.Run(fmt.Sprintf("TestDebugInfoDisabled-%v", traceType), func(t *testing.T) { + cfg := validConfig(traceType) + require.False(t, cfg.Asterisc.DebugInfo) + }) } } diff --git a/op-challenger/flags/flags.go b/op-challenger/flags/flags.go index c128e0fa759d..ac52ac16ee9e 100644 --- a/op-challenger/flags/flags.go +++ b/op-challenger/flags/flags.go @@ -526,6 +526,7 @@ func NewConfigFromCLI(ctx *cli.Context, logger log.Logger) (*config.Config, erro L2GenesisPath: ctx.String(CannonL2GenesisFlag.Name), SnapshotFreq: ctx.Uint(CannonSnapshotFreqFlag.Name), InfoFreq: ctx.Uint(CannonInfoFreqFlag.Name), + DebugInfo: true, }, CannonAbsolutePreState: ctx.String(CannonPreStateFlag.Name), CannonAbsolutePreStateBaseURL: cannonPrestatesURL, diff --git a/op-challenger/game/fault/trace/vm/executor.go b/op-challenger/game/fault/trace/vm/executor.go index a26133e083b3..08fac9878cac 100644 --- a/op-challenger/game/fault/trace/vm/executor.go +++ b/op-challenger/game/fault/trace/vm/executor.go @@ -12,11 +12,18 @@ import ( "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" + "github.com/ethereum-optimism/optimism/op-service/jsonutil" + "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/log" ) +const ( + debugFilename = "debug-info.json" +) + type Metricer interface { RecordVmExecutionTime(vmType string, t time.Duration) + RecordVmMemoryUsed(vmType string, memoryUsed uint64) } type Config struct { @@ -31,6 +38,7 @@ type Config struct { L2GenesisPath string SnapshotFreq uint // Frequency of snapshots to create when executing (in VM instructions) InfoFreq uint // Frequency of progress log messages (in VM instructions) + DebugInfo bool } type Executor struct { @@ -86,6 +94,9 @@ func (e *Executor) DoGenerateProof(ctx context.Context, dir string, begin uint64 if end < math.MaxUint64 { args = append(args, "--stop-at", "="+strconv.FormatUint(end+1, 10)) } + if e.cfg.DebugInfo { + args = append(args, "--debug-info", filepath.Join(dataDir, debugFilename)) + } args = append(args, extraVmArgs...) args = append(args, "--", @@ -123,5 +134,16 @@ func (e *Executor) DoGenerateProof(ctx context.Context, dir string, begin uint64 execStart := time.Now() err = e.cmdExecutor(ctx, e.logger.New("proof", end), e.cfg.VmBin, args...) e.metrics.RecordVmExecutionTime(e.cfg.VmType.String(), time.Since(execStart)) + if e.cfg.DebugInfo && err == nil { + if info, err := jsonutil.LoadJSON[debugInfo](filepath.Join(dataDir, debugFilename)); err != nil { + e.logger.Warn("Failed to load debug metrics", "err", err) + } else { + e.metrics.RecordVmMemoryUsed(e.cfg.VmType.String(), uint64(info.MemoryUsed)) + } + } return err } + +type debugInfo struct { + MemoryUsed hexutil.Uint64 `json:"memory_used"` +} diff --git a/op-challenger/metrics/metrics.go b/op-challenger/metrics/metrics.go index b5c9d19e298f..fdea90841a04 100644 --- a/op-challenger/metrics/metrics.go +++ b/op-challenger/metrics/metrics.go @@ -39,6 +39,7 @@ type Metricer interface { RecordGameMove() RecordGameL2Challenge() RecordVmExecutionTime(vmType string, t time.Duration) + RecordVmMemoryUsed(vmType string, memoryUsed uint64) RecordClaimResolutionTime(t float64) RecordGameActTime(t float64) @@ -94,6 +95,7 @@ type Metrics struct { claimResolutionTime prometheus.Histogram gameActTime prometheus.Histogram vmExecutionTime *prometheus.HistogramVec + vmMemoryUsed *prometheus.HistogramVec trackedGames prometheus.GaugeVec inflightGames prometheus.Gauge @@ -176,6 +178,13 @@ func NewMetrics() *Metrics { []float64{1.0, 10.0}, prometheus.ExponentialBuckets(30.0, 2.0, 14)...), }, []string{"vm"}), + vmMemoryUsed: factory.NewHistogramVec(prometheus.HistogramOpts{ + Namespace: Namespace, + Name: "vm_memory_used", + Help: "Memory used (in bytes) to execute the fault proof VM", + // 100MiB increments from 0 to 1.5GiB + Buckets: prometheus.LinearBuckets(0, 1024*1024*100, 15), + }, []string{"vm"}), bondClaimFailures: factory.NewCounter(prometheus.CounterOpts{ Namespace: Namespace, Name: "claim_failures", @@ -285,6 +294,10 @@ func (m *Metrics) RecordVmExecutionTime(vmType string, dur time.Duration) { m.vmExecutionTime.WithLabelValues(vmType).Observe(dur.Seconds()) } +func (m *Metrics) RecordVmMemoryUsed(vmType string, memoryUsed uint64) { + m.vmMemoryUsed.WithLabelValues(vmType).Observe(float64(memoryUsed)) +} + func (m *Metrics) RecordClaimResolutionTime(t float64) { m.claimResolutionTime.Observe(t) } diff --git a/op-challenger/metrics/noop.go b/op-challenger/metrics/noop.go index 1a3faf00b213..99a89965aa21 100644 --- a/op-challenger/metrics/noop.go +++ b/op-challenger/metrics/noop.go @@ -40,6 +40,7 @@ func (*NoopMetricsImpl) RecordBondClaimFailed() {} func (*NoopMetricsImpl) RecordBondClaimed(uint64) {} func (*NoopMetricsImpl) RecordVmExecutionTime(_ string, _ time.Duration) {} +func (*NoopMetricsImpl) RecordVmMemoryUsed(_ string, _ uint64) {} func (*NoopMetricsImpl) RecordClaimResolutionTime(t float64) {} func (*NoopMetricsImpl) RecordGameActTime(t float64) {} diff --git a/op-challenger/runner/metrics.go b/op-challenger/runner/metrics.go index 44e303583f6d..e15ad95adc1b 100644 --- a/op-challenger/runner/metrics.go +++ b/op-challenger/runner/metrics.go @@ -17,10 +17,13 @@ type Metrics struct { factory opmetrics.Factory *contractMetrics.ContractMetrics - vmExecutionTime *prometheus.HistogramVec - successTotal *prometheus.CounterVec - failuresTotal *prometheus.CounterVec - invalidTotal *prometheus.CounterVec + vmExecutionTime *prometheus.HistogramVec + vmLastExecutionTime *prometheus.GaugeVec + vmMemoryUsed *prometheus.HistogramVec + vmLastMemoryUsed *prometheus.GaugeVec + successTotal *prometheus.CounterVec + failuresTotal *prometheus.CounterVec + invalidTotal *prometheus.CounterVec } var _ Metricer = (*Metrics)(nil) @@ -47,6 +50,23 @@ func NewMetrics() *Metrics { []float64{1.0, 10.0}, prometheus.ExponentialBuckets(30.0, 2.0, 14)...), }, []string{"vm"}), + vmLastExecutionTime: factory.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: Namespace, + Name: "vm_last_execution_time", + Help: "Time (in seconds) taken for the last execution of the fault proof VM", + }, []string{"vm"}), + vmMemoryUsed: factory.NewHistogramVec(prometheus.HistogramOpts{ + Namespace: Namespace, + Name: "vm_memory_used", + Help: "Memory used (in bytes) to execute the fault proof VM", + // 100MiB increments from 0 to 1.5GiB + Buckets: prometheus.LinearBuckets(0, 1024*1024*100, 15), + }, []string{"vm"}), + vmLastMemoryUsed: factory.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: Namespace, + Name: "vm_last_memory_used", + Help: "Memory used (in bytes) for the last execution of the fault proof VM", + }, []string{"vm"}), successTotal: factory.NewCounterVec(prometheus.CounterOpts{ Namespace: Namespace, Name: "success_total", @@ -70,7 +90,14 @@ func (m *Metrics) Registry() *prometheus.Registry { } func (m *Metrics) RecordVmExecutionTime(vmType string, dur time.Duration) { - m.vmExecutionTime.WithLabelValues(vmType).Observe(dur.Seconds()) + val := dur.Seconds() + m.vmExecutionTime.WithLabelValues(vmType).Observe(val) + m.vmLastExecutionTime.WithLabelValues(vmType).Set(val) +} + +func (m *Metrics) RecordVmMemoryUsed(vmType string, memoryUsed uint64) { + m.vmMemoryUsed.WithLabelValues(vmType).Observe(float64(memoryUsed)) + m.vmLastMemoryUsed.WithLabelValues(vmType).Set(float64(memoryUsed)) } func (m *Metrics) RecordSuccess(vmType types.TraceType) { From 052ca79250d25fd06a29596553e968bd6ae291df Mon Sep 17 00:00:00 2001 From: Sam Stokes <35908605+bitwiseguy@users.noreply.github.com> Date: Tue, 6 Aug 2024 07:52:33 -0400 Subject: [PATCH 20/59] op-proposer: retry failed output proposals (#11291) * op-proposer: add retries to output proposal * op-proposer: proposeOutput returns err to help trigger retry * op-proposer: use retry.Do for FetchOutput, add unit tests * op-proposer: improve output fetching retry impl * op-proposer: move done signal check into inner loop --------- Co-authored-by: Sebastian Stammler --- op-e2e/actions/l2_proposer.go | 15 +- op-e2e/actions/l2_proposer_test.go | 8 +- op-e2e/actions/user_test.go | 8 +- op-e2e/setup.go | 30 ++-- op-proposer/flags/flags.go | 11 +- op-proposer/proposer/config.go | 4 + op-proposer/proposer/driver.go | 163 +++++++++++++-------- op-proposer/proposer/driver_test.go | 150 +++++++++++++++++++ op-proposer/proposer/service.go | 4 + op-service/testutils/mock_rollup_client.go | 4 +- 10 files changed, 305 insertions(+), 92 deletions(-) create mode 100644 op-proposer/proposer/driver_test.go diff --git a/op-e2e/actions/l2_proposer.go b/op-e2e/actions/l2_proposer.go index 9d0260700512..6a9c2fe4c4b5 100644 --- a/op-e2e/actions/l2_proposer.go +++ b/op-e2e/actions/l2_proposer.go @@ -3,6 +3,7 @@ package actions import ( "context" "crypto/ecdsa" + "encoding/binary" "math/big" "time" @@ -31,6 +32,7 @@ type ProposerCfg struct { OutputOracleAddr *common.Address DisputeGameFactoryAddr *common.Address ProposalInterval time.Duration + ProposalRetryInterval time.Duration DisputeGameType uint32 ProposerKey *ecdsa.PrivateKey AllowNonFinalized bool @@ -77,6 +79,7 @@ func NewL2Proposer(t Testing, log log.Logger, cfg *ProposerCfg, l1 *ethclient.Cl PollInterval: time.Second, NetworkTimeout: time.Second, ProposalInterval: cfg.ProposalInterval, + OutputRetryInterval: cfg.ProposalRetryInterval, L2OutputOracleAddr: cfg.OutputOracleAddr, DisputeGameFactoryAddr: cfg.DisputeGameFactoryAddr, DisputeGameType: cfg.DisputeGameType, @@ -206,18 +209,12 @@ func toCallArg(msg ethereum.CallMsg) interface{} { func (p *L2Proposer) fetchNextOutput(t Testing) (*eth.OutputResponse, bool, error) { if e2eutils.UseFaultProofs() { - blockNumber, err := p.driver.FetchCurrentBlockNumber(t.Ctx()) + output, err := p.driver.FetchDGFOutput(t.Ctx()) if err != nil { return nil, false, err } - - output, _, err := p.driver.FetchOutput(t.Ctx(), blockNumber) - if err != nil { - return nil, false, err - } - encodedBlockNumber := make([]byte, 32) - copy(encodedBlockNumber[32-len(blockNumber.Bytes()):], blockNumber.Bytes()) + binary.BigEndian.PutUint64(encodedBlockNumber[24:], output.BlockRef.Number) game, err := p.disputeGameFactory.Games(&bind.CallOpts{}, p.driver.Cfg.DisputeGameType, output.OutputRoot, encodedBlockNumber) if err != nil { return nil, false, err @@ -228,7 +225,7 @@ func (p *L2Proposer) fetchNextOutput(t Testing) (*eth.OutputResponse, bool, erro return output, true, nil } else { - return p.driver.FetchNextOutputInfo(t.Ctx()) + return p.driver.FetchL2OOOutput(t.Ctx()) } } diff --git a/op-e2e/actions/l2_proposer_test.go b/op-e2e/actions/l2_proposer_test.go index ef7966eb8e43..bed138cdb3a7 100644 --- a/op-e2e/actions/l2_proposer_test.go +++ b/op-e2e/actions/l2_proposer_test.go @@ -64,15 +64,17 @@ func RunProposerTest(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { proposer = NewL2Proposer(t, log, &ProposerCfg{ DisputeGameFactoryAddr: &sd.DeploymentsL1.DisputeGameFactoryProxy, ProposalInterval: 6 * time.Second, + ProposalRetryInterval: 3 * time.Second, DisputeGameType: respectedGameType, ProposerKey: dp.Secrets.Proposer, AllowNonFinalized: true, }, miner.EthClient(), rollupSeqCl) } else { proposer = NewL2Proposer(t, log, &ProposerCfg{ - OutputOracleAddr: &sd.DeploymentsL1.L2OutputOracleProxy, - ProposerKey: dp.Secrets.Proposer, - AllowNonFinalized: false, + OutputOracleAddr: &sd.DeploymentsL1.L2OutputOracleProxy, + ProposerKey: dp.Secrets.Proposer, + ProposalRetryInterval: 3 * time.Second, + AllowNonFinalized: false, }, miner.EthClient(), rollupSeqCl) } diff --git a/op-e2e/actions/user_test.go b/op-e2e/actions/user_test.go index c9692c91f0aa..3a0b079cb3e4 100644 --- a/op-e2e/actions/user_test.go +++ b/op-e2e/actions/user_test.go @@ -144,15 +144,17 @@ func runCrossLayerUserTest(gt *testing.T, test hardforkScheduledTest) { proposer = NewL2Proposer(t, log, &ProposerCfg{ DisputeGameFactoryAddr: &sd.DeploymentsL1.DisputeGameFactoryProxy, ProposalInterval: 6 * time.Second, + ProposalRetryInterval: 3 * time.Second, DisputeGameType: respectedGameType, ProposerKey: dp.Secrets.Proposer, AllowNonFinalized: true, }, miner.EthClient(), seq.RollupClient()) } else { proposer = NewL2Proposer(t, log, &ProposerCfg{ - OutputOracleAddr: &sd.DeploymentsL1.L2OutputOracleProxy, - ProposerKey: dp.Secrets.Proposer, - AllowNonFinalized: true, + OutputOracleAddr: &sd.DeploymentsL1.L2OutputOracleProxy, + ProposerKey: dp.Secrets.Proposer, + ProposalRetryInterval: 3 * time.Second, + AllowNonFinalized: true, }, miner.EthClient(), seq.RollupClient()) } diff --git a/op-e2e/setup.go b/op-e2e/setup.go index dd31c973a599..cac85da91ee6 100644 --- a/op-e2e/setup.go +++ b/op-e2e/setup.go @@ -845,14 +845,15 @@ func (cfg SystemConfig) Start(t *testing.T, _opts ...SystemConfigOption) (*Syste var proposerCLIConfig *l2os.CLIConfig if e2eutils.UseFaultProofs() { proposerCLIConfig = &l2os.CLIConfig{ - L1EthRpc: sys.EthInstances[RoleL1].WSEndpoint(), - RollupRpc: sys.RollupNodes[RoleSeq].HTTPEndpoint(), - DGFAddress: config.L1Deployments.DisputeGameFactoryProxy.Hex(), - ProposalInterval: 6 * time.Second, - DisputeGameType: 254, // Fast game type - PollInterval: 50 * time.Millisecond, - TxMgrConfig: newTxMgrConfig(sys.EthInstances[RoleL1].WSEndpoint(), cfg.Secrets.Proposer), - AllowNonFinalized: cfg.NonFinalizedProposals, + L1EthRpc: sys.EthInstances[RoleL1].WSEndpoint(), + RollupRpc: sys.RollupNodes[RoleSeq].HTTPEndpoint(), + DGFAddress: config.L1Deployments.DisputeGameFactoryProxy.Hex(), + ProposalInterval: 6 * time.Second, + DisputeGameType: 254, // Fast game type + PollInterval: 50 * time.Millisecond, + OutputRetryInterval: 10 * time.Millisecond, + TxMgrConfig: newTxMgrConfig(sys.EthInstances[RoleL1].WSEndpoint(), cfg.Secrets.Proposer), + AllowNonFinalized: cfg.NonFinalizedProposals, LogConfig: oplog.CLIConfig{ Level: log.LvlInfo, Format: oplog.FormatText, @@ -860,12 +861,13 @@ func (cfg SystemConfig) Start(t *testing.T, _opts ...SystemConfigOption) (*Syste } } else { proposerCLIConfig = &l2os.CLIConfig{ - L1EthRpc: sys.EthInstances[RoleL1].WSEndpoint(), - RollupRpc: sys.RollupNodes[RoleSeq].HTTPEndpoint(), - L2OOAddress: config.L1Deployments.L2OutputOracleProxy.Hex(), - PollInterval: 50 * time.Millisecond, - TxMgrConfig: newTxMgrConfig(sys.EthInstances[RoleL1].WSEndpoint(), cfg.Secrets.Proposer), - AllowNonFinalized: cfg.NonFinalizedProposals, + L1EthRpc: sys.EthInstances[RoleL1].WSEndpoint(), + RollupRpc: sys.RollupNodes[RoleSeq].HTTPEndpoint(), + L2OOAddress: config.L1Deployments.L2OutputOracleProxy.Hex(), + PollInterval: 50 * time.Millisecond, + OutputRetryInterval: 10 * time.Millisecond, + TxMgrConfig: newTxMgrConfig(sys.EthInstances[RoleL1].WSEndpoint(), cfg.Secrets.Proposer), + AllowNonFinalized: cfg.NonFinalizedProposals, LogConfig: oplog.CLIConfig{ Level: log.LvlInfo, Format: oplog.FormatText, diff --git a/op-proposer/flags/flags.go b/op-proposer/flags/flags.go index 4321e000fe2f..d4ca19150c47 100644 --- a/op-proposer/flags/flags.go +++ b/op-proposer/flags/flags.go @@ -41,8 +41,8 @@ var ( } PollIntervalFlag = &cli.DurationFlag{ Name: "poll-interval", - Usage: "How frequently to poll L2 for new blocks", - Value: 6 * time.Second, + Usage: "How frequently to poll L2 for new blocks (legacy L2OO)", + Value: 12 * time.Second, EnvVars: prefixEnvVars("POLL_INTERVAL"), } AllowNonFinalizedFlag = &cli.BoolFlag{ @@ -60,6 +60,12 @@ var ( Usage: "Interval between submitting L2 output proposals when the dispute game factory address is set", EnvVars: prefixEnvVars("PROPOSAL_INTERVAL"), } + OutputRetryIntervalFlag = &cli.DurationFlag{ + Name: "output-retry-interval", + Usage: "Interval between retrying output fetching (DGF)", + Value: 12 * time.Second, + EnvVars: prefixEnvVars("OUTPUT_RETRY_INTERVAL"), + } DisputeGameTypeFlag = &cli.UintFlag{ Name: "game-type", Usage: "Dispute game type to create via the configured DisputeGameFactory", @@ -95,6 +101,7 @@ var optionalFlags = []cli.Flag{ L2OutputHDPathFlag, DisputeGameFactoryAddressFlag, ProposalIntervalFlag, + OutputRetryIntervalFlag, DisputeGameTypeFlag, ActiveSequencerCheckDurationFlag, WaitNodeSyncFlag, diff --git a/op-proposer/proposer/config.go b/op-proposer/proposer/config.go index 8786da0c0daa..892d4686b3a9 100644 --- a/op-proposer/proposer/config.go +++ b/op-proposer/proposer/config.go @@ -53,6 +53,9 @@ type CLIConfig struct { // ProposalInterval is the delay between submitting L2 output proposals when the DGFAddress is set. ProposalInterval time.Duration + // OutputRetryInterval is the delay between retrying output fetch if one fails. + OutputRetryInterval time.Duration + // DisputeGameType is the type of dispute game to create when submitting an output proposal. DisputeGameType uint32 @@ -110,6 +113,7 @@ func NewConfig(ctx *cli.Context) *CLIConfig { PprofConfig: oppprof.ReadCLIConfig(ctx), DGFAddress: ctx.String(flags.DisputeGameFactoryAddressFlag.Name), ProposalInterval: ctx.Duration(flags.ProposalIntervalFlag.Name), + OutputRetryInterval: ctx.Duration(flags.OutputRetryIntervalFlag.Name), DisputeGameType: uint32(ctx.Uint(flags.DisputeGameTypeFlag.Name)), ActiveSequencerCheckDuration: ctx.Duration(flags.ActiveSequencerCheckDurationFlag.Name), WaitNodeSync: ctx.Bool(flags.WaitNodeSyncFlag.Name), diff --git a/op-proposer/proposer/driver.go b/op-proposer/proposer/driver.go index 4138deda1bfd..7f8caac53f8b 100644 --- a/op-proposer/proposer/driver.go +++ b/op-proposer/proposer/driver.go @@ -39,6 +39,11 @@ type L1Client interface { CallContract(ctx context.Context, call ethereum.CallMsg, blockNumber *big.Int) ([]byte, error) } +type L2OOContract interface { + Version(*bind.CallOpts) (string, error) + NextBlockNumber(*bind.CallOpts) (*big.Int, error) +} + type RollupClient interface { SyncStatus(ctx context.Context) (*eth.SyncStatus, error) OutputAtBlock(ctx context.Context, blockNum uint64) (*eth.OutputResponse, error) @@ -68,7 +73,7 @@ type L2OutputSubmitter struct { mutex sync.Mutex running bool - l2ooContract *bindings.L2OutputOracleCaller + l2ooContract L2OOContract l2ooABI *abi.ABI dgfContract *bindings.DisputeGameFactoryCaller @@ -207,9 +212,12 @@ func (l *L2OutputSubmitter) StopL2OutputSubmitting() error { return nil } -// FetchNextOutputInfo gets the block number of the next proposal. -// It returns: the next block number, if the proposal should be made, error -func (l *L2OutputSubmitter) FetchNextOutputInfo(ctx context.Context) (*eth.OutputResponse, bool, error) { +// FetchL2OOOutput gets the next output proposal for the L2OO. +// It queries the L2OO for the earliest next block number that should be proposed. +// It returns the output to propose, and whether the proposal should be submitted at all. +// The passed context is expected to be a lifecycle context. A network timeout +// context will be derived from it. +func (l *L2OutputSubmitter) FetchL2OOOutput(ctx context.Context) (*eth.OutputResponse, bool, error) { if l.l2ooContract == nil { return nil, false, fmt.Errorf("L2OutputOracle contract not set, cannot fetch next output info") } @@ -220,11 +228,11 @@ func (l *L2OutputSubmitter) FetchNextOutputInfo(ctx context.Context) (*eth.Outpu From: l.Txmgr.From(), Context: cCtx, } - nextCheckpointBlock, err := l.l2ooContract.NextBlockNumber(callOpts) + nextCheckpointBlockBig, err := l.l2ooContract.NextBlockNumber(callOpts) if err != nil { - l.Log.Error("Proposer unable to get next block number", "err", err) - return nil, false, err + return nil, false, fmt.Errorf("querying next block number: %w", err) } + nextCheckpointBlock := nextCheckpointBlockBig.Uint64() // Fetch the current L2 heads currentBlockNumber, err := l.FetchCurrentBlockNumber(ctx) if err != nil { @@ -232,76 +240,79 @@ func (l *L2OutputSubmitter) FetchNextOutputInfo(ctx context.Context) (*eth.Outpu } // Ensure that we do not submit a block in the future - if currentBlockNumber.Cmp(nextCheckpointBlock) < 0 { + if currentBlockNumber < nextCheckpointBlock { l.Log.Debug("Proposer submission interval has not elapsed", "currentBlockNumber", currentBlockNumber, "nextBlockNumber", nextCheckpointBlock) return nil, false, nil } - return l.FetchOutput(ctx, nextCheckpointBlock) + output, err := l.FetchOutput(ctx, nextCheckpointBlock) + if err != nil { + return nil, false, fmt.Errorf("fetching output: %w", err) + } + + // Always propose if it's part of the Finalized L2 chain. Or if allowed, if it's part of the safe L2 chain. + if output.BlockRef.Number > output.Status.FinalizedL2.Number && (!l.Cfg.AllowNonFinalized || output.BlockRef.Number > output.Status.SafeL2.Number) { + l.Log.Debug("Not proposing yet, L2 block is not ready for proposal", + "l2_proposal", output.BlockRef, + "l2_safe", output.Status.SafeL2, + "l2_finalized", output.Status.FinalizedL2, + "allow_non_finalized", l.Cfg.AllowNonFinalized) + return output, false, nil + } + return output, true, nil +} + +// FetchDGFOutput gets the next output proposal for the DGF. +// The passed context is expected to be a lifecycle context. A network timeout +// context will be derived from it. +func (l *L2OutputSubmitter) FetchDGFOutput(ctx context.Context) (*eth.OutputResponse, error) { + ctx, cancel := context.WithTimeout(ctx, l.Cfg.NetworkTimeout) + defer cancel() + + blockNum, err := l.FetchCurrentBlockNumber(ctx) + if err != nil { + return nil, err + } + return l.FetchOutput(ctx, blockNum) } // FetchCurrentBlockNumber gets the current block number from the [L2OutputSubmitter]'s [RollupClient]. If the `AllowNonFinalized` configuration // option is set, it will return the safe head block number, and if not, it will return the finalized head block number. -func (l *L2OutputSubmitter) FetchCurrentBlockNumber(ctx context.Context) (*big.Int, error) { +func (l *L2OutputSubmitter) FetchCurrentBlockNumber(ctx context.Context) (uint64, error) { rollupClient, err := l.RollupProvider.RollupClient(ctx) if err != nil { - l.Log.Error("Proposer unable to get rollup client", "err", err) - return nil, err + return 0, fmt.Errorf("getting rollup client: %w", err) } - cCtx, cancel := context.WithTimeout(ctx, l.Cfg.NetworkTimeout) - defer cancel() - - status, err := rollupClient.SyncStatus(cCtx) + status, err := rollupClient.SyncStatus(ctx) if err != nil { - l.Log.Error("Proposer unable to get sync status", "err", err) - return nil, err + return 0, fmt.Errorf("getting sync status: %w", err) } // Use either the finalized or safe head depending on the config. Finalized head is default & safer. - var currentBlockNumber *big.Int if l.Cfg.AllowNonFinalized { - currentBlockNumber = new(big.Int).SetUint64(status.SafeL2.Number) - } else { - currentBlockNumber = new(big.Int).SetUint64(status.FinalizedL2.Number) + return status.SafeL2.Number, nil } - return currentBlockNumber, nil + return status.FinalizedL2.Number, nil } -func (l *L2OutputSubmitter) FetchOutput(ctx context.Context, block *big.Int) (*eth.OutputResponse, bool, error) { +func (l *L2OutputSubmitter) FetchOutput(ctx context.Context, block uint64) (*eth.OutputResponse, error) { rollupClient, err := l.RollupProvider.RollupClient(ctx) if err != nil { - l.Log.Error("Proposer unable to get rollup client", "err", err) - return nil, false, err + return nil, fmt.Errorf("getting rollup client: %w", err) } - cCtx, cancel := context.WithTimeout(ctx, l.Cfg.NetworkTimeout) - defer cancel() - - output, err := rollupClient.OutputAtBlock(cCtx, block.Uint64()) + output, err := rollupClient.OutputAtBlock(ctx, block) if err != nil { - l.Log.Error("Failed to fetch output at block", "block", block, "err", err) - return nil, false, err + return nil, fmt.Errorf("fetching output at block %d: %w", block, err) } if output.Version != supportedL2OutputVersion { - l.Log.Error("Unsupported l2 output version", "output_version", output.Version, "supported_version", supportedL2OutputVersion) - return nil, false, errors.New("unsupported l2 output version") + return nil, fmt.Errorf("unsupported l2 output version: %v, supported: %v", output.Version, supportedL2OutputVersion) } - if output.BlockRef.Number != block.Uint64() { // sanity check, e.g. in case of bad RPC caching - l.Log.Error("Invalid blockNumber", "next_block", block, "output_block", output.BlockRef.Number) - return nil, false, errors.New("invalid blockNumber") + if onum := output.BlockRef.Number; onum != block { // sanity check, e.g. in case of bad RPC caching + return nil, fmt.Errorf("output block number %d mismatches requested %d", output.BlockRef.Number, block) } - - // Always propose if it's part of the Finalized L2 chain. Or if allowed, if it's part of the safe L2 chain. - if output.BlockRef.Number > output.Status.FinalizedL2.Number && (!l.Cfg.AllowNonFinalized || output.BlockRef.Number > output.Status.SafeL2.Number) { - l.Log.Debug("Not proposing yet, L2 block is not ready for proposal", - "l2_proposal", output.BlockRef, - "l2_safe", output.Status.SafeL2, - "l2_finalized", output.Status.FinalizedL2, - "allow_non_finalized", l.Cfg.AllowNonFinalized) - return nil, false, nil - } - return output, true, nil + return output, nil } // ProposeL2OutputTxData creates the transaction data for the ProposeL2Output function @@ -450,15 +461,33 @@ func (l *L2OutputSubmitter) waitNodeSync() error { return dial.WaitRollupSync(l.ctx, l.Log, rollupClient, l1head, time.Second*12) } +// The loopL2OO regularly polls the L2OO for the next block to propose, +// and if the current finalized (or safe) block is past that next block, it +// proposes it. func (l *L2OutputSubmitter) loopL2OO(ctx context.Context) { + defer l.Log.Info("loopL2OO returning") ticker := time.NewTicker(l.Cfg.PollInterval) defer ticker.Stop() for { select { case <-ticker.C: - output, shouldPropose, err := l.FetchNextOutputInfo(ctx) - if err != nil || !shouldPropose { - break + // prioritize quit signal + select { + case <-l.done: + return + default: + } + + // A note on retrying: the outer ticker already runs on a short + // poll interval, which has a default value of 6 seconds. So no + // retry logic is needed around output fetching here. + output, shouldPropose, err := l.FetchL2OOOutput(ctx) + if err != nil { + l.Log.Warn("Error getting L2OO output", "err", err) + continue + } else if !shouldPropose { + // debug logging already in FetchL2OOOutput + continue } l.proposeOutput(ctx, output) @@ -468,20 +497,36 @@ func (l *L2OutputSubmitter) loopL2OO(ctx context.Context) { } } +// The loopDGF proposes a new output every proposal interval. It does _not_ query +// the DGF for when to next propose, as the DGF doesn't have the concept of a +// proposal interval, like in the L2OO case. For this reason, it has to keep track +// of the interval itself, for which it uses an internal ticker. func (l *L2OutputSubmitter) loopDGF(ctx context.Context) { + defer l.Log.Info("loopDGF returning") ticker := time.NewTicker(l.Cfg.ProposalInterval) defer ticker.Stop() for { select { case <-ticker.C: - blockNumber, err := l.FetchCurrentBlockNumber(ctx) - if err != nil { - break - } - - output, shouldPropose, err := l.FetchOutput(ctx, blockNumber) - if err != nil || !shouldPropose { - break + var ( + output *eth.OutputResponse + err error + ) + // A note on retrying: because the proposal interval is usually much + // larger than the interval at which to retry proposing on a failed attempt, + // we want to keep retrying getting the output proposal until we succeed. + for output == nil || err != nil { + select { + case <-l.done: + return + default: + } + + output, err = l.FetchDGFOutput(ctx) + if err != nil { + l.Log.Warn("Error getting DGF output, retrying...", "err", err) + time.Sleep(l.Cfg.OutputRetryInterval) + } } l.proposeOutput(ctx, output) diff --git a/op-proposer/proposer/driver_test.go b/op-proposer/proposer/driver_test.go new file mode 100644 index 000000000000..c0dd4d3d3daf --- /dev/null +++ b/op-proposer/proposer/driver_test.go @@ -0,0 +1,150 @@ +package proposer + +import ( + "context" + "fmt" + "math/big" + "testing" + "time" + + "github.com/ethereum-optimism/optimism/op-proposer/bindings" + "github.com/ethereum-optimism/optimism/op-proposer/metrics" + "github.com/ethereum-optimism/optimism/op-service/dial" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum-optimism/optimism/op-service/testutils" + txmgrmocks "github.com/ethereum-optimism/optimism/op-service/txmgr/mocks" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +type MockL2OOContract struct { + mock.Mock +} + +func (m *MockL2OOContract) Version(opts *bind.CallOpts) (string, error) { + args := m.Called(opts) + return args.String(0), args.Error(1) +} + +func (m *MockL2OOContract) NextBlockNumber(opts *bind.CallOpts) (*big.Int, error) { + args := m.Called(opts) + return args.Get(0).(*big.Int), args.Error(1) +} + +type mockRollupEndpointProvider struct { + rollupClient *testutils.MockRollupClient + rollupClientErr error +} + +func newEndpointProvider() *mockRollupEndpointProvider { + return &mockRollupEndpointProvider{ + rollupClient: new(testutils.MockRollupClient), + } +} + +func (p *mockRollupEndpointProvider) RollupClient(context.Context) (dial.RollupClientInterface, error) { + return p.rollupClient, p.rollupClientErr +} + +func (p *mockRollupEndpointProvider) Close() {} + +func setup(t *testing.T) (*L2OutputSubmitter, *mockRollupEndpointProvider, *MockL2OOContract, *txmgrmocks.TxManager, *testlog.CapturingHandler) { + ep := newEndpointProvider() + + l2OutputOracleAddr := common.HexToAddress("0x3F8A862E63E759a77DA22d384027D21BF096bA9E") + + proposerConfig := ProposerConfig{ + PollInterval: time.Microsecond, + ProposalInterval: time.Microsecond, + OutputRetryInterval: time.Microsecond, + L2OutputOracleAddr: &l2OutputOracleAddr, + } + + txmgr := txmgrmocks.NewTxManager(t) + + lgr, logs := testlog.CaptureLogger(t, log.LevelDebug) + setup := DriverSetup{ + Log: lgr, + Metr: metrics.NoopMetrics, + Cfg: proposerConfig, + Txmgr: txmgr, + RollupProvider: ep, + } + + parsed, err := bindings.L2OutputOracleMetaData.GetAbi() + require.NoError(t, err) + + ctx, cancel := context.WithCancel(context.Background()) + l2ooContract := new(MockL2OOContract) + l2OutputSubmitter := L2OutputSubmitter{ + DriverSetup: setup, + done: make(chan struct{}), + l2ooContract: l2ooContract, + l2ooABI: parsed, + ctx: ctx, + cancel: cancel, + } + + txmgr.On("BlockNumber", mock.Anything).Return(uint64(100), nil).Once() + txmgr.On("Send", mock.Anything, mock.Anything). + Return(&types.Receipt{Status: uint64(1), TxHash: common.Hash{}}, nil). + Once(). + Run(func(_ mock.Arguments) { + // let loops return after first Send call + t.Log("Closing proposer.") + close(l2OutputSubmitter.done) + }) + + return &l2OutputSubmitter, ep, l2ooContract, txmgr, logs +} + +func TestL2OutputSubmitter_OutputRetry(t *testing.T) { + tests := []struct { + name string + }{ + {name: "L2OO"}, + {name: "DGF"}, + } + + const numFails = 3 + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ps, ep, l2ooContract, txmgr, logs := setup(t) + + ep.rollupClient.On("SyncStatus").Return(ð.SyncStatus{FinalizedL2: eth.L2BlockRef{Number: 42}}, nil).Times(numFails + 1) + ep.rollupClient.ExpectOutputAtBlock(42, nil, fmt.Errorf("TEST: failed to fetch output")).Times(numFails) + ep.rollupClient.ExpectOutputAtBlock( + 42, + ð.OutputResponse{ + Version: supportedL2OutputVersion, + BlockRef: eth.L2BlockRef{Number: 42}, + Status: ð.SyncStatus{ + CurrentL1: eth.L1BlockRef{Hash: common.Hash{}}, + FinalizedL2: eth.L2BlockRef{Number: 42}, + }, + }, + nil, + ) + + if tt.name == "DGF" { + ps.loopDGF(ps.ctx) + } else { + txmgr.On("From").Return(common.Address{}).Times(numFails + 1) + l2ooContract.On("NextBlockNumber", mock.AnythingOfType("*bind.CallOpts")).Return(big.NewInt(42), nil).Times(numFails + 1) + ps.loopL2OO(ps.ctx) + } + + ep.rollupClient.AssertExpectations(t) + l2ooContract.AssertExpectations(t) + require.Len(t, logs.FindLogs(testlog.NewMessageContainsFilter("Error getting "+tt.name)), numFails) + require.NotNil(t, logs.FindLog(testlog.NewMessageFilter("Proposer tx successfully published"))) + require.NotNil(t, logs.FindLog(testlog.NewMessageFilter("loop"+tt.name+" returning"))) + }) + } +} diff --git a/op-proposer/proposer/service.go b/op-proposer/proposer/service.go index f40fdf0b496a..8b3d3c553cce 100644 --- a/op-proposer/proposer/service.go +++ b/op-proposer/proposer/service.go @@ -32,6 +32,9 @@ type ProposerConfig struct { PollInterval time.Duration NetworkTimeout time.Duration + // How frequently to retry fetching an output if one fails + OutputRetryInterval time.Duration + // How frequently to post L2 outputs when the DisputeGameFactory is configured ProposalInterval time.Duration @@ -89,6 +92,7 @@ func (ps *ProposerService) initFromCLIConfig(ctx context.Context, version string ps.initMetrics(cfg) ps.PollInterval = cfg.PollInterval + ps.OutputRetryInterval = cfg.OutputRetryInterval ps.NetworkTimeout = cfg.TxMgrConfig.NetworkTimeout ps.AllowNonFinalized = cfg.AllowNonFinalized ps.WaitNodeSync = cfg.WaitNodeSync diff --git a/op-service/testutils/mock_rollup_client.go b/op-service/testutils/mock_rollup_client.go index a7a42e878481..2ed6d54a00d0 100644 --- a/op-service/testutils/mock_rollup_client.go +++ b/op-service/testutils/mock_rollup_client.go @@ -18,8 +18,8 @@ func (m *MockRollupClient) OutputAtBlock(ctx context.Context, blockNum uint64) ( return out.Get(0).(*eth.OutputResponse), out.Error(1) } -func (m *MockRollupClient) ExpectOutputAtBlock(blockNum uint64, response *eth.OutputResponse, err error) { - m.Mock.On("OutputAtBlock", blockNum).Once().Return(response, err) +func (m *MockRollupClient) ExpectOutputAtBlock(blockNum uint64, response *eth.OutputResponse, err error) *mock.Call { + return m.Mock.On("OutputAtBlock", blockNum).Once().Return(response, err) } func (m *MockRollupClient) SyncStatus(ctx context.Context) (*eth.SyncStatus, error) { From 0681bfc64c8feb56da60300b7c7221445aa7acf9 Mon Sep 17 00:00:00 2001 From: Adrian Sutton Date: Wed, 7 Aug 2024 03:52:06 +1000 Subject: [PATCH 21/59] op-challenger: Fix prestate loading for asterisc in run-trace (#11363) --- op-challenger/runner/factory.go | 29 +++++++++++++++++++++++------ op-challenger/runner/runner.go | 10 ++++------ 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/op-challenger/runner/factory.go b/op-challenger/runner/factory.go index 4b1ca45031ff..009e379169ed 100644 --- a/op-challenger/runner/factory.go +++ b/op-challenger/runner/factory.go @@ -3,6 +3,8 @@ package runner import ( "errors" "fmt" + "net/url" + "path/filepath" "github.com/ethereum-optimism/optimism/op-challenger/config" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/asterisc" @@ -19,24 +21,39 @@ func createTraceProvider( logger log.Logger, m vm.Metricer, cfg *config.Config, - prestateSource prestates.PrestateSource, prestateHash common.Hash, traceType types.TraceType, localInputs utils.LocalGameInputs, dir string, ) (types.TraceProvider, error) { - prestate, err := prestateSource.PrestatePath(prestateHash) - if err != nil { - return nil, fmt.Errorf("failed to get prestate %v: %w", prestateHash, err) - } - switch traceType { case types.TraceTypeCannon: + prestate, err := getPrestate(prestateHash, cfg.CannonAbsolutePreStateBaseURL, cfg.CannonAbsolutePreState, dir) + if err != nil { + return nil, err + } prestateProvider := cannon.NewPrestateProvider(prestate) return cannon.NewTraceProvider(logger, m, cfg.Cannon, prestateProvider, prestate, localInputs, dir, 42), nil case types.TraceTypeAsterisc: + prestate, err := getPrestate(prestateHash, cfg.AsteriscAbsolutePreStateBaseURL, cfg.AsteriscAbsolutePreState, dir) + if err != nil { + return nil, err + } prestateProvider := asterisc.NewPrestateProvider(prestate) return asterisc.NewTraceProvider(logger, m, cfg.Asterisc, prestateProvider, prestate, localInputs, dir, 42), nil } return nil, errors.New("invalid trace type") } + +func getPrestate(prestateHash common.Hash, prestateBaseUrl *url.URL, prestatePath string, dataDir string) (string, error) { + prestateSource := prestates.NewPrestateSource( + prestateBaseUrl, + prestatePath, + filepath.Join(dataDir, "prestates")) + + prestate, err := prestateSource.PrestatePath(prestateHash) + if err != nil { + return "", fmt.Errorf("failed to get prestate %v: %w", prestateHash, err) + } + return prestate, nil +} diff --git a/op-challenger/runner/runner.go b/op-challenger/runner/runner.go index ea16681ed7cc..4c80655cfcdd 100644 --- a/op-challenger/runner/runner.go +++ b/op-challenger/runner/runner.go @@ -15,7 +15,6 @@ import ( "github.com/ethereum-optimism/optimism/op-challenger/config" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts" contractMetrics "github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics" - "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/prestates" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/vm" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" @@ -130,12 +129,8 @@ func (r *Runner) runOnce(ctx context.Context, traceType types.TraceType, client if err != nil { return err } - prestateSource := prestates.NewPrestateSource( - r.cfg.CannonAbsolutePreStateBaseURL, - r.cfg.CannonAbsolutePreState, - filepath.Join(dir, "prestates")) logger := r.log.New("l1", localInputs.L1Head, "l2", localInputs.L2Head, "l2Block", localInputs.L2BlockNumber, "claim", localInputs.L2Claim, "type", traceType) - provider, err := createTraceProvider(logger, r.m, r.cfg, prestateSource, prestateHash, traceType, localInputs, dir) + provider, err := createTraceProvider(logger, r.m, r.cfg, prestateHash, traceType, localInputs, dir) if err != nil { return fmt.Errorf("failed to create trace provider: %w", err) } @@ -203,6 +198,9 @@ func (r *Runner) getPrestateHash(ctx context.Context, traceType types.TraceType, if err != nil { return common.Hash{}, fmt.Errorf("failed to load game impl: %w", err) } + if gameImplAddr == (common.Address{}) { + return common.Hash{}, nil // No prestate is set, will only work if a single prestate is specified + } gameImpl, err := contracts.NewFaultDisputeGameContract(ctx, r.m, gameImplAddr, caller) if err != nil { return common.Hash{}, fmt.Errorf("failed to create fault dispute game contract bindings for %v: %w", gameImplAddr, err) From 5b7d2b98b109302b1356eee18ebf0dd970b47bb4 Mon Sep 17 00:00:00 2001 From: clabby Date: Tue, 6 Aug 2024 14:50:56 -0400 Subject: [PATCH 22/59] feat(challenger): `AsteriscKona` trace type (#11140) * feat(challenger): `AsteriscKona` trace type Adds support for the new `asterisc-kona` game type in the `op-challenger` * feat: add `kona-host` `--l2-chain-id` flag * op-challenger: Separate oracle server executor (#11348) * fix(op-challenger): run trace cmd * fix(op-challenger): lints --------- Co-authored-by: Adrian Sutton Co-authored-by: refcell --- op-challenger/config/config.go | 17 +++- op-challenger/flags/flags.go | 52 +++++++++- op-challenger/game/fault/register.go | 23 +++-- .../game/fault/trace/asterisc/provider.go | 6 +- .../game/fault/trace/cannon/provider.go | 6 +- .../fault/trace/outputs/output_asterisc.go | 3 +- .../game/fault/trace/outputs/output_cannon.go | 3 +- op-challenger/game/fault/trace/vm/executor.go | 47 ++++----- .../game/fault/trace/vm/executor_test.go | 2 +- .../game/fault/trace/vm/kona_vm_config.go | 39 ++++++++ .../fault/trace/vm/kona_vm_config_test.go | 45 +++++++++ .../fault/trace/vm/op_program_vm_config.go | 39 ++++++++ .../trace/vm/op_program_vm_config_test.go | 98 +++++++++++++++++++ op-challenger/game/fault/types/types.go | 4 + op-challenger/runner/factory.go | 14 ++- .../disputegame/output_cannon_helper.go | 3 +- op-e2e/faultproofs/precompile_test.go | 2 +- 17 files changed, 349 insertions(+), 54 deletions(-) create mode 100644 op-challenger/game/fault/trace/vm/kona_vm_config.go create mode 100644 op-challenger/game/fault/trace/vm/kona_vm_config_test.go create mode 100644 op-challenger/game/fault/trace/vm/op_program_vm_config.go create mode 100644 op-challenger/game/fault/trace/vm/op_program_vm_config_test.go diff --git a/op-challenger/config/config.go b/op-challenger/config/config.go index 2d8e16e0d50e..a9937a68af86 100644 --- a/op-challenger/config/config.go +++ b/op-challenger/config/config.go @@ -96,9 +96,12 @@ type Config struct { CannonAbsolutePreStateBaseURL *url.URL // Base URL to retrieve absolute pre-states for Cannon traces from // Specific to the asterisc trace provider - Asterisc vm.Config - AsteriscAbsolutePreState string // File to load the absolute pre-state for Asterisc traces from - AsteriscAbsolutePreStateBaseURL *url.URL // Base URL to retrieve absolute pre-states for Asterisc traces from + Asterisc vm.Config + AsteriscAbsolutePreState string // File to load the absolute pre-state for Asterisc traces from + AsteriscAbsolutePreStateBaseURL *url.URL // Base URL to retrieve absolute pre-states for Asterisc traces from + AsteriscKona vm.Config + AsteriscKonaAbsolutePreState string // File to load the absolute pre-state for AsteriscKona traces from + AsteriscKonaAbsolutePreStateBaseURL *url.URL // Base URL to retrieve absolute pre-states for AsteriscKona traces from MaxPendingTx uint64 // Maximum number of pending transactions (0 == no limit) @@ -152,6 +155,14 @@ func NewConfig( SnapshotFreq: DefaultAsteriscSnapshotFreq, InfoFreq: DefaultAsteriscInfoFreq, }, + AsteriscKona: vm.Config{ + VmType: types.TraceTypeAsteriscKona, + L1: l1EthRpc, + L1Beacon: l1BeaconApi, + L2: l2EthRpc, + SnapshotFreq: DefaultAsteriscSnapshotFreq, + InfoFreq: DefaultAsteriscInfoFreq, + }, GameWindow: DefaultGameWindow, } } diff --git a/op-challenger/flags/flags.go b/op-challenger/flags/flags.go index ac52ac16ee9e..564027875f10 100644 --- a/op-challenger/flags/flags.go +++ b/op-challenger/flags/flags.go @@ -178,17 +178,33 @@ var ( Usage: "Path to executable to use as pre-image oracle server when generating trace data (asterisc trace type only)", EnvVars: prefixEnvVars("ASTERISC_SERVER"), } + AsteriscKonaServerFlag = &cli.StringFlag{ + Name: "asterisc-kona-server", + Usage: "Path to kona executable to use as pre-image oracle server when generating trace data (asterisc-kona trace type only)", + EnvVars: prefixEnvVars("ASTERISC_KONA_SERVER"), + } AsteriscPreStateFlag = &cli.StringFlag{ Name: "asterisc-prestate", Usage: "Path to absolute prestate to use when generating trace data (asterisc trace type only)", EnvVars: prefixEnvVars("ASTERISC_PRESTATE"), } + AsteriscKonaPreStateFlag = &cli.StringFlag{ + Name: "asterisc-kona-prestate", + Usage: "Path to absolute prestate to use when generating trace data (asterisc-kona trace type only)", + EnvVars: prefixEnvVars("ASTERISC_KONA_PRESTATE"), + } AsteriscPreStatesURLFlag = &cli.StringFlag{ Name: "asterisc-prestates-url", Usage: "Base URL to absolute prestates to use when generating trace data. " + "Prestates in this directory should be name as .json (asterisc trace type only)", EnvVars: prefixEnvVars("ASTERISC_PRESTATES_URL"), } + AsteriscKonaPreStatesURLFlag = &cli.StringFlag{ + Name: "asterisc-kona-prestates-url", + Usage: "Base URL to absolute prestates to use when generating trace data. " + + "Prestates in this directory should be name as .json (asterisc-kona trace type only)", + EnvVars: prefixEnvVars("ASTERISC_KONA_PRESTATES_URL"), + } AsteriscSnapshotFreqFlag = &cli.UintFlag{ Name: "asterisc-snapshot-freq", Usage: "Frequency of asterisc snapshots to generate in VM steps (asterisc trace type only)", @@ -255,8 +271,11 @@ var optionalFlags = []cli.Flag{ AsteriscL2GenesisFlag, AsteriscBinFlag, AsteriscServerFlag, + AsteriscKonaServerFlag, AsteriscPreStateFlag, + AsteriscKonaPreStateFlag, AsteriscPreStatesURLFlag, + AsteriscKonaPreStatesURLFlag, AsteriscSnapshotFreqFlag, AsteriscInfoFreqFlag, GameWindowFlag, @@ -486,6 +505,14 @@ func NewConfigFromCLI(ctx *cli.Context, logger log.Logger) (*config.Config, erro } asteriscPreStatesURL = parsed } + var asteriscKonaPreStatesURL *url.URL + if ctx.IsSet(AsteriscKonaPreStatesURLFlag.Name) { + parsed, err := url.Parse(ctx.String(AsteriscKonaPreStatesURLFlag.Name)) + if err != nil { + return nil, fmt.Errorf("invalid asterisc-kona pre states url (%v): %w", ctx.String(AsteriscKonaPreStatesURLFlag.Name), err) + } + asteriscKonaPreStatesURL = parsed + } l2Rpc, err := getL2Rpc(ctx, logger) if err != nil { return nil, err @@ -546,10 +573,25 @@ func NewConfigFromCLI(ctx *cli.Context, logger log.Logger) (*config.Config, erro }, AsteriscAbsolutePreState: ctx.String(AsteriscPreStateFlag.Name), AsteriscAbsolutePreStateBaseURL: asteriscPreStatesURL, - TxMgrConfig: txMgrConfig, - MetricsConfig: metricsConfig, - PprofConfig: pprofConfig, - SelectiveClaimResolution: ctx.Bool(SelectiveClaimResolutionFlag.Name), - AllowInvalidPrestate: ctx.Bool(UnsafeAllowInvalidPrestate.Name), + AsteriscKona: vm.Config{ + VmType: types.TraceTypeAsteriscKona, + L1: l1EthRpc, + L1Beacon: l1Beacon, + L2: l2Rpc, + VmBin: ctx.String(AsteriscBinFlag.Name), + Server: ctx.String(AsteriscKonaServerFlag.Name), + Network: asteriscNetwork, + RollupConfigPath: ctx.String(AsteriscRollupConfigFlag.Name), + L2GenesisPath: ctx.String(AsteriscL2GenesisFlag.Name), + SnapshotFreq: ctx.Uint(AsteriscSnapshotFreqFlag.Name), + InfoFreq: ctx.Uint(AsteriscInfoFreqFlag.Name), + }, + AsteriscKonaAbsolutePreState: ctx.String(AsteriscKonaPreStateFlag.Name), + AsteriscKonaAbsolutePreStateBaseURL: asteriscKonaPreStatesURL, + TxMgrConfig: txMgrConfig, + MetricsConfig: metricsConfig, + PprofConfig: pprofConfig, + SelectiveClaimResolution: ctx.Bool(SelectiveClaimResolutionFlag.Name), + AllowInvalidPrestate: ctx.Bool(UnsafeAllowInvalidPrestate.Name), }, nil } diff --git a/op-challenger/game/fault/register.go b/op-challenger/game/fault/register.go index 7009a7b934b5..f8bac805c658 100644 --- a/op-challenger/game/fault/register.go +++ b/op-challenger/game/fault/register.go @@ -14,6 +14,7 @@ import ( "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/outputs" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/prestates" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/vm" faultTypes "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" keccakTypes "github.com/ethereum-optimism/optimism/op-challenger/game/keccak/types" "github.com/ethereum-optimism/optimism/op-challenger/game/scheduler" @@ -74,20 +75,29 @@ func RegisterGameTypes( syncValidator := newSyncStatusValidator(rollupClient) if cfg.TraceTypeEnabled(faultTypes.TraceTypeCannon) { - if err := registerCannon(faultTypes.CannonGameType, registry, oracles, ctx, systemClock, l1Clock, logger, m, cfg, syncValidator, rollupClient, txSender, gameFactory, caller, l2Client, l1HeaderSource, selective, claimants); err != nil { + vmConfig := vm.NewOpProgramVmConfig() + if err := registerCannon(faultTypes.CannonGameType, registry, oracles, ctx, systemClock, l1Clock, logger, m, cfg, vmConfig, syncValidator, rollupClient, txSender, gameFactory, caller, l2Client, l1HeaderSource, selective, claimants); err != nil { return nil, fmt.Errorf("failed to register cannon game type: %w", err) } } if cfg.TraceTypeEnabled(faultTypes.TraceTypePermissioned) { - if err := registerCannon(faultTypes.PermissionedGameType, registry, oracles, ctx, systemClock, l1Clock, logger, m, cfg, syncValidator, rollupClient, txSender, gameFactory, caller, l2Client, l1HeaderSource, selective, claimants); err != nil { + vmConfig := vm.NewOpProgramVmConfig() + if err := registerCannon(faultTypes.PermissionedGameType, registry, oracles, ctx, systemClock, l1Clock, logger, m, cfg, vmConfig, syncValidator, rollupClient, txSender, gameFactory, caller, l2Client, l1HeaderSource, selective, claimants); err != nil { return nil, fmt.Errorf("failed to register permissioned cannon game type: %w", err) } } if cfg.TraceTypeEnabled(faultTypes.TraceTypeAsterisc) { - if err := registerAsterisc(faultTypes.AsteriscGameType, registry, oracles, ctx, systemClock, l1Clock, logger, m, cfg, syncValidator, rollupClient, txSender, gameFactory, caller, l2Client, l1HeaderSource, selective, claimants); err != nil { + vmConfig := vm.NewOpProgramVmConfig() + if err := registerAsterisc(faultTypes.AsteriscGameType, registry, oracles, ctx, systemClock, l1Clock, logger, m, cfg, vmConfig, syncValidator, rollupClient, txSender, gameFactory, caller, l2Client, l1HeaderSource, selective, claimants); err != nil { return nil, fmt.Errorf("failed to register asterisc game type: %w", err) } } + if cfg.TraceTypeEnabled(faultTypes.TraceTypeAsteriscKona) { + vmConfig := vm.NewKonaVmConfig() + if err := registerAsterisc(faultTypes.AsteriscKonaGameType, registry, oracles, ctx, systemClock, l1Clock, logger, m, cfg, vmConfig, syncValidator, rollupClient, txSender, gameFactory, caller, l2Client, l1HeaderSource, selective, claimants); err != nil { + return nil, fmt.Errorf("failed to register asterisc kona game type: %w", err) + } + } if cfg.TraceTypeEnabled(faultTypes.TraceTypeFast) { if err := registerAlphabet(faultTypes.FastGameType, registry, oracles, ctx, systemClock, l1Clock, logger, m, syncValidator, rollupClient, l2Client, txSender, gameFactory, caller, l1HeaderSource, selective, claimants); err != nil { return nil, fmt.Errorf("failed to register fast game type: %w", err) @@ -194,6 +204,7 @@ func registerAsterisc( logger log.Logger, m metrics.Metricer, cfg *config.Config, + vmCfg vm.OracleServerExecutor, syncValidator SyncValidator, rollupClient outputs.OutputRollupClient, txSender TxSender, @@ -249,7 +260,7 @@ func registerAsterisc( if err != nil { return nil, fmt.Errorf("failed to get asterisc prestate: %w", err) } - accessor, err := outputs.NewOutputAsteriscTraceAccessor(logger, m, cfg.Asterisc, l2Client, prestateProvider, asteriscPrestate, rollupClient, dir, l1HeadID, splitDepth, prestateBlock, poststateBlock) + accessor, err := outputs.NewOutputAsteriscTraceAccessor(logger, m, cfg.Asterisc, vmCfg, l2Client, prestateProvider, asteriscPrestate, rollupClient, dir, l1HeadID, splitDepth, prestateBlock, poststateBlock) if err != nil { return nil, err } @@ -282,6 +293,7 @@ func registerCannon( logger log.Logger, m metrics.Metricer, cfg *config.Config, + vmCfg vm.OracleServerExecutor, syncValidator SyncValidator, rollupClient outputs.OutputRollupClient, txSender TxSender, @@ -311,7 +323,6 @@ func registerCannon( } cannonPrestateProvider, err := prestateProviderCache.GetOrCreate(requiredPrestatehash) - if err != nil { return nil, fmt.Errorf("required prestate %v not available for game %v: %w", requiredPrestatehash, game.Proxy, err) } @@ -339,7 +350,7 @@ func registerCannon( if err != nil { return nil, fmt.Errorf("failed to get cannon prestate: %w", err) } - accessor, err := outputs.NewOutputCannonTraceAccessor(logger, m, cfg.Cannon, l2Client, prestateProvider, cannonPrestate, rollupClient, dir, l1HeadID, splitDepth, prestateBlock, poststateBlock) + accessor, err := outputs.NewOutputCannonTraceAccessor(logger, m, cfg.Cannon, vmCfg, l2Client, prestateProvider, cannonPrestate, rollupClient, dir, l1HeadID, splitDepth, prestateBlock, poststateBlock) if err != nil { return nil, err } diff --git a/op-challenger/game/fault/trace/asterisc/provider.go b/op-challenger/game/fault/trace/asterisc/provider.go index 5c481777b6ce..8caa8a2b0a4e 100644 --- a/op-challenger/game/fault/trace/asterisc/provider.go +++ b/op-challenger/game/fault/trace/asterisc/provider.go @@ -35,12 +35,12 @@ type AsteriscTraceProvider struct { lastStep uint64 } -func NewTraceProvider(logger log.Logger, m vm.Metricer, cfg vm.Config, prestateProvider types.PrestateProvider, asteriscPrestate string, localInputs utils.LocalGameInputs, dir string, gameDepth types.Depth) *AsteriscTraceProvider { +func NewTraceProvider(logger log.Logger, m vm.Metricer, cfg vm.Config, vmCfg vm.OracleServerExecutor, prestateProvider types.PrestateProvider, asteriscPrestate string, localInputs utils.LocalGameInputs, dir string, gameDepth types.Depth) *AsteriscTraceProvider { return &AsteriscTraceProvider{ logger: logger, dir: dir, prestate: asteriscPrestate, - generator: vm.NewExecutor(logger, m, cfg, asteriscPrestate, localInputs), + generator: vm.NewExecutor(logger, m, cfg, vmCfg, asteriscPrestate, localInputs), gameDepth: gameDepth, preimageLoader: utils.NewPreimageLoader(kvstore.NewDiskKV(vm.PreimageDir(dir)).Get), PrestateProvider: prestateProvider, @@ -177,7 +177,7 @@ func NewTraceProviderForTest(logger log.Logger, m vm.Metricer, cfg *config.Confi logger: logger, dir: dir, prestate: cfg.AsteriscAbsolutePreState, - generator: vm.NewExecutor(logger, m, cfg.Asterisc, cfg.AsteriscAbsolutePreState, localInputs), + generator: vm.NewExecutor(logger, m, cfg.Asterisc, vm.NewOpProgramVmConfig(), cfg.AsteriscAbsolutePreState, localInputs), gameDepth: gameDepth, preimageLoader: utils.NewPreimageLoader(kvstore.NewDiskKV(vm.PreimageDir(dir)).Get), } diff --git a/op-challenger/game/fault/trace/cannon/provider.go b/op-challenger/game/fault/trace/cannon/provider.go index 2db146829a0a..9be1cf63deea 100644 --- a/op-challenger/game/fault/trace/cannon/provider.go +++ b/op-challenger/game/fault/trace/cannon/provider.go @@ -38,12 +38,12 @@ type CannonTraceProvider struct { lastStep uint64 } -func NewTraceProvider(logger log.Logger, m vm.Metricer, cfg vm.Config, prestateProvider types.PrestateProvider, prestate string, localInputs utils.LocalGameInputs, dir string, gameDepth types.Depth) *CannonTraceProvider { +func NewTraceProvider(logger log.Logger, m vm.Metricer, cfg vm.Config, vmCfg vm.OracleServerExecutor, prestateProvider types.PrestateProvider, prestate string, localInputs utils.LocalGameInputs, dir string, gameDepth types.Depth) *CannonTraceProvider { return &CannonTraceProvider{ logger: logger, dir: dir, prestate: prestate, - generator: vm.NewExecutor(logger, m, cfg, prestate, localInputs), + generator: vm.NewExecutor(logger, m, cfg, vmCfg, prestate, localInputs), gameDepth: gameDepth, preimageLoader: utils.NewPreimageLoader(kvstore.NewDiskKV(vm.PreimageDir(dir)).Get), PrestateProvider: prestateProvider, @@ -181,7 +181,7 @@ func NewTraceProviderForTest(logger log.Logger, m vm.Metricer, cfg *config.Confi logger: logger, dir: dir, prestate: cfg.CannonAbsolutePreState, - generator: vm.NewExecutor(logger, m, cfg.Cannon, cfg.CannonAbsolutePreState, localInputs), + generator: vm.NewExecutor(logger, m, cfg.Cannon, vm.NewOpProgramVmConfig(), cfg.CannonAbsolutePreState, localInputs), gameDepth: gameDepth, preimageLoader: utils.NewPreimageLoader(kvstore.NewDiskKV(vm.PreimageDir(dir)).Get), } diff --git a/op-challenger/game/fault/trace/outputs/output_asterisc.go b/op-challenger/game/fault/trace/outputs/output_asterisc.go index ac129dbb26c8..726b57e551d7 100644 --- a/op-challenger/game/fault/trace/outputs/output_asterisc.go +++ b/op-challenger/game/fault/trace/outputs/output_asterisc.go @@ -22,6 +22,7 @@ func NewOutputAsteriscTraceAccessor( logger log.Logger, m metrics.Metricer, cfg vm.Config, + vmCfg vm.OracleServerExecutor, l2Client utils.L2HeaderSource, prestateProvider types.PrestateProvider, asteriscPrestate string, @@ -40,7 +41,7 @@ func NewOutputAsteriscTraceAccessor( if err != nil { return nil, fmt.Errorf("failed to fetch asterisc local inputs: %w", err) } - provider := asterisc.NewTraceProvider(logger, m, cfg, prestateProvider, asteriscPrestate, localInputs, subdir, depth) + provider := asterisc.NewTraceProvider(logger, m, cfg, vmCfg, prestateProvider, asteriscPrestate, localInputs, subdir, depth) return provider, nil } diff --git a/op-challenger/game/fault/trace/outputs/output_cannon.go b/op-challenger/game/fault/trace/outputs/output_cannon.go index ecc710380bfb..521b35b1e92e 100644 --- a/op-challenger/game/fault/trace/outputs/output_cannon.go +++ b/op-challenger/game/fault/trace/outputs/output_cannon.go @@ -22,6 +22,7 @@ func NewOutputCannonTraceAccessor( logger log.Logger, m metrics.Metricer, cfg vm.Config, + vmCfg vm.OracleServerExecutor, l2Client utils.L2HeaderSource, prestateProvider types.PrestateProvider, cannonPrestate string, @@ -40,7 +41,7 @@ func NewOutputCannonTraceAccessor( if err != nil { return nil, fmt.Errorf("failed to fetch cannon local inputs: %w", err) } - provider := cannon.NewTraceProvider(logger, m, cfg, prestateProvider, cannonPrestate, localInputs, subdir, depth) + provider := cannon.NewTraceProvider(logger, m, cfg, vmCfg, prestateProvider, cannonPrestate, localInputs, subdir, depth) return provider, nil } diff --git a/op-challenger/game/fault/trace/vm/executor.go b/op-challenger/game/fault/trace/vm/executor.go index 08fac9878cac..9d76b6298b0c 100644 --- a/op-challenger/game/fault/trace/vm/executor.go +++ b/op-challenger/game/fault/trace/vm/executor.go @@ -27,22 +27,30 @@ type Metricer interface { } type Config struct { - VmType types.TraceType + // VM Configuration + VmType types.TraceType + VmBin string // Path to the vm executable to run when generating trace data + SnapshotFreq uint // Frequency of snapshots to create when executing (in VM instructions) + InfoFreq uint // Frequency of progress log messages (in VM instructions) + DebugInfo bool + + // Host Configuration L1 string L1Beacon string L2 string - VmBin string // Path to the vm executable to run when generating trace data Server string // Path to the executable that provides the pre-image oracle server Network string RollupConfigPath string L2GenesisPath string - SnapshotFreq uint // Frequency of snapshots to create when executing (in VM instructions) - InfoFreq uint // Frequency of progress log messages (in VM instructions) - DebugInfo bool +} + +type OracleServerExecutor interface { + OracleCommand(cfg Config, dataDir string, inputs utils.LocalGameInputs) ([]string, error) } type Executor struct { cfg Config + oracleServer OracleServerExecutor logger log.Logger metrics Metricer absolutePreState string @@ -51,9 +59,10 @@ type Executor struct { cmdExecutor CmdExecutor } -func NewExecutor(logger log.Logger, m Metricer, cfg Config, prestate string, inputs utils.LocalGameInputs) *Executor { +func NewExecutor(logger log.Logger, m Metricer, cfg Config, oracleServer OracleServerExecutor, prestate string, inputs utils.LocalGameInputs) *Executor { return &Executor{ cfg: cfg, + oracleServer: oracleServer, logger: logger, metrics: m, inputs: inputs, @@ -98,28 +107,12 @@ func (e *Executor) DoGenerateProof(ctx context.Context, dir string, begin uint64 args = append(args, "--debug-info", filepath.Join(dataDir, debugFilename)) } args = append(args, extraVmArgs...) - args = append(args, - "--", - e.cfg.Server, "--server", - "--l1", e.cfg.L1, - "--l1.beacon", e.cfg.L1Beacon, - "--l2", e.cfg.L2, - "--datadir", dataDir, - "--l1.head", e.inputs.L1Head.Hex(), - "--l2.head", e.inputs.L2Head.Hex(), - "--l2.outputroot", e.inputs.L2OutputRoot.Hex(), - "--l2.claim", e.inputs.L2Claim.Hex(), - "--l2.blocknumber", e.inputs.L2BlockNumber.Text(10), - ) - if e.cfg.Network != "" { - args = append(args, "--network", e.cfg.Network) - } - if e.cfg.RollupConfigPath != "" { - args = append(args, "--rollup.config", e.cfg.RollupConfigPath) - } - if e.cfg.L2GenesisPath != "" { - args = append(args, "--l2.genesis", e.cfg.L2GenesisPath) + args = append(args, "--") + oracleArgs, err := e.oracleServer.OracleCommand(e.cfg, dataDir, e.inputs) + if err != nil { + return err } + args = append(args, oracleArgs...) if err := os.MkdirAll(snapshotDir, 0755); err != nil { return fmt.Errorf("could not create snapshot directory %v: %w", snapshotDir, err) diff --git a/op-challenger/game/fault/trace/vm/executor_test.go b/op-challenger/game/fault/trace/vm/executor_test.go index 00078bd2078e..14496e769b06 100644 --- a/op-challenger/game/fault/trace/vm/executor_test.go +++ b/op-challenger/game/fault/trace/vm/executor_test.go @@ -42,7 +42,7 @@ func TestGenerateProof(t *testing.T) { } captureExec := func(t *testing.T, cfg Config, proofAt uint64) (string, string, map[string]string) { m := &stubVmMetrics{} - executor := NewExecutor(testlog.Logger(t, log.LevelInfo), m, cfg, prestate, inputs) + executor := NewExecutor(testlog.Logger(t, log.LevelInfo), m, cfg, NewOpProgramVmConfig(), prestate, inputs) executor.selectSnapshot = func(logger log.Logger, dir string, absolutePreState string, i uint64) (string, error) { return input, nil } diff --git a/op-challenger/game/fault/trace/vm/kona_vm_config.go b/op-challenger/game/fault/trace/vm/kona_vm_config.go new file mode 100644 index 000000000000..919375e6a2c1 --- /dev/null +++ b/op-challenger/game/fault/trace/vm/kona_vm_config.go @@ -0,0 +1,39 @@ +package vm + +import ( + "errors" + "strconv" + + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils" + "github.com/ethereum-optimism/optimism/op-node/chaincfg" +) + +type KonaVmConfig struct { +} + +var _ OracleServerExecutor = (*KonaVmConfig)(nil) + +func NewKonaVmConfig() *KonaVmConfig { + return &KonaVmConfig{} +} + +func (s *KonaVmConfig) OracleCommand(cfg Config, dataDir string, inputs utils.LocalGameInputs) ([]string, error) { + if cfg.Network == "" { + return nil, errors.New("network is not defined") + } + + chainCfg := chaincfg.ChainByName(cfg.Network) + return []string{ + cfg.Server, "--server", + "--l1-node-address", cfg.L1, + "--l1-beacon-address", cfg.L1Beacon, + "--l2-node-address", cfg.L2, + "--data-dir", dataDir, + "--l2-chain-id", strconv.FormatUint(chainCfg.ChainID, 10), + "--l1-head", inputs.L1Head.Hex(), + "--l2-head", inputs.L2Head.Hex(), + "--l2-output-root", inputs.L2OutputRoot.Hex(), + "--l2-claim", inputs.L2Claim.Hex(), + "--l2-block-number", inputs.L2BlockNumber.Text(10), + }, nil +} diff --git a/op-challenger/game/fault/trace/vm/kona_vm_config_test.go b/op-challenger/game/fault/trace/vm/kona_vm_config_test.go new file mode 100644 index 000000000000..4e6662946799 --- /dev/null +++ b/op-challenger/game/fault/trace/vm/kona_vm_config_test.go @@ -0,0 +1,45 @@ +package vm + +import ( + "math/big" + "slices" + "testing" + + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestKonaFillHostCommand(t *testing.T) { + dir := "mockdir" + cfg := Config{ + L1: "http://localhost:8888", + L1Beacon: "http://localhost:9000", + L2: "http://localhost:9999", + Server: "./bin/mockserver", + Network: "op-mainnet", + } + inputs := utils.LocalGameInputs{ + L1Head: common.Hash{0x11}, + L2Head: common.Hash{0x22}, + L2OutputRoot: common.Hash{0x33}, + L2Claim: common.Hash{0x44}, + L2BlockNumber: big.NewInt(3333), + } + vmConfig := NewKonaVmConfig() + + args, err := vmConfig.OracleCommand(cfg, dir, inputs) + require.NoError(t, err) + + require.True(t, slices.Contains(args, "--server")) + require.True(t, slices.Contains(args, "--l1-node-address")) + require.True(t, slices.Contains(args, "--l1-beacon-address")) + require.True(t, slices.Contains(args, "--l2-node-address")) + require.True(t, slices.Contains(args, "--data-dir")) + require.True(t, slices.Contains(args, "--l2-chain-id")) + require.True(t, slices.Contains(args, "--l1-head")) + require.True(t, slices.Contains(args, "--l2-head")) + require.True(t, slices.Contains(args, "--l2-output-root")) + require.True(t, slices.Contains(args, "--l2-claim")) + require.True(t, slices.Contains(args, "--l2-block-number")) +} diff --git a/op-challenger/game/fault/trace/vm/op_program_vm_config.go b/op-challenger/game/fault/trace/vm/op_program_vm_config.go new file mode 100644 index 000000000000..9cf04ef5b46a --- /dev/null +++ b/op-challenger/game/fault/trace/vm/op_program_vm_config.go @@ -0,0 +1,39 @@ +package vm + +import ( + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils" +) + +type OpProgramVmConfig struct { +} + +var _ OracleServerExecutor = (*OpProgramVmConfig)(nil) + +func NewOpProgramVmConfig() *OpProgramVmConfig { + return &OpProgramVmConfig{} +} + +func (s *OpProgramVmConfig) OracleCommand(cfg Config, dataDir string, inputs utils.LocalGameInputs) ([]string, error) { + args := []string{ + cfg.Server, "--server", + "--l1", cfg.L1, + "--l1.beacon", cfg.L1Beacon, + "--l2", cfg.L2, + "--datadir", dataDir, + "--l1.head", inputs.L1Head.Hex(), + "--l2.head", inputs.L2Head.Hex(), + "--l2.outputroot", inputs.L2OutputRoot.Hex(), + "--l2.claim", inputs.L2Claim.Hex(), + "--l2.blocknumber", inputs.L2BlockNumber.Text(10), + } + if cfg.Network != "" { + args = append(args, "--network", cfg.Network) + } + if cfg.RollupConfigPath != "" { + args = append(args, "--rollup.config", cfg.RollupConfigPath) + } + if cfg.L2GenesisPath != "" { + args = append(args, "--l2.genesis", cfg.L2GenesisPath) + } + return args, nil +} diff --git a/op-challenger/game/fault/trace/vm/op_program_vm_config_test.go b/op-challenger/game/fault/trace/vm/op_program_vm_config_test.go new file mode 100644 index 000000000000..7279daa142be --- /dev/null +++ b/op-challenger/game/fault/trace/vm/op_program_vm_config_test.go @@ -0,0 +1,98 @@ +package vm + +import ( + "math/big" + "slices" + "testing" + + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestOpProgramFillHostCommand(t *testing.T) { + dir := "mockdir" + cfg := Config{ + L1: "http://localhost:8888", + L1Beacon: "http://localhost:9000", + L2: "http://localhost:9999", + Server: "./bin/mockserver", + } + inputs := utils.LocalGameInputs{ + L1Head: common.Hash{0x11}, + L2Head: common.Hash{0x22}, + L2OutputRoot: common.Hash{0x33}, + L2Claim: common.Hash{0x44}, + L2BlockNumber: big.NewInt(3333), + } + + validateStandard := func(t *testing.T, args []string) { + require.True(t, slices.Contains(args, "--server")) + require.True(t, slices.Contains(args, "--l1")) + require.True(t, slices.Contains(args, "--l1.beacon")) + require.True(t, slices.Contains(args, "--l2")) + require.True(t, slices.Contains(args, "--datadir")) + require.True(t, slices.Contains(args, "--l1.head")) + require.True(t, slices.Contains(args, "--l2.head")) + require.True(t, slices.Contains(args, "--l2.outputroot")) + require.True(t, slices.Contains(args, "--l2.claim")) + require.True(t, slices.Contains(args, "--l2.blocknumber")) + } + + t.Run("NoExtras", func(t *testing.T) { + vmConfig := NewOpProgramVmConfig() + + args, err := vmConfig.OracleCommand(cfg, dir, inputs) + require.NoError(t, err) + + validateStandard(t, args) + }) + + t.Run("WithNetwork", func(t *testing.T) { + cfg.Network = "op-test" + vmConfig := NewOpProgramVmConfig() + + args, err := vmConfig.OracleCommand(cfg, dir, inputs) + require.NoError(t, err) + + validateStandard(t, args) + require.True(t, slices.Contains(args, "--network")) + }) + + t.Run("WithRollupConfigPath", func(t *testing.T) { + cfg.RollupConfigPath = "rollup.config" + vmConfig := NewOpProgramVmConfig() + + args, err := vmConfig.OracleCommand(cfg, dir, inputs) + require.NoError(t, err) + + validateStandard(t, args) + require.True(t, slices.Contains(args, "--rollup.config")) + }) + + t.Run("WithL2GenesisPath", func(t *testing.T) { + cfg.L2GenesisPath = "l2.genesis" + vmConfig := NewOpProgramVmConfig() + + args, err := vmConfig.OracleCommand(cfg, dir, inputs) + require.NoError(t, err) + + validateStandard(t, args) + require.True(t, slices.Contains(args, "--l2.genesis")) + }) + + t.Run("WithAllExtras", func(t *testing.T) { + cfg.Network = "op-test" + cfg.RollupConfigPath = "rollup.config" + cfg.L2GenesisPath = "l2.genesis" + vmConfig := NewOpProgramVmConfig() + + args, err := vmConfig.OracleCommand(cfg, dir, inputs) + require.NoError(t, err) + + validateStandard(t, args) + require.True(t, slices.Contains(args, "--network")) + require.True(t, slices.Contains(args, "--rollup.config")) + require.True(t, slices.Contains(args, "--l2.genesis")) + }) +} diff --git a/op-challenger/game/fault/types/types.go b/op-challenger/game/fault/types/types.go index aca80577b36a..d1d887910de8 100644 --- a/op-challenger/game/fault/types/types.go +++ b/op-challenger/game/fault/types/types.go @@ -26,6 +26,7 @@ const ( CannonGameType GameType = 0 PermissionedGameType GameType = 1 AsteriscGameType GameType = 2 + AsteriscKonaGameType GameType = 3 FastGameType GameType = 254 AlphabetGameType GameType = 255 UnknownGameType GameType = math.MaxUint32 @@ -43,6 +44,8 @@ func (t GameType) String() string { return "permissioned" case AsteriscGameType: return "asterisc" + case AsteriscKonaGameType: + return "asterisc-kona" case FastGameType: return "fast" case AlphabetGameType: @@ -59,6 +62,7 @@ const ( TraceTypeFast TraceType = "fast" TraceTypeCannon TraceType = "cannon" TraceTypeAsterisc TraceType = "asterisc" + TraceTypeAsteriscKona TraceType = "asterisc-kona" TraceTypePermissioned TraceType = "permissioned" ) diff --git a/op-challenger/runner/factory.go b/op-challenger/runner/factory.go index 009e379169ed..2840d25a82c2 100644 --- a/op-challenger/runner/factory.go +++ b/op-challenger/runner/factory.go @@ -28,19 +28,29 @@ func createTraceProvider( ) (types.TraceProvider, error) { switch traceType { case types.TraceTypeCannon: + vmConfig := vm.NewOpProgramVmConfig() prestate, err := getPrestate(prestateHash, cfg.CannonAbsolutePreStateBaseURL, cfg.CannonAbsolutePreState, dir) if err != nil { return nil, err } prestateProvider := cannon.NewPrestateProvider(prestate) - return cannon.NewTraceProvider(logger, m, cfg.Cannon, prestateProvider, prestate, localInputs, dir, 42), nil + return cannon.NewTraceProvider(logger, m, cfg.Cannon, vmConfig, prestateProvider, prestate, localInputs, dir, 42), nil case types.TraceTypeAsterisc: + vmConfig := vm.NewOpProgramVmConfig() prestate, err := getPrestate(prestateHash, cfg.AsteriscAbsolutePreStateBaseURL, cfg.AsteriscAbsolutePreState, dir) if err != nil { return nil, err } prestateProvider := asterisc.NewPrestateProvider(prestate) - return asterisc.NewTraceProvider(logger, m, cfg.Asterisc, prestateProvider, prestate, localInputs, dir, 42), nil + return asterisc.NewTraceProvider(logger, m, cfg.Asterisc, vmConfig, prestateProvider, prestate, localInputs, dir, 42), nil + case types.TraceTypeAsteriscKona: + vmConfig := vm.NewKonaVmConfig() + prestate, err := getPrestate(prestateHash, cfg.AsteriscAbsolutePreStateBaseURL, cfg.AsteriscAbsolutePreState, dir) + if err != nil { + return nil, err + } + prestateProvider := asterisc.NewPrestateProvider(prestate) + return asterisc.NewTraceProvider(logger, m, cfg.Asterisc, vmConfig, prestateProvider, prestate, localInputs, dir, 42), nil } return nil, errors.New("invalid trace type") } diff --git a/op-e2e/e2eutils/disputegame/output_cannon_helper.go b/op-e2e/e2eutils/disputegame/output_cannon_helper.go index e2f72c4915d9..7053ee5bbc8a 100644 --- a/op-e2e/e2eutils/disputegame/output_cannon_helper.go +++ b/op-e2e/e2eutils/disputegame/output_cannon_helper.go @@ -14,6 +14,7 @@ import ( "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/outputs" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/split" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/vm" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" "github.com/ethereum-optimism/optimism/op-challenger/metrics" "github.com/ethereum-optimism/optimism/op-e2e/bindings" @@ -62,7 +63,7 @@ func (g *OutputCannonGameHelper) CreateHonestActor(ctx context.Context, l2Node s prestateProvider := outputs.NewPrestateProvider(rollupClient, prestateBlock) l1Head := g.GetL1Head(ctx) accessor, err := outputs.NewOutputCannonTraceAccessor( - logger, metrics.NoopMetrics, cfg.Cannon, l2Client, prestateProvider, cfg.CannonAbsolutePreState, rollupClient, dir, l1Head, splitDepth, prestateBlock, poststateBlock) + logger, metrics.NoopMetrics, cfg.Cannon, vm.NewOpProgramVmConfig(), l2Client, prestateProvider, cfg.CannonAbsolutePreState, rollupClient, dir, l1Head, splitDepth, prestateBlock, poststateBlock) g.Require.NoError(err, "Failed to create output cannon trace accessor") return NewOutputHonestHelper(g.T, g.Require, &g.OutputGameHelper, g.Game, accessor) } diff --git a/op-e2e/faultproofs/precompile_test.go b/op-e2e/faultproofs/precompile_test.go index ed08c3ea582b..8741e7ee8102 100644 --- a/op-e2e/faultproofs/precompile_test.go +++ b/op-e2e/faultproofs/precompile_test.go @@ -146,7 +146,7 @@ func runCannon(t *testing.T, ctx context.Context, sys *op_e2e.System, inputs uti cannonOpts(&cfg) logger := testlog.Logger(t, log.LevelInfo).New("role", "cannon") - executor := vm.NewExecutor(logger, metrics.NoopMetrics, cfg.Cannon, cfg.CannonAbsolutePreState, inputs) + executor := vm.NewExecutor(logger, metrics.NoopMetrics, cfg.Cannon, vm.NewOpProgramVmConfig(), cfg.CannonAbsolutePreState, inputs) t.Log("Running cannon") err := executor.DoGenerateProof(ctx, proofsDir, math.MaxUint, math.MaxUint, extraVmArgs...) From 8741423ea1d5bd9080583783342d15ccde688ea9 Mon Sep 17 00:00:00 2001 From: Sebastian Stammler Date: Tue, 6 Aug 2024 23:36:22 +0200 Subject: [PATCH 23/59] op-e2e: Fix GraniteSystemConfig (#11361) --- op-e2e/setup.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/op-e2e/setup.go b/op-e2e/setup.go index cac85da91ee6..b7c97c435e93 100644 --- a/op-e2e/setup.go +++ b/op-e2e/setup.go @@ -216,7 +216,7 @@ func FjordSystemConfig(t *testing.T, fjordTimeOffset *hexutil.Uint64) SystemConf } func GraniteSystemConfig(t *testing.T, graniteTimeOffset *hexutil.Uint64) SystemConfig { - cfg := EcotoneSystemConfig(t, &genesisTime) + cfg := FjordSystemConfig(t, &genesisTime) cfg.DeployConfig.L2GenesisGraniteTimeOffset = graniteTimeOffset return cfg } From e6dd1ee95cb499dc3120103e407ae40be19586d1 Mon Sep 17 00:00:00 2001 From: Inphi Date: Tue, 6 Aug 2024 15:30:05 -0700 Subject: [PATCH 24/59] update sepolia-devnet-0 deploy-config (#11371) --- packages/contracts-bedrock/deploy-config/sepolia-devnet-0.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/contracts-bedrock/deploy-config/sepolia-devnet-0.json b/packages/contracts-bedrock/deploy-config/sepolia-devnet-0.json index afb31e6b86ad..7dd5df431cd1 100644 --- a/packages/contracts-bedrock/deploy-config/sepolia-devnet-0.json +++ b/packages/contracts-bedrock/deploy-config/sepolia-devnet-0.json @@ -66,7 +66,7 @@ "eip1559Denominator": 250, "eip1559DenominatorCanyon": 250, "systemConfigStartBlock": 4071248, - "faultGameAbsolutePrestate": "0x03e69d3de5155f4a80da99dd534561cbddd4f9dd56c9ecc704d6886625711d2b", + "faultGameAbsolutePrestate": "0x0385c3f8ee78491001d92b90b07d0cf387b7b52ab9b83b4d87c994e92cf823ba", "faultGameMaxDepth": 73, "faultGameClockExtension": 3600, "faultGameMaxClockDuration": 14400, From 79c8fe8327d6cd32b2d40a45eca8207206de6c6f Mon Sep 17 00:00:00 2001 From: protolambda Date: Tue, 6 Aug 2024 18:23:19 -0600 Subject: [PATCH 25/59] cannon: move example test programs into testdata directory to prevent Go tool noise (#11379) --- .circleci/config.yml | 2 +- cannon/.gitignore | 2 +- cannon/Makefile | 2 +- cannon/README.md | 2 +- cannon/mipsevm/multithreaded/instrumented_test.go | 4 ++-- cannon/mipsevm/multithreaded/state_test.go | 2 +- cannon/mipsevm/singlethreaded/state_test.go | 2 +- cannon/mipsevm/tests/evm_test.go | 4 ++-- cannon/mipsevm/testutil/vmtests.go | 4 ++-- cannon/testdata/README.md | 11 +++++++++++ cannon/{ => testdata}/example/Makefile | 0 cannon/{ => testdata}/example/alloc/go.mod | 2 +- cannon/{ => testdata}/example/alloc/go.sum | 0 cannon/{ => testdata}/example/alloc/main.go | 0 cannon/{ => testdata}/example/claim/go.mod | 2 +- cannon/{ => testdata}/example/claim/go.sum | 0 cannon/{ => testdata}/example/claim/main.go | 0 cannon/{ => testdata}/example/hello/go.mod | 0 cannon/{ => testdata}/example/hello/main.go | 0 cannon/{ => testdata}/example/multithreaded/go.mod | 0 cannon/{ => testdata}/example/multithreaded/main.go | 0 21 files changed, 25 insertions(+), 14 deletions(-) create mode 100644 cannon/testdata/README.md rename cannon/{ => testdata}/example/Makefile (100%) rename cannon/{ => testdata}/example/alloc/go.mod (98%) rename cannon/{ => testdata}/example/alloc/go.sum (100%) rename cannon/{ => testdata}/example/alloc/main.go (100%) rename cannon/{ => testdata}/example/claim/go.mod (98%) rename cannon/{ => testdata}/example/claim/go.sum (100%) rename cannon/{ => testdata}/example/claim/main.go (100%) rename cannon/{ => testdata}/example/hello/go.mod (100%) rename cannon/{ => testdata}/example/hello/main.go (100%) rename cannon/{ => testdata}/example/multithreaded/go.mod (100%) rename cannon/{ => testdata}/example/multithreaded/main.go (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6931718f4879..81de1bab202c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -137,7 +137,7 @@ jobs: - run: name: build Cannon example binaries command: make elf # only compile ELF binaries with Go, we do not have MIPS GCC for creating the debug-dumps. - working_directory: cannon/example + working_directory: cannon/testdata/example - run: name: Cannon Go lint command: | diff --git a/cannon/.gitignore b/cannon/.gitignore index fc1a1f3b9949..c3e45199f0ed 100644 --- a/cannon/.gitignore +++ b/cannon/.gitignore @@ -5,7 +5,7 @@ cache venv .idea *.log -example/bin +testdata/example/bin contracts/out state.json *.json diff --git a/cannon/Makefile b/cannon/Makefile index f815b9f37474..0240b7df095f 100644 --- a/cannon/Makefile +++ b/cannon/Makefile @@ -20,7 +20,7 @@ clean: rm -rf bin elf: - make -C ./example elf + make -C ./testdata/example elf contract: cd ../packages/contracts-bedrock && forge build diff --git a/cannon/README.md b/cannon/README.md index 5ff497162f33..e9e751ce2ffe 100644 --- a/cannon/README.md +++ b/cannon/README.md @@ -83,7 +83,7 @@ The smart-contracts are integrated into the Optimism monorepo contracts: Example programs that can be run and proven with Cannon. Optional dependency, but required for `mipsevm` Go tests. -See [`example/Makefile`](./example/Makefile) for building the example MIPS binaries. +See [`testdata/example/Makefile`](./testdata/example/Makefile) for building the example MIPS binaries. ## License diff --git a/cannon/mipsevm/multithreaded/instrumented_test.go b/cannon/mipsevm/multithreaded/instrumented_test.go index 50382ae18536..c20126d3ca22 100644 --- a/cannon/mipsevm/multithreaded/instrumented_test.go +++ b/cannon/mipsevm/multithreaded/instrumented_test.go @@ -32,7 +32,7 @@ func TestInstrumentedState_Claim(t *testing.T) { } func TestInstrumentedState_MultithreadedProgram(t *testing.T) { - state := testutil.LoadELFProgram(t, "../../example/bin/multithreaded.elf", CreateInitialState, false) + state := testutil.LoadELFProgram(t, "../../testdata/example/bin/multithreaded.elf", CreateInitialState, false) oracle := testutil.StaticOracle(t, []byte{}) var stdOutBuf, stdErrBuf bytes.Buffer @@ -56,7 +56,7 @@ func TestInstrumentedState_MultithreadedProgram(t *testing.T) { func TestInstrumentedState_Alloc(t *testing.T) { t.Skip("TODO(client-pod#906): Currently failing - need to debug.") - state := testutil.LoadELFProgram(t, "../../example/bin/alloc.elf", CreateInitialState, false) + state := testutil.LoadELFProgram(t, "../../testdata/example/bin/alloc.elf", CreateInitialState, false) const numAllocs = 100 // where each alloc is a 32 MiB chunk oracle := testutil.AllocOracle(t, numAllocs) diff --git a/cannon/mipsevm/multithreaded/state_test.go b/cannon/mipsevm/multithreaded/state_test.go index e6805423b165..e9dbef2db346 100644 --- a/cannon/mipsevm/multithreaded/state_test.go +++ b/cannon/mipsevm/multithreaded/state_test.go @@ -86,7 +86,7 @@ func TestState_EncodeWitness(t *testing.T) { } func TestState_JSONCodec(t *testing.T) { - elfProgram, err := elf.Open("../../example/bin/hello.elf") + elfProgram, err := elf.Open("../../testdata/example/bin/hello.elf") require.NoError(t, err, "open ELF file") state, err := program.LoadELF(elfProgram, CreateInitialState) require.NoError(t, err, "load ELF into state") diff --git a/cannon/mipsevm/singlethreaded/state_test.go b/cannon/mipsevm/singlethreaded/state_test.go index 2ab4a5009b0e..27588f8b67ed 100644 --- a/cannon/mipsevm/singlethreaded/state_test.go +++ b/cannon/mipsevm/singlethreaded/state_test.go @@ -58,7 +58,7 @@ func TestStateHash(t *testing.T) { } func TestStateJSONCodec(t *testing.T) { - elfProgram, err := elf.Open("../../example/bin/hello.elf") + elfProgram, err := elf.Open("../../testdata/example/bin/hello.elf") require.NoError(t, err, "open ELF file") state, err := program.LoadELF(elfProgram, CreateInitialState) require.NoError(t, err, "load ELF into state") diff --git a/cannon/mipsevm/tests/evm_test.go b/cannon/mipsevm/tests/evm_test.go index 361a924eb34d..f7ca26589c80 100644 --- a/cannon/mipsevm/tests/evm_test.go +++ b/cannon/mipsevm/tests/evm_test.go @@ -427,7 +427,7 @@ func TestHelloEVM(t *testing.T) { evm.SetTracer(tracer) testutil.LogStepFailureAtCleanup(t, evm) - state := testutil.LoadELFProgram(t, "../../example/bin/hello.elf", singlethreaded.CreateInitialState, true) + state := testutil.LoadELFProgram(t, "../../testdata/example/bin/hello.elf", singlethreaded.CreateInitialState, true) var stdOutBuf, stdErrBuf bytes.Buffer goState := singlethreaded.NewInstrumentedState(state, nil, io.MultiWriter(&stdOutBuf, os.Stdout), io.MultiWriter(&stdErrBuf, os.Stderr), nil) @@ -469,7 +469,7 @@ func TestClaimEVM(t *testing.T) { evm.SetTracer(tracer) testutil.LogStepFailureAtCleanup(t, evm) - state := testutil.LoadELFProgram(t, "../../example/bin/claim.elf", singlethreaded.CreateInitialState, true) + state := testutil.LoadELFProgram(t, "../../testdata/example/bin/claim.elf", singlethreaded.CreateInitialState, true) oracle, expectedStdOut, expectedStdErr := testutil.ClaimTestOracle(t) var stdOutBuf, stdErrBuf bytes.Buffer diff --git a/cannon/mipsevm/testutil/vmtests.go b/cannon/mipsevm/testutil/vmtests.go index 71bb9937f224..c016b91e076a 100644 --- a/cannon/mipsevm/testutil/vmtests.go +++ b/cannon/mipsevm/testutil/vmtests.go @@ -78,7 +78,7 @@ func RunVMTests_OpenMips[T mipsevm.FPVMState](t *testing.T, stateFactory StateFa } func RunVMTest_Hello[T mipsevm.FPVMState](t *testing.T, initState program.CreateInitialFPVMState[T], vmFactory VMFactory[T], doPatchGo bool) { - state := LoadELFProgram(t, "../../example/bin/hello.elf", initState, doPatchGo) + state := LoadELFProgram(t, "../../testdata/example/bin/hello.elf", initState, doPatchGo) var stdOutBuf, stdErrBuf bytes.Buffer us := vmFactory(state, nil, io.MultiWriter(&stdOutBuf, os.Stdout), io.MultiWriter(&stdErrBuf, os.Stderr), CreateLogger()) @@ -99,7 +99,7 @@ func RunVMTest_Hello[T mipsevm.FPVMState](t *testing.T, initState program.Create } func RunVMTest_Claim[T mipsevm.FPVMState](t *testing.T, initState program.CreateInitialFPVMState[T], vmFactory VMFactory[T], doPatchGo bool) { - state := LoadELFProgram(t, "../../example/bin/claim.elf", initState, doPatchGo) + state := LoadELFProgram(t, "../../testdata/example/bin/claim.elf", initState, doPatchGo) oracle, expectedStdOut, expectedStdErr := ClaimTestOracle(t) diff --git a/cannon/testdata/README.md b/cannon/testdata/README.md new file mode 100644 index 000000000000..4730cac00b0d --- /dev/null +++ b/cannon/testdata/README.md @@ -0,0 +1,11 @@ +# Cannon testdata + +These example Go programs are used in tests, +and encapsulated as their own Go modules. + +## Testdata + +The `testdata` directory name (special Go exception) prevents tools like `go mod tidy` +that run from the monorepo root from picking up on the test data, +preventing noisy dependabot PRs. + diff --git a/cannon/example/Makefile b/cannon/testdata/example/Makefile similarity index 100% rename from cannon/example/Makefile rename to cannon/testdata/example/Makefile diff --git a/cannon/example/alloc/go.mod b/cannon/testdata/example/alloc/go.mod similarity index 98% rename from cannon/example/alloc/go.mod rename to cannon/testdata/example/alloc/go.mod index d2e4bd2239f3..5ead2ebe8af6 100644 --- a/cannon/example/alloc/go.mod +++ b/cannon/testdata/example/alloc/go.mod @@ -11,4 +11,4 @@ require ( golang.org/x/sys v0.22.0 // indirect ) -replace github.com/ethereum-optimism/optimism v0.0.0 => ../../.. +replace github.com/ethereum-optimism/optimism v0.0.0 => ../../../.. diff --git a/cannon/example/alloc/go.sum b/cannon/testdata/example/alloc/go.sum similarity index 100% rename from cannon/example/alloc/go.sum rename to cannon/testdata/example/alloc/go.sum diff --git a/cannon/example/alloc/main.go b/cannon/testdata/example/alloc/main.go similarity index 100% rename from cannon/example/alloc/main.go rename to cannon/testdata/example/alloc/main.go diff --git a/cannon/example/claim/go.mod b/cannon/testdata/example/claim/go.mod similarity index 98% rename from cannon/example/claim/go.mod rename to cannon/testdata/example/claim/go.mod index b7417d15317b..dfbd45f6f57c 100644 --- a/cannon/example/claim/go.mod +++ b/cannon/testdata/example/claim/go.mod @@ -11,4 +11,4 @@ require ( golang.org/x/sys v0.22.0 // indirect ) -replace github.com/ethereum-optimism/optimism v0.0.0 => ../../.. +replace github.com/ethereum-optimism/optimism v0.0.0 => ../../../.. diff --git a/cannon/example/claim/go.sum b/cannon/testdata/example/claim/go.sum similarity index 100% rename from cannon/example/claim/go.sum rename to cannon/testdata/example/claim/go.sum diff --git a/cannon/example/claim/main.go b/cannon/testdata/example/claim/main.go similarity index 100% rename from cannon/example/claim/main.go rename to cannon/testdata/example/claim/main.go diff --git a/cannon/example/hello/go.mod b/cannon/testdata/example/hello/go.mod similarity index 100% rename from cannon/example/hello/go.mod rename to cannon/testdata/example/hello/go.mod diff --git a/cannon/example/hello/main.go b/cannon/testdata/example/hello/main.go similarity index 100% rename from cannon/example/hello/main.go rename to cannon/testdata/example/hello/main.go diff --git a/cannon/example/multithreaded/go.mod b/cannon/testdata/example/multithreaded/go.mod similarity index 100% rename from cannon/example/multithreaded/go.mod rename to cannon/testdata/example/multithreaded/go.mod diff --git a/cannon/example/multithreaded/main.go b/cannon/testdata/example/multithreaded/main.go similarity index 100% rename from cannon/example/multithreaded/main.go rename to cannon/testdata/example/multithreaded/main.go From ec45f6634ab2855a4ae5d30c4e240d79f081d689 Mon Sep 17 00:00:00 2001 From: protolambda Date: Wed, 7 Aug 2024 03:40:40 -0600 Subject: [PATCH 26/59] op-node: abort block publishing if conductor commit fails (#11380) --- op-node/rollup/sequencing/sequencer.go | 1 + 1 file changed, 1 insertion(+) diff --git a/op-node/rollup/sequencing/sequencer.go b/op-node/rollup/sequencing/sequencer.go index 0a02bcaf40b6..118cdf4be3fa 100644 --- a/op-node/rollup/sequencing/sequencer.go +++ b/op-node/rollup/sequencing/sequencer.go @@ -268,6 +268,7 @@ func (d *Sequencer) onBuildSealed(x engine.BuildSealedEvent) { if err := d.conductor.CommitUnsafePayload(ctx, x.Envelope); err != nil { d.emitter.Emit(rollup.EngineTemporaryErrorEvent{ Err: fmt.Errorf("failed to commit unsafe payload to conductor: %w", err)}) + return } // begin gossiping as soon as possible From 2491a3732fe97c9eec9baf615a010e8f7a42f738 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Thu, 8 Aug 2024 00:38:07 +1000 Subject: [PATCH 27/59] Fix devnet-up when op-program/bin is missing prestate-proof.json (#11383) --- Makefile | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 51d0d1397b33..2f9620ee9273 100644 --- a/Makefile +++ b/Makefile @@ -137,11 +137,18 @@ reproducible-prestate: ## Builds reproducible-prestate binary make -C ./op-program reproducible-prestate .PHONY: reproducible-prestate -cannon-prestate: op-program cannon ## Generates prestate using cannon and op-program +# Checks if prestate outputs are missing +cannon-prestate: op-program/bin/prestate-proof.json +.PHONY: cannon-prestate + +op-program/bin/prestate-proof.json: + make generate-cannon-prestates + +generate-cannon-prestates: op-program cannon ## Generates prestate using cannon and op-program ./cannon/bin/cannon load-elf --path op-program/bin/op-program-client.elf --out op-program/bin/prestate.json --meta op-program/bin/meta.json ./cannon/bin/cannon run --proof-at '=0' --stop-at '=1' --input op-program/bin/prestate.json --meta op-program/bin/meta.json --proof-fmt 'op-program/bin/%d.json' --output "" mv op-program/bin/0.json op-program/bin/prestate-proof.json -.PHONY: cannon-prestate +.PHONY: generate-cannon-prestates mod-tidy: ## Cleans up unused dependencies in Go modules # Below GOPRIVATE line allows mod-tidy to be run immediately after @@ -160,16 +167,14 @@ nuke: clean devnet-clean ## Completely clean the project directory git clean -Xdf .PHONY: nuke -pre-devnet: submodules ## Prepares for running a local devnet +## Prepares for running a local devnet +pre-devnet: submodules cannon-prestate @if ! [ -x "$(command -v geth)" ]; then \ make install-geth; \ fi @if ! [ -x "$(command -v eth2-testnet-genesis)" ]; then \ make install-eth2-testnet-genesis; \ fi - @if [ ! -e op-program/bin ]; then \ - make cannon-prestate; \ - fi .PHONY: pre-devnet devnet-up: pre-devnet ## Starts the local devnet From 96b9e70118a200fe43762fb96c34698753acf150 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Wed, 7 Aug 2024 23:00:58 +0300 Subject: [PATCH 28/59] contracts-bedrock: migrate to just (#11276) * contracts-bedrock: migrate to just Move away from `pnpm` for contracts scripts and towards `just`. `just` was made for this, since we are moving away from JS it makes no sense to keep `pnpm` around which is native to the JS ecosystem. * ci: install just * ops: cleanup, docs * ci: install just * justfile: update * ci: fix install * snapshots: update * contracts-bedrock: remove pnpm/node, cleanup dockerfile * slither ci: no longer need for workaround (TM) * ts-linting: remove * kontrol: regenerate snapshots * safecall: update test * test: update Co-authored-by: Matt Solomon * docs: update Co-authored-by: Matt Solomon * readme: update Co-authored-by: Matt Solomon * docs: update Co-authored-by: Matt Solomon * docs: update Co-authored-by: Matt Solomon * docs: update Co-authored-by: Maurelian * versions: use latest * ci: fix * CONTRIBUTING: update * ci: fix * lint: fix --------- Co-authored-by: protolambda Co-authored-by: Matt Solomon Co-authored-by: Maurelian --- .circleci/config.yml | 25 +- .github/workflows/slither.yml | 7 - ops/docker/Dockerfile.packages | 74 +- package.json | 4 +- packages/contracts-bedrock/.eslintignore | 9 - packages/contracts-bedrock/.eslintrc.js | 185 - packages/contracts-bedrock/.prettierrc.js | 10 - packages/contracts-bedrock/CONTRIBUTING.md | 37 +- packages/contracts-bedrock/README.md | 2 +- packages/contracts-bedrock/justfile | 91 + packages/contracts-bedrock/package.json | 68 - packages/contracts-bedrock/pnpm-lock.yaml | 3483 ----------------- .../scripts/checks/check-snapshots.sh | 2 +- .../scripts/getting-started/versions.sh | 2 + .../test/libraries/SafeCall.t.sol | 2 + packages/contracts-bedrock/tsconfig.json | 30 - versions.json | 3 +- 17 files changed, 152 insertions(+), 3882 deletions(-) delete mode 100644 packages/contracts-bedrock/.eslintignore delete mode 100644 packages/contracts-bedrock/.eslintrc.js delete mode 100644 packages/contracts-bedrock/.prettierrc.js create mode 100644 packages/contracts-bedrock/justfile delete mode 100644 packages/contracts-bedrock/package.json delete mode 100644 packages/contracts-bedrock/pnpm-lock.yaml delete mode 100644 packages/contracts-bedrock/tsconfig.json diff --git a/.circleci/config.yml b/.circleci/config.yml index 81de1bab202c..d171341ca1a1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -528,7 +528,7 @@ jobs: # We do not use the pre-built contracts becuase forge coverage uses different optimizer settings - run: name: test and generate coverage - command: pnpm coverage:lcov + command: just coverage-lcov no_output_timeout: 18m environment: FOUNDRY_PROFILE: ci @@ -556,7 +556,7 @@ jobs: working_directory: packages/contracts-bedrock - run: name: run tests - command: pnpm test + command: just test environment: FOUNDRY_PROFILE: ci working_directory: packages/contracts-bedrock @@ -602,22 +602,22 @@ jobs: # Semver lock must come second because one of the later steps may modify the cache & force a contracts rebuild. name: semver lock command: | - pnpm semver-lock + just semver-lock git diff --exit-code semver-lock.json || echo "export SEMVER_LOCK_STATUS=1" >> "$BASH_ENV" working_directory: packages/contracts-bedrock - run: name: check deploy configs - command: pnpm validate-deploy-configs || echo "export DEPLOY_CONFIGS_STATUS=1" >> "$BASH_ENV" + command: just validate-deploy-configs || echo "export DEPLOY_CONFIGS_STATUS=1" >> "$BASH_ENV" working_directory: packages/contracts-bedrock - run: name: lint command: | - pnpm lint:check || echo "export LINT_STATUS=1" >> "$BASH_ENV" + just lint-check || echo "export LINT_STATUS=1" >> "$BASH_ENV" working_directory: packages/contracts-bedrock - run: name: gas snapshot command: | - pnpm gas-snapshot --check || echo "export GAS_SNAPSHOT_STATUS=1" >> "$BASH_ENV" + just gas-snapshot-check || echo "export GAS_SNAPSHOT_STATUS=1" >> "$BASH_ENV" environment: FOUNDRY_PROFILE: ci working_directory: packages/contracts-bedrock @@ -625,13 +625,13 @@ jobs: - run: name: invariant docs command: | - pnpm autogen:invariant-docs + just autogen-invariant-docs git diff --exit-code ./invariant-docs/*.md || echo "export INVARIANT_DOCS_STATUS=1" >> "$BASH_ENV" working_directory: packages/contracts-bedrock - run: name: snapshots command: | - pnpm snapshots:check || echo "export SNAPSHOTS_STATUS=1" >> "$BASH_ENV" + just snapshots-check || echo "export SNAPSHOTS_STATUS=1" >> "$BASH_ENV" working_directory: packages/contracts-bedrock - run: name: size check @@ -697,7 +697,7 @@ jobs: patterns: contracts-bedrock - run: name: validate spacers - command: pnpm validate-spacers + command: just validate-spacers working_directory: packages/contracts-bedrock todo-issues: @@ -1162,6 +1162,11 @@ jobs: command: | nvm install nvm use && node --version && npm --version + - run: + name: Install Just + command: | + curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --to $HOME/bin + echo 'export PATH="${PATH}:$HOME/bin"' >> $BASH_ENV - run: name: Install pnpm command: | @@ -1491,7 +1496,7 @@ jobs: docker_layer_caching: true - run: name: Run Kontrol Tests - command: pnpm test:kontrol + command: just test-kontrol working_directory: ./packages/contracts-bedrock - store_artifacts: path: ./packages/contracts-bedrock/test/kontrol/logs/kontrol-results_latest.tar.gz diff --git a/.github/workflows/slither.yml b/.github/workflows/slither.yml index f863b8de60d8..069c6eb2f0e7 100644 --- a/.github/workflows/slither.yml +++ b/.github/workflows/slither.yml @@ -15,13 +15,6 @@ jobs: steps: - uses: actions/checkout@v4 - # Workaround to prevent slither-action from trying to install JS deps. - # Without this step, it detects the `package.json`, and since there is no - # lockfile it defaults `npm install` which fails due to the preinstall - # script to enforce pnpm. https://github.com/crytic/slither-action/issues/44#issuecomment-1338183656 - - name: Remove package.json - run: rm packages/contracts-bedrock/package.json - - name: Run Slither uses: crytic/slither-action@v0.4.0 id: slither diff --git a/ops/docker/Dockerfile.packages b/ops/docker/Dockerfile.packages index 76599b4e9032..598f40b3e3bb 100644 --- a/ops/docker/Dockerfile.packages +++ b/ops/docker/Dockerfile.packages @@ -1,92 +1,52 @@ -# This Dockerfile builds all the dependencies needed by the monorepo, and should -# be used to build any of the follow-on services -# - -# Stage 0 (named `manifests`) collects -# dependency manifest files (`package.json` and `pnpm-lock.yaml`) which are then -# used by stage 1 to install these dependencies -# development. The only reason we need a separate stage just for collecting the -# dependency manifests is that Docker's `COPY` command still does not allow -# copying based on a glob pattern (see this GitHub issue for more details -# https://github.com/moby/moby/issues/15858). Being able to copy only manifests -# into stage 1 (the `COPY --from=manifests` statement) is important to maximize -# Docker build cache hit rate. `alpine` is chosen as the base image for the -# first stage because it's the smallest image that have access to the `cp -# --parents -t` command (by installing the `coreutils` package). -FROM alpine:3.16 as manifests -RUN apk add coreutils - -WORKDIR /tmp -COPY pnpm-lock.yaml pnpm-workspace.yaml .nvmrc package.json ./src/ -COPY packages src/packages/ -RUN mkdir manifests && \ - cd src && \ - # copy package.json recursively - find . -name 'package.json' | xargs cp --parents -t ../manifests/ && \ - # pnpm-lock.yaml - cp pnpm-lock.yaml ../manifests/ && \ - # pnpm-workspace.yaml - cp pnpm-workspace.yaml ../manifests/ && \ - # .nvmrc - cp .nvmrc ../manifests/ +# This Dockerfile builds all the dependencies needed by the smart-contracts, excluding Go and Python. FROM us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:latest as foundry -# bullseye-slim is debian based -# we use it rather than alpine because it's not much -# bigger and alpine is often missing packages for node applications -# alpine is not officially supported by node.js -FROM node:20.8.1-bullseye-slim as base + +# Historically the contracts-bedrock was on the node image based on Debian 11 (bullseye), +# for Node / PNPM compatibility reasons. +# We no longer use Node JS, but continue to use the same Debian version for compatibility. +FROM debian:bullseye-slim as base # Base: install deps RUN apt-get update && apt-get install -y \ curl \ jq \ - python3 \ ca-certificates \ git \ - g++ \ make \ - gcc \ - musl-dev \ bash \ - # the following 4 deps are needed for node-hid - # which is a deep sub dependency of ethers to install - # correctly - pkg-config \ - libusb-1.0-0-dev \ - libudev-dev \ --no-install-recommends COPY /ops/docker/oplabs.crt /usr/local/share/ca-certificates/oplabs.crt RUN chmod 644 /usr/local/share/ca-certificates/oplabs.crt \ && update-ca-certificates -RUN npm install pnpm --global +# Note: "just" is only available on Debian 13. Instead, pull it from the foundry image. +COPY --from=foundry /usr/local/bin/just /usr/local/bin/just COPY --from=foundry /usr/local/bin/forge /usr/local/bin/forge COPY --from=foundry /usr/local/bin/cast /usr/local/bin/cast WORKDIR /opt/optimism -# Copy manifest files into the image in -# preparation for `pnpm install`. -COPY --from=manifests /tmp/manifests ./ -COPY *.json ./ - -RUN pnpm install --frozen-lockfile - +COPY ./versions.json ./versions.json COPY ./packages ./packages COPY .git/ ./.git COPY .gitmodules ./.gitmodules RUN git submodule update --init --recursive +# Not to be confused with OP, this is a OnePassword CLI tool. COPY --from=1password/op:2 /usr/local/bin/op /usr/local/bin/op -RUN pnpm build - -ENTRYPOINT ["pnpm", "run"] +# prebuild the smart-contracts for the convenience of the user +RUN cd packages/contracts-bedrock && just build FROM base as contracts-bedrock WORKDIR /opt/optimism/packages/contracts-bedrock + +# Set "just" as entrypoint, so the default args (the Dockerfile CMD) +# are passed in to it. This was previously "pnpm run" + "deploy". +ENTRYPOINT ["just"] + CMD ["deploy"] diff --git a/package.json b/package.json index 1cfe0a2d4377..0da9c8361938 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,8 @@ "license": "MIT", "scripts": { "clean": "rm -rf node_modules packages/**/node_modules", - "build": "cd packages/contracts-bedrock && pnpm build", - "test": "cd packages/contracts-bedrock && pnpm test", + "build": "cd packages/contracts-bedrock && just build", + "test": "cd packages/contracts-bedrock && just test", "issues": "./ops/scripts/todo-checker.sh", "lint:shellcheck": "find . -type f -name '*.sh' -not -path '*/node_modules/*' -not -path './packages/contracts-bedrock/lib/*' -not -path './packages/contracts-bedrock/kout*/*' -exec sh -c 'echo \"Checking $1\"; shellcheck \"$1\"' _ {} \\;", "install:foundry": "curl -L https://foundry.paradigm.xyz | bash && pnpm update:foundry", diff --git a/packages/contracts-bedrock/.eslintignore b/packages/contracts-bedrock/.eslintignore deleted file mode 100644 index d8eb5b7a65a2..000000000000 --- a/packages/contracts-bedrock/.eslintignore +++ /dev/null @@ -1,9 +0,0 @@ -# Deps and test files -lib - -# build output -artifacts -forge-artifacts -cache -coverage* -deployments diff --git a/packages/contracts-bedrock/.eslintrc.js b/packages/contracts-bedrock/.eslintrc.js deleted file mode 100644 index 1895c21485d1..000000000000 --- a/packages/contracts-bedrock/.eslintrc.js +++ /dev/null @@ -1,185 +0,0 @@ -module.exports = { - root: true, - env: { - browser: true, - es6: true, - }, - ignorePatterns: ['dist', 'coverage'], - extends: ['plugin:prettier/recommended'], - parser: '@babel/eslint-parser', - parserOptions: { - es6: true, - ecmaVersion: 6, - sourceType: 'module', - requireConfigFile: false, - }, - plugins: [ - 'eslint-plugin-import', - 'eslint-plugin-jsdoc', - 'eslint-plugin-prefer-arrow', - '@typescript-eslint', - ], - overrides: [ - { - files: ['**/*.ts'], - parser: '@typescript-eslint/parser', - parserOptions: { - project: './packages/**/tsconfig.json', - sourceType: 'module', - allowAutomaticSingleRunInference: true, - }, - rules: { - '@typescript-eslint/adjacent-overload-signatures': 'error', - '@typescript-eslint/array-type': 'off', - '@typescript-eslint/ban-types': 'off', - '@typescript-eslint/consistent-type-assertions': 'error', - '@typescript-eslint/dot-notation': 'off', - '@typescript-eslint/indent': 'off', - '@typescript-eslint/member-delimiter-style': [ - 'off', - { - multiline: { - delimiter: 'none', - requireLast: true, - }, - singleline: { - delimiter: 'semi', - requireLast: false, - }, - }, - ], - '@typescript-eslint/member-ordering': 'off', - '@typescript-eslint/naming-convention': 'off', - '@typescript-eslint/no-empty-function': 'error', - '@typescript-eslint/no-empty-interface': 'off', - '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/no-misused-new': 'error', - '@typescript-eslint/no-namespace': 'error', - '@typescript-eslint/no-parameter-properties': 'off', - '@typescript-eslint/no-shadow': [ - 'error', - { - hoist: 'all', - }, - ], - '@typescript-eslint/no-this-alias': 'error', - '@typescript-eslint/no-unused-expressions': 'off', - '@typescript-eslint/no-use-before-define': 'off', - '@typescript-eslint/no-var-requires': 'error', - '@typescript-eslint/prefer-for-of': 'error', - '@typescript-eslint/prefer-function-type': 'error', - '@typescript-eslint/prefer-namespace-keyword': 'error', - '@typescript-eslint/quotes': 'off', - '@typescript-eslint/semi': ['off', null], - '@typescript-eslint/triple-slash-reference': [ - 'error', - { - path: 'always', - types: 'prefer-import', - lib: 'always', - }, - ], - '@typescript-eslint/type-annotation-spacing': 'off', - '@typescript-eslint/unified-signatures': 'error', - '@typescript-eslint/no-unused-vars': 'error', - }, - }, - ], - rules: { - 'prettier/prettier': 'warn', - 'arrow-parens': ['off', 'always'], - 'brace-style': ['off', 'off'], - 'comma-dangle': 'off', - complexity: 'off', - 'constructor-super': 'error', - curly: 'error', - 'dot-notation': 'off', - 'eol-last': 'off', - eqeqeq: ['error', 'smart'], - 'guard-for-in': 'error', - 'id-blacklist': 'off', - 'id-match': 'off', - 'import/no-extraneous-dependencies': ['error'], - 'import/no-internal-modules': 'off', - 'import/order': [ - 'error', - { - groups: ['builtin', 'external', 'internal'], - 'newlines-between': 'always', - }, - ], - indent: 'off', - 'jsdoc/check-alignment': 'error', - 'jsdoc/check-indentation': 'error', - 'linebreak-style': 'off', - 'max-classes-per-file': 'off', - 'max-len': 'off', - 'new-parens': 'off', - 'newline-per-chained-call': 'off', - 'no-bitwise': 'off', - 'no-caller': 'error', - 'no-cond-assign': 'error', - 'no-console': 'off', - 'no-debugger': 'error', - 'no-duplicate-case': 'error', - 'no-duplicate-imports': 'error', - 'no-empty': 'error', - 'no-eval': 'error', - 'no-extra-bind': 'error', - 'no-extra-semi': 'off', - 'no-fallthrough': 'off', - 'no-invalid-this': 'off', - 'no-irregular-whitespace': 'off', - 'no-multiple-empty-lines': 'off', - 'no-new-func': 'error', - 'no-new-wrappers': 'error', - 'no-redeclare': 'error', - 'no-return-await': 'error', - 'no-sequences': 'error', - 'no-sparse-arrays': 'error', - 'no-template-curly-in-string': 'error', - 'no-throw-literal': 'error', - 'no-trailing-spaces': 'off', - 'no-undef-init': 'error', - 'no-underscore-dangle': 'off', - 'no-unsafe-finally': 'error', - 'no-unused-expressions': 'off', - 'no-unused-labels': 'error', - 'no-use-before-define': 'off', - 'no-var': 'error', - 'object-shorthand': 'error', - 'one-var': ['error', 'never'], - 'padded-blocks': [ - 'off', - { - blocks: 'never', - }, - { - allowSingleLineBlocks: true, - }, - ], - 'prefer-arrow/prefer-arrow-functions': 'error', - 'prefer-const': 'error', - 'prefer-object-spread': 'error', - 'quote-props': 'off', - quotes: 'off', - radix: 'error', - 'react/jsx-curly-spacing': 'off', - 'react/jsx-equals-spacing': 'off', - 'react/jsx-tag-spacing': [ - 'off', - { - afterOpening: 'allow', - closingSlash: 'allow', - }, - ], - 'react/jsx-wrap-multilines': 'off', - semi: 'off', - 'space-before-blocks': 'error', - 'space-before-function-paren': 'off', - 'space-in-parens': ['off', 'never'], - 'unicorn/prefer-ternary': 'off', - 'use-isnan': 'error', - 'valid-typeof': 'off', - }, -} diff --git a/packages/contracts-bedrock/.prettierrc.js b/packages/contracts-bedrock/.prettierrc.js deleted file mode 100644 index 7b70850614ea..000000000000 --- a/packages/contracts-bedrock/.prettierrc.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - $schema: 'http://json.schemastore.org/prettierrc', - plugins: [], - trailingComma: 'es5', - tabWidth: 2, - semi: false, - singleQuote: true, - arrowParens: 'always', - overrides: [], -} diff --git a/packages/contracts-bedrock/CONTRIBUTING.md b/packages/contracts-bedrock/CONTRIBUTING.md index b917d04fab3f..ddd55464f374 100644 --- a/packages/contracts-bedrock/CONTRIBUTING.md +++ b/packages/contracts-bedrock/CONTRIBUTING.md @@ -52,7 +52,8 @@ The best place to begin contributing is by looking through the issues with the ` Optimism's smart contracts are written in Solidity and we use [foundry](https://github.com/foundry-rs/foundry) as our development framework. To get started, you'll need to install several dependencies: 1. [pnpm](https://pnpm.io) - 1. Make sure to `pnpm install` +1. [just](https://github.com/casey/just) + 1. Make sure to `just install` 1. [foundry](https://getfoundry.sh) 1. Foundry is built with [rust](https://www.rust-lang.org/tools/install), and this project uses a pinned version of foundry. Install the rust toolchain with `rustup`. 1. Make sure to install the version of foundry used by `ci-builder`, defined in the `versions.json` file in the root of this repo under the `foundry` key. Once you have `foundryup` installed, there is a helper to do this: `pnpm install:foundry` @@ -61,20 +62,20 @@ Optimism's smart contracts are written in Solidity and we use [foundry](https:// Our [Style Guide](STYLE_GUIDE.md) contains information about the project structure, syntax preferences, naming conventions, and more. Please take a look at it before submitting a PR, and let us know if you spot inconsistencies! -Once you've read the styleguide and are ready to work on your PR, there are a plethora of useful `pnpm` scripts to know about that will help you with development: -1. `pnpm build` Builds the smart contracts. -1. `pnpm test` Runs the full `forge` test suite. -1 `pnpm gas-snapshot` Generates the gas snapshot for the smart contracts. -1. `pnpm semver-lock` Generates the semver lockfile. -1. `pnpm storage-snapshot` Generates the storage lockfile. -1. `pnpm autogen:invariant-docs` Generates the invariant test documentation. -1. `pnpm clean` Removes all build artifacts for `forge` and `go` compilations. -1. `pnpm validate-spacers` Validates the positions of the storage slot spacers. -1. `pnpm validate-deploy-configs` Validates the deployment configurations in `deploy-config` -1. `pnpm slither` Runs the slither static analysis tool on the smart contracts. -1. `pnpm lint` Runs the linter on the smart contracts and scripts. -1. `pnpm pre-pr` Runs most checks, generators, and linters prior to a PR. For most PRs, this is sufficient to pass CI if everything is in order. -1. `pnpm pre-pr:full` Runs all checks, generators, and linters prior to a PR. +Once you've read the style guide and are ready to work on your PR, there are a plethora of useful `just` scripts to know about that will help you with development. +You can run `just -l` to list them all, some of the key ones are: +1. `just build` Builds the smart contracts. +1. `just test` Runs the full `forge` test suite. +1 `just gas-snapshot` Generates the gas snapshot for the smart contracts. +1. `just semver-lock` Generates the semver lockfile. +1. `just snapshots` Generates the storage and ABI snapshots. +1. `just autogen-invariant-docs` Generates the invariant test documentation. +1. `just clean` Removes all build artifacts for `forge` and `go` compilations. +1. `just validate-spacers` Validates the positions of the storage slot spacers. +1. `just validate-deploy-configs` Validates the deployment configurations in `deploy-config` +1. `just lint` Runs the linter on the smart contracts and scripts. +1. `just pre-pr` Runs most checks, generators, and linters prior to a PR. For most PRs, this is sufficient to pass CI if everything is in order. +1. `just pre-pr-full` Runs all checks, generators, and linters prior to a PR. ### Improving The Documentation @@ -90,11 +91,11 @@ To deploy the smart contracts on a local devnet, run `make devnet-up` in the mon In order to make sure that we don't accidentally overwrite storage slots, contract storage layouts are checked to make sure spacing is correct. -This uses the `.storage-layout` file to check contract spacing. Run `pnpm validate-spacers` to check the spacing of all contracts. +This uses the `snapshots/storageLayout` directory to check contract spacing. Run `just validate-spacers` to check the spacing of all contracts. #### Gas Snapshots -We use forge's `gas-snapshot` subcommand to produce a gas snapshot for most tests within our suite. CI will check that the gas snapshot has been updated properly when it runs, so make sure to run `pnpm gas-snapshot`! +We use forge's `gas-snapshot` subcommand to produce a gas snapshot for tests in `Benchmark.t.sol`. CI will check that the gas snapshot has been updated properly when it runs, so make sure to run `just gas-snapshot`! #### Semver Locking @@ -102,4 +103,4 @@ Many of our smart contracts are semantically versioned. To make sure that change #### Storage Snapshots -Due to the many proxied contracts in Optimism's protocol, we automate tracking the diff to storage layouts of the contracts in the project. This is to ensure that we don't break a proxy by upgrading its implementation to a contract with a different storage layout. To generate the storage lockfile, run `pnpm storage-snapshot`. +Due to the many proxied contracts in Optimism's protocol, we automate tracking the diff to storage layouts of the contracts in the project. This is to ensure that we don't break a proxy by upgrading its implementation to a contract with a different storage layout. To generate the storage lockfile, run `just snapshots`. diff --git a/packages/contracts-bedrock/README.md b/packages/contracts-bedrock/README.md index 50566e98949f..ad7edb5065e4 100644 --- a/packages/contracts-bedrock/README.md +++ b/packages/contracts-bedrock/README.md @@ -361,7 +361,7 @@ to reduce the overhead of maintaining multiple ways to set up the state as well The L1 contract addresses are held in `deployments/hardhat/.deploy` and the L2 test state is held in a `.testdata` directory. The L1 addresses are used to create the L2 state and it is possible for stale addresses to be pulled into the L2 state, causing tests to fail. Stale addresses may happen if the order of the L1 deployments happen differently -since some contracts are deployed using `CREATE`. Run `pnpm clean` and rerun the tests if they are failing for an unknown reason. +since some contracts are deployed using `CREATE`. Run `just clean` and rerun the tests if they are failing for an unknown reason. ### Static Analysis diff --git a/packages/contracts-bedrock/justfile b/packages/contracts-bedrock/justfile new file mode 100644 index 000000000000..b983776e73c8 --- /dev/null +++ b/packages/contracts-bedrock/justfile @@ -0,0 +1,91 @@ +prebuild: + ./scripts/checks/check-foundry-install.sh + +build: prebuild + forge build + +build-go-ffi: + cd scripts/go-ffi && go build + +autogen-invariant-docs: + go run ./scripts/autogen/generate-invariant-docs . + +test: build-go-ffi + forge test + +test-kontrol: + ./test/kontrol/scripts/run-kontrol.sh script + +genesis: + forge script scripts/L2Genesis.s.sol:L2Genesis --sig 'runWithStateDump()' + +coverage: build-go-ffi + forge coverage || (bash -c "forge coverage 2>&1 | grep -q 'Stack too deep' && echo -e '\\033[1;33mWARNING\\033[0m: Coverage failed with stack too deep, so overriding and exiting successfully' && exit 0 || exit 1") + +coverage-lcov: build-go-ffi + forge coverage --report lcov || (bash -c "forge coverage --report lcov 2>&1 | grep -q 'Stack too deep' && echo -e '\\033[1;33mWARNING\\033[0m: Coverage failed with stack too deep, so overriding and exiting successfully' && exit 0 || exit 1") + +deploy: + ./scripts/deploy/deploy.sh + +gas-snapshot-no-build: + forge snapshot --match-contract GasBenchMark + +statediff: + ./scripts/statediff.sh && git diff --exit-code + +gas-snapshot: build-go-ffi gas-snapshot-no-build + +gas-snapshot-check: build-go-ffi + forge snapshot --match-contract GasBenchMark --check + +kontrol-summary: + ./test/kontrol/scripts/make-summary-deployment.sh + +kontrol-summary-fp: + KONTROL_FP_DEPLOYMENT=true ./test/kontrol/scripts/make-summary-deployment.sh + +snapshots-abi-storage: + go run ./scripts/autogen/generate-snapshots . + +snapshots: build snapshots-no-build + +snapshots-no-build: snapshots-abi-storage kontrol-summary-fp kontrol-summary + +snapshots-check: + ./scripts/checks/check-snapshots.sh + +semver-lock: + forge script scripts/SemverLock.s.sol + +validate-deploy-configs: + ./scripts/checks/check-deploy-configs.sh + +validate-spacers-no-build: + go run ./scripts/checks/spacers + +validate-spacers: build validate-spacers-no-build + +clean: + rm -rf ./artifacts ./forge-artifacts ./cache ./scripts/go-ffi/go-ffi ./.testdata ./deployments/hardhat/* + +pre-pr-no-build: gas-snapshot-no-build snapshots-no-build semver-lock autogen-invariant-docs lint + +pre-pr: clean build-go-ffi build pre-pr-no-build + +pre-pr-full: test validate-deploy-configs validate-spacers pre-pr + +lint-forge-tests-check: + go run ./scripts/checks/names + +lint-contracts-check: + forge fmt --check + +lint-check: lint-contracts-check + +lint-contracts-fix: + forge fmt + +lint-fix: lint-contracts-fix + +lint: lint-fix lint-check diff --git a/packages/contracts-bedrock/package.json b/packages/contracts-bedrock/package.json deleted file mode 100644 index 1cf9873abb6a..000000000000 --- a/packages/contracts-bedrock/package.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "@eth-optimism/contracts-bedrock", - "version": "0.17.3", - "description": "Contracts for Optimism Specs", - "license": "MIT", - "engines": { - "node": ">=16", - "pnpm": ">=9" - }, - "files": [ - "forge-artifacts/**/*.json", - "!forge-artifacts/**/*.t.sol/*.json", - "deployments/**/*.json", - "src/**/*.sol" - ], - "scripts": { - "prebuild": "./scripts/checks/check-foundry-install.sh", - "build": "forge build", - "build:go-ffi": "(cd scripts/go-ffi && go build)", - "autogen:invariant-docs": "go run ./scripts/autogen/generate-invariant-docs .", - "test": "pnpm build:go-ffi && forge test", - "test:kontrol": "./test/kontrol/scripts/run-kontrol.sh script", - "genesis": "forge script scripts/L2Genesis.s.sol:L2Genesis --sig 'runWithStateDump()'", - "coverage": "pnpm build:go-ffi && (forge coverage || (bash -c \"forge coverage 2>&1 | grep -q 'Stack too deep' && echo -e '\\033[1;33mWARNING\\033[0m: Coverage failed with stack too deep, so overriding and exiting successfully' && exit 0 || exit 1\"))", - "coverage:lcov": "pnpm build:go-ffi && (forge coverage --report lcov || (bash -c \"forge coverage --report lcov 2>&1 | grep -q 'Stack too deep' && echo -e '\\033[1;33mWARNING\\033[0m: Coverage failed with stack too deep, so overriding and exiting successfully' && exit 0 || exit 1\"))", - "deploy": "./scripts/deploy/deploy.sh", - "gas-snapshot:no-build": "forge snapshot --match-contract GasBenchMark", - "statediff": "./scripts/statediff.sh && git diff --exit-code", - "gas-snapshot": "pnpm build:go-ffi && pnpm gas-snapshot:no-build", - "kontrol-summary": "./test/kontrol/scripts/make-summary-deployment.sh", - "kontrol-summary-fp": "KONTROL_FP_DEPLOYMENT=true pnpm kontrol-summary", - "snapshots": "forge build && go run ./scripts/autogen/generate-snapshots . && pnpm kontrol-summary-fp && pnpm kontrol-summary", - "snapshots:check": "./scripts/checks/check-snapshots.sh", - "semver-lock": "forge script scripts/SemverLock.s.sol", - "validate-deploy-configs": "./scripts/checks/check-deploy-configs.sh", - "validate-spacers:no-build": "go run ./scripts/checks/spacers", - "validate-spacers": "pnpm build && pnpm validate-spacers:no-build", - "clean": "rm -rf ./artifacts ./forge-artifacts ./cache ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./scripts/go-ffi/go-ffi ./.testdata ./deployments/hardhat/*", - "pre-pr:no-build": "pnpm gas-snapshot:no-build && pnpm snapshots && pnpm semver-lock && pnpm autogen:invariant-docs && pnpm lint", - "pre-pr": "pnpm clean && pnpm build:go-ffi && pnpm build && pnpm pre-pr:no-build", - "pre-pr:full": "pnpm test && pnpm validate-deploy-configs && pnpm validate-spacers && pnpm pre-pr", - "lint:ts:check": "eslint . --max-warnings=0", - "lint:forge-tests:check": "go run ./scripts/checks/names", - "lint:contracts:check": "pnpm lint:fix && git diff --exit-code", - "lint:check": "pnpm lint:contracts:check && pnpm lint:ts:check", - "lint:ts:fix": "eslint --fix .", - "lint:contracts:fix": "forge fmt", - "lint:fix": "pnpm lint:contracts:fix && pnpm lint:ts:fix", - "lint": "pnpm lint:fix && pnpm lint:check" - }, - "devDependencies": { - "@babel/eslint-parser": "^7.23.10", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", - "@types/node": "^20.14.12", - "doctoc": "^2.2.0", - "eslint": "^8.56.0", - "eslint-config-prettier": "^9.1.0", - "eslint-config-standard": "^16.0.3", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsdoc": "^48.8.3", - "eslint-plugin-prefer-arrow": "^1.2.3", - "eslint-plugin-prettier": "^4.0.0", - "prettier": "^2.8.0", - "tsx": "^4.16.2", - "typescript": "^5.5.4" - } -} diff --git a/packages/contracts-bedrock/pnpm-lock.yaml b/packages/contracts-bedrock/pnpm-lock.yaml deleted file mode 100644 index df27013816a3..000000000000 --- a/packages/contracts-bedrock/pnpm-lock.yaml +++ /dev/null @@ -1,3483 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - devDependencies: - '@babel/eslint-parser': - specifier: ^7.23.10 - version: 7.25.0(@babel/core@7.24.9)(eslint@8.56.0) - '@types/node': - specifier: ^20.14.12 - version: 20.14.12 - '@typescript-eslint/eslint-plugin': - specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.5.4))(eslint@8.56.0)(typescript@5.5.4) - '@typescript-eslint/parser': - specifier: ^6.21.0 - version: 6.21.0(eslint@8.56.0)(typescript@5.5.4) - doctoc: - specifier: ^2.2.0 - version: 2.2.1 - eslint: - specifier: ^8.56.0 - version: 8.56.0 - eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@8.56.0) - eslint-config-standard: - specifier: ^16.0.3 - version: 16.0.3(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.5.4))(eslint@8.56.0))(eslint-plugin-node@11.1.0(eslint@8.56.0))(eslint-plugin-promise@5.2.0(eslint@8.56.0))(eslint@8.56.0) - eslint-plugin-import: - specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.5.4))(eslint@8.56.0) - eslint-plugin-jsdoc: - specifier: ^48.8.3 - version: 48.8.3(eslint@8.56.0) - eslint-plugin-prefer-arrow: - specifier: ^1.2.3 - version: 1.2.3(eslint@8.56.0) - eslint-plugin-prettier: - specifier: ^4.0.0 - version: 4.2.1(eslint-config-prettier@9.1.0(eslint@8.56.0))(eslint@8.56.0)(prettier@2.8.8) - prettier: - specifier: ^2.8.0 - version: 2.8.8 - tsx: - specifier: ^4.16.2 - version: 4.16.2 - typescript: - specifier: ^5.5.4 - version: 5.5.4 - - packages/contracts-bedrock: - devDependencies: - '@typescript-eslint/eslint-plugin': - specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.5.4))(eslint@8.56.0)(typescript@5.5.4) - '@typescript-eslint/parser': - specifier: ^6.21.0 - version: 6.21.0(eslint@8.56.0)(typescript@5.5.4) - tsx: - specifier: ^4.16.2 - version: 4.16.2 - typescript: - specifier: ^5.5.4 - version: 5.5.4 - -packages: - - '@aashutoshrathi/word-wrap@1.2.6': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - - '@babel/code-frame@7.24.7': - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.25.0': - resolution: {integrity: sha512-P4fwKI2mjEb3ZU5cnMJzvRsRKGBUcs8jvxIoRmr6ufAY9Xk2Bz7JubRTTivkw55c7WQJfTECeqYVa+HZ0FzREg==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.24.9': - resolution: {integrity: sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==} - engines: {node: '>=6.9.0'} - - '@babel/eslint-parser@7.25.0': - resolution: {integrity: sha512-mlcTKuQAjczDRwWLIxv+Q925jaMUO8Jl5dxmWJSSGVYfZ4rKMp8daQvVC3rM1G2v8V+/fO0yIVTSLS+2zcB8rg==} - engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} - peerDependencies: - '@babel/core': ^7.11.0 - eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - - '@babel/generator@7.25.0': - resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.24.8': - resolution: {integrity: sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.24.7': - resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.25.0': - resolution: {integrity: sha512-bIkOa2ZJYn7FHnepzr5iX9Kmz8FjIz4UKzJ9zhX3dnYuVW0xul9RuR3skBfoLu+FPTQw90EHW9rJsSZhyLQ3fQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-simple-access@7.24.7': - resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.24.8': - resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.24.7': - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.24.8': - resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.25.0': - resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.24.7': - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.25.0': - resolution: {integrity: sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/template@7.25.0': - resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.25.0': - resolution: {integrity: sha512-ubALThHQy4GCf6mbb+5ZRNmLLCI7bJ3f8Q6LHBSRlSKSWj5a7dSUzJBLv3VuIhFrFPgjF4IzPF567YG/HSCdZA==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.25.0': - resolution: {integrity: sha512-LcnxQSsd9aXOIgmmSpvZ/1yo46ra2ESYyqLcryaBZOghxy5qqOBjvCWP5JfkI8yl9rlxRgdLTTMCQQRcN2hdCg==} - engines: {node: '>=6.9.0'} - - '@es-joy/jsdoccomment@0.46.0': - resolution: {integrity: sha512-C3Axuq1xd/9VqFZpW4YAzOx5O9q/LP46uIQy/iNDpHG3fmPa6TBtvfglMCs3RBiBxAIi0Go97r8+jvTt55XMyQ==} - engines: {node: '>=16'} - - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.6.2': - resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@8.56.0': - resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@humanwhocodes/config-array@0.11.13': - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@2.0.1': - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} - deprecated: Use @eslint/object-schema instead - - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - - '@textlint/ast-node-types@12.6.1': - resolution: {integrity: sha512-uzlJ+ZsCAyJm+lBi7j0UeBbj+Oy6w/VWoGJ3iHRHE5eZ8Z4iK66mq+PG/spupmbllLtz77OJbY89BYqgFyjXmA==} - - '@textlint/markdown-to-ast@12.6.1': - resolution: {integrity: sha512-T0HO+VrU9VbLRiEx/kH4+gwGMHNMIGkp0Pok+p0I33saOOLyhfGvwOKQgvt2qkxzQEV2L5MtGB8EnW4r5d3CqQ==} - - '@types/json-schema@7.0.12': - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mdast@3.0.15': - resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} - - '@types/node@20.14.12': - resolution: {integrity: sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ==} - - '@types/semver@7.5.7': - resolution: {integrity: sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==} - - '@types/unist@2.0.10': - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} - - '@typescript-eslint/eslint-plugin@6.21.0': - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@6.21.0': - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/scope-manager@6.21.0': - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/type-utils@6.21.0': - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/types@6.21.0': - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/typescript-estree@6.21.0': - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/utils@6.21.0': - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - - '@typescript-eslint/visitor-keys@6.21.0': - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - - anchor-markdown-header@0.6.0: - resolution: {integrity: sha512-v7HJMtE1X7wTpNFseRhxsY/pivP4uAJbidVhPT+yhz4i/vV1+qx371IXuV9V7bN6KjFtheLJxqaSm0Y/8neJTA==} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - are-docs-informative@0.0.2: - resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} - engines: {node: '>=14'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} - engines: {node: '>= 0.4'} - - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - bail@1.0.5: - resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - - browserslist@4.23.2: - resolution: {integrity: sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - caniuse-lite@1.0.30001643: - resolution: {integrity: sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==} - - ccount@1.1.0: - resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} - - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - character-entities-legacy@1.1.4: - resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - - character-entities@1.2.4: - resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - - character-reference-invalid@1.1.4: - resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - comment-parser@1.4.1: - resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} - engines: {node: '>= 12.0.0'} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} - - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.5: - resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - doctoc@2.2.1: - resolution: {integrity: sha512-qNJ1gsuo7hH40vlXTVVrADm6pdg30bns/Mo7Nv1SxuXSM1bwF9b4xQ40a6EFT/L1cI+Yylbyi8MPI4G4y7XJzQ==} - hasBin: true - - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - - dom-serializer@1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} - - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - domhandler@4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} - - domutils@2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - - electron-to-chromium@1.5.2: - resolution: {integrity: sha512-kc4r3U3V3WLaaZqThjYz/Y6z8tJe+7K0bbjUVo3i+LWIypVdMx5nXCkwRe6SWbY6ILqLdc1rKcKmr3HoH7wjSQ==} - - emoji-regex@10.1.0: - resolution: {integrity: sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg==} - - entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - - entities@3.0.1: - resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} - engines: {node: '>=0.12'} - - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-module-lexer@1.5.4: - resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} - - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} - hasBin: true - - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eslint-config-prettier@9.1.0: - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - - eslint-config-standard@16.0.3: - resolution: {integrity: sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==} - peerDependencies: - eslint: ^7.12.1 - eslint-plugin-import: ^2.22.1 - eslint-plugin-node: ^11.1.0 - eslint-plugin-promise: ^4.2.1 || ^5.0.0 - - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - - eslint-module-utils@2.8.1: - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - - eslint-plugin-es@3.0.1: - resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=4.19.1' - - eslint-plugin-import@2.29.1: - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - - eslint-plugin-jsdoc@48.8.3: - resolution: {integrity: sha512-AtIvwwW9D17MRkM0Z0y3/xZYaa9mdAvJrkY6fU/HNUwGbmMtHVvK4qRM9CDixGVtfNrQitb8c6zQtdh6cTOvLg==} - engines: {node: '>=18'} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - - eslint-plugin-node@11.1.0: - resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=5.16.0' - - eslint-plugin-prefer-arrow@1.2.3: - resolution: {integrity: sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==} - peerDependencies: - eslint: '>=2.0.0' - - eslint-plugin-prettier@4.2.1: - resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - eslint: '>=7.28.0' - eslint-config-prettier: '*' - prettier: '>=2.0.0' - peerDependenciesMeta: - eslint-config-prettier: - optional: true - - eslint-plugin-promise@5.2.0: - resolution: {integrity: sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==} - engines: {node: ^10.12.0 || >=12.0.0} - peerDependencies: - eslint: ^7.0.0 - - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-utils@2.1.0: - resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} - engines: {node: '>=6'} - - eslint-visitor-keys@1.3.0: - resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} - engines: {node: '>=4'} - - eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint@8.56.0: - resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - - fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - - fault@1.0.4: - resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} - - flatted@3.2.2: - resolution: {integrity: sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==} - - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - - format@0.2.2: - resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} - engines: {node: '>=0.4.x'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - - get-tsconfig@4.7.5: - resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - - globals@13.21.0: - resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} - engines: {node: '>=8'} - - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - htmlparser2@7.2.0: - resolution: {integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==} - - ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} - - is-alphabetical@1.0.4: - resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - - is-alphanumerical@1.0.4: - resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} - - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - - is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-core-module@2.15.0: - resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} - engines: {node: '>= 0.4'} - - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} - - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - - is-decimal@1.0.4: - resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-hexadecimal@1.0.4: - resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - jsdoc-type-pratt-parser@4.0.0: - resolution: {integrity: sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==} - engines: {node: '>=12.0.0'} - - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - longest-streak@2.0.4: - resolution: {integrity: sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==} - - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - - markdown-table@2.0.0: - resolution: {integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==} - - mdast-util-find-and-replace@1.1.1: - resolution: {integrity: sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==} - - mdast-util-footnote@0.1.7: - resolution: {integrity: sha512-QxNdO8qSxqbO2e3m09KwDKfWiLgqyCurdWTQ198NpbZ2hxntdc+VKS4fDJCmNWbAroUdYnSthu+XbZ8ovh8C3w==} - - mdast-util-from-markdown@0.8.5: - resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} - - mdast-util-frontmatter@0.2.0: - resolution: {integrity: sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==} - - mdast-util-gfm-autolink-literal@0.1.3: - resolution: {integrity: sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==} - - mdast-util-gfm-strikethrough@0.2.3: - resolution: {integrity: sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==} - - mdast-util-gfm-table@0.1.6: - resolution: {integrity: sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==} - - mdast-util-gfm-task-list-item@0.1.6: - resolution: {integrity: sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==} - - mdast-util-gfm@0.1.2: - resolution: {integrity: sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==} - - mdast-util-to-markdown@0.6.5: - resolution: {integrity: sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==} - - mdast-util-to-string@2.0.0: - resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromark-extension-footnote@0.3.2: - resolution: {integrity: sha512-gr/BeIxbIWQoUm02cIfK7mdMZ/fbroRpLsck4kvFtjbzP4yi+OPVbnukTc/zy0i7spC2xYE/dbX1Sur8BEDJsQ==} - - micromark-extension-frontmatter@0.2.2: - resolution: {integrity: sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==} - - micromark-extension-gfm-autolink-literal@0.5.7: - resolution: {integrity: sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==} - - micromark-extension-gfm-strikethrough@0.6.5: - resolution: {integrity: sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==} - - micromark-extension-gfm-table@0.4.3: - resolution: {integrity: sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==} - - micromark-extension-gfm-tagfilter@0.3.0: - resolution: {integrity: sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==} - - micromark-extension-gfm-task-list-item@0.3.3: - resolution: {integrity: sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==} - - micromark-extension-gfm@0.3.3: - resolution: {integrity: sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==} - - micromark@2.11.4: - resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} - - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} - - object-inspect@1.13.2: - resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - - object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} - - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse-entities@2.0.0: - resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} - - parse-imports@2.1.1: - resolution: {integrity: sha512-TDT4HqzUiTMO1wJRwg/t/hYk8Wdp3iF/ToMIlAoVQfL1Xs/sTxq1dKWSMjMbQmIarfWKymOyly40+zmPHXMqCA==} - engines: {node: '>= 18'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} - - regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - - remark-footnotes@3.0.0: - resolution: {integrity: sha512-ZssAvH9FjGYlJ/PBVKdSmfyPc3Cz4rTWgZLI4iE/SX8Nt5l3o3oEjv3wwG5VD7xOjktzdwp5coac+kJV9l4jgg==} - - remark-frontmatter@3.0.0: - resolution: {integrity: sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==} - - remark-gfm@1.0.0: - resolution: {integrity: sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==} - - remark-parse@9.0.0: - resolution: {integrity: sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==} - - repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} - - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} - hasBin: true - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - slashes@3.0.12: - resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@4.0.0: - resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} - - spdx-license-ids@3.0.18: - resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} - - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - synckit@0.9.1: - resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} - engines: {node: ^14.18.0 || >=16.0.0} - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - traverse@0.6.9: - resolution: {integrity: sha512-7bBrcF+/LQzSgFmT0X5YclVqQxtv7TDJ1f8Wj7ibBu/U6BMLeOpUxuZjV7rMc44UtKxlnMFigdhFAIszSX1DMg==} - engines: {node: '>= 0.4'} - - trough@1.0.5: - resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} - - ts-api-utils@1.0.1: - resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.6.3: - resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} - - tsx@4.16.2: - resolution: {integrity: sha512-C1uWweJDgdtX2x600HjaFaucXTilT7tgUZHbOE4+ypskZ1OP8CRCSDkCxG6Vya9EwaFIVagWwpaVAn5wzypaqQ==} - engines: {node: '>=18.0.0'} - hasBin: true - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} - - typedarray.prototype.slice@1.0.3: - resolution: {integrity: sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==} - engines: {node: '>= 0.4'} - - typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} - engines: {node: '>=14.17'} - hasBin: true - - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - - underscore@1.13.7: - resolution: {integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==} - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - unified@9.2.2: - resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} - - unist-util-is@4.1.0: - resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} - - unist-util-stringify-position@2.0.3: - resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} - - unist-util-visit-parents@3.1.1: - resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} - - update-browserslist-db@1.1.0: - resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - update-section@0.3.3: - resolution: {integrity: sha512-BpRZMZpgXLuTiKeiu7kK0nIPwGdyrqrs6EDSaXtjD/aQ2T+qVo9a5hRC3HN3iJjCMxNT/VxoLGQ7E/OzE5ucnw==} - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - vfile-message@2.0.4: - resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} - - vfile@4.2.1: - resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} - - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - zwitch@1.0.5: - resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} - -snapshots: - - '@aashutoshrathi/word-wrap@1.2.6': {} - - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - - '@babel/code-frame@7.24.7': - dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.0.1 - - '@babel/compat-data@7.25.0': {} - - '@babel/core@7.24.9': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 - '@babel/helper-compilation-targets': 7.24.8 - '@babel/helper-module-transforms': 7.25.0(@babel/core@7.24.9) - '@babel/helpers': 7.25.0 - '@babel/parser': 7.25.0 - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.0 - '@babel/types': 7.25.0 - convert-source-map: 2.0.0 - debug: 4.3.5 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/eslint-parser@7.25.0(@babel/core@7.24.9)(eslint@8.56.0)': - dependencies: - '@babel/core': 7.24.9 - '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.56.0 - eslint-visitor-keys: 2.1.0 - semver: 6.3.1 - - '@babel/generator@7.25.0': - dependencies: - '@babel/types': 7.25.0 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - - '@babel/helper-compilation-targets@7.24.8': - dependencies: - '@babel/compat-data': 7.25.0 - '@babel/helper-validator-option': 7.24.8 - browserslist: 4.23.2 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-module-imports@7.24.7': - dependencies: - '@babel/traverse': 7.25.0 - '@babel/types': 7.25.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.25.0(@babel/core@7.24.9)': - dependencies: - '@babel/core': 7.24.9 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-simple-access': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-simple-access@7.24.7': - dependencies: - '@babel/traverse': 7.25.0 - '@babel/types': 7.25.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-string-parser@7.24.8': {} - - '@babel/helper-validator-identifier@7.24.7': {} - - '@babel/helper-validator-option@7.24.8': {} - - '@babel/helpers@7.25.0': - dependencies: - '@babel/template': 7.25.0 - '@babel/types': 7.25.0 - - '@babel/highlight@7.24.7': - dependencies: - '@babel/helper-validator-identifier': 7.24.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.1 - - '@babel/parser@7.25.0': - dependencies: - '@babel/types': 7.25.0 - - '@babel/template@7.25.0': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/parser': 7.25.0 - '@babel/types': 7.25.0 - - '@babel/traverse@7.25.0': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 - '@babel/parser': 7.25.0 - '@babel/template': 7.25.0 - '@babel/types': 7.25.0 - debug: 4.3.5 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.25.0': - dependencies: - '@babel/helper-string-parser': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 - to-fast-properties: 2.0.0 - - '@es-joy/jsdoccomment@0.46.0': - dependencies: - comment-parser: 1.4.1 - esquery: 1.6.0 - jsdoc-type-pratt-parser: 4.0.0 - - '@esbuild/aix-ppc64@0.21.5': - optional: true - - '@esbuild/android-arm64@0.21.5': - optional: true - - '@esbuild/android-arm@0.21.5': - optional: true - - '@esbuild/android-x64@0.21.5': - optional: true - - '@esbuild/darwin-arm64@0.21.5': - optional: true - - '@esbuild/darwin-x64@0.21.5': - optional: true - - '@esbuild/freebsd-arm64@0.21.5': - optional: true - - '@esbuild/freebsd-x64@0.21.5': - optional: true - - '@esbuild/linux-arm64@0.21.5': - optional: true - - '@esbuild/linux-arm@0.21.5': - optional: true - - '@esbuild/linux-ia32@0.21.5': - optional: true - - '@esbuild/linux-loong64@0.21.5': - optional: true - - '@esbuild/linux-mips64el@0.21.5': - optional: true - - '@esbuild/linux-ppc64@0.21.5': - optional: true - - '@esbuild/linux-riscv64@0.21.5': - optional: true - - '@esbuild/linux-s390x@0.21.5': - optional: true - - '@esbuild/linux-x64@0.21.5': - optional: true - - '@esbuild/netbsd-x64@0.21.5': - optional: true - - '@esbuild/openbsd-x64@0.21.5': - optional: true - - '@esbuild/sunos-x64@0.21.5': - optional: true - - '@esbuild/win32-arm64@0.21.5': - optional: true - - '@esbuild/win32-ia32@0.21.5': - optional: true - - '@esbuild/win32-x64@0.21.5': - optional: true - - '@eslint-community/eslint-utils@4.4.0(eslint@8.56.0)': - dependencies: - eslint: 8.56.0 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.6.2': {} - - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.3.5 - espree: 9.6.1 - globals: 13.21.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@8.56.0': {} - - '@humanwhocodes/config-array@0.11.13': - dependencies: - '@humanwhocodes/object-schema': 2.0.1 - debug: 4.3.5 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/object-schema@2.0.1': {} - - '@jridgewell/gen-mapping@0.3.5': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - dependencies: - eslint-scope: 5.1.1 - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - - '@pkgr/core@0.1.1': {} - - '@textlint/ast-node-types@12.6.1': {} - - '@textlint/markdown-to-ast@12.6.1': - dependencies: - '@textlint/ast-node-types': 12.6.1 - debug: 4.3.5 - mdast-util-gfm-autolink-literal: 0.1.3 - remark-footnotes: 3.0.0 - remark-frontmatter: 3.0.0 - remark-gfm: 1.0.0 - remark-parse: 9.0.0 - traverse: 0.6.9 - unified: 9.2.2 - transitivePeerDependencies: - - supports-color - - '@types/json-schema@7.0.12': {} - - '@types/json5@0.0.29': {} - - '@types/mdast@3.0.15': - dependencies: - '@types/unist': 2.0.10 - - '@types/node@20.14.12': - dependencies: - undici-types: 5.26.5 - - '@types/semver@7.5.7': {} - - '@types/unist@2.0.10': {} - - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.5.4))(eslint@8.56.0)(typescript@5.5.4)': - dependencies: - '@eslint-community/regexpp': 4.6.2 - '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.5.4) - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.56.0)(typescript@5.5.4) - '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.5 - eslint: 8.56.0 - graphemer: 1.4.0 - ignore: 5.2.4 - natural-compare: 1.4.0 - semver: 7.6.3 - ts-api-utils: 1.0.1(typescript@5.5.4) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.5.4)': - dependencies: - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.5 - eslint: 8.56.0 - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - - '@typescript-eslint/type-utils@6.21.0(eslint@8.56.0)(typescript@5.5.4)': - dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) - '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.5.4) - debug: 4.3.5 - eslint: 8.56.0 - ts-api-utils: 1.0.1(typescript@5.5.4) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@6.21.0': {} - - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.5.4)': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.5 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.6.3 - ts-api-utils: 1.0.1(typescript@5.5.4) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@6.21.0(eslint@8.56.0)(typescript@5.5.4)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.7 - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) - eslint: 8.56.0 - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/visitor-keys@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - eslint-visitor-keys: 3.4.3 - - '@ungap/structured-clone@1.2.0': {} - - acorn-jsx@5.3.2(acorn@8.10.0): - dependencies: - acorn: 8.10.0 - - acorn@8.10.0: {} - - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - anchor-markdown-header@0.6.0: - dependencies: - emoji-regex: 10.1.0 - - ansi-regex@5.0.1: {} - - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - are-docs-informative@0.0.2: {} - - argparse@2.0.1: {} - - array-buffer-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 - - array-includes@3.1.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - is-string: 1.0.7 - - array-union@2.1.0: {} - - array.prototype.findlastindex@1.2.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 - - array.prototype.flat@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - - array.prototype.flatmap@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - - arraybuffer.prototype.slice@1.0.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 - - bail@1.0.5: {} - - balanced-match@1.0.2: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.0.1: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.2: - dependencies: - fill-range: 7.0.1 - - browserslist@4.23.2: - dependencies: - caniuse-lite: 1.0.30001643 - electron-to-chromium: 1.5.2 - node-releases: 2.0.18 - update-browserslist-db: 1.1.0(browserslist@4.23.2) - - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - - callsites@3.1.0: {} - - caniuse-lite@1.0.30001643: {} - - ccount@1.1.0: {} - - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - character-entities-legacy@1.1.4: {} - - character-entities@1.2.4: {} - - character-reference-invalid@1.1.4: {} - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.3: {} - - color-name@1.1.4: {} - - comment-parser@1.4.1: {} - - concat-map@0.0.1: {} - - convert-source-map@2.0.0: {} - - cross-spawn@7.0.3: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - data-view-buffer@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-offset@1.0.0: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - debug@3.2.7: - dependencies: - ms: 2.1.2 - - debug@4.3.5: - dependencies: - ms: 2.1.2 - - deep-is@0.1.4: {} - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - doctoc@2.2.1: - dependencies: - '@textlint/markdown-to-ast': 12.6.1 - anchor-markdown-header: 0.6.0 - htmlparser2: 7.2.0 - minimist: 1.2.8 - underscore: 1.13.7 - update-section: 0.3.3 - transitivePeerDependencies: - - supports-color - - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - - dom-serializer@1.4.1: - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - entities: 2.2.0 - - domelementtype@2.3.0: {} - - domhandler@4.3.1: - dependencies: - domelementtype: 2.3.0 - - domutils@2.8.0: - dependencies: - dom-serializer: 1.4.1 - domelementtype: 2.3.0 - domhandler: 4.3.1 - - electron-to-chromium@1.5.2: {} - - emoji-regex@10.1.0: {} - - entities@2.2.0: {} - - entities@3.0.1: {} - - es-abstract@1.23.3: - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.2 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - - es-errors@1.3.0: {} - - es-module-lexer@1.5.4: {} - - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.0.3: - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-shim-unscopables@1.0.2: - dependencies: - hasown: 2.0.2 - - es-to-primitive@1.2.1: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - - esbuild@0.21.5: - optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 - - escalade@3.1.2: {} - - escape-string-regexp@1.0.5: {} - - escape-string-regexp@4.0.0: {} - - eslint-config-prettier@9.1.0(eslint@8.56.0): - dependencies: - eslint: 8.56.0 - - eslint-config-standard@16.0.3(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.5.4))(eslint@8.56.0))(eslint-plugin-node@11.1.0(eslint@8.56.0))(eslint-plugin-promise@5.2.0(eslint@8.56.0))(eslint@8.56.0): - dependencies: - eslint: 8.56.0 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.5.4))(eslint@8.56.0) - eslint-plugin-node: 11.1.0(eslint@8.56.0) - eslint-plugin-promise: 5.2.0(eslint@8.56.0) - - eslint-import-resolver-node@0.3.9: - dependencies: - debug: 3.2.7 - is-core-module: 2.15.0 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@8.56.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.5.4) - eslint: 8.56.0 - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - - eslint-plugin-es@3.0.1(eslint@8.56.0): - dependencies: - eslint: 8.56.0 - eslint-utils: 2.1.0 - regexpp: 3.2.0 - - eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.5.4))(eslint@8.56.0): - dependencies: - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.56.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@8.56.0) - hasown: 2.0.2 - is-core-module: 2.15.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.5.4) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-jsdoc@48.8.3(eslint@8.56.0): - dependencies: - '@es-joy/jsdoccomment': 0.46.0 - are-docs-informative: 0.0.2 - comment-parser: 1.4.1 - debug: 4.3.5 - escape-string-regexp: 4.0.0 - eslint: 8.56.0 - esquery: 1.6.0 - parse-imports: 2.1.1 - semver: 7.6.3 - spdx-expression-parse: 4.0.0 - synckit: 0.9.1 - transitivePeerDependencies: - - supports-color - - eslint-plugin-node@11.1.0(eslint@8.56.0): - dependencies: - eslint: 8.56.0 - eslint-plugin-es: 3.0.1(eslint@8.56.0) - eslint-utils: 2.1.0 - ignore: 5.2.4 - minimatch: 3.1.2 - resolve: 1.22.8 - semver: 6.3.1 - - eslint-plugin-prefer-arrow@1.2.3(eslint@8.56.0): - dependencies: - eslint: 8.56.0 - - eslint-plugin-prettier@4.2.1(eslint-config-prettier@9.1.0(eslint@8.56.0))(eslint@8.56.0)(prettier@2.8.8): - dependencies: - eslint: 8.56.0 - prettier: 2.8.8 - prettier-linter-helpers: 1.0.0 - optionalDependencies: - eslint-config-prettier: 9.1.0(eslint@8.56.0) - - eslint-plugin-promise@5.2.0(eslint@8.56.0): - dependencies: - eslint: 8.56.0 - - eslint-scope@5.1.1: - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-utils@2.1.0: - dependencies: - eslint-visitor-keys: 1.3.0 - - eslint-visitor-keys@1.3.0: {} - - eslint-visitor-keys@2.1.0: {} - - eslint-visitor-keys@3.4.3: {} - - eslint@8.56.0: - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) - '@eslint-community/regexpp': 4.6.2 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.56.0 - '@humanwhocodes/config-array': 0.11.13 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.5 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.21.0 - graphemer: 1.4.0 - ignore: 5.2.4 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - espree@9.6.1: - dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.3 - - esquery@1.5.0: - dependencies: - estraverse: 5.3.0 - - esquery@1.6.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@4.3.0: {} - - estraverse@5.3.0: {} - - esutils@2.0.3: {} - - extend@3.0.2: {} - - fast-deep-equal@3.1.3: {} - - fast-diff@1.3.0: {} - - fast-glob@3.3.1: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - - fastq@1.15.0: - dependencies: - reusify: 1.0.4 - - fault@1.0.4: - dependencies: - format: 0.2.2 - - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.0.4 - - fill-range@7.0.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat-cache@3.0.4: - dependencies: - flatted: 3.2.2 - rimraf: 3.0.2 - - flatted@3.2.2: {} - - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - - format@0.2.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - function.prototype.name@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - functions-have-names: 1.2.3 - - functions-have-names@1.2.3: {} - - gensync@1.0.0-beta.2: {} - - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - - get-symbol-description@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - - get-tsconfig@4.7.5: - dependencies: - resolve-pkg-maps: 1.0.0 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - globals@11.12.0: {} - - globals@13.21.0: - dependencies: - type-fest: 0.20.2 - - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.0.1 - - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.1 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 - - graphemer@1.4.0: {} - - has-bigints@1.0.2: {} - - has-flag@3.0.0: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.0 - - has-proto@1.0.3: {} - - has-symbols@1.0.3: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.0.3 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - htmlparser2@7.2.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - domutils: 2.8.0 - entities: 3.0.1 - - ignore@5.2.4: {} - - import-fresh@3.3.0: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - imurmurhash@0.1.4: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - internal-slot@1.0.7: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.0.6 - - is-alphabetical@1.0.4: {} - - is-alphanumerical@1.0.4: - dependencies: - is-alphabetical: 1.0.4 - is-decimal: 1.0.4 - - is-array-buffer@3.0.4: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 - - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-buffer@2.0.5: {} - - is-callable@1.2.7: {} - - is-core-module@2.15.0: - dependencies: - hasown: 2.0.2 - - is-data-view@1.0.1: - dependencies: - is-typed-array: 1.1.13 - - is-date-object@1.0.5: - dependencies: - has-tostringtag: 1.0.2 - - is-decimal@1.0.4: {} - - is-extglob@2.1.1: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-hexadecimal@1.0.4: {} - - is-negative-zero@2.0.3: {} - - is-number-object@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - - is-number@7.0.0: {} - - is-path-inside@3.0.3: {} - - is-plain-obj@2.1.0: {} - - is-regex@1.1.4: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-shared-array-buffer@1.0.3: - dependencies: - call-bind: 1.0.7 - - is-string@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - - is-symbol@1.0.4: - dependencies: - has-symbols: 1.0.3 - - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.15 - - is-weakref@1.0.2: - dependencies: - call-bind: 1.0.7 - - isarray@2.0.5: {} - - isexe@2.0.0: {} - - js-tokens@4.0.0: {} - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - jsdoc-type-pratt-parser@4.0.0: {} - - jsesc@2.5.2: {} - - json-schema-traverse@0.4.1: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - - json5@2.2.3: {} - - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - lodash.merge@4.6.2: {} - - longest-streak@2.0.4: {} - - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - - markdown-table@2.0.0: - dependencies: - repeat-string: 1.6.1 - - mdast-util-find-and-replace@1.1.1: - dependencies: - escape-string-regexp: 4.0.0 - unist-util-is: 4.1.0 - unist-util-visit-parents: 3.1.1 - - mdast-util-footnote@0.1.7: - dependencies: - mdast-util-to-markdown: 0.6.5 - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color - - mdast-util-from-markdown@0.8.5: - dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-string: 2.0.0 - micromark: 2.11.4 - parse-entities: 2.0.0 - unist-util-stringify-position: 2.0.3 - transitivePeerDependencies: - - supports-color - - mdast-util-frontmatter@0.2.0: - dependencies: - micromark-extension-frontmatter: 0.2.2 - - mdast-util-gfm-autolink-literal@0.1.3: - dependencies: - ccount: 1.1.0 - mdast-util-find-and-replace: 1.1.1 - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-strikethrough@0.2.3: - dependencies: - mdast-util-to-markdown: 0.6.5 - - mdast-util-gfm-table@0.1.6: - dependencies: - markdown-table: 2.0.0 - mdast-util-to-markdown: 0.6.5 - - mdast-util-gfm-task-list-item@0.1.6: - dependencies: - mdast-util-to-markdown: 0.6.5 - - mdast-util-gfm@0.1.2: - dependencies: - mdast-util-gfm-autolink-literal: 0.1.3 - mdast-util-gfm-strikethrough: 0.2.3 - mdast-util-gfm-table: 0.1.6 - mdast-util-gfm-task-list-item: 0.1.6 - mdast-util-to-markdown: 0.6.5 - transitivePeerDependencies: - - supports-color - - mdast-util-to-markdown@0.6.5: - dependencies: - '@types/unist': 2.0.10 - longest-streak: 2.0.4 - mdast-util-to-string: 2.0.0 - parse-entities: 2.0.0 - repeat-string: 1.6.1 - zwitch: 1.0.5 - - mdast-util-to-string@2.0.0: {} - - merge2@1.4.1: {} - - micromark-extension-footnote@0.3.2: - dependencies: - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color - - micromark-extension-frontmatter@0.2.2: - dependencies: - fault: 1.0.4 - - micromark-extension-gfm-autolink-literal@0.5.7: - dependencies: - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color - - micromark-extension-gfm-strikethrough@0.6.5: - dependencies: - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color - - micromark-extension-gfm-table@0.4.3: - dependencies: - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color - - micromark-extension-gfm-tagfilter@0.3.0: {} - - micromark-extension-gfm-task-list-item@0.3.3: - dependencies: - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color - - micromark-extension-gfm@0.3.3: - dependencies: - micromark: 2.11.4 - micromark-extension-gfm-autolink-literal: 0.5.7 - micromark-extension-gfm-strikethrough: 0.6.5 - micromark-extension-gfm-table: 0.4.3 - micromark-extension-gfm-tagfilter: 0.3.0 - micromark-extension-gfm-task-list-item: 0.3.3 - transitivePeerDependencies: - - supports-color - - micromark@2.11.4: - dependencies: - debug: 4.3.5 - parse-entities: 2.0.0 - transitivePeerDependencies: - - supports-color - - micromatch@4.0.5: - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@9.0.3: - dependencies: - brace-expansion: 2.0.1 - - minimist@1.2.8: {} - - ms@2.1.2: {} - - natural-compare@1.4.0: {} - - node-releases@2.0.18: {} - - object-inspect@1.13.2: {} - - object-keys@1.1.1: {} - - object.assign@4.1.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - - object.fromentries@2.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - - object.groupby@1.0.3: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - - object.values@1.2.0: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - optionator@0.9.3: - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - parse-entities@2.0.0: - dependencies: - character-entities: 1.2.4 - character-entities-legacy: 1.1.4 - character-reference-invalid: 1.1.4 - is-alphanumerical: 1.0.4 - is-decimal: 1.0.4 - is-hexadecimal: 1.0.4 - - parse-imports@2.1.1: - dependencies: - es-module-lexer: 1.5.4 - slashes: 3.0.12 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - path-key@3.1.1: {} - - path-parse@1.0.7: {} - - path-type@4.0.0: {} - - picocolors@1.0.1: {} - - picomatch@2.3.1: {} - - possible-typed-array-names@1.0.0: {} - - prelude-ls@1.2.1: {} - - prettier-linter-helpers@1.0.0: - dependencies: - fast-diff: 1.3.0 - - prettier@2.8.8: {} - - punycode@2.3.1: {} - - queue-microtask@1.2.3: {} - - regexp.prototype.flags@1.5.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 - - regexpp@3.2.0: {} - - remark-footnotes@3.0.0: - dependencies: - mdast-util-footnote: 0.1.7 - micromark-extension-footnote: 0.3.2 - transitivePeerDependencies: - - supports-color - - remark-frontmatter@3.0.0: - dependencies: - mdast-util-frontmatter: 0.2.0 - micromark-extension-frontmatter: 0.2.2 - - remark-gfm@1.0.0: - dependencies: - mdast-util-gfm: 0.1.2 - micromark-extension-gfm: 0.3.3 - transitivePeerDependencies: - - supports-color - - remark-parse@9.0.0: - dependencies: - mdast-util-from-markdown: 0.8.5 - transitivePeerDependencies: - - supports-color - - repeat-string@1.6.1: {} - - resolve-from@4.0.0: {} - - resolve-pkg-maps@1.0.0: {} - - resolve@1.22.8: - dependencies: - is-core-module: 2.15.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - reusify@1.0.4: {} - - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - safe-array-concat@1.1.2: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - isarray: 2.0.5 - - safe-regex-test@1.0.3: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - - semver@6.3.1: {} - - semver@7.6.3: {} - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - side-channel@1.0.6: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.2 - - slash@3.0.0: {} - - slashes@3.0.12: {} - - spdx-exceptions@2.5.0: {} - - spdx-expression-parse@4.0.0: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.18 - - spdx-license-ids@3.0.18: {} - - string.prototype.trim@1.2.9: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - - string.prototype.trimend@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: {} - - strip-json-comments@3.1.1: {} - - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-preserve-symlinks-flag@1.0.0: {} - - synckit@0.9.1: - dependencies: - '@pkgr/core': 0.1.1 - tslib: 2.6.3 - - text-table@0.2.0: {} - - to-fast-properties@2.0.0: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - traverse@0.6.9: - dependencies: - gopd: 1.0.1 - typedarray.prototype.slice: 1.0.3 - which-typed-array: 1.1.15 - - trough@1.0.5: {} - - ts-api-utils@1.0.1(typescript@5.5.4): - dependencies: - typescript: 5.5.4 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - - tslib@2.6.3: {} - - tsx@4.16.2: - dependencies: - esbuild: 0.21.5 - get-tsconfig: 4.7.5 - optionalDependencies: - fsevents: 2.3.3 - - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - - type-fest@0.20.2: {} - - typed-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - - typed-array-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-byte-offset@1.0.2: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-length@1.0.6: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - - typedarray.prototype.slice@1.0.3: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - typed-array-buffer: 1.0.2 - typed-array-byte-offset: 1.0.2 - - typescript@5.5.4: {} - - unbox-primitive@1.0.2: - dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - - underscore@1.13.7: {} - - undici-types@5.26.5: {} - - unified@9.2.2: - dependencies: - '@types/unist': 2.0.10 - bail: 1.0.5 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 2.1.0 - trough: 1.0.5 - vfile: 4.2.1 - - unist-util-is@4.1.0: {} - - unist-util-stringify-position@2.0.3: - dependencies: - '@types/unist': 2.0.10 - - unist-util-visit-parents@3.1.1: - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 4.1.0 - - update-browserslist-db@1.1.0(browserslist@4.23.2): - dependencies: - browserslist: 4.23.2 - escalade: 3.1.2 - picocolors: 1.0.1 - - update-section@0.3.3: {} - - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - - vfile-message@2.0.4: - dependencies: - '@types/unist': 2.0.10 - unist-util-stringify-position: 2.0.3 - - vfile@4.2.1: - dependencies: - '@types/unist': 2.0.10 - is-buffer: 2.0.5 - unist-util-stringify-position: 2.0.3 - vfile-message: 2.0.4 - - which-boxed-primitive@1.0.2: - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - - which-typed-array@1.1.15: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.2 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - wrappy@1.0.2: {} - - yallist@3.1.1: {} - - yocto-queue@0.1.0: {} - - zwitch@1.0.5: {} diff --git a/packages/contracts-bedrock/scripts/checks/check-snapshots.sh b/packages/contracts-bedrock/scripts/checks/check-snapshots.sh index cc1ffabd3659..dca296ee8390 100755 --- a/packages/contracts-bedrock/scripts/checks/check-snapshots.sh +++ b/packages/contracts-bedrock/scripts/checks/check-snapshots.sh @@ -3,7 +3,7 @@ set -euo pipefail # Generate the snapshots -pnpm snapshots +just snapshots # Check if the generated `snapshots` or `test/kontrol` files are different from the committed versions if git diff --exit-code snapshots test/kontrol > /dev/null; then diff --git a/packages/contracts-bedrock/scripts/getting-started/versions.sh b/packages/contracts-bedrock/scripts/getting-started/versions.sh index 18c0ca3228f8..5ff2369daedd 100755 --- a/packages/contracts-bedrock/scripts/getting-started/versions.sh +++ b/packages/contracts-bedrock/scripts/getting-started/versions.sh @@ -37,6 +37,7 @@ ver_foundry=$(versionFoundry "$(forge --version)") ver_make=$(version "$(make --version)") ver_jq=$(version "$(jq --version)") ver_direnv=$(version "$(direnv --version)") +ver_just=$(version "$(just --version)") # Print versions echo "Dependency | Minimum | Actual" @@ -48,3 +49,4 @@ echo "foundry 0.2.0 (a5efe4f) $ver_foundry" echo "make 3 $ver_make" echo "jq 1.6 $ver_jq" echo "direnv 2 $ver_direnv" +echo "just 1.34.0 $ver_just" diff --git a/packages/contracts-bedrock/test/libraries/SafeCall.t.sol b/packages/contracts-bedrock/test/libraries/SafeCall.t.sol index fcb9d3832a12..5bd3fb3a4ab7 100644 --- a/packages/contracts-bedrock/test/libraries/SafeCall.t.sol +++ b/packages/contracts-bedrock/test/libraries/SafeCall.t.sol @@ -13,6 +13,8 @@ contract SafeCall_Test is Test { function assumeNot(address _addr) internal { vm.assume(_addr.balance == 0); vm.assume(_addr != address(this)); + vm.assume(uint256(uint160(_addr)) > uint256(256)); // TODO temp fix until new forge-std release with modern + // precompiles: https://github.com/foundry-rs/forge-std/pull/594 assumeAddressIsNot(_addr, StdCheatsSafe.AddressType.ForgeAddress, StdCheatsSafe.AddressType.Precompile); } diff --git a/packages/contracts-bedrock/tsconfig.json b/packages/contracts-bedrock/tsconfig.json deleted file mode 100644 index 7c7a62708773..000000000000 --- a/packages/contracts-bedrock/tsconfig.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "compilerOptions": { - "outDir": "./dist", - "skipLibCheck": true, - "module": "commonjs", - "target": "es2017", - "sourceMap": true, - "esModuleInterop": true, - "composite": true, - "resolveJsonModule": true, - "declaration": true, - "noImplicitAny": false, - "removeComments": true, - "noLib": false, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "typeRoots": [ - "node_modules/@types" - ] - }, - "exclude": [ - "node_modules", - "dist" - ], - "include": [ - "deploy-config/**/*", - "deploy-config/**/*.json", - "scripts/**/*" - ] -} diff --git a/versions.json b/versions.json index 57327d62159d..0850a4d507bf 100644 --- a/versions.json +++ b/versions.json @@ -5,5 +5,6 @@ "eth2_testnet_genesis": "v0.10.0", "nvm": "v20.9.0", "slither": "0.10.2", - "kontrol": "0.1.316" + "kontrol": "0.1.316", + "just": "1.34.0" } From cc67d34e24b774eb6271d12d156e6de7c38c505e Mon Sep 17 00:00:00 2001 From: Adrian Sutton Date: Thu, 8 Aug 2024 06:30:14 +1000 Subject: [PATCH 29/59] op-proposer, op-batcher: Wait for sync in Start rather than loop. (#11192) Ensures that if it fails, the process exits with an error, rather than just exiting the runloop and continuing on in a zombie mode that doesn't do anything but doesn't exit. --- op-batcher/batcher/driver.go | 14 +++++++------- op-proposer/proposer/driver.go | 15 +++++++-------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/op-batcher/batcher/driver.go b/op-batcher/batcher/driver.go index 0b5286abb3d9..55a8f04ecf57 100644 --- a/op-batcher/batcher/driver.go +++ b/op-batcher/batcher/driver.go @@ -114,6 +114,13 @@ func (l *BatchSubmitter) StartBatchSubmitting() error { l.clearState(l.shutdownCtx) l.lastStoredBlock = eth.BlockID{} + if l.Config.WaitNodeSync { + err := l.waitNodeSync() + if err != nil { + return fmt.Errorf("error waiting for node sync: %w", err) + } + } + l.wg.Add(1) go l.loop() @@ -289,13 +296,6 @@ const ( func (l *BatchSubmitter) loop() { defer l.wg.Done() - if l.Config.WaitNodeSync { - err := l.waitNodeSync() - if err != nil { - l.Log.Error("Error waiting for node sync", "err", err) - return - } - } receiptsCh := make(chan txmgr.TxReceipt[txRef]) queue := txmgr.NewQueue[txRef](l.killCtx, l.Txmgr, l.Config.MaxPendingTransactions) diff --git a/op-proposer/proposer/driver.go b/op-proposer/proposer/driver.go index 7f8caac53f8b..171595946bb2 100644 --- a/op-proposer/proposer/driver.go +++ b/op-proposer/proposer/driver.go @@ -178,6 +178,13 @@ func (l *L2OutputSubmitter) StartL2OutputSubmitting() error { } l.running = true + if l.Cfg.WaitNodeSync { + err := l.waitNodeSync() + if err != nil { + return fmt.Errorf("error waiting for node sync: %w", err) + } + } + l.wg.Add(1) go l.loop() @@ -429,14 +436,6 @@ func (l *L2OutputSubmitter) loop() { defer l.wg.Done() ctx := l.ctx - if l.Cfg.WaitNodeSync { - err := l.waitNodeSync() - if err != nil { - l.Log.Error("Error waiting for node sync", "err", err) - return - } - } - if l.dgfContract == nil { l.loopL2OO(ctx) } else { From 051db548a7f968b8c1b88da7135d0bf9cbea4954 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Thu, 8 Aug 2024 00:33:43 +0300 Subject: [PATCH 30/59] contracts-bedrock: improve `CrossL2Inbox` devex (#11322) * contracts-bedrock: improve `CrossL2Inbox` devex Improve the `CrossL2Inbox` devex by creating an alternative entrypoint. This design was not considered previously because there was a "top level call" restriction, aka the "only EOA" invariant. This was to allow for static analysis of transactions, keeping resource usage lower for validating transactions when building blocks or at the mempool layer. Since 3074/7702 render the enforcement of only eoa impossible, we decided to op/acc and lean into the approach of allowing subcalls to trigger `ExecutingMessage` events. This new interface allows another contract to be the entrypoint, the idea is that the user sends the `Identifier` and the serialized log (message) to whatever contract that they want and then pass it to `CrossL2Inbox.validateMessage` which then emits the event that consensus validates. This allows the calling smart contract to be aware of the schema for the log and deserialize it however they see fit. Since the serialized logs are done with the following algorithm: ```go msg := make([]byte, 0) for _, topic := range log.Topics { msg = append(msg, topic.Bytes()...) } msg = append(msg, log.Data...) ``` It is very easy to use `abi.decode` to decode a log, given that solidity was used to `emit` it. The topics are `bytes32` and then the data is abi encoded given the schema of the event itself. Unused parts like `topic[0]` (hash of the event name) can be dropped when decoding if they are not required. * ctb: fix typo * remove nonReentrant and add tests for validateMessage, rename ENTERED_SLOT preimage * add natspec for _checkIdentifier and update that of validateMessage * update version and semver-lock file * check all topics in crossl2inbox test, run pnpm snapshots * tests: fix --------- Co-authored-by: Michael Amadi --- packages/contracts-bedrock/semver-lock.json | 8 +-- .../snapshots/abi/CrossL2Inbox.json | 50 +++++++++++++++ .../abi/TransientReentrancyAware.json | 13 +++- .../contracts-bedrock/src/L2/CrossL2Inbox.sol | 41 +++++++++---- .../src/L2/L2ToL2CrossDomainMessenger.sol | 36 +---------- .../src/libraries/TransientContext.sol | 45 ++++++++++++++ .../test/L2/CrossL2Inbox.t.sol | 61 +++++++++++++++++++ 7 files changed, 202 insertions(+), 52 deletions(-) diff --git a/packages/contracts-bedrock/semver-lock.json b/packages/contracts-bedrock/semver-lock.json index dc1f1cc9c4c5..3980893a8609 100644 --- a/packages/contracts-bedrock/semver-lock.json +++ b/packages/contracts-bedrock/semver-lock.json @@ -68,8 +68,8 @@ "sourceCodeHash": "0x3a725791a0f5ed84dc46dcdae26f6170a759b2fe3dc360d704356d088b76cfd6" }, "src/L2/CrossL2Inbox.sol": { - "initCodeHash": "0x318b1e98f1686920e3d309390983454685aa84ed997598ead1b4c1a1938206c4", - "sourceCodeHash": "0xb0d2d5944f11bdf44cb6a16a9b00ab76a9b9f5ab2abb081781fb1c27927eb5ab" + "initCodeHash": "0x80124454d2127d5ff340b0ef048be6d5bf5984e84c75021b6a1ffa81703a2503", + "sourceCodeHash": "0xfb26fc80fbc7febdc91ac73ea91ceb479b238e0e81804a0a21192d78c261a755" }, "src/L2/ETHLiquidity.sol": { "initCodeHash": "0x98177562fca0de0dfea5313c9acefe2fdbd73dee5ce6c1232055601f208f0177", @@ -108,8 +108,8 @@ "sourceCodeHash": "0x8388b9b8075f31d580fed815b66b45394e40fb1a63cd8cda2272d2c390fc908c" }, "src/L2/L2ToL2CrossDomainMessenger.sol": { - "initCodeHash": "0xda499b71aec14976b8e133fad9ece083805f5ff520f0e88f89232fd837451954", - "sourceCodeHash": "0x7a9cddf5b54ac72457231f0c09b8e88398202ac29125cd63318b8389c81e119b" + "initCodeHash": "0xe390be1390edc38fd879d7620538560076d7fcf3ef9debce327a1877d96d3ff0", + "sourceCodeHash": "0x20f77dc5a02869c6885b73347fa9e7d2bbc4eaf8a2313f7e7435e456001f7a75" }, "src/L2/SequencerFeeVault.sol": { "initCodeHash": "0xb94145f571e92ee615c6fe903b6568e8aac5fe760b6b65148ffc45d2fb0f5433", diff --git a/packages/contracts-bedrock/snapshots/abi/CrossL2Inbox.json b/packages/contracts-bedrock/snapshots/abi/CrossL2Inbox.json index fab918cc88fc..db1a70423c69 100644 --- a/packages/contracts-bedrock/snapshots/abi/CrossL2Inbox.json +++ b/packages/contracts-bedrock/snapshots/abi/CrossL2Inbox.json @@ -114,6 +114,51 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "origin", + "type": "address" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "logIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "internalType": "struct ICrossL2Inbox.Identifier", + "name": "_id", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "_msgHash", + "type": "bytes32" + } + ], + "name": "validateMessage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "version", @@ -188,6 +233,11 @@ "name": "NotEntered", "type": "error" }, + { + "inputs": [], + "name": "ReentrantCall", + "type": "error" + }, { "inputs": [], "name": "TargetCallFailed", diff --git a/packages/contracts-bedrock/snapshots/abi/TransientReentrancyAware.json b/packages/contracts-bedrock/snapshots/abi/TransientReentrancyAware.json index 0637a088a01e..02e2e526860f 100644 --- a/packages/contracts-bedrock/snapshots/abi/TransientReentrancyAware.json +++ b/packages/contracts-bedrock/snapshots/abi/TransientReentrancyAware.json @@ -1 +1,12 @@ -[] \ No newline at end of file +[ + { + "inputs": [], + "name": "NotEntered", + "type": "error" + }, + { + "inputs": [], + "name": "ReentrantCall", + "type": "error" + } +] \ No newline at end of file diff --git a/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol b/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol index 970cb80d97a4..9c464df590e7 100644 --- a/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol +++ b/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol @@ -56,21 +56,14 @@ contract CrossL2Inbox is ICrossL2Inbox, ISemver, TransientReentrancyAware { bytes32 internal constant CHAINID_SLOT = 0x6e0446e8b5098b8c8193f964f1b567ec3a2bdaeba33d36acb85c1f1d3f92d313; /// @notice Semantic version. - /// @custom:semver 1.0.0-beta.3 - string public constant version = "1.0.0-beta.3"; + /// @custom:semver 1.0.0-beta.4 + string public constant version = "1.0.0-beta.4"; /// @notice Emitted when a cross chain message is being executed. /// @param msgHash Hash of message payload being executed. /// @param id Encoded Identifier of the message. event ExecutingMessage(bytes32 indexed msgHash, Identifier id); - /// @notice Enforces that cross domain message sender and source are set. Reverts if not. - /// Used to differentiate between 0 and nil in transient storage. - modifier notEntered() { - if (TransientContext.callDepth() == 0) revert NotEntered(); - _; - } - /// @notice Returns the origin address of the Identifier. If not entered, reverts. /// @return Origin address of the Identifier. function origin() external view notEntered returns (address) { @@ -114,10 +107,8 @@ contract CrossL2Inbox is ICrossL2Inbox, ISemver, TransientReentrancyAware { payable reentrantAware { - if (_id.timestamp > block.timestamp) revert InvalidTimestamp(); - if (!IDependencySet(Predeploys.L1_BLOCK_ATTRIBUTES).isInDependencySet(_id.chainId)) { - revert InvalidChainId(); - } + // Check the Identifier. + _checkIdentifier(_id); // Store the Identifier in transient storage. _storeIdentifier(_id); @@ -131,6 +122,30 @@ contract CrossL2Inbox is ICrossL2Inbox, ISemver, TransientReentrancyAware { emit ExecutingMessage(keccak256(_message), _id); } + /// @notice Validates a cross chain message on the destination chain + /// and emits an ExecutingMessage event. This function is useful + /// for applications that understand the schema of the _message payload and want to + /// process it in a custom way. + /// @param _id Identifier of the message. + /// @param _msgHash Hash of the message payload to call target with. + function validateMessage(Identifier calldata _id, bytes32 _msgHash) external { + // Check the Identifier. + _checkIdentifier(_id); + + emit ExecutingMessage(_msgHash, _id); + } + + /// @notice Validates that for a given cross chain message identifier, + /// it's timestamp is not in the future and the source chainId + /// is in the destination chain's dependency set. + /// @param _id Identifier of the message. + function _checkIdentifier(Identifier calldata _id) internal view { + if (_id.timestamp > block.timestamp) revert InvalidTimestamp(); + if (!IDependencySet(Predeploys.L1_BLOCK_ATTRIBUTES).isInDependencySet(_id.chainId)) { + revert InvalidChainId(); + } + } + /// @notice Stores the Identifier in transient storage. /// @param _id Identifier to store. function _storeIdentifier(Identifier calldata _id) internal { diff --git a/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol b/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol index cafcf0d0ccd7..6415b3cc0650 100644 --- a/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol +++ b/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol @@ -7,6 +7,7 @@ import { CrossL2Inbox } from "src/L2/CrossL2Inbox.sol"; import { IL2ToL2CrossDomainMessenger } from "src/L2/IL2ToL2CrossDomainMessenger.sol"; import { ISemver } from "src/universal/ISemver.sol"; import { SafeCall } from "src/libraries/SafeCall.sol"; +import { TransientReentrancyAware } from "src/libraries/TransientContext.sol"; /// @notice Thrown when a non-written slot in transient storage is attempted to be read from. error NotEntered(); @@ -41,11 +42,7 @@ error ReentrantCall(); /// @notice The L2ToL2CrossDomainMessenger is a higher level abstraction on top of the CrossL2Inbox that provides /// features necessary for secure transfers ERC20 tokens between L2 chains. Messages sent through the /// L2ToL2CrossDomainMessenger on the source chain receive both replay protection as well as domain binding. -contract L2ToL2CrossDomainMessenger is IL2ToL2CrossDomainMessenger, ISemver { - /// @notice Storage slot for `entered` value. - /// Equal to bytes32(uint256(keccak256("l2tol2crossdomainmessenger.entered")) - 1) - bytes32 internal constant ENTERED_SLOT = 0xf53fc38c5e461bdcbbeb47887fecf014abd399293109cd50f65e5f9078cfd025; - +contract L2ToL2CrossDomainMessenger is IL2ToL2CrossDomainMessenger, ISemver, TransientReentrancyAware { /// @notice Storage slot for the sender of the current cross domain message. /// Equal to bytes32(uint256(keccak256("l2tol2crossdomainmessenger.sender")) - 1) bytes32 internal constant CROSS_DOMAIN_MESSAGE_SENDER_SLOT = @@ -80,25 +77,6 @@ contract L2ToL2CrossDomainMessenger is IL2ToL2CrossDomainMessenger, ISemver { /// @param messageHash Hash of the message that failed to be relayed. event FailedRelayedMessage(bytes32 indexed messageHash); - /// @notice Enforces that a function cannot be re-entered. - modifier nonReentrant() { - if (_entered()) revert ReentrantCall(); - assembly { - tstore(ENTERED_SLOT, 1) - } - _; - assembly { - tstore(ENTERED_SLOT, 0) - } - } - - /// @notice Enforces that cross domain message sender and source are set. Reverts if not. - /// Used to differentiate between 0 and nil in transient storage. - modifier onlyEntered() { - if (!_entered()) revert NotEntered(); - _; - } - /// @notice Retrieves the sender of the current cross domain message. If not entered, reverts. /// @return _sender Address of the sender of the current cross domain message. function crossDomainMessageSender() external view onlyEntered returns (address _sender) { @@ -193,16 +171,6 @@ contract L2ToL2CrossDomainMessenger is IL2ToL2CrossDomainMessenger, ISemver { return Encoding.encodeVersionedNonce(msgNonce, messageVersion); } - /// @notice Retrieves whether the contract is currently entered or not. - /// @return True if the contract is entered, and false otherwise. - function _entered() internal view returns (bool) { - uint256 value; - assembly { - value := tload(ENTERED_SLOT) - } - return value != 0; - } - /// @notice Stores message data such as sender and source in transient storage. /// @param _source Chain ID of the source chain. /// @param _sender Address of the sender of the message. diff --git a/packages/contracts-bedrock/src/libraries/TransientContext.sol b/packages/contracts-bedrock/src/libraries/TransientContext.sol index 4dfb92070d6b..afc852787cf2 100644 --- a/packages/contracts-bedrock/src/libraries/TransientContext.sol +++ b/packages/contracts-bedrock/src/libraries/TransientContext.sol @@ -61,10 +61,55 @@ library TransientContext { /// @notice Reentrancy-aware modifier for transient storage, which increments and /// decrements the call depth when entering and exiting a function. contract TransientReentrancyAware { + /// @notice Thrown when a non-written transient storage slot is attempted to be read from. + error NotEntered(); + + /// @notice Thrown when a reentrant call is detected. + error ReentrantCall(); + + /// @notice Storage slot for `entered` value. + /// Equal to bytes32(uint256(keccak256("transientreentrancyaware.entered")) - 1) + bytes32 internal constant ENTERED_SLOT = 0xf13569814868ede994184d5a425471fb19e869768a33421cb701a2ba3d420c0a; + /// @notice Modifier to make a function reentrancy-aware. modifier reentrantAware() { TransientContext.increment(); _; TransientContext.decrement(); } + + /// @notice Enforces that a function cannot be re-entered. + modifier nonReentrant() { + if (_entered()) revert ReentrantCall(); + assembly { + tstore(ENTERED_SLOT, 1) + } + _; + assembly { + tstore(ENTERED_SLOT, 0) + } + } + + /// @notice Enforces that cross domain message sender and source are set. Reverts if not. + /// Used to differentiate between 0 and nil in transient storage. + modifier notEntered() { + if (TransientContext.callDepth() == 0) revert NotEntered(); + _; + } + + /// @notice Enforces that cross domain message sender and source are set. Reverts if not. + /// Used to differentiate between 0 and nil in transient storage. + modifier onlyEntered() { + if (!_entered()) revert NotEntered(); + _; + } + + /// @notice Retrieves whether the contract is currently entered or not. + /// @return entered_ True if the contract is entered, and false otherwise. + function _entered() internal view returns (bool entered_) { + assembly { + let value := tload(ENTERED_SLOT) + entered_ := gt(value, 0) + } + } } diff --git a/packages/contracts-bedrock/test/L2/CrossL2Inbox.t.sol b/packages/contracts-bedrock/test/L2/CrossL2Inbox.t.sol index 9350e6b2fbbc..c126b596ebc2 100644 --- a/packages/contracts-bedrock/test/L2/CrossL2Inbox.t.sol +++ b/packages/contracts-bedrock/test/L2/CrossL2Inbox.t.sol @@ -271,6 +271,67 @@ contract CrossL2InboxTest is Test { crossL2Inbox.executeMessage{ value: _value }({ _id: _id, _target: _target, _message: _message }); } + function testFuzz_validateMessage_succeeds(ICrossL2Inbox.Identifier memory _id, bytes32 _messageHash) external { + // Ensure that the id's timestamp is valid (less than or equal to the current block timestamp) + _id.timestamp = bound(_id.timestamp, 1, block.timestamp); + + // Ensure that the chain ID is in the dependency set + vm.mockCall({ + callee: Predeploys.L1_BLOCK_ATTRIBUTES, + data: abi.encodeWithSelector(L1BlockIsInDependencySetSelector, _id.chainId), + returnData: abi.encode(true) + }); + + // Look for the emit ExecutingMessage event + vm.expectEmit(Predeploys.CROSS_L2_INBOX); + emit CrossL2Inbox.ExecutingMessage(_messageHash, _id); + + // Call the validateMessage function + crossL2Inbox.validateMessage(_id, _messageHash); + } + + /// @dev Tests that the `validateMessage` function reverts when called with an identifier with an invalid timestamp. + function testFuzz_validateMessage_invalidTimestamp_reverts( + ICrossL2Inbox.Identifier calldata _id, + bytes32 _messageHash + ) + external + { + // Ensure that the id's timestamp is invalid (greater thsan the current block timestamp) + vm.assume(_id.timestamp > block.timestamp); + + // Expect a revert with the InvalidTimestamp selector + vm.expectRevert(InvalidTimestamp.selector); + + // Call the validateMessage function + crossL2Inbox.validateMessage(_id, _messageHash); + } + + /// @dev Tests that the `validateMessage` function reverts when called with an identifier with a chain ID not in the + /// dependency set. + function testFuzz_validateMessage_invalidChainId_reverts( + ICrossL2Inbox.Identifier memory _id, + bytes32 _messageHash + ) + external + { + // Ensure that the timestamp is valid (less than or equal to the current block timestamp) + _id.timestamp = bound(_id.timestamp, 0, block.timestamp); + + // Ensure that the chain ID is NOT in the dependency set. + vm.mockCall({ + callee: Predeploys.L1_BLOCK_ATTRIBUTES, + data: abi.encodeWithSelector(L1BlockIsInDependencySetSelector, _id.chainId), + returnData: abi.encode(false) + }); + + // Expect a revert with the InvalidChainId selector + vm.expectRevert(InvalidChainId.selector); + + // Call the validateMessage function + crossL2Inbox.validateMessage(_id, _messageHash); + } + /// @dev Tests that the `origin` function returns the correct value. function testFuzz_origin_succeeds(address _origin) external { // Increment the call depth to prevent NotEntered revert From b047e1fd3b16d76c820d6e8cfc3cac4ede09d847 Mon Sep 17 00:00:00 2001 From: Adrian Sutton Date: Thu, 8 Aug 2024 09:08:11 +1000 Subject: [PATCH 31/59] Revert "Fix devnet-up when op-program/bin is missing prestate-proof.json (#11383)" (#11393) This reverts commit 2491a3732fe97c9eec9baf615a010e8f7a42f738. make cannon-prestate doesn't declare all transitive dependencies properly so can fail to build when there are changes. --- Makefile | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index 2f9620ee9273..51d0d1397b33 100644 --- a/Makefile +++ b/Makefile @@ -137,18 +137,11 @@ reproducible-prestate: ## Builds reproducible-prestate binary make -C ./op-program reproducible-prestate .PHONY: reproducible-prestate -# Checks if prestate outputs are missing -cannon-prestate: op-program/bin/prestate-proof.json -.PHONY: cannon-prestate - -op-program/bin/prestate-proof.json: - make generate-cannon-prestates - -generate-cannon-prestates: op-program cannon ## Generates prestate using cannon and op-program +cannon-prestate: op-program cannon ## Generates prestate using cannon and op-program ./cannon/bin/cannon load-elf --path op-program/bin/op-program-client.elf --out op-program/bin/prestate.json --meta op-program/bin/meta.json ./cannon/bin/cannon run --proof-at '=0' --stop-at '=1' --input op-program/bin/prestate.json --meta op-program/bin/meta.json --proof-fmt 'op-program/bin/%d.json' --output "" mv op-program/bin/0.json op-program/bin/prestate-proof.json -.PHONY: generate-cannon-prestates +.PHONY: cannon-prestate mod-tidy: ## Cleans up unused dependencies in Go modules # Below GOPRIVATE line allows mod-tidy to be run immediately after @@ -167,14 +160,16 @@ nuke: clean devnet-clean ## Completely clean the project directory git clean -Xdf .PHONY: nuke -## Prepares for running a local devnet -pre-devnet: submodules cannon-prestate +pre-devnet: submodules ## Prepares for running a local devnet @if ! [ -x "$(command -v geth)" ]; then \ make install-geth; \ fi @if ! [ -x "$(command -v eth2-testnet-genesis)" ]; then \ make install-eth2-testnet-genesis; \ fi + @if [ ! -e op-program/bin ]; then \ + make cannon-prestate; \ + fi .PHONY: pre-devnet devnet-up: pre-devnet ## Starts the local devnet From 2f295d035e96aa1391335132a7936e468ef0c920 Mon Sep 17 00:00:00 2001 From: protolambda Date: Wed, 7 Aug 2024 22:02:22 -0600 Subject: [PATCH 32/59] devnet/e2e: run L1 Deneb and L2 Fjord by default (#11359) * devnet/e2e: run L1 Deneb and L2 Fjord by default * op-e2e: fix TestPostUnsafePayload * op-e2e: Fix TestGasPriceOracleFeeUpdates * op-e2e/actions: fix some tests The L2EngineAPI test needs more fixing * tests: fixes to support Ecotone/Fjord in more tests * op-e2e: one more fix --------- Co-authored-by: Sebastian Stammler --- op-e2e/actions/dencun_fork_test.go | 34 ++------ op-e2e/actions/ecotone_fork_test.go | 10 +-- op-e2e/actions/l2_engine_test.go | 56 ++++++++---- op-e2e/actions/span_batch_test.go | 5 ++ op-e2e/actions/system_config_test.go | 8 ++ op-e2e/system_adminrpc_test.go | 10 +-- op-e2e/system_tob_test.go | 69 +++++++-------- .../l2/engineapi/test/l2_engine_api_tests.go | 85 ++++++++++++------- ops-bedrock/beacon-data/config.yaml | 3 +- ops-bedrock/l1-generate-beacon-genesis.sh | 2 +- .../deploy-config/devnetL1-template.json | 5 +- 11 files changed, 155 insertions(+), 132 deletions(-) diff --git a/op-e2e/actions/dencun_fork_test.go b/op-e2e/actions/dencun_fork_test.go index 5e0f1706cb31..9b411e28f1e7 100644 --- a/op-e2e/actions/dencun_fork_test.go +++ b/op-e2e/actions/dencun_fork_test.go @@ -62,8 +62,7 @@ func TestDencunL1ForkAfterGenesis(gt *testing.T) { func TestDencunL1ForkAtGenesis(gt *testing.T) { t := NewDefaultTesting(gt) dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - offset := hexutil.Uint64(0) - dp.DeployConfig.L1CancunTimeOffset = &offset + require.Zero(t, *dp.DeployConfig.L1CancunTimeOffset) sd := e2eutils.Setup(t, dp, defaultAlloc) log := testlog.Logger(t, log.LevelDebug) _, _, miner, sequencer, _, verifier, _, batcher := setupReorgTestActors(t, dp, sd, log) @@ -120,14 +119,13 @@ func verifyEcotoneBlock(gt *testing.T, header *types.Header) { func TestDencunL2ForkAfterGenesis(gt *testing.T) { t := NewDefaultTesting(gt) dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - - cancunOffset := hexutil.Uint64(0) - dp.DeployConfig.L1CancunTimeOffset = &cancunOffset + require.Zero(t, *dp.DeployConfig.L1CancunTimeOffset) // This test wil fork on the second block offset := hexutil.Uint64(dp.DeployConfig.L2BlockTime * 2) - dp.DeployConfig.L2GenesisCanyonTimeOffset = &offset - dp.DeployConfig.L2GenesisDeltaTimeOffset = &offset dp.DeployConfig.L2GenesisEcotoneTimeOffset = &offset + dp.DeployConfig.L2GenesisFjordTimeOffset = nil + dp.DeployConfig.L2GenesisGraniteTimeOffset = nil + // New forks have to be added here, after changing the default deploy config! sd := e2eutils.Setup(t, dp, defaultAlloc) log := testlog.Logger(t, log.LevelDebug) @@ -159,12 +157,7 @@ func TestDencunL2ForkAfterGenesis(gt *testing.T) { func TestDencunL2ForkAtGenesis(gt *testing.T) { t := NewDefaultTesting(gt) dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - offset := hexutil.Uint64(0) - dp.DeployConfig.L2GenesisRegolithTimeOffset = &offset - dp.DeployConfig.L1CancunTimeOffset = &offset - dp.DeployConfig.L2GenesisCanyonTimeOffset = &offset - dp.DeployConfig.L2GenesisDeltaTimeOffset = &offset - dp.DeployConfig.L2GenesisEcotoneTimeOffset = &offset + require.Zero(t, *dp.DeployConfig.L2GenesisEcotoneTimeOffset) sd := e2eutils.Setup(t, dp, defaultAlloc) log := testlog.Logger(t, log.LevelDebug) @@ -202,11 +195,6 @@ func newEngine(t Testing, sd *e2eutils.SetupData, log log.Logger) *L2Engine { func TestDencunBlobTxRPC(gt *testing.T) { t := NewDefaultTesting(gt) dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - offset := hexutil.Uint64(0) - dp.DeployConfig.L2GenesisRegolithTimeOffset = &offset - dp.DeployConfig.L2GenesisCanyonTimeOffset = &offset - dp.DeployConfig.L2GenesisDeltaTimeOffset = &offset - dp.DeployConfig.L2GenesisEcotoneTimeOffset = &offset sd := e2eutils.Setup(t, dp, defaultAlloc) log := testlog.Logger(t, log.LevelDebug) @@ -221,11 +209,6 @@ func TestDencunBlobTxRPC(gt *testing.T) { func TestDencunBlobTxInTxPool(gt *testing.T) { t := NewDefaultTesting(gt) dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - offset := hexutil.Uint64(0) - dp.DeployConfig.L2GenesisRegolithTimeOffset = &offset - dp.DeployConfig.L2GenesisCanyonTimeOffset = &offset - dp.DeployConfig.L2GenesisDeltaTimeOffset = &offset - dp.DeployConfig.L2GenesisEcotoneTimeOffset = &offset sd := e2eutils.Setup(t, dp, defaultAlloc) log := testlog.Logger(t, log.LevelDebug) @@ -239,11 +222,6 @@ func TestDencunBlobTxInTxPool(gt *testing.T) { func TestDencunBlobTxInclusion(gt *testing.T) { t := NewDefaultTesting(gt) dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - offset := hexutil.Uint64(0) - dp.DeployConfig.L2GenesisRegolithTimeOffset = &offset - dp.DeployConfig.L2GenesisCanyonTimeOffset = &offset - dp.DeployConfig.L2GenesisDeltaTimeOffset = &offset - dp.DeployConfig.L2GenesisEcotoneTimeOffset = &offset sd := e2eutils.Setup(t, dp, defaultAlloc) log := testlog.Logger(t, log.LevelDebug) diff --git a/op-e2e/actions/ecotone_fork_test.go b/op-e2e/actions/ecotone_fork_test.go index 54802816322d..260a7960089a 100644 --- a/op-e2e/actions/ecotone_fork_test.go +++ b/op-e2e/actions/ecotone_fork_test.go @@ -42,18 +42,16 @@ func verifyCodeHashMatches(t Testing, client *ethclient.Client, address common.A func TestEcotoneNetworkUpgradeTransactions(gt *testing.T) { t := NewDefaultTesting(gt) dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - genesisBlock := hexutil.Uint64(0) ecotoneOffset := hexutil.Uint64(4) log := testlog.Logger(t, log.LevelDebug) - dp.DeployConfig.L1CancunTimeOffset = &genesisBlock // can be removed once Cancun on L1 is the default - + require.Zero(t, *dp.DeployConfig.L1CancunTimeOffset) // Activate all forks at genesis, and schedule Ecotone the block after - dp.DeployConfig.L2GenesisRegolithTimeOffset = &genesisBlock - dp.DeployConfig.L2GenesisCanyonTimeOffset = &genesisBlock - dp.DeployConfig.L2GenesisDeltaTimeOffset = &genesisBlock dp.DeployConfig.L2GenesisEcotoneTimeOffset = &ecotoneOffset + dp.DeployConfig.L2GenesisFjordTimeOffset = nil + dp.DeployConfig.L2GenesisGraniteTimeOffset = nil + // New forks have to be added here... require.NoError(t, dp.DeployConfig.Check(log), "must have valid config") sd := e2eutils.Setup(t, dp, defaultAlloc) diff --git a/op-e2e/actions/l2_engine_test.go b/op-e2e/actions/l2_engine_test.go index 6a113e086940..5d7a537b5d03 100644 --- a/op-e2e/actions/l2_engine_test.go +++ b/op-e2e/actions/l2_engine_test.go @@ -1,26 +1,28 @@ package actions import ( + "encoding/binary" "errors" "math/big" "testing" - "github.com/ethereum-optimism/optimism/op-program/client/l2/engineapi" - "github.com/ethereum-optimism/optimism/op-program/client/l2/engineapi/test" + "github.com/stretchr/testify/require" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus/beacon" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/triedb" "github.com/ethereum/go-ethereum/triedb/hashdb" - "github.com/stretchr/testify/require" - - "github.com/ethereum/go-ethereum/log" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" + "github.com/ethereum-optimism/optimism/op-program/client/l2/engineapi" + "github.com/ethereum-optimism/optimism/op-program/client/l2/engineapi/test" "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/sources" "github.com/ethereum-optimism/optimism/op-service/testlog" @@ -44,50 +46,62 @@ func TestL2EngineAPI(gt *testing.T) { require.NoError(t, err) // build an empty block - chainA, _ := core.GenerateChain(sd.L2Cfg.Config, genesisBlock, consensus, db, 1, func(i int, gen *core.BlockGen) { + chainA, _ := core.GenerateChain(sd.L2Cfg.Config, genesisBlock, consensus, db, 1, func(n int, gen *core.BlockGen) { gen.SetCoinbase(common.Address{'A'}) + if sd.L2Cfg.Config.IsCancun(gen.Number(), gen.Timestamp()) { + root := crypto.Keccak256Hash([]byte("A"), binary.BigEndian.AppendUint64(nil, uint64(n))) + gen.SetParentBeaconRoot(root) + } }) - payloadA, err := eth.BlockAsPayload(chainA[0], sd.RollupCfg.CanyonTime) + + payloadA, err := eth.BlockAsPayloadEnv(chainA[0], sd.RollupCfg.CanyonTime) require.NoError(t, err) // apply the payload - status, err := l2Cl.NewPayload(t.Ctx(), payloadA, nil) + status, err := l2Cl.NewPayload(t.Ctx(), payloadA.ExecutionPayload, payloadA.ParentBeaconBlockRoot) require.NoError(t, err) - require.Equal(t, status.Status, eth.ExecutionValid) + require.Equal(t, eth.ExecutionValid, status.Status) require.Equal(t, genesisBlock.Hash(), engine.l2Chain.CurrentBlock().Hash(), "processed payloads are not immediately canonical") // recognize the payload as canonical fcRes, err := l2Cl.ForkchoiceUpdate(t.Ctx(), ð.ForkchoiceState{ - HeadBlockHash: payloadA.BlockHash, + HeadBlockHash: payloadA.ExecutionPayload.BlockHash, SafeBlockHash: genesisBlock.Hash(), FinalizedBlockHash: genesisBlock.Hash(), }, nil) require.NoError(t, err) + require.Equal(t, fcRes.PayloadStatus.Status, eth.ExecutionValid) - require.Equal(t, payloadA.BlockHash, engine.l2Chain.CurrentBlock().Hash(), "now payload A is canonical") + require.Equal(t, payloadA.ExecutionPayload.BlockHash, engine.l2Chain.CurrentBlock().Hash(), "now payload A is canonical") // build an alternative block - chainB, _ := core.GenerateChain(sd.L2Cfg.Config, genesisBlock, consensus, db, 1, func(i int, gen *core.BlockGen) { + chainB, _ := core.GenerateChain(sd.L2Cfg.Config, genesisBlock, consensus, db, 1, func(n int, gen *core.BlockGen) { gen.SetCoinbase(common.Address{'B'}) + if sd.L2Cfg.Config.IsCancun(gen.Number(), gen.Timestamp()) { + root := crypto.Keccak256Hash([]byte("A"), binary.BigEndian.AppendUint64(nil, uint64(n))) + gen.SetParentBeaconRoot(root) + } }) - payloadB, err := eth.BlockAsPayload(chainB[0], sd.RollupCfg.CanyonTime) + + payloadB, err := eth.BlockAsPayloadEnv(chainB[0], sd.RollupCfg.CanyonTime) require.NoError(t, err) // apply the payload - status, err = l2Cl.NewPayload(t.Ctx(), payloadB, nil) + status, err = l2Cl.NewPayload(t.Ctx(), payloadB.ExecutionPayload, payloadB.ParentBeaconBlockRoot) require.NoError(t, err) require.Equal(t, status.Status, eth.ExecutionValid) - require.Equal(t, payloadA.BlockHash, engine.l2Chain.CurrentBlock().Hash(), "processed payloads are not immediately canonical") + require.Equal(t, payloadA.ExecutionPayload.BlockHash, engine.l2Chain.CurrentBlock().Hash(), "processed payloads are not immediately canonical") // reorg block A in favor of block B fcRes, err = l2Cl.ForkchoiceUpdate(t.Ctx(), ð.ForkchoiceState{ - HeadBlockHash: payloadB.BlockHash, + HeadBlockHash: payloadB.ExecutionPayload.BlockHash, SafeBlockHash: genesisBlock.Hash(), FinalizedBlockHash: genesisBlock.Hash(), }, nil) require.NoError(t, err) require.Equal(t, fcRes.PayloadStatus.Status, eth.ExecutionValid) - require.Equal(t, payloadB.BlockHash, engine.l2Chain.CurrentBlock().Hash(), "now payload B is canonical") + require.Equal(t, payloadB.ExecutionPayload.BlockHash, engine.l2Chain.CurrentBlock().Hash(), "now payload B is canonical") + } func TestL2EngineAPIBlockBuilding(gt *testing.T) { @@ -133,6 +147,11 @@ func TestL2EngineAPIBlockBuilding(gt *testing.T) { w = &types.Withdrawals{} } + var parentBeaconBlockRoot *common.Hash + if sd.RollupCfg.IsEcotone(uint64(nextBlockTime)) { + parentBeaconBlockRoot = &common.Hash{} + } + // Now let's ask the engine to build a block fcRes, err := l2Cl.ForkchoiceUpdate(t.Ctx(), ð.ForkchoiceState{ HeadBlockHash: parent.Hash(), @@ -146,6 +165,7 @@ func TestL2EngineAPIBlockBuilding(gt *testing.T) { NoTxPool: false, GasLimit: (*eth.Uint64Quantity)(&sd.RollupCfg.Genesis.SystemConfig.GasLimit), Withdrawals: w, + ParentBeaconBlockRoot: parentBeaconBlockRoot, }) require.NoError(t, err) require.Equal(t, fcRes.PayloadStatus.Status, eth.ExecutionValid) @@ -161,7 +181,7 @@ func TestL2EngineAPIBlockBuilding(gt *testing.T) { require.Equal(t, parent.Hash(), payload.ParentHash, "block builds on parent block") // apply the payload - status, err := l2Cl.NewPayload(t.Ctx(), payload, nil) + status, err := l2Cl.NewPayload(t.Ctx(), payload, envelope.ParentBeaconBlockRoot) require.NoError(t, err) require.Equal(t, status.Status, eth.ExecutionValid) require.Equal(t, parent.Hash(), engine.l2Chain.CurrentBlock().Hash(), "processed payloads are not immediately canonical") diff --git a/op-e2e/actions/span_batch_test.go b/op-e2e/actions/span_batch_test.go index 85da7d5b3894..23f5963fa97a 100644 --- a/op-e2e/actions/span_batch_test.go +++ b/op-e2e/actions/span_batch_test.go @@ -132,6 +132,11 @@ func TestHardforkMiddleOfSpanBatch(gt *testing.T) { // Activate HF in the middle of the first epoch deltaOffset := hexutil.Uint64(6) applyDeltaTimeOffset(dp, &deltaOffset) + // Applies to HF that goes into Delta. Otherwise we end up with more upgrade txs and things during this case. + dp.DeployConfig.L2GenesisEcotoneTimeOffset = nil + dp.DeployConfig.L2GenesisFjordTimeOffset = nil + dp.DeployConfig.L2GenesisGraniteTimeOffset = nil + sd := e2eutils.Setup(t, dp, defaultAlloc) log := testlog.Logger(t, log.LevelError) miner, seqEngine, sequencer := setupSequencerTest(t, sd, log) diff --git a/op-e2e/actions/system_config_test.go b/op-e2e/actions/system_config_test.go index d6d97a3b1964..452d5dbc300b 100644 --- a/op-e2e/actions/system_config_test.go +++ b/op-e2e/actions/system_config_test.go @@ -228,6 +228,14 @@ func GPOParamsChange(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { t := NewDefaultTesting(gt) dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) applyDeltaTimeOffset(dp, deltaTimeOffset) + + // activating Delta only, not Ecotone and further: + // the GPO change assertions here all apply only for the Delta transition. + // Separate tests cover Ecotone GPO changes. + dp.DeployConfig.L2GenesisEcotoneTimeOffset = nil + dp.DeployConfig.L2GenesisFjordTimeOffset = nil + dp.DeployConfig.L2GenesisGraniteTimeOffset = nil + sd := e2eutils.Setup(t, dp, defaultAlloc) log := testlog.Logger(t, log.LevelDebug) miner, seqEngine, sequencer := setupSequencerTest(t, sd, log) diff --git a/op-e2e/system_adminrpc_test.go b/op-e2e/system_adminrpc_test.go index e7c0af673b84..c0b9e60abd81 100644 --- a/op-e2e/system_adminrpc_test.go +++ b/op-e2e/system_adminrpc_test.go @@ -198,19 +198,19 @@ func TestPostUnsafePayload(t *testing.T) { blockNumberOne, err := l2Seq.BlockByNumber(ctx, big.NewInt(1)) require.NoError(t, err) - payload, err := eth.BlockAsPayload(blockNumberOne, sys.RollupConfig.CanyonTime) + payloadEnv, err := eth.BlockAsPayloadEnv(blockNumberOne, sys.RollupConfig.CanyonTime) require.NoError(t, err) - err = rollupClient.PostUnsafePayload(ctx, ð.ExecutionPayloadEnvelope{ExecutionPayload: payload}) + err = rollupClient.PostUnsafePayload(ctx, payloadEnv) require.NoError(t, err) require.NoError(t, wait.ForUnsafeBlock(ctx, rollupClient, 1), "Chain did not advance after posting payload") // Test validation blockNumberTwo, err := l2Seq.BlockByNumber(ctx, big.NewInt(2)) require.NoError(t, err) - payload, err = eth.BlockAsPayload(blockNumberTwo, sys.RollupConfig.CanyonTime) + payloadEnv, err = eth.BlockAsPayloadEnv(blockNumberTwo, sys.RollupConfig.CanyonTime) require.NoError(t, err) - payload.BlockHash = common.Hash{0xaa} - err = rollupClient.PostUnsafePayload(ctx, ð.ExecutionPayloadEnvelope{ExecutionPayload: payload}) + payloadEnv.ExecutionPayload.BlockHash = common.Hash{0xaa} + err = rollupClient.PostUnsafePayload(ctx, payloadEnv) require.ErrorContains(t, err, "payload has bad block hash") } diff --git a/op-e2e/system_tob_test.go b/op-e2e/system_tob_test.go index ce3ddf46c5f0..284c775a8ca7 100644 --- a/op-e2e/system_tob_test.go +++ b/op-e2e/system_tob_test.go @@ -5,6 +5,7 @@ import ( "context" "crypto/ecdsa" "fmt" + "math" "math/big" "math/rand" "testing" @@ -19,10 +20,10 @@ import ( "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" "github.com/ethereum-optimism/optimism/op-node/bindings" bindingspreview "github.com/ethereum-optimism/optimism/op-node/bindings/preview" + "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/predeploys" "github.com/ethereum-optimism/optimism/op-service/testutils/fuzzerutils" "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" @@ -41,17 +42,16 @@ func TestGasPriceOracleFeeUpdates(t *testing.T) { defer ctxCancel() InitParallel(t) - // Define our values to set in the GasPriceOracle (we set them high to see if it can lock L2 or stop bindings - // from updating the prices once again. - overheadValue := new(big.Int).Set(abi.MaxUint256) - // Ensure the most significant byte is 0x00 - scalarValue := new(big.Int).Rsh(new(big.Int).Set(abi.MaxUint256), 8) + maxScalars := eth.EcotoneScalars{ + BaseFeeScalar: math.MaxUint32, + BlobBaseFeeScalar: math.MaxUint32, + } var cancel context.CancelFunc // Create our system configuration for L1/L2 and start it cfg := DefaultSystemConfig(t) sys, err := cfg.Start(t) - require.Nil(t, err, "Error starting up system") + require.NoError(t, err, "Error starting up system") defer sys.Close() // Obtain our sequencer, verifier, and transactor keypair. @@ -62,66 +62,61 @@ func TestGasPriceOracleFeeUpdates(t *testing.T) { // Bind to the SystemConfig & GasPriceOracle contracts sysconfig, err := legacybindings.NewSystemConfig(cfg.L1Deployments.SystemConfigProxy, l1Client) - require.Nil(t, err) + require.NoError(t, err) gpoContract, err := legacybindings.NewGasPriceOracleCaller(predeploys.GasPriceOracleAddr, l2Seq) - require.Nil(t, err) + require.NoError(t, err) // Obtain our signer. opts, err := bind.NewKeyedTransactorWithChainID(ethPrivKey, cfg.L1ChainIDBig()) - require.Nil(t, err) + require.NoError(t, err) // Define our L1 transaction timeout duration. txTimeoutDuration := 10 * time.Duration(cfg.DeployConfig.L1BlockTime) * time.Second // Update the gas config, wait for it to show up on L2, & verify that it was set as intended opts.Context, cancel = context.WithTimeout(ctx, txTimeoutDuration) - tx, err := sysconfig.SetGasConfig(opts, overheadValue, scalarValue) + tx, err := sysconfig.SetGasConfigEcotone(opts, maxScalars.BaseFeeScalar, maxScalars.BlobBaseFeeScalar) cancel() - require.Nil(t, err, "sending overhead update tx") + require.NoError(t, err, "SetGasConfigEcotone update tx") receipt, err := wait.ForReceiptOK(ctx, l1Client, tx.Hash()) - require.Nil(t, err, "Waiting for sysconfig set gas config update tx") + require.NoError(t, err, "Waiting for sysconfig set gas config update tx") _, err = geth.WaitForL1OriginOnL2(sys.RollupConfig, receipt.BlockNumber.Uint64(), l2Seq, txTimeoutDuration) require.NoError(t, err, "waiting for L2 block to include the sysconfig update") - gpoOverhead, err := gpoContract.Overhead(&bind.CallOpts{}) - require.Nil(t, err, "reading gpo overhead") - gpoScalar, err := gpoContract.Scalar(&bind.CallOpts{}) - require.Nil(t, err, "reading gpo scalar") + baseFeeScalar, err := gpoContract.BaseFeeScalar(&bind.CallOpts{}) + require.NoError(t, err, "reading base fee scalar") + require.Equal(t, baseFeeScalar, maxScalars.BaseFeeScalar) - if gpoOverhead.Cmp(overheadValue) != 0 { - t.Errorf("overhead that was found (%v) is not what was set (%v)", gpoOverhead, overheadValue) - } - if gpoScalar.Cmp(scalarValue) != 0 { - t.Errorf("scalar that was found (%v) is not what was set (%v)", gpoScalar, scalarValue) - } + blobBaseFeeScalar, err := gpoContract.BlobBaseFeeScalar(&bind.CallOpts{}) + require.NoError(t, err, "reading blob base fee scalar") + require.Equal(t, blobBaseFeeScalar, maxScalars.BlobBaseFeeScalar) // Now modify the scalar value & ensure that the gas params can be modified - scalarValue = big.NewInt(params.Ether) + normalScalars := eth.EcotoneScalars{ + BaseFeeScalar: 1e6, + BlobBaseFeeScalar: 1e6, + } opts.Context, cancel = context.WithTimeout(context.Background(), txTimeoutDuration) - tx, err = sysconfig.SetGasConfig(opts, overheadValue, scalarValue) + tx, err = sysconfig.SetGasConfigEcotone(opts, normalScalars.BaseFeeScalar, normalScalars.BlobBaseFeeScalar) cancel() - require.Nil(t, err, "sending overhead update tx") + require.NoError(t, err, "SetGasConfigEcotone update tx") receipt, err = wait.ForReceiptOK(ctx, l1Client, tx.Hash()) - require.Nil(t, err, "Waiting for sysconfig set gas config update tx") + require.NoError(t, err, "Waiting for sysconfig set gas config update tx") _, err = geth.WaitForL1OriginOnL2(sys.RollupConfig, receipt.BlockNumber.Uint64(), l2Seq, txTimeoutDuration) require.NoError(t, err, "waiting for L2 block to include the sysconfig update") - gpoOverhead, err = gpoContract.Overhead(&bind.CallOpts{}) - require.Nil(t, err, "reading gpo overhead") - gpoScalar, err = gpoContract.Scalar(&bind.CallOpts{}) - require.Nil(t, err, "reading gpo scalar") + baseFeeScalar, err = gpoContract.BaseFeeScalar(&bind.CallOpts{}) + require.NoError(t, err, "reading base fee scalar") + require.Equal(t, baseFeeScalar, normalScalars.BaseFeeScalar) - if gpoOverhead.Cmp(overheadValue) != 0 { - t.Errorf("overhead that was found (%v) is not what was set (%v)", gpoOverhead, overheadValue) - } - if gpoScalar.Cmp(scalarValue) != 0 { - t.Errorf("scalar that was found (%v) is not what was set (%v)", gpoScalar, scalarValue) - } + blobBaseFeeScalar, err = gpoContract.BlobBaseFeeScalar(&bind.CallOpts{}) + require.NoError(t, err, "reading blob base fee scalar") + require.Equal(t, blobBaseFeeScalar, normalScalars.BlobBaseFeeScalar) } // TestL2SequencerRPCDepositTx checks that the L2 sequencer will not accept DepositTx type transactions. diff --git a/op-program/client/l2/engineapi/test/l2_engine_api_tests.go b/op-program/client/l2/engineapi/test/l2_engine_api_tests.go index 1d8a9ff61ff7..4a78e258e780 100644 --- a/op-program/client/l2/engineapi/test/l2_engine_api_tests.go +++ b/op-program/client/l2/engineapi/test/l2_engine_api_tests.go @@ -2,18 +2,21 @@ package test import ( "context" + "math/big" "testing" + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum-optimism/optimism/op-node/rollup" "github.com/ethereum-optimism/optimism/op-node/rollup/derive" "github.com/ethereum-optimism/optimism/op-program/client/l2/engineapi" "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/testlog" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/params" - "github.com/stretchr/testify/require" ) var gasLimit = eth.Uint64Quantity(30_000_000) @@ -109,7 +112,7 @@ func RunEngineAPITests(t *testing.T, createBackend func(t *testing.T) engineapi. payload := envelope.ExecutionPayload api.assert.Equal(genesis.Hash(), payload.ParentHash, "should have old block as parent") - api.newPayload(payload) + api.newPayload(envelope) api.forkChoiceUpdated(payload.BlockHash, genesis.Hash(), genesis.Hash()) api.assert.Equal(payload.BlockHash, api.headHash(), "should reorg to block built on old parent") }) @@ -138,13 +141,12 @@ func RunEngineAPITests(t *testing.T, createBackend func(t *testing.T) engineapi. // Build a valid block payloadID := api.startBlockBuilding(genesis, eth.Uint64Quantity(genesis.Time+2)) envelope := api.getPayload(payloadID) - newBlock := envelope.ExecutionPayload // But then make it invalid by changing the state root - newBlock.StateRoot = eth.Bytes32(genesis.TxHash) + envelope.ExecutionPayload.StateRoot = eth.Bytes32(genesis.TxHash) updateBlockHash(envelope) - r, err := api.engine.NewPayloadV2(api.ctx, newBlock) + r, err := api.callNewPayload(envelope) api.assert.NoError(err) api.assert.Equal(eth.ExecutionInvalid, r.Status) }) @@ -156,13 +158,12 @@ func RunEngineAPITests(t *testing.T, createBackend func(t *testing.T) engineapi. // Start with a valid time payloadID := api.startBlockBuilding(genesis, eth.Uint64Quantity(genesis.Time+1)) envelope := api.getPayload(payloadID) - newBlock := envelope.ExecutionPayload // Then make it invalid to check NewPayload rejects it - newBlock.Timestamp = eth.Uint64Quantity(genesis.Time) + envelope.ExecutionPayload.Timestamp = eth.Uint64Quantity(genesis.Time) updateBlockHash(envelope) - r, err := api.engine.NewPayloadV2(api.ctx, newBlock) + r, err := api.callNewPayload(envelope) api.assert.NoError(err) api.assert.Equal(eth.ExecutionInvalid, r.Status) }) @@ -174,13 +175,12 @@ func RunEngineAPITests(t *testing.T, createBackend func(t *testing.T) engineapi. // Start with a valid time payloadID := api.startBlockBuilding(genesis, eth.Uint64Quantity(genesis.Time+1)) envelope := api.getPayload(payloadID) - newBlock := envelope.ExecutionPayload // Then make it invalid to check NewPayload rejects it - newBlock.Timestamp = eth.Uint64Quantity(genesis.Time - 1) + envelope.ExecutionPayload.Timestamp = eth.Uint64Quantity(genesis.Time - 1) updateBlockHash(envelope) - r, err := api.engine.NewPayloadV2(api.ctx, newBlock) + r, err := api.callNewPayload(envelope) api.assert.NoError(err) api.assert.Equal(eth.ExecutionInvalid, r.Status) }) @@ -363,7 +363,7 @@ func (h *testHelper) addBlockWithParent(head *types.Header, timestamp eth.Uint64 h.assert.Equal(head.Hash(), block.ParentHash, "should have correct parent") h.assert.Len(block.Transactions, len(txs)) - h.newPayload(block) + h.newPayload(envelope) // Should not have changed the chain head yet h.assert.Equal(prevHead, h.backend.CurrentHeader()) @@ -395,25 +395,35 @@ func (h *testHelper) startBlockBuilding(head *types.Header, newBlockTimestamp et txData = append(txData, rlp) } - canyonTime := h.backend.Config().CanyonTime - var w *types.Withdrawals - if canyonTime != nil && *canyonTime <= uint64(newBlockTimestamp) { - w = &types.Withdrawals{} - } - - result, err := h.engine.ForkchoiceUpdatedV2(h.ctx, ð.ForkchoiceState{ - HeadBlockHash: head.Hash(), - SafeBlockHash: head.Hash(), - FinalizedBlockHash: head.Hash(), - }, ð.PayloadAttributes{ + attr := ð.PayloadAttributes{ Timestamp: newBlockTimestamp, PrevRandao: eth.Bytes32(head.MixDigest), SuggestedFeeRecipient: feeRecipient, Transactions: txData, NoTxPool: true, GasLimit: &gasLimit, - Withdrawals: w, - }) + } + n := new(big.Int).Add(head.Number, big.NewInt(1)) + if h.backend.Config().IsShanghai(n, uint64(newBlockTimestamp)) { + attr.Withdrawals = &types.Withdrawals{} + } + if h.backend.Config().IsCancun(n, uint64(newBlockTimestamp)) { + attr.ParentBeaconBlockRoot = &common.Hash{} + } + fcState := ð.ForkchoiceState{ + HeadBlockHash: head.Hash(), + SafeBlockHash: head.Hash(), + FinalizedBlockHash: head.Hash(), + } + var result *eth.ForkchoiceUpdatedResult + var err error + if h.backend.Config().IsCancun(n, uint64(newBlockTimestamp)) { + result, err = h.engine.ForkchoiceUpdatedV3(h.ctx, fcState, attr) + } else if h.backend.Config().IsShanghai(n, uint64(newBlockTimestamp)) { + result, err = h.engine.ForkchoiceUpdatedV2(h.ctx, fcState, attr) + } else { + result, err = h.engine.ForkchoiceUpdatedV1(h.ctx, fcState, attr) + } h.assert.NoError(err) h.assert.Equal(eth.ExecutionValid, result.PayloadStatus.Status) id := result.PayloadID @@ -423,16 +433,25 @@ func (h *testHelper) startBlockBuilding(head *types.Header, newBlockTimestamp et func (h *testHelper) getPayload(id *eth.PayloadID) *eth.ExecutionPayloadEnvelope { h.Log("getPayload", "id", id) - envelope, err := h.engine.GetPayloadV2(h.ctx, *id) + envelope, err := h.engine.GetPayloadV2(h.ctx, *id) // calls the same underlying function as V1 and V3 h.assert.NoError(err) h.assert.NotNil(envelope) h.assert.NotNil(envelope.ExecutionPayload) return envelope } -func (h *testHelper) newPayload(block *eth.ExecutionPayload) { - h.Log("newPayload", "hash", block.BlockHash) - r, err := h.engine.NewPayloadV2(h.ctx, block) +func (h *testHelper) callNewPayload(envelope *eth.ExecutionPayloadEnvelope) (*eth.PayloadStatusV1, error) { + n := new(big.Int).SetUint64(uint64(envelope.ExecutionPayload.BlockNumber)) + if h.backend.Config().IsCancun(n, uint64(envelope.ExecutionPayload.Timestamp)) { + return h.engine.NewPayloadV3(h.ctx, envelope.ExecutionPayload, []common.Hash{}, envelope.ParentBeaconBlockRoot) + } else { + return h.engine.NewPayloadV2(h.ctx, envelope.ExecutionPayload) + } +} + +func (h *testHelper) newPayload(envelope *eth.ExecutionPayloadEnvelope) { + h.Log("newPayload", "hash", envelope.ExecutionPayload.BlockHash) + r, err := h.callNewPayload(envelope) h.assert.NoError(err) h.assert.Equal(eth.ExecutionValid, r.Status) h.assert.Nil(r.ValidationError) diff --git a/ops-bedrock/beacon-data/config.yaml b/ops-bedrock/beacon-data/config.yaml index 0e2be808bbe5..0358aef31768 100644 --- a/ops-bedrock/beacon-data/config.yaml +++ b/ops-bedrock/beacon-data/config.yaml @@ -48,8 +48,7 @@ CAPELLA_FORK_VERSION: 0x03000001 CAPELLA_FORK_EPOCH: 0 # DENEB DENEB_FORK_VERSION: 0x04000001 -# TODO: activate Deneb at genesis -DENEB_FORK_EPOCH: 1 +DENEB_FORK_EPOCH: 0 # EIP6110 EIP6110_FORK_VERSION: 0x05000001 diff --git a/ops-bedrock/l1-generate-beacon-genesis.sh b/ops-bedrock/l1-generate-beacon-genesis.sh index 04ea8d111434..2fa3534659dd 100644 --- a/ops-bedrock/l1-generate-beacon-genesis.sh +++ b/ops-bedrock/l1-generate-beacon-genesis.sh @@ -4,7 +4,7 @@ set -eu echo "eth2-testnet-genesis path: $(which eth2-testnet-genesis)" -eth2-testnet-genesis capella \ +eth2-testnet-genesis deneb \ --config=./beacon-data/config.yaml \ --preset-phase0=minimal \ --preset-altair=minimal \ diff --git a/packages/contracts-bedrock/deploy-config/devnetL1-template.json b/packages/contracts-bedrock/deploy-config/devnetL1-template.json index 12694499cb46..c56fd92a3a3f 100644 --- a/packages/contracts-bedrock/deploy-config/devnetL1-template.json +++ b/packages/contracts-bedrock/deploy-config/devnetL1-template.json @@ -46,8 +46,9 @@ "l2GenesisRegolithTimeOffset": "0x0", "l2GenesisCanyonTimeOffset": "0x0", "l2GenesisDeltaTimeOffset": "0x0", - "l2GenesisEcotoneTimeOffset": "0x40", - "l1CancunTimeOffset": "0x30", + "l2GenesisEcotoneTimeOffset": "0x0", + "l2GenesisFjordTimeOffset": "0x0", + "l1CancunTimeOffset": "0x0", "systemConfigStartBlock": 0, "requiredProtocolVersion": "0x0000000000000000000000000000000000000000000000000000000000000000", "recommendedProtocolVersion": "0x0000000000000000000000000000000000000000000000000000000000000000", From 7343468ac9f527e6b93bf93d9304375076581bf1 Mon Sep 17 00:00:00 2001 From: tre Date: Thu, 8 Aug 2024 10:17:02 -0700 Subject: [PATCH 33/59] feat(predeploys): add L2toL2CDM to predeploy addresses.go (#11403) --- op-service/predeploys/addresses.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/op-service/predeploys/addresses.go b/op-service/predeploys/addresses.go index c9b6bcfd6317..a03fcf29188a 100644 --- a/op-service/predeploys/addresses.go +++ b/op-service/predeploys/addresses.go @@ -26,6 +26,7 @@ const ( SchemaRegistry = "0x4200000000000000000000000000000000000020" EAS = "0x4200000000000000000000000000000000000021" CrossL2Inbox = "0x4200000000000000000000000000000000000022" + L2toL2CrossDomainMessenger = "0x4200000000000000000000000000000000000023" Create2Deployer = "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2" MultiCall3 = "0xcA11bde05977b3631167028862bE2a173976CA11" Safe_v130 = "0x69f4D1788e39c87893C980c06EdF4b7f686e2938" @@ -62,6 +63,7 @@ var ( SchemaRegistryAddr = common.HexToAddress(SchemaRegistry) EASAddr = common.HexToAddress(EAS) CrossL2InboxAddr = common.HexToAddress(CrossL2Inbox) + L2toL2CrossDomainMessengerAddr = common.HexToAddress(L2toL2CrossDomainMessenger) Create2DeployerAddr = common.HexToAddress(Create2Deployer) MultiCall3Addr = common.HexToAddress(MultiCall3) Safe_v130Addr = common.HexToAddress(Safe_v130) @@ -91,6 +93,8 @@ func init() { Predeploys["L1BlockNumber"] = &Predeploy{Address: L1BlockNumberAddr} Predeploys["GasPriceOracle"] = &Predeploy{Address: GasPriceOracleAddr} Predeploys["L1Block"] = &Predeploy{Address: L1BlockAddr} + Predeploys["CrossL2Inbox"] = &Predeploy{Address: CrossL2InboxAddr} + Predeploys["L2toL2CrossDomainMessenger"] = &Predeploy{Address: L2toL2CrossDomainMessengerAddr} Predeploys["GovernanceToken"] = &Predeploy{ Address: GovernanceTokenAddr, ProxyDisabled: true, From 0c8d7c8c5186ee520ed7d612039c55b6a35b61bf Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Thu, 8 Aug 2024 22:06:18 +0300 Subject: [PATCH 34/59] contracts-bedrock: debug tests (#11397) * contracts-bedrock: debug tests See why the tests are flaking and cannot be reproduced locally. Also modularize/cleanup CI along the way * typo: fix * debug: remove * just: update name * ci: better error help * ci: fix typo * contracts-bedrock: abstract * ci: run with foundry profile ci --- .circleci/config.yml | 46 ++++++++++++++++------------- packages/contracts-bedrock/justfile | 9 ++++++ 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d171341ca1a1..c6e073c99657 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -103,6 +103,13 @@ commands: pip3 install -r requirements.txt python3 main.py "<>" + install-contracts-dependencies: + description: "Install the dependencies for the smart contracts" + steps: + - run: + command: just install + working_directory: packages/contracts-bedrock + notify-failures-on-develop: description: "Notify Slack" parameters: @@ -180,9 +187,7 @@ jobs: - run: name: "Check L1 geth version" command: ./ops/scripts/geth-version-checker.sh || (echo "geth version is wrong, update ci-builder"; false) - - run: - name: git submodules - command: make submodules + - install-contracts-dependencies - restore_cache: name: Restore PNPM Package Cache keys: @@ -516,9 +521,7 @@ jobs: resource_class: xlarge steps: - checkout - - run: - name: git submodules - command: make submodules + - install-contracts-dependencies - check-changed: patterns: contracts-bedrock,op-node - run: @@ -545,11 +548,13 @@ jobs: resource_class: xlarge steps: - checkout - - run: - name: git submodules - command: make submodules - check-changed: patterns: contracts-bedrock,op-node + - install-contracts-dependencies + - run: + name: print dependencies + command: just dep-status + working_directory: packages/contracts-bedrock - run: name: print forge version command: forge --version @@ -561,6 +566,13 @@ jobs: FOUNDRY_PROFILE: ci working_directory: packages/contracts-bedrock no_output_timeout: 15m + - run: + name: print failed test traces + command: just test-rerun + environment: + FOUNDRY_PROFILE: ci + working_directory: packages/contracts-bedrock + when: on_fail contracts-bedrock-checks: docker: @@ -568,9 +580,7 @@ jobs: resource_class: xlarge steps: - checkout - - run: - name: git submodules - command: make submodules + - install-contracts-dependencies - restore_cache: name: Restore PNPM Package Cache keys: @@ -1071,9 +1081,7 @@ jobs: key: gomod-{{ checksum "go.sum" }} - restore_cache: key: golang-build-cache - - run: - name: git submodules - command: make submodules + - install-contracts-dependencies - run: name: generate devnet allocs command: make devnet-allocs @@ -1171,9 +1179,7 @@ jobs: name: Install pnpm command: | npm i pnpm --global - - run: - name: git submodules - command: make submodules + - install-contracts-dependencies - attach_workspace: at: "." - when: @@ -1486,9 +1492,7 @@ jobs: resource_class: xlarge steps: - checkout - - run: - name: Checkout Submodule - command: make submodules + - install-contracts-dependencies - check-changed: no_go_deps: "true" patterns: contracts-bedrock/test/kontrol,contracts-bedrock/src/L1/OptimismPortal\.sol,contracts-bedrock/src/L1/OptimismPortal2\.sol,contracts-bedrock/src/L1/L1CrossDomainMessenger\.sol,contracts-bedrock/src/L1/L1ERC721Bridge\.sol,contracts-bedrock/src/L1/L1StandardBridge\.sol,contracts-bedrock/src/L1/ResourceMetering\.sol,contracts-bedrock/src/universal/StandardBridge\.sol,contracts-bedrock/src/universal/ERC721Bridge\.sol,contracts-bedrock/src/universal/CrossDomainMessenger\.sol diff --git a/packages/contracts-bedrock/justfile b/packages/contracts-bedrock/justfile index b983776e73c8..c55cb3d38151 100644 --- a/packages/contracts-bedrock/justfile +++ b/packages/contracts-bedrock/justfile @@ -1,6 +1,12 @@ prebuild: ./scripts/checks/check-foundry-install.sh +dep-status: + git submodule status + +install: + forge install + build: prebuild forge build @@ -16,6 +22,9 @@ test: build-go-ffi test-kontrol: ./test/kontrol/scripts/run-kontrol.sh script +test-rerun: build-go-ffi + forge test --rerun -vvv + genesis: forge script scripts/L2Genesis.s.sol:L2Genesis --sig 'runWithStateDump()' From bf4693e76db85148121aea35904755672a153449 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Thu, 8 Aug 2024 23:19:00 +0300 Subject: [PATCH 35/59] ci: better solc warnings check (#11231) * ci: better solc warnings check Use `forge build --force` to force a build so that the warning check can be observed. CI should fail on this commit * contracts-bedrock: fix warnings Fix the failed solc build See the failed workflow here: https://app.circleci.com/pipelines/github/ethereum-optimism/optimism/59631/workflows/b93bc600-e772-4ba9-98ed-a0b6f48683c7/jobs/2512271 * foundry: add ignored error code --- .circleci/config.yml | 5 +---- packages/contracts-bedrock/foundry.toml | 3 ++- .../contracts-bedrock/test/dispute/FaultDisputeGame.t.sol | 1 - 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c6e073c99657..b839cd9779e3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -599,12 +599,9 @@ jobs: name: forge version command: forge --version - run: - # The solc warnings check must be the first step to build the contracts, that way the - # warnings are output here. On subsequent runs, forge will read artifacts from the cache - # so warnings would not occur. name: solc warnings check command: | - forge build --deny-warnings || echo "export SOLC_WARNINGS_CHECK=1" >> "$BASH_ENV" + forge build --force --deny-warnings || echo "export SOLC_WARNINGS_CHECK=1" >> "$BASH_ENV" environment: FOUNDRY_PROFILE: ci working_directory: packages/contracts-bedrock diff --git a/packages/contracts-bedrock/foundry.toml b/packages/contracts-bedrock/foundry.toml index e5d8513f254a..a373761b8f5a 100644 --- a/packages/contracts-bedrock/foundry.toml +++ b/packages/contracts-bedrock/foundry.toml @@ -27,7 +27,8 @@ bytecode_hash = 'none' build_info_path = 'artifacts/build-info' ast = true evm_version = "cancun" -ignored_error_codes = ["transient-storage", "code-size", "init-code-size"] +# 5159 error code is selfdestruct error code +ignored_error_codes = ["transient-storage", "code-size", "init-code-size", 5159] # We set the gas limit to max int64 to avoid running out of gas during testing, since the default # gas limit is 1B and some of our tests require more gas than that, such as `test_callWithMinGas_noLeakageLow_succeeds`. diff --git a/packages/contracts-bedrock/test/dispute/FaultDisputeGame.t.sol b/packages/contracts-bedrock/test/dispute/FaultDisputeGame.t.sol index ccf6bce1a1de..2aae76b2dbbe 100644 --- a/packages/contracts-bedrock/test/dispute/FaultDisputeGame.t.sol +++ b/packages/contracts-bedrock/test/dispute/FaultDisputeGame.t.sol @@ -870,7 +870,6 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { (,,,, disputed,,) = gameProxy.claimData(5); gameProxy.attack{ value: _getRequiredBond(5) }(disputed, 5, _dummyClaim()); (,,,, disputed,,) = gameProxy.claimData(6); - bytes memory _dummyClaimData = abi.encode(gasleft(), gasleft()); gameProxy.defend{ value: _getRequiredBond(6) }(disputed, 6, postState_); (,,,, disputed,,) = gameProxy.claimData(7); From 770cbc62571423a0ab8bd9c00a02389b991c4563 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Fri, 9 Aug 2024 03:30:56 +0300 Subject: [PATCH 36/59] repo: migrate away from pnpm (#11395) Migrate to just from pnpm. This is continued tech debt cleanup away from `pnpm` and typescript that is no longer used. --- .circleci/config.yml | 68 +- .github/actions/setup/action.yml | 24 - .nvmrc | 1 - CONTRIBUTING.md | 20 +- Makefile | 10 +- justfile | 44 + op-e2e/README.md | 2 +- ops/docker/ci-builder/Dockerfile | 14 +- package.json | 26 - packages/contracts-bedrock/CONTRIBUTING.md | 3 +- .../invariant-docs/README.md | 2 +- .../scripts/checks/check-foundry-install.sh | 4 +- .../scripts/getting-started/versions.sh | 2 - .../scripts/go-ffi/README.md | 2 +- .../contracts-bedrock/test/kontrol/README.md | 4 +- pnpm-lock.yaml | 3533 ----------------- pnpm-workspace.yaml | 2 - 17 files changed, 69 insertions(+), 3692 deletions(-) delete mode 100644 .nvmrc create mode 100644 justfile delete mode 100644 package.json delete mode 100644 pnpm-lock.yaml delete mode 100644 pnpm-workspace.yaml diff --git a/.circleci/config.yml b/.circleci/config.yml index b839cd9779e3..af9a7bae135b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -188,38 +188,18 @@ jobs: name: "Check L1 geth version" command: ./ops/scripts/geth-version-checker.sh || (echo "geth version is wrong, update ci-builder"; false) - install-contracts-dependencies - - restore_cache: - name: Restore PNPM Package Cache - keys: - - pnpm-packages-v2-{{ checksum "pnpm-lock.yaml" }} - restore_cache: name: Restore Go modules cache key: gomod-{{ checksum "go.sum" }} - # Fetch node_modules into the pnpm store - # This will cache node_modules based on pnpm-lock so other steps can instantly install them with `pnpm install --prefer-offline` - # --prefer-offline installs node_modules instantly by just reading from cache if it exists rather than fetching from network - # when installing node_modules pnpm simply adds symlinks instead of copying the files which is why it is pretty much instant to run --prefer-offline - # this allows a caching strategy of only checking pnpm-lockfile so we don't have to keep it in sync with our packages - # For more information see https://pnpm.io/cli/fetch - - run: - name: Fetch dependencies - command: pnpm fetch --frozen-lockfile --prefer-offline - - save_cache: - name: Save PNPM Package Cache - key: pnpm-packages-v2-{{ checksum "pnpm-lock.yaml" }} - paths: - - "node_modules" - - run: - name: Install dependencies - command: pnpm install - run: name: print forge version command: forge --version - run: - name: Build monorepo + name: Build contracts environment: FOUNDRY_PROFILE: ci - command: pnpm build + command: just build + working_directory: packages/contracts-bedrock - run: name: Generate L2OO allocs command: DEVNET_L2OO="true" make devnet-allocs @@ -244,12 +224,9 @@ jobs: - persist_to_workspace: root: "." paths: - - "packages/**/dist" - "packages/contracts-bedrock/cache" - "packages/contracts-bedrock/artifacts" - "packages/contracts-bedrock/forge-artifacts" - - "packages/contracts-bedrock/tsconfig.tsbuildinfo" - - "packages/contracts-bedrock/tsconfig.build.tsbuildinfo" - ".devnet/allocs-l1.json" - ".devnet/allocs-l2-delta.json" - ".devnet/allocs-l2-ecotone.json" @@ -580,21 +557,12 @@ jobs: resource_class: xlarge steps: - checkout - - install-contracts-dependencies - - restore_cache: - name: Restore PNPM Package Cache - keys: - - pnpm-packages-v2-{{ checksum "pnpm-lock.yaml" }} - attach_workspace: { at: "." } + - install-contracts-dependencies - check-changed: patterns: contracts-bedrock,op-node - setup_remote_docker: docker_layer_caching: true - # populate node modules from the cache - - run: - name: Install dependencies - command: pnpm install - working_directory: packages/contracts-bedrock - run: name: forge version command: forge --version @@ -692,14 +660,7 @@ jobs: resource_class: medium steps: - checkout - - restore_cache: - name: Restore PNPM Package Cache - keys: - - pnpm-packages-v2-{{ checksum "pnpm-lock.yaml" }} - attach_workspace: { at: "." } - - run: - name: Install dependencies - command: pnpm install - check-changed: patterns: contracts-bedrock - run: @@ -1156,26 +1117,11 @@ jobs: echo 'export PATH=$HOME/.foundry/bin:$PATH' >> $BASH_ENV source $HOME/.bashrc forge --version - - run: - name: Install NVM - command: | - curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash - source ~/.bashrc - nvm --version - - run: - name: Install Node - command: | - nvm install - nvm use && node --version && npm --version - run: name: Install Just command: | curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --to $HOME/bin echo 'export PATH="${PATH}:$HOME/bin"' >> $BASH_ENV - - run: - name: Install pnpm - command: | - npm i pnpm --global - install-contracts-dependencies - attach_workspace: at: "." @@ -1204,9 +1150,9 @@ jobs: docker tag "$IMAGE_BASE_PREFIX/op-challenger:<>" "$IMAGE_BASE_PREFIX/op-challenger:devnet" docker tag "$IMAGE_BASE_PREFIX/da-server:<>" "$IMAGE_BASE_PREFIX/da-server:devnet" - run: - name: pnpm install and build - command: | - pnpm install && pnpm build + name: Build contracts + working_directory: packages/contracts-bedrock + command: just build - run: name: Bring up the stack command: | diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index 281ccf7b012e..4c8918566485 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -3,29 +3,5 @@ description: Common setup steps used by our workflows runs: using: composite steps: - - name: Setup pnpm - uses: pnpm/action-setup@v3 - with: - version: 9 - - name: Setup node - uses: actions/setup-node@v3 - with: - node-version-file: .nvmrc - registry-url: https://registry.npmjs.org - cache: pnpm - - name: Setup foundry uses: foundry-rs/foundry-toolchain@v1 - - - name: Install node dependencies - shell: bash - run: pnpm install --frozen-lockfile - - name: Derive appropriate SHAs for base and head for `nx affected` commands - uses: nrwl/nx-set-shas@v3 - with: - main-branch-name: "develop" - - run: | - echo "nx using following shas:" - echo "BASE: ${{ env.NX_BASE }}" - echo "HEAD: ${{ env.NX_HEAD }}" - shell: bash diff --git a/.nvmrc b/.nvmrc deleted file mode 100644 index 805b5a4e00bf..000000000000 --- a/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v20.9.0 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 30f9e25db08d..c96ecf7bf165 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -27,7 +27,7 @@ Interactions within this repository are subject to a [Code of Conduct](https://g | [go](https://go.dev/) | `^1.21` | `go version` | | [node](https://nodejs.org/en/) | `^20` | `node --version` | | [nvm](https://github.com/nvm-sh/nvm) | `^0.39` | `nvm --version` | -| [pnpm](https://pnpm.io/installation) | `^8` | `pnpm --version` | +| [just](https://github.com/casey/just) | `^1.34.0`| `just --version` | | [foundry](https://github.com/foundry-rs/foundry#installation) | `^0.2.0` | `forge --version` | | [make](https://linux.die.net/man/1/make) | `^3` | `make --version` | | [jq](https://github.com/jqlang/jq) | `^1.6` | `jq --version` | @@ -46,7 +46,7 @@ You can use [`nvm`](https://github.com/nvm-sh/nvm) to manage multiple versions o `foundry` is updated frequently and occasionally contains breaking changes. This repository pins a specific version of `foundry` inside of [`versions.json`](./versions.json). -Use the command `pnpm update:foundry` at the root of the monorepo to make sure that your version of `foundry` is the same as the one currently being used in CI. +Use the command `just update-foundry` at the root of the monorepo to make sure that your version of `foundry` is the same as the one currently being used in CI. #### `direnv` @@ -89,19 +89,11 @@ Use the above command to rebuild the monorepo. Before running tests: **follow the above instructions to get everything built.** -#### Running unit tests (typescript) - -Run unit tests for all packages in parallel via: - -```bash -pnpm test -``` - -To run unit tests for a specific package: +#### Running unit tests (solidity) ```bash -cd packages/package-to-test -pnpm test +cd packages/contracts-bedrock +just test ``` #### Running unit tests (Go) @@ -125,7 +117,7 @@ To run `slither` locally, do: ```bash cd packages/contracts-bedrock pip3 install slither-analyzer -pnpm slither +just slither ``` ## Labels diff --git a/Makefile b/Makefile index 51d0d1397b33..0fdfb07655ef 100644 --- a/Makefile +++ b/Makefile @@ -23,14 +23,6 @@ lint-go-fix: ## Lints Go code with specific linters and fixes reported issues golangci-lint run -E goimports,sqlclosecheck,bodyclose,asciicheck,misspell,errorlint --timeout 5m -e "errors.As" -e "errors.Is" ./... --fix .PHONY: lint-go-fix -build-ts: submodules ## Builds TypeScript components - if [ -f "$$NVM_DIR/nvm.sh" ]; then \ - . $$NVM_DIR/nvm.sh && nvm use; \ - fi - pnpm install:ci - pnpm build -.PHONY: build-ts - ci-builder: ## Builds the CI builder Docker image docker build -t ci-builder -f ops/docker/ci-builder/Dockerfile . .PHONY: ci-builder @@ -207,7 +199,7 @@ test-unit: ## Runs unit tests for all components make -C ./op-proposer test make -C ./op-batcher test make -C ./op-e2e test - pnpm test + (cd packages/contracts-bedrock && just test) .PHONY: test-unit # Remove the baseline-commit to generate a base reading & show all issues diff --git a/justfile b/justfile new file mode 100644 index 000000000000..36b27c7e439e --- /dev/null +++ b/justfile @@ -0,0 +1,44 @@ +issues: + ./ops/scripts/todo-checker.sh + +lint-shellcheck: + find . -type f -name '*.sh' -not -path '*/node_modules/*' -not -path './packages/contracts-bedrock/lib/*' -not -path './packages/contracts-bedrock/kout*/*' -exec sh -c 'echo \"Checking $1\"; shellcheck \"$1\"' _ {} \\; + +install-foundry: + curl -L https://foundry.paradigm.xyz | bash && just update-foundry + +update-foundry: + bash ./ops/scripts/install-foundry.sh + +check-foundry: + bash ./packages/contracts-bedrock/scripts/checks/check-foundry-install.sh + +install-kontrol: + curl -L https://kframework.org/install | bash && just update-kontrol + +update-kontrol: + kup install kontrol --version v$(jq -r .kontrol < versions.json) + +install-abigen: + go install github.com/ethereum/go-ethereum/cmd/abigen@$(jq -r .abigen < versions.json) + +print-abigen: + abigen --version | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' -e 's/ /./g' -e 's/^/v/' + +check-abigen: + [[ $(just print-abigen) = $(cat versions.json | jq -r '.abigen') ]] && echo '✓ abigen versions match' || (echo '✗ abigen version mismatch. Run `just upgrade:abigen` to upgrade.' && exit 1) + +upgrade-abigen: + jq '.abigen = $v' --arg v $(just print:abigen) <<<$(cat versions.json) > versions.json + +install-slither: + pip3 install slither-analyzer==$(jq -r .slither < versions.json) + +print-slither: + slither --version + +check-slither: + [[ $(just print-slither) = $(jq -r .slither < versions.json) ]] && echo '✓ slither versions match' || (echo '✗ slither version mismatch. Run `just upgrade-slither` to upgrade.' && exit 1) + +upgrade-slither: + jq '.slither = $v' --arg v $(just print-slither) <<<$(cat versions.json) > versions.json diff --git a/op-e2e/README.md b/op-e2e/README.md index 28fdb06dad1b..11705aa980b4 100644 --- a/op-e2e/README.md +++ b/op-e2e/README.md @@ -29,6 +29,6 @@ make test-http ### Troubleshooting If you encounter errors: -* ensure you have the latest version of foundry installed: `pnpm update:foundry` +* ensure you have the latest version of foundry installed: `just update-foundry` * try deleting the `packages/contracts-bedrock/forge-artifacts` directory * if the above step doesn't fix the error, try `pnpm clean` diff --git a/ops/docker/ci-builder/Dockerfile b/ops/docker/ci-builder/Dockerfile index 5946b1784829..3c1956987b55 100644 --- a/ops/docker/ci-builder/Dockerfile +++ b/ops/docker/ci-builder/Dockerfile @@ -92,33 +92,25 @@ COPY --from=rust-build /root/.foundry/bin/anvil /usr/local/bin/anvil COPY --from=rust-build /root/.cargo/bin/svm /usr/local/bin/svm COPY --from=rust-build /root/.cargo/bin/just /usr/local/bin/just -COPY .nvmrc .nvmrc COPY ./versions.json ./versions.json -ENV NODE_MAJOR=20 - RUN /bin/sh -c set -eux; \ apt-get update; \ apt-get install -y --no-install-recommends bash curl openssh-client git build-essential ca-certificates jq gnupg binutils-mips-linux-gnu python3 python3-pip python3-setuptools; \ mkdir -p /etc/apt/keyrings; \ - curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg; \ - echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list; \ curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg; \ chmod a+r /etc/apt/keyrings/docker.gpg; \ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null; \ apt-get update; \ - apt-get install -y nodejs docker-ce-cli; \ + apt-get install -y docker-ce-cli; \ ln -s /usr/local/go/bin/gofmt /usr/local/bin/gofmt; \ pip install capstone pyelftools; \ curl -fLSs https://raw.githubusercontent.com/CircleCI-Public/circleci-cli/master/install.sh | bash; \ apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \ rm -rf /var/lib/apt/lists/*; \ - rm -rf /root/.cache/pip; \ - rm -rf /root/.cache/npm; - -RUN npm i -g pnpm && npm i -g yarn@1 && pnpm --version && yarn --version + rm -rf /root/.cache/pip; -RUN svm install 0.5.17 && \ +RUN svm install 0.8.25 && \ svm install 0.8.15 && \ svm install 0.8.19 diff --git a/package.json b/package.json deleted file mode 100644 index 0da9c8361938..000000000000 --- a/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "optimism", - "version": "1.0.0", - "author": "OP Labs PBC", - "license": "MIT", - "scripts": { - "clean": "rm -rf node_modules packages/**/node_modules", - "build": "cd packages/contracts-bedrock && just build", - "test": "cd packages/contracts-bedrock && just test", - "issues": "./ops/scripts/todo-checker.sh", - "lint:shellcheck": "find . -type f -name '*.sh' -not -path '*/node_modules/*' -not -path './packages/contracts-bedrock/lib/*' -not -path './packages/contracts-bedrock/kout*/*' -exec sh -c 'echo \"Checking $1\"; shellcheck \"$1\"' _ {} \\;", - "install:foundry": "curl -L https://foundry.paradigm.xyz | bash && pnpm update:foundry", - "update:foundry": "bash ./ops/scripts/install-foundry.sh", - "check:foundry": "bash ./packages/contracts-bedrock/scripts/checks/check-foundry-install.sh", - "install:kontrol": "curl -L https://kframework.org/install | bash && pnpm update:kontrol", - "update:kontrol": "kup install kontrol --version v$(jq -r .kontrol < versions.json)", - "install:abigen": "go install github.com/ethereum/go-ethereum/cmd/abigen@$(jq -r .abigen < versions.json)", - "print:abigen": "abigen --version | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' -e 's/ /./g' -e 's/^/v/'", - "check:abigen": "[[ $(pnpm -s print:abigen) = $(cat versions.json | jq -r '.abigen') ]] && echo '✓ abigen versions match' || (echo '✗ abigen version mismatch. Run `pnpm upgrade:abigen` to upgrade.' && exit 1)", - "upgrade:abigen": "jq '.abigen = $v' --arg v $(pnpm -s print:abigen) <<<$(cat versions.json) > versions.json", - "install:slither": "pip3 install slither-analyzer==$(jq -r .slither < versions.json)", - "print:slither": "slither --version", - "check:slither": "[[ $(pnpm -s print:slither) = $(jq -r .slither < versions.json) ]] && echo '✓ slither versions match' || (echo '✗ slither version mismatch. Run `pnpm upgrade:slither` to upgrade.' && exit 1)", - "upgrade:slither": "jq '.slither = $v' --arg v $(pnpm -s print:slither) <<<$(cat versions.json) > versions.json" - } -} diff --git a/packages/contracts-bedrock/CONTRIBUTING.md b/packages/contracts-bedrock/CONTRIBUTING.md index ddd55464f374..02a5bc8dad4c 100644 --- a/packages/contracts-bedrock/CONTRIBUTING.md +++ b/packages/contracts-bedrock/CONTRIBUTING.md @@ -51,12 +51,11 @@ Enhancement suggestions are tracked as [GitHub issues](/issues). The best place to begin contributing is by looking through the issues with the `good first issue` label. These are issues that are relatively easy to implement and are a great way to get familiar with the codebase. Optimism's smart contracts are written in Solidity and we use [foundry](https://github.com/foundry-rs/foundry) as our development framework. To get started, you'll need to install several dependencies: -1. [pnpm](https://pnpm.io) 1. [just](https://github.com/casey/just) 1. Make sure to `just install` 1. [foundry](https://getfoundry.sh) 1. Foundry is built with [rust](https://www.rust-lang.org/tools/install), and this project uses a pinned version of foundry. Install the rust toolchain with `rustup`. - 1. Make sure to install the version of foundry used by `ci-builder`, defined in the `versions.json` file in the root of this repo under the `foundry` key. Once you have `foundryup` installed, there is a helper to do this: `pnpm install:foundry` + 1. Make sure to install the version of foundry used by `ci-builder`, defined in the `versions.json` file in the root of this repo under the `foundry` key. Once you have `foundryup` installed, there is a helper to do this: `just install-foundry` 1. [golang](https://golang.org/doc/install) 1. [python](https://www.python.org/downloads/) diff --git a/packages/contracts-bedrock/invariant-docs/README.md b/packages/contracts-bedrock/invariant-docs/README.md index 86f2cd4b38f8..f2ab1d263101 100644 --- a/packages/contracts-bedrock/invariant-docs/README.md +++ b/packages/contracts-bedrock/invariant-docs/README.md @@ -26,7 +26,7 @@ This directory contains documentation for all defined invariant tests within `co ## Usage -To auto-generate documentation for invariant tests, run `pnpm autogen:invariant-docs`. +To auto-generate documentation for invariant tests, run `just autogen-invariant-docs`. ## Documentation Standard diff --git a/packages/contracts-bedrock/scripts/checks/check-foundry-install.sh b/packages/contracts-bedrock/scripts/checks/check-foundry-install.sh index e7edc7db270e..ccd337e958e7 100755 --- a/packages/contracts-bedrock/scripts/checks/check-foundry-install.sh +++ b/packages/contracts-bedrock/scripts/checks/check-foundry-install.sh @@ -8,7 +8,7 @@ VERSIONS_FILE="${MONOREPO_BASE}/versions.json" if ! command -v forge &> /dev/null then # shellcheck disable=SC2006 - echo "Is Foundry not installed? Consider installing via pnpm install:foundry" >&2 + echo "Is Foundry not installed? Consider installing via just install-foundry" >&2 exit 1 fi @@ -34,5 +34,5 @@ if [ "$INSTALLED_VERSION" = "$EXPECTED_VERSION" ]; then else echo "Mismatch between installed Foundry version ($INSTALLED_VERSION) and expected version ($EXPECTED_VERSION)." echo "Your version of Foundry may either not be up to date, or it could be a later version." - echo "Running pnpm update:foundry will install the expected version." + echo "Running just update-foundry will install the expected version." fi diff --git a/packages/contracts-bedrock/scripts/getting-started/versions.sh b/packages/contracts-bedrock/scripts/getting-started/versions.sh index 5ff2369daedd..880bd2898dd9 100755 --- a/packages/contracts-bedrock/scripts/getting-started/versions.sh +++ b/packages/contracts-bedrock/scripts/getting-started/versions.sh @@ -32,7 +32,6 @@ versionFoundry() { ver_git=$(version "$(git --version)") ver_go=$(version "$(go version)") ver_node=$(version "$(node --version)") -ver_pnpm=$(version "$(pnpm --version)") ver_foundry=$(versionFoundry "$(forge --version)") ver_make=$(version "$(make --version)") ver_jq=$(version "$(jq --version)") @@ -44,7 +43,6 @@ echo "Dependency | Minimum | Actual" echo "git 2 $ver_git" echo "go 1.21 $ver_go" echo "node 20 $ver_node" -echo "pnpm 9 $ver_pnpm" echo "foundry 0.2.0 (a5efe4f) $ver_foundry" echo "make 3 $ver_make" echo "jq 1.6 $ver_jq" diff --git a/packages/contracts-bedrock/scripts/go-ffi/README.md b/packages/contracts-bedrock/scripts/go-ffi/README.md index 968c572d014b..2b928f703f26 100644 --- a/packages/contracts-bedrock/scripts/go-ffi/README.md +++ b/packages/contracts-bedrock/scripts/go-ffi/README.md @@ -11,7 +11,7 @@ A lightweight binary for utilities accessed via `forge`'s `ffi` cheatcode in the ## Usage -To build, run `pnpm build:go-ffi` from this directory or the `contract-bedrock` package. +To build, run `just build-go-ffi` from this directory or the `contract-bedrock` package. ### In a Forge Test diff --git a/packages/contracts-bedrock/test/kontrol/README.md b/packages/contracts-bedrock/test/kontrol/README.md index f984a8782fe9..32eedd4f0409 100644 --- a/packages/contracts-bedrock/test/kontrol/README.md +++ b/packages/contracts-bedrock/test/kontrol/README.md @@ -52,8 +52,8 @@ The directory is structured as follows ### Installation 1. `cd` to the root of this repo. -2. Install Foundry by running `pnpm install:foundry`. This installs `foundryup`, the foundry toolchain installer, then installs the required foundry version. -3. Install Kontrol by running `pnpm install:kontrol`. This installs `kup`, the package manager for RV tools, then installs the required kontrol version. +2. Install Foundry by running `just install-foundry`. This installs `foundryup`, the foundry toolchain installer, then installs the required foundry version. +3. Install Kontrol by running `just install-kontrol`. This installs `kup`, the package manager for RV tools, then installs the required kontrol version. 4. Install Docker. ## Usage diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index cf74605d4482..000000000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,3533 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: {} - - packages/contracts-bedrock: - devDependencies: - '@babel/eslint-parser': - specifier: ^7.23.10 - version: 7.25.1(@babel/core@7.25.2)(eslint@8.56.0) - '@types/node': - specifier: ^20.14.12 - version: 20.14.13 - '@typescript-eslint/eslint-plugin': - specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.5.4))(eslint@8.56.0)(typescript@5.5.4) - '@typescript-eslint/parser': - specifier: ^6.21.0 - version: 6.21.0(eslint@8.56.0)(typescript@5.5.4) - doctoc: - specifier: ^2.2.0 - version: 2.2.1 - eslint: - specifier: ^8.56.0 - version: 8.56.0 - eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@8.56.0) - eslint-config-standard: - specifier: ^16.0.3 - version: 16.0.3(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.5.4))(eslint@8.56.0))(eslint-plugin-node@11.1.0(eslint@8.56.0))(eslint-plugin-promise@5.2.0(eslint@8.56.0))(eslint@8.56.0) - eslint-plugin-import: - specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.5.4))(eslint@8.56.0) - eslint-plugin-jsdoc: - specifier: ^48.8.3 - version: 48.10.1(eslint@8.56.0) - eslint-plugin-prefer-arrow: - specifier: ^1.2.3 - version: 1.2.3(eslint@8.56.0) - eslint-plugin-prettier: - specifier: ^4.0.0 - version: 4.2.1(eslint-config-prettier@9.1.0(eslint@8.56.0))(eslint@8.56.0)(prettier@2.8.8) - prettier: - specifier: ^2.8.0 - version: 2.8.8 - tsx: - specifier: ^4.16.2 - version: 4.16.2 - typescript: - specifier: ^5.5.4 - version: 5.5.4 - -packages: - - '@aashutoshrathi/word-wrap@1.2.6': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - - '@babel/code-frame@7.24.7': - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.25.2': - resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.25.2': - resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} - engines: {node: '>=6.9.0'} - - '@babel/eslint-parser@7.25.1': - resolution: {integrity: sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg==} - engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} - peerDependencies: - '@babel/core': ^7.11.0 - eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - - '@babel/generator@7.25.0': - resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.25.2': - resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.24.7': - resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.25.2': - resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-simple-access@7.24.7': - resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.24.8': - resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.24.7': - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.24.8': - resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.25.0': - resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.24.7': - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.25.0': - resolution: {integrity: sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/template@7.25.0': - resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.25.2': - resolution: {integrity: sha512-s4/r+a7xTnny2O6FcZzqgT6nE4/GHEdcqj4qAeglbUOh0TeglEfmNJFAd/OLoVtGd6ZhAO8GCVvCNUO5t/VJVQ==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.25.2': - resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} - engines: {node: '>=6.9.0'} - - '@es-joy/jsdoccomment@0.46.0': - resolution: {integrity: sha512-C3Axuq1xd/9VqFZpW4YAzOx5O9q/LP46uIQy/iNDpHG3fmPa6TBtvfglMCs3RBiBxAIi0Go97r8+jvTt55XMyQ==} - engines: {node: '>=16'} - - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.6.2': - resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@8.56.0': - resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@humanwhocodes/config-array@0.11.13': - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@2.0.1': - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} - deprecated: Use @eslint/object-schema instead - - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - - '@textlint/ast-node-types@12.6.1': - resolution: {integrity: sha512-uzlJ+ZsCAyJm+lBi7j0UeBbj+Oy6w/VWoGJ3iHRHE5eZ8Z4iK66mq+PG/spupmbllLtz77OJbY89BYqgFyjXmA==} - - '@textlint/markdown-to-ast@12.6.1': - resolution: {integrity: sha512-T0HO+VrU9VbLRiEx/kH4+gwGMHNMIGkp0Pok+p0I33saOOLyhfGvwOKQgvt2qkxzQEV2L5MtGB8EnW4r5d3CqQ==} - - '@types/json-schema@7.0.12': - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mdast@3.0.15': - resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} - - '@types/node@20.14.13': - resolution: {integrity: sha512-+bHoGiZb8UiQ0+WEtmph2IWQCjIqg8MDZMAV+ppRRhUZnquF5mQkP/9vpSwJClEiSM/C7fZZExPzfU0vJTyp8w==} - - '@types/semver@7.5.7': - resolution: {integrity: sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==} - - '@types/unist@2.0.10': - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} - - '@typescript-eslint/eslint-plugin@6.21.0': - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@6.21.0': - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/scope-manager@6.21.0': - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/type-utils@6.21.0': - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/types@6.21.0': - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/typescript-estree@6.21.0': - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/utils@6.21.0': - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - - '@typescript-eslint/visitor-keys@6.21.0': - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true - - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} - engines: {node: '>=0.4.0'} - hasBin: true - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - - anchor-markdown-header@0.6.0: - resolution: {integrity: sha512-v7HJMtE1X7wTpNFseRhxsY/pivP4uAJbidVhPT+yhz4i/vV1+qx371IXuV9V7bN6KjFtheLJxqaSm0Y/8neJTA==} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - are-docs-informative@0.0.2: - resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} - engines: {node: '>=14'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} - engines: {node: '>= 0.4'} - - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - bail@1.0.5: - resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - - browserslist@4.23.2: - resolution: {integrity: sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - caniuse-lite@1.0.30001644: - resolution: {integrity: sha512-YGvlOZB4QhZuiis+ETS0VXR+MExbFf4fZYYeMTEE0aTQd/RdIjkTyZjLrbYVKnHzppDvnOhritRVv+i7Go6mHw==} - - ccount@1.1.0: - resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} - - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - character-entities-legacy@1.1.4: - resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - - character-entities@1.2.4: - resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - - character-reference-invalid@1.1.4: - resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - comment-parser@1.4.1: - resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} - engines: {node: '>= 12.0.0'} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} - - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.5: - resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - doctoc@2.2.1: - resolution: {integrity: sha512-qNJ1gsuo7hH40vlXTVVrADm6pdg30bns/Mo7Nv1SxuXSM1bwF9b4xQ40a6EFT/L1cI+Yylbyi8MPI4G4y7XJzQ==} - hasBin: true - - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - - dom-serializer@1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} - - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - domhandler@4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} - - domutils@2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - - electron-to-chromium@1.5.3: - resolution: {integrity: sha512-QNdYSS5i8D9axWp/6XIezRObRHqaav/ur9z1VzCDUCH1XIFOr9WQk5xmgunhsTpjjgDy3oLxO/WMOVZlpUQrlA==} - - emoji-regex@10.1.0: - resolution: {integrity: sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg==} - - entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - - entities@3.0.1: - resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} - engines: {node: '>=0.12'} - - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-module-lexer@1.5.4: - resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} - - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} - hasBin: true - - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eslint-config-prettier@9.1.0: - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - - eslint-config-standard@16.0.3: - resolution: {integrity: sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==} - peerDependencies: - eslint: ^7.12.1 - eslint-plugin-import: ^2.22.1 - eslint-plugin-node: ^11.1.0 - eslint-plugin-promise: ^4.2.1 || ^5.0.0 - - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - - eslint-module-utils@2.8.1: - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - - eslint-plugin-es@3.0.1: - resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=4.19.1' - - eslint-plugin-import@2.29.1: - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - - eslint-plugin-jsdoc@48.10.1: - resolution: {integrity: sha512-dxV7ytazLW9CdPahds07FljQ960vLQG65mUnFi8/6Pc6u6miCZNGYrnKVHrnnrcj+LikhiKAayjrUiNttzRMEg==} - engines: {node: '>=18'} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - - eslint-plugin-node@11.1.0: - resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=5.16.0' - - eslint-plugin-prefer-arrow@1.2.3: - resolution: {integrity: sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==} - peerDependencies: - eslint: '>=2.0.0' - - eslint-plugin-prettier@4.2.1: - resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - eslint: '>=7.28.0' - eslint-config-prettier: '*' - prettier: '>=2.0.0' - peerDependenciesMeta: - eslint-config-prettier: - optional: true - - eslint-plugin-promise@5.2.0: - resolution: {integrity: sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==} - engines: {node: ^10.12.0 || >=12.0.0} - peerDependencies: - eslint: ^7.0.0 - - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-utils@2.1.0: - resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} - engines: {node: '>=6'} - - eslint-visitor-keys@1.3.0: - resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} - engines: {node: '>=4'} - - eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@4.0.0: - resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint@8.56.0: - resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - - espree@10.1.0: - resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - - fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - - fault@1.0.4: - resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} - - flatted@3.2.2: - resolution: {integrity: sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==} - - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - - format@0.2.2: - resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} - engines: {node: '>=0.4.x'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - - get-tsconfig@4.7.5: - resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - - globals@13.21.0: - resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} - engines: {node: '>=8'} - - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - htmlparser2@7.2.0: - resolution: {integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==} - - ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} - - is-alphabetical@1.0.4: - resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - - is-alphanumerical@1.0.4: - resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} - - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - - is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-core-module@2.15.0: - resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} - engines: {node: '>= 0.4'} - - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} - - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - - is-decimal@1.0.4: - resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-hexadecimal@1.0.4: - resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - jsdoc-type-pratt-parser@4.0.0: - resolution: {integrity: sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==} - engines: {node: '>=12.0.0'} - - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - longest-streak@2.0.4: - resolution: {integrity: sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==} - - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - - markdown-table@2.0.0: - resolution: {integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==} - - mdast-util-find-and-replace@1.1.1: - resolution: {integrity: sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==} - - mdast-util-footnote@0.1.7: - resolution: {integrity: sha512-QxNdO8qSxqbO2e3m09KwDKfWiLgqyCurdWTQ198NpbZ2hxntdc+VKS4fDJCmNWbAroUdYnSthu+XbZ8ovh8C3w==} - - mdast-util-from-markdown@0.8.5: - resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} - - mdast-util-frontmatter@0.2.0: - resolution: {integrity: sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==} - - mdast-util-gfm-autolink-literal@0.1.3: - resolution: {integrity: sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==} - - mdast-util-gfm-strikethrough@0.2.3: - resolution: {integrity: sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==} - - mdast-util-gfm-table@0.1.6: - resolution: {integrity: sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==} - - mdast-util-gfm-task-list-item@0.1.6: - resolution: {integrity: sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==} - - mdast-util-gfm@0.1.2: - resolution: {integrity: sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==} - - mdast-util-to-markdown@0.6.5: - resolution: {integrity: sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==} - - mdast-util-to-string@2.0.0: - resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromark-extension-footnote@0.3.2: - resolution: {integrity: sha512-gr/BeIxbIWQoUm02cIfK7mdMZ/fbroRpLsck4kvFtjbzP4yi+OPVbnukTc/zy0i7spC2xYE/dbX1Sur8BEDJsQ==} - - micromark-extension-frontmatter@0.2.2: - resolution: {integrity: sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==} - - micromark-extension-gfm-autolink-literal@0.5.7: - resolution: {integrity: sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==} - - micromark-extension-gfm-strikethrough@0.6.5: - resolution: {integrity: sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==} - - micromark-extension-gfm-table@0.4.3: - resolution: {integrity: sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==} - - micromark-extension-gfm-tagfilter@0.3.0: - resolution: {integrity: sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==} - - micromark-extension-gfm-task-list-item@0.3.3: - resolution: {integrity: sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==} - - micromark-extension-gfm@0.3.3: - resolution: {integrity: sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==} - - micromark@2.11.4: - resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} - - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} - - object-inspect@1.13.2: - resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - - object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} - - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse-entities@2.0.0: - resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} - - parse-imports@2.1.1: - resolution: {integrity: sha512-TDT4HqzUiTMO1wJRwg/t/hYk8Wdp3iF/ToMIlAoVQfL1Xs/sTxq1dKWSMjMbQmIarfWKymOyly40+zmPHXMqCA==} - engines: {node: '>= 18'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} - - regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - - remark-footnotes@3.0.0: - resolution: {integrity: sha512-ZssAvH9FjGYlJ/PBVKdSmfyPc3Cz4rTWgZLI4iE/SX8Nt5l3o3oEjv3wwG5VD7xOjktzdwp5coac+kJV9l4jgg==} - - remark-frontmatter@3.0.0: - resolution: {integrity: sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==} - - remark-gfm@1.0.0: - resolution: {integrity: sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==} - - remark-parse@9.0.0: - resolution: {integrity: sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==} - - repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} - - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true - - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} - hasBin: true - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - slashes@3.0.12: - resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@4.0.0: - resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} - - spdx-license-ids@3.0.18: - resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} - - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - synckit@0.9.1: - resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} - engines: {node: ^14.18.0 || >=16.0.0} - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - traverse@0.6.9: - resolution: {integrity: sha512-7bBrcF+/LQzSgFmT0X5YclVqQxtv7TDJ1f8Wj7ibBu/U6BMLeOpUxuZjV7rMc44UtKxlnMFigdhFAIszSX1DMg==} - engines: {node: '>= 0.4'} - - trough@1.0.5: - resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} - - ts-api-utils@1.0.1: - resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.6.3: - resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} - - tsx@4.16.2: - resolution: {integrity: sha512-C1uWweJDgdtX2x600HjaFaucXTilT7tgUZHbOE4+ypskZ1OP8CRCSDkCxG6Vya9EwaFIVagWwpaVAn5wzypaqQ==} - engines: {node: '>=18.0.0'} - hasBin: true - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} - - typedarray.prototype.slice@1.0.3: - resolution: {integrity: sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==} - engines: {node: '>= 0.4'} - - typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} - engines: {node: '>=14.17'} - hasBin: true - - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - - underscore@1.13.7: - resolution: {integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==} - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - unified@9.2.2: - resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} - - unist-util-is@4.1.0: - resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} - - unist-util-stringify-position@2.0.3: - resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} - - unist-util-visit-parents@3.1.1: - resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} - - update-browserslist-db@1.1.0: - resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - update-section@0.3.3: - resolution: {integrity: sha512-BpRZMZpgXLuTiKeiu7kK0nIPwGdyrqrs6EDSaXtjD/aQ2T+qVo9a5hRC3HN3iJjCMxNT/VxoLGQ7E/OzE5ucnw==} - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - vfile-message@2.0.4: - resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} - - vfile@4.2.1: - resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} - - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - zwitch@1.0.5: - resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} - -snapshots: - - '@aashutoshrathi/word-wrap@1.2.6': {} - - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - - '@babel/code-frame@7.24.7': - dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.0.1 - - '@babel/compat-data@7.25.2': {} - - '@babel/core@7.25.2': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helpers': 7.25.0 - '@babel/parser': 7.25.0 - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.2 - '@babel/types': 7.25.2 - convert-source-map: 2.0.0 - debug: 4.3.5 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/eslint-parser@7.25.1(@babel/core@7.25.2)(eslint@8.56.0)': - dependencies: - '@babel/core': 7.25.2 - '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.56.0 - eslint-visitor-keys: 2.1.0 - semver: 6.3.1 - - '@babel/generator@7.25.0': - dependencies: - '@babel/types': 7.25.2 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - - '@babel/helper-compilation-targets@7.25.2': - dependencies: - '@babel/compat-data': 7.25.2 - '@babel/helper-validator-option': 7.24.8 - browserslist: 4.23.2 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-module-imports@7.24.7': - dependencies: - '@babel/traverse': 7.25.2 - '@babel/types': 7.25.2 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-simple-access': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.2 - transitivePeerDependencies: - - supports-color - - '@babel/helper-simple-access@7.24.7': - dependencies: - '@babel/traverse': 7.25.2 - '@babel/types': 7.25.2 - transitivePeerDependencies: - - supports-color - - '@babel/helper-string-parser@7.24.8': {} - - '@babel/helper-validator-identifier@7.24.7': {} - - '@babel/helper-validator-option@7.24.8': {} - - '@babel/helpers@7.25.0': - dependencies: - '@babel/template': 7.25.0 - '@babel/types': 7.25.2 - - '@babel/highlight@7.24.7': - dependencies: - '@babel/helper-validator-identifier': 7.24.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.1 - - '@babel/parser@7.25.0': - dependencies: - '@babel/types': 7.25.2 - - '@babel/template@7.25.0': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/parser': 7.25.0 - '@babel/types': 7.25.2 - - '@babel/traverse@7.25.2': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 - '@babel/parser': 7.25.0 - '@babel/template': 7.25.0 - '@babel/types': 7.25.2 - debug: 4.3.5 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.25.2': - dependencies: - '@babel/helper-string-parser': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 - to-fast-properties: 2.0.0 - - '@es-joy/jsdoccomment@0.46.0': - dependencies: - comment-parser: 1.4.1 - esquery: 1.6.0 - jsdoc-type-pratt-parser: 4.0.0 - - '@esbuild/aix-ppc64@0.21.5': - optional: true - - '@esbuild/android-arm64@0.21.5': - optional: true - - '@esbuild/android-arm@0.21.5': - optional: true - - '@esbuild/android-x64@0.21.5': - optional: true - - '@esbuild/darwin-arm64@0.21.5': - optional: true - - '@esbuild/darwin-x64@0.21.5': - optional: true - - '@esbuild/freebsd-arm64@0.21.5': - optional: true - - '@esbuild/freebsd-x64@0.21.5': - optional: true - - '@esbuild/linux-arm64@0.21.5': - optional: true - - '@esbuild/linux-arm@0.21.5': - optional: true - - '@esbuild/linux-ia32@0.21.5': - optional: true - - '@esbuild/linux-loong64@0.21.5': - optional: true - - '@esbuild/linux-mips64el@0.21.5': - optional: true - - '@esbuild/linux-ppc64@0.21.5': - optional: true - - '@esbuild/linux-riscv64@0.21.5': - optional: true - - '@esbuild/linux-s390x@0.21.5': - optional: true - - '@esbuild/linux-x64@0.21.5': - optional: true - - '@esbuild/netbsd-x64@0.21.5': - optional: true - - '@esbuild/openbsd-x64@0.21.5': - optional: true - - '@esbuild/sunos-x64@0.21.5': - optional: true - - '@esbuild/win32-arm64@0.21.5': - optional: true - - '@esbuild/win32-ia32@0.21.5': - optional: true - - '@esbuild/win32-x64@0.21.5': - optional: true - - '@eslint-community/eslint-utils@4.4.0(eslint@8.56.0)': - dependencies: - eslint: 8.56.0 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.6.2': {} - - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.3.5 - espree: 9.6.1 - globals: 13.21.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@8.56.0': {} - - '@humanwhocodes/config-array@0.11.13': - dependencies: - '@humanwhocodes/object-schema': 2.0.1 - debug: 4.3.5 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/object-schema@2.0.1': {} - - '@jridgewell/gen-mapping@0.3.5': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - dependencies: - eslint-scope: 5.1.1 - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - - '@pkgr/core@0.1.1': {} - - '@textlint/ast-node-types@12.6.1': {} - - '@textlint/markdown-to-ast@12.6.1': - dependencies: - '@textlint/ast-node-types': 12.6.1 - debug: 4.3.5 - mdast-util-gfm-autolink-literal: 0.1.3 - remark-footnotes: 3.0.0 - remark-frontmatter: 3.0.0 - remark-gfm: 1.0.0 - remark-parse: 9.0.0 - traverse: 0.6.9 - unified: 9.2.2 - transitivePeerDependencies: - - supports-color - - '@types/json-schema@7.0.12': {} - - '@types/json5@0.0.29': {} - - '@types/mdast@3.0.15': - dependencies: - '@types/unist': 2.0.10 - - '@types/node@20.14.13': - dependencies: - undici-types: 5.26.5 - - '@types/semver@7.5.7': {} - - '@types/unist@2.0.10': {} - - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.5.4))(eslint@8.56.0)(typescript@5.5.4)': - dependencies: - '@eslint-community/regexpp': 4.6.2 - '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.5.4) - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.56.0)(typescript@5.5.4) - '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4 - eslint: 8.56.0 - graphemer: 1.4.0 - ignore: 5.2.4 - natural-compare: 1.4.0 - semver: 7.6.0 - ts-api-utils: 1.0.1(typescript@5.5.4) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.5.4)': - dependencies: - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4 - eslint: 8.56.0 - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - - '@typescript-eslint/type-utils@6.21.0(eslint@8.56.0)(typescript@5.5.4)': - dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) - '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.5.4) - debug: 4.3.5 - eslint: 8.56.0 - ts-api-utils: 1.0.1(typescript@5.5.4) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@6.21.0': {} - - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.5.4)': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.5 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.6.3 - ts-api-utils: 1.0.1(typescript@5.5.4) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@6.21.0(eslint@8.56.0)(typescript@5.5.4)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.7 - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) - eslint: 8.56.0 - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/visitor-keys@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - eslint-visitor-keys: 3.4.3 - - '@ungap/structured-clone@1.2.0': {} - - acorn-jsx@5.3.2(acorn@8.10.0): - dependencies: - acorn: 8.10.0 - - acorn-jsx@5.3.2(acorn@8.12.1): - dependencies: - acorn: 8.12.1 - - acorn@8.10.0: {} - - acorn@8.12.1: {} - - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - anchor-markdown-header@0.6.0: - dependencies: - emoji-regex: 10.1.0 - - ansi-regex@5.0.1: {} - - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - are-docs-informative@0.0.2: {} - - argparse@2.0.1: {} - - array-buffer-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 - - array-includes@3.1.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - is-string: 1.0.7 - - array-union@2.1.0: {} - - array.prototype.findlastindex@1.2.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 - - array.prototype.flat@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - - array.prototype.flatmap@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - - arraybuffer.prototype.slice@1.0.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 - - bail@1.0.5: {} - - balanced-match@1.0.2: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.0.1: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.2: - dependencies: - fill-range: 7.0.1 - - browserslist@4.23.2: - dependencies: - caniuse-lite: 1.0.30001644 - electron-to-chromium: 1.5.3 - node-releases: 2.0.18 - update-browserslist-db: 1.1.0(browserslist@4.23.2) - - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - - callsites@3.1.0: {} - - caniuse-lite@1.0.30001644: {} - - ccount@1.1.0: {} - - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - character-entities-legacy@1.1.4: {} - - character-entities@1.2.4: {} - - character-reference-invalid@1.1.4: {} - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.3: {} - - color-name@1.1.4: {} - - comment-parser@1.4.1: {} - - concat-map@0.0.1: {} - - convert-source-map@2.0.0: {} - - cross-spawn@7.0.3: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - data-view-buffer@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-offset@1.0.0: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - debug@3.2.7: - dependencies: - ms: 2.1.2 - - debug@4.3.4: - dependencies: - ms: 2.1.2 - - debug@4.3.5: - dependencies: - ms: 2.1.2 - - deep-is@0.1.4: {} - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - doctoc@2.2.1: - dependencies: - '@textlint/markdown-to-ast': 12.6.1 - anchor-markdown-header: 0.6.0 - htmlparser2: 7.2.0 - minimist: 1.2.8 - underscore: 1.13.7 - update-section: 0.3.3 - transitivePeerDependencies: - - supports-color - - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - - dom-serializer@1.4.1: - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - entities: 2.2.0 - - domelementtype@2.3.0: {} - - domhandler@4.3.1: - dependencies: - domelementtype: 2.3.0 - - domutils@2.8.0: - dependencies: - dom-serializer: 1.4.1 - domelementtype: 2.3.0 - domhandler: 4.3.1 - - electron-to-chromium@1.5.3: {} - - emoji-regex@10.1.0: {} - - entities@2.2.0: {} - - entities@3.0.1: {} - - es-abstract@1.23.3: - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.2 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - - es-errors@1.3.0: {} - - es-module-lexer@1.5.4: {} - - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.0.3: - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-shim-unscopables@1.0.2: - dependencies: - hasown: 2.0.2 - - es-to-primitive@1.2.1: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - - esbuild@0.21.5: - optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 - - escalade@3.1.2: {} - - escape-string-regexp@1.0.5: {} - - escape-string-regexp@4.0.0: {} - - eslint-config-prettier@9.1.0(eslint@8.56.0): - dependencies: - eslint: 8.56.0 - - eslint-config-standard@16.0.3(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.5.4))(eslint@8.56.0))(eslint-plugin-node@11.1.0(eslint@8.56.0))(eslint-plugin-promise@5.2.0(eslint@8.56.0))(eslint@8.56.0): - dependencies: - eslint: 8.56.0 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.5.4))(eslint@8.56.0) - eslint-plugin-node: 11.1.0(eslint@8.56.0) - eslint-plugin-promise: 5.2.0(eslint@8.56.0) - - eslint-import-resolver-node@0.3.9: - dependencies: - debug: 3.2.7 - is-core-module: 2.15.0 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@8.56.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.5.4) - eslint: 8.56.0 - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - - eslint-plugin-es@3.0.1(eslint@8.56.0): - dependencies: - eslint: 8.56.0 - eslint-utils: 2.1.0 - regexpp: 3.2.0 - - eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.5.4))(eslint@8.56.0): - dependencies: - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.56.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@8.56.0) - hasown: 2.0.2 - is-core-module: 2.15.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.5.4) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-jsdoc@48.10.1(eslint@8.56.0): - dependencies: - '@es-joy/jsdoccomment': 0.46.0 - are-docs-informative: 0.0.2 - comment-parser: 1.4.1 - debug: 4.3.5 - escape-string-regexp: 4.0.0 - eslint: 8.56.0 - espree: 10.1.0 - esquery: 1.6.0 - parse-imports: 2.1.1 - semver: 7.6.3 - spdx-expression-parse: 4.0.0 - synckit: 0.9.1 - transitivePeerDependencies: - - supports-color - - eslint-plugin-node@11.1.0(eslint@8.56.0): - dependencies: - eslint: 8.56.0 - eslint-plugin-es: 3.0.1(eslint@8.56.0) - eslint-utils: 2.1.0 - ignore: 5.2.4 - minimatch: 3.1.2 - resolve: 1.22.8 - semver: 6.3.1 - - eslint-plugin-prefer-arrow@1.2.3(eslint@8.56.0): - dependencies: - eslint: 8.56.0 - - eslint-plugin-prettier@4.2.1(eslint-config-prettier@9.1.0(eslint@8.56.0))(eslint@8.56.0)(prettier@2.8.8): - dependencies: - eslint: 8.56.0 - prettier: 2.8.8 - prettier-linter-helpers: 1.0.0 - optionalDependencies: - eslint-config-prettier: 9.1.0(eslint@8.56.0) - - eslint-plugin-promise@5.2.0(eslint@8.56.0): - dependencies: - eslint: 8.56.0 - - eslint-scope@5.1.1: - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-utils@2.1.0: - dependencies: - eslint-visitor-keys: 1.3.0 - - eslint-visitor-keys@1.3.0: {} - - eslint-visitor-keys@2.1.0: {} - - eslint-visitor-keys@3.4.3: {} - - eslint-visitor-keys@4.0.0: {} - - eslint@8.56.0: - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) - '@eslint-community/regexpp': 4.6.2 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.56.0 - '@humanwhocodes/config-array': 0.11.13 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.5 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.21.0 - graphemer: 1.4.0 - ignore: 5.2.4 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - espree@10.1.0: - dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) - eslint-visitor-keys: 4.0.0 - - espree@9.6.1: - dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.3 - - esquery@1.5.0: - dependencies: - estraverse: 5.3.0 - - esquery@1.6.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@4.3.0: {} - - estraverse@5.3.0: {} - - esutils@2.0.3: {} - - extend@3.0.2: {} - - fast-deep-equal@3.1.3: {} - - fast-diff@1.3.0: {} - - fast-glob@3.3.1: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - - fastq@1.15.0: - dependencies: - reusify: 1.0.4 - - fault@1.0.4: - dependencies: - format: 0.2.2 - - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.0.4 - - fill-range@7.0.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat-cache@3.0.4: - dependencies: - flatted: 3.2.2 - rimraf: 3.0.2 - - flatted@3.2.2: {} - - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - - format@0.2.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - function.prototype.name@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - functions-have-names: 1.2.3 - - functions-have-names@1.2.3: {} - - gensync@1.0.0-beta.2: {} - - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - - get-symbol-description@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - - get-tsconfig@4.7.5: - dependencies: - resolve-pkg-maps: 1.0.0 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - globals@11.12.0: {} - - globals@13.21.0: - dependencies: - type-fest: 0.20.2 - - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.0.1 - - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.1 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 - - graphemer@1.4.0: {} - - has-bigints@1.0.2: {} - - has-flag@3.0.0: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.0 - - has-proto@1.0.3: {} - - has-symbols@1.0.3: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.0.3 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - htmlparser2@7.2.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - domutils: 2.8.0 - entities: 3.0.1 - - ignore@5.2.4: {} - - import-fresh@3.3.0: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - imurmurhash@0.1.4: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - internal-slot@1.0.7: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.0.6 - - is-alphabetical@1.0.4: {} - - is-alphanumerical@1.0.4: - dependencies: - is-alphabetical: 1.0.4 - is-decimal: 1.0.4 - - is-array-buffer@3.0.4: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 - - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-buffer@2.0.5: {} - - is-callable@1.2.7: {} - - is-core-module@2.15.0: - dependencies: - hasown: 2.0.2 - - is-data-view@1.0.1: - dependencies: - is-typed-array: 1.1.13 - - is-date-object@1.0.5: - dependencies: - has-tostringtag: 1.0.2 - - is-decimal@1.0.4: {} - - is-extglob@2.1.1: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-hexadecimal@1.0.4: {} - - is-negative-zero@2.0.3: {} - - is-number-object@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - - is-number@7.0.0: {} - - is-path-inside@3.0.3: {} - - is-plain-obj@2.1.0: {} - - is-regex@1.1.4: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-shared-array-buffer@1.0.3: - dependencies: - call-bind: 1.0.7 - - is-string@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - - is-symbol@1.0.4: - dependencies: - has-symbols: 1.0.3 - - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.15 - - is-weakref@1.0.2: - dependencies: - call-bind: 1.0.7 - - isarray@2.0.5: {} - - isexe@2.0.0: {} - - js-tokens@4.0.0: {} - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - jsdoc-type-pratt-parser@4.0.0: {} - - jsesc@2.5.2: {} - - json-schema-traverse@0.4.1: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - - json5@2.2.3: {} - - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - lodash.merge@4.6.2: {} - - longest-streak@2.0.4: {} - - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - - markdown-table@2.0.0: - dependencies: - repeat-string: 1.6.1 - - mdast-util-find-and-replace@1.1.1: - dependencies: - escape-string-regexp: 4.0.0 - unist-util-is: 4.1.0 - unist-util-visit-parents: 3.1.1 - - mdast-util-footnote@0.1.7: - dependencies: - mdast-util-to-markdown: 0.6.5 - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color - - mdast-util-from-markdown@0.8.5: - dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-string: 2.0.0 - micromark: 2.11.4 - parse-entities: 2.0.0 - unist-util-stringify-position: 2.0.3 - transitivePeerDependencies: - - supports-color - - mdast-util-frontmatter@0.2.0: - dependencies: - micromark-extension-frontmatter: 0.2.2 - - mdast-util-gfm-autolink-literal@0.1.3: - dependencies: - ccount: 1.1.0 - mdast-util-find-and-replace: 1.1.1 - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-strikethrough@0.2.3: - dependencies: - mdast-util-to-markdown: 0.6.5 - - mdast-util-gfm-table@0.1.6: - dependencies: - markdown-table: 2.0.0 - mdast-util-to-markdown: 0.6.5 - - mdast-util-gfm-task-list-item@0.1.6: - dependencies: - mdast-util-to-markdown: 0.6.5 - - mdast-util-gfm@0.1.2: - dependencies: - mdast-util-gfm-autolink-literal: 0.1.3 - mdast-util-gfm-strikethrough: 0.2.3 - mdast-util-gfm-table: 0.1.6 - mdast-util-gfm-task-list-item: 0.1.6 - mdast-util-to-markdown: 0.6.5 - transitivePeerDependencies: - - supports-color - - mdast-util-to-markdown@0.6.5: - dependencies: - '@types/unist': 2.0.10 - longest-streak: 2.0.4 - mdast-util-to-string: 2.0.0 - parse-entities: 2.0.0 - repeat-string: 1.6.1 - zwitch: 1.0.5 - - mdast-util-to-string@2.0.0: {} - - merge2@1.4.1: {} - - micromark-extension-footnote@0.3.2: - dependencies: - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color - - micromark-extension-frontmatter@0.2.2: - dependencies: - fault: 1.0.4 - - micromark-extension-gfm-autolink-literal@0.5.7: - dependencies: - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color - - micromark-extension-gfm-strikethrough@0.6.5: - dependencies: - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color - - micromark-extension-gfm-table@0.4.3: - dependencies: - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color - - micromark-extension-gfm-tagfilter@0.3.0: {} - - micromark-extension-gfm-task-list-item@0.3.3: - dependencies: - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color - - micromark-extension-gfm@0.3.3: - dependencies: - micromark: 2.11.4 - micromark-extension-gfm-autolink-literal: 0.5.7 - micromark-extension-gfm-strikethrough: 0.6.5 - micromark-extension-gfm-table: 0.4.3 - micromark-extension-gfm-tagfilter: 0.3.0 - micromark-extension-gfm-task-list-item: 0.3.3 - transitivePeerDependencies: - - supports-color - - micromark@2.11.4: - dependencies: - debug: 4.3.5 - parse-entities: 2.0.0 - transitivePeerDependencies: - - supports-color - - micromatch@4.0.5: - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@9.0.3: - dependencies: - brace-expansion: 2.0.1 - - minimist@1.2.8: {} - - ms@2.1.2: {} - - natural-compare@1.4.0: {} - - node-releases@2.0.18: {} - - object-inspect@1.13.2: {} - - object-keys@1.1.1: {} - - object.assign@4.1.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - - object.fromentries@2.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - - object.groupby@1.0.3: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - - object.values@1.2.0: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - optionator@0.9.3: - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - parse-entities@2.0.0: - dependencies: - character-entities: 1.2.4 - character-entities-legacy: 1.1.4 - character-reference-invalid: 1.1.4 - is-alphanumerical: 1.0.4 - is-decimal: 1.0.4 - is-hexadecimal: 1.0.4 - - parse-imports@2.1.1: - dependencies: - es-module-lexer: 1.5.4 - slashes: 3.0.12 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - path-key@3.1.1: {} - - path-parse@1.0.7: {} - - path-type@4.0.0: {} - - picocolors@1.0.1: {} - - picomatch@2.3.1: {} - - possible-typed-array-names@1.0.0: {} - - prelude-ls@1.2.1: {} - - prettier-linter-helpers@1.0.0: - dependencies: - fast-diff: 1.3.0 - - prettier@2.8.8: {} - - punycode@2.3.1: {} - - queue-microtask@1.2.3: {} - - regexp.prototype.flags@1.5.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 - - regexpp@3.2.0: {} - - remark-footnotes@3.0.0: - dependencies: - mdast-util-footnote: 0.1.7 - micromark-extension-footnote: 0.3.2 - transitivePeerDependencies: - - supports-color - - remark-frontmatter@3.0.0: - dependencies: - mdast-util-frontmatter: 0.2.0 - micromark-extension-frontmatter: 0.2.2 - - remark-gfm@1.0.0: - dependencies: - mdast-util-gfm: 0.1.2 - micromark-extension-gfm: 0.3.3 - transitivePeerDependencies: - - supports-color - - remark-parse@9.0.0: - dependencies: - mdast-util-from-markdown: 0.8.5 - transitivePeerDependencies: - - supports-color - - repeat-string@1.6.1: {} - - resolve-from@4.0.0: {} - - resolve-pkg-maps@1.0.0: {} - - resolve@1.22.8: - dependencies: - is-core-module: 2.15.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - reusify@1.0.4: {} - - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - safe-array-concat@1.1.2: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - isarray: 2.0.5 - - safe-regex-test@1.0.3: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - - semver@6.3.1: {} - - semver@7.6.0: - dependencies: - lru-cache: 6.0.0 - - semver@7.6.3: {} - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - side-channel@1.0.6: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.2 - - slash@3.0.0: {} - - slashes@3.0.12: {} - - spdx-exceptions@2.5.0: {} - - spdx-expression-parse@4.0.0: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.18 - - spdx-license-ids@3.0.18: {} - - string.prototype.trim@1.2.9: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - - string.prototype.trimend@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: {} - - strip-json-comments@3.1.1: {} - - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-preserve-symlinks-flag@1.0.0: {} - - synckit@0.9.1: - dependencies: - '@pkgr/core': 0.1.1 - tslib: 2.6.3 - - text-table@0.2.0: {} - - to-fast-properties@2.0.0: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - traverse@0.6.9: - dependencies: - gopd: 1.0.1 - typedarray.prototype.slice: 1.0.3 - which-typed-array: 1.1.15 - - trough@1.0.5: {} - - ts-api-utils@1.0.1(typescript@5.5.4): - dependencies: - typescript: 5.5.4 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - - tslib@2.6.3: {} - - tsx@4.16.2: - dependencies: - esbuild: 0.21.5 - get-tsconfig: 4.7.5 - optionalDependencies: - fsevents: 2.3.3 - - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - - type-fest@0.20.2: {} - - typed-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - - typed-array-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-byte-offset@1.0.2: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-length@1.0.6: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - - typedarray.prototype.slice@1.0.3: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - typed-array-buffer: 1.0.2 - typed-array-byte-offset: 1.0.2 - - typescript@5.5.4: {} - - unbox-primitive@1.0.2: - dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - - underscore@1.13.7: {} - - undici-types@5.26.5: {} - - unified@9.2.2: - dependencies: - '@types/unist': 2.0.10 - bail: 1.0.5 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 2.1.0 - trough: 1.0.5 - vfile: 4.2.1 - - unist-util-is@4.1.0: {} - - unist-util-stringify-position@2.0.3: - dependencies: - '@types/unist': 2.0.10 - - unist-util-visit-parents@3.1.1: - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 4.1.0 - - update-browserslist-db@1.1.0(browserslist@4.23.2): - dependencies: - browserslist: 4.23.2 - escalade: 3.1.2 - picocolors: 1.0.1 - - update-section@0.3.3: {} - - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - - vfile-message@2.0.4: - dependencies: - '@types/unist': 2.0.10 - unist-util-stringify-position: 2.0.3 - - vfile@4.2.1: - dependencies: - '@types/unist': 2.0.10 - is-buffer: 2.0.5 - unist-util-stringify-position: 2.0.3 - vfile-message: 2.0.4 - - which-boxed-primitive@1.0.2: - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - - which-typed-array@1.1.15: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.2 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - wrappy@1.0.2: {} - - yallist@3.1.1: {} - - yallist@4.0.0: {} - - yocto-queue@0.1.0: {} - - zwitch@1.0.5: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml deleted file mode 100644 index 18ec407efca7..000000000000 --- a/pnpm-workspace.yaml +++ /dev/null @@ -1,2 +0,0 @@ -packages: - - 'packages/*' From 8b636e0976cfb4c704c777f72a815ba8d0023d87 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Fri, 9 Aug 2024 11:33:26 +1000 Subject: [PATCH 37/59] Run cannon-prestate if devnet cannon prestate files are missing (#11399) * Fix devnet-up when op-program/bin is missing prestate-proof.json * Fix cannon-prestate to always run * Add prestate.json --- Makefile | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 0fdfb07655ef..08842b6feae1 100644 --- a/Makefile +++ b/Makefile @@ -129,6 +129,12 @@ reproducible-prestate: ## Builds reproducible-prestate binary make -C ./op-program reproducible-prestate .PHONY: reproducible-prestate +# Include any files required for the devnet to build and run. This appears to be the only one that's actually needed. +DEVNET_CANNON_PRESTATE_FILES := op-program/bin/prestate-proof.json op-program/bin/prestate.json + +$(DEVNET_CANNON_PRESTATE_FILES): + make cannon-prestate + cannon-prestate: op-program cannon ## Generates prestate using cannon and op-program ./cannon/bin/cannon load-elf --path op-program/bin/op-program-client.elf --out op-program/bin/prestate.json --meta op-program/bin/meta.json ./cannon/bin/cannon run --proof-at '=0' --stop-at '=1' --input op-program/bin/prestate.json --meta op-program/bin/meta.json --proof-fmt 'op-program/bin/%d.json' --output "" @@ -152,16 +158,14 @@ nuke: clean devnet-clean ## Completely clean the project directory git clean -Xdf .PHONY: nuke -pre-devnet: submodules ## Prepares for running a local devnet +## Prepares for running a local devnet +pre-devnet: submodules $(DEVNET_CANNON_PRESTATE_FILES) @if ! [ -x "$(command -v geth)" ]; then \ make install-geth; \ fi @if ! [ -x "$(command -v eth2-testnet-genesis)" ]; then \ make install-eth2-testnet-genesis; \ fi - @if [ ! -e op-program/bin ]; then \ - make cannon-prestate; \ - fi .PHONY: pre-devnet devnet-up: pre-devnet ## Starts the local devnet From dae091f75731e90b6d4646adc4fa129645e56af1 Mon Sep 17 00:00:00 2001 From: protolambda Date: Thu, 8 Aug 2024 22:46:06 -0600 Subject: [PATCH 38/59] ci: update geth tool to v1.14.7 (#11410) * ci: update geth tool to v1.14.7 * ci: temporarily disable L1 geth version check, so L1 geth can be updated * ops-bedrock: explicit hash state.scheme on geth --- .circleci/config.yml | 6 +++--- ops-bedrock/l1-geth-entrypoint.sh | 2 ++ ops-bedrock/l2-op-geth-entrypoint.sh | 2 ++ versions.json | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index af9a7bae135b..ed1d41b189d0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -184,9 +184,9 @@ jobs: resource_class: xlarge steps: - checkout - - run: - name: "Check L1 geth version" - command: ./ops/scripts/geth-version-checker.sh || (echo "geth version is wrong, update ci-builder"; false) +# - run: # temporarily disabled, to update ci-builder. +# name: "Check L1 geth version" +# command: ./ops/scripts/geth-version-checker.sh || (echo "geth version is wrong, update ci-builder"; false) - install-contracts-dependencies - restore_cache: name: Restore Go modules cache diff --git a/ops-bedrock/l1-geth-entrypoint.sh b/ops-bedrock/l1-geth-entrypoint.sh index 2c515e63a989..b6cf5350dfbb 100644 --- a/ops-bedrock/l1-geth-entrypoint.sh +++ b/ops-bedrock/l1-geth-entrypoint.sh @@ -14,6 +14,7 @@ if [ ! -d "$GETH_CHAINDATA_DIR" ]; then echo "Initializing genesis." geth --verbosity="$VERBOSITY" init \ --datadir="$GETH_DATA_DIR" \ + --state.scheme=hash \ "$GENESIS_FILE_PATH" else echo "$GETH_CHAINDATA_DIR exists." @@ -45,6 +46,7 @@ exec geth \ --authrpc.vhosts="*" \ --authrpc.jwtsecret=/config/jwt-secret.txt \ --gcmode=archive \ + --state.scheme=hash \ --metrics \ --metrics.addr=0.0.0.0 \ --metrics.port=6060 \ diff --git a/ops-bedrock/l2-op-geth-entrypoint.sh b/ops-bedrock/l2-op-geth-entrypoint.sh index 4325a75f50d0..f760a87f1875 100644 --- a/ops-bedrock/l2-op-geth-entrypoint.sh +++ b/ops-bedrock/l2-op-geth-entrypoint.sh @@ -14,6 +14,7 @@ if [ ! -d "$GETH_CHAINDATA_DIR" ]; then echo "Initializing genesis." geth --verbosity="$VERBOSITY" init \ --datadir="$GETH_DATA_DIR" \ + --state.scheme=hash \ "$GENESIS_FILE_PATH" else echo "$GETH_CHAINDATA_DIR exists." @@ -46,6 +47,7 @@ exec geth \ --authrpc.vhosts="*" \ --authrpc.jwtsecret=/config/jwt-secret.txt \ --gcmode=archive \ + --state.scheme=hash \ --metrics \ --metrics.addr=0.0.0.0 \ --metrics.port=6060 \ diff --git a/versions.json b/versions.json index 0850a4d507bf..4ae8f8b5ffc0 100644 --- a/versions.json +++ b/versions.json @@ -1,7 +1,7 @@ { "abigen": "v1.10.25", "foundry": "626221f5ef44b4af950a08e09bd714650d9eb77d", - "geth": "v1.13.14", + "geth": "v1.14.7", "eth2_testnet_genesis": "v0.10.0", "nvm": "v20.9.0", "slither": "0.10.2", From e157ed730e331d9bb3e1c33fcca9279ec1105c7f Mon Sep 17 00:00:00 2001 From: Maurelian Date: Fri, 9 Aug 2024 12:58:23 -0400 Subject: [PATCH 39/59] Add RV reviews (#11422) * Add RV reviews * Fix naming of trust audit to match convention --- ...DepositTransaction-RuntimeVerification.pdf | Bin 0 -> 703817 bytes ...2023_12_SuperchainConfigUpgrade_Trust.pdf} | Bin docs/security-reviews/README.md | 40 ++++++++++-------- 3 files changed, 22 insertions(+), 18 deletions(-) create mode 100644 docs/security-reviews/2022_12-DepositTransaction-RuntimeVerification.pdf rename docs/security-reviews/{2023_12_Trust_SuperchainConfigUpgrade.pdf => 2023_12_SuperchainConfigUpgrade_Trust.pdf} (100%) diff --git a/docs/security-reviews/2022_12-DepositTransaction-RuntimeVerification.pdf b/docs/security-reviews/2022_12-DepositTransaction-RuntimeVerification.pdf new file mode 100644 index 0000000000000000000000000000000000000000..36d31dfb7f9c556c11c7cf64c53b53bb11a22bc6 GIT binary patch literal 703817 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 z

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

VHgZE#z-nOOyXXk^4j@G@vy`&{(PEs2{ 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%0ASCQYPHNI^h^CQ1Nt=FZYY1`b^2hN*`9TG?i`QY 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≻|S^Gwg%>mi(`k%lw0OoYH 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 YUNgED3R^rC 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�`KyT}&P1U3 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 z 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%0Da07~9w2^K+sE@~41fnC Date: Fri, 9 Aug 2024 07:00:38 -1000 Subject: [PATCH 40/59] Update to Geth 1.14.7 (#11382) * chore: update to support geth v1.14.7 * Update geth * Fix "private key curve is not secp256k1" error * Temporarily quiet noisy logs * signature test * Add comments about S256 curve override fix * Update geth * go.mod: update to op-geth v1.101407.0-rc.1 * op-e2e: fix L1/L2 miner settings * Also update devnet L1 base image * ci: bump ci-builder in circleci --------- Co-authored-by: Danyal Prout Co-authored-by: protolambda Co-authored-by: Sebastian Stammler --- .circleci/config.yml | 2 +- cannon/cmd/log.go | 2 +- cannon/mipsevm/tests/evm_test.go | 15 ++-- cannon/mipsevm/testutil/evm.go | 5 +- cannon/mipsevm/testutil/mips.go | 3 +- go.mod | 39 +++++----- go.sum | 76 +++++++++++-------- op-batcher/batcher/channel_builder_test.go | 4 +- .../batcher/channel_config_provider_test.go | 2 +- op-batcher/batcher/channel_manager_test.go | 10 +-- op-chain-ops/cmd/check-ecotone/main.go | 3 +- op-chain-ops/cmd/op-simulate/main.go | 3 +- op-chain-ops/cmd/protocol-version/main.go | 2 +- .../cmd/receipt-reference-builder/main.go | 2 +- .../cmd/receipt-reference-builder/pull.go | 8 +- op-chain-ops/srcmap/solutil.go | 17 ----- .../game/fault/contracts/faultdisputegame.go | 2 +- .../game/fault/trace/utils/preimage.go | 3 +- .../game/fault/trace/utils/preimage_test.go | 8 +- .../game/keccak/fetcher/fetcher_test.go | 2 +- op-e2e/actions/l1_miner.go | 7 +- op-e2e/actions/l1_replica.go | 4 +- op-e2e/actions/l2_engine.go | 7 +- op-e2e/actions/reorg_test.go | 6 +- op-e2e/actions/sync_test.go | 16 ++-- op-e2e/config/init.go | 3 +- op-e2e/devnet/devnet_test.go | 2 +- op-e2e/e2eutils/geth/geth.go | 32 +++++--- op-e2e/e2eutils/transactions/blobs.go | 6 +- op-e2e/external_geth/main.go | 2 + op-node/p2p/pings_test.go | 2 +- op-node/rollup/chain_spec_test.go | 2 +- op-node/rollup/derive/batch_test.go | 3 +- op-node/rollup/derive/batch_test_utils.go | 2 +- op-node/rollup/derive/channel_out_test.go | 7 +- op-node/rollup/derive/fuzz_parsers_test.go | 3 +- op-node/rollup/derive/span_batch_tx.go | 2 +- op-node/rollup/derive/span_batch_tx_test.go | 6 +- op-node/rollup/derive/span_batch_txs.go | 2 +- op-node/rollup/derive/test/random.go | 5 +- op-node/rollup/event/tracer_log.go | 3 +- op-program/client/l2/db.go | 2 +- op-program/client/l2/db_test.go | 5 +- op-program/client/l2/engine_test.go | 5 +- .../client/l2/engineapi/block_processor.go | 6 +- op-program/client/l2/oracle.go | 2 +- op-program/client/mpt/db.go | 2 +- op-service/client/http_test.go | 3 +- op-service/crypto/signature.go | 3 + op-service/crypto/signature_test.go | 56 ++++++++++++++ op-service/dial/rollup_sync_test.go | 2 +- op-service/eth/blob.go | 4 +- op-service/log/cli.go | 2 +- op-service/log/dynamic.go | 3 +- op-service/log/dynamic_test.go | 2 +- op-service/log/writer.go | 3 +- op-service/log/writer_test.go | 2 +- op-service/sources/batching/bound.go | 10 +-- op-service/sources/l1_beacon_client_test.go | 4 +- op-service/sources/rollupclient.go | 2 +- op-service/testlog/capturing.go | 3 +- op-service/testlog/testlog.go | 3 +- op-service/testutils/random.go | 5 +- op-service/txmgr/txmgr.go | 4 +- op-service/txmgr/txmgr_test.go | 2 +- op-wheel/cheat/cheat.go | 3 +- op-wheel/cmd/main.go | 4 +- op-wheel/engine/engine.go | 2 +- ops-bedrock/l1-geth.Dockerfile | 2 +- 69 files changed, 286 insertions(+), 190 deletions(-) create mode 100644 op-service/crypto/signature_test.go diff --git a/.circleci/config.yml b/.circleci/config.yml index ed1d41b189d0..acc32ae6dc20 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,7 @@ version: 2.1 parameters: ci_builder_image: type: string - default: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:v0.50.0 + default: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:v0.51.0 ci_builder_rust_image: type: string default: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder-rust:latest diff --git a/cannon/cmd/log.go b/cannon/cmd/log.go index 30e92e3e4007..9270b2261709 100644 --- a/cannon/cmd/log.go +++ b/cannon/cmd/log.go @@ -2,9 +2,9 @@ package cmd import ( "io" + "log/slog" "os" - "golang.org/x/exp/slog" "golang.org/x/term" "github.com/ethereum/go-ethereum/log" diff --git a/cannon/mipsevm/tests/evm_test.go b/cannon/mipsevm/tests/evm_test.go index f7ca26589c80..41826be04d72 100644 --- a/cannon/mipsevm/tests/evm_test.go +++ b/cannon/mipsevm/tests/evm_test.go @@ -10,6 +10,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/tracing" "github.com/ethereum/go-ethereum/core/vm" "github.com/stretchr/testify/require" @@ -40,7 +41,7 @@ func TestEVM(t *testing.T) { require.NoError(t, err) contracts, addrs := testContractsSetup(t) - var tracer vm.EVMLogger // no-tracer by default, but test_util.MarkdownTracer + var tracer *tracing.Hooks // no-tracer by default, but test_util.MarkdownTracer for _, f := range testFiles { t.Run(f.Name(), func(t *testing.T) { @@ -102,7 +103,7 @@ func TestEVM(t *testing.T) { func TestEVM_CloneFlags(t *testing.T) { //contracts, addrs := testContractsSetup(t) - //var tracer vm.EVMLogger + //var tracer *tracing.Hooks cases := []struct { name string @@ -156,7 +157,7 @@ func TestEVM_CloneFlags(t *testing.T) { func TestEVMSingleStep(t *testing.T) { contracts, addrs := testContractsSetup(t) - var tracer vm.EVMLogger + var tracer *tracing.Hooks cases := []struct { name string @@ -194,7 +195,7 @@ func TestEVMSingleStep(t *testing.T) { func TestEVMSysWriteHint(t *testing.T) { contracts, addrs := testContractsSetup(t) - var tracer vm.EVMLogger + var tracer *tracing.Hooks cases := []struct { name string @@ -375,7 +376,7 @@ func TestEVMSysWriteHint(t *testing.T) { func TestEVMFault(t *testing.T) { contracts, addrs := testContractsSetup(t) - var tracer vm.EVMLogger // no-tracer by default, but see test_util.MarkdownTracer + var tracer *tracing.Hooks // no-tracer by default, but see test_util.MarkdownTracer sender := common.Address{0x13, 0x37} env, evmState := testutil.NewEVMEnv(contracts, addrs) @@ -422,7 +423,7 @@ func TestEVMFault(t *testing.T) { func TestHelloEVM(t *testing.T) { contracts, addrs := testContractsSetup(t) - var tracer vm.EVMLogger // no-tracer by default, but see test_util.MarkdownTracer + var tracer *tracing.Hooks // no-tracer by default, but see test_util.MarkdownTracer evm := testutil.NewMIPSEVM(contracts, addrs) evm.SetTracer(tracer) testutil.LogStepFailureAtCleanup(t, evm) @@ -464,7 +465,7 @@ func TestHelloEVM(t *testing.T) { func TestClaimEVM(t *testing.T) { contracts, addrs := testContractsSetup(t) - var tracer vm.EVMLogger // no-tracer by default, but see test_util.MarkdownTracer + var tracer *tracing.Hooks // no-tracer by default, but see test_util.MarkdownTracer evm := testutil.NewMIPSEVM(contracts, addrs) evm.SetTracer(tracer) testutil.LogStepFailureAtCleanup(t, evm) diff --git a/cannon/mipsevm/testutil/evm.go b/cannon/mipsevm/testutil/evm.go index 29edd6a63fe5..7cd48403b986 100644 --- a/cannon/mipsevm/testutil/evm.go +++ b/cannon/mipsevm/testutil/evm.go @@ -6,6 +6,7 @@ import ( "math/big" "os" + "github.com/ethereum/go-ethereum/core/tracing" "github.com/ethereum/go-ethereum/eth/tracers/logger" "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" @@ -122,6 +123,6 @@ func (d *testChain) GetHeader(h common.Hash, n uint64) *types.Header { } } -func MarkdownTracer() vm.EVMLogger { - return logger.NewMarkdownLogger(&logger.Config{}, os.Stdout) +func MarkdownTracer() *tracing.Hooks { + return logger.NewMarkdownLogger(&logger.Config{}, os.Stdout).Hooks() } diff --git a/cannon/mipsevm/testutil/mips.go b/cannon/mipsevm/testutil/mips.go index d79b5040c316..2b45ab2d39ce 100644 --- a/cannon/mipsevm/testutil/mips.go +++ b/cannon/mipsevm/testutil/mips.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/tracing" "github.com/ethereum/go-ethereum/core/vm" "github.com/stretchr/testify/require" @@ -33,7 +34,7 @@ func NewMIPSEVM(artifacts *Artifacts, addrs *Addresses) *MIPSEVM { return &MIPSEVM{env, evmState, addrs, nil, artifacts, math.MaxUint64, nil} } -func (m *MIPSEVM) SetTracer(tracer vm.EVMLogger) { +func (m *MIPSEVM) SetTracer(tracer *tracing.Hooks) { m.env.Config.Tracer = tracer } diff --git a/go.mod b/go.mod index 8e6d7ed4f198..7914ba567f40 100644 --- a/go.mod +++ b/go.mod @@ -8,11 +8,11 @@ require ( github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 github.com/cockroachdb/pebble v0.0.0-20231018212520-f6cde3fc2fa4 github.com/consensys/gnark-crypto v0.12.1 - github.com/crate-crypto/go-kzg-4844 v0.7.0 + github.com/crate-crypto/go-kzg-4844 v1.0.0 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3 github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240803025447-c92ef420eec2 - github.com/ethereum/go-ethereum v1.13.15 + github.com/ethereum/go-ethereum v1.14.7 github.com/fsnotify/fsnotify v1.7.0 github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb github.com/google/go-cmp v0.6.0 @@ -51,9 +51,9 @@ require ( require ( github.com/BurntSushi/toml v1.4.0 // indirect - github.com/DataDog/zstd v1.5.5 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/VictoriaMetrics/fastcache v1.12.1 // indirect + github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/VictoriaMetrics/fastcache v1.12.2 // indirect github.com/allegro/bigcache v1.2.1 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/benbjohnson/clock v1.3.5 // indirect @@ -63,8 +63,8 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/btcsuite/btcd/btcutil v1.1.5 // indirect github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cockroachdb/errors v1.11.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cockroachdb/errors v1.11.3 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect @@ -72,28 +72,29 @@ require ( github.com/containerd/cgroups v1.1.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect - github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect - github.com/deckarep/golang-set/v2 v2.3.0 // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/crypto/blake256 v1.0.1 // indirect github.com/deepmap/oapi-codegen v1.8.2 // indirect github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de // indirect github.com/dlclark/regexp2 v1.7.0 // indirect github.com/docker/go-units v0.5.0 // indirect + github.com/donovanhide/eventsource v0.0.0-20210830082556-c59027999da0 // indirect github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/elastic/gosigar v0.14.2 // indirect - github.com/ethereum/c-kzg-4844 v0.4.0 // indirect - github.com/fatih/color v1.15.0 // indirect + github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect + github.com/fatih/color v1.16.0 // indirect github.com/felixge/fgprof v0.9.3 // indirect github.com/ferranbt/fastssz v0.1.2 // indirect github.com/fjl/memsize v0.0.2 // indirect github.com/flynn/noise v1.1.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect - github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect - github.com/getsentry/sentry-go v0.20.0 // indirect + github.com/getsentry/sentry-go v0.27.0 // indirect github.com/go-ini/ini v1.67.0 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect @@ -103,7 +104,7 @@ require ( github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/google/gopacket v1.1.19 // indirect github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 // indirect github.com/google/uuid v1.6.0 // indirect @@ -129,7 +130,8 @@ require ( github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect github.com/jbenet/goprocess v0.1.4 // indirect github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267 // indirect - github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c // indirect + github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52 // indirect + github.com/kilic/bls12-381 v0.1.0 // indirect github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/koron/go-ssdp v0.0.4 // indirect github.com/kr/pretty v0.3.1 // indirect @@ -189,6 +191,9 @@ require ( github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.48.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect + github.com/protolambda/bls12-381-util v0.1.0 // indirect + github.com/protolambda/zrnt v0.32.2 // indirect + github.com/protolambda/ztyp v0.2.2 // indirect github.com/quic-go/qpack v0.4.0 // indirect github.com/quic-go/quic-go v0.44.0 // indirect github.com/quic-go/webtransport-go v0.8.0 // indirect @@ -221,14 +226,14 @@ require ( golang.org/x/text v0.16.0 // indirect golang.org/x/tools v0.23.0 // indirect google.golang.org/protobuf v1.34.1 // indirect - gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/blake3 v1.2.1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) -replace github.com/ethereum/go-ethereum => github.com/ethereum-optimism/op-geth v1.101315.3-rc.2 +replace github.com/ethereum/go-ethereum v1.14.7 => github.com/ethereum-optimism/op-geth v1.101407.0-rc.1 //replace github.com/ethereum/go-ethereum v1.13.9 => ../op-geth diff --git a/go.sum b/go.sum index 80ac4747d06b..c46caed5aed5 100644 --- a/go.sum +++ b/go.sum @@ -14,13 +14,13 @@ github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0 github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= -github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e h1:ZIWapoIRN1VqT8GR8jAwb1Ie9GyehWjVcGh32Y2MznE= +github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= -github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -82,8 +82,9 @@ github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= @@ -96,8 +97,8 @@ github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= -github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/pebble v0.0.0-20231018212520-f6cde3fc2fa4 h1:PuHFhOUMnD62r80dN+Ik5qco2drekgsUSVdcHsvllec= @@ -121,10 +122,10 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= -github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= -github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -134,8 +135,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= -github.com/deckarep/golang-set/v2 v2.3.0 h1:qs18EKUfHm2X9fA50Mr/M5hccg2tNnVqsiBImnyDs0g= -github.com/deckarep/golang-set/v2 v2.3.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= @@ -158,6 +159,8 @@ github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnm github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/donovanhide/eventsource v0.0.0-20210830082556-c59027999da0 h1:C7t6eeMaEQVy6e8CarIhscYQlNmw5e3G36y7l7Y21Ao= +github.com/donovanhide/eventsource v0.0.0-20210830082556-c59027999da0/go.mod h1:56wL82FO0bfMU5RvfXoIwSOP2ggqqxT+tAfNEIyxuHw= github.com/dop251/goja v0.0.0-20211022113120-dc8c55024d06/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 h1:qwcF+vdFrvPSEUDSX5RVoRccG8a5DhOdWdQ4zN62zzo= github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= @@ -171,15 +174,17 @@ github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/ github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3 h1:RWHKLhCrQThMfch+QJ1Z8veEq5ZO3DfIhZ7xgRP9WTc= github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3/go.mod h1:QziizLAiF0KqyLdNJYD7O5cpDlaFMNZzlxYNcWsJUxs= -github.com/ethereum-optimism/op-geth v1.101315.3-rc.2 h1:4Ne3RUZ09uqY5QnbVuDVD2Xt8JbxegCv3mkICt3aT6c= -github.com/ethereum-optimism/op-geth v1.101315.3-rc.2/go.mod h1:nZ3TvP4mhOsfKkrgaT3GrDO4oCn5awPXFHKpVHuO63s= +github.com/ethereum-optimism/op-geth v1.101407.0-rc.1 h1:bE6V8GG46s7IX2s7prH26sKcVwW0/FbId3CEe5GYulQ= +github.com/ethereum-optimism/op-geth v1.101407.0-rc.1/go.mod h1:Zn0xPY3I/xX3Bm51kjXz9VSd+2ai7bEslVEAFTdVcpM= github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240803025447-c92ef420eec2 h1:ySJykDUyb8RbcfLL3pz0Cs5Ji6NMVT7kmAY634DOCoE= github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240803025447-c92ef420eec2/go.mod h1:zy9f3TNPS7pwW4msMitF83fp0Wf452tZ6+Fg6d4JyXM= -github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= -github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g= github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= @@ -198,12 +203,10 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getsentry/sentry-go v0.20.0 h1:bwXW98iMRIWxn+4FgPW7vMrjmbym6HblXALmhjHmQaQ= -github.com/getsentry/sentry-go v0.20.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= +github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= @@ -258,8 +261,8 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= @@ -340,6 +343,7 @@ github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6w github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= +github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/holiman/uint256 v1.3.1 h1:JfTzmih28bittyHM8z360dCjIA9dbPIBlcTI6lmctQs= github.com/holiman/uint256 v1.3.1/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -386,8 +390,10 @@ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c h1:AqsttAyEyIEsNz5WLRwuRwjiT5CMDUfLk6cFJDVPebs= -github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52 h1:msKODTL1m0wigztaqILOtla9HeW1ciscYG4xjLtvk5I= +github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52/go.mod h1:qk1sX/IBgppQNcGCRoj90u6EGC056EBoIc1oEjCWla8= +github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= +github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= @@ -654,8 +660,14 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/protolambda/bls12-381-util v0.1.0 h1:05DU2wJN7DTU7z28+Q+zejXkIsA/MF8JZQGhtBZZiWk= +github.com/protolambda/bls12-381-util v0.1.0/go.mod h1:cdkysJTRpeFeuUVx/TXGDQNMTiRAalk1vQw3TYTHcE4= github.com/protolambda/ctxlock v0.1.0 h1:rCUY3+vRdcdZXqT07iXgyr744J2DU2LCBIXowYAjBCE= github.com/protolambda/ctxlock v0.1.0/go.mod h1:vefhX6rIZH8rsg5ZpOJfEDYQOppZi19SfPiGOFrNnwM= +github.com/protolambda/zrnt v0.32.2 h1:KZ48T+3UhsPXNdtE/5QEvGc9DGjUaRI17nJaoznoIaM= +github.com/protolambda/zrnt v0.32.2/go.mod h1:A0fezkp9Tt3GBLATSPIbuY4ywYESyAuc/FFmPKg8Lqs= +github.com/protolambda/ztyp v0.2.2 h1:rVcL3vBu9W/aV646zF6caLS/dyn9BN8NYiuJzicLNyY= +github.com/protolambda/ztyp v0.2.2/go.mod h1:9bYgKGqg3wJqT9ac1gI2hnVb0STQq7p/1lapqrqY1dU= github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48 h1:cSo6/vk8YpvkLbk9v3FO97cakNmUoxwi2KMP8hd5WIw= github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= @@ -911,6 +923,7 @@ golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -937,6 +950,7 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= @@ -1037,8 +1051,8 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/op-batcher/batcher/channel_builder_test.go b/op-batcher/batcher/channel_builder_test.go index 188a46ecc82a..2d5187d3b25d 100644 --- a/op-batcher/batcher/channel_builder_test.go +++ b/op-batcher/batcher/channel_builder_test.go @@ -62,7 +62,7 @@ func newMiniL2BlockWithNumberParentAndL1Information(numTx int, l2Number *big.Int Difficulty: common.Big0, Number: big.NewInt(l1Number), Time: blockTime, - }, nil, nil, nil, trie.NewStackTrie(nil)) + }, nil, nil, trie.NewStackTrie(nil)) l1InfoTx, err := derive.L1InfoDeposit(&defaultTestRollupConfig, eth.SystemConfig{}, 0, eth.BlockToInfo(l1Block), blockTime) if err != nil { panic(err) @@ -77,7 +77,7 @@ func newMiniL2BlockWithNumberParentAndL1Information(numTx int, l2Number *big.Int return types.NewBlock(&types.Header{ Number: l2Number, ParentHash: parent, - }, txs, nil, nil, trie.NewStackTrie(nil)) + }, &types.Body{Transactions: txs}, nil, trie.NewStackTrie(nil)) } // addTooManyBlocks adds blocks to the channel until it hits an error, diff --git a/op-batcher/batcher/channel_config_provider_test.go b/op-batcher/batcher/channel_config_provider_test.go index 9e512fbb8867..169d122e210a 100644 --- a/op-batcher/batcher/channel_config_provider_test.go +++ b/op-batcher/batcher/channel_config_provider_test.go @@ -3,6 +3,7 @@ package batcher import ( "context" "errors" + "log/slog" "math/big" "testing" "time" @@ -10,7 +11,6 @@ import ( "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/testlog" "github.com/stretchr/testify/require" - "golang.org/x/exp/slog" ) type mockGasPricer struct { diff --git a/op-batcher/batcher/channel_manager_test.go b/op-batcher/batcher/channel_manager_test.go index d6c3d2e9336e..474942ce5e87 100644 --- a/op-batcher/batcher/channel_manager_test.go +++ b/op-batcher/batcher/channel_manager_test.go @@ -67,19 +67,19 @@ func ChannelManagerReturnsErrReorg(t *testing.T, batchType uint) { a := types.NewBlock(&types.Header{ Number: big.NewInt(0), - }, nil, nil, nil, nil) + }, nil, nil, nil) b := types.NewBlock(&types.Header{ Number: big.NewInt(1), ParentHash: a.Hash(), - }, nil, nil, nil, nil) + }, nil, nil, nil) c := types.NewBlock(&types.Header{ Number: big.NewInt(2), ParentHash: b.Hash(), - }, nil, nil, nil, nil) + }, nil, nil, nil) x := types.NewBlock(&types.Header{ Number: big.NewInt(2), ParentHash: common.Hash{0xff}, - }, nil, nil, nil, nil) + }, nil, nil, nil) require.NoError(t, m.AddL2Block(a)) require.NoError(t, m.AddL2Block(b)) @@ -169,7 +169,7 @@ func ChannelManager_Clear(t *testing.T, batchType uint) { b := types.NewBlock(&types.Header{ Number: big.NewInt(1), ParentHash: a.Hash(), - }, nil, nil, nil, nil) + }, nil, nil, nil) require.NoError(m.AddL2Block(b)) require.Len(m.blocks, 1) require.Equal(b.Hash(), m.tip) diff --git a/op-chain-ops/cmd/check-ecotone/main.go b/op-chain-ops/cmd/check-ecotone/main.go index dcdc4c3a29fb..2f46f03d29d0 100644 --- a/op-chain-ops/cmd/check-ecotone/main.go +++ b/op-chain-ops/cmd/check-ecotone/main.go @@ -271,7 +271,8 @@ func check4844Precompile(ctx context.Context, env *actionEnv) error { return fmt.Errorf("failed to compute commitment: %w", err) } point := kzg4844.Point{} - proof, claim, err := kzg4844.ComputeProof(kzg4844.Blob(x), point) + blob := kzg4844.Blob(x) + proof, claim, err := kzg4844.ComputeProof(&blob, point) if err != nil { return fmt.Errorf("failed to compute proof: %w", err) } diff --git a/op-chain-ops/cmd/op-simulate/main.go b/op-chain-ops/cmd/op-simulate/main.go index cec69c2454f7..83aab8714218 100644 --- a/op-chain-ops/cmd/op-simulate/main.go +++ b/op-chain-ops/cmd/op-simulate/main.go @@ -11,6 +11,7 @@ import ( "path" "time" + "github.com/ethereum/go-ethereum/core/tracing" "github.com/holiman/uint256" "github.com/pkg/profile" "github.com/urfave/cli/v2" @@ -258,7 +259,7 @@ func simulate(ctx context.Context, logger log.Logger, conf *params.ChainConfig, } for addr, acc := range dump { state.CreateAccount(addr) - state.SetBalance(addr, uint256.MustFromBig((*big.Int)(&acc.Balance))) + state.SetBalance(addr, uint256.MustFromBig((*big.Int)(&acc.Balance)), tracing.BalanceChangeUnspecified) state.SetNonce(addr, acc.Nonce) state.SetCode(addr, acc.Code) state.SetStorage(addr, acc.Storage) diff --git a/op-chain-ops/cmd/protocol-version/main.go b/op-chain-ops/cmd/protocol-version/main.go index a5bd6b434921..cf4fef1efd06 100644 --- a/op-chain-ops/cmd/protocol-version/main.go +++ b/op-chain-ops/cmd/protocol-version/main.go @@ -3,11 +3,11 @@ package main import ( "encoding/hex" "fmt" + "log/slog" "os" "github.com/mattn/go-isatty" "github.com/urfave/cli/v2" - "golang.org/x/exp/slog" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" diff --git a/op-chain-ops/cmd/receipt-reference-builder/main.go b/op-chain-ops/cmd/receipt-reference-builder/main.go index 0418e92193e7..90cd9bd4568b 100644 --- a/op-chain-ops/cmd/receipt-reference-builder/main.go +++ b/op-chain-ops/cmd/receipt-reference-builder/main.go @@ -1,12 +1,12 @@ package main import ( + "log/slog" "os" "time" "github.com/mattn/go-isatty" "github.com/urfave/cli/v2" - "golang.org/x/exp/slog" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" diff --git a/op-chain-ops/cmd/receipt-reference-builder/pull.go b/op-chain-ops/cmd/receipt-reference-builder/pull.go index d6fa95eef33c..3c692955026c 100644 --- a/op-chain-ops/cmd/receipt-reference-builder/pull.go +++ b/op-chain-ops/cmd/receipt-reference-builder/pull.go @@ -298,7 +298,7 @@ func processBlockRange( // process each transaction in the block for j := 0; j < len(b.Transactions); j++ { tx := b.Transactions[j] - ok, err := checkTransaction(ctx, c, *tx, log) + ok, err := checkTransaction(ctx, c, tx, log) if err != nil { log.Error("Failed to Check Tx", "Err", err) return []result{}, err @@ -346,8 +346,8 @@ func batchBlockByNumber(ctx context.Context, c *ethclient.Client, blockNumbers [ } // checkTransaction will check if a transaction is a user deposit, and not initiated by the system address -func checkTransaction(ctx context.Context, c *ethclient.Client, tx types.Transaction, log log.Logger) (bool, error) { - from, err := types.Sender(types.LatestSignerForChainID(tx.ChainId()), &tx) +func checkTransaction(ctx context.Context, c *ethclient.Client, tx *types.Transaction, log log.Logger) (bool, error) { + from, err := types.Sender(types.LatestSignerForChainID(tx.ChainId()), tx) if err != nil { log.Error("Failed to Get Sender", "Err", err) return false, err @@ -355,7 +355,7 @@ func checkTransaction(ctx context.Context, c *ethclient.Client, tx types.Transac // we are filtering for deposit transactions which are not system transactions if tx.Type() == depositType && from != systemAddress { - log.Info("Got Transaction", "From", from, "Nonce", *tx.EffectiveNonce(), "Type", tx.Type()) + log.Info("Got Transaction", "From", from, "Nonce", tx.EffectiveNonce(), "Type", tx.Type()) return true, nil } return false, nil diff --git a/op-chain-ops/srcmap/solutil.go b/op-chain-ops/srcmap/solutil.go index 01b1add4bc29..9944db558710 100644 --- a/op-chain-ops/srcmap/solutil.go +++ b/op-chain-ops/srcmap/solutil.go @@ -3,7 +3,6 @@ package srcmap import ( "fmt" "io" - "math/big" "os" "strconv" "strings" @@ -192,20 +191,6 @@ type SourceMapTracer struct { out io.Writer } -func (s *SourceMapTracer) CaptureTxStart(gasLimit uint64) {} - -func (s *SourceMapTracer) CaptureTxEnd(restGas uint64) {} - -func (s *SourceMapTracer) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { -} - -func (s *SourceMapTracer) CaptureEnd(output []byte, gasUsed uint64, err error) {} - -func (s *SourceMapTracer) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { -} - -func (s *SourceMapTracer) CaptureExit(output []byte, gasUsed uint64, err error) {} - func (s *SourceMapTracer) info(codeAddr *common.Address, pc uint64) string { info := "non-contract" if codeAddr != nil { @@ -243,5 +228,3 @@ func (s *SourceMapTracer) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64 fmt.Fprintf(s.out, "%3d: %x\n", -i, stack[len(stack)-1-i].Bytes32()) } } - -var _ vm.EVMLogger = (*SourceMapTracer)(nil) diff --git a/op-challenger/game/fault/contracts/faultdisputegame.go b/op-challenger/game/fault/contracts/faultdisputegame.go index d2c13060ffe0..1c71d20bebcb 100644 --- a/op-challenger/game/fault/contracts/faultdisputegame.go +++ b/op-challenger/game/fault/contracts/faultdisputegame.go @@ -307,7 +307,7 @@ func (f *FaultDisputeGameContractLatest) ClaimCreditTx(ctx context.Context, reci call := f.contract.Call(methodClaimCredit, recipient) _, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, call) if err != nil { - return txmgr.TxCandidate{}, fmt.Errorf("%w: %v", ErrSimulationFailed, err.Error()) + return txmgr.TxCandidate{}, fmt.Errorf("%w: %w", ErrSimulationFailed, err) } return call.ToTxCandidate() } diff --git a/op-challenger/game/fault/trace/utils/preimage.go b/op-challenger/game/fault/trace/utils/preimage.go index b13333a566f6..09a48ee912f6 100644 --- a/op-challenger/game/fault/trace/utils/preimage.go +++ b/op-challenger/game/fault/trace/utils/preimage.go @@ -89,7 +89,8 @@ func (l *PreimageLoader) loadBlobPreimage(proof *ProofData) (*types.PreimageOrac // Compute the KZG proof for the required field element var point kzg4844.Point new(big.Int).SetUint64(requiredFieldElement).FillBytes(point[:]) - kzgProof, claim, err := kzg4844.ComputeProof(kzg4844.Blob(blob), point) + data := kzg4844.Blob(blob) + kzgProof, claim, err := kzg4844.ComputeProof(&data, point) if err != nil { return nil, fmt.Errorf("failed to compute kzg proof: %w", err) } diff --git a/op-challenger/game/fault/trace/utils/preimage_test.go b/op-challenger/game/fault/trace/utils/preimage_test.go index e2c9e87ede75..46778f080c37 100644 --- a/op-challenger/game/fault/trace/utils/preimage_test.go +++ b/op-challenger/game/fault/trace/utils/preimage_test.go @@ -63,15 +63,15 @@ func TestPreimageLoader_SimpleTypes(t *testing.T) { } func TestPreimageLoader_BlobPreimage(t *testing.T) { - blob := testBlob() - commitment, err := kzg4844.BlobToCommitment(kzg4844.Blob(blob)) + blob := kzg4844.Blob(testBlob()) + commitment, err := kzg4844.BlobToCommitment(&blob) require.NoError(t, err) fieldIndex := uint64(24) elementData := blob[fieldIndex<<5 : (fieldIndex+1)<<5] var point kzg4844.Point new(big.Int).SetUint64(fieldIndex).FillBytes(point[:]) - kzgProof, claim, err := kzg4844.ComputeProof(kzg4844.Blob(blob), point) + kzgProof, claim, err := kzg4844.ComputeProof(&blob, point) require.NoError(t, err) elementDataWithLengthPrefix := make([]byte, len(elementData)+lengthPrefixSize) binary.BigEndian.PutUint64(elementDataWithLengthPrefix[:lengthPrefixSize], uint64(len(elementData))) @@ -129,7 +129,7 @@ func TestPreimageLoader_BlobPreimage(t *testing.T) { t.Run("Valid", func(t *testing.T) { kv := kvstore.NewMemKV() loader := NewPreimageLoader(kv.Get) - storeBlob(t, kv, gokzg4844.KZGCommitment(commitment), blob) + storeBlob(t, kv, gokzg4844.KZGCommitment(commitment), gokzg4844.Blob(blob)) actual, err := loader.LoadPreimage(proof) require.NoError(t, err) diff --git a/op-challenger/game/keccak/fetcher/fetcher_test.go b/op-challenger/game/keccak/fetcher/fetcher_test.go index cedff735e9f9..2a976b3e6df0 100644 --- a/op-challenger/game/keccak/fetcher/fetcher_test.go +++ b/op-challenger/game/keccak/fetcher/fetcher_test.go @@ -437,7 +437,7 @@ func (s *stubL1Source) BlockByNumber(_ context.Context, number *big.Int) (*types if !ok { return nil, errors.New("not found") } - return (&types.Block{}).WithBody(txs, nil), nil + return (&types.Block{}).WithBody(types.Body{Transactions: txs}), nil } func (s *stubL1Source) TransactionReceipt(_ context.Context, txHash common.Hash) (*types.Receipt, error) { diff --git a/op-e2e/actions/l1_miner.go b/op-e2e/actions/l1_miner.go index c378cd9f5cfd..97ca5c091ccc 100644 --- a/op-e2e/actions/l1_miner.go +++ b/op-e2e/actions/l1_miner.go @@ -207,10 +207,13 @@ func (s *L1Miner) ActL1EndBlock(t Testing) { s.l1Building = false s.l1BuildingHeader.GasUsed = s.l1BuildingHeader.GasLimit - uint64(*s.l1GasPool) s.l1BuildingHeader.Root = s.l1BuildingState.IntermediateRoot(s.l1Cfg.Config.IsEIP158(s.l1BuildingHeader.Number)) - block := types.NewBlock(s.l1BuildingHeader, s.l1Transactions, nil, s.l1Receipts, trie.NewStackTrie(nil)) + + var withdrawals []*types.Withdrawal if s.l1Cfg.Config.IsShanghai(s.l1BuildingHeader.Number, s.l1BuildingHeader.Time) { - block = block.WithWithdrawals(make([]*types.Withdrawal, 0)) + withdrawals = make([]*types.Withdrawal, 0) } + + block := types.NewBlock(s.l1BuildingHeader, &types.Body{Transactions: s.l1Transactions, Withdrawals: withdrawals}, s.l1Receipts, trie.NewStackTrie(nil)) if s.l1Cfg.Config.IsCancun(s.l1BuildingHeader.Number, s.l1BuildingHeader.Time) { parent := s.l1Chain.GetHeaderByHash(s.l1BuildingHeader.ParentHash) var ( diff --git a/op-e2e/actions/l1_replica.go b/op-e2e/actions/l1_replica.go index 430dffa3920d..fb042757065e 100644 --- a/op-e2e/actions/l1_replica.go +++ b/op-e2e/actions/l1_replica.go @@ -6,6 +6,7 @@ import ( "github.com/stretchr/testify/require" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/txpool/blobpool" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth" @@ -54,6 +55,8 @@ func NewL1Replica(t Testing, log log.Logger, genesis *core.Genesis) *L1Replica { NetworkId: genesis.Config.ChainID.Uint64(), Genesis: genesis, RollupDisableTxPoolGossip: true, + StateScheme: rawdb.HashScheme, + NoPruning: true, BlobPool: blobpool.Config{ Datadir: t.TempDir(), Datacap: blobpool.DefaultConfig.Datacap, @@ -80,7 +83,6 @@ func NewL1Replica(t Testing, log log.Logger, genesis *core.Genesis) *L1Replica { backend, err := eth.New(n, ethCfg) require.NoError(t, err) - backend.Merger().FinalizePoS() n.RegisterAPIs(tracers.APIs(backend.APIBackend)) diff --git a/op-e2e/actions/l2_engine.go b/op-e2e/actions/l2_engine.go index 88d40ec2a3b9..54267ee9da58 100644 --- a/op-e2e/actions/l2_engine.go +++ b/op-e2e/actions/l2_engine.go @@ -5,6 +5,7 @@ import ( "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" "github.com/ethereum-optimism/optimism/op-program/client/l2/engineapi" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/stretchr/testify/require" "github.com/ethereum/go-ethereum/common" @@ -83,8 +84,10 @@ func NewL2Engine(t Testing, log log.Logger, genesis *core.Genesis, rollupGenesis func newBackend(t e2eutils.TestingBase, genesis *core.Genesis, jwtPath string, options []EngineOption) (*node.Node, *geth.Ethereum, *engineApiBackend) { ethCfg := ðconfig.Config{ - NetworkId: genesis.Config.ChainID.Uint64(), - Genesis: genesis, + NetworkId: genesis.Config.ChainID.Uint64(), + Genesis: genesis, + StateScheme: rawdb.HashScheme, + NoPruning: true, } nodeCfg := &node.Config{ Name: "l2-geth", diff --git a/op-e2e/actions/reorg_test.go b/op-e2e/actions/reorg_test.go index 66273bd62457..2370c9774f13 100644 --- a/op-e2e/actions/reorg_test.go +++ b/op-e2e/actions/reorg_test.go @@ -397,7 +397,7 @@ func DeepReorg(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { // Create a var to store the ref for the second to last block of the second sequencing window var blockA39 eth.L1BlockRef - var aliceL2TxBlock types.Block + var aliceL2TxBlock *types.Block // Mine enough empty blocks on L1 to reach two sequence windows. for i := uint64(0); i < sd.RollupCfg.SeqWindowSize*3; i++ { // At block #50, send a batch to L1 containing all L2 blocks built up to this point. @@ -448,7 +448,7 @@ func DeepReorg(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { b0, err := l2Client.BlockByNumber(t.Ctx(), big.NewInt(int64(sequencer.L2Unsafe().Number))) require.NoError(t, err, "failed to fetch unsafe head of L2 after submitting alice's transaction") - aliceL2TxBlock = *b0 + aliceL2TxBlock = b0 } // Ask sequencer to handle new L1 head and build L2 blocks up to the L1 head @@ -572,6 +572,8 @@ func DeepReorg(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { require.Equal(t, verifier.L2Safe(), verifier.L2Unsafe(), "L2 safe and unsafe head should be equal") checkVerifEngine() + require.NotNil(gt, aliceL2TxBlock) + // Ensure that the parent of the L2 block containing Alice's transaction still exists b0, err := l2Client.BlockByHash(t.Ctx(), aliceL2TxBlock.ParentHash()) require.NoError(t, err, "Parent of the L2 block containing Alice's transaction should still exist on L2") diff --git a/op-e2e/actions/sync_test.go b/op-e2e/actions/sync_test.go index e8c6b9a7824f..7ff35eab47dc 100644 --- a/op-e2e/actions/sync_test.go +++ b/op-e2e/actions/sync_test.go @@ -243,12 +243,12 @@ func TestBackupUnsafe(gt *testing.T) { To: &dp.Addresses.Bob, Value: e2eutils.Ether(2), }) - block = block.WithBody([]*types.Transaction{block.Transactions()[0], validTx}, []*types.Header{}) + block = block.WithBody(types.Body{Transactions: []*types.Transaction{block.Transactions()[0], validTx}}) } if i == 3 { // Make block B3 as an invalid block invalidTx := testutils.RandomTx(rng, big.NewInt(100), signer) - block = block.WithBody([]*types.Transaction{block.Transactions()[0], invalidTx}, []*types.Header{}) + block = block.WithBody(types.Body{Transactions: []*types.Transaction{block.Transactions()[0], invalidTx}}) } // Add A1, B2, B3, B4, B5 into the channel err = channelOut.AddBlock(sd.RollupCfg, block) @@ -404,12 +404,12 @@ func TestBackupUnsafeReorgForkChoiceInputError(gt *testing.T) { To: &dp.Addresses.Bob, Value: e2eutils.Ether(2), }) - block = block.WithBody([]*types.Transaction{block.Transactions()[0], validTx}, []*types.Header{}) + block = block.WithBody(types.Body{Transactions: []*types.Transaction{block.Transactions()[0], validTx}}) } if i == 3 { // Make block B3 as an invalid block invalidTx := testutils.RandomTx(rng, big.NewInt(100), signer) - block = block.WithBody([]*types.Transaction{block.Transactions()[0], invalidTx}, []*types.Header{}) + block = block.WithBody(types.Body{Transactions: []*types.Transaction{block.Transactions()[0], invalidTx}}) } // Add A1, B2, B3, B4, B5 into the channel err = channelOut.AddBlock(sd.RollupCfg, block) @@ -537,12 +537,12 @@ func TestBackupUnsafeReorgForkChoiceNotInputError(gt *testing.T) { To: &dp.Addresses.Bob, Value: e2eutils.Ether(2), }) - block = block.WithBody([]*types.Transaction{block.Transactions()[0], validTx}, []*types.Header{}) + block = block.WithBody(types.Body{Transactions: []*types.Transaction{block.Transactions()[0], validTx}}) } if i == 3 { // Make block B3 as an invalid block invalidTx := testutils.RandomTx(rng, big.NewInt(100), signer) - block = block.WithBody([]*types.Transaction{block.Transactions()[0], invalidTx}, []*types.Header{}) + block = block.WithBody(types.Body{Transactions: []*types.Transaction{block.Transactions()[0], invalidTx}}) } // Add A1, B2, B3, B4, B5 into the channel err = channelOut.AddBlock(sd.RollupCfg, block) @@ -919,7 +919,7 @@ func TestInvalidPayloadInSpanBatch(gt *testing.T) { if i == 8 { // Make block A8 as an invalid block invalidTx := testutils.RandomTx(rng, big.NewInt(100), signer) - block = block.WithBody([]*types.Transaction{block.Transactions()[0], invalidTx}, []*types.Header{}) + block = block.WithBody(types.Body{Transactions: []*types.Transaction{block.Transactions()[0], invalidTx}}) } // Add A1 ~ A12 into the channel err = channelOut.AddBlock(sd.RollupCfg, block) @@ -968,7 +968,7 @@ func TestInvalidPayloadInSpanBatch(gt *testing.T) { Data: data, }) // Create valid new block B1 at the same height as A1 - block = block.WithBody([]*types.Transaction{block.Transactions()[0], tx}, []*types.Header{}) + block = block.WithBody(types.Body{Transactions: []*types.Transaction{block.Transactions()[0], tx}}) } // Add B1, A2 ~ A12 into the channel err = channelOut.AddBlock(sd.RollupCfg, block) diff --git a/op-e2e/config/init.go b/op-e2e/config/init.go index 54ad51d57a60..526c7a96b389 100644 --- a/op-e2e/config/init.go +++ b/op-e2e/config/init.go @@ -5,13 +5,12 @@ import ( "errors" "flag" "fmt" + "log/slog" "os" "path/filepath" "testing" "time" - "golang.org/x/exp/slog" - "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/log" diff --git a/op-e2e/devnet/devnet_test.go b/op-e2e/devnet/devnet_test.go index f8bbf865c13f..2a9b4be8aa5d 100644 --- a/op-e2e/devnet/devnet_test.go +++ b/op-e2e/devnet/devnet_test.go @@ -2,6 +2,7 @@ package devnet import ( "context" + "log/slog" "testing" "time" @@ -10,7 +11,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "golang.org/x/exp/slog" ) func TestDevnet(t *testing.T) { diff --git a/op-e2e/e2eutils/geth/geth.go b/op-e2e/e2eutils/geth/geth.go index d79900bf717d..ee03b82c1546 100644 --- a/op-e2e/e2eutils/geth/geth.go +++ b/op-e2e/e2eutils/geth/geth.go @@ -3,11 +3,13 @@ package geth import ( "fmt" "math/big" + "time" "github.com/ethereum-optimism/optimism/op-service/clock" "github.com/ethereum/go-ethereum/cmd/utils" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/txpool/blobpool" "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/eth/catalyst" @@ -31,6 +33,15 @@ func InitL1(chainID uint64, blockTime uint64, finalizedDistance uint64, genesis Datacap: blobpool.DefaultConfig.Datacap, PriceBump: blobpool.DefaultConfig.PriceBump, }, + StateScheme: rawdb.HashScheme, + Miner: miner.Config{ + PendingFeeRecipient: common.Address{}, + ExtraData: nil, + GasCeil: 0, + GasPrice: nil, + // enough to build blocks within 1 second, but high enough to avoid unnecessary test CPU cycles. + Recommit: time.Millisecond * 400, + }, } nodeConfig := &node.Config{ Name: "l1-geth", @@ -46,8 +57,6 @@ func InitL1(chainID uint64, blockTime uint64, finalizedDistance uint64, genesis if err != nil { return nil, nil, err } - // Activate merge - l1Eth.Merger().FinalizePoS() // Instead of running a whole beacon node, we run this fake-proof-of-stake sidecar that sequences L1 blocks using the Engine API. l1Node.RegisterLifecycle(&fakePoS{ @@ -84,16 +93,16 @@ type GethOption func(ethCfg *ethconfig.Config, nodeCfg *node.Config) error // InitL2 inits a L2 geth node. func InitL2(name string, l2ChainID *big.Int, genesis *core.Genesis, jwtPath string, opts ...GethOption) (*node.Node, *eth.Ethereum, error) { ethConfig := ðconfig.Config{ - NetworkId: l2ChainID.Uint64(), - Genesis: genesis, + NetworkId: l2ChainID.Uint64(), + Genesis: genesis, + StateScheme: rawdb.HashScheme, Miner: miner.Config{ - Etherbase: common.Address{}, - ExtraData: nil, - GasFloor: 0, - GasCeil: 0, - GasPrice: nil, - Recommit: 0, - NewPayloadTimeout: 0, + PendingFeeRecipient: common.Address{}, + ExtraData: nil, + GasCeil: 0, + GasPrice: nil, + // enough to build blocks within 1 second, but high enough to avoid unnecessary test CPU cycles. + Recommit: time.Millisecond * 400, }, } nodeConfig := defaultNodeConfig(fmt.Sprintf("l2-geth-%v", name), jwtPath) @@ -110,6 +119,7 @@ func createGethNode(l2 bool, nodeCfg *node.Config, ethCfg *ethconfig.Config, opt return nil, nil, fmt.Errorf("failed to apply geth option %d: %w", i, err) } } + ethCfg.StateScheme = rawdb.HashScheme ethCfg.NoPruning = true // force everything to be an archive node n, err := node.New(nodeCfg) if err != nil { diff --git a/op-e2e/e2eutils/transactions/blobs.go b/op-e2e/e2eutils/transactions/blobs.go index 980c357a1b68..e176ca7c91b2 100644 --- a/op-e2e/e2eutils/transactions/blobs.go +++ b/op-e2e/e2eutils/transactions/blobs.go @@ -8,14 +8,14 @@ import ( ) var ( - emptyBlob kzg4844.Blob + emptyBlob *kzg4844.Blob emptyBlobCommit kzg4844.Commitment emptyBlobProof kzg4844.Proof ) func init() { var err error - emptyBlob = kzg4844.Blob{} + emptyBlob = &kzg4844.Blob{} emptyBlobCommit, err = kzg4844.BlobToCommitment(emptyBlob) if err != nil { panic("failed to create empty blob commitment: " + err.Error()) @@ -30,7 +30,7 @@ func init() { // https://github.com/ethereum/go-ethereum/commit/2a6beb6a39d7cb3c5906dd4465d65da6efcc73cd func CreateEmptyBlobTx(withSidecar bool, chainID uint64) *types.BlobTx { sidecar := &types.BlobTxSidecar{ - Blobs: []kzg4844.Blob{emptyBlob}, + Blobs: []kzg4844.Blob{*emptyBlob}, Commitments: []kzg4844.Commitment{emptyBlobCommit}, Proofs: []kzg4844.Proof{emptyBlobProof}, } diff --git a/op-e2e/external_geth/main.go b/op-e2e/external_geth/main.go index f68fbd073be2..c97061d868ff 100644 --- a/op-e2e/external_geth/main.go +++ b/op-e2e/external_geth/main.go @@ -111,6 +111,7 @@ func initialize(binPath string, config external.Config) error { cmd := exec.Command( binPath, "--datadir", config.DataDir, + "--state.scheme=hash", "init", config.GenesisPath, ) return cmd.Run() @@ -146,6 +147,7 @@ func execute(binPath string, config external.Config) (*gethSession, error) { "--ws.port", "0", "--ws.api", "debug,eth,txpool,net,engine", "--syncmode=full", + "--state.scheme=hash", "--nodiscover", "--port", "0", "--maxpeers", "0", diff --git a/op-node/p2p/pings_test.go b/op-node/p2p/pings_test.go index 75aa6fd93595..f1dbb60446b2 100644 --- a/op-node/p2p/pings_test.go +++ b/op-node/p2p/pings_test.go @@ -3,6 +3,7 @@ package p2p import ( "context" "errors" + "log/slog" "sync/atomic" "testing" "time" @@ -10,7 +11,6 @@ import ( "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/p2p/protocol/ping" "github.com/stretchr/testify/require" - "golang.org/x/exp/slog" "github.com/ethereum-optimism/optimism/op-service/clock" "github.com/ethereum-optimism/optimism/op-service/testlog" diff --git a/op-node/rollup/chain_spec_test.go b/op-node/rollup/chain_spec_test.go index f42cd30ec643..231aca92bc7e 100644 --- a/op-node/rollup/chain_spec_test.go +++ b/op-node/rollup/chain_spec_test.go @@ -1,6 +1,7 @@ package rollup import ( + "log/slog" "math/big" "testing" @@ -8,7 +9,6 @@ import ( "github.com/ethereum-optimism/optimism/op-service/testlog" "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" - "golang.org/x/exp/slog" ) func u64ptr(n uint64) *uint64 { diff --git a/op-node/rollup/derive/batch_test.go b/op-node/rollup/derive/batch_test.go index 3dc554a59325..9e48f265d745 100644 --- a/op-node/rollup/derive/batch_test.go +++ b/op-node/rollup/derive/batch_test.go @@ -6,12 +6,11 @@ import ( "math/rand" "testing" - "github.com/stretchr/testify/require" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/rlp" + "github.com/stretchr/testify/require" "github.com/ethereum-optimism/optimism/op-node/rollup" "github.com/ethereum-optimism/optimism/op-service/eth" diff --git a/op-node/rollup/derive/batch_test_utils.go b/op-node/rollup/derive/batch_test_utils.go index 3b931cc4f03b..5783b5ec39bf 100644 --- a/op-node/rollup/derive/batch_test_utils.go +++ b/op-node/rollup/derive/batch_test_utils.go @@ -21,7 +21,7 @@ func RandomSingularBatch(rng *rand.Rand, txCount int, chainID *big.Int) *Singula if err != nil { panic("tx Marshal binary" + err.Error()) } - txsEncoded = append(txsEncoded, hexutil.Bytes(txEncoded)) + txsEncoded = append(txsEncoded, txEncoded) } return &SingularBatch{ ParentHash: testutils.RandomHash(rng), diff --git a/op-node/rollup/derive/channel_out_test.go b/op-node/rollup/derive/channel_out_test.go index 0c82bbb9895b..e2eda7344eb5 100644 --- a/op-node/rollup/derive/channel_out_test.go +++ b/op-node/rollup/derive/channel_out_test.go @@ -63,10 +63,11 @@ func TestChannelOutAddBlock(t *testing.T) { cout := tcase.ChannelOut(t, &rollupCfg) header := &types.Header{Number: big.NewInt(1), Difficulty: big.NewInt(100)} block := types.NewBlockWithHeader(header).WithBody( - []*types.Transaction{ - types.NewTx(&types.DynamicFeeTx{}), + types.Body{ + Transactions: []*types.Transaction{ + types.NewTx(&types.DynamicFeeTx{}), + }, }, - nil, ) err := cout.AddBlock(&rollupCfg, block) require.Error(t, err) diff --git a/op-node/rollup/derive/fuzz_parsers_test.go b/op-node/rollup/derive/fuzz_parsers_test.go index 4054eb7f2370..95ce94bc7cc8 100644 --- a/op-node/rollup/derive/fuzz_parsers_test.go +++ b/op-node/rollup/derive/fuzz_parsers_test.go @@ -5,6 +5,7 @@ import ( "math/big" "testing" + "github.com/ethereum/go-ethereum/core/tracing" "github.com/google/go-cmp/cmp" "github.com/holiman/uint256" "github.com/stretchr/testify/require" @@ -234,7 +235,7 @@ func FuzzUnmarshallLogEvent(f *testing.F) { // Set the EVM state up once to fuzz against state, err := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) require.NoError(f, err) - state.SetBalance(from, uint256.MustFromBig(BytesToBigInt([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}))) + state.SetBalance(from, uint256.MustFromBig(BytesToBigInt([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff})), tracing.BalanceChangeUnspecified) _, addr, _, err := runtime.Create(common.FromHex(bindings.OptimismPortalMetaData.Bin), &runtime.Config{ Origin: from, State: state, diff --git a/op-node/rollup/derive/span_batch_tx.go b/op-node/rollup/derive/span_batch_tx.go index cd0a471ab266..5f5bffb02b8b 100644 --- a/op-node/rollup/derive/span_batch_tx.go +++ b/op-node/rollup/derive/span_batch_tx.go @@ -175,7 +175,7 @@ func (tx *spanBatchTx) convertToFullTx(nonce, gas uint64, to *common.Address, ch } // newSpanBatchTx converts types.Transaction to spanBatchTx -func newSpanBatchTx(tx types.Transaction) (*spanBatchTx, error) { +func newSpanBatchTx(tx *types.Transaction) (*spanBatchTx, error) { var inner spanBatchTxData switch tx.Type() { case types.LegacyTxType: diff --git a/op-node/rollup/derive/span_batch_tx_test.go b/op-node/rollup/derive/span_batch_tx_test.go index c846f65812b9..55a9101da5e7 100644 --- a/op-node/rollup/derive/span_batch_tx_test.go +++ b/op-node/rollup/derive/span_batch_tx_test.go @@ -39,7 +39,7 @@ func TestSpanBatchTxConvert(t *testing.T) { tx := testCase.mkTx(rng, signer) v, r, s := tx.RawSignatureValues() - sbtx, err := newSpanBatchTx(*tx) + sbtx, err := newSpanBatchTx(tx) require.NoError(t, err) tx2, err := sbtx.convertToFullTx(tx.Nonce(), tx.Gas(), tx.To(), chainID, v, r, s) @@ -77,7 +77,7 @@ func TestSpanBatchTxRoundTrip(t *testing.T) { for txIdx := 0; txIdx < testCase.trials; txIdx++ { tx := testCase.mkTx(rng, signer) - sbtx, err := newSpanBatchTx(*tx) + sbtx, err := newSpanBatchTx(tx) require.NoError(t, err) sbtxEncoded, err := sbtx.MarshalBinary() @@ -100,7 +100,7 @@ func (txData *spanBatchDummyTxData) txType() byte { return types.DepositTxType } func TestSpanBatchTxInvalidTxType(t *testing.T) { // span batch never contain deposit tx depositTx := types.NewTx(&types.DepositTx{}) - _, err := newSpanBatchTx(*depositTx) + _, err := newSpanBatchTx(depositTx) require.ErrorContains(t, err, "invalid tx type") var sbtx spanBatchTx diff --git a/op-node/rollup/derive/span_batch_txs.go b/op-node/rollup/derive/span_batch_txs.go index 305aafefe9da..e4bc73d0f987 100644 --- a/op-node/rollup/derive/span_batch_txs.go +++ b/op-node/rollup/derive/span_batch_txs.go @@ -424,7 +424,7 @@ func (sbtx *spanBatchTxs) AddTxs(txs [][]byte, chainID *big.Int) error { totalBlockTxCount := uint64(len(txs)) offset := sbtx.totalBlockTxCount for idx := 0; idx < int(totalBlockTxCount); idx++ { - var tx types.Transaction + tx := &types.Transaction{} if err := tx.UnmarshalBinary(txs[idx]); err != nil { return errors.New("failed to decode tx") } diff --git a/op-node/rollup/derive/test/random.go b/op-node/rollup/derive/test/random.go index 57ad0d8d9579..ba9600da8c82 100644 --- a/op-node/rollup/derive/test/random.go +++ b/op-node/rollup/derive/test/random.go @@ -16,7 +16,8 @@ import ( // RandomL2Block returns a random block whose first transaction is a random pre-Ecotone upgrade // L1 Info Deposit transaction. func RandomL2Block(rng *rand.Rand, txCount int, t time.Time) (*types.Block, []*types.Receipt) { - l1Block := types.NewBlock(testutils.RandomHeader(rng), nil, nil, nil, trie.NewStackTrie(nil)) + body := types.Body{} + l1Block := types.NewBlock(testutils.RandomHeader(rng), &body, nil, trie.NewStackTrie(nil)) rollupCfg := rollup.Config{} if testutils.RandomBool(rng) { t := uint64(0) @@ -45,5 +46,5 @@ func RandomL2BlockWithChainIdAndTime(rng *rand.Rand, txCount int, chainId *big.I for i := 0; i < txCount; i++ { txs = append(txs, testutils.RandomTx(rng, big.NewInt(int64(rng.Uint32())), signer)) } - return block.WithBody(txs, nil) + return block.WithBody(types.Body{Transactions: txs}) } diff --git a/op-node/rollup/event/tracer_log.go b/op-node/rollup/event/tracer_log.go index 483fb9781326..a699df2e29d6 100644 --- a/op-node/rollup/event/tracer_log.go +++ b/op-node/rollup/event/tracer_log.go @@ -1,10 +1,9 @@ package event import ( + "log/slog" "time" - "golang.org/x/exp/slog" - "github.com/ethereum/go-ethereum/log" ) diff --git a/op-program/client/l2/db.go b/op-program/client/l2/db.go index 018b79ed9356..3dfa5ec0d6b9 100644 --- a/op-program/client/l2/db.go +++ b/op-program/client/l2/db.go @@ -74,7 +74,7 @@ func (o *OracleKeyValueStore) Delete(key []byte) error { panic("not supported") } -func (o *OracleKeyValueStore) Stat(property string) (string, error) { +func (o *OracleKeyValueStore) Stat() (string, error) { panic("not supported") } diff --git a/op-program/client/l2/db_test.go b/op-program/client/l2/db_test.go index 00b70c810d73..c85f99e2c55f 100644 --- a/op-program/client/l2/db_test.go +++ b/op-program/client/l2/db_test.go @@ -10,6 +10,7 @@ import ( "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/tracing" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" @@ -130,12 +131,12 @@ func TestUpdateState(t *testing.T) { statedb, err := state.New(genesisBlock.Root(), state.NewDatabase(rawdb.NewDatabase(db)), nil) require.NoError(t, err) - statedb.SetBalance(userAccount, uint256.NewInt(50)) + statedb.SetBalance(userAccount, uint256.NewInt(50), tracing.BalanceChangeUnspecified) require.Equal(t, uint256.NewInt(50), statedb.GetBalance(userAccount)) statedb.SetNonce(userAccount, uint64(5)) require.Equal(t, uint64(5), statedb.GetNonce(userAccount)) - statedb.SetBalance(unknownAccount, uint256.NewInt(60)) + statedb.SetBalance(unknownAccount, uint256.NewInt(60), tracing.BalanceChangeUnspecified) require.Equal(t, uint256.NewInt(60), statedb.GetBalance(unknownAccount)) statedb.SetCode(codeAccount, []byte{1}) require.Equal(t, []byte{1}, statedb.GetCode(codeAccount)) diff --git a/op-program/client/l2/engine_test.go b/op-program/client/l2/engine_test.go index 18d9a4c26cf6..28c9f8006dce 100644 --- a/op-program/client/l2/engine_test.go +++ b/op-program/client/l2/engine_test.go @@ -179,7 +179,10 @@ func createL2Block(t *testing.T, number int) *types.Block { Number: big.NewInt(int64(number)), BaseFee: big.NewInt(7), } - return types.NewBlock(header, []*types.Transaction{types.NewTx(tx)}, nil, nil, trie.NewStackTrie(nil)) + body := &types.Body{ + Transactions: []*types.Transaction{types.NewTx(tx)}, + } + return types.NewBlock(header, body, nil, trie.NewStackTrie(nil)) } type stubEngineBackend struct { diff --git a/op-program/client/l2/engineapi/block_processor.go b/op-program/client/l2/engineapi/block_processor.go index d81212db206c..9e56445f5511 100644 --- a/op-program/client/l2/engineapi/block_processor.go +++ b/op-program/client/l2/engineapi/block_processor.go @@ -124,7 +124,11 @@ func (b *BlockProcessor) AddTx(tx *types.Transaction) error { } func (b *BlockProcessor) Assemble() (*types.Block, error) { - return b.dataProvider.Engine().FinalizeAndAssemble(b.dataProvider, b.header, b.state, b.transactions, nil, b.receipts, nil) + body := types.Body{ + Transactions: b.transactions, + } + + return b.dataProvider.Engine().FinalizeAndAssemble(b.dataProvider, b.header, b.state, &body, b.receipts) } func (b *BlockProcessor) Commit() error { diff --git a/op-program/client/l2/oracle.go b/op-program/client/l2/oracle.go index 6aa049e15992..0563079a830e 100644 --- a/op-program/client/l2/oracle.go +++ b/op-program/client/l2/oracle.go @@ -66,7 +66,7 @@ func (p *PreimageOracle) BlockByHash(blockHash common.Hash) *types.Block { header := p.headerByBlockHash(blockHash) txs := p.LoadTransactions(blockHash, header.TxHash) - return types.NewBlockWithHeader(header).WithBody(txs, nil) + return types.NewBlockWithHeader(header).WithBody(types.Body{Transactions: txs}) } func (p *PreimageOracle) LoadTransactions(blockHash common.Hash, txHash common.Hash) []*types.Transaction { diff --git a/op-program/client/mpt/db.go b/op-program/client/mpt/db.go index fe9e234cf2df..5d9e9147ced9 100644 --- a/op-program/client/mpt/db.go +++ b/op-program/client/mpt/db.go @@ -31,7 +31,7 @@ func (p DB) Delete(key []byte) error { return nil } -func (p DB) Stat(property string) (string, error) { +func (p DB) Stat() (string, error) { panic("not supported") } diff --git a/op-service/client/http_test.go b/op-service/client/http_test.go index 60fd9fd9873f..df84e48299c2 100644 --- a/op-service/client/http_test.go +++ b/op-service/client/http_test.go @@ -2,13 +2,12 @@ package client import ( "context" + "log/slog" "net/http" "net/http/httptest" "net/url" "testing" - "golang.org/x/exp/slog" - "github.com/ethereum-optimism/optimism/op-service/testlog" "github.com/stretchr/testify/require" ) diff --git a/op-service/crypto/signature.go b/op-service/crypto/signature.go index c0abd3ef2afd..0b0afc02ecef 100644 --- a/op-service/crypto/signature.go +++ b/op-service/crypto/signature.go @@ -91,6 +91,9 @@ func SignerFactoryFromConfig(l log.Logger, privateKey, mnemonic, hdPath string, return nil, common.Address{}, fmt.Errorf("failed to parse the private key: %w", err) } } + // we force the curve to Geth's instance, because Geth does an equality check in the nocgo version: + // https://github.com/ethereum/go-ethereum/blob/723b1e36ad6a9e998f06f74cc8b11d51635c6402/crypto/signature_nocgo.go#L82 + privKey.PublicKey.Curve = crypto.S256() fromAddress = crypto.PubkeyToAddress(privKey.PublicKey) signer = func(chainID *big.Int) SignerFn { s := PrivateKeySignerFn(privKey, chainID) diff --git a/op-service/crypto/signature_test.go b/op-service/crypto/signature_test.go new file mode 100644 index 000000000000..1cd52165bf5b --- /dev/null +++ b/op-service/crypto/signature_test.go @@ -0,0 +1,56 @@ +package crypto + +import ( + "context" + "math/big" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/op-service/signer" + "github.com/ethereum-optimism/optimism/op-service/testlog" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" +) + +// should be run with CGO_ENABLED=0 + +func TestSignerFactoryFromMnemonic(t *testing.T) { + mnemonic := "test test test test test test test test test test test junk" + hdPath := "m/44'/60'/0'/0/1" + testSigner(t, "", mnemonic, hdPath, signer.CLIConfig{}) +} + +func TestSignerFactoryFromKey(t *testing.T) { + priv := "59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d" + testSigner(t, priv, "", "", signer.CLIConfig{}) +} + +func testSigner(t *testing.T, priv, mnemonic, hdPath string, cfg signer.CLIConfig) { + logger := testlog.Logger(t, log.LevelDebug) + + factoryFn, addr, err := SignerFactoryFromConfig(logger, priv, mnemonic, hdPath, cfg) + require.NoError(t, err) + expectedAddr := common.HexToAddress("0x70997970C51812dc3A010C7d01b50e0d17dc79C8") + require.Equal(t, expectedAddr, addr) + chainID := big.NewInt(10) + signerFn := factoryFn(chainID) // for chain ID 10 + tx := types.NewTx(&types.DynamicFeeTx{ + ChainID: chainID, + Nonce: 0, + GasTipCap: big.NewInt(1), + GasFeeCap: big.NewInt(1), + Gas: 21000, + To: nil, + Value: big.NewInt(0), + Data: []byte("test"), + }) + signedTx, err := signerFn(context.Background(), addr, tx) + require.NoError(t, err) + gethSigner := types.LatestSignerForChainID(chainID) + sender, err := gethSigner.Sender(signedTx) + require.NoError(t, err) + require.Equal(t, expectedAddr, sender) +} diff --git a/op-service/dial/rollup_sync_test.go b/op-service/dial/rollup_sync_test.go index 1d3898e8fdb8..9ed3e2a39bdd 100644 --- a/op-service/dial/rollup_sync_test.go +++ b/op-service/dial/rollup_sync_test.go @@ -3,6 +3,7 @@ package dial import ( "context" "errors" + "log/slog" "testing" "time" @@ -10,7 +11,6 @@ import ( "github.com/ethereum-optimism/optimism/op-service/testlog" "github.com/ethereum-optimism/optimism/op-service/testutils" "github.com/stretchr/testify/require" - "golang.org/x/exp/slog" ) func TestWaitRollupSync(t *testing.T) { diff --git a/op-service/eth/blob.go b/op-service/eth/blob.go index da871215da85..9e51c568634f 100644 --- a/op-service/eth/blob.go +++ b/op-service/eth/blob.go @@ -57,7 +57,7 @@ func (b *Blob) TerminalString() string { } func (b *Blob) ComputeKZGCommitment() (kzg4844.Commitment, error) { - return kzg4844.BlobToCommitment(*b.KZGBlob()) + return kzg4844.BlobToCommitment(b.KZGBlob()) } // KZGToVersionedHash computes the "blob hash" (a.k.a. versioned-hash) of a blob-commitment, as used in a blob-tx. @@ -70,7 +70,7 @@ func KZGToVersionedHash(commitment kzg4844.Commitment) (out common.Hash) { // VerifyBlobProof verifies that the given blob and proof corresponds to the given commitment, // returning error if the verification fails. func VerifyBlobProof(blob *Blob, commitment kzg4844.Commitment, proof kzg4844.Proof) error { - return kzg4844.VerifyBlobProof(*blob.KZGBlob(), commitment, proof) + return kzg4844.VerifyBlobProof(blob.KZGBlob(), commitment, proof) } // FromData encodes the given input data into this blob. The encoding scheme is as follows: diff --git a/op-service/log/cli.go b/op-service/log/cli.go index ab4718d5e4a2..2bd3c693009b 100644 --- a/op-service/log/cli.go +++ b/op-service/log/cli.go @@ -3,11 +3,11 @@ package log import ( "fmt" "io" + "log/slog" "os" "strings" "github.com/urfave/cli/v2" - "golang.org/x/exp/slog" "golang.org/x/term" "github.com/ethereum/go-ethereum/log" diff --git a/op-service/log/dynamic.go b/op-service/log/dynamic.go index 72f23f505bbc..0259fb15b201 100644 --- a/op-service/log/dynamic.go +++ b/op-service/log/dynamic.go @@ -2,8 +2,7 @@ package log import ( "context" - - "golang.org/x/exp/slog" + "log/slog" ) type LvlSetter interface { diff --git a/op-service/log/dynamic_test.go b/op-service/log/dynamic_test.go index 3a992710b4d8..25076246364c 100644 --- a/op-service/log/dynamic_test.go +++ b/op-service/log/dynamic_test.go @@ -2,10 +2,10 @@ package log import ( "context" + "log/slog" "testing" "github.com/stretchr/testify/require" - "golang.org/x/exp/slog" "github.com/ethereum/go-ethereum/log" ) diff --git a/op-service/log/writer.go b/op-service/log/writer.go index 0a1731383068..e3c658d3a7b8 100644 --- a/op-service/log/writer.go +++ b/op-service/log/writer.go @@ -1,10 +1,9 @@ package log import ( + "log/slog" "sync" - "golang.org/x/exp/slog" - "github.com/ethereum/go-ethereum/log" ) diff --git a/op-service/log/writer_test.go b/op-service/log/writer_test.go index 2e9cf14b3a75..274a2aa2a3d0 100644 --- a/op-service/log/writer_test.go +++ b/op-service/log/writer_test.go @@ -2,10 +2,10 @@ package log_test import ( "io" + "log/slog" "testing" "github.com/stretchr/testify/require" - "golang.org/x/exp/slog" "github.com/ethereum/go-ethereum/log" diff --git a/op-service/sources/batching/bound.go b/op-service/sources/batching/bound.go index 33e19c3dfbfa..75a2a3f12a03 100644 --- a/op-service/sources/batching/bound.go +++ b/op-service/sources/batching/bound.go @@ -43,11 +43,11 @@ func (b *BoundContract) DecodeCall(data []byte) (string, *CallResult, error) { method, err := b.abi.MethodById(data[:4]) if err != nil { // ABI doesn't return a nicely typed error so treat any failure to find the method as unknown - return "", nil, fmt.Errorf("%w: %v", ErrUnknownMethod, err.Error()) + return "", nil, fmt.Errorf("%w: %w", ErrUnknownMethod, err) } args, err := method.Inputs.Unpack(data[4:]) if err != nil { - return "", nil, fmt.Errorf("%w: %v", ErrInvalidCall, err.Error()) + return "", nil, fmt.Errorf("%w: %w", ErrInvalidCall, err) } return method.Name, &CallResult{args}, nil } @@ -58,7 +58,7 @@ func (b *BoundContract) DecodeEvent(log *types.Log) (string, *CallResult, error) } event, err := b.abi.EventByID(log.Topics[0]) if err != nil { - return "", nil, fmt.Errorf("%w: %v", ErrUnknownEvent, err.Error()) + return "", nil, fmt.Errorf("%w: %w", ErrUnknownEvent, err) } argsMap := make(map[string]interface{}) @@ -69,13 +69,13 @@ func (b *BoundContract) DecodeEvent(log *types.Log) (string, *CallResult, error) } } if err := abi.ParseTopicsIntoMap(argsMap, indexed, log.Topics[1:]); err != nil { - return "", nil, fmt.Errorf("%w indexed topics: %v", ErrInvalidEvent, err.Error()) + return "", nil, fmt.Errorf("%w indexed topics: %w", ErrInvalidEvent, err) } nonIndexed := event.Inputs.NonIndexed() if len(nonIndexed) > 0 { if err := nonIndexed.UnpackIntoMap(argsMap, log.Data); err != nil { - return "", nil, fmt.Errorf("%w non-indexed topics: %v", ErrInvalidEvent, err.Error()) + return "", nil, fmt.Errorf("%w non-indexed topics: %w", ErrInvalidEvent, err) } } args := make([]interface{}, 0, len(event.Inputs)) diff --git a/op-service/sources/l1_beacon_client_test.go b/op-service/sources/l1_beacon_client_test.go index ef4ede18c68d..086cb0f9dae4 100644 --- a/op-service/sources/l1_beacon_client_test.go +++ b/op-service/sources/l1_beacon_client_test.go @@ -25,8 +25,8 @@ func makeTestBlobSidecar(index uint64) (eth.IndexedBlobHash, *eth.BlobSidecar) { // make first byte of test blob match its index so we can easily verify if is returned in the // expected order blob[0] = byte(index) - commit, _ := kzg4844.BlobToCommitment(blob) - proof, _ := kzg4844.ComputeBlobProof(blob, commit) + commit, _ := kzg4844.BlobToCommitment(&blob) + proof, _ := kzg4844.ComputeBlobProof(&blob, commit) hash := eth.KZGToVersionedHash(commit) idh := eth.IndexedBlobHash{ diff --git a/op-service/sources/rollupclient.go b/op-service/sources/rollupclient.go index 14c38d35b4e8..acd0f84b3917 100644 --- a/op-service/sources/rollupclient.go +++ b/op-service/sources/rollupclient.go @@ -2,10 +2,10 @@ package sources import ( "context" + "log/slog" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "golang.org/x/exp/slog" "github.com/ethereum-optimism/optimism/op-node/rollup" "github.com/ethereum-optimism/optimism/op-service/client" diff --git a/op-service/testlog/capturing.go b/op-service/testlog/capturing.go index 6e1edb09b504..28a8a4926078 100644 --- a/op-service/testlog/capturing.go +++ b/op-service/testlog/capturing.go @@ -2,10 +2,9 @@ package testlog import ( "context" + "log/slog" "strings" - "golang.org/x/exp/slog" - "github.com/ethereum/go-ethereum/log" ) diff --git a/op-service/testlog/testlog.go b/op-service/testlog/testlog.go index 0ff544225599..fe7ede207cbc 100644 --- a/op-service/testlog/testlog.go +++ b/op-service/testlog/testlog.go @@ -21,14 +21,13 @@ import ( "bufio" "bytes" "context" + "log/slog" "os" "runtime" "strconv" "strings" "sync" - "golang.org/x/exp/slog" - "github.com/ethereum/go-ethereum/log" ) diff --git a/op-service/testutils/random.go b/op-service/testutils/random.go index f065d2583765..a3021ad463b6 100644 --- a/op-service/testutils/random.go +++ b/op-service/testutils/random.go @@ -299,7 +299,10 @@ func RandomBlockPrependTxsWithTime(rng *rand.Rand, txCount int, t uint64, ptxs . } header.GasUsed = cumulativeGasUsed header.GasLimit = cumulativeGasUsed + uint64(rng.Int63n(int64(cumulativeGasUsed))) - block := types.NewBlock(header, txs, nil, receipts, trie.NewStackTrie(nil)) + body := types.Body{ + Transactions: txs, + } + block := types.NewBlock(header, &body, receipts, trie.NewStackTrie(nil)) logIndex := uint(0) for i, r := range receipts { r.BlockHash = block.Hash() diff --git a/op-service/txmgr/txmgr.go b/op-service/txmgr/txmgr.go index 72ef1d1c7518..602ed863a7a3 100644 --- a/op-service/txmgr/txmgr.go +++ b/op-service/txmgr/txmgr.go @@ -326,8 +326,8 @@ func MakeSidecar(blobs []*eth.Blob) (*types.BlobTxSidecar, []common.Hash, error) sidecar := &types.BlobTxSidecar{} blobHashes := make([]common.Hash, 0, len(blobs)) for i, blob := range blobs { - rawBlob := *blob.KZGBlob() - sidecar.Blobs = append(sidecar.Blobs, rawBlob) + rawBlob := blob.KZGBlob() + sidecar.Blobs = append(sidecar.Blobs, *rawBlob) commitment, err := kzg4844.BlobToCommitment(rawBlob) if err != nil { return nil, nil, fmt.Errorf("cannot compute KZG commitment of blob %d in tx candidate: %w", i, err) diff --git a/op-service/txmgr/txmgr_test.go b/op-service/txmgr/txmgr_test.go index 330f2482b1a2..0b1ad933b37a 100644 --- a/op-service/txmgr/txmgr_test.go +++ b/op-service/txmgr/txmgr_test.go @@ -564,7 +564,7 @@ func TestTxMgr_CraftBlobTx(t *testing.T) { // verify the blobs for i := range sidecar.Blobs { - require.NoError(t, kzg4844.VerifyBlobProof(sidecar.Blobs[i], sidecar.Commitments[i], sidecar.Proofs[i])) + require.NoError(t, kzg4844.VerifyBlobProof(&sidecar.Blobs[i], sidecar.Commitments[i], sidecar.Proofs[i])) } b1 := eth.Blob(sidecar.Blobs[0]) d1, err := b1.ToData() diff --git a/op-wheel/cheat/cheat.go b/op-wheel/cheat/cheat.go index 61c8d74d09f3..26138dfc2875 100644 --- a/op-wheel/cheat/cheat.go +++ b/op-wheel/cheat/cheat.go @@ -10,6 +10,7 @@ import ( "path/filepath" "strings" + "github.com/ethereum/go-ethereum/core/tracing" "github.com/holiman/uint256" "github.com/ethereum/go-ethereum/common" @@ -337,7 +338,7 @@ func StoragePatch(patch io.Reader, address common.Address) HeadFn { func SetBalance(addr common.Address, amount *big.Int) HeadFn { return func(_ *types.Header, headState *state.StateDB) error { - headState.SetBalance(addr, uint256.MustFromBig(amount)) + headState.SetBalance(addr, uint256.MustFromBig(amount), tracing.BalanceChangeUnspecified) return nil } } diff --git a/op-wheel/cmd/main.go b/op-wheel/cmd/main.go index 03d29c72c055..9da15270eda9 100644 --- a/op-wheel/cmd/main.go +++ b/op-wheel/cmd/main.go @@ -31,9 +31,9 @@ func main() { oplog.SetGlobalLogHandler(log.NewTerminalHandlerWithLevel(os.Stdout, lvl, true)) return nil } - app.Action = cli.ActionFunc(func(c *cli.Context) error { + app.Action = func(c *cli.Context) error { return errors.New("see 'cheat' and 'engine' subcommands and --help") - }) + } app.Writer = os.Stdout app.ErrWriter = os.Stderr app.Commands = []*cli.Command{ diff --git a/op-wheel/engine/engine.go b/op-wheel/engine/engine.go index f76fc753ac4b..bd834ec032ef 100644 --- a/op-wheel/engine/engine.go +++ b/op-wheel/engine/engine.go @@ -44,7 +44,7 @@ func getBlock(ctx context.Context, client client.RPC, method string, tag string) if err != nil { return nil, err } - return types.NewBlockWithHeader(&bl.Header).WithBody(bl.Transactions, nil), nil + return types.NewBlockWithHeader(&bl.Header).WithBody(types.Body{Transactions: bl.Transactions}), nil } func getHeader(ctx context.Context, client client.RPC, method string, tag string) (*types.Header, error) { diff --git a/ops-bedrock/l1-geth.Dockerfile b/ops-bedrock/l1-geth.Dockerfile index 988d79bec023..51c4933026ea 100644 --- a/ops-bedrock/l1-geth.Dockerfile +++ b/ops-bedrock/l1-geth.Dockerfile @@ -1,4 +1,4 @@ -FROM ethereum/client-go:v1.13.15 +FROM ethereum/client-go:v1.14.7 RUN apk add --no-cache jq bash From 94b7e03b209cbfd5018482216f5be9594b81dc34 Mon Sep 17 00:00:00 2001 From: mbaxter Date: Fri, 9 Aug 2024 13:41:24 -0400 Subject: [PATCH 41/59] cannon: Undo changes to memprofile patching (#11420) --- cannon/mipsevm/program/patch.go | 6 +++++- op-program/client/cmd/main.go | 8 -------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/cannon/mipsevm/program/patch.go b/cannon/mipsevm/program/patch.go index b26aa4d65b32..c845488dd7b9 100644 --- a/cannon/mipsevm/program/patch.go +++ b/cannon/mipsevm/program/patch.go @@ -47,12 +47,16 @@ func PatchGo(f *elf.File, st mipsevm.FPVMState) error { })); err != nil { return fmt.Errorf("failed to patch Go runtime.gcenable: %w", err) } + case "runtime.MemProfileRate": + if err := st.GetMemory().SetMemoryRange(uint32(s.Value), bytes.NewReader(make([]byte, 4))); err != nil { // disable mem profiling, to avoid a lot of unnecessary floating point ops + return err + } } } return nil } -// TODO(cp-903) Consider setting envar "GODEBUG=memprofilerate=0" for go programs to disable memprofiling +// TODO(cp-903) Consider setting envar "GODEBUG=memprofilerate=0" for go programs to disable memprofiling, instead of patching it out in PatchGo() func PatchStack(st mipsevm.FPVMState) error { // setup stack pointer sp := uint32(0x7f_ff_d0_00) diff --git a/op-program/client/cmd/main.go b/op-program/client/cmd/main.go index ec6576984749..d075083e5aa1 100644 --- a/op-program/client/cmd/main.go +++ b/op-program/client/cmd/main.go @@ -2,7 +2,6 @@ package main import ( "os" - "runtime" "github.com/ethereum/go-ethereum/log" @@ -10,13 +9,6 @@ import ( oplog "github.com/ethereum-optimism/optimism/op-service/log" ) -var _ = func() bool { - // Disable mem profiling, to avoid a lot of unnecessary floating point ops - // TODO(cp-903) Consider cutting this in favor patching envar "GODEBUG=memprofilerate=0" into cannon go programs - runtime.MemProfileRate = 0 - return true -}() - func main() { // Default to a machine parsable but relatively human friendly log format. // Don't do anything fancy to detect if color output is supported. From cdfe8a838825507db0e253961b77f799d0723b81 Mon Sep 17 00:00:00 2001 From: smartcontracts Date: Fri, 9 Aug 2024 15:07:57 -0400 Subject: [PATCH 42/59] fix: update contracts README diagram (#11406) --- packages/contracts-bedrock/README.md | 59 +++++++++++++++++----------- 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/packages/contracts-bedrock/README.md b/packages/contracts-bedrock/README.md index ad7edb5065e4..2e01cc360676 100644 --- a/packages/contracts-bedrock/README.md +++ b/packages/contracts-bedrock/README.md @@ -55,51 +55,66 @@ graph LR L1StandardBridge(L1StandardBridge) L1ERC721Bridge(L1ERC721Bridge) L1CrossDomainMessenger(L1CrossDomainMessenger) - L2OutputOracle(L2OutputOracle) OptimismPortal(OptimismPortal) SuperchainConfig(SuperchainConfig) SystemConfig(SystemConfig) + DisputeGameFactory(DisputeGameFactory) + FaultDisputeGame(FaultDisputeGame) + AnchorStateRegistry(AnchorStateRegistry) + DelayedWETH(DelayedWETH) end - subgraph "User Interactions" + subgraph "User Interactions (Permissionless)" Users(Users) + Challengers(Challengers) end subgraph "System Interactions" - Batcher(Batcher) - Proposer(Proposer) Guardian(Guardian) + Batcher(Batcher) end subgraph "Layer 2 Interactions" L2Nodes(Layer 2 Nodes) end + L2Nodes -.->|fetch transaction batches| BatchDataEOA + L2Nodes -.->|fetch deposit events| OptimismPortal + Batcher -->|publish transaction batches| BatchDataEOA - Proposer -->|propose state outputs| L2OutputOracle - Guardian -->|remove invalid state outputs| L2OutputOracle - ExternalERC20 <-->|mint/burn/transfer| L1StandardBridge - ExternalERC721 <-->|mint/burn/transfer| L1ERC721Bridge + ExternalERC20 <-->|mint/burn/transfer tokens| L1StandardBridge + ExternalERC721 <-->|mint/burn/transfer tokens| L1ERC721Bridge - L1StandardBridge <-->|send/receive message| L1CrossDomainMessenger - L1ERC721Bridge <-->|send/receive message| L1CrossDomainMessenger - L1CrossDomainMessenger <-->|package/send/receive message| OptimismPortal + L1StandardBridge <-->|send/receive messages| L1CrossDomainMessenger L1StandardBridge -.->|query pause state| SuperchainConfig + + L1ERC721Bridge <-->|send/receive messages| L1CrossDomainMessenger L1ERC721Bridge -.->|query pause state| SuperchainConfig + + L1CrossDomainMessenger <-->|send/receive messages| OptimismPortal L1CrossDomainMessenger -.->|query pause state| SuperchainConfig - OptimismPortal -.->|query pause state| SuperchainConfig + OptimismPortal -.->|query pause state| SuperchainConfig OptimismPortal -.->|query config| SystemConfig - OptimismPortal -.->|query proposed states| L2OutputOracle + OptimismPortal -.->|query state proposals| DisputeGameFactory - Users <-->|deposit/withdraw ETH/ERC20| L1StandardBridge - Users <-->|deposit/withdraw ERC721| L1ERC721Bridge - Users -->|prove/execute withdrawal transactions| OptimismPortal + DisputeGameFactory -->|generate instances| FaultDisputeGame - L2Nodes -.->|fetch transaction batches| BatchDataEOA - L2Nodes -.->|verify output roots| L2OutputOracle - L2Nodes -.->|fetch deposit events| OptimismPortal + FaultDisputeGame -->|store bonds| DelayedWETH + FaultDisputeGame -->|query/update anchor states| AnchorStateRegistry + + Users <-->|deposit/withdraw ETH/ERC20s| L1StandardBridge + Users <-->|deposit/withdraw ERC721s| L1ERC721Bridge + Users -->|prove/execute withdrawals| OptimismPortal + + Challengers -->|propose output roots| DisputeGameFactory + Challengers -->|verify/challenge/defend proposals| FaultDisputeGame + + Guardian -->|pause/unpause| SuperchainConfig + Guardian -->|safety net actions| OptimismPortal + Guardian -->|safety net actions| DisputeGameFactory + Guardian -->|safety net actions| DelayedWETH classDef extContracts stroke:#ff9,stroke-width:2px; classDef l1Contracts stroke:#bbf,stroke-width:2px; @@ -108,10 +123,10 @@ graph LR classDef systemUser stroke:#f9a,stroke-width:2px; classDef l2Nodes stroke:#333,stroke-width:2px class ExternalERC20,ExternalERC721 extContracts; - class L1StandardBridge,L1ERC721Bridge,L1CrossDomainMessenger,L2OutputOracle,OptimismPortal,SuperchainConfig,SystemConfig l1Contracts; + class L1StandardBridge,L1ERC721Bridge,L1CrossDomainMessenger,OptimismPortal,SuperchainConfig,SystemConfig,DisputeGameFactory,FaultDisputeGame,DelayedWETH,AnchorStateRegistry l1Contracts; class BatchDataEOA l1EOA; - class Users userInt; - class Batcher,Proposer,Guardian systemUser; + class Users,Challengers userInt; + class Batcher,Guardian systemUser; class L2Nodes l2Nodes; ``` From b1dfa22a71732bd3b1a52722fd0ea4f314d58fc4 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Fri, 9 Aug 2024 12:51:25 -0700 Subject: [PATCH 43/59] fix(ctb): remove linked libraries from scripts and tests (#11426) * add additional address to exclude * chore: make public library methods internal * remove another public lib method * remove additional public lib methods * remove hardcoded assumption now that we know it's lib linking * style: forge fmt --- packages/contracts-bedrock/scripts/ForgeArtifacts.sol | 4 ++-- .../contracts-bedrock/src/cannon/libraries/MIPSSyscalls.sol | 2 +- .../contracts-bedrock/test/safe-tools/SafeTestTools.sol | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/contracts-bedrock/scripts/ForgeArtifacts.sol b/packages/contracts-bedrock/scripts/ForgeArtifacts.sol index 6731e9729a63..9886f9cd9bc0 100644 --- a/packages/contracts-bedrock/scripts/ForgeArtifacts.sol +++ b/packages/contracts-bedrock/scripts/ForgeArtifacts.sol @@ -54,7 +54,7 @@ library ForgeArtifacts { } /// @notice Returns the storage layout for a deployed contract. - function getStorageLayout(string memory _name) public returns (string memory layout_) { + function getStorageLayout(string memory _name) internal returns (string memory layout_) { string[] memory cmd = new string[](3); cmd[0] = Executables.bash; cmd[1] = "-c"; @@ -64,7 +64,7 @@ library ForgeArtifacts { } /// @notice Returns the abi from a the forge artifact - function getAbi(string memory _name) public returns (string memory abi_) { + function getAbi(string memory _name) internal returns (string memory abi_) { string[] memory cmd = new string[](3); cmd[0] = Executables.bash; cmd[1] = "-c"; diff --git a/packages/contracts-bedrock/src/cannon/libraries/MIPSSyscalls.sol b/packages/contracts-bedrock/src/cannon/libraries/MIPSSyscalls.sol index da15b3499586..1017f07f688d 100644 --- a/packages/contracts-bedrock/src/cannon/libraries/MIPSSyscalls.sol +++ b/packages/contracts-bedrock/src/cannon/libraries/MIPSSyscalls.sol @@ -99,7 +99,7 @@ library MIPSSyscalls { uint32 internal constant SCHED_QUANTUM = 100_000; /// @notice Start of the data segment. - uint32 public constant BRK_START = 0x40000000; + uint32 internal constant BRK_START = 0x40000000; // SYS_CLONE flags uint32 internal constant CLONE_VM = 0x100; diff --git a/packages/contracts-bedrock/test/safe-tools/SafeTestTools.sol b/packages/contracts-bedrock/test/safe-tools/SafeTestTools.sol index 1c5a505095a6..34386f5e3923 100644 --- a/packages/contracts-bedrock/test/safe-tools/SafeTestTools.sol +++ b/packages/contracts-bedrock/test/safe-tools/SafeTestTools.sol @@ -54,7 +54,7 @@ struct SafeInstance { library Sort { /// @dev Sorts an array of addresses in place - function sort(address[] memory arr) public pure returns (address[] memory) { + function sort(address[] memory arr) internal pure returns (address[] memory) { LibSort.sort(arr); return arr; } @@ -62,9 +62,9 @@ library Sort { library SafeTestLib { /// @dev The address of foundry's VM contract - address constant VM_ADDR = 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D; + address internal constant VM_ADDR = 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D; /// @dev The address of the first owner in the linked list of owners - address constant SENTINEL_OWNERS = address(0x1); + address internal constant SENTINEL_OWNERS = address(0x1); /// @dev Get the address from a private key function getAddr(uint256 pk) internal pure returns (address) { From 586e6626b3158f6291e276b4d6f04bb0076a1965 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Fri, 9 Aug 2024 14:50:11 -0700 Subject: [PATCH 44/59] add rationale to comment (#11429) --- packages/contracts-bedrock/scripts/L2Genesis.s.sol | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/contracts-bedrock/scripts/L2Genesis.s.sol b/packages/contracts-bedrock/scripts/L2Genesis.s.sol index f68dd6232882..cad18b0b02bd 100644 --- a/packages/contracts-bedrock/scripts/L2Genesis.s.sol +++ b/packages/contracts-bedrock/scripts/L2Genesis.s.sol @@ -186,7 +186,10 @@ contract L2Genesis is Deployer { /// The Proxy bytecode should be set. All proxied predeploys should have /// the 1967 admin slot set to the ProxyAdmin predeploy. All defined predeploys /// should have their implementations set. - /// Warning: the predeploy accounts have contract code, but 0 nonce value. + /// Warning: the predeploy accounts have contract code, but 0 nonce value, contrary + /// to the expected nonce of 1 per EIP-161. This is because the legacy go genesis + // script didn't set the nonce and we didn't want to change that behavior when + /// migrating genesis generation to Solidity. function setPredeployProxies() public { console.log("Setting Predeploy proxies"); bytes memory code = vm.getDeployedCode("Proxy.sol:Proxy"); From 261938e2a685af5a9b163b8fc54a7b0e893c5257 Mon Sep 17 00:00:00 2001 From: Sebastian Stammler Date: Sat, 10 Aug 2024 00:21:40 +0200 Subject: [PATCH 45/59] ci: manage versions in versions.json (#11415) * ci: manage versions in versions.json and optimize archive downloads to directly extract * ci: also pin just version --- .circleci/config.yml | 21 ++++++++++----------- versions.json | 5 ++++- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index acc32ae6dc20..4a2fc967519f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -432,9 +432,9 @@ jobs: - run: name: Sign command: | - git clone https://github.com/ethereum-optimism/binary_signer - cd binary_signer/signer - git checkout tags/v1.0.3 + VER=$(jq -r .binary_signer < versions.json) + wget -O - "https://github.com/ethereum-optimism/binary_signer/archive/refs/tags/v${VER}.tar.gz" | tar xz + cd "binary_signer-${VER}/signer" IMAGE_PATH="<>/<>/<>:<>" echo $IMAGE_PATH @@ -1091,19 +1091,17 @@ jobs: - run: name: Install latest golang command: | - wget https://go.dev/dl/go1.21.1.linux-amd64.tar.gz + VER=$(jq -r .go < versions.json) sudo rm -rf /usr/local/go - sudo tar -C /usr/local -xzf go1.21.1.linux-amd64.tar.gz + wget "https://go.dev/dl/go${VER}.linux-amd64.tar.gz" -O - | sudo tar -C /usr/local -xz export PATH=$PATH:/usr/local/go/bin go version - run: name: Install Geth command: | - wget https://gethstore.blob.core.windows.net/builds/geth-alltools-linux-amd64-1.13.14-2bd6bd01.tar.gz - # geth only provides md5 sums sadly - echo '76a04354dba9980fcbc35bece2957b30 geth-alltools-linux-amd64-1.13.14-2bd6bd01.tar.gz' | md5sum -c - - tar -xzvf geth-alltools-linux-amd64-1.13.14-2bd6bd01.tar.gz - sudo cp geth-alltools-linux-amd64-1.13.14-2bd6bd01/* /usr/local/bin + VER=$(jq -r .geth_release < versions.json) + wget "https://gethstore.blob.core.windows.net/builds/geth-alltools-linux-amd64-${VER}.tar.gz" -O - | tar xz + sudo cp "geth-alltools-linux-amd64-${VER}"/* /usr/local/bin - run: name: Install eth2-testnet-genesis command: | @@ -1120,7 +1118,8 @@ jobs: - run: name: Install Just command: | - curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --to $HOME/bin + VER=$(jq -r .just < versions.json) + curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --to $HOME/bin --tag "${VER}" echo 'export PATH="${PATH}:$HOME/bin"' >> $BASH_ENV - install-contracts-dependencies - attach_workspace: diff --git a/versions.json b/versions.json index 4ae8f8b5ffc0..82c0c4931cef 100644 --- a/versions.json +++ b/versions.json @@ -1,10 +1,13 @@ { + "go": "1.22.6", "abigen": "v1.10.25", "foundry": "626221f5ef44b4af950a08e09bd714650d9eb77d", "geth": "v1.14.7", + "geth_release": "1.14.7-aa55f5ea", "eth2_testnet_genesis": "v0.10.0", "nvm": "v20.9.0", "slither": "0.10.2", "kontrol": "0.1.316", - "just": "1.34.0" + "just": "1.34.0", + "binary_signer": "1.0.4" } From acd23f2eca54b01df2690579115d9c9ca2dd25f5 Mon Sep 17 00:00:00 2001 From: Adrian Sutton Date: Sat, 10 Aug 2024 08:35:54 +1000 Subject: [PATCH 46/59] cannon: Add support for --type mt to enable multithreaded cannon (#11411) * cannon: Add support for --type mt to enable multithreaded cannon * cannon: Rename vm type to cannon-mt --- Makefile | 6 ++++++ cannon/cmd/load_elf.go | 29 +++++++++++++++++++++++++++-- cannon/cmd/run.go | 39 ++++++++++++++++++++++----------------- cannon/cmd/vmtype.go | 29 +++++++++++++++++++++++++++++ cannon/cmd/witness.go | 22 +++++++++++++++++++--- 5 files changed, 103 insertions(+), 22 deletions(-) create mode 100644 cannon/cmd/vmtype.go diff --git a/Makefile b/Makefile index 08842b6feae1..4901e756936c 100644 --- a/Makefile +++ b/Makefile @@ -141,6 +141,12 @@ cannon-prestate: op-program cannon ## Generates prestate using cannon and op-pro mv op-program/bin/0.json op-program/bin/prestate-proof.json .PHONY: cannon-prestate +cannon-prestate-mt: op-program cannon ## Generates prestate using cannon and op-program in the multithreaded cannon format + ./cannon/bin/cannon load-elf --type mt --path op-program/bin/op-program-client.elf --out op-program/bin/prestate-mt.json --meta op-program/bin/meta-mt.json + ./cannon/bin/cannon run --type mt --proof-at '=0' --stop-at '=1' --input op-program/bin/prestate-mt.json --meta op-program/bin/meta-mt.json --proof-fmt 'op-program/bin/%d-mt.json' --output "" + mv op-program/bin/0-mt.json op-program/bin/prestate-proof-mt.json +.PHONY: cannon-prestate + mod-tidy: ## Cleans up unused dependencies in Go modules # Below GOPRIVATE line allows mod-tidy to be run immediately after # releasing new versions. This bypasses the Go modules proxy, which diff --git a/cannon/cmd/load_elf.go b/cannon/cmd/load_elf.go index f111d1a8831f..39e389ff23ca 100644 --- a/cannon/cmd/load_elf.go +++ b/cannon/cmd/load_elf.go @@ -4,6 +4,8 @@ import ( "debug/elf" "fmt" + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded" "github.com/urfave/cli/v2" "github.com/ethereum-optimism/optimism/cannon/mipsevm/program" @@ -39,6 +41,28 @@ var ( ) func LoadELF(ctx *cli.Context) error { + var createInitialState func(f *elf.File) (mipsevm.FPVMState, error) + var writeState func(path string, state mipsevm.FPVMState) error + + if vmType, err := vmTypeFromString(ctx); err != nil { + return err + } else if vmType == cannonVMType { + createInitialState = func(f *elf.File) (mipsevm.FPVMState, error) { + return program.LoadELF(f, singlethreaded.CreateInitialState) + } + writeState = func(path string, state mipsevm.FPVMState) error { + return jsonutil.WriteJSON[*singlethreaded.State](path, state.(*singlethreaded.State), OutFilePerm) + } + } else if vmType == mtVMType { + createInitialState = func(f *elf.File) (mipsevm.FPVMState, error) { + return program.LoadELF(f, multithreaded.CreateInitialState) + } + writeState = func(path string, state mipsevm.FPVMState) error { + return jsonutil.WriteJSON[*multithreaded.State](path, state.(*multithreaded.State), OutFilePerm) + } + } else { + return fmt.Errorf("invalid VM type: %q", vmType) + } elfPath := ctx.Path(LoadELFPathFlag.Name) elfProgram, err := elf.Open(elfPath) if err != nil { @@ -47,7 +71,7 @@ func LoadELF(ctx *cli.Context) error { if elfProgram.Machine != elf.EM_MIPS { return fmt.Errorf("ELF is not big-endian MIPS R3000, but got %q", elfProgram.Machine.String()) } - state, err := program.LoadELF(elfProgram, singlethreaded.CreateInitialState) + state, err := createInitialState(elfProgram) if err != nil { return fmt.Errorf("failed to load ELF data into VM state: %w", err) } @@ -71,7 +95,7 @@ func LoadELF(ctx *cli.Context) error { if err := jsonutil.WriteJSON[*program.Metadata](ctx.Path(LoadELFMetaFlag.Name), meta, OutFilePerm); err != nil { return fmt.Errorf("failed to output metadata: %w", err) } - return jsonutil.WriteJSON[*singlethreaded.State](ctx.Path(LoadELFOutFlag.Name), state, OutFilePerm) + return writeState(ctx.Path(LoadELFOutFlag.Name), state) } var LoadELFCommand = &cli.Command{ @@ -80,6 +104,7 @@ var LoadELFCommand = &cli.Command{ Description: "Load ELF file into Cannon JSON state, optionally patch out functions", Action: LoadELF, Flags: []cli.Flag{ + VMTypeFlag, LoadELFPathFlag, LoadELFPatchFlag, LoadELFOutFlag, diff --git a/cannon/cmd/run.go b/cannon/cmd/run.go index 22addbf3eb1c..23b6e1b75719 100644 --- a/cannon/cmd/run.go +++ b/cannon/cmd/run.go @@ -10,6 +10,7 @@ import ( "strings" "time" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/log" @@ -24,13 +25,6 @@ import ( ) var ( - RunType = &cli.StringFlag{ - Name: "type", - Usage: "VM type to run. Options are 'cannon' (default)", - Value: "cannon", - // TODO(client-pod#903): This should be required once we have additional vm types - Required: false, - } RunInputFlag = &cli.PathFlag{ Name: "input", Usage: "path of input JSON state. Stdin if left empty.", @@ -258,20 +252,14 @@ func Guard(proc *os.ProcessState, fn StepFn) StepFn { var _ mipsevm.PreimageOracle = (*ProcessPreimageOracle)(nil) -type VMType string - -var cannonVMType VMType = "cannon" - func Run(ctx *cli.Context) error { if ctx.Bool(RunPProfCPU.Name) { defer profile.Start(profile.NoShutdownHook, profile.ProfilePath("."), profile.CPUProfile).Stop() } - var vmType VMType - if vmTypeStr := ctx.String(RunType.Name); vmTypeStr == string(cannonVMType) { - vmType = cannonVMType - } else { - return fmt.Errorf("unknown VM type %q", vmType) + vmType, err := vmTypeFromString(ctx) + if err != nil { + return err } guestLogger := Logger(os.Stderr, log.LevelInfo) @@ -366,6 +354,7 @@ func Run(ctx *cli.Context) error { var vm mipsevm.FPVM var debugProgram bool if vmType == cannonVMType { + l.Info("Using cannon VM") cannon, err := singlethreaded.NewInstrumentedStateFromFile(ctx.Path(RunInputFlag.Name), po, outLog, errLog, meta) if err != nil { return err @@ -380,6 +369,22 @@ func Run(ctx *cli.Context) error { } } vm = cannon + } else if vmType == mtVMType { + l.Info("Using cannon multithreaded VM") + cannon, err := multithreaded.NewInstrumentedStateFromFile(ctx.Path(RunInputFlag.Name), po, outLog, errLog, l) + if err != nil { + return err + } + debugProgram = ctx.Bool(RunDebugFlag.Name) + if debugProgram { + if metaPath := ctx.Path(RunMetaFlag.Name); metaPath == "" { + return fmt.Errorf("cannot enable debug mode without a metadata file") + } + if err := cannon.InitDebug(meta); err != nil { + return fmt.Errorf("failed to initialize debug mode: %w", err) + } + } + vm = cannon } else { return fmt.Errorf("unknown VM type %q", vmType) } @@ -503,7 +508,7 @@ var RunCommand = &cli.Command{ Description: "Run VM step(s) and generate proof data to replicate onchain. See flags to match when to output a proof, a snapshot, or to stop early.", Action: Run, Flags: []cli.Flag{ - RunType, + VMTypeFlag, RunInputFlag, RunOutputFlag, RunProofAtFlag, diff --git a/cannon/cmd/vmtype.go b/cannon/cmd/vmtype.go new file mode 100644 index 000000000000..0efc22370c94 --- /dev/null +++ b/cannon/cmd/vmtype.go @@ -0,0 +1,29 @@ +package cmd + +import ( + "fmt" + + "github.com/urfave/cli/v2" +) + +type VMType string + +var cannonVMType VMType = "cannon" +var mtVMType VMType = "cannon-mt" + +var VMTypeFlag = &cli.StringFlag{ + Name: "type", + Usage: "VM type to create state for. Options are 'cannon' (default), 'cannon-mt'", + Value: "cannon", + Required: false, +} + +func vmTypeFromString(ctx *cli.Context) (VMType, error) { + if vmTypeStr := ctx.String(VMTypeFlag.Name); vmTypeStr == string(cannonVMType) { + return cannonVMType, nil + } else if vmTypeStr == string(mtVMType) { + return mtVMType, nil + } else { + return "", fmt.Errorf("unknown VM type %q", vmTypeStr) + } +} diff --git a/cannon/cmd/witness.go b/cannon/cmd/witness.go index 656684b691e9..eda5fbca5fa0 100644 --- a/cannon/cmd/witness.go +++ b/cannon/cmd/witness.go @@ -4,6 +4,8 @@ import ( "fmt" "os" + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded" "github.com/urfave/cli/v2" "github.com/ethereum-optimism/optimism/cannon/mipsevm/singlethreaded" @@ -27,10 +29,23 @@ var ( func Witness(ctx *cli.Context) error { input := ctx.Path(WitnessInputFlag.Name) output := ctx.Path(WitnessOutputFlag.Name) - state, err := jsonutil.LoadJSON[singlethreaded.State](input) - if err != nil { - return fmt.Errorf("invalid input state (%v): %w", input, err) + var state mipsevm.FPVMState + if vmType, err := vmTypeFromString(ctx); err != nil { + return err + } else if vmType == cannonVMType { + state, err = jsonutil.LoadJSON[singlethreaded.State](input) + if err != nil { + return fmt.Errorf("invalid input state (%v): %w", input, err) + } + } else if vmType == mtVMType { + state, err = jsonutil.LoadJSON[multithreaded.State](input) + if err != nil { + return fmt.Errorf("invalid input state (%v): %w", input, err) + } + } else { + return fmt.Errorf("invalid VM type: %q", vmType) } + witness, h := state.EncodeWitness() if output != "" { if err := os.WriteFile(output, witness, 0755); err != nil { @@ -47,6 +62,7 @@ var WitnessCommand = &cli.Command{ Description: "Convert a Cannon JSON state into a binary witness. The hash of the witness is written to stdout", Action: Witness, Flags: []cli.Flag{ + VMTypeFlag, WitnessInputFlag, WitnessOutputFlag, }, From d098cf8c9a7cb6c7d12625f645bb939859123362 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Aug 2024 22:40:27 +0000 Subject: [PATCH 47/59] dependabot(gomod): bump golang.org/x/crypto from 0.25.0 to 0.26.0 (#11373) * dependabot(gomod): bump golang.org/x/crypto from 0.25.0 to 0.26.0 Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.25.0 to 0.26.0. - [Commits](https://github.com/golang/crypto/compare/v0.25.0...v0.26.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * deps: update --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mark Tyneway --- cannon/testdata/example/alloc/go.mod | 4 ++-- cannon/testdata/example/alloc/go.sum | 16 ++++++++-------- cannon/testdata/example/claim/go.mod | 4 ++-- cannon/testdata/example/claim/go.sum | 16 ++++++++-------- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 6 files changed, 32 insertions(+), 32 deletions(-) diff --git a/cannon/testdata/example/alloc/go.mod b/cannon/testdata/example/alloc/go.mod index 5ead2ebe8af6..a69b250b40af 100644 --- a/cannon/testdata/example/alloc/go.mod +++ b/cannon/testdata/example/alloc/go.mod @@ -7,8 +7,8 @@ toolchain go1.21.1 require github.com/ethereum-optimism/optimism v0.0.0 require ( - golang.org/x/crypto v0.25.0 // indirect - golang.org/x/sys v0.22.0 // indirect + golang.org/x/crypto v0.26.0 // indirect + golang.org/x/sys v0.23.0 // indirect ) replace github.com/ethereum-optimism/optimism v0.0.0 => ../../../.. diff --git a/cannon/testdata/example/alloc/go.sum b/cannon/testdata/example/alloc/go.sum index 5b5d4a3a6411..18c7fa264e65 100644 --- a/cannon/testdata/example/alloc/go.sum +++ b/cannon/testdata/example/alloc/go.sum @@ -1,12 +1,12 @@ -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= -golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= +golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= +golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= +golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/cannon/testdata/example/claim/go.mod b/cannon/testdata/example/claim/go.mod index dfbd45f6f57c..ae511e9626f4 100644 --- a/cannon/testdata/example/claim/go.mod +++ b/cannon/testdata/example/claim/go.mod @@ -7,8 +7,8 @@ toolchain go1.21.1 require github.com/ethereum-optimism/optimism v0.0.0 require ( - golang.org/x/crypto v0.25.0 // indirect - golang.org/x/sys v0.22.0 // indirect + golang.org/x/crypto v0.26.0 // indirect + golang.org/x/sys v0.23.0 // indirect ) replace github.com/ethereum-optimism/optimism v0.0.0 => ../../../.. diff --git a/cannon/testdata/example/claim/go.sum b/cannon/testdata/example/claim/go.sum index 5b5d4a3a6411..18c7fa264e65 100644 --- a/cannon/testdata/example/claim/go.sum +++ b/cannon/testdata/example/claim/go.sum @@ -1,12 +1,12 @@ -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= -golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= +golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= +golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= +golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/go.mod b/go.mod index 7914ba567f40..e4c54d456e09 100644 --- a/go.mod +++ b/go.mod @@ -42,10 +42,10 @@ require ( github.com/protolambda/ctxlock v0.1.0 github.com/stretchr/testify v1.9.0 github.com/urfave/cli/v2 v2.27.3 - golang.org/x/crypto v0.25.0 + golang.org/x/crypto v0.26.0 golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 golang.org/x/sync v0.8.0 - golang.org/x/term v0.22.0 + golang.org/x/term v0.23.0 golang.org/x/time v0.6.0 ) @@ -222,8 +222,8 @@ require ( go.uber.org/zap v1.27.0 // indirect golang.org/x/mod v0.19.0 // indirect golang.org/x/net v0.27.0 // indirect - golang.org/x/sys v0.22.0 // indirect - golang.org/x/text v0.16.0 // indirect + golang.org/x/sys v0.23.0 // indirect + golang.org/x/text v0.17.0 // indirect golang.org/x/tools v0.23.0 // indirect google.golang.org/protobuf v1.34.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect diff --git a/go.sum b/go.sum index c46caed5aed5..9db642d8ab04 100644 --- a/go.sum +++ b/go.sum @@ -822,8 +822,8 @@ golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98y golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= -golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= +golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= +golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= @@ -954,8 +954,8 @@ golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= +golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -967,8 +967,8 @@ golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= -golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= -golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= +golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU= +golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -982,8 +982,8 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 773e476b18ed6004aa7dade19a55519deb188942 Mon Sep 17 00:00:00 2001 From: Axel Kingsley Date: Fri, 9 Aug 2024 17:46:55 -0500 Subject: [PATCH 48/59] op-supervisor: Include executing message info when storing logs. (#11369) * Rebase: op-supervisor: Include executing message info when storing logs. Takes from aj/parse-exec-msg and makes the following updates: - uses upstream ABI definitions for identifier hash - removes the core recording functionality for the moment - fixes up inconsistent typing and merge conflicts due to rearranged packages * Incorporate new ABI format * remove trailing newline in contract --------- Co-authored-by: Adrian Sutton --- .../backend/source/contracts/l2inbox.go | 134 ++++++++++++++++++ .../backend/source/contracts/l2inbox_test.go | 75 ++++++++++ .../backend/source/log_processor.go | 70 +++++++-- .../backend/source/log_processor_test.go | 71 ++++++++-- op-supervisor/supervisor/types/types.go | 17 ++- op-supervisor/supervisor/types/types_test.go | 4 +- 6 files changed, 341 insertions(+), 30 deletions(-) create mode 100644 op-supervisor/supervisor/backend/source/contracts/l2inbox.go create mode 100644 op-supervisor/supervisor/backend/source/contracts/l2inbox_test.go diff --git a/op-supervisor/supervisor/backend/source/contracts/l2inbox.go b/op-supervisor/supervisor/backend/source/contracts/l2inbox.go new file mode 100644 index 000000000000..b490b612e6c6 --- /dev/null +++ b/op-supervisor/supervisor/backend/source/contracts/l2inbox.go @@ -0,0 +1,134 @@ +package contracts + +import ( + "bytes" + "errors" + "fmt" + "io" + "math/big" + + "github.com/ethereum-optimism/optimism/op-service/predeploys" + "github.com/ethereum-optimism/optimism/op-service/solabi" + "github.com/ethereum-optimism/optimism/op-service/sources/batching" + backendTypes "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/types" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" + "github.com/ethereum-optimism/optimism/packages/contracts-bedrock/snapshots" + "github.com/ethereum/go-ethereum/common" + ethTypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" +) + +const ( + eventExecutingMessage = "ExecutingMessage" +) + +var ( + ErrEventNotFound = errors.New("event not found") +) + +type contractIdentifier struct { + // Origin represents the address that initiated the message + // it is used in combination with the MsgHash to uniquely identify a message + // and is hashed into the log hash, not stored directly. + Origin common.Address + LogIndex *big.Int + BlockNumber *big.Int + ChainId *big.Int + Timestamp *big.Int +} + +type CrossL2Inbox struct { + contract *batching.BoundContract +} + +func NewCrossL2Inbox() *CrossL2Inbox { + abi := snapshots.LoadCrossL2InboxABI() + return &CrossL2Inbox{ + contract: batching.NewBoundContract(abi, predeploys.CrossL2InboxAddr), + } +} + +func (i *CrossL2Inbox) DecodeExecutingMessageLog(l *ethTypes.Log) (backendTypes.ExecutingMessage, error) { + if l.Address != i.contract.Addr() { + return backendTypes.ExecutingMessage{}, fmt.Errorf("%w: log not from CrossL2Inbox", ErrEventNotFound) + } + // use DecodeEvent to check the name of the event + // but the actual decoding is done manually to extract the contract identifier + name, _, err := i.contract.DecodeEvent(l) + if errors.Is(err, batching.ErrUnknownEvent) { + return backendTypes.ExecutingMessage{}, fmt.Errorf("%w: %v", ErrEventNotFound, err.Error()) + } else if err != nil { + return backendTypes.ExecutingMessage{}, fmt.Errorf("failed to decode event: %w", err) + } + if name != eventExecutingMessage { + return backendTypes.ExecutingMessage{}, fmt.Errorf("%w: event %v not an ExecutingMessage event", ErrEventNotFound, name) + } + // the second topic is the hash of the payload (the first is the event ID) + msgHash := l.Topics[1] + // the first 32 bytes of the data are the msgHash, so we skip them + identifierBytes := bytes.NewReader(l.Data[32:]) + identifier, err := identifierFromBytes(identifierBytes) + if err != nil { + return backendTypes.ExecutingMessage{}, fmt.Errorf("failed to read contract identifier: %w", err) + } + chainID, err := types.ChainIDFromBig(identifier.ChainId).ToUInt32() + if err != nil { + return backendTypes.ExecutingMessage{}, fmt.Errorf("failed to convert chain ID %v to uint32: %w", identifier.ChainId, err) + } + hash := payloadHashToLogHash(msgHash, identifier.Origin) + return backendTypes.ExecutingMessage{ + Chain: chainID, + Hash: hash, + BlockNum: identifier.BlockNumber.Uint64(), + LogIdx: uint32(identifier.LogIndex.Uint64()), + Timestamp: identifier.Timestamp.Uint64(), + }, nil +} + +// identifierFromBytes reads a contract identifier from a byte stream. +// it follows the spec and matches the CrossL2Inbox.json definition, +// rather than relying on reflection, as that can be error-prone regarding struct ordering +func identifierFromBytes(identifierBytes io.Reader) (contractIdentifier, error) { + origin, err := solabi.ReadAddress(identifierBytes) + if err != nil { + return contractIdentifier{}, fmt.Errorf("failed to read origin address: %w", err) + } + originAddr := common.BytesToAddress(origin[:]) + blockNumber, err := solabi.ReadUint256(identifierBytes) + if err != nil { + return contractIdentifier{}, fmt.Errorf("failed to read block number: %w", err) + } + logIndex, err := solabi.ReadUint256(identifierBytes) + if err != nil { + return contractIdentifier{}, fmt.Errorf("failed to read log index: %w", err) + } + timestamp, err := solabi.ReadUint256(identifierBytes) + if err != nil { + return contractIdentifier{}, fmt.Errorf("failed to read timestamp: %w", err) + } + chainID, err := solabi.ReadUint256(identifierBytes) + if err != nil { + return contractIdentifier{}, fmt.Errorf("failed to read chain ID: %w", err) + } + return contractIdentifier{ + Origin: originAddr, + BlockNumber: blockNumber, + LogIndex: logIndex, + Timestamp: timestamp, + ChainId: chainID, + }, nil +} + +// payloadHashToLogHash converts the payload hash to the log hash +// it is the concatenation of the log's address and the hash of the log's payload, +// which is then hashed again. This is the hash that is stored in the log storage. +// The logHash can then be used to traverse from the executing message +// to the log the referenced initiating message. +// TODO: this function is duplicated between contracts and backend/source/log_processor.go +// to avoid a circular dependency. It should be reorganized to avoid this duplication. +func payloadHashToLogHash(payloadHash common.Hash, addr common.Address) backendTypes.TruncatedHash { + msg := make([]byte, 0, 2*common.HashLength) + msg = append(msg, addr.Bytes()...) + msg = append(msg, payloadHash.Bytes()...) + return backendTypes.TruncateHash(crypto.Keccak256Hash(msg)) +} diff --git a/op-supervisor/supervisor/backend/source/contracts/l2inbox_test.go b/op-supervisor/supervisor/backend/source/contracts/l2inbox_test.go new file mode 100644 index 000000000000..b343519a48fc --- /dev/null +++ b/op-supervisor/supervisor/backend/source/contracts/l2inbox_test.go @@ -0,0 +1,75 @@ +package contracts + +import ( + "bytes" + "math/big" + "testing" + + "github.com/ethereum-optimism/optimism/op-service/predeploys" + "github.com/ethereum-optimism/optimism/op-service/sources/batching" + backendTypes "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/types" + "github.com/ethereum-optimism/optimism/packages/contracts-bedrock/snapshots" + "github.com/ethereum/go-ethereum/common" + ethTypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/stretchr/testify/require" +) + +func TestDecodeExecutingMessageEvent(t *testing.T) { + inbox := NewCrossL2Inbox() + payload := bytes.Repeat([]byte{0xaa, 0xbb}, 50) + payloadHash := crypto.Keccak256Hash(payload) + expected := backendTypes.ExecutingMessage{ + Chain: 42424, + BlockNum: 12345, + LogIdx: 98, + Timestamp: 9578295, + } + contractIdent := contractIdentifier{ + Origin: common.Address{0xbb, 0xcc}, + ChainId: new(big.Int).SetUint64(uint64(expected.Chain)), + BlockNumber: new(big.Int).SetUint64(expected.BlockNum), + Timestamp: new(big.Int).SetUint64(expected.Timestamp), + LogIndex: new(big.Int).SetUint64(uint64(expected.LogIdx)), + } + expected.Hash = payloadHashToLogHash(payloadHash, contractIdent.Origin) + abi := snapshots.LoadCrossL2InboxABI() + validData, err := abi.Events[eventExecutingMessage].Inputs.Pack(payloadHash, contractIdent) + require.NoError(t, err) + createValidLog := func() *ethTypes.Log { + //protoHack := bytes.Repeat([]byte{0x00}, 32*5) + return ðTypes.Log{ + Address: predeploys.CrossL2InboxAddr, + Topics: []common.Hash{abi.Events[eventExecutingMessage].ID, payloadHash}, + Data: validData, + } + } + + t.Run("ParseValid", func(t *testing.T) { + l := createValidLog() + result, err := inbox.DecodeExecutingMessageLog(l) + require.NoError(t, err) + require.Equal(t, expected, result) + }) + + t.Run("IgnoreIncorrectContract", func(t *testing.T) { + l := createValidLog() + l.Address = common.Address{0xff} + _, err := inbox.DecodeExecutingMessageLog(l) + require.ErrorIs(t, err, ErrEventNotFound) + }) + + t.Run("IgnoreWrongEvent", func(t *testing.T) { + l := createValidLog() + l.Topics[0] = common.Hash{0xbb} + _, err := inbox.DecodeExecutingMessageLog(l) + require.ErrorIs(t, err, ErrEventNotFound) + }) + + t.Run("ErrorOnInvalidEvent", func(t *testing.T) { + l := createValidLog() + l.Data = []byte{0xbb, 0xcc} + _, err := inbox.DecodeExecutingMessageLog(l) + require.ErrorIs(t, err, batching.ErrInvalidEvent) + }) +} diff --git a/op-supervisor/supervisor/backend/source/log_processor.go b/op-supervisor/supervisor/backend/source/log_processor.go index 3fa513588d30..3fd96476d41f 100644 --- a/op-supervisor/supervisor/backend/source/log_processor.go +++ b/op-supervisor/supervisor/backend/source/log_processor.go @@ -2,10 +2,12 @@ package source import ( "context" + "errors" "fmt" "github.com/ethereum-optimism/optimism/op-service/eth" - "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/types" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/source/contracts" + backendTypes "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/types" supTypes "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" "github.com/ethereum/go-ethereum/common" ethTypes "github.com/ethereum/go-ethereum/core/types" @@ -13,23 +15,46 @@ import ( ) type LogStorage interface { - AddLog(chain supTypes.ChainID, logHash types.TruncatedHash, block eth.BlockID, timestamp uint64, logIdx uint32, execMsg *types.ExecutingMessage) error + AddLog(chain supTypes.ChainID, logHash backendTypes.TruncatedHash, block eth.BlockID, timestamp uint64, logIdx uint32, execMsg *backendTypes.ExecutingMessage) error +} + +type EventDecoder interface { + DecodeExecutingMessageLog(log *ethTypes.Log) (backendTypes.ExecutingMessage, error) } type logProcessor struct { - chain supTypes.ChainID - logStore LogStorage + chain supTypes.ChainID + logStore LogStorage + eventDecoder EventDecoder } func newLogProcessor(chain supTypes.ChainID, logStore LogStorage) *logProcessor { - return &logProcessor{chain: chain, logStore: logStore} + return &logProcessor{ + chain: chain, + logStore: logStore, + eventDecoder: contracts.NewCrossL2Inbox(), + } } +// ProcessLogs processes logs from a block and stores them in the log storage +// for any logs that are related to executing messages, they are decoded and stored func (p *logProcessor) ProcessLogs(_ context.Context, block eth.L1BlockRef, rcpts ethTypes.Receipts) error { for _, rcpt := range rcpts { for _, l := range rcpt.Logs { - logHash := logToHash(l) - err := p.logStore.AddLog(p.chain, logHash, block.ID(), block.Time, uint32(l.Index), nil) + // log hash represents the hash of *this* log as a potentially initiating message + logHash := logToLogHash(l) + var execMsg *backendTypes.ExecutingMessage + msg, err := p.eventDecoder.DecodeExecutingMessageLog(l) + if err != nil && !errors.Is(err, contracts.ErrEventNotFound) { + return fmt.Errorf("failed to decode executing message log: %w", err) + } else if err == nil { + // if the log is an executing message, store the message + execMsg = &msg + } + // executing messages have multiple entries in the database + // they should start with the initiating message and then include the execution + fmt.Println("p.chain", p.chain) + err = p.logStore.AddLog(p.chain, logHash, block.ID(), block.Time, uint32(l.Index), execMsg) if err != nil { return fmt.Errorf("failed to add log %d from block %v: %w", l.Index, block.ID(), err) } @@ -38,15 +63,20 @@ func (p *logProcessor) ProcessLogs(_ context.Context, block eth.L1BlockRef, rcpt return nil } -func logToHash(l *ethTypes.Log) types.TruncatedHash { - payloadHash := crypto.Keccak256(logToPayload(l)) - msg := make([]byte, 0, 2*common.HashLength) - msg = append(msg, l.Address.Bytes()...) - msg = append(msg, payloadHash...) - return types.TruncateHash(crypto.Keccak256Hash(msg)) +// logToLogHash transforms a log into a hash that represents the log. +// it is the concatenation of the log's address and the hash of the log's payload, +// which is then hashed again. This is the hash that is stored in the log storage. +// The address is hashed into the payload hash to save space in the log storage, +// and because they represent paired data. +func logToLogHash(l *ethTypes.Log) backendTypes.TruncatedHash { + payloadHash := crypto.Keccak256(logToMessagePayload(l)) + return payloadHashToLogHash(common.Hash(payloadHash), l.Address) } -func logToPayload(l *ethTypes.Log) []byte { +// logToMessagePayload is the data that is hashed to get the logHash +// it is the concatenation of the log's topics and data +// the implementation is based on the interop messaging spec +func logToMessagePayload(l *ethTypes.Log) []byte { msg := make([]byte, 0) for _, topic := range l.Topics { msg = append(msg, topic.Bytes()...) @@ -54,3 +84,15 @@ func logToPayload(l *ethTypes.Log) []byte { msg = append(msg, l.Data...) return msg } + +// payloadHashToLogHash converts the payload hash to the log hash +// it is the concatenation of the log's address and the hash of the log's payload, +// which is then hashed. This is the hash that is stored in the log storage. +// The logHash can then be used to traverse from the executing message +// to the log the referenced initiating message. +func payloadHashToLogHash(payloadHash common.Hash, addr common.Address) backendTypes.TruncatedHash { + msg := make([]byte, 0, 2*common.HashLength) + msg = append(msg, addr.Bytes()...) + msg = append(msg, payloadHash.Bytes()...) + return backendTypes.TruncateHash(crypto.Keccak256Hash(msg)) +} diff --git a/op-supervisor/supervisor/backend/source/log_processor_test.go b/op-supervisor/supervisor/backend/source/log_processor_test.go index f83fea250784..5c65973ab4e4 100644 --- a/op-supervisor/supervisor/backend/source/log_processor_test.go +++ b/op-supervisor/supervisor/backend/source/log_processor_test.go @@ -6,7 +6,8 @@ import ( "testing" "github.com/ethereum-optimism/optimism/op-service/eth" - "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/types" + "github.com/ethereum-optimism/optimism/op-service/predeploys" + backendTypes "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/types" supTypes "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" "github.com/ethereum/go-ethereum/common" ethTypes "github.com/ethereum/go-ethereum/core/types" @@ -63,26 +64,66 @@ func TestLogProcessor(t *testing.T) { block: block1.ID(), timestamp: block1.Time, logIdx: 0, - logHash: logToHash(rcpts[0].Logs[0]), + logHash: logToLogHash(rcpts[0].Logs[0]), execMsg: nil, }, { block: block1.ID(), timestamp: block1.Time, logIdx: 0, - logHash: logToHash(rcpts[0].Logs[1]), + logHash: logToLogHash(rcpts[0].Logs[1]), execMsg: nil, }, { block: block1.ID(), timestamp: block1.Time, logIdx: 0, - logHash: logToHash(rcpts[1].Logs[0]), + logHash: logToLogHash(rcpts[1].Logs[0]), execMsg: nil, }, } require.Equal(t, expected, store.logs) }) + + t.Run("IncludeExecutingMessage", func(t *testing.T) { + rcpts := ethTypes.Receipts{ + { + Logs: []*ethTypes.Log{ + { + Address: predeploys.CrossL2InboxAddr, + Topics: []common.Hash{}, + Data: []byte{0xff}, + }, + }, + }, + } + execMsg := backendTypes.ExecutingMessage{ + Chain: 4, + BlockNum: 6, + LogIdx: 8, + Timestamp: 10, + Hash: backendTypes.TruncatedHash{0xaa}, + } + store := &stubLogStorage{} + processor := newLogProcessor(supTypes.ChainID{4}, store) + processor.eventDecoder = EventDecoderFn(func(l *ethTypes.Log) (backendTypes.ExecutingMessage, error) { + require.Equal(t, rcpts[0].Logs[0], l) + return execMsg, nil + }) + + err := processor.ProcessLogs(ctx, block1, rcpts) + require.NoError(t, err) + expected := []storedLog{ + { + block: block1.ID(), + timestamp: block1.Time, + logIdx: 0, + logHash: logToLogHash(rcpts[0].Logs[0]), + execMsg: &execMsg, + }, + } + require.Equal(t, expected, store.logs) + }) } func TestToLogHash(t *testing.T) { @@ -119,24 +160,24 @@ func TestToLogHash(t *testing.T) { func(l *ethTypes.Log) { l.Index = 98 }, func(l *ethTypes.Log) { l.Removed = true }, } - refHash := logToHash(mkLog()) + refHash := logToLogHash(mkLog()) // The log hash is stored in the database so test that it matches the actual value. - // If this changes compatibility with existing databases may be affected - expectedRefHash := types.TruncateHash(common.HexToHash("0x4e1dc08fddeb273275f787762cdfe945cf47bb4e80a1fabbc7a825801e81b73f")) + // If this changes, compatibility with existing databases may be affected + expectedRefHash := backendTypes.TruncateHash(common.HexToHash("0x4e1dc08fddeb273275f787762cdfe945cf47bb4e80a1fabbc7a825801e81b73f")) require.Equal(t, expectedRefHash, refHash, "reference hash changed, check that database compatibility is not broken") // Check that the hash is changed when any data it should include changes for i, mod := range relevantMods { l := mkLog() mod(l) - hash := logToHash(l) + hash := logToLogHash(l) require.NotEqualf(t, refHash, hash, "expected relevant modification %v to affect the hash but it did not", i) } // Check that the hash is not changed when any data it should not include changes for i, mod := range irrelevantMods { l := mkLog() mod(l) - hash := logToHash(l) + hash := logToLogHash(l) require.Equal(t, refHash, hash, "expected irrelevant modification %v to not affect the hash but it did", i) } } @@ -145,7 +186,7 @@ type stubLogStorage struct { logs []storedLog } -func (s *stubLogStorage) AddLog(chainID supTypes.ChainID, logHash types.TruncatedHash, block eth.BlockID, timestamp uint64, logIdx uint32, execMsg *types.ExecutingMessage) error { +func (s *stubLogStorage) AddLog(chainID supTypes.ChainID, logHash backendTypes.TruncatedHash, block eth.BlockID, timestamp uint64, logIdx uint32, execMsg *backendTypes.ExecutingMessage) error { if logProcessorChainID != chainID { return fmt.Errorf("chain id mismatch, expected %v but got %v", logProcessorChainID, chainID) } @@ -163,6 +204,12 @@ type storedLog struct { block eth.BlockID timestamp uint64 logIdx uint32 - logHash types.TruncatedHash - execMsg *types.ExecutingMessage + logHash backendTypes.TruncatedHash + execMsg *backendTypes.ExecutingMessage +} + +type EventDecoderFn func(*ethTypes.Log) (backendTypes.ExecutingMessage, error) + +func (f EventDecoderFn) DecodeExecutingMessageLog(log *ethTypes.Log) (backendTypes.ExecutingMessage, error) { + return f(log) } diff --git a/op-supervisor/supervisor/types/types.go b/op-supervisor/supervisor/types/types.go index 7e39628bdcf5..41d66611c20f 100644 --- a/op-supervisor/supervisor/types/types.go +++ b/op-supervisor/supervisor/types/types.go @@ -4,6 +4,7 @@ import ( "encoding/json" "errors" "fmt" + "math" "math/big" "github.com/holiman/uint256" @@ -17,7 +18,7 @@ type Identifier struct { BlockNumber uint64 LogIndex uint64 Timestamp uint64 - ChainID uint256.Int // flat, not a pointer, to make Identifier safe as map key + ChainID ChainID // flat, not a pointer, to make Identifier safe as map key } type identifierMarshaling struct { @@ -47,7 +48,7 @@ func (id *Identifier) UnmarshalJSON(input []byte) error { id.BlockNumber = uint64(dec.BlockNumber) id.LogIndex = uint64(dec.LogIndex) id.Timestamp = uint64(dec.Timestamp) - id.ChainID = (uint256.Int)(dec.ChainID) + id.ChainID = (ChainID)(dec.ChainID) return nil } @@ -102,3 +103,15 @@ func ChainIDFromUInt64(i uint64) ChainID { func (id ChainID) String() string { return ((*uint256.Int)(&id)).Dec() } + +func (id ChainID) ToUInt32() (uint32, error) { + v := (*uint256.Int)(&id) + if !v.IsUint64() { + return 0, fmt.Errorf("ChainID too large for uint32: %v", id) + } + v64 := v.Uint64() + if v64 > math.MaxUint32 { + return 0, fmt.Errorf("ChainID too large for uint32: %v", id) + } + return uint32(v64), nil +} diff --git a/op-supervisor/supervisor/types/types_test.go b/op-supervisor/supervisor/types/types_test.go index f089a25665fa..50c856bdc794 100644 --- a/op-supervisor/supervisor/types/types_test.go +++ b/op-supervisor/supervisor/types/types_test.go @@ -3,6 +3,7 @@ package types import ( "encoding/json" "math" + "math/big" "testing" "github.com/stretchr/testify/require" @@ -22,9 +23,8 @@ func FuzzRoundtripIdentifierJSONMarshal(f *testing.F) { BlockNumber: blockNumber, LogIndex: logIndex, Timestamp: timestamp, - ChainID: uint256.Int{}, + ChainID: ChainIDFromBig(new(big.Int).SetBytes(chainID)), } - id.ChainID.SetBytes(chainID) raw, err := json.Marshal(&id) require.NoError(t, err) From 5a4fbce2bc780a908afeab255513aa38ca3c49b8 Mon Sep 17 00:00:00 2001 From: smartcontracts Date: Sat, 10 Aug 2024 09:32:39 -0400 Subject: [PATCH 49/59] fix: minor error in contracts readme (#11432) --- packages/contracts-bedrock/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/contracts-bedrock/README.md b/packages/contracts-bedrock/README.md index 2e01cc360676..132042e8dc3e 100644 --- a/packages/contracts-bedrock/README.md +++ b/packages/contracts-bedrock/README.md @@ -251,7 +251,7 @@ graph LR OP Stack smart contracts are published to NPM and can be installed via: ```sh -npm install @eth-optimism/contracts-bedrock. +npm install @eth-optimism/contracts-bedrock ``` Refer to the [Optimism Developer Docs](https://docs.optimism.io/builders/dapp-developers/contracts/system-contracts#using-system-contracts-in-solidity) for additional information about how to use this package. From 5c8ebef990ca327470858ae245c6d0869ef2458c Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Tue, 13 Aug 2024 00:47:14 +1000 Subject: [PATCH 50/59] Don't recheck terminal type for color (#11412) Not necessary as it's checked further up the call tree. Without this --log.color doesn't work when intended. --- op-service/log/cli.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/op-service/log/cli.go b/op-service/log/cli.go index 2bd3c693009b..b51a48930b42 100644 --- a/op-service/log/cli.go +++ b/op-service/log/cli.go @@ -140,7 +140,7 @@ func FormatHandler(ft FormatType, color bool) func(io.Writer) slog.Handler { case FormatJSON: return log.JSONHandler case FormatText: - if term.IsTerminal(int(os.Stdout.Fd())) { + if color { return termColorHandler } else { return logfmtHandler From 995ddcfb4a6e6ffd806169686690fa0e8aabfbee Mon Sep 17 00:00:00 2001 From: smartcontracts Date: Mon, 12 Aug 2024 15:32:52 -0400 Subject: [PATCH 51/59] maint: further clean up contract scripts organization (#11434) Scripts within contracts-bedrock are all over the place. Relatively minor PR that moves things around into a cleaner folder structure. Scripts themselves are unchanged. --- packages/contracts-bedrock/justfile | 4 ++-- packages/contracts-bedrock/scripts/Artifacts.s.sol | 8 ++++---- packages/contracts-bedrock/scripts/L2Genesis.s.sol | 2 +- .../scripts/{ => autogen}/SemverLock.s.sol | 0 .../scripts/{ => deploy}/ChainAssertions.sol | 2 +- packages/contracts-bedrock/scripts/deploy/Deploy.s.sol | 10 +++++----- .../scripts/deploy/DeployConfig.s.sol | 6 +++--- packages/contracts-bedrock/scripts/deploy/Deployer.sol | 4 ++-- .../scripts/{ => fpac/viz}/FaultDisputeGameViz.s.sol | 0 .../scripts/{ => fpac/viz}/dag-viz.py | 0 .../scripts/{ => fpac/viz}/visualize.sh | 2 +- .../scripts/{ => libraries}/Chains.sol | 0 .../scripts/{ => libraries}/Config.sol | 0 .../scripts/{ => libraries}/Executables.sol | 0 .../scripts/{ => libraries}/ForgeArtifacts.sol | 2 +- .../scripts/{ => libraries}/Types.sol | 0 .../scripts/{ => ops}/FeeVaultWithdrawal.s.sol | 4 ++-- .../scripts/periphery/deploy/DeployPeriphery.s.sol | 2 +- .../scripts/periphery/drippie/ManageDrippie.s.sol | 2 +- .../scripts/{ => utils}/print-addresses.sh | 0 .../scripts/{ => utils}/restructure_tests.py | 0 .../contracts-bedrock/scripts/{ => utils}/statediff.sh | 0 .../contracts-bedrock/test/L2/GasPriceOracle.t.sol | 2 +- packages/contracts-bedrock/test/Predeploys.t.sol | 2 +- .../test/Safe/DeputyGuardianModule.t.sol | 2 +- packages/contracts-bedrock/test/Specs.t.sol | 4 ++-- packages/contracts-bedrock/test/setup/Setup.sol | 6 +++--- .../contracts-bedrock/test/vendor/Initializable.t.sol | 4 ++-- 28 files changed, 34 insertions(+), 34 deletions(-) rename packages/contracts-bedrock/scripts/{ => autogen}/SemverLock.s.sol (100%) rename packages/contracts-bedrock/scripts/{ => deploy}/ChainAssertions.sol (99%) rename packages/contracts-bedrock/scripts/{ => fpac/viz}/FaultDisputeGameViz.s.sol (100%) rename packages/contracts-bedrock/scripts/{ => fpac/viz}/dag-viz.py (100%) rename packages/contracts-bedrock/scripts/{ => fpac/viz}/visualize.sh (82%) rename packages/contracts-bedrock/scripts/{ => libraries}/Chains.sol (100%) rename packages/contracts-bedrock/scripts/{ => libraries}/Config.sol (100%) rename packages/contracts-bedrock/scripts/{ => libraries}/Executables.sol (100%) rename packages/contracts-bedrock/scripts/{ => libraries}/ForgeArtifacts.sol (99%) rename packages/contracts-bedrock/scripts/{ => libraries}/Types.sol (100%) rename packages/contracts-bedrock/scripts/{ => ops}/FeeVaultWithdrawal.s.sol (96%) rename packages/contracts-bedrock/scripts/{ => utils}/print-addresses.sh (100%) rename packages/contracts-bedrock/scripts/{ => utils}/restructure_tests.py (100%) rename packages/contracts-bedrock/scripts/{ => utils}/statediff.sh (100%) diff --git a/packages/contracts-bedrock/justfile b/packages/contracts-bedrock/justfile index c55cb3d38151..45cdd14cfae0 100644 --- a/packages/contracts-bedrock/justfile +++ b/packages/contracts-bedrock/justfile @@ -41,7 +41,7 @@ gas-snapshot-no-build: forge snapshot --match-contract GasBenchMark statediff: - ./scripts/statediff.sh && git diff --exit-code + ./scripts/utils/statediff.sh && git diff --exit-code gas-snapshot: build-go-ffi gas-snapshot-no-build @@ -65,7 +65,7 @@ snapshots-check: ./scripts/checks/check-snapshots.sh semver-lock: - forge script scripts/SemverLock.s.sol + forge script scripts/autogen/SemverLock.s.sol validate-deploy-configs: ./scripts/checks/check-deploy-configs.sh diff --git a/packages/contracts-bedrock/scripts/Artifacts.s.sol b/packages/contracts-bedrock/scripts/Artifacts.s.sol index 4a788608788a..5b4bef26ec1c 100644 --- a/packages/contracts-bedrock/scripts/Artifacts.s.sol +++ b/packages/contracts-bedrock/scripts/Artifacts.s.sol @@ -4,13 +4,13 @@ pragma solidity ^0.8.0; import { console2 as console } from "forge-std/console2.sol"; import { stdJson } from "forge-std/StdJson.sol"; import { Vm } from "forge-std/Vm.sol"; -import { Executables } from "scripts/Executables.sol"; +import { Executables } from "scripts/libraries/Executables.sol"; import { Predeploys } from "src/libraries/Predeploys.sol"; -import { Config } from "scripts/Config.sol"; -import { StorageSlot } from "scripts/ForgeArtifacts.sol"; +import { Config } from "scripts/libraries/Config.sol"; +import { StorageSlot } from "scripts/libraries/ForgeArtifacts.sol"; import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; import { LibString } from "@solady/utils/LibString.sol"; -import { ForgeArtifacts } from "scripts/ForgeArtifacts.sol"; +import { ForgeArtifacts } from "scripts/libraries/ForgeArtifacts.sol"; import { IAddressManager } from "scripts/interfaces/IAddressManager.sol"; import { Process } from "scripts/libraries/Process.sol"; diff --git a/packages/contracts-bedrock/scripts/L2Genesis.s.sol b/packages/contracts-bedrock/scripts/L2Genesis.s.sol index cad18b0b02bd..e15459166999 100644 --- a/packages/contracts-bedrock/scripts/L2Genesis.s.sol +++ b/packages/contracts-bedrock/scripts/L2Genesis.s.sol @@ -5,7 +5,7 @@ import { Script } from "forge-std/Script.sol"; import { console2 as console } from "forge-std/console2.sol"; import { Deployer } from "scripts/deploy/Deployer.sol"; -import { Config, OutputMode, OutputModeUtils, Fork, ForkUtils, LATEST_FORK } from "scripts/Config.sol"; +import { Config, OutputMode, OutputModeUtils, Fork, ForkUtils, LATEST_FORK } from "scripts/libraries/Config.sol"; import { Artifacts } from "scripts/Artifacts.s.sol"; import { DeployConfig } from "scripts/deploy/DeployConfig.s.sol"; import { Predeploys } from "src/libraries/Predeploys.sol"; diff --git a/packages/contracts-bedrock/scripts/SemverLock.s.sol b/packages/contracts-bedrock/scripts/autogen/SemverLock.s.sol similarity index 100% rename from packages/contracts-bedrock/scripts/SemverLock.s.sol rename to packages/contracts-bedrock/scripts/autogen/SemverLock.s.sol diff --git a/packages/contracts-bedrock/scripts/ChainAssertions.sol b/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol similarity index 99% rename from packages/contracts-bedrock/scripts/ChainAssertions.sol rename to packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol index b0245fc09fbb..cac489c93e78 100644 --- a/packages/contracts-bedrock/scripts/ChainAssertions.sol +++ b/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol @@ -19,7 +19,7 @@ import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol"; import { OptimismMintableERC20Factory } from "src/universal/OptimismMintableERC20Factory.sol"; import { L1ERC721Bridge } from "src/L1/L1ERC721Bridge.sol"; import { Predeploys } from "src/libraries/Predeploys.sol"; -import { Types } from "scripts/Types.sol"; +import { Types } from "scripts/libraries/Types.sol"; import { Vm } from "forge-std/Vm.sol"; import { ISystemConfigV0 } from "scripts/interfaces/ISystemConfigV0.sol"; import { console2 as console } from "forge-std/console2.sol"; diff --git a/packages/contracts-bedrock/scripts/deploy/Deploy.s.sol b/packages/contracts-bedrock/scripts/deploy/Deploy.s.sol index 19816f94aa0c..73abe8956a24 100644 --- a/packages/contracts-bedrock/scripts/deploy/Deploy.s.sol +++ b/packages/contracts-bedrock/scripts/deploy/Deploy.s.sol @@ -44,18 +44,18 @@ import { L1ERC721Bridge } from "src/L1/L1ERC721Bridge.sol"; import { ProtocolVersions, ProtocolVersion } from "src/L1/ProtocolVersions.sol"; import { StorageSetter } from "src/universal/StorageSetter.sol"; import { Predeploys } from "src/libraries/Predeploys.sol"; -import { Chains } from "scripts/Chains.sol"; -import { Config } from "scripts/Config.sol"; +import { Chains } from "scripts/libraries/Chains.sol"; +import { Config } from "scripts/libraries/Config.sol"; import { IBigStepper } from "src/dispute/interfaces/IBigStepper.sol"; import { IPreimageOracle } from "src/cannon/interfaces/IPreimageOracle.sol"; import { AlphabetVM } from "test/mocks/AlphabetVM.sol"; import "src/dispute/lib/Types.sol"; -import { ChainAssertions } from "scripts/ChainAssertions.sol"; -import { Types } from "scripts/Types.sol"; +import { ChainAssertions } from "scripts/deploy/ChainAssertions.sol"; +import { Types } from "scripts/libraries/Types.sol"; import { LibStateDiff } from "scripts/libraries/LibStateDiff.sol"; import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; -import { ForgeArtifacts } from "scripts/ForgeArtifacts.sol"; +import { ForgeArtifacts } from "scripts/libraries/ForgeArtifacts.sol"; import { Process } from "scripts/libraries/Process.sol"; /// @title Deploy diff --git a/packages/contracts-bedrock/scripts/deploy/DeployConfig.s.sol b/packages/contracts-bedrock/scripts/deploy/DeployConfig.s.sol index 76d4ad43ee83..d720986fcdd5 100644 --- a/packages/contracts-bedrock/scripts/deploy/DeployConfig.s.sol +++ b/packages/contracts-bedrock/scripts/deploy/DeployConfig.s.sol @@ -4,10 +4,10 @@ pragma solidity 0.8.15; import { Script } from "forge-std/Script.sol"; import { console2 as console } from "forge-std/console2.sol"; import { stdJson } from "forge-std/StdJson.sol"; -import { Executables } from "scripts/Executables.sol"; +import { Executables } from "scripts/libraries/Executables.sol"; import { Process } from "scripts/libraries/Process.sol"; -import { Chains } from "scripts/Chains.sol"; -import { Config, Fork, ForkUtils } from "scripts/Config.sol"; +import { Chains } from "scripts/libraries/Chains.sol"; +import { Config, Fork, ForkUtils } from "scripts/libraries/Config.sol"; /// @title DeployConfig /// @notice Represents the configuration required to deploy the system. It is expected diff --git a/packages/contracts-bedrock/scripts/deploy/Deployer.sol b/packages/contracts-bedrock/scripts/deploy/Deployer.sol index 2a861ba34608..36de8dd440fc 100644 --- a/packages/contracts-bedrock/scripts/deploy/Deployer.sol +++ b/packages/contracts-bedrock/scripts/deploy/Deployer.sol @@ -3,9 +3,9 @@ pragma solidity ^0.8.0; import { Script } from "forge-std/Script.sol"; import { Artifacts } from "scripts/Artifacts.s.sol"; -import { Config } from "scripts/Config.sol"; +import { Config } from "scripts/libraries/Config.sol"; import { DeployConfig } from "scripts/deploy/DeployConfig.s.sol"; -import { Executables } from "scripts/Executables.sol"; +import { Executables } from "scripts/libraries/Executables.sol"; import { console } from "forge-std/console.sol"; /// @title Deployer diff --git a/packages/contracts-bedrock/scripts/FaultDisputeGameViz.s.sol b/packages/contracts-bedrock/scripts/fpac/viz/FaultDisputeGameViz.s.sol similarity index 100% rename from packages/contracts-bedrock/scripts/FaultDisputeGameViz.s.sol rename to packages/contracts-bedrock/scripts/fpac/viz/FaultDisputeGameViz.s.sol diff --git a/packages/contracts-bedrock/scripts/dag-viz.py b/packages/contracts-bedrock/scripts/fpac/viz/dag-viz.py similarity index 100% rename from packages/contracts-bedrock/scripts/dag-viz.py rename to packages/contracts-bedrock/scripts/fpac/viz/dag-viz.py diff --git a/packages/contracts-bedrock/scripts/visualize.sh b/packages/contracts-bedrock/scripts/fpac/viz/visualize.sh similarity index 82% rename from packages/contracts-bedrock/scripts/visualize.sh rename to packages/contracts-bedrock/scripts/fpac/viz/visualize.sh index 4fb3078ebe70..f0ecf872aa2e 100644 --- a/packages/contracts-bedrock/scripts/visualize.sh +++ b/packages/contracts-bedrock/scripts/fpac/viz/visualize.sh @@ -8,6 +8,6 @@ DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" DIR="${DIR%/*}" cd "$DIR" -forge script scripts/FaultDisputeGameViz.s.sol \ +forge script scripts/fpac/viz/FaultDisputeGameViz.s.sol \ --sig "remote(address)" "$FAULT_GAME_ADDRESS" \ --fork-url "$RPC" diff --git a/packages/contracts-bedrock/scripts/Chains.sol b/packages/contracts-bedrock/scripts/libraries/Chains.sol similarity index 100% rename from packages/contracts-bedrock/scripts/Chains.sol rename to packages/contracts-bedrock/scripts/libraries/Chains.sol diff --git a/packages/contracts-bedrock/scripts/Config.sol b/packages/contracts-bedrock/scripts/libraries/Config.sol similarity index 100% rename from packages/contracts-bedrock/scripts/Config.sol rename to packages/contracts-bedrock/scripts/libraries/Config.sol diff --git a/packages/contracts-bedrock/scripts/Executables.sol b/packages/contracts-bedrock/scripts/libraries/Executables.sol similarity index 100% rename from packages/contracts-bedrock/scripts/Executables.sol rename to packages/contracts-bedrock/scripts/libraries/Executables.sol diff --git a/packages/contracts-bedrock/scripts/ForgeArtifacts.sol b/packages/contracts-bedrock/scripts/libraries/ForgeArtifacts.sol similarity index 99% rename from packages/contracts-bedrock/scripts/ForgeArtifacts.sol rename to packages/contracts-bedrock/scripts/libraries/ForgeArtifacts.sol index 9886f9cd9bc0..315ed6d0c530 100644 --- a/packages/contracts-bedrock/scripts/ForgeArtifacts.sol +++ b/packages/contracts-bedrock/scripts/libraries/ForgeArtifacts.sol @@ -2,8 +2,8 @@ pragma solidity ^0.8.0; import { Vm } from "forge-std/Vm.sol"; -import { Executables } from "scripts/Executables.sol"; import { stdJson } from "forge-std/StdJson.sol"; +import { Executables } from "scripts/libraries/Executables.sol"; import { Process } from "scripts/libraries/Process.sol"; /// @notice Contains information about a storage slot. Mirrors the layout of the storage diff --git a/packages/contracts-bedrock/scripts/Types.sol b/packages/contracts-bedrock/scripts/libraries/Types.sol similarity index 100% rename from packages/contracts-bedrock/scripts/Types.sol rename to packages/contracts-bedrock/scripts/libraries/Types.sol diff --git a/packages/contracts-bedrock/scripts/FeeVaultWithdrawal.s.sol b/packages/contracts-bedrock/scripts/ops/FeeVaultWithdrawal.s.sol similarity index 96% rename from packages/contracts-bedrock/scripts/FeeVaultWithdrawal.s.sol rename to packages/contracts-bedrock/scripts/ops/FeeVaultWithdrawal.s.sol index f16cc994a4a2..e19cd7e994bd 100644 --- a/packages/contracts-bedrock/scripts/FeeVaultWithdrawal.s.sol +++ b/packages/contracts-bedrock/scripts/ops/FeeVaultWithdrawal.s.sol @@ -3,9 +3,9 @@ pragma solidity 0.8.15; import { console } from "forge-std/console.sol"; import { Script } from "forge-std/Script.sol"; -import { Predeploys } from "../src/libraries/Predeploys.sol"; -import { FeeVault } from "../src/universal/FeeVault.sol"; import { IMulticall3 } from "forge-std/interfaces/IMulticall3.sol"; +import { Predeploys } from "src/libraries/Predeploys.sol"; +import { FeeVault } from "src/universal/FeeVault.sol"; /// @title FeeVaultWithdrawal /// @notice A script to make it very simple to withdraw from the fee vaults. diff --git a/packages/contracts-bedrock/scripts/periphery/deploy/DeployPeriphery.s.sol b/packages/contracts-bedrock/scripts/periphery/deploy/DeployPeriphery.s.sol index 834af21231f1..856104eb2734 100644 --- a/packages/contracts-bedrock/scripts/periphery/deploy/DeployPeriphery.s.sol +++ b/packages/contracts-bedrock/scripts/periphery/deploy/DeployPeriphery.s.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.0; import { console2 as console } from "forge-std/console2.sol"; import { Script } from "forge-std/Script.sol"; -import { Config } from "scripts/Config.sol"; +import { Config } from "scripts/libraries/Config.sol"; import { Artifacts } from "scripts/Artifacts.s.sol"; import { PeripheryDeployConfig } from "scripts/periphery/deploy/PeripheryDeployConfig.s.sol"; diff --git a/packages/contracts-bedrock/scripts/periphery/drippie/ManageDrippie.s.sol b/packages/contracts-bedrock/scripts/periphery/drippie/ManageDrippie.s.sol index b41142ba8045..1ae5f9ab01a2 100644 --- a/packages/contracts-bedrock/scripts/periphery/drippie/ManageDrippie.s.sol +++ b/packages/contracts-bedrock/scripts/periphery/drippie/ManageDrippie.s.sol @@ -11,7 +11,7 @@ import { LibDataTypes as GelatoDataTypes } from "gelato/libraries/LibDataTypes.s import { LibTaskId as GelatoTaskId } from "gelato/libraries/LibTaskId.sol"; import { GelatoBytes } from "gelato/vendor/gelato/GelatoBytes.sol"; -import { Config } from "scripts/Config.sol"; +import { Config } from "scripts/libraries/Config.sol"; import { Artifacts } from "scripts/Artifacts.s.sol"; import { DrippieConfig } from "scripts/periphery/drippie/DrippieConfig.s.sol"; diff --git a/packages/contracts-bedrock/scripts/print-addresses.sh b/packages/contracts-bedrock/scripts/utils/print-addresses.sh similarity index 100% rename from packages/contracts-bedrock/scripts/print-addresses.sh rename to packages/contracts-bedrock/scripts/utils/print-addresses.sh diff --git a/packages/contracts-bedrock/scripts/restructure_tests.py b/packages/contracts-bedrock/scripts/utils/restructure_tests.py similarity index 100% rename from packages/contracts-bedrock/scripts/restructure_tests.py rename to packages/contracts-bedrock/scripts/utils/restructure_tests.py diff --git a/packages/contracts-bedrock/scripts/statediff.sh b/packages/contracts-bedrock/scripts/utils/statediff.sh similarity index 100% rename from packages/contracts-bedrock/scripts/statediff.sh rename to packages/contracts-bedrock/scripts/utils/statediff.sh diff --git a/packages/contracts-bedrock/test/L2/GasPriceOracle.t.sol b/packages/contracts-bedrock/test/L2/GasPriceOracle.t.sol index 21f7b98f666b..f81d96b040f4 100644 --- a/packages/contracts-bedrock/test/L2/GasPriceOracle.t.sol +++ b/packages/contracts-bedrock/test/L2/GasPriceOracle.t.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.15; // Testing utilities import { CommonTest } from "test/setup/CommonTest.sol"; -import { Fork } from "scripts/Config.sol"; +import { Fork } from "scripts/libraries/Config.sol"; // Libraries import { Encoding } from "src/libraries/Encoding.sol"; diff --git a/packages/contracts-bedrock/test/Predeploys.t.sol b/packages/contracts-bedrock/test/Predeploys.t.sol index df7c2e3229ed..d39eb8b0ff61 100644 --- a/packages/contracts-bedrock/test/Predeploys.t.sol +++ b/packages/contracts-bedrock/test/Predeploys.t.sol @@ -2,7 +2,7 @@ pragma solidity 0.8.15; import { CommonTest } from "test/setup/CommonTest.sol"; -import { ForgeArtifacts } from "scripts/ForgeArtifacts.sol"; +import { ForgeArtifacts } from "scripts/libraries/ForgeArtifacts.sol"; import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; import { Predeploys } from "src/libraries/Predeploys.sol"; diff --git a/packages/contracts-bedrock/test/Safe/DeputyGuardianModule.t.sol b/packages/contracts-bedrock/test/Safe/DeputyGuardianModule.t.sol index ba91387352a7..326024977382 100644 --- a/packages/contracts-bedrock/test/Safe/DeputyGuardianModule.t.sol +++ b/packages/contracts-bedrock/test/Safe/DeputyGuardianModule.t.sol @@ -2,7 +2,7 @@ pragma solidity 0.8.15; import { CommonTest } from "test/setup/CommonTest.sol"; -import { ForgeArtifacts, Abi } from "scripts/ForgeArtifacts.sol"; +import { ForgeArtifacts, Abi } from "scripts/libraries/ForgeArtifacts.sol"; import { GnosisSafe as Safe } from "safe-contracts/GnosisSafe.sol"; import "test/safe-tools/SafeTestTools.sol"; diff --git a/packages/contracts-bedrock/test/Specs.t.sol b/packages/contracts-bedrock/test/Specs.t.sol index 466be3ab8449..4c87fb82e49d 100644 --- a/packages/contracts-bedrock/test/Specs.t.sol +++ b/packages/contracts-bedrock/test/Specs.t.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.15; import { CommonTest } from "test/setup/CommonTest.sol"; -import { Executables } from "scripts/Executables.sol"; +import { Executables } from "scripts/libraries/Executables.sol"; import { console2 as console } from "forge-std/console2.sol"; import { ProtocolVersions } from "src/L1/ProtocolVersions.sol"; import { OptimismPortal } from "src/L1/OptimismPortal.sol"; @@ -11,7 +11,7 @@ import { OptimismPortal2 } from "src/L1/OptimismPortal2.sol"; import { SystemConfig } from "src/L1/SystemConfig.sol"; import { DataAvailabilityChallenge } from "src/L1/DataAvailabilityChallenge.sol"; import { OPStackManager } from "src/L1/OPStackManager.sol"; -import { ForgeArtifacts, Abi, AbiEntry } from "scripts/ForgeArtifacts.sol"; +import { ForgeArtifacts, Abi, AbiEntry } from "scripts/libraries/ForgeArtifacts.sol"; /// @title Specification_Test /// @dev Specifies common security properties of entrypoints to L1 contracts, including authorization and diff --git a/packages/contracts-bedrock/test/setup/Setup.sol b/packages/contracts-bedrock/test/setup/Setup.sol index 537585d7105d..50052dfd14d3 100644 --- a/packages/contracts-bedrock/test/setup/Setup.sol +++ b/packages/contracts-bedrock/test/setup/Setup.sol @@ -26,9 +26,9 @@ import { AnchorStateRegistry } from "src/dispute/AnchorStateRegistry.sol"; import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol"; import { DeployConfig } from "scripts/deploy/DeployConfig.s.sol"; import { Deploy } from "scripts/deploy/Deploy.s.sol"; -import { Fork, LATEST_FORK } from "scripts/Config.sol"; +import { Fork, LATEST_FORK } from "scripts/libraries/Config.sol"; import { L2Genesis, L1Dependencies } from "scripts/L2Genesis.s.sol"; -import { OutputMode, Fork, ForkUtils } from "scripts/Config.sol"; +import { OutputMode, Fork, ForkUtils } from "scripts/libraries/Config.sol"; import { L2OutputOracle } from "src/L1/L2OutputOracle.sol"; import { ProtocolVersions } from "src/L1/ProtocolVersions.sol"; import { SystemConfig } from "src/L1/SystemConfig.sol"; @@ -36,7 +36,7 @@ import { L1StandardBridge } from "src/L1/L1StandardBridge.sol"; import { AddressManager } from "src/legacy/AddressManager.sol"; import { L1ERC721Bridge } from "src/L1/L1ERC721Bridge.sol"; import { AddressAliasHelper } from "src/vendor/AddressAliasHelper.sol"; -import { Executables } from "scripts/Executables.sol"; +import { Executables } from "scripts/libraries/Executables.sol"; import { Vm } from "forge-std/Vm.sol"; import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; import { DataAvailabilityChallenge } from "src/L1/DataAvailabilityChallenge.sol"; diff --git a/packages/contracts-bedrock/test/vendor/Initializable.t.sol b/packages/contracts-bedrock/test/vendor/Initializable.t.sol index 05fff737bd6e..73177a36f1a5 100644 --- a/packages/contracts-bedrock/test/vendor/Initializable.t.sol +++ b/packages/contracts-bedrock/test/vendor/Initializable.t.sol @@ -2,14 +2,14 @@ pragma solidity 0.8.15; import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol"; -import { Executables } from "scripts/Executables.sol"; +import { Executables } from "scripts/libraries/Executables.sol"; import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol"; import { L2OutputOracle } from "src/L1/L2OutputOracle.sol"; import { SystemConfig } from "src/L1/SystemConfig.sol"; import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; import { ResourceMetering } from "src/L1/ResourceMetering.sol"; import { OptimismPortal } from "src/L1/OptimismPortal.sol"; -import { ForgeArtifacts } from "scripts/ForgeArtifacts.sol"; +import { ForgeArtifacts } from "scripts/libraries/ForgeArtifacts.sol"; import { Process } from "scripts/libraries/Process.sol"; import "src/L1/ProtocolVersions.sol"; import "src/dispute/lib/Types.sol"; From 998b8de8923db35dde76b20700e1cca5193e19c3 Mon Sep 17 00:00:00 2001 From: Inphi Date: Mon, 12 Aug 2024 13:29:44 -0700 Subject: [PATCH 52/59] op-e2e: Test Granite EVM rules in op-program (#11391) --- op-e2e/faultproofs/precompile_test.go | 79 +++++++++++++++++++++++++++ op-e2e/setup.go | 1 + 2 files changed, 80 insertions(+) diff --git a/op-e2e/faultproofs/precompile_test.go b/op-e2e/faultproofs/precompile_test.go index 8741e7ee8102..38c6486abf9d 100644 --- a/op-e2e/faultproofs/precompile_test.go +++ b/op-e2e/faultproofs/precompile_test.go @@ -5,12 +5,15 @@ import ( "encoding/json" "fmt" "math" + "math/big" "path/filepath" "testing" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rpc" "github.com/stretchr/testify/require" @@ -134,6 +137,82 @@ func TestPrecompiles(t *testing.T) { } } +func TestGranitePrecompiles(t *testing.T) { + op_e2e.InitParallel(t, op_e2e.UsesCannon) + ctx := context.Background() + genesisTime := hexutil.Uint64(0) + cfg := op_e2e.GraniteSystemConfig(t, &genesisTime) + // We don't need a verifier - just the sequencer is enough + delete(cfg.Nodes, "verifier") + // Use a small sequencer window size to avoid test timeout while waiting for empty blocks + // But not too small to ensure that our claim and subsequent state change is published + cfg.DeployConfig.SequencerWindowSize = 16 + + sys, err := cfg.Start(t) + require.Nil(t, err, "Error starting up system") + defer sys.Close() + + log := testlog.Logger(t, log.LevelInfo) + log.Info("genesis", "l2", sys.RollupConfig.Genesis.L2, "l1", sys.RollupConfig.Genesis.L1, "l2_time", sys.RollupConfig.Genesis.L2Time) + + l1Client := sys.Clients["l1"] + l2Seq := sys.Clients["sequencer"] + rollupRPCClient, err := rpc.DialContext(context.Background(), sys.RollupNodes["sequencer"].HTTPEndpoint()) + require.Nil(t, err) + rollupClient := sources.NewRollupClient(client.NewBaseRPCClient(rollupRPCClient)) + + aliceKey := cfg.Secrets.Alice + + t.Log("Capture current L2 head as agreed starting point") + latestBlock, err := l2Seq.BlockByNumber(ctx, nil) + require.NoError(t, err) + agreedL2Output, err := rollupClient.OutputAtBlock(ctx, latestBlock.NumberU64()) + require.NoError(t, err, "could not retrieve l2 agreed block") + l2Head := agreedL2Output.BlockRef.Hash + l2OutputRoot := agreedL2Output.OutputRoot + + precompile := common.BytesToAddress([]byte{0x08}) + input := make([]byte, 113_000) + tx := types.MustSignNewTx(aliceKey, types.LatestSignerForChainID(cfg.L2ChainIDBig()), &types.DynamicFeeTx{ + ChainID: cfg.L2ChainIDBig(), + Nonce: 0, + GasTipCap: big.NewInt(1 * params.GWei), + GasFeeCap: big.NewInt(10 * params.GWei), + Gas: 25_000_000, + To: &precompile, + Value: big.NewInt(0), + Data: input, + }) + err = l2Seq.SendTransaction(ctx, tx) + require.NoError(t, err, "Should send bn256Pairing transaction") + // Expect a successful receipt to retrieve the EVM call trace so we can inspect the revert reason + receipt, err := wait.ForReceiptMaybe(ctx, l2Seq, tx.Hash(), types.ReceiptStatusSuccessful, false) + require.NotNil(t, err) + require.Contains(t, err.Error(), "bad elliptic curve pairing input size") + + t.Logf("Transaction hash %v", tx.Hash()) + t.Log("Determine L2 claim") + l2ClaimBlockNumber := receipt.BlockNumber + l2Output, err := rollupClient.OutputAtBlock(ctx, l2ClaimBlockNumber.Uint64()) + require.NoError(t, err, "could not get expected output") + l2Claim := l2Output.OutputRoot + + t.Log("Determine L1 head that includes all batches required for L2 claim block") + require.NoError(t, wait.ForSafeBlock(ctx, rollupClient, l2ClaimBlockNumber.Uint64())) + l1HeadBlock, err := l1Client.BlockByNumber(ctx, nil) + require.NoError(t, err, "get l1 head block") + l1Head := l1HeadBlock.Hash() + + inputs := utils.LocalGameInputs{ + L1Head: l1Head, + L2Head: l2Head, + L2Claim: common.Hash(l2Claim), + L2OutputRoot: common.Hash(l2OutputRoot), + L2BlockNumber: l2ClaimBlockNumber, + } + runCannon(t, ctx, sys, inputs, "sequencer") +} + func runCannon(t *testing.T, ctx context.Context, sys *op_e2e.System, inputs utils.LocalGameInputs, l2Node string, extraVmArgs ...string) { l1Endpoint := sys.NodeEndpoint("l1") l1Beacon := sys.L1BeaconEndpoint() diff --git a/op-e2e/setup.go b/op-e2e/setup.go index b7c97c435e93..32c48ddee7f7 100644 --- a/op-e2e/setup.go +++ b/op-e2e/setup.go @@ -218,6 +218,7 @@ func FjordSystemConfig(t *testing.T, fjordTimeOffset *hexutil.Uint64) SystemConf func GraniteSystemConfig(t *testing.T, graniteTimeOffset *hexutil.Uint64) SystemConfig { cfg := FjordSystemConfig(t, &genesisTime) cfg.DeployConfig.L2GenesisGraniteTimeOffset = graniteTimeOffset + cfg.DeployConfig.ChannelTimeoutGranite = 20 return cfg } From 97aac006ad7c3de062276d1648cff9506aafe7e2 Mon Sep 17 00:00:00 2001 From: protolambda Date: Mon, 12 Aug 2024 17:32:55 -0600 Subject: [PATCH 53/59] op-geth: update to support new precompile-overrides function (#11443) * op-geth: update to support new precompile-overrides function * op-program: ensure no accidental precompile overrides * go.mod: update op-geth for new precompile override functionality --- go.mod | 4 ++-- go.sum | 8 ++++---- op-e2e/actions/l1_miner.go | 6 +++--- op-program/client/l2/engine_backend.go | 2 +- op-program/client/l2/engineapi/block_processor.go | 6 +++--- op-program/client/l2/engineapi/precompiles.go | 13 ++++++++----- 6 files changed, 21 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index e4c54d456e09..529a85b32db5 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/crate-crypto/go-kzg-4844 v1.0.0 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3 - github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240803025447-c92ef420eec2 + github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240812010938-34a43d577f74 github.com/ethereum/go-ethereum v1.14.7 github.com/fsnotify/fsnotify v1.7.0 github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb @@ -233,7 +233,7 @@ require ( rsc.io/tmplfunc v0.0.3 // indirect ) -replace github.com/ethereum/go-ethereum v1.14.7 => github.com/ethereum-optimism/op-geth v1.101407.0-rc.1 +replace github.com/ethereum/go-ethereum v1.14.7 => github.com/ethereum-optimism/op-geth v1.101407.0-rc.1.0.20240812224053-8d99ca68bb1a //replace github.com/ethereum/go-ethereum v1.13.9 => ../op-geth diff --git a/go.sum b/go.sum index 9db642d8ab04..82cd991b903d 100644 --- a/go.sum +++ b/go.sum @@ -174,10 +174,10 @@ github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/ github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3 h1:RWHKLhCrQThMfch+QJ1Z8veEq5ZO3DfIhZ7xgRP9WTc= github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3/go.mod h1:QziizLAiF0KqyLdNJYD7O5cpDlaFMNZzlxYNcWsJUxs= -github.com/ethereum-optimism/op-geth v1.101407.0-rc.1 h1:bE6V8GG46s7IX2s7prH26sKcVwW0/FbId3CEe5GYulQ= -github.com/ethereum-optimism/op-geth v1.101407.0-rc.1/go.mod h1:Zn0xPY3I/xX3Bm51kjXz9VSd+2ai7bEslVEAFTdVcpM= -github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240803025447-c92ef420eec2 h1:ySJykDUyb8RbcfLL3pz0Cs5Ji6NMVT7kmAY634DOCoE= -github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240803025447-c92ef420eec2/go.mod h1:zy9f3TNPS7pwW4msMitF83fp0Wf452tZ6+Fg6d4JyXM= +github.com/ethereum-optimism/op-geth v1.101407.0-rc.1.0.20240812224053-8d99ca68bb1a h1:OK3wB7HbdhCneSowC1XZusHaLIVdXoRLuCWgXp5Tjuc= +github.com/ethereum-optimism/op-geth v1.101407.0-rc.1.0.20240812224053-8d99ca68bb1a/go.mod h1:9pT+bF20XwCBE7WkjfRSsCg6RN6Njdbr924DtQ3+geY= +github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240812010938-34a43d577f74 h1:HQZQalpPUXs9qnJgDmEDzpPO70Z1p8Le2l0bZ9eJjCk= +github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240812010938-34a43d577f74/go.mod h1:zy9f3TNPS7pwW4msMitF83fp0Wf452tZ6+Fg6d4JyXM= github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= diff --git a/op-e2e/actions/l1_miner.go b/op-e2e/actions/l1_miner.go index 97ca5c091ccc..9026d74db178 100644 --- a/op-e2e/actions/l1_miner.go +++ b/op-e2e/actions/l1_miner.go @@ -109,10 +109,10 @@ func (s *L1Miner) ActL1StartBlock(timeDelta uint64) Action { context := core.NewEVMBlockContext(header, s.l1Chain, nil, s.l1Chain.Config(), statedb) // NOTE: Unlikely to be needed for the beacon block root, but we setup any precompile overrides anyways for forwards-compatibility var precompileOverrides vm.PrecompileOverrides - if vmConfig := s.l1Chain.GetVMConfig(); vmConfig != nil && vmConfig.OptimismPrecompileOverrides != nil { - precompileOverrides = vmConfig.OptimismPrecompileOverrides + if vmConfig := s.l1Chain.GetVMConfig(); vmConfig != nil && vmConfig.PrecompileOverrides != nil { + precompileOverrides = vmConfig.PrecompileOverrides } - vmenv := vm.NewEVM(context, vm.TxContext{}, statedb, s.l1Chain.Config(), vm.Config{OptimismPrecompileOverrides: precompileOverrides}) + vmenv := vm.NewEVM(context, vm.TxContext{}, statedb, s.l1Chain.Config(), vm.Config{PrecompileOverrides: precompileOverrides}) core.ProcessBeaconBlockRoot(*header.ParentBeaconRoot, vmenv, statedb) } diff --git a/op-program/client/l2/engine_backend.go b/op-program/client/l2/engine_backend.go index 3880056e3376..08eafc9a0506 100644 --- a/op-program/client/l2/engine_backend.go +++ b/op-program/client/l2/engine_backend.go @@ -67,7 +67,7 @@ func NewOracleBackedL2Chain(logger log.Logger, oracle Oracle, precompileOracle e blocks: make(map[common.Hash]*types.Block), db: NewOracleBackedDB(oracle), vmCfg: vm.Config{ - OptimismPrecompileOverrides: engineapi.CreatePrecompileOverrides(precompileOracle), + PrecompileOverrides: engineapi.CreatePrecompileOverrides(precompileOracle), }, }, nil } diff --git a/op-program/client/l2/engineapi/block_processor.go b/op-program/client/l2/engineapi/block_processor.go index 9e56445f5511..2e6cc5beade4 100644 --- a/op-program/client/l2/engineapi/block_processor.go +++ b/op-program/client/l2/engineapi/block_processor.go @@ -86,10 +86,10 @@ func NewBlockProcessorFromHeader(provider BlockDataProvider, h *types.Header) (* context := core.NewEVMBlockContext(header, provider, nil, provider.Config(), statedb) // NOTE: Unlikely to be needed for the beacon block root, but we setup any precompile overrides anyways for forwards-compatibility var precompileOverrides vm.PrecompileOverrides - if vmConfig := provider.GetVMConfig(); vmConfig != nil && vmConfig.OptimismPrecompileOverrides != nil { - precompileOverrides = vmConfig.OptimismPrecompileOverrides + if vmConfig := provider.GetVMConfig(); vmConfig != nil && vmConfig.PrecompileOverrides != nil { + precompileOverrides = vmConfig.PrecompileOverrides } - vmenv := vm.NewEVM(context, vm.TxContext{}, statedb, provider.Config(), vm.Config{OptimismPrecompileOverrides: precompileOverrides}) + vmenv := vm.NewEVM(context, vm.TxContext{}, statedb, provider.Config(), vm.Config{PrecompileOverrides: precompileOverrides}) core.ProcessBeaconBlockRoot(*header.ParentBeaconRoot, vmenv, statedb) } return &BlockProcessor{ diff --git a/op-program/client/l2/engineapi/precompiles.go b/op-program/client/l2/engineapi/precompiles.go index 5ef77663d5bb..0c53d632ee77 100644 --- a/op-program/client/l2/engineapi/precompiles.go +++ b/op-program/client/l2/engineapi/precompiles.go @@ -50,17 +50,20 @@ type PrecompileOracle interface { } func CreatePrecompileOverrides(precompileOracle PrecompileOracle) vm.PrecompileOverrides { - return func(rules params.Rules, orig vm.PrecompiledContract, address common.Address) (vm.PrecompiledContract, bool) { + return func(rules params.Rules, orig vm.PrecompiledContract, address common.Address) vm.PrecompiledContract { + if orig == nil { // Only override existing contracts. Never introduce a precompile that is not there. + return nil + } // NOTE: Ignoring chain rules for now. We assume that precompile behavior won't change for the foreseeable future switch address { case ecrecoverPrecompileAddress: - return &ecrecoverOracle{Orig: orig, Oracle: precompileOracle}, true + return &ecrecoverOracle{Orig: orig, Oracle: precompileOracle} case bn256PairingPrecompileAddress: - return &bn256PairingOracle{Orig: orig, Oracle: precompileOracle}, true + return &bn256PairingOracle{Orig: orig, Oracle: precompileOracle} case kzgPointEvaluationPrecompileAddress: - return &kzgPointEvaluationOracle{Orig: orig, Oracle: precompileOracle}, true + return &kzgPointEvaluationOracle{Orig: orig, Oracle: precompileOracle} default: - return nil, false + return orig } } } From 2b19d088f282a473b75ee6a07c91a5dba8a82c47 Mon Sep 17 00:00:00 2001 From: Adrian Sutton Date: Tue, 13 Aug 2024 13:30:30 +1000 Subject: [PATCH 54/59] op-challenger: Do not resolve games in selective mode (#11430) --- op-challenger/game/fault/agent.go | 5 ++++ op-challenger/game/fault/agent_test.go | 33 ++++++++++++++++++-------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/op-challenger/game/fault/agent.go b/op-challenger/game/fault/agent.go index 46951d23e776..10b28426f4b0 100644 --- a/op-challenger/game/fault/agent.go +++ b/op-challenger/game/fault/agent.go @@ -155,6 +155,11 @@ func (a *Agent) tryResolve(ctx context.Context) bool { a.log.Error("Failed to resolve claims", "err", err) return false } + if a.selective { + // Never resolve games in selective mode as it won't unlock any bonds for us. + // Assume the game is still in progress or the player wouldn't have told us to act. + return false + } status, err := a.responder.CallResolve(ctx) if err != nil || status == gameTypes.GameStatusInProgress { return false diff --git a/op-challenger/game/fault/agent_test.go b/op-challenger/game/fault/agent_test.go index 415edcd9977c..62dc560263e9 100644 --- a/op-challenger/game/fault/agent_test.go +++ b/op-challenger/game/fault/agent_test.go @@ -4,6 +4,7 @@ import ( "context" "errors" "math/big" + "slices" "sync" "testing" "time" @@ -127,20 +128,27 @@ func TestAgent_SelectiveClaimResolution(t *testing.T) { }, } - for _, test := range tests { - test := test - t.Run(test.name, func(t *testing.T) { + for _, tCase := range tests { + tCase := tCase + t.Run(tCase.name, func(t *testing.T) { agent, claimLoader, responder := setupTestAgent(t) - agent.selective = test.selective - agent.claimants = test.claimants + agent.selective = tCase.selective + agent.claimants = tCase.claimants claimLoader.maxLoads = 1 - claimLoader.claims = test.claims - responder.callResolveStatus = test.callResolveStatus + if tCase.selective { + claimLoader.maxLoads = 0 + } + claimLoader.claims = tCase.claims + responder.callResolveStatus = tCase.callResolveStatus require.NoError(t, agent.Act(ctx)) - require.Equal(t, test.expectedResolveCount, responder.callResolveClaimCount, "should check if game is resolvable") - require.Equal(t, test.expectedResolveCount, responder.resolveClaimCount, "should check if game is resolvable") + require.Equal(t, tCase.expectedResolveCount, responder.callResolveClaimCount, "should check if game is resolvable") + require.Equal(t, tCase.expectedResolveCount, responder.resolveClaimCount, "should check if game is resolvable") + if tCase.selective { + require.Equal(t, 0, responder.callResolveCount, "should not resolve game in selective mode") + require.Equal(t, 0, responder.resolveCount, "should not resolve game in selective mode") + } }) } } @@ -230,6 +238,7 @@ type stubResponder struct { callResolveClaimCount int callResolveClaimErr error resolveClaimCount int + resolvedClaims []uint64 } func (s *stubResponder) CallResolve(_ context.Context) (gameTypes.GameStatus, error) { @@ -246,9 +255,12 @@ func (s *stubResponder) Resolve() error { return s.resolveErr } -func (s *stubResponder) CallResolveClaim(_ context.Context, _ uint64) error { +func (s *stubResponder) CallResolveClaim(_ context.Context, idx uint64) error { s.l.Lock() defer s.l.Unlock() + if slices.Contains(s.resolvedClaims, idx) { + return errors.New("already resolved") + } s.callResolveClaimCount++ return s.callResolveClaimErr } @@ -257,6 +269,7 @@ func (s *stubResponder) ResolveClaims(claims ...uint64) error { s.l.Lock() defer s.l.Unlock() s.resolveClaimCount += len(claims) + s.resolvedClaims = append(s.resolvedClaims, claims...) return nil } From 896b03cca851b96129c3269986ece1f64393d0dc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Aug 2024 21:54:53 -0600 Subject: [PATCH 55/59] dependabot(gomod): bump github.com/urfave/cli/v2 from 2.27.3 to 2.27.4 (#11450) Bumps [github.com/urfave/cli/v2](https://github.com/urfave/cli) from 2.27.3 to 2.27.4. - [Release notes](https://github.com/urfave/cli/releases) - [Changelog](https://github.com/urfave/cli/blob/main/docs/CHANGELOG.md) - [Commits](https://github.com/urfave/cli/compare/v2.27.3...v2.27.4) --- updated-dependencies: - dependency-name: github.com/urfave/cli/v2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 529a85b32db5..ae123dc9768a 100644 --- a/go.mod +++ b/go.mod @@ -41,7 +41,7 @@ require ( github.com/prometheus/client_golang v1.19.1 github.com/protolambda/ctxlock v0.1.0 github.com/stretchr/testify v1.9.0 - github.com/urfave/cli/v2 v2.27.3 + github.com/urfave/cli/v2 v2.27.4 golang.org/x/crypto v0.26.0 golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 golang.org/x/sync v0.8.0 diff --git a/go.sum b/go.sum index 82cd991b903d..7c1dc9964663 100644 --- a/go.sum +++ b/go.sum @@ -763,8 +763,8 @@ github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqri github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.27.3 h1:/POWahRmdh7uztQ3CYnaDddk0Rm90PyOgIxgW2rr41M= -github.com/urfave/cli/v2 v2.27.3/go.mod h1:m4QzxcD2qpra4z7WhzEGn74WZLViBnMpb1ToCAKdGRQ= +github.com/urfave/cli/v2 v2.27.4 h1:o1owoI+02Eb+K107p27wEX9Bb8eqIoZCfLXloLUSWJ8= +github.com/urfave/cli/v2 v2.27.4/go.mod h1:m4QzxcD2qpra4z7WhzEGn74WZLViBnMpb1ToCAKdGRQ= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= From 2024e2f5513c08db320e28ebf674097c9528f5da Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Aug 2024 21:55:14 -0600 Subject: [PATCH 56/59] dependabot(docker): bump ethereum/client-go in /ops-bedrock (#11448) Bumps ethereum/client-go from v1.14.7 to v1.14.8. --- updated-dependencies: - dependency-name: ethereum/client-go dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ops-bedrock/l1-geth.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ops-bedrock/l1-geth.Dockerfile b/ops-bedrock/l1-geth.Dockerfile index 51c4933026ea..90d1f69840f9 100644 --- a/ops-bedrock/l1-geth.Dockerfile +++ b/ops-bedrock/l1-geth.Dockerfile @@ -1,4 +1,4 @@ -FROM ethereum/client-go:v1.14.7 +FROM ethereum/client-go:v1.14.8 RUN apk add --no-cache jq bash From 27a1bfa9d0f1e03a33dc159480bac2643452a0e8 Mon Sep 17 00:00:00 2001 From: AgusDuha <81362284+agusduha@users.noreply.github.com> Date: Tue, 13 Aug 2024 01:08:46 -0300 Subject: [PATCH 57/59] feat: introduce OptimismSuperchainERC20 (#11256) * feat: introduce OptimismSuperchainERC20 * fix: contract fixes * feat: add snapshots and semver * test: add supports interface tests * test: add invariant test * feat: add parameters to the RelayERC20 event * fix: typo * fix: from param description * fix: event signature and interface pragma * feat: add initializer * feat: use unstructured storage and OZ v5 * feat: update superchain erc20 interfaces * fix: adapt storage to ERC7201 * test: add initializable OZ v5 test * fix: invariant docs * fix: ERC165 implementation * test: improve superc20 invariant (#11) * fix: gas snapshot --------- Co-authored-by: 0xng Co-authored-by: Disco <131301107+0xDiscotech@users.noreply.github.com> --- .gitmodules | 3 + packages/contracts-bedrock/foundry.toml | 1 + .../invariant-docs/OptimismSuperchainERC20.md | 10 + .../invariant-docs/README.md | 1 + .../invariant-docs/SuperchainWETH.md | 2 +- .../lib/openzeppelin-contracts-v5 | 1 + packages/contracts-bedrock/semver-lock.json | 8 +- .../abi/OptimismSuperchainERC20.json | 637 ++++++++++++++++++ .../snapshots/abi/SuperchainWETH.json | 29 +- .../OptimismSuperchainERC20.json | 1 + .../src/L2/IOptimismSuperchainERC20.sol | 38 ++ .../src/L2/ISuperchainERC20.sol | 37 +- .../src/L2/OptimismSuperchainERC20.sol | 191 ++++++ .../src/L2/SuperchainWETH.sol | 9 +- .../test/L2/OptimismSuperchainERC20.t.sol | 386 +++++++++++ .../test/L2/SuperchainWETH.t.sol | 46 +- .../invariants/OptimismSuperchainERC20.t.sol | 225 +++++++ .../test/invariants/SuperchainWETH.t.sol | 11 +- .../test/vendor/Initializable.t.sol | 3 +- .../test/vendor/InitializableOZv5.t.sol | 66 ++ 20 files changed, 1660 insertions(+), 45 deletions(-) create mode 100644 packages/contracts-bedrock/invariant-docs/OptimismSuperchainERC20.md create mode 160000 packages/contracts-bedrock/lib/openzeppelin-contracts-v5 create mode 100644 packages/contracts-bedrock/snapshots/abi/OptimismSuperchainERC20.json create mode 100644 packages/contracts-bedrock/snapshots/storageLayout/OptimismSuperchainERC20.json create mode 100644 packages/contracts-bedrock/src/L2/IOptimismSuperchainERC20.sol create mode 100644 packages/contracts-bedrock/src/L2/OptimismSuperchainERC20.sol create mode 100644 packages/contracts-bedrock/test/L2/OptimismSuperchainERC20.t.sol create mode 100644 packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20.t.sol create mode 100644 packages/contracts-bedrock/test/vendor/InitializableOZv5.t.sol diff --git a/.gitmodules b/.gitmodules index f2b84783c409..21ecaedbb77a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -26,3 +26,6 @@ [submodule "packages/contracts-bedrock/lib/automate"] path = packages/contracts-bedrock/lib/automate url = https://github.com/gelatodigital/automate +[submodule "packages/contracts-bedrock/lib/openzeppelin-contracts-v5"] + path = packages/contracts-bedrock/lib/openzeppelin-contracts-v5 + url = https://github.com/OpenZeppelin/openzeppelin-contracts diff --git a/packages/contracts-bedrock/foundry.toml b/packages/contracts-bedrock/foundry.toml index a373761b8f5a..9edf752f983d 100644 --- a/packages/contracts-bedrock/foundry.toml +++ b/packages/contracts-bedrock/foundry.toml @@ -13,6 +13,7 @@ optimizer_runs = 999999 remappings = [ '@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts', '@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts', + '@openzeppelin/contracts-v5/=lib/openzeppelin-contracts-v5/contracts', '@rari-capital/solmate/=lib/solmate', '@lib-keccak/=lib/lib-keccak/contracts/lib', '@solady/=lib/solady/src', diff --git a/packages/contracts-bedrock/invariant-docs/OptimismSuperchainERC20.md b/packages/contracts-bedrock/invariant-docs/OptimismSuperchainERC20.md new file mode 100644 index 000000000000..0e3150624da5 --- /dev/null +++ b/packages/contracts-bedrock/invariant-docs/OptimismSuperchainERC20.md @@ -0,0 +1,10 @@ +# `OptimismSuperchainERC20` Invariants + +## Calls to sendERC20 should always succeed as long as the actor has enough balance. Actor's balance should also not increase out of nowhere but instead should decrease by the amount sent. +**Test:** [`OptimismSuperchainERC20.t.sol#L194`](../test/invariants/OptimismSuperchainERC20.t.sol#L194) + + + +## Calls to relayERC20 should always succeeds when a message is received from another chain. Actor's balance should only increase by the amount relayed. +**Test:** [`OptimismSuperchainERC20.t.sol#L212`](../test/invariants/OptimismSuperchainERC20.t.sol#L212) + diff --git a/packages/contracts-bedrock/invariant-docs/README.md b/packages/contracts-bedrock/invariant-docs/README.md index f2ab1d263101..cfa87fb4c167 100644 --- a/packages/contracts-bedrock/invariant-docs/README.md +++ b/packages/contracts-bedrock/invariant-docs/README.md @@ -18,6 +18,7 @@ This directory contains documentation for all defined invariant tests within `co - [L2OutputOracle](./L2OutputOracle.md) - [OptimismPortal](./OptimismPortal.md) - [OptimismPortal2](./OptimismPortal2.md) +- [OptimismSuperchainERC20](./OptimismSuperchainERC20.md) - [ResourceMetering](./ResourceMetering.md) - [SafeCall](./SafeCall.md) - [SuperchainWETH](./SuperchainWETH.md) diff --git a/packages/contracts-bedrock/invariant-docs/SuperchainWETH.md b/packages/contracts-bedrock/invariant-docs/SuperchainWETH.md index b9f569e30ef1..4b52a6146f14 100644 --- a/packages/contracts-bedrock/invariant-docs/SuperchainWETH.md +++ b/packages/contracts-bedrock/invariant-docs/SuperchainWETH.md @@ -1,5 +1,5 @@ # `SuperchainWETH` Invariants ## Calls to sendERC20 should always succeed as long as the actor has less than uint248 wei which is much greater than the total ETH supply. Actor's balance should also not increase out of nowhere. -**Test:** [`SuperchainWETH.t.sol#L174`](../test/invariants/SuperchainWETH.t.sol#L174) +**Test:** [`SuperchainWETH.t.sol#L181`](../test/invariants/SuperchainWETH.t.sol#L181) diff --git a/packages/contracts-bedrock/lib/openzeppelin-contracts-v5 b/packages/contracts-bedrock/lib/openzeppelin-contracts-v5 new file mode 160000 index 000000000000..dbb6104ce834 --- /dev/null +++ b/packages/contracts-bedrock/lib/openzeppelin-contracts-v5 @@ -0,0 +1 @@ +Subproject commit dbb6104ce834628e473d2173bbc9d47f81a9eec3 diff --git a/packages/contracts-bedrock/semver-lock.json b/packages/contracts-bedrock/semver-lock.json index 3980893a8609..0bff80cb7b6c 100644 --- a/packages/contracts-bedrock/semver-lock.json +++ b/packages/contracts-bedrock/semver-lock.json @@ -111,13 +111,17 @@ "initCodeHash": "0xe390be1390edc38fd879d7620538560076d7fcf3ef9debce327a1877d96d3ff0", "sourceCodeHash": "0x20f77dc5a02869c6885b73347fa9e7d2bbc4eaf8a2313f7e7435e456001f7a75" }, + "src/L2/OptimismSuperchainERC20.sol": { + "initCodeHash": "0xd49214518ea1a30a43fac09f28b2cee9be570894a500cef342762c9820a070b0", + "sourceCodeHash": "0x6943d40010dcbd1d51dc3668d0a154fbb1568ea49ebcf3aa039d65ef6eab321b" + }, "src/L2/SequencerFeeVault.sol": { "initCodeHash": "0xb94145f571e92ee615c6fe903b6568e8aac5fe760b6b65148ffc45d2fb0f5433", "sourceCodeHash": "0x8f2a54104e5e7105ba03ba37e3ef9b6684a447245f0e0b787ba4cca12957b97c" }, "src/L2/SuperchainWETH.sol": { - "initCodeHash": "0x52e302ac749e6a519829e0fb01075638e481e7f010a6438088486a7a4be4601b", - "sourceCodeHash": "0x7c93752288f4414777e01c2962aee929a28aef2c1fccdfeba456f22df0f9aa39" + "initCodeHash": "0x599e948350c70d699f8a8be945abffd126097de97fade056d29767128320fe75", + "sourceCodeHash": "0x3df29ee1321418914d88ce303b521bf8267ef234b919870b26639d08d7f806bd" }, "src/L2/WETH.sol": { "initCodeHash": "0xde72ae96910e95249623c2d695749847e4c4adeaf96a7a35033afd77318a528a", diff --git a/packages/contracts-bedrock/snapshots/abi/OptimismSuperchainERC20.json b/packages/contracts-bedrock/snapshots/abi/OptimismSuperchainERC20.json new file mode 100644 index 000000000000..6eb57764a8cb --- /dev/null +++ b/packages/contracts-bedrock/snapshots/abi/OptimismSuperchainERC20.json @@ -0,0 +1,637 @@ +[ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "result", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_remoteToken", + "type": "address" + }, + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "string", + "name": "_symbol", + "type": "string" + }, + { + "internalType": "uint8", + "name": "_decimals", + "type": "uint8" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "relayERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "remoteToken", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_chainId", + "type": "uint256" + } + ], + "name": "sendERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Burn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Mint", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "source", + "type": "uint256" + } + ], + "name": "RelayERC20", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "destination", + "type": "uint256" + } + ], + "name": "SendERC20", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "AllowanceOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "AllowanceUnderflow", + "type": "error" + }, + { + "inputs": [], + "name": "CallerNotL2ToL2CrossDomainMessenger", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientAllowance", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientBalance", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidCrossDomainSender", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidPermit", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyBridge", + "type": "error" + }, + { + "inputs": [], + "name": "PermitExpired", + "type": "error" + }, + { + "inputs": [], + "name": "TotalSupplyOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddress", + "type": "error" + } +] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/abi/SuperchainWETH.json b/packages/contracts-bedrock/snapshots/abi/SuperchainWETH.json index 42d3a73e7c56..600e0e6b64f7 100644 --- a/packages/contracts-bedrock/snapshots/abi/SuperchainWETH.json +++ b/packages/contracts-bedrock/snapshots/abi/SuperchainWETH.json @@ -109,6 +109,11 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, { "internalType": "address", "name": "dst", @@ -303,13 +308,25 @@ { "indexed": true, "internalType": "address", - "name": "_to", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "source", "type": "uint256" } ], @@ -322,25 +339,25 @@ { "indexed": true, "internalType": "address", - "name": "_from", + "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", - "name": "_to", + "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "_amount", + "name": "amount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", - "name": "_chainId", + "name": "destination", "type": "uint256" } ], diff --git a/packages/contracts-bedrock/snapshots/storageLayout/OptimismSuperchainERC20.json b/packages/contracts-bedrock/snapshots/storageLayout/OptimismSuperchainERC20.json new file mode 100644 index 000000000000..0637a088a01e --- /dev/null +++ b/packages/contracts-bedrock/snapshots/storageLayout/OptimismSuperchainERC20.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/packages/contracts-bedrock/src/L2/IOptimismSuperchainERC20.sol b/packages/contracts-bedrock/src/L2/IOptimismSuperchainERC20.sol new file mode 100644 index 000000000000..9b9594e75d78 --- /dev/null +++ b/packages/contracts-bedrock/src/L2/IOptimismSuperchainERC20.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { ISuperchainERC20Extensions } from "./ISuperchainERC20.sol"; + +/// @title IOptimismSuperchainERC20Extension +/// @notice This interface is available on the OptimismSuperchainERC20 contract. +/// We declare it as a separate interface so that it can be used in +/// custom implementations of SuperchainERC20. +interface IOptimismSuperchainERC20Extension is ISuperchainERC20Extensions { + /// @notice Emitted whenever tokens are minted for an account. + /// @param account Address of the account tokens are being minted for. + /// @param amount Amount of tokens minted. + event Mint(address indexed account, uint256 amount); + + /// @notice Emitted whenever tokens are burned from an account. + /// @param account Address of the account tokens are being burned from. + /// @param amount Amount of tokens burned. + event Burn(address indexed account, uint256 amount); + + /// @notice Allows the L2StandardBridge to mint tokens. + /// @param _to Address to mint tokens to. + /// @param _amount Amount of tokens to mint. + function mint(address _to, uint256 _amount) external; + + /// @notice Allows the L2StandardBridge to burn tokens. + /// @param _from Address to burn tokens from. + /// @param _amount Amount of tokens to burn. + function burn(address _from, uint256 _amount) external; + + /// @notice Returns the address of the corresponding version of this token on the remote chain. + function remoteToken() external view returns (address); +} + +/// @title IOptimismSuperchainERC20 +/// @notice Combines the ERC20 interface with the OptimismSuperchainERC20Extension interface. +interface IOptimismSuperchainERC20 is IERC20, IOptimismSuperchainERC20Extension { } diff --git a/packages/contracts-bedrock/src/L2/ISuperchainERC20.sol b/packages/contracts-bedrock/src/L2/ISuperchainERC20.sol index b104a08d928e..76488cdf32ea 100644 --- a/packages/contracts-bedrock/src/L2/ISuperchainERC20.sol +++ b/packages/contracts-bedrock/src/L2/ISuperchainERC20.sol @@ -9,27 +9,30 @@ import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; /// importing the full SuperchainERC20 interface would cause conflicting imports. interface ISuperchainERC20Extensions { /// @notice Emitted when tokens are sent from one chain to another. - /// @param _from Address of the sender. - /// @param _to Address of the recipient. - /// @param _amount Number of tokens sent. - /// @param _chainId Chain ID of the recipient. - event SendERC20(address indexed _from, address indexed _to, uint256 _amount, uint256 _chainId); + /// @param from Address of the sender. + /// @param to Address of the recipient. + /// @param amount Number of tokens sent. + /// @param destination Chain ID of the destination chain. + event SendERC20(address indexed from, address indexed to, uint256 amount, uint256 destination); - /// @notice Emitted when token sends are relayed to this chain. - /// @param _to Address of the recipient. - /// @param _amount Number of tokens sent. - event RelayERC20(address indexed _to, uint256 _amount); + /// @notice Emitted whenever tokens are successfully relayed on this chain. + /// @param from Address of the msg.sender of sendERC20 on the source chain. + /// @param to Address of the recipient. + /// @param amount Amount of tokens relayed. + /// @param source Chain ID of the source chain. + event RelayERC20(address indexed from, address indexed to, uint256 amount, uint256 source); - /// @notice Sends tokens to another chain. - /// @param _to Address of the recipient. - /// @param _amount Number of tokens to send. - /// @param _chainId Chain ID of the recipient. + /// @notice Sends tokens to some target address on another chain. + /// @param _to Address to send tokens to. + /// @param _amount Amount of tokens to send. + /// @param _chainId Chain ID of the destination chain. function sendERC20(address _to, uint256 _amount, uint256 _chainId) external; - /// @notice Relays a send of tokens to this chain. - /// @param _to Address of the recipient. - /// @param _amount Number of tokens sent. - function relayERC20(address _to, uint256 _amount) external; + /// @notice Relays tokens received from another chain. + /// @param _from Address of the msg.sender of sendERC20 on the source chain. + /// @param _to Address to relay tokens to. + /// @param _amount Amount of tokens to relay. + function relayERC20(address _from, address _to, uint256 _amount) external; } /// @title ISuperchainERC20 diff --git a/packages/contracts-bedrock/src/L2/OptimismSuperchainERC20.sol b/packages/contracts-bedrock/src/L2/OptimismSuperchainERC20.sol new file mode 100644 index 000000000000..9b0ba5cad8b0 --- /dev/null +++ b/packages/contracts-bedrock/src/L2/OptimismSuperchainERC20.sol @@ -0,0 +1,191 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.25; + +import { IOptimismSuperchainERC20Extension } from "src/L2/IOptimismSuperchainERC20.sol"; +import { ERC20 } from "@solady/tokens/ERC20.sol"; +import { IL2ToL2CrossDomainMessenger } from "src/L2/IL2ToL2CrossDomainMessenger.sol"; +import { ISemver } from "src/universal/ISemver.sol"; +import { Predeploys } from "src/libraries/Predeploys.sol"; +import { Initializable } from "@openzeppelin/contracts-v5/proxy/utils/Initializable.sol"; +import { ERC165 } from "@openzeppelin/contracts-v5/utils/introspection/ERC165.sol"; + +/// @notice Thrown when attempting to relay a message and the function caller (msg.sender) is not +/// L2ToL2CrossDomainMessenger. +error CallerNotL2ToL2CrossDomainMessenger(); + +/// @notice Thrown when attempting to relay a message and the cross domain message sender is not this +/// OptimismSuperchainERC20. +error InvalidCrossDomainSender(); + +/// @notice Thrown when attempting to mint or burn tokens and the function caller is not the StandardBridge. +error OnlyBridge(); + +/// @notice Thrown when attempting to mint or burn tokens and the account is the zero address. +error ZeroAddress(); + +/// @custom:proxied +/// @title OptimismSuperchainERC20 +/// @notice OptimismSuperchainERC20 is a standard extension of the base ERC20 token contract that unifies ERC20 token +/// bridging to make it fungible across the Superchain. This construction allows the L2StandardBridge to burn +/// and mint tokens. This makes it possible to convert a valid OptimismMintableERC20 token to a SuperchainERC20 +/// token, turning it fungible and interoperable across the superchain. Likewise, it also enables the inverse +/// conversion path. +/// Moreover, it builds on top of the L2ToL2CrossDomainMessenger for both replay protection and domain binding. +contract OptimismSuperchainERC20 is IOptimismSuperchainERC20Extension, ERC20, ISemver, Initializable, ERC165 { + /// @notice Address of the L2ToL2CrossDomainMessenger Predeploy. + address internal constant MESSENGER = Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER; + + /// @notice Address of the StandardBridge Predeploy. + address internal constant BRIDGE = Predeploys.L2_STANDARD_BRIDGE; + + /// @notice Storage slot that the OptimismSuperchainERC20Metadata struct is stored at. + /// keccak256(abi.encode(uint256(keccak256("optimismSuperchainERC20.metadata")) - 1)) & ~bytes32(uint256(0xff)); + bytes32 internal constant OPTIMISM_SUPERCHAIN_ERC20_METADATA_SLOT = + 0x07f04e84143df95a6373fcf376312ae41da81a193a3089073a54f47a74d8fb00; + + /// @notice Storage struct for the OptimismSuperchainERC20 metadata. + /// @custom:storage-location erc7201:optimismSuperchainERC20.metadata + struct OptimismSuperchainERC20Metadata { + /// @notice Address of the corresponding version of this token on the remote chain. + address remoteToken; + /// @notice Name of the token + string name; + /// @notice Symbol of the token + string symbol; + /// @notice Decimals of the token + uint8 decimals; + } + + /// @notice Returns the storage for the OptimismSuperchainERC20Metadata. + function _getMetadataStorage() private pure returns (OptimismSuperchainERC20Metadata storage _storage) { + assembly { + _storage.slot := OPTIMISM_SUPERCHAIN_ERC20_METADATA_SLOT + } + } + + /// @notice A modifier that only allows the bridge to call + modifier onlyBridge() { + if (msg.sender != BRIDGE) revert OnlyBridge(); + _; + } + + /// @notice Semantic version. + /// @custom:semver 1.0.0-beta.1 + string public constant version = "1.0.0-beta.1"; + + /// @notice Constructs the OptimismSuperchainERC20 contract. + constructor() { + _disableInitializers(); + } + + /// @notice Initializes the contract. + /// @param _remoteToken Address of the corresponding remote token. + /// @param _name ERC20 name. + /// @param _symbol ERC20 symbol. + /// @param _decimals ERC20 decimals. + function initialize( + address _remoteToken, + string memory _name, + string memory _symbol, + uint8 _decimals + ) + external + initializer + { + OptimismSuperchainERC20Metadata storage _storage = _getMetadataStorage(); + _storage.remoteToken = _remoteToken; + _storage.name = _name; + _storage.symbol = _symbol; + _storage.decimals = _decimals; + } + + /// @notice Allows the L2StandardBridge to mint tokens. + /// @param _to Address to mint tokens to. + /// @param _amount Amount of tokens to mint. + function mint(address _to, uint256 _amount) external virtual onlyBridge { + if (_to == address(0)) revert ZeroAddress(); + + _mint(_to, _amount); + + emit Mint(_to, _amount); + } + + /// @notice Allows the L2StandardBridge to burn tokens. + /// @param _from Address to burn tokens from. + /// @param _amount Amount of tokens to burn. + function burn(address _from, uint256 _amount) external virtual onlyBridge { + if (_from == address(0)) revert ZeroAddress(); + + _burn(_from, _amount); + + emit Burn(_from, _amount); + } + + /// @notice Sends tokens to some target address on another chain. + /// @param _to Address to send tokens to. + /// @param _amount Amount of tokens to send. + /// @param _chainId Chain ID of the destination chain. + function sendERC20(address _to, uint256 _amount, uint256 _chainId) external { + if (_to == address(0)) revert ZeroAddress(); + + _burn(msg.sender, _amount); + + bytes memory _message = abi.encodeCall(this.relayERC20, (msg.sender, _to, _amount)); + IL2ToL2CrossDomainMessenger(MESSENGER).sendMessage(_chainId, address(this), _message); + + emit SendERC20(msg.sender, _to, _amount, _chainId); + } + + /// @notice Relays tokens received from another chain. + /// @param _from Address of the msg.sender of sendERC20 on the source chain. + /// @param _to Address to relay tokens to. + /// @param _amount Amount of tokens to relay. + function relayERC20(address _from, address _to, uint256 _amount) external { + if (_to == address(0)) revert ZeroAddress(); + + if (msg.sender != MESSENGER) revert CallerNotL2ToL2CrossDomainMessenger(); + + if (IL2ToL2CrossDomainMessenger(MESSENGER).crossDomainMessageSender() != address(this)) { + revert InvalidCrossDomainSender(); + } + + uint256 source = IL2ToL2CrossDomainMessenger(MESSENGER).crossDomainMessageSource(); + + _mint(_to, _amount); + + emit RelayERC20(_from, _to, _amount, source); + } + + /// @notice Returns the address of the corresponding version of this token on the remote chain. + function remoteToken() public view override returns (address) { + return _getMetadataStorage().remoteToken; + } + + /// @notice Returns the name of the token. + function name() public view virtual override returns (string memory) { + return _getMetadataStorage().name; + } + + /// @notice Returns the symbol of the token. + function symbol() public view virtual override returns (string memory) { + return _getMetadataStorage().symbol; + } + + /// @notice Returns the number of decimals used to get its user representation. + /// For example, if `decimals` equals `2`, a balance of `505` tokens should + /// be displayed to a user as `5.05` (`505 / 10 ** 2`). + /// NOTE: This information is only used for _display_ purposes: it in + /// no way affects any of the arithmetic of the contract, including + /// {IERC20-balanceOf} and {IERC20-transfer}. + function decimals() public view override returns (uint8) { + return _getMetadataStorage().decimals; + } + + /// @notice ERC165 interface check function. + /// @param _interfaceId Interface ID to check. + /// @return Whether or not the interface is supported by this contract. + function supportsInterface(bytes4 _interfaceId) public view virtual override returns (bool) { + return + _interfaceId == type(IOptimismSuperchainERC20Extension).interfaceId || super.supportsInterface(_interfaceId); + } +} diff --git a/packages/contracts-bedrock/src/L2/SuperchainWETH.sol b/packages/contracts-bedrock/src/L2/SuperchainWETH.sol index 6e5a8c1fe4e1..7080460254fc 100644 --- a/packages/contracts-bedrock/src/L2/SuperchainWETH.sol +++ b/packages/contracts-bedrock/src/L2/SuperchainWETH.sol @@ -45,7 +45,7 @@ contract SuperchainWETH is WETH98, ISuperchainERC20Extensions, ISemver { IL2ToL2CrossDomainMessenger(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER).sendMessage({ _destination: chainId, _target: address(this), - _message: abi.encodeCall(this.relayERC20, (dst, wad)) + _message: abi.encodeCall(this.relayERC20, (msg.sender, dst, wad)) }); // Emit event. @@ -53,7 +53,7 @@ contract SuperchainWETH is WETH98, ISuperchainERC20Extensions, ISemver { } /// @inheritdoc ISuperchainERC20Extensions - function relayERC20(address dst, uint256 wad) external { + function relayERC20(address from, address dst, uint256 wad) external { // Receive message from other chain. IL2ToL2CrossDomainMessenger messenger = IL2ToL2CrossDomainMessenger(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER); if (msg.sender != address(messenger)) revert Unauthorized(); @@ -64,11 +64,14 @@ contract SuperchainWETH is WETH98, ISuperchainERC20Extensions, ISemver { ETHLiquidity(Predeploys.ETH_LIQUIDITY).mint(wad); } + // Get source chain ID. + uint256 source = messenger.crossDomainMessageSource(); + // Mint to user's balance. _mint(dst, wad); // Emit event. - emit RelayERC20(dst, wad); + emit RelayERC20(from, dst, wad, source); } /// @notice Mints WETH to an address. diff --git a/packages/contracts-bedrock/test/L2/OptimismSuperchainERC20.t.sol b/packages/contracts-bedrock/test/L2/OptimismSuperchainERC20.t.sol new file mode 100644 index 000000000000..84580fdd8687 --- /dev/null +++ b/packages/contracts-bedrock/test/L2/OptimismSuperchainERC20.t.sol @@ -0,0 +1,386 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.25; + +// Testing utilities +import { Test } from "forge-std/Test.sol"; + +// Libraries +import { Predeploys } from "src/libraries/Predeploys.sol"; +import { IERC20 } from "@openzeppelin/contracts-v5/token/ERC20/IERC20.sol"; +import { IL2ToL2CrossDomainMessenger } from "src/L2/IL2ToL2CrossDomainMessenger.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts-v5/proxy/ERC1967/ERC1967Proxy.sol"; +import { Initializable } from "@openzeppelin/contracts-v5/proxy/utils/Initializable.sol"; +import { IERC165 } from "@openzeppelin/contracts-v5/utils/introspection/IERC165.sol"; + +// Target contract +import { + OptimismSuperchainERC20, + IOptimismSuperchainERC20Extension, + CallerNotL2ToL2CrossDomainMessenger, + InvalidCrossDomainSender, + OnlyBridge, + ZeroAddress +} from "src/L2/OptimismSuperchainERC20.sol"; +import { ISuperchainERC20Extensions } from "src/L2/ISuperchainERC20.sol"; + +/// @title OptimismSuperchainERC20Test +/// @notice Contract for testing the OptimismSuperchainERC20 contract. +contract OptimismSuperchainERC20Test is Test { + address internal constant ZERO_ADDRESS = address(0); + address internal constant REMOTE_TOKEN = address(0x123); + string internal constant NAME = "OptimismSuperchainERC20"; + string internal constant SYMBOL = "SCE"; + uint8 internal constant DECIMALS = 18; + address internal constant BRIDGE = Predeploys.L2_STANDARD_BRIDGE; + address internal constant MESSENGER = Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER; + + OptimismSuperchainERC20 public superchainERC20Impl; + OptimismSuperchainERC20 public superchainERC20; + + /// @notice Sets up the test suite. + function setUp() public { + superchainERC20Impl = new OptimismSuperchainERC20(); + superchainERC20 = _deploySuperchainERC20Proxy(REMOTE_TOKEN, NAME, SYMBOL, DECIMALS); + } + + /// @notice Helper function to deploy a proxy of the OptimismSuperchainERC20 contract. + function _deploySuperchainERC20Proxy( + address _remoteToken, + string memory _name, + string memory _symbol, + uint8 _decimals + ) + internal + returns (OptimismSuperchainERC20) + { + return OptimismSuperchainERC20( + address( + // TODO: Use the SuperchainERC20 Beacon Proxy + new ERC1967Proxy( + address(superchainERC20Impl), + abi.encodeCall(OptimismSuperchainERC20.initialize, (_remoteToken, _name, _symbol, _decimals)) + ) + ) + ); + } + + /// @notice Helper function to setup a mock and expect a call to it. + function _mockAndExpect(address _receiver, bytes memory _calldata, bytes memory _returned) internal { + vm.mockCall(_receiver, _calldata, _returned); + vm.expectCall(_receiver, _calldata); + } + + /// @notice Test that the contract's `initializer` sets the correct values. + function test_initializer_succeeds() public view { + assertEq(superchainERC20.name(), NAME); + assertEq(superchainERC20.symbol(), SYMBOL); + assertEq(superchainERC20.decimals(), DECIMALS); + assertEq(superchainERC20.remoteToken(), REMOTE_TOKEN); + } + + /// @notice Tests the `initialize` function reverts when the contract is already initialized. + function testFuzz_initializer_reverts( + address _remoteToken, + string memory _name, + string memory _symbol, + uint8 _decimals + ) + public + { + // Expect the revert with `InvalidInitialization` selector + vm.expectRevert(Initializable.InvalidInitialization.selector); + + // Call the `initialize` function again + superchainERC20.initialize(_remoteToken, _name, _symbol, _decimals); + } + + /// @notice Tests the `mint` function reverts when the caller is not the bridge. + function testFuzz_mint_callerNotBridge_reverts(address _caller, address _to, uint256 _amount) public { + // Ensure the caller is not the bridge + vm.assume(_caller != BRIDGE); + + // Expect the revert with `OnlyBridge` selector + vm.expectRevert(OnlyBridge.selector); + + // Call the `mint` function with the non-bridge caller + vm.prank(_caller); + superchainERC20.mint(_to, _amount); + } + + /// @notice Tests the `mint` function reverts when the amount is zero. + function testFuzz_mint_zeroAddressTo_reverts(uint256 _amount) public { + // Expect the revert with `ZeroAddress` selector + vm.expectRevert(ZeroAddress.selector); + + // Call the `mint` function with the zero address + vm.prank(BRIDGE); + superchainERC20.mint({ _to: ZERO_ADDRESS, _amount: _amount }); + } + + /// @notice Tests the `mint` succeeds and emits the `Mint` event. + function testFuzz_mint_succeeds(address _to, uint256 _amount) public { + // Ensure `_to` is not the zero address + vm.assume(_to != ZERO_ADDRESS); + + // Get the total supply and balance of `_to` before the mint to compare later on the assertions + uint256 _totalSupplyBefore = superchainERC20.totalSupply(); + uint256 _toBalanceBefore = superchainERC20.balanceOf(_to); + + // Look for the emit of the `Transfer` event + vm.expectEmit(true, true, true, true, address(superchainERC20)); + emit IERC20.Transfer(ZERO_ADDRESS, _to, _amount); + + // Look for the emit of the `Mint` event + vm.expectEmit(true, true, true, true, address(superchainERC20)); + emit IOptimismSuperchainERC20Extension.Mint(_to, _amount); + + // Call the `mint` function with the bridge caller + vm.prank(BRIDGE); + superchainERC20.mint(_to, _amount); + + // Check the total supply and balance of `_to` after the mint were updated correctly + assertEq(superchainERC20.totalSupply(), _totalSupplyBefore + _amount); + assertEq(superchainERC20.balanceOf(_to), _toBalanceBefore + _amount); + } + + /// @notice Tests the `burn` function reverts when the caller is not the bridge. + function testFuzz_burn_callerNotBridge_reverts(address _caller, address _from, uint256 _amount) public { + // Ensure the caller is not the bridge + vm.assume(_caller != BRIDGE); + + // Expect the revert with `OnlyBridge` selector + vm.expectRevert(OnlyBridge.selector); + + // Call the `burn` function with the non-bridge caller + vm.prank(_caller); + superchainERC20.burn(_from, _amount); + } + + /// @notice Tests the `burn` function reverts when the amount is zero. + function testFuzz_burn_zeroAddressFrom_reverts(uint256 _amount) public { + // Expect the revert with `ZeroAddress` selector + vm.expectRevert(ZeroAddress.selector); + + // Call the `burn` function with the zero address + vm.prank(BRIDGE); + superchainERC20.burn({ _from: ZERO_ADDRESS, _amount: _amount }); + } + + /// @notice Tests the `burn` burns the amount and emits the `Burn` event. + function testFuzz_burn_succeeds(address _from, uint256 _amount) public { + // Ensure `_from` is not the zero address + vm.assume(_from != ZERO_ADDRESS); + + // Mint some tokens to `_from` so then they can be burned + vm.prank(BRIDGE); + superchainERC20.mint(_from, _amount); + + // Get the total supply and balance of `_from` before the burn to compare later on the assertions + uint256 _totalSupplyBefore = superchainERC20.totalSupply(); + uint256 _fromBalanceBefore = superchainERC20.balanceOf(_from); + + // Look for the emit of the `Transfer` event + vm.expectEmit(true, true, true, true, address(superchainERC20)); + emit IERC20.Transfer(_from, ZERO_ADDRESS, _amount); + + // Look for the emit of the `Burn` event + vm.expectEmit(true, true, true, true, address(superchainERC20)); + emit IOptimismSuperchainERC20Extension.Burn(_from, _amount); + + // Call the `burn` function with the bridge caller + vm.prank(BRIDGE); + superchainERC20.burn(_from, _amount); + + // Check the total supply and balance of `_from` after the burn were updated correctly + assertEq(superchainERC20.totalSupply(), _totalSupplyBefore - _amount); + assertEq(superchainERC20.balanceOf(_from), _fromBalanceBefore - _amount); + } + + /// @notice Tests the `sendERC20` function reverts when the `_to` address is the zero address. + function testFuzz_sendERC20_zeroAddressTo_reverts(uint256 _amount, uint256 _chainId) public { + // Expect the revert with `ZeroAddress` selector + vm.expectRevert(ZeroAddress.selector); + + // Call the `sendERC20` function with the zero address + vm.prank(BRIDGE); + superchainERC20.sendERC20({ _to: ZERO_ADDRESS, _amount: _amount, _chainId: _chainId }); + } + + /// @notice Tests the `sendERC20` function burns the sender tokens, sends the message, and emits the `SendERC20` + /// event. + function testFuzz_sendERC20_succeeds(address _sender, address _to, uint256 _amount, uint256 _chainId) external { + // Ensure `_sender` is not the zero address + vm.assume(_sender != ZERO_ADDRESS); + vm.assume(_to != ZERO_ADDRESS); + + // Mint some tokens to the sender so then they can be sent + vm.prank(BRIDGE); + superchainERC20.mint(_sender, _amount); + + // Get the total supply and balance of `_sender` before the send to compare later on the assertions + uint256 _totalSupplyBefore = superchainERC20.totalSupply(); + uint256 _senderBalanceBefore = superchainERC20.balanceOf(_sender); + + // Look for the emit of the `Transfer` event + vm.expectEmit(true, true, true, true, address(superchainERC20)); + emit IERC20.Transfer(_sender, ZERO_ADDRESS, _amount); + + // Look for the emit of the `SendERC20` event + vm.expectEmit(true, true, true, true, address(superchainERC20)); + emit ISuperchainERC20Extensions.SendERC20(_sender, _to, _amount, _chainId); + + // Mock the call over the `sendMessage` function and expect it to be called properly + bytes memory _message = abi.encodeCall(superchainERC20.relayERC20, (_sender, _to, _amount)); + _mockAndExpect( + MESSENGER, + abi.encodeWithSelector( + IL2ToL2CrossDomainMessenger.sendMessage.selector, _chainId, address(superchainERC20), _message + ), + abi.encode("") + ); + + // Call the `sendERC20` function + vm.prank(_sender); + superchainERC20.sendERC20(_to, _amount, _chainId); + + // Check the total supply and balance of `_sender` after the send were updated correctly + assertEq(superchainERC20.totalSupply(), _totalSupplyBefore - _amount); + assertEq(superchainERC20.balanceOf(_sender), _senderBalanceBefore - _amount); + } + + /// @notice Tests the `relayERC20` function reverts when the caller is not the L2ToL2CrossDomainMessenger. + function testFuzz_relayERC20_notMessenger_reverts(address _caller, address _to, uint256 _amount) public { + // Ensure the caller is not the messenger + vm.assume(_caller != MESSENGER); + vm.assume(_to != ZERO_ADDRESS); + + // Expect the revert with `CallerNotL2ToL2CrossDomainMessenger` selector + vm.expectRevert(CallerNotL2ToL2CrossDomainMessenger.selector); + + // Call the `relayERC20` function with the non-messenger caller + vm.prank(_caller); + superchainERC20.relayERC20(_caller, _to, _amount); + } + + /// @notice Tests the `relayERC20` function reverts when the `crossDomainMessageSender` that sent the message is not + /// the same SuperchainERC20 address. + function testFuzz_relayERC20_notCrossDomainSender_reverts( + address _crossDomainMessageSender, + address _to, + uint256 _amount + ) + public + { + vm.assume(_to != ZERO_ADDRESS); + vm.assume(_crossDomainMessageSender != address(superchainERC20)); + + // Mock the call over the `crossDomainMessageSender` function setting a wrong sender + vm.mockCall( + MESSENGER, + abi.encodeWithSelector(IL2ToL2CrossDomainMessenger.crossDomainMessageSender.selector), + abi.encode(_crossDomainMessageSender) + ); + + // Expect the revert with `InvalidCrossDomainSender` selector + vm.expectRevert(InvalidCrossDomainSender.selector); + + // Call the `relayERC20` function with the sender caller + vm.prank(MESSENGER); + superchainERC20.relayERC20(_crossDomainMessageSender, _to, _amount); + } + + /// @notice Tests the `relayERC20` function reverts when the `_to` address is the zero address. + function testFuzz_relayERC20_zeroAddressTo_reverts(uint256 _amount) public { + // Expect the revert with `ZeroAddress` selector + vm.expectRevert(ZeroAddress.selector); + + // Mock the call over the `crossDomainMessageSender` function setting the same address as value + vm.mockCall( + MESSENGER, + abi.encodeWithSelector(IL2ToL2CrossDomainMessenger.crossDomainMessageSender.selector), + abi.encode(address(superchainERC20)) + ); + + // Call the `relayERC20` function with the zero address + vm.prank(MESSENGER); + superchainERC20.relayERC20({ _from: ZERO_ADDRESS, _to: ZERO_ADDRESS, _amount: _amount }); + } + + /// @notice Tests the `relayERC20` mints the proper amount and emits the `RelayERC20` event. + function testFuzz_relayERC20_succeeds(address _from, address _to, uint256 _amount, uint256 _source) public { + vm.assume(_from != ZERO_ADDRESS); + vm.assume(_to != ZERO_ADDRESS); + + // Mock the call over the `crossDomainMessageSender` function setting the same address as value + _mockAndExpect( + MESSENGER, + abi.encodeWithSelector(IL2ToL2CrossDomainMessenger.crossDomainMessageSender.selector), + abi.encode(address(superchainERC20)) + ); + + // Mock the call over the `crossDomainMessageSource` function setting the source chain ID as value + _mockAndExpect( + MESSENGER, + abi.encodeWithSelector(IL2ToL2CrossDomainMessenger.crossDomainMessageSource.selector), + abi.encode(_source) + ); + + // Get the total supply and balance of `_to` before the relay to compare later on the assertions + uint256 _totalSupplyBefore = superchainERC20.totalSupply(); + uint256 _toBalanceBefore = superchainERC20.balanceOf(_to); + + // Look for the emit of the `Transfer` event + vm.expectEmit(true, true, true, true, address(superchainERC20)); + emit IERC20.Transfer(ZERO_ADDRESS, _to, _amount); + + // Look for the emit of the `RelayERC20` event + vm.expectEmit(true, true, true, true, address(superchainERC20)); + emit ISuperchainERC20Extensions.RelayERC20(_from, _to, _amount, _source); + + // Call the `relayERC20` function with the messenger caller + vm.prank(MESSENGER); + superchainERC20.relayERC20(_from, _to, _amount); + + // Check the total supply and balance of `_to` after the relay were updated correctly + assertEq(superchainERC20.totalSupply(), _totalSupplyBefore + _amount); + assertEq(superchainERC20.balanceOf(_to), _toBalanceBefore + _amount); + } + + /// @notice Tests the `decimals` function always returns the correct value. + function testFuzz_decimals_succeeds(uint8 _decimals) public { + OptimismSuperchainERC20 _newSuperchainERC20 = _deploySuperchainERC20Proxy(REMOTE_TOKEN, NAME, SYMBOL, _decimals); + assertEq(_newSuperchainERC20.decimals(), _decimals); + } + + /// @notice Tests the `REMOTE_TOKEN` function always returns the correct value. + function testFuzz_remoteToken_succeeds(address _remoteToken) public { + OptimismSuperchainERC20 _newSuperchainERC20 = _deploySuperchainERC20Proxy(_remoteToken, NAME, SYMBOL, DECIMALS); + assertEq(_newSuperchainERC20.remoteToken(), _remoteToken); + } + + /// @notice Tests the `name` function always returns the correct value. + function testFuzz_name_succeeds(string memory _name) public { + OptimismSuperchainERC20 _newSuperchainERC20 = _deploySuperchainERC20Proxy(REMOTE_TOKEN, _name, SYMBOL, DECIMALS); + assertEq(_newSuperchainERC20.name(), _name); + } + + /// @notice Tests the `symbol` function always returns the correct value. + function testFuzz_symbol_succeeds(string memory _symbol) public { + OptimismSuperchainERC20 _newSuperchainERC20 = _deploySuperchainERC20Proxy(REMOTE_TOKEN, NAME, _symbol, DECIMALS); + assertEq(_newSuperchainERC20.symbol(), _symbol); + } + + /// @notice Tests that the `supportsInterface` function returns true for the `IOptimismSuperchainERC20` interface. + function test_supportInterface_succeeds() public view { + assertTrue(superchainERC20.supportsInterface(type(IERC165).interfaceId)); + assertTrue(superchainERC20.supportsInterface(type(IOptimismSuperchainERC20Extension).interfaceId)); + } + + /// @notice Tests that the `supportsInterface` function returns false for any other interface than the + /// `IOptimismSuperchainERC20` one. + function testFuzz_supportInterface_returnFalse(bytes4 _interfaceId) public view { + vm.assume(_interfaceId != type(IERC165).interfaceId); + vm.assume(_interfaceId != type(IOptimismSuperchainERC20Extension).interfaceId); + assertFalse(superchainERC20.supportsInterface(_interfaceId)); + } +} diff --git a/packages/contracts-bedrock/test/L2/SuperchainWETH.t.sol b/packages/contracts-bedrock/test/L2/SuperchainWETH.t.sol index 889ff8e8e40f..3bee1fc74b7d 100644 --- a/packages/contracts-bedrock/test/L2/SuperchainWETH.t.sol +++ b/packages/contracts-bedrock/test/L2/SuperchainWETH.t.sol @@ -26,7 +26,7 @@ contract SuperchainWETH_Test is CommonTest { event SendERC20(address indexed _from, address indexed _to, uint256 _amount, uint256 _chainId); /// @notice Emitted when an ERC20 send is relayed. - event RelayERC20(address indexed _to, uint256 _amount); + event RelayERC20(address indexed _from, address indexed _to, uint256 _amount, uint256 _source); /// @notice Test setup. function setUp() public virtual override { @@ -151,7 +151,11 @@ contract SuperchainWETH_Test is CommonTest { Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER, abi.encodeCall( IL2ToL2CrossDomainMessenger.sendMessage, - (_chainId, address(superchainWeth), abi.encodeCall(superchainWeth.relayERC20, (_recipient, _amount))) + ( + _chainId, + address(superchainWeth), + abi.encodeCall(superchainWeth.relayERC20, (_caller, _recipient, _amount)) + ) ), 1 ); @@ -189,7 +193,7 @@ contract SuperchainWETH_Test is CommonTest { Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER, abi.encodeCall( IL2ToL2CrossDomainMessenger.sendMessage, - (_chainId, address(superchainWeth), abi.encodeCall(superchainWeth.relayERC20, (bob, _amount))) + (_chainId, address(superchainWeth), abi.encodeCall(superchainWeth.relayERC20, (alice, bob, _amount))) ), 1 ); @@ -227,7 +231,7 @@ contract SuperchainWETH_Test is CommonTest { /// L2ToL2CrossDomainMessenger as long as the crossDomainMessageSender is the /// SuperchainWETH contract. /// @param _amount The amount of WETH to send. - function testFuzz_relayERC20_fromMessenger_succeeds(uint256 _amount) public { + function testFuzz_relayERC20_fromMessenger_succeeds(address _sender, uint256 _amount, uint256 _chainId) public { // Assume _amount = bound(_amount, 0, type(uint248).max - 1); @@ -237,13 +241,18 @@ contract SuperchainWETH_Test is CommonTest { abi.encodeCall(IL2ToL2CrossDomainMessenger.crossDomainMessageSender, ()), abi.encode(address(superchainWeth)) ); + vm.mockCall( + Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER, + abi.encodeCall(IL2ToL2CrossDomainMessenger.crossDomainMessageSource, ()), + abi.encode(_chainId) + ); // Act vm.expectEmit(address(superchainWeth)); - emit RelayERC20(bob, _amount); + emit RelayERC20(_sender, bob, _amount, _chainId); vm.expectCall(Predeploys.ETH_LIQUIDITY, abi.encodeCall(ETHLiquidity.mint, (_amount)), 1); vm.prank(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER); - superchainWeth.relayERC20(bob, _amount); + superchainWeth.relayERC20(_sender, bob, _amount); // Assert assertEq(address(superchainWeth).balance, _amount); @@ -255,7 +264,13 @@ contract SuperchainWETH_Test is CommonTest { /// SuperchainWETH contract, even when the chain is a custom gas token chain. Shows /// that ETH is not minted in this case but the SuperchainWETH balance is updated. /// @param _amount The amount of WETH to send. - function testFuzz_relayERC20_fromMessengerCustomGasTokenChain_succeeds(uint256 _amount) public { + function testFuzz_relayERC20_fromMessengerCustomGasTokenChain_succeeds( + address _sender, + uint256 _amount, + uint256 _chainId + ) + public + { // Assume _amount = bound(_amount, 0, type(uint248).max - 1); @@ -265,14 +280,19 @@ contract SuperchainWETH_Test is CommonTest { abi.encodeCall(IL2ToL2CrossDomainMessenger.crossDomainMessageSender, ()), abi.encode(address(superchainWeth)) ); + vm.mockCall( + Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER, + abi.encodeCall(IL2ToL2CrossDomainMessenger.crossDomainMessageSource, ()), + abi.encode(_chainId) + ); vm.mockCall(address(l1Block), abi.encodeCall(l1Block.isCustomGasToken, ()), abi.encode(true)); // Act vm.expectEmit(address(superchainWeth)); - emit RelayERC20(bob, _amount); + emit RelayERC20(_sender, bob, _amount, _chainId); vm.expectCall(Predeploys.ETH_LIQUIDITY, abi.encodeCall(ETHLiquidity.mint, (_amount)), 0); vm.prank(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER); - superchainWeth.relayERC20(bob, _amount); + superchainWeth.relayERC20(_sender, bob, _amount); // Assert assertEq(address(superchainWeth).balance, 0); @@ -282,7 +302,7 @@ contract SuperchainWETH_Test is CommonTest { /// @notice Tests that the relayERC20 function reverts when not called from the /// L2ToL2CrossDomainMessenger. /// @param _amount The amount of WETH to send. - function testFuzz_relayERC20_notFromMessenger_fails(uint256 _amount) public { + function testFuzz_relayERC20_notFromMessenger_fails(address _sender, uint256 _amount) public { // Assume _amount = bound(_amount, 0, type(uint248).max - 1); @@ -292,7 +312,7 @@ contract SuperchainWETH_Test is CommonTest { // Act vm.expectRevert(Unauthorized.selector); vm.prank(alice); - superchainWeth.relayERC20(bob, _amount); + superchainWeth.relayERC20(_sender, bob, _amount); // Assert assertEq(address(superchainWeth).balance, 0); @@ -303,7 +323,7 @@ contract SuperchainWETH_Test is CommonTest { /// L2ToL2CrossDomainMessenger but the crossDomainMessageSender is not the /// SuperchainWETH contract. /// @param _amount The amount of WETH to send. - function testFuzz_relayERC20_fromMessengerNotFromSuperchainWETH_fails(uint256 _amount) public { + function testFuzz_relayERC20_fromMessengerNotFromSuperchainWETH_fails(address _sender, uint256 _amount) public { // Assume _amount = bound(_amount, 0, type(uint248).max - 1); @@ -317,7 +337,7 @@ contract SuperchainWETH_Test is CommonTest { // Act vm.expectRevert(Unauthorized.selector); vm.prank(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER); - superchainWeth.relayERC20(bob, _amount); + superchainWeth.relayERC20(_sender, bob, _amount); // Assert assertEq(address(superchainWeth).balance, 0); diff --git a/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20.t.sol b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20.t.sol new file mode 100644 index 000000000000..028a0124e6ca --- /dev/null +++ b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20.t.sol @@ -0,0 +1,225 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.25; + +// Testing utilities +import { Test, StdUtils, Vm } from "forge-std/Test.sol"; +import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; + +// Libraries +import { Predeploys } from "src/libraries/Predeploys.sol"; +import { OptimismSuperchainERC20 } from "src/L2/OptimismSuperchainERC20.sol"; +import { IL2ToL2CrossDomainMessenger } from "src/L2/IL2ToL2CrossDomainMessenger.sol"; + +/// @title OptimismSuperchainERC20_User +/// @notice Actor contract that interacts with the OptimismSuperchainERC20 contract. +contract OptimismSuperchainERC20_User is StdUtils { + address public immutable receiver; + + /// @notice Cross domain message data. + struct MessageData { + bytes32 id; + uint256 amount; + } + + uint256 public totalAmountSent; + uint256 public totalAmountRelayed; + + /// @notice Flag to indicate if the test has failed. + bool public failed = false; + + /// @notice The Vm contract. + Vm internal vm; + + /// @notice The OptimismSuperchainERC20 contract. + OptimismSuperchainERC20 internal superchainERC20; + + /// @notice Mapping of sent messages. + mapping(bytes32 => bool) internal sent; + + /// @notice Array of unrelayed messages. + MessageData[] internal unrelayed; + + /// @param _vm The Vm contract. + /// @param _superchainERC20 The OptimismSuperchainERC20 contract. + /// @param _balance The initial balance of the contract. + constructor(Vm _vm, OptimismSuperchainERC20 _superchainERC20, uint256 _balance, address _receiver) { + vm = _vm; + superchainERC20 = _superchainERC20; + + // Mint balance to this actor. + vm.prank(Predeploys.L2_STANDARD_BRIDGE); + superchainERC20.mint(address(this), _balance); + receiver = _receiver; + } + + /// @notice Send ERC20 tokens to another chain. + /// @param _amount The amount of ERC20 tokens to send. + /// @param _chainId The chain ID to send the tokens to. + /// @param _messageId The message ID. + function sendERC20(uint256 _amount, uint256 _chainId, bytes32 _messageId) public { + // Make sure we aren't reusing a message ID. + if (sent[_messageId]) { + return; + } + + // Bound send amount to our ERC20 balance. + _amount = bound(_amount, 0, superchainERC20.balanceOf(address(this))); + + // Send the amount. + try superchainERC20.sendERC20(receiver, _amount, _chainId) { + // Success. + totalAmountSent += _amount; + } catch { + failed = true; + } + + // Mark message as sent. + sent[_messageId] = true; + unrelayed.push(MessageData({ id: _messageId, amount: _amount })); + } + + /// @notice Relay a message from another chain. + function relayMessage(uint256 _source) public { + // Make sure there are unrelayed messages. + if (unrelayed.length == 0) { + return; + } + + // Grab the latest unrelayed message. + MessageData memory message = unrelayed[unrelayed.length - 1]; + + // Simulate the cross-domain message. + // Make sure the cross-domain message sender is set to this contract. + vm.mockCall( + Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER, + abi.encodeCall(IL2ToL2CrossDomainMessenger.crossDomainMessageSender, ()), + abi.encode(address(superchainERC20)) + ); + + // Simulate the cross-domain message source to any chain. + vm.mockCall( + Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER, + abi.encodeCall(IL2ToL2CrossDomainMessenger.crossDomainMessageSource, ()), + abi.encode(_source) + ); + + // Prank the relayERC20 function. + // Balance will just go back to our own account. + vm.prank(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER); + try superchainERC20.relayERC20(address(this), receiver, message.amount) { + // Success. + totalAmountRelayed += message.amount; + } catch { + failed = true; + } + + // Remove the message from the unrelayed list. + unrelayed.pop(); + } +} + +/// @title OptimismSuperchainERC20_Invariant +/// @notice Invariant test that checks that sending OptimismSuperchainERC20 always succeeds if the actor has a +/// sufficient balance to do so and that the actor's balance does not increase out of nowhere. +contract OptimismSuperchainERC20_Invariant is Test { + /// @notice Starting balance of the contract. + uint256 public constant STARTING_BALANCE = type(uint128).max; + + /// @notice The OptimismSuperchainERC20 contract implementation. + address internal optimismSuperchainERC20Impl; + + /// @notice The OptimismSuperchainERC20_User actor. + OptimismSuperchainERC20_User internal actor; + + /// @notice The OptimismSuperchainERC20 contract. + OptimismSuperchainERC20 internal optimismSuperchainERC20; + + /// @notice The address that will receive the tokens when relaying messages + address internal receiver = makeAddr("receiver"); + + /// @notice Test setup. + function setUp() public { + // Deploy the L2ToL2CrossDomainMessenger contract. + address _impl = _setImplementationCode(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER); + _setProxyCode(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER, _impl); + + // Create a new OptimismSuperchainERC20 implementation. + optimismSuperchainERC20Impl = address(new OptimismSuperchainERC20()); + + // Deploy the OptimismSuperchainERC20 contract. + address _proxy = address(0x123456); + _setProxyCode(_proxy, optimismSuperchainERC20Impl); + optimismSuperchainERC20 = OptimismSuperchainERC20(_proxy); + + // Create a new OptimismSuperchainERC20_User actor. + actor = new OptimismSuperchainERC20_User(vm, optimismSuperchainERC20, STARTING_BALANCE, receiver); + + // Set the target contract. + targetContract(address(actor)); + + // Set the target selectors. + bytes4[] memory selectors = new bytes4[](2); + selectors[0] = actor.sendERC20.selector; + selectors[1] = actor.relayMessage.selector; + FuzzSelector memory selector = FuzzSelector({ addr: address(actor), selectors: selectors }); + targetSelector(selector); + + // Setup assertions + assert(optimismSuperchainERC20.balanceOf(address(actor)) == STARTING_BALANCE); + assert(optimismSuperchainERC20.balanceOf(address(receiver)) == 0); + assert(optimismSuperchainERC20.totalSupply() == STARTING_BALANCE); + } + + /// @notice Sets the bytecode in the implementation address. + function _setImplementationCode(address _addr) internal returns (address) { + string memory cname = Predeploys.getName(_addr); + address impl = Predeploys.predeployToCodeNamespace(_addr); + vm.etch(impl, vm.getDeployedCode(string.concat(cname, ".sol:", cname))); + return impl; + } + + /// @notice Sets the bytecode in the proxy address. + function _setProxyCode(address _addr, address _impl) internal { + bytes memory code = vm.getDeployedCode("universal/Proxy.sol:Proxy"); + vm.etch(_addr, code); + EIP1967Helper.setAdmin(_addr, Predeploys.PROXY_ADMIN); + EIP1967Helper.setImplementation(_addr, _impl); + } + + /// @notice Invariant that checks that sending OptimismSuperchainERC20 always succeeds. + /// @custom:invariant Calls to sendERC20 should always succeed as long as the actor has enough balance. + /// Actor's balance should also not increase out of nowhere but instead should decrease by the + /// amount sent. + function invariant_sendERC20_succeeds() public view { + // Assert that the actor has not failed to send OptimismSuperchainERC20. + assertTrue(!actor.failed()); + + // Assert that the actor has sent more than or equal to the amount relayed. + assertTrue(actor.totalAmountSent() >= actor.totalAmountRelayed()); + + // Assert that the actor's balance has decreased by the amount sent. + assertEq(optimismSuperchainERC20.balanceOf(address(actor)), STARTING_BALANCE - actor.totalAmountSent()); + + // Assert that the total supply of the OptimismSuperchainERC20 contract has decreased by the amount unrelayed. + uint256 _unrelayedAmount = actor.totalAmountSent() - actor.totalAmountRelayed(); + assertEq(optimismSuperchainERC20.totalSupply(), STARTING_BALANCE - _unrelayedAmount); + } + + /// @notice Invariant that checks that relaying OptimismSuperchainERC20 always succeeds. + /// @custom:invariant Calls to relayERC20 should always succeeds when a message is received from another chain. + /// Actor's balance should only increase by the amount relayed. + function invariant_relayERC20_succeeds() public view { + // Assert that the actor has not failed to relay OptimismSuperchainERC20. + assertTrue(!actor.failed()); + + // Assert that the actor has sent more than or equal to the amount relayed. + assertTrue(actor.totalAmountSent() >= actor.totalAmountRelayed()); + + // Assert that the actor's balance has increased by the amount relayed. + assertEq(optimismSuperchainERC20.balanceOf(address(receiver)), actor.totalAmountRelayed()); + + // Assert that the total supply of the OptimismSuperchainERC20 contract has decreased by the amount unrelayed. + uint256 _unrelayedAmount = actor.totalAmountSent() - actor.totalAmountRelayed(); + assertEq(optimismSuperchainERC20.totalSupply(), STARTING_BALANCE - _unrelayedAmount); + } +} diff --git a/packages/contracts-bedrock/test/invariants/SuperchainWETH.t.sol b/packages/contracts-bedrock/test/invariants/SuperchainWETH.t.sol index 8d5475d15040..aeb250bcc36a 100644 --- a/packages/contracts-bedrock/test/invariants/SuperchainWETH.t.sol +++ b/packages/contracts-bedrock/test/invariants/SuperchainWETH.t.sol @@ -103,7 +103,7 @@ contract SuperchainWETH_User is StdUtils { } /// @notice Relay a message from another chain. - function relayMessage() public { + function relayMessage(uint256 _source) public { // Make sure there are unrelayed messages. if (unrelayed.length == 0) { return; @@ -120,10 +120,17 @@ contract SuperchainWETH_User is StdUtils { abi.encode(address(weth)) ); + // Simulate the cross-domain message source to any chain. + vm.mockCall( + Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER, + abi.encodeCall(IL2ToL2CrossDomainMessenger.crossDomainMessageSource, ()), + abi.encode(_source) + ); + // Prank the relayERC20 function. // Balance will just go back to our own account. vm.prank(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER); - try weth.relayERC20(address(this), message.amount) { + try weth.relayERC20(address(this), address(this), message.amount) { // Success. } catch { failed = true; diff --git a/packages/contracts-bedrock/test/vendor/Initializable.t.sol b/packages/contracts-bedrock/test/vendor/Initializable.t.sol index 73177a36f1a5..93947d8eaa66 100644 --- a/packages/contracts-bedrock/test/vendor/Initializable.t.sol +++ b/packages/contracts-bedrock/test/vendor/Initializable.t.sol @@ -352,7 +352,8 @@ contract Initializer_Test is Bridge_Initializer { // Ensure that all L1, L2 `Initializable` contracts are accounted for, in addition to // OptimismMintableERC20FactoryImpl, OptimismMintableERC20FactoryProxy, OptimismPortal2, // DisputeGameFactoryImpl, DisputeGameFactoryProxy, DelayedWETHImpl, DelayedWETHProxy. - assertEq(_getNumInitializable() + 1, contracts.length); + // Omitting OptimismSuperchainERC20 due to using OZ v5 Initializable. + assertEq(_getNumInitializable(), contracts.length); // Attempt to re-initialize all contracts within the `contracts` array. for (uint256 i; i < contracts.length; i++) { diff --git a/packages/contracts-bedrock/test/vendor/InitializableOZv5.t.sol b/packages/contracts-bedrock/test/vendor/InitializableOZv5.t.sol new file mode 100644 index 000000000000..0820f987414a --- /dev/null +++ b/packages/contracts-bedrock/test/vendor/InitializableOZv5.t.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.25; + +import { Test } from "forge-std/Test.sol"; +import { OptimismSuperchainERC20 } from "src/L2/OptimismSuperchainERC20.sol"; +import { Initializable } from "@openzeppelin/contracts-v5/proxy/utils/Initializable.sol"; + +/// @title InitializerOZv5_Test +/// @dev Ensures that the `initialize()` function on contracts cannot be called more than +/// once. Tests the contracts inheriting from `Initializable` from OpenZeppelin Contracts v5. +contract InitializerOZv5_Test is Test { + /// @notice The storage slot of the `initialized` flag in the `Initializable` contract from OZ v5. + /// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff)) + bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00; + + /// @notice Contains the address of an `Initializable` contract and the calldata + /// used to initialize it. + struct InitializeableContract { + address target; + bytes initCalldata; + } + + /// @notice Contains the addresses of the contracts to test as well as the calldata + /// used to initialize them. + InitializeableContract[] contracts; + + function setUp() public { + // Initialize the `contracts` array with the addresses of the contracts to test and the + // calldata used to initialize them + + // OptimismSuperchainERC20 + contracts.push( + InitializeableContract({ + target: address(new OptimismSuperchainERC20()), + initCalldata: abi.encodeCall(OptimismSuperchainERC20.initialize, (address(0), "", "", 18)) + }) + ); + } + + /// @notice Tests that: + /// 1. The `initialized` flag of each contract is properly set to `type(uint64).max`, + /// signifying that the contracts are initialized. + /// 2. The `initialize()` function of each contract cannot be called more than once. + /// 3. Returns the correct error when attempting to re-initialize a contract. + function test_cannotReinitialize_succeeds() public { + // Attempt to re-initialize all contracts within the `contracts` array. + for (uint256 i; i < contracts.length; i++) { + InitializeableContract memory _contract = contracts[i]; + uint256 size; + address target = _contract.target; + assembly { + size := extcodesize(target) + } + + // Assert that the contract is already initialized. + bytes32 slotVal = vm.load(_contract.target, INITIALIZABLE_STORAGE); + uint64 initialized = uint64(uint256(slotVal)); + assertEq(initialized, type(uint64).max); + + // Then, attempt to re-initialize the contract. This should fail. + (bool success, bytes memory returnData) = _contract.target.call(_contract.initCalldata); + assertFalse(success); + assertEq(bytes4(returnData), Initializable.InvalidInitialization.selector); + } + } +} From 2e94c77f31f2b65f162287ffc0b5e28bde966c0f Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Tue, 13 Aug 2024 18:43:48 +1000 Subject: [PATCH 58/59] op-node: Fix p2p data races (#11353) * Fix data races around p2p records Fixes https://github.com/ethereum-optimism/optimism/issues/11328 * Remove some constructor boilerplate * Add data race fixes for op-node/p2p tests * Include book locking for record deletion * Add missing read locks * Move locks into wrappers * Remove ping service trace parameter from public API * I came in search of data races and I found refactors --- op-node/p2p/host.go | 7 +++-- op-node/p2p/monitor/peer_monitor_test.go | 11 +++++-- op-node/p2p/pings.go | 17 ++++++++++- op-node/p2p/pings_test.go | 6 ++-- op-node/p2p/store/ip_ban_book.go | 16 +++++----- op-node/p2p/store/mdbook.go | 12 ++++++-- op-node/p2p/store/peer_ban_book.go | 16 +++++----- op-node/p2p/store/records_book.go | 38 +++++++++++++----------- op-node/p2p/store/scorebook.go | 19 +++++++----- op-node/p2p/sync_test.go | 7 ++++- 10 files changed, 95 insertions(+), 54 deletions(-) diff --git a/op-node/p2p/host.go b/op-node/p2p/host.go index 5e3fba21efca..4e8476267fa4 100644 --- a/op-node/p2p/host.go +++ b/op-node/p2p/host.go @@ -280,10 +280,13 @@ func (conf *Config) Host(log log.Logger, reporter metrics.Reporter, metrics Host } if conf.EnablePingService { - out.pinging = NewPingService(log, + out.pinging = NewPingService( + log, func(ctx context.Context, peerID peer.ID) <-chan ping.Result { return ping.Ping(ctx, h, peerID) - }, h.Network().Peers, clock.SystemClock) + }, + h.Network().Peers, + ) } out.initStaticPeers() diff --git a/op-node/p2p/monitor/peer_monitor_test.go b/op-node/p2p/monitor/peer_monitor_test.go index 815e0531497c..ffca429b8a52 100644 --- a/op-node/p2p/monitor/peer_monitor_test.go +++ b/op-node/p2p/monitor/peer_monitor_test.go @@ -30,10 +30,15 @@ func TestPeriodicallyCheckNextPeer(t *testing.T) { // Each time a step is performed, it calls Done on the wait group so we can wait for it to be performed stepCh := make(chan struct{}, 10) monitor.bgTasks.Add(1) - var actionErr error + actionErr := make(chan error, 1) go monitor.background(func() error { stepCh <- struct{}{} - return actionErr + select { + case err := <-actionErr: + return err + default: + return nil + } }) defer monitor.Stop() // Wait for the step ticker to be started @@ -47,7 +52,7 @@ func TestPeriodicallyCheckNextPeer(t *testing.T) { } // Should continue executing periodically even after an error - actionErr = errors.New("boom") + actionErr <- errors.New("boom") for i := 0; i < 5; i++ { clock.AdvanceTime(checkInterval) waitForChan(t, stepCh, fmt.Sprintf("Did not perform step %v", i)) diff --git a/op-node/p2p/pings.go b/op-node/p2p/pings.go index bae2630959f2..9d1c8f5d9ead 100644 --- a/op-node/p2p/pings.go +++ b/op-node/p2p/pings.go @@ -41,7 +41,21 @@ type PingService struct { wg sync.WaitGroup } -func NewPingService(log log.Logger, ping PingFn, peers PeersFn, clock clock.Clock) *PingService { +func NewPingService( + log log.Logger, + ping PingFn, + peers PeersFn, +) *PingService { + return newTracedPingService(log, ping, peers, clock.SystemClock, nil) +} + +func newTracedPingService( + log log.Logger, + ping PingFn, + peers PeersFn, + clock clock.Clock, + trace func(work string), +) *PingService { ctx, cancel := context.WithCancel(context.Background()) srv := &PingService{ ping: ping, @@ -50,6 +64,7 @@ func NewPingService(log log.Logger, ping PingFn, peers PeersFn, clock clock.Cloc clock: clock, ctx: ctx, cancel: cancel, + trace: trace, } srv.wg.Add(1) go srv.pingPeersBackground() diff --git a/op-node/p2p/pings_test.go b/op-node/p2p/pings_test.go index f1dbb60446b2..fce3ad6c0ffe 100644 --- a/op-node/p2p/pings_test.go +++ b/op-node/p2p/pings_test.go @@ -51,12 +51,10 @@ func TestPingService(t *testing.T) { return peers }) - srv := NewPingService(log, pingFn, peersFn, fakeClock) - trace := make(chan string) - srv.trace = func(work string) { + srv := newTracedPingService(log, pingFn, peersFn, fakeClock, func(work string) { trace <- work - } + }) // wait for ping service to get online require.Equal(t, "started", <-trace) diff --git a/op-node/p2p/store/ip_ban_book.go b/op-node/p2p/store/ip_ban_book.go index b1d1bc0e9194..8ba4d151cd58 100644 --- a/op-node/p2p/store/ip_ban_book.go +++ b/op-node/p2p/store/ip_ban_book.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "net" + "sync" "time" "github.com/ethereum-optimism/optimism/op-service/clock" @@ -46,19 +47,16 @@ func (p ipBanUpdate) Apply(rec *ipBanRecord) { } type ipBanBook struct { + mu sync.RWMutex book *recordsBook[string, *ipBanRecord] } -func newIPBanRecord() *ipBanRecord { - return new(ipBanRecord) -} - func ipKey(ip string) ds.Key { return ds.NewKey(ip) } func newIPBanBook(ctx context.Context, logger log.Logger, clock clock.Clock, store ds.Batching) (*ipBanBook, error) { - book, err := newRecordsBook[string, *ipBanRecord](ctx, logger, clock, store, ipBanCacheSize, ipBanRecordExpiration, ipBanExpirationsBase, newIPBanRecord, ipKey) + book, err := newRecordsBook[string, *ipBanRecord](ctx, logger, clock, store, ipBanCacheSize, ipBanRecordExpiration, ipBanExpirationsBase, genNew, ipKey) if err != nil { return nil, err } @@ -70,8 +68,10 @@ func (d *ipBanBook) startGC() { } func (d *ipBanBook) GetIPBanExpiration(ip net.IP) (time.Time, error) { + d.mu.RLock() + defer d.mu.RUnlock() rec, err := d.book.getRecord(ip.To16().String()) - if err == ErrUnknownRecord { + if err == errUnknownRecord { return time.Time{}, ErrUnknownBan } if err != nil { @@ -81,10 +81,12 @@ func (d *ipBanBook) GetIPBanExpiration(ip net.IP) (time.Time, error) { } func (d *ipBanBook) SetIPBanExpiration(ip net.IP, expirationTime time.Time) error { + d.mu.Lock() + defer d.mu.Unlock() if expirationTime == (time.Time{}) { return d.book.deleteRecord(ip.To16().String()) } - _, err := d.book.SetRecord(ip.To16().String(), ipBanUpdate(expirationTime)) + _, err := d.book.setRecord(ip.To16().String(), ipBanUpdate(expirationTime)) return err } diff --git a/op-node/p2p/store/mdbook.go b/op-node/p2p/store/mdbook.go index 50d63d2a4b62..eeac94d06c76 100644 --- a/op-node/p2p/store/mdbook.go +++ b/op-node/p2p/store/mdbook.go @@ -3,6 +3,7 @@ package store import ( "context" "encoding/json" + "sync" "sync/atomic" "time" @@ -47,6 +48,7 @@ func (m *metadataRecord) UnmarshalBinary(data []byte) error { } type metadataBook struct { + mu sync.RWMutex book *recordsBook[peer.ID, *metadataRecord] } @@ -55,7 +57,7 @@ func newMetadataRecord() *metadataRecord { } func newMetadataBook(ctx context.Context, logger log.Logger, clock clock.Clock, store ds.Batching) (*metadataBook, error) { - book, err := newRecordsBook[peer.ID, *metadataRecord](ctx, logger, clock, store, mdCacheSize, mdRecordExpiration, metadataBase, newMetadataRecord, peerIDKey) + book, err := newRecordsBook[peer.ID, *metadataRecord](ctx, logger, clock, store, mdCacheSize, mdRecordExpiration, metadataBase, genNew, peerIDKey) if err != nil { return nil, err } @@ -67,9 +69,11 @@ func (m *metadataBook) startGC() { } func (m *metadataBook) GetPeerMetadata(id peer.ID) (PeerMetadata, error) { + m.mu.RLock() + defer m.mu.RUnlock() record, err := m.book.getRecord(id) // If the record is not found, return an empty PeerMetadata - if err == ErrUnknownRecord { + if err == errUnknownRecord { return PeerMetadata{}, nil } if err != nil { @@ -89,7 +93,9 @@ func (m *metadataBook) SetPeerMetadata(id peer.ID, md PeerMetadata) (PeerMetadat rec := newMetadataRecord() rec.PeerMetadata = md rec.SetLastUpdated(m.book.clock.Now()) - v, err := m.book.SetRecord(id, rec) + m.mu.Lock() + defer m.mu.Unlock() + v, err := m.book.setRecord(id, rec) return v.PeerMetadata, err } diff --git a/op-node/p2p/store/peer_ban_book.go b/op-node/p2p/store/peer_ban_book.go index 7c30976d1b93..cb61ef38f4e9 100644 --- a/op-node/p2p/store/peer_ban_book.go +++ b/op-node/p2p/store/peer_ban_book.go @@ -3,6 +3,7 @@ package store import ( "context" "encoding/json" + "sync" "time" "github.com/ethereum-optimism/optimism/op-service/clock" @@ -46,15 +47,12 @@ func (p peerBanUpdate) Apply(rec *peerBanRecord) { } type peerBanBook struct { + mu sync.RWMutex book *recordsBook[peer.ID, *peerBanRecord] } -func newPeerBanRecord() *peerBanRecord { - return new(peerBanRecord) -} - func newPeerBanBook(ctx context.Context, logger log.Logger, clock clock.Clock, store ds.Batching) (*peerBanBook, error) { - book, err := newRecordsBook[peer.ID, *peerBanRecord](ctx, logger, clock, store, peerBanCacheSize, peerBanRecordExpiration, peerBanExpirationsBase, newPeerBanRecord, peerIDKey) + book, err := newRecordsBook[peer.ID, *peerBanRecord](ctx, logger, clock, store, peerBanCacheSize, peerBanRecordExpiration, peerBanExpirationsBase, genNew, peerIDKey) if err != nil { return nil, err } @@ -66,8 +64,10 @@ func (d *peerBanBook) startGC() { } func (d *peerBanBook) GetPeerBanExpiration(id peer.ID) (time.Time, error) { + d.mu.RLock() + defer d.mu.RUnlock() rec, err := d.book.getRecord(id) - if err == ErrUnknownRecord { + if err == errUnknownRecord { return time.Time{}, ErrUnknownBan } if err != nil { @@ -77,10 +77,12 @@ func (d *peerBanBook) GetPeerBanExpiration(id peer.ID) (time.Time, error) { } func (d *peerBanBook) SetPeerBanExpiration(id peer.ID, expirationTime time.Time) error { + d.mu.Lock() + defer d.mu.Unlock() if expirationTime == (time.Time{}) { return d.book.deleteRecord(id) } - _, err := d.book.SetRecord(id, peerBanUpdate(expirationTime)) + _, err := d.book.setRecord(id, peerBanUpdate(expirationTime)) return err } diff --git a/op-node/p2p/store/records_book.go b/op-node/p2p/store/records_book.go index 3772a180f6d0..0c573df4d984 100644 --- a/op-node/p2p/store/records_book.go +++ b/op-node/p2p/store/records_book.go @@ -30,11 +30,15 @@ type recordDiff[V record] interface { Apply(v V) } -var ErrUnknownRecord = errors.New("unknown record") +var errUnknownRecord = errors.New("unknown record") + +func genNew[T any]() *T { + return new(T) +} // recordsBook is a generic K-V store to embed in the extended-peerstore. // It prunes old entries to keep the store small. -// The recordsBook can be wrapped to customize typing more. +// The recordsBook can be wrapped to customize typing and introduce synchronization. type recordsBook[K ~string, V record] struct { ctx context.Context cancelFn context.CancelFunc @@ -47,7 +51,6 @@ type recordsBook[K ~string, V record] struct { dsBaseKey ds.Key dsEntryKey func(K) ds.Key recordExpiry time.Duration // pruning is disabled if this is 0 - sync.RWMutex } func newRecordsBook[K ~string, V record](ctx context.Context, logger log.Logger, clock clock.Clock, store ds.Batching, cacheSize int, recordExpiry time.Duration, @@ -80,36 +83,34 @@ func (d *recordsBook[K, V]) startGC() { startGc(d.ctx, d.log, d.clock, &d.bgTasks, d.prune) } -func (d *recordsBook[K, V]) GetRecord(key K) (V, error) { - d.RLock() - defer d.RUnlock() - rec, err := d.getRecord(key) - return rec, err -} - func (d *recordsBook[K, V]) dsKey(key K) ds.Key { return d.dsBaseKey.Child(d.dsEntryKey(key)) } func (d *recordsBook[K, V]) deleteRecord(key K) error { - d.cache.Remove(key) + // If access to this isn't synchronized, removing from the cache first can result in the stored + // item being cached again before it is deleted. err := d.store.Delete(d.ctx, d.dsKey(key)) + d.cache.Remove(key) if err == nil || errors.Is(err, ds.ErrNotFound) { return nil } return fmt.Errorf("failed to delete entry with key %v: %w", key, err) } +// You must read lock the recordsBook before calling this, and only unlock when you have extracted +// the values you want from the value of type V. There's no way to conveniently pass an extractor +// function parameterized on V here without breaking this out into a top-level function. func (d *recordsBook[K, V]) getRecord(key K) (v V, err error) { if val, ok := d.cache.Get(key); ok { if d.hasExpired(val) { - return v, ErrUnknownRecord + return v, errUnknownRecord } return val, nil } data, err := d.store.Get(d.ctx, d.dsKey(key)) if errors.Is(err, ds.ErrNotFound) { - return v, ErrUnknownRecord + return v, errUnknownRecord } else if err != nil { return v, fmt.Errorf("failed to load value of key %v: %w", key, err) } @@ -118,17 +119,18 @@ func (d *recordsBook[K, V]) getRecord(key K) (v V, err error) { return v, fmt.Errorf("invalid value for key %v: %w", key, err) } if d.hasExpired(v) { - return v, ErrUnknownRecord + return v, errUnknownRecord } + // This is safe with a read lock as it's self-synchronized. d.cache.Add(key, v) return v, nil } -func (d *recordsBook[K, V]) SetRecord(key K, diff recordDiff[V]) (V, error) { - d.Lock() - defer d.Unlock() +// You should lock the records book before calling this, and unlock it when you copy any values out +// of the returned value. +func (d *recordsBook[K, V]) setRecord(key K, diff recordDiff[V]) (V, error) { rec, err := d.getRecord(key) - if err == ErrUnknownRecord { // instantiate new record if it does not exist yet + if err == errUnknownRecord { // instantiate new record if it does not exist yet rec = d.newRecord() } else if err != nil { return d.newRecord(), err diff --git a/op-node/p2p/store/scorebook.go b/op-node/p2p/store/scorebook.go index b6ce90c09eb1..9a7c03d4b841 100644 --- a/op-node/p2p/store/scorebook.go +++ b/op-node/p2p/store/scorebook.go @@ -2,6 +2,7 @@ package store import ( "context" + "sync" "sync/atomic" "time" @@ -18,7 +19,8 @@ const ( var scoresBase = ds.NewKey("/peers/scores") -// LastUpdate requires atomic update operations. Use the helper functions SetLastUpdated and LastUpdated to modify and access this field. +// LastUpdate requires atomic update operations. Use the helper functions SetLastUpdated and +// LastUpdated to modify and access this field. type scoreRecord struct { LastUpdate int64 `json:"lastUpdate"` // unix timestamp in seconds PeerScores PeerScores `json:"peerScores"` @@ -46,19 +48,16 @@ func (s *scoreRecord) UnmarshalBinary(data []byte) error { } type scoreBook struct { + mu sync.RWMutex book *recordsBook[peer.ID, *scoreRecord] } -func newScoreRecord() *scoreRecord { - return new(scoreRecord) -} - func peerIDKey(id peer.ID) ds.Key { return ds.NewKey(base32.RawStdEncoding.EncodeToString([]byte(id))) } func newScoreBook(ctx context.Context, logger log.Logger, clock clock.Clock, store ds.Batching, retain time.Duration) (*scoreBook, error) { - book, err := newRecordsBook[peer.ID, *scoreRecord](ctx, logger, clock, store, scoreCacheSize, retain, scoresBase, newScoreRecord, peerIDKey) + book, err := newRecordsBook[peer.ID, *scoreRecord](ctx, logger, clock, store, scoreCacheSize, retain, scoresBase, genNew, peerIDKey) if err != nil { return nil, err } @@ -70,8 +69,10 @@ func (d *scoreBook) startGC() { } func (d *scoreBook) GetPeerScores(id peer.ID) (PeerScores, error) { + d.mu.RLock() + defer d.mu.RUnlock() record, err := d.book.getRecord(id) - if err == ErrUnknownRecord { + if err == errUnknownRecord { return PeerScores{}, nil // return zeroed scores by default } if err != nil { @@ -89,7 +90,9 @@ func (d *scoreBook) GetPeerScore(id peer.ID) (float64, error) { } func (d *scoreBook) SetScore(id peer.ID, diff ScoreDiff) (PeerScores, error) { - v, err := d.book.SetRecord(id, diff) + d.mu.Lock() + defer d.mu.Unlock() + v, err := d.book.setRecord(id, diff) return v.PeerScores, err } diff --git a/op-node/p2p/sync_test.go b/op-node/p2p/sync_test.go index 516e55758160..7c0b3350df04 100644 --- a/op-node/p2p/sync_test.go +++ b/op-node/p2p/sync_test.go @@ -390,8 +390,13 @@ func TestNetworkNotifyAddPeerAndRemovePeer(t *testing.T) { // wait for async removing process done <-waitChan + syncCl.peersLock.Lock() + // Technically this can't fail since SyncClient.RemovePeer also deletes from the + // SyncClient.peers, so unless that action is deferred to SyncClient.peerLoop it's not very + // interesting. _, peerBExist3 := syncCl.peers[hostB.ID()] - require.True(t, !peerBExist3, "peerB should not exist in syncClient") + syncCl.peersLock.Unlock() + require.False(t, peerBExist3, "peerB should not exist in syncClient") } func TestPanicGuard(t *testing.T) { From a3b6a6002994739b31e0ed1c89ad934df446a5ef Mon Sep 17 00:00:00 2001 From: Adrian Sutton Date: Tue, 13 Aug 2024 18:58:37 +1000 Subject: [PATCH 59/59] op-challenger: Fix run-trace disputed block selection (#11437) * op-challenger: Fix run-trace disputed block selection Previously it assumed the safe head at SafeL1 was before the safe head at HeadL1 in the sync status, but that is not guaranteed. As a result it could select an L2 block to check that was unsafe at the specified L1 head. * op-challenger: Update vm-runner to handle the case where op-node hasn't processed all finalized L1 blocks yet --- op-challenger/game/fault/trace/vm/executor.go | 6 ++- op-challenger/runner/runner.go | 48 ++++++++++++++----- 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/op-challenger/game/fault/trace/vm/executor.go b/op-challenger/game/fault/trace/vm/executor.go index 9d76b6298b0c..65c18d67d221 100644 --- a/op-challenger/game/fault/trace/vm/executor.go +++ b/op-challenger/game/fault/trace/vm/executor.go @@ -126,14 +126,18 @@ func (e *Executor) DoGenerateProof(ctx context.Context, dir string, begin uint64 e.logger.Info("Generating trace", "proof", end, "cmd", e.cfg.VmBin, "args", strings.Join(args, ", ")) execStart := time.Now() err = e.cmdExecutor(ctx, e.logger.New("proof", end), e.cfg.VmBin, args...) - e.metrics.RecordVmExecutionTime(e.cfg.VmType.String(), time.Since(execStart)) + execTime := time.Since(execStart) + memoryUsed := "unknown" + e.metrics.RecordVmExecutionTime(e.cfg.VmType.String(), execTime) if e.cfg.DebugInfo && err == nil { if info, err := jsonutil.LoadJSON[debugInfo](filepath.Join(dataDir, debugFilename)); err != nil { e.logger.Warn("Failed to load debug metrics", "err", err) } else { e.metrics.RecordVmMemoryUsed(e.cfg.VmType.String(), uint64(info.MemoryUsed)) + memoryUsed = fmt.Sprintf("%d", uint64(info.MemoryUsed)) } } + e.logger.Info("VM execution complete", "time", execTime, "memory", memoryUsed) return err } diff --git a/op-challenger/runner/runner.go b/op-challenger/runner/runner.go index 4c80655cfcdd..8c46f0f0a6bf 100644 --- a/op-challenger/runner/runner.go +++ b/op-challenger/runner/runner.go @@ -161,18 +161,18 @@ func (r *Runner) createGameInputs(ctx context.Context, client *sources.RollupCli return utils.LocalGameInputs{}, fmt.Errorf("failed to get rollup sync status: %w", err) } - if status.SafeL2.Number == 0 { + if status.FinalizedL2.Number == 0 { return utils.LocalGameInputs{}, errors.New("safe head is 0") } - blockNumber := status.SafeL2.Number - // When possible, execute the first block in the submitted batch - if status.SafeL1.Number > 0 { - priorSafeHead, err := client.SafeHeadAtL1Block(ctx, status.SafeL1.Number-1) - if err != nil { - r.log.Warn("Failed to get prior safe head", "err", err) - } else if priorSafeHead.SafeHead.Number != 0 { // Sanity check to avoid trying to execute genesis - blockNumber = priorSafeHead.SafeHead.Number + 1 - } + l1Head := status.FinalizedL1 + if status.FinalizedL1.Number > status.CurrentL1.Number { + // Restrict the L1 head to a block that has actually be processed by op-node. + // This only matters if op-node is behind and hasn't processed all finalized L1 blocks yet. + l1Head = status.CurrentL1 + } + blockNumber, err := r.findL2BlockNumberToDispute(ctx, client, l1Head.Number, status.FinalizedL2.Number) + if err != nil { + return utils.LocalGameInputs{}, fmt.Errorf("failed to find l2 block number to dispute: %w", err) } claimOutput, err := client.OutputAtBlock(ctx, blockNumber) if err != nil { @@ -183,7 +183,7 @@ func (r *Runner) createGameInputs(ctx context.Context, client *sources.RollupCli return utils.LocalGameInputs{}, fmt.Errorf("failed to get claim output: %w", err) } localInputs := utils.LocalGameInputs{ - L1Head: status.HeadL1.Hash, + L1Head: l1Head.Hash, L2Head: parentOutput.BlockRef.Hash, L2OutputRoot: common.Hash(parentOutput.OutputRoot), L2Claim: common.Hash(claimOutput.OutputRoot), @@ -192,6 +192,32 @@ func (r *Runner) createGameInputs(ctx context.Context, client *sources.RollupCli return localInputs, nil } +func (r *Runner) findL2BlockNumberToDispute(ctx context.Context, client *sources.RollupClient, l1HeadNum uint64, l2BlockNum uint64) (uint64, error) { + // Try to find a L1 block prior to the batch that make l2BlockNum safe + // Limits how far back we search to 10 * 32 blocks + const skipSize = uint64(32) + for i := 0; i < 10; i++ { + if l1HeadNum < skipSize { + // Too close to genesis, give up and just use the original block + r.log.Info("Failed to find prior batch.") + return l2BlockNum, nil + } + l1HeadNum -= skipSize + priorSafeHead, err := client.SafeHeadAtL1Block(ctx, l1HeadNum) + if err != nil { + return 0, fmt.Errorf("failed to get prior safe head at L1 block %v: %w", l1HeadNum, err) + } + if priorSafeHead.SafeHead.Number < l2BlockNum { + // We walked back far enough to be before the batch that included l2BlockNum + // So use the first block after the prior safe head as the disputed block. + // It must be the first block in a batch. + return priorSafeHead.SafeHead.Number + 1, nil + } + } + r.log.Warn("Failed to find prior batch", "l2BlockNum", l2BlockNum, "earliestCheckL1Block", l1HeadNum) + return l2BlockNum, nil +} + func (r *Runner) getPrestateHash(ctx context.Context, traceType types.TraceType, caller *batching.MultiCaller) (common.Hash, error) { gameFactory := contracts.NewDisputeGameFactoryContract(r.m, r.cfg.GameFactoryAddress, caller) gameImplAddr, err := gameFactory.GetGameImpl(ctx, traceType.GameType())