source dump of claude code
at main 181 lines 22 kB view raw
1import { c as _c } from "react/compiler-runtime"; 2import type { StructuredPatchHunk } from 'diff'; 3import * as React from 'react'; 4import { Suspense, use, useState } from 'react'; 5import { useTerminalSize } from '../hooks/useTerminalSize.js'; 6import { Box, Text } from '../ink.js'; 7import type { FileEdit } from '../tools/FileEditTool/types.js'; 8import { findActualString, preserveQuoteStyle } from '../tools/FileEditTool/utils.js'; 9import { adjustHunkLineNumbers, CONTEXT_LINES, getPatchForDisplay } from '../utils/diff.js'; 10import { logError } from '../utils/log.js'; 11import { CHUNK_SIZE, openForScan, readCapped, scanForContext } from '../utils/readEditContext.js'; 12import { firstLineOf } from '../utils/stringUtils.js'; 13import { StructuredDiffList } from './StructuredDiffList.js'; 14type Props = { 15 file_path: string; 16 edits: FileEdit[]; 17}; 18type DiffData = { 19 patch: StructuredPatchHunk[]; 20 firstLine: string | null; 21 fileContent: string | undefined; 22}; 23export function FileEditToolDiff(props) { 24 const $ = _c(7); 25 let t0; 26 if ($[0] !== props.edits || $[1] !== props.file_path) { 27 t0 = () => loadDiffData(props.file_path, props.edits); 28 $[0] = props.edits; 29 $[1] = props.file_path; 30 $[2] = t0; 31 } else { 32 t0 = $[2]; 33 } 34 const [dataPromise] = useState(t0); 35 let t1; 36 if ($[3] === Symbol.for("react.memo_cache_sentinel")) { 37 t1 = <DiffFrame placeholder={true} />; 38 $[3] = t1; 39 } else { 40 t1 = $[3]; 41 } 42 let t2; 43 if ($[4] !== dataPromise || $[5] !== props.file_path) { 44 t2 = <Suspense fallback={t1}><DiffBody promise={dataPromise} file_path={props.file_path} /></Suspense>; 45 $[4] = dataPromise; 46 $[5] = props.file_path; 47 $[6] = t2; 48 } else { 49 t2 = $[6]; 50 } 51 return t2; 52} 53function DiffBody(t0) { 54 const $ = _c(6); 55 const { 56 promise, 57 file_path 58 } = t0; 59 const { 60 patch, 61 firstLine, 62 fileContent 63 } = use(promise); 64 const { 65 columns 66 } = useTerminalSize(); 67 let t1; 68 if ($[0] !== columns || $[1] !== fileContent || $[2] !== file_path || $[3] !== firstLine || $[4] !== patch) { 69 t1 = <DiffFrame><StructuredDiffList hunks={patch} dim={false} width={columns} filePath={file_path} firstLine={firstLine} fileContent={fileContent} /></DiffFrame>; 70 $[0] = columns; 71 $[1] = fileContent; 72 $[2] = file_path; 73 $[3] = firstLine; 74 $[4] = patch; 75 $[5] = t1; 76 } else { 77 t1 = $[5]; 78 } 79 return t1; 80} 81function DiffFrame(t0) { 82 const $ = _c(5); 83 const { 84 children, 85 placeholder 86 } = t0; 87 let t1; 88 if ($[0] !== children || $[1] !== placeholder) { 89 t1 = placeholder ? <Text dimColor={true}></Text> : children; 90 $[0] = children; 91 $[1] = placeholder; 92 $[2] = t1; 93 } else { 94 t1 = $[2]; 95 } 96 let t2; 97 if ($[3] !== t1) { 98 t2 = <Box flexDirection="column"><Box borderColor="subtle" borderStyle="dashed" flexDirection="column" borderLeft={false} borderRight={false}>{t1}</Box></Box>; 99 $[3] = t1; 100 $[4] = t2; 101 } else { 102 t2 = $[4]; 103 } 104 return t2; 105} 106async function loadDiffData(file_path: string, edits: FileEdit[]): Promise<DiffData> { 107 const valid = edits.filter(e => e.old_string != null && e.new_string != null); 108 const single = valid.length === 1 ? valid[0]! : undefined; 109 110 // SedEditPermissionRequest passes the entire file as old_string. Scanning for 111 // a needle ≥ CHUNK_SIZE allocates O(needle) for the overlap buffer — skip the 112 // file read entirely and diff the inputs we already have. 113 if (single && single.old_string.length >= CHUNK_SIZE) { 114 return diffToolInputsOnly(file_path, [single]); 115 } 116 try { 117 const handle = await openForScan(file_path); 118 if (handle === null) return diffToolInputsOnly(file_path, valid); 119 try { 120 // Multi-edit and empty old_string genuinely need full-file for sequential 121 // replacements — structuredPatch needs before/after strings. replace_all 122 // routes through the chunked path below (shows first-occurrence window; 123 // matches within the slice still replace via edit.replace_all). 124 if (!single || single.old_string === '') { 125 const file = await readCapped(handle); 126 if (file === null) return diffToolInputsOnly(file_path, valid); 127 const normalized = valid.map(e => normalizeEdit(file, e)); 128 return { 129 patch: getPatchForDisplay({ 130 filePath: file_path, 131 fileContents: file, 132 edits: normalized 133 }), 134 firstLine: firstLineOf(file), 135 fileContent: file 136 }; 137 } 138 const ctx = await scanForContext(handle, single.old_string, CONTEXT_LINES); 139 if (ctx.truncated || ctx.content === '') { 140 return diffToolInputsOnly(file_path, [single]); 141 } 142 const normalized = normalizeEdit(ctx.content, single); 143 const hunks = getPatchForDisplay({ 144 filePath: file_path, 145 fileContents: ctx.content, 146 edits: [normalized] 147 }); 148 return { 149 patch: adjustHunkLineNumbers(hunks, ctx.lineOffset - 1), 150 firstLine: ctx.lineOffset === 1 ? firstLineOf(ctx.content) : null, 151 fileContent: ctx.content 152 }; 153 } finally { 154 await handle.close(); 155 } 156 } catch (e) { 157 logError(e as Error); 158 return diffToolInputsOnly(file_path, valid); 159 } 160} 161function diffToolInputsOnly(filePath: string, edits: FileEdit[]): DiffData { 162 return { 163 patch: edits.flatMap(e => getPatchForDisplay({ 164 filePath, 165 fileContents: e.old_string, 166 edits: [e] 167 })), 168 firstLine: null, 169 fileContent: undefined 170 }; 171} 172function normalizeEdit(fileContent: string, edit: FileEdit): FileEdit { 173 const actualOld = findActualString(fileContent, edit.old_string) || edit.old_string; 174 const actualNew = preserveQuoteStyle(edit.old_string, actualOld, edit.new_string); 175 return { 176 ...edit, 177 old_string: actualOld, 178 new_string: actualNew 179 }; 180} 181//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTdHJ1Y3R1cmVkUGF0Y2hIdW5rIiwiUmVhY3QiLCJTdXNwZW5zZSIsInVzZSIsInVzZVN0YXRlIiwidXNlVGVybWluYWxTaXplIiwiQm94IiwiVGV4dCIsIkZpbGVFZGl0IiwiZmluZEFjdHVhbFN0cmluZyIsInByZXNlcnZlUXVvdGVTdHlsZSIsImFkanVzdEh1bmtMaW5lTnVtYmVycyIsIkNPTlRFWFRfTElORVMiLCJnZXRQYXRjaEZvckRpc3BsYXkiLCJsb2dFcnJvciIsIkNIVU5LX1NJWkUiLCJvcGVuRm9yU2NhbiIsInJlYWRDYXBwZWQiLCJzY2FuRm9yQ29udGV4dCIsImZpcnN0TGluZU9mIiwiU3RydWN0dXJlZERpZmZMaXN0IiwiUHJvcHMiLCJmaWxlX3BhdGgiLCJlZGl0cyIsIkRpZmZEYXRhIiwicGF0Y2giLCJmaXJzdExpbmUiLCJmaWxlQ29udGVudCIsIkZpbGVFZGl0VG9vbERpZmYiLCJwcm9wcyIsIiQiLCJfYyIsInQwIiwibG9hZERpZmZEYXRhIiwiZGF0YVByb21pc2UiLCJ0MSIsIlN5bWJvbCIsImZvciIsInQyIiwiRGlmZkJvZHkiLCJwcm9taXNlIiwiY29sdW1ucyIsIkRpZmZGcmFtZSIsImNoaWxkcmVuIiwicGxhY2Vob2xkZXIiLCJQcm9taXNlIiwidmFsaWQiLCJmaWx0ZXIiLCJlIiwib2xkX3N0cmluZyIsIm5ld19zdHJpbmciLCJzaW5nbGUiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJkaWZmVG9vbElucHV0c09ubHkiLCJoYW5kbGUiLCJmaWxlIiwibm9ybWFsaXplZCIsIm1hcCIsIm5vcm1hbGl6ZUVkaXQiLCJmaWxlUGF0aCIsImZpbGVDb250ZW50cyIsImN0eCIsInRydW5jYXRlZCIsImNvbnRlbnQiLCJodW5rcyIsImxpbmVPZmZzZXQiLCJjbG9zZSIsIkVycm9yIiwiZmxhdE1hcCIsImVkaXQiLCJhY3R1YWxPbGQiLCJhY3R1YWxOZXciXSwic291cmNlcyI6WyJGaWxlRWRpdFRvb2xEaWZmLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFN0cnVjdHVyZWRQYXRjaEh1bmsgfSBmcm9tICdkaWZmJ1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBTdXNwZW5zZSwgdXNlLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlVGVybWluYWxTaXplIH0gZnJvbSAnLi4vaG9va3MvdXNlVGVybWluYWxTaXplLmpzJ1xuaW1wb3J0IHsgQm94LCBUZXh0IH0gZnJvbSAnLi4vaW5rLmpzJ1xuaW1wb3J0IHR5cGUgeyBGaWxlRWRpdCB9IGZyb20gJy4uL3Rvb2xzL0ZpbGVFZGl0VG9vbC90eXBlcy5qcydcbmltcG9ydCB7XG4gIGZpbmRBY3R1YWxTdHJpbmcsXG4gIHByZXNlcnZlUXVvdGVTdHlsZSxcbn0gZnJvbSAnLi4vdG9vbHMvRmlsZUVkaXRUb29sL3V0aWxzLmpzJ1xuaW1wb3J0IHtcbiAgYWRqdXN0SHVua0xpbmVOdW1iZXJzLFxuICBDT05URVhUX0xJTkVTLFxuICBnZXRQYXRjaEZvckRpc3BsYXksXG59IGZyb20gJy4uL3V0aWxzL2RpZmYuanMnXG5pbXBvcnQgeyBsb2dFcnJvciB9IGZyb20gJy4uL3V0aWxzL2xvZy5qcydcbmltcG9ydCB7XG4gIENIVU5LX1NJWkUsXG4gIG9wZW5Gb3JTY2FuLFxuICByZWFkQ2FwcGVkLFxuICBzY2FuRm9yQ29udGV4dCxcbn0gZnJvbSAnLi4vdXRpbHMvcmVhZEVkaXRDb250ZXh0LmpzJ1xuaW1wb3J0IHsgZmlyc3RMaW5lT2YgfSBmcm9tICcuLi91dGlscy9zdHJpbmdVdGlscy5qcydcbmltcG9ydCB7IFN0cnVjdHVyZWREaWZmTGlzdCB9IGZyb20gJy4vU3RydWN0dXJlZERpZmZMaXN0LmpzJ1xuXG50eXBlIFByb3BzID0ge1xuICBmaWxlX3BhdGg6IHN0cmluZ1xuICBlZGl0czogRmlsZUVkaXRbXVxufVxuXG50eXBlIERpZmZEYXRhID0ge1xuICBwYXRjaDogU3RydWN0dXJlZFBhdGNoSHVua1tdXG4gIGZpcnN0TGluZTogc3RyaW5nIHwgbnVsbFxuICBmaWxlQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBGaWxlRWRpdFRvb2xEaWZmKHByb3BzOiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIC8vIFNuYXBzaG90IG9uIG1vdW50IOKAlCB0aGUgZGlmZiBtdXN0IHN0YXkgY29uc2lzdGVudCBldmVuIGlmIHRoZSBmaWxlIGNoYW5nZXNcbiAgLy8gd2hpbGUgdGhlIGRpYWxvZyBpcyBvcGVuLiB1c2VNZW1vIG9uIHByb3BzLmVkaXRzIHdvdWxkIHJlLXJlYWQgdGhlIGZpbGUgb25cbiAgLy8gZXZlcnkgcmVuZGVyIGJlY2F1c2UgY2FsbGVycyBwYXNzIGZyZXNoIGFycmF5IGxpdGVyYWxzLlxuICBjb25zdCBbZGF0YVByb21pc2VdID0gdXNlU3RhdGUoKCkgPT5cbiAgICBsb2FkRGlmZkRhdGEocHJvcHMuZmlsZV9wYXRoLCBwcm9wcy5lZGl0cyksXG4gIClcbiAgcmV0dXJuIChcbiAgICA8U3VzcGVuc2UgZmFsbGJhY2s9ezxEaWZmRnJhbWUgcGxhY2Vob2xkZXIgLz59PlxuICAgICAgPERpZmZCb2R5IHByb21pc2U9e2RhdGFQcm9taXNlfSBmaWxlX3BhdGg9e3Byb3BzLmZpbGVfcGF0aH0gLz5cbiAgICA8L1N1c3BlbnNlPlxuICApXG59XG5cbmZ1bmN0aW9uIERpZmZCb2R5KHtcbiAgcHJvbWlzZSxcbiAgZmlsZV9wYXRoLFxufToge1xuICBwcm9taXNlOiBQcm9taXNlPERpZmZEYXRhPlxuICBmaWxlX3BhdGg6IHN0cmluZ1xufSk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IHsgcGF0Y2gsIGZpcnN0TGluZSwgZmlsZUNvbnRlbnQgfSA9IHVzZShwcm9taXNlKVxuICBjb25zdCB7IGNvbHVtbnMgfSA9IHVzZVRlcm1pbmFsU2l6ZSgpXG4gIHJldHVybiAoXG4gICAgPERpZmZGcmFtZT5cbiAgICAgIDxTdHJ1Y3R1cmVkRGlmZkxpc3RcbiAgICAgICAgaHVua3M9e3BhdGNofVxuICAgICAgICBkaW09e2ZhbHNlfVxuICAgICAgICB3aWR0aD17Y29sdW1uc31cbiAgICAgICAgZmlsZVBhdGg9e2ZpbGVfcGF0aH1cbiAgICAgICAgZmlyc3RMaW5lPXtmaXJzdExpbmV9XG4gICAgICAgIGZpbGVDb250ZW50PXtmaWxlQ29udGVudH1cbiAgICAgIC8+XG4gICAgPC9EaWZmRnJhbWU+XG4gIClcbn1cblxuZnVuY3Rpb24gRGlmZkZyYW1lKHtcbiAgY2hpbGRyZW4sXG4gIHBsYWNlaG9sZGVyLFxufToge1xuICBjaGlsZHJlbj86IFJlYWN0LlJlYWN0Tm9kZVxuICBwbGFjZWhvbGRlcj86IGJvb2xlYW5cbn0pOiBSZWFjdC5SZWFjdE5vZGUge1xuICByZXR1cm4gKFxuICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgPEJveFxuICAgICAgICBib3JkZXJDb2xvcj1cInN1YnRsZVwiXG4gICAgICAgIGJvcmRlclN0eWxlPVwiZGFzaGVkXCJcbiAgICAgICAgZmxleERpcmVjdGlvbj1cImNvbHVtblwiXG4gICAgICAgIGJvcmRlckxlZnQ9e2ZhbHNlfVxuICAgICAgICBib3JkZXJSaWdodD17ZmFsc2V9XG4gICAgICA+XG4gICAgICAgIHtwbGFjZWhvbGRlciA/IDxUZXh0IGRpbUNvbG9yPuKApjwvVGV4dD4gOiBjaGlsZHJlbn1cbiAgICAgIDwvQm94PlxuICAgIDwvQm94PlxuICApXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWREaWZmRGF0YShcbiAgZmlsZV9wYXRoOiBzdHJpbmcsXG4gIGVkaXRzOiBGaWxlRWRpdFtdLFxuKTogUHJvbWlzZTxEaWZmRGF0YT4ge1xuICBjb25zdCB2YWxpZCA9IGVkaXRzLmZpbHRlcihlID0+IGUub2xkX3N0cmluZyAhPSBudWxsICYmIGUubmV3X3N0cmluZyAhPSBudWxsKVxuICBjb25zdCBzaW5nbGUgPSB2YWxpZC5sZW5ndGggPT09IDEgPyB2YWxpZFswXSEgOiB1bmRlZmluZWRcblxuICAvLyBTZWRFZGl0UGVybWlzc2lvblJlcXVlc3QgcGFzc2VzIHRoZSBlbnRpcmUgZmlsZSBhcyBvbGRfc3RyaW5nLiBTY2FubmluZyBmb3JcbiAgLy8gYSBuZWVkbGUg4omlIENIVU5LX1NJWkUgYWxsb2NhdGVzIE8obmVlZGxlKSBmb3IgdGhlIG92ZXJsYXAgYnVmZmVyIOKAlCBza2lwIHRoZVxuICAvLyBmaWxlIHJlYWQgZW50aXJlbHkgYW5kIGRpZmYgdGhlIGlucHV0cyB3ZSBhbHJlYWR5IGhhdmUuXG4gIGlmIChzaW5nbGUgJiYgc2luZ2xlLm9sZF9zdHJpbmcubGVuZ3RoID49IENIVU5LX1NJWkUpIHtcbiAgICByZXR1cm4gZGlmZlRvb2xJbnB1dHNPbmx5KGZpbGVfcGF0aCwgW3NpbmdsZV0pXG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGhhbmRsZSA9IGF3YWl0IG9wZW5Gb3JTY2FuKGZpbGVfcGF0aClcbiAgICBpZiAoaGFuZGxlID09PSBudWxsKSByZXR1cm4gZGlmZlRvb2xJbnB1dHNPbmx5KGZpbGVfcGF0aCwgdmFsaWQpXG4gICAgdHJ5IHtcbiAgICAgIC8vIE11bHRpLWVkaXQgYW5kIGVtcHR5IG9sZF9zdHJpbmcgZ2VudWluZWx5IG5lZWQgZnVsbC1maWxlIGZvciBzZXF1ZW50aWFsXG4gICAgICAvLyByZXBsYWNlbWVudHMg4oCUIHN0cnVjdHVyZWRQYXRjaCBuZWVkcyBiZWZvcmUvYWZ0ZXIgc3RyaW5ncy4gcmVwbGFjZV9hbGxcbiAgICAgIC8vIHJvdXRlcyB0aHJvdWdoIHRoZSBjaHVua2VkIHBhdGggYmVsb3cgKHNob3dzIGZpcnN0LW9jY3VycmVuY2Ugd2luZG93O1xuICAgICAgLy8gbWF0Y2hlcyB3aXRoaW4gdGhlIHNsaWNlIHN0aWxsIHJlcGxhY2UgdmlhIGVkaXQucmVwbGFjZV9hbGwpLlxuICAgICAgaWYgKCFzaW5nbGUgfHwgc2luZ2xlLm9sZF9zdHJpbmcgPT09ICcnKSB7XG4gICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCByZWFkQ2FwcGVkKGhhbmRsZSlcbiAgICAgICAgaWYgKGZpbGUgPT09IG51bGwpIHJldHVybiBkaWZmVG9vbElucHV0c09ubHkoZmlsZV9wYXRoLCB2YWxpZClcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHZhbGlkLm1hcChlID0+IG5vcm1hbGl6ZUVkaXQoZmlsZSwgZSkpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGF0Y2g6IGdldFBhdGNoRm9yRGlzcGxheSh7XG4gICAgICAgICAgICBmaWxlUGF0aDogZmlsZV9wYXRoLFxuICAgICAgICAgICAgZmlsZUNvbnRlbnRzOiBmaWxlLFxuICAgICAgICAgICAgZWRpdHM6IG5vcm1hbGl6ZWQsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgZmlyc3RMaW5lOiBmaXJzdExpbmVPZihmaWxlKSxcbiAgICAgICAgICBmaWxlQ29udGVudDogZmlsZSxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjdHggPSBhd2FpdCBzY2FuRm9yQ29udGV4dChoYW5kbGUsIHNpbmdsZS5vbGRfc3RyaW5nLCBDT05URVhUX0xJTkVTKVxuICAgICAgaWYgKGN0eC50cnVuY2F0ZWQgfHwgY3R4LmNvbnRlbnQgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiBkaWZmVG9vbElucHV0c09ubHkoZmlsZV9wYXRoLCBbc2luZ2xlXSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVFZGl0KGN0eC5jb250ZW50LCBzaW5nbGUpXG4gICAgICBjb25zdCBodW5rcyA9IGdldFBhdGNoRm9yRGlzcGxheSh7XG4gICAgICAgIGZpbGVQYXRoOiBmaWxlX3BhdGgsXG4gICAgICAgIGZpbGVDb250ZW50czogY3R4LmNvbnRlbnQsXG4gICAgICAgIGVkaXRzOiBbbm9ybWFsaXplZF0sXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0Y2g6IGFkanVzdEh1bmtMaW5lTnVtYmVycyhodW5rcywgY3R4LmxpbmVPZmZzZXQgLSAxKSxcbiAgICAgICAgZmlyc3RMaW5lOiBjdHgubGluZU9mZnNldCA9PT0gMSA/IGZpcnN0TGluZU9mKGN0eC5jb250ZW50KSA6IG51bGwsXG4gICAgICAgIGZpbGVDb250ZW50OiBjdHguY29udGVudCxcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgaGFuZGxlLmNsb3NlKClcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dFcnJvcihlIGFzIEVycm9yKVxuICAgIHJldHVybiBkaWZmVG9vbElucHV0c09ubHkoZmlsZV9wYXRoLCB2YWxpZClcbiAgfVxufVxuXG5mdW5jdGlvbiBkaWZmVG9vbElucHV0c09ubHkoZmlsZVBhdGg6IHN0cmluZywgZWRpdHM6IEZpbGVFZGl0W10pOiBEaWZmRGF0YSB7XG4gIHJldHVybiB7XG4gICAgcGF0Y2g6IGVkaXRzLmZsYXRNYXAoZSA9PlxuICAgICAgZ2V0UGF0Y2hGb3JEaXNwbGF5KHtcbiAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgIGZpbGVDb250ZW50czogZS5vbGRfc3RyaW5nLFxuICAgICAgICBlZGl0czogW2VdLFxuICAgICAgfSksXG4gICAgKSxcbiAgICBmaXJzdExpbmU6IG51bGwsXG4gICAgZmlsZUNvbnRlbnQ6IHVuZGVmaW5lZCxcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVFZGl0KGZpbGVDb250ZW50OiBzdHJpbmcsIGVkaXQ6IEZpbGVFZGl0KTogRmlsZUVkaXQge1xuICBjb25zdCBhY3R1YWxPbGQgPVxuICAgIGZpbmRBY3R1YWxTdHJpbmcoZmlsZUNvbnRlbnQsIGVkaXQub2xkX3N0cmluZykgfHwgZWRpdC5vbGRfc3RyaW5nXG4gIGNvbnN0IGFjdHVhbE5ldyA9IHByZXNlcnZlUXVvdGVTdHlsZShcbiAgICBlZGl0Lm9sZF9zdHJpbmcsXG4gICAgYWN0dWFsT2xkLFxuICAgIGVkaXQubmV3X3N0cmluZyxcbiAgKVxuICByZXR1cm4geyAuLi5lZGl0LCBvbGRfc3RyaW5nOiBhY3R1YWxPbGQsIG5ld19zdHJpbmc6IGFjdHVhbE5l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