source dump of claude code
at main 269 lines 34 kB view raw
1import { c as _c } from "react/compiler-runtime"; 2import * as React from 'react'; 3import { useState } from 'react'; 4import type { CommandResultDisplay, LocalJSXCommandContext } from '../../commands.js'; 5import { Dialog } from '../../components/design-system/Dialog.js'; 6import { FastIcon, getFastIconString } from '../../components/FastIcon.js'; 7import { Box, Link, Text } from '../../ink.js'; 8import { useKeybindings } from '../../keybindings/useKeybinding.js'; 9import { type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, logEvent } from '../../services/analytics/index.js'; 10import { type AppState, useAppState, useSetAppState } from '../../state/AppState.js'; 11import type { LocalJSXCommandOnDone } from '../../types/command.js'; 12import { clearFastModeCooldown, FAST_MODE_MODEL_DISPLAY, getFastModeModel, getFastModeRuntimeState, getFastModeUnavailableReason, isFastModeEnabled, isFastModeSupportedByModel, prefetchFastModeStatus } from '../../utils/fastMode.js'; 13import { formatDuration } from '../../utils/format.js'; 14import { formatModelPricing, getOpus46CostTier } from '../../utils/modelCost.js'; 15import { updateSettingsForSource } from '../../utils/settings/settings.js'; 16function applyFastMode(enable: boolean, setAppState: (f: (prev: AppState) => AppState) => void): void { 17 clearFastModeCooldown(); 18 updateSettingsForSource('userSettings', { 19 fastMode: enable ? true : undefined 20 }); 21 if (enable) { 22 setAppState(prev => { 23 // Only switch model if current model doesn't support fast mode 24 const needsModelSwitch = !isFastModeSupportedByModel(prev.mainLoopModel); 25 return { 26 ...prev, 27 ...(needsModelSwitch ? { 28 mainLoopModel: getFastModeModel(), 29 mainLoopModelForSession: null 30 } : {}), 31 fastMode: true 32 }; 33 }); 34 } else { 35 setAppState(prev => ({ 36 ...prev, 37 fastMode: false 38 })); 39 } 40} 41export function FastModePicker(t0) { 42 const $ = _c(30); 43 const { 44 onDone, 45 unavailableReason 46 } = t0; 47 const model = useAppState(_temp); 48 const initialFastMode = useAppState(_temp2); 49 const setAppState = useSetAppState(); 50 const [enableFastMode, setEnableFastMode] = useState(initialFastMode ?? false); 51 let t1; 52 if ($[0] === Symbol.for("react.memo_cache_sentinel")) { 53 t1 = getFastModeRuntimeState(); 54 $[0] = t1; 55 } else { 56 t1 = $[0]; 57 } 58 const runtimeState = t1; 59 const isCooldown = runtimeState.status === "cooldown"; 60 const isUnavailable = unavailableReason !== null; 61 let t2; 62 if ($[1] === Symbol.for("react.memo_cache_sentinel")) { 63 t2 = formatModelPricing(getOpus46CostTier(true)); 64 $[1] = t2; 65 } else { 66 t2 = $[1]; 67 } 68 const pricing = t2; 69 let t3; 70 if ($[2] !== enableFastMode || $[3] !== isUnavailable || $[4] !== model || $[5] !== onDone || $[6] !== setAppState) { 71 t3 = function handleConfirm() { 72 if (isUnavailable) { 73 return; 74 } 75 applyFastMode(enableFastMode, setAppState); 76 logEvent("tengu_fast_mode_toggled", { 77 enabled: enableFastMode, 78 source: "picker" as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS 79 }); 80 if (enableFastMode) { 81 const fastIcon = getFastIconString(enableFastMode); 82 const modelUpdated = !isFastModeSupportedByModel(model) ? ` · model set to ${FAST_MODE_MODEL_DISPLAY}` : ""; 83 onDone(`${fastIcon} Fast mode ON${modelUpdated} · ${pricing}`); 84 } else { 85 setAppState(_temp3); 86 onDone("Fast mode OFF"); 87 } 88 }; 89 $[2] = enableFastMode; 90 $[3] = isUnavailable; 91 $[4] = model; 92 $[5] = onDone; 93 $[6] = setAppState; 94 $[7] = t3; 95 } else { 96 t3 = $[7]; 97 } 98 const handleConfirm = t3; 99 let t4; 100 if ($[8] !== initialFastMode || $[9] !== isUnavailable || $[10] !== onDone || $[11] !== setAppState) { 101 t4 = function handleCancel() { 102 if (isUnavailable) { 103 if (initialFastMode) { 104 applyFastMode(false, setAppState); 105 } 106 onDone("Fast mode OFF", { 107 display: "system" 108 }); 109 return; 110 } 111 const message = initialFastMode ? `${getFastIconString()} Kept Fast mode ON` : "Kept Fast mode OFF"; 112 onDone(message, { 113 display: "system" 114 }); 115 }; 116 $[8] = initialFastMode; 117 $[9] = isUnavailable; 118 $[10] = onDone; 119 $[11] = setAppState; 120 $[12] = t4; 121 } else { 122 t4 = $[12]; 123 } 124 const handleCancel = t4; 125 let t5; 126 if ($[13] !== isUnavailable) { 127 t5 = function handleToggle() { 128 if (isUnavailable) { 129 return; 130 } 131 setEnableFastMode(_temp4); 132 }; 133 $[13] = isUnavailable; 134 $[14] = t5; 135 } else { 136 t5 = $[14]; 137 } 138 const handleToggle = t5; 139 let t6; 140 if ($[15] !== handleConfirm || $[16] !== handleToggle) { 141 t6 = { 142 "confirm:yes": handleConfirm, 143 "confirm:nextField": handleToggle, 144 "confirm:next": handleToggle, 145 "confirm:previous": handleToggle, 146 "confirm:cycleMode": handleToggle, 147 "confirm:toggle": handleToggle 148 }; 149 $[15] = handleConfirm; 150 $[16] = handleToggle; 151 $[17] = t6; 152 } else { 153 t6 = $[17]; 154 } 155 let t7; 156 if ($[18] === Symbol.for("react.memo_cache_sentinel")) { 157 t7 = { 158 context: "Confirmation" 159 }; 160 $[18] = t7; 161 } else { 162 t7 = $[18]; 163 } 164 useKeybindings(t6, t7); 165 let t8; 166 if ($[19] === Symbol.for("react.memo_cache_sentinel")) { 167 t8 = <Text><FastIcon cooldown={isCooldown} /> Fast mode (research preview)</Text>; 168 $[19] = t8; 169 } else { 170 t8 = $[19]; 171 } 172 const title = t8; 173 let t9; 174 if ($[20] !== isUnavailable) { 175 t9 = exitState => exitState.pending ? <Text>Press {exitState.keyName} again to exit</Text> : isUnavailable ? <Text>Esc to cancel</Text> : <Text>Tab to toggle · Enter to confirm · Esc to cancel</Text>; 176 $[20] = isUnavailable; 177 $[21] = t9; 178 } else { 179 t9 = $[21]; 180 } 181 let t10; 182 if ($[22] !== enableFastMode || $[23] !== unavailableReason) { 183 t10 = unavailableReason ? <Box marginLeft={2}><Text color="error">{unavailableReason}</Text></Box> : <><Box flexDirection="column" gap={0} marginLeft={2}><Box flexDirection="row" gap={2}><Text bold={true}>Fast mode</Text><Text color={enableFastMode ? "fastMode" : undefined} bold={enableFastMode}>{enableFastMode ? "ON " : "OFF"}</Text><Text dimColor={true}>{pricing}</Text></Box></Box>{isCooldown && runtimeState.status === "cooldown" && <Box marginLeft={2}><Text color="warning">{runtimeState.reason === "overloaded" ? "Fast mode overloaded and is temporarily unavailable" : "You've hit your fast limit"}{" \xB7 resets in "}{formatDuration(runtimeState.resetAt - Date.now(), { 184 hideTrailingZeros: true 185 })}</Text></Box>}</>; 186 $[22] = enableFastMode; 187 $[23] = unavailableReason; 188 $[24] = t10; 189 } else { 190 t10 = $[24]; 191 } 192 let t11; 193 if ($[25] === Symbol.for("react.memo_cache_sentinel")) { 194 t11 = <Text dimColor={true}>Learn more:{" "}<Link url="https://code.claude.com/docs/en/fast-mode">https://code.claude.com/docs/en/fast-mode</Link></Text>; 195 $[25] = t11; 196 } else { 197 t11 = $[25]; 198 } 199 let t12; 200 if ($[26] !== handleCancel || $[27] !== t10 || $[28] !== t9) { 201 t12 = <Dialog title={title} subtitle={`High-speed mode for ${FAST_MODE_MODEL_DISPLAY}. Billed as extra usage at a premium rate. Separate rate limits apply.`} onCancel={handleCancel} color="fastMode" inputGuide={t9}>{t10}{t11}</Dialog>; 202 $[26] = handleCancel; 203 $[27] = t10; 204 $[28] = t9; 205 $[29] = t12; 206 } else { 207 t12 = $[29]; 208 } 209 return t12; 210} 211function _temp4(prev_0) { 212 return !prev_0; 213} 214function _temp3(prev) { 215 return { 216 ...prev, 217 fastMode: false 218 }; 219} 220function _temp2(s_0) { 221 return s_0.fastMode; 222} 223function _temp(s) { 224 return s.mainLoopModel; 225} 226async function handleFastModeShortcut(enable: boolean, getAppState: () => AppState, setAppState: (f: (prev: AppState) => AppState) => void): Promise<string> { 227 const unavailableReason = getFastModeUnavailableReason(); 228 if (unavailableReason) { 229 return `Fast mode unavailable: ${unavailableReason}`; 230 } 231 const { 232 mainLoopModel 233 } = getAppState(); 234 applyFastMode(enable, setAppState); 235 logEvent('tengu_fast_mode_toggled', { 236 enabled: enable, 237 source: 'shortcut' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS 238 }); 239 if (enable) { 240 const fastIcon = getFastIconString(true); 241 const modelUpdated = !isFastModeSupportedByModel(mainLoopModel) ? ` · model set to ${FAST_MODE_MODEL_DISPLAY}` : ''; 242 const pricing = formatModelPricing(getOpus46CostTier(true)); 243 return `${fastIcon} Fast mode ON${modelUpdated} · ${pricing}`; 244 } else { 245 return `Fast mode OFF`; 246 } 247} 248export async function call(onDone: LocalJSXCommandOnDone, context: LocalJSXCommandContext, args?: string): Promise<React.ReactNode | null> { 249 if (!isFastModeEnabled()) { 250 return null; 251 } 252 253 // Fetch org fast mode status before showing the picker. We must know 254 // whether the org has disabled fast mode before allowing any toggle. 255 // If a startup prefetch is already in flight, this awaits it. 256 await prefetchFastModeStatus(); 257 const arg = args?.trim().toLowerCase(); 258 if (arg === 'on' || arg === 'off') { 259 const result = await handleFastModeShortcut(arg === 'on', context.getAppState, context.setAppState); 260 onDone(result); 261 return null; 262 } 263 const unavailableReason = getFastModeUnavailableReason(); 264 logEvent('tengu_fast_mode_picker_shown', { 265 unavailable_reason: (unavailableReason ?? '') as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS 266 }); 267 return <FastModePicker onDone={onDone} unavailableReason={unavailableReason} />; 268} 269//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZVN0YXRlIiwiQ29tbWFuZFJlc3VsdERpc3BsYXkiLCJMb2NhbEpTWENvbW1hbmRDb250ZXh0IiwiRGlhbG9nIiwiRmFzdEljb24iLCJnZXRGYXN0SWNvblN0cmluZyIsIkJveCIsIkxpbmsiLCJUZXh0IiwidXNlS2V5YmluZGluZ3MiLCJBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTIiwibG9nRXZlbnQiLCJBcHBTdGF0ZSIsInVzZUFwcFN0YXRlIiwidXNlU2V0QXBwU3RhdGUiLCJMb2NhbEpTWENvbW1hbmRPbkRvbmUiLCJjbGVhckZhc3RNb2RlQ29vbGRvd24iLCJGQVNUX01PREVfTU9ERUxfRElTUExBWSIsImdldEZhc3RNb2RlTW9kZWwiLCJnZXRGYXN0TW9kZVJ1bnRpbWVTdGF0ZSIsImdldEZhc3RNb2RlVW5hdmFpbGFibGVSZWFzb24iLCJpc0Zhc3RNb2RlRW5hYmxlZCIsImlzRmFzdE1vZGVTdXBwb3J0ZWRCeU1vZGVsIiwicHJlZmV0Y2hGYXN0TW9kZVN0YXR1cyIsImZvcm1hdER1cmF0aW9uIiwiZm9ybWF0TW9kZWxQcmljaW5nIiwiZ2V0T3B1czQ2Q29zdFRpZXIiLCJ1cGRhdGVTZXR0aW5nc0ZvclNvdXJjZSIsImFwcGx5RmFzdE1vZGUiLCJlbmFibGUiLCJzZXRBcHBTdGF0ZSIsImYiLCJwcmV2IiwiZmFzdE1vZGUiLCJ1bmRlZmluZWQiLCJuZWVkc01vZGVsU3dpdGNoIiwibWFpbkxvb3BNb2RlbCIsIm1haW5Mb29wTW9kZWxGb3JTZXNzaW9uIiwiRmFzdE1vZGVQaWNrZXIiLCJ0MCIsIiQiLCJfYyIsIm9uRG9uZSIsInVuYXZhaWxhYmxlUmVhc29uIiwibW9kZWwiLCJfdGVtcCIsImluaXRpYWxGYXN0TW9kZSIsIl90ZW1wMiIsImVuYWJsZUZhc3RNb2RlIiwic2V0RW5hYmxlRmFzdE1vZGUiLCJ0MSIsIlN5bWJvbCIsImZvciIsInJ1bnRpbWVTdGF0ZSIsImlzQ29vbGRvd24iLCJzdGF0dXMiLCJpc1VuYXZhaWxhYmxlIiwidDIiLCJwcmljaW5nIiwidDMiLCJoYW5kbGVDb25maXJtIiwiZW5hYmxlZCIsInNvdXJjZSIsImZhc3RJY29uIiwibW9kZWxVcGRhdGVkIiwiX3RlbXAzIiwidDQiLCJoYW5kbGVDYW5jZWwiLCJkaXNwbGF5IiwibWVzc2FnZSIsInQ1IiwiaGFuZGxlVG9nZ2xlIiwiX3RlbXA0IiwidDYiLCJ0NyIsImNvbnRleHQiLCJ0OCIsInRpdGxlIiwidDkiLCJleGl0U3RhdGUiLCJwZW5kaW5nIiwia2V5TmFtZSIsInQxMCIsInJlYXNvbiIsInJlc2V0QXQiLCJEYXRlIiwibm93IiwiaGlkZVRyYWlsaW5nWmVyb3MiLCJ0MTEiLCJ0MTIiLCJwcmV2XzAiLCJzXzAiLCJzIiwiaGFuZGxlRmFzdE1vZGVTaG9ydGN1dCIsImdldEFwcFN0YXRlIiwiUHJvbWlzZSIsImNhbGwiLCJhcmdzIiwiUmVhY3ROb2RlIiwiYXJnIiwidHJpbSIsInRvTG93ZXJDYXNlIiwicmVzdWx0IiwidW5hdmFpbGFibGVfcmVhc29uIl0sInNvdXJjZXMiOlsiZmFzdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHR5cGUge1xuICBDb21tYW5kUmVzdWx0RGlzcGxheSxcbiAgTG9jYWxKU1hDb21tYW5kQ29udGV4dCxcbn0gZnJvbSAnLi4vLi4vY29tbWFuZHMuanMnXG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2Rlc2lnbi1zeXN0ZW0vRGlhbG9nLmpzJ1xuaW1wb3J0IHsgRmFzdEljb24sIGdldEZhc3RJY29uU3RyaW5nIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9GYXN0SWNvbi5qcydcbmltcG9ydCB7IEJveCwgTGluaywgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IHVzZUtleWJpbmRpbmdzIH0gZnJvbSAnLi4vLi4va2V5YmluZGluZ3MvdXNlS2V5YmluZGluZy5qcydcbmltcG9ydCB7XG4gIHR5cGUgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgbG9nRXZlbnQsXG59IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FuYWx5dGljcy9pbmRleC5qcydcbmltcG9ydCB7XG4gIHR5cGUgQXBwU3RhdGUsXG4gIHVzZUFwcFN0YXRlLFxuICB1c2VTZXRBcHBTdGF0ZSxcbn0gZnJvbSAnLi4vLi4vc3RhdGUvQXBwU3RhdGUuanMnXG5pbXBvcnQgdHlwZSB7IExvY2FsSlNYQ29tbWFuZE9uRG9uZSB9IGZyb20gJy4uLy4uL3R5cGVzL2NvbW1hbmQuanMnXG5pbXBvcnQge1xuICBjbGVhckZhc3RNb2RlQ29vbGRvd24sXG4gIEZBU1RfTU9ERV9NT0RFTF9ESVNQTEFZLFxuICBnZXRGYXN0TW9kZU1vZGVsLFxuICBnZXRGYXN0TW9kZVJ1bnRpbWVTdGF0ZSxcbiAgZ2V0RmFzdE1vZGVVbmF2YWlsYWJsZVJlYXNvbixcbiAgaXNGYXN0TW9kZUVuYWJsZWQsXG4gIGlzRmFzdE1vZGVTdXBwb3J0ZWRCeU1vZGVsLFxuICBwcmVmZXRjaEZhc3RNb2RlU3RhdHVzLFxufSBmcm9tICcuLi8uLi91dGlscy9mYXN0TW9kZS5qcydcbmltcG9ydCB7IGZvcm1hdER1cmF0aW9uIH0gZnJvbSAnLi4vLi4vdXRpbHMvZm9ybWF0LmpzJ1xuaW1wb3J0IHsgZm9ybWF0TW9kZWxQcmljaW5nLCBnZXRPcHVzNDZDb3N0VGllciB9IGZyb20gJy4uLy4uL3V0aWxzL21vZGVsQ29zdC5qcydcbmltcG9ydCB7IHVwZGF0ZVNldHRpbmdzRm9yU291cmNlIH0gZnJvbSAnLi4vLi4vdXRpbHMvc2V0dGluZ3Mvc2V0dGluZ3MuanMnXG5cbmZ1bmN0aW9uIGFwcGx5RmFzdE1vZGUoXG4gIGVuYWJsZTogYm9vbGVhbixcbiAgc2V0QXBwU3RhdGU6IChmOiAocHJldjogQXBwU3RhdGUpID0+IEFwcFN0YXRlKSA9PiB2b2lkLFxuKTogdm9pZCB7XG4gIGNsZWFyRmFzdE1vZGVDb29sZG93bigpXG4gIHVwZGF0ZVNldHRpbmdzRm9yU291cmNlKCd1c2VyU2V0dGluZ3MnLCB7XG4gICAgZmFzdE1vZGU6IGVuYWJsZSA/IHRydWUgOiB1bmRlZmluZWQsXG4gIH0pXG4gIGlmIChlbmFibGUpIHtcbiAgICBzZXRBcHBTdGF0ZShwcmV2ID0+IHtcbiAgICAgIC8vIE9ubHkgc3dpdGNoIG1vZGVsIGlmIGN1cnJlbnQgbW9kZWwgZG9lc24ndCBzdXBwb3J0IGZhc3QgbW9kZVxuICAgICAgY29uc3QgbmVlZHNNb2RlbFN3aXRjaCA9ICFpc0Zhc3RNb2RlU3VwcG9ydGVkQnlNb2RlbChwcmV2Lm1haW5Mb29wTW9kZWwpXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5wcmV2LFxuICAgICAgICAuLi4obmVlZHNNb2RlbFN3aXRjaFxuICAgICAgICAgID8geyBtYWluTG9vcE1vZGVsOiBnZXRGYXN0TW9kZU1vZGVsKCksIG1haW5Mb29wTW9kZWxGb3JTZXNzaW9uOiBudWxsIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgZmFzdE1vZGU6IHRydWUsXG4gICAgICB9XG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICBzZXRBcHBTdGF0ZShwcmV2ID0+ICh7IC4uLnByZXYsIGZhc3RNb2RlOiBmYWxzZSB9KSlcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gRmFzdE1vZGVQaWNrZXIoe1xuICBvbkRvbmUsXG4gIHVuYXZhaWxhYmxlUmVhc29uLFxufToge1xuICBvbkRvbmU6IChcbiAgICByZXN1bHQ/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgZGlzcGxheT86IENvbW1hbmRSZXN1bHREaXNwbGF5IH0sXG4gICkgPT4gdm9pZFxuICB1bmF2YWlsYWJsZVJlYXNvbjogc3RyaW5nIHwgbnVsbFxufSk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IG1vZGVsID0gdXNlQXBwU3RhdGUocyA9PiBzLm1haW5Mb29wTW9kZWwpXG4gIGNvbnN0IGluaXRpYWxGYXN0TW9kZSA9IHVzZUFwcFN0YXRlKHMgPT4gcy5mYXN0TW9kZSlcbiAgY29uc3Qgc2V0QXBwU3RhdGUgPSB1c2VTZXRBcHBTdGF0ZSgpXG4gIGNvbnN0IFtlbmFibGVGYXN0TW9kZSwgc2V0RW5hYmxlRmFzdE1vZGVdID0gdXNlU3RhdGUoaW5pdGlhbEZhc3RNb2RlID8/IGZhbHNlKVxuICBjb25zdCBydW50aW1lU3RhdGUgPSBnZXRGYXN0TW9kZVJ1bnRpbWVTdGF0ZSgpXG4gIGNvbnN0IGlzQ29vbGRvd24gPSBydW50aW1lU3RhdGUuc3RhdHVzID09PSAnY29vbGRvd24nXG4gIGNvbnN0IGlzVW5hdmFpbGFibGUgPSB1bmF2YWlsYWJsZVJlYXNvbiAhPT0gbnVsbFxuICBjb25zdCBwcmljaW5nID0gZm9ybWF0TW9kZWxQcmljaW5nKGdldE9wdXM0NkNvc3RUaWVyKHRydWUpKVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUNvbmZpcm0oKTogdm9pZCB7XG4gICAgaWYgKGlzVW5hdmFpbGFibGUpIHJldHVyblxuICAgIGFwcGx5RmFzdE1vZGUoZW5hYmxlRmFzdE1vZGUsIHNldEFwcFN0YXRlKVxuICAgIGxvZ0V2ZW50KCd0ZW5ndV9mYXN0X21vZGVfdG9nZ2xlZCcsIHtcbiAgICAgIGVuYWJsZWQ6IGVuYWJsZUZhc3RNb2RlLFxuICAgICAgc291cmNlOlxuICAgICAgICAncGlja2VyJyBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgIH0pXG4gICAgaWYgKGVuYWJsZUZhc3RNb2RlKSB7XG4gICAgICBjb25zdCBmYXN0SWNvbiA9IGdldEZhc3RJY29uU3RyaW5nKGVuYWJsZUZhc3RNb2RlKVxuICAgICAgY29uc3QgbW9kZWxVcGRhdGVkID0gIWlzRmFzdE1vZGVTdXBwb3J0ZWRCeU1vZGVsKG1vZGVsKVxuICAgICAgICA/IGAgwrcgbW9kZWwgc2V0IHRvICR7RkFTVF9NT0RFX01PREVMX0RJU1BMQVl9YFxuICAgICAgICA6ICcnXG4gICAgICBvbkRvbmUoYCR7ZmFzdEljb259IEZhc3QgbW9kZSBPTiR7bW9kZWxVcGRhdGVkfSDCtyAke3ByaWNpbmd9YClcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0QXBwU3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBmYXN0TW9kZTogZmFsc2UgfSkpXG4gICAgICBvbkRvbmUoYEZhc3QgbW9kZSBPRkZgKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUNhbmNlbCgpOiB2b2lkIHtcbiAgICBpZiAoaXNVbmF2YWlsYWJsZSkge1xuICAgICAgLy8gRW5zdXJlIGZhc3QgbW9kZSBpcyBvZmYgaWYgdGhlIG9yZyBoYXMgZGlzYWJsZWQgaXRcbiAgICAgIGlmIChpbml0aWFsRmFzdE1vZGUpIHtcbiAgICAgICAgYXBwbHlGYXN0TW9kZShmYWxzZSwgc2V0QXBwU3RhdGUpXG4gICAgICB9XG4gICAgICBvbkRvbmUoJ0Zhc3QgbW9kZSBPRkYnLCB7IGRpc3BsYXk6ICdzeXN0ZW0nIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgbWVzc2FnZSA9IGluaXRpYWxGYXN0TW9kZVxuICAgICAgPyBgJHtnZXRGYXN0SWNvblN0cmluZygpfSBLZXB0IEZhc3QgbW9kZSBPTmBcbiAgICAgIDogYEtlcHQgRmFzdCBtb2RlIE9GRmBcbiAgICBvbkRvbmUobWVzc2FnZSwgeyBkaXNwbGF5OiAnc3lzdGVtJyB9KVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlVG9nZ2xlKCk6IHZvaWQge1xuICAgIGlmIChpc1VuYXZhaWxhYmxlKSByZXR1cm5cbiAgICBzZXRFbmFibGVGYXN0TW9kZShwcmV2ID0+ICFwcmV2KVxuICB9XG5cbiAgdXNlS2V5YmluZGluZ3MoXG4gICAge1xuICAgICAgJ2NvbmZpcm06eWVzJzogaGFuZGxlQ29uZmlybSxcbiAgICAgICdjb25maXJtOm5leHRGaWVsZCc6IGhhbmRsZVRvZ2dsZSxcbiAgICAgICdjb25maXJtOm5leHQnOiBoYW5kbGVUb2dnbGUsXG4gICAgICAnY29uZmlybTpwcmV2aW91cyc6IGhhbmRsZVRvZ2dsZSxcbiAgICAgICdjb25maXJtOmN5Y2xlTW9kZSc6IGhhbmRsZVRvZ2dsZSxcbiAgICAgICdjb25maXJtOnRvZ2dsZSc6IGhhbmRsZVRvZ2dsZSxcbiAgICB9LFxuICAgIHsgY29udGV4dDogJ0NvbmZpcm1hdGlvbicgfSxcbiAgKVxuXG4gIGNvbnN0IHRpdGxlID0gKFxuICAgIDxUZXh0PlxuICAgICAgPEZhc3RJY29uIGNvb2xkb3duPXtpc0Nvb2xkb3dufSAvPiBGYXN0IG1vZGUgKHJlc2VhcmNoIHByZXZpZXcpXG4gICAgPC9UZXh0PlxuICApXG5cbiAgcmV0dXJuIChcbiAgICA8RGlhbG9nXG4gICAgICB0aXRsZT17dGl0bGV9XG4gICAgICBzdWJ0aXRsZT17YEhpZ2gtc3BlZWQgbW9kZSBmb3IgJHtGQVNUX01PREVfTU9ERUxfRElTUExBWX0uIEJpbGxlZCBhcyBleHRyYSB1c2FnZSBhdCBhIHByZW1pdW0gcmF0ZS4gU2VwYXJhdGUgcmF0ZSBsaW1pdHMgYXBwbHkuYH1cbiAgICAgIG9uQ2FuY2VsPXtoYW5kbGVDYW5jZWx9XG4gICAgICBjb2xvcj1cImZhc3RNb2RlXCJcbiAgICAgIGlucHV0R3VpZGU9e2V4aXRTdGF0ZSA9PlxuICAgICAgICBleGl0U3RhdGUucGVuZGluZyA/IChcbiAgICAgICAgICA8VGV4dD5QcmVzcyB7ZXhpdFN0YXRlLmtleU5hbWV9IGFnYWluIHRvIGV4aXQ8L1RleHQ+XG4gICAgICAgICkgOiBpc1VuYXZhaWxhYmxlID8gKFxuICAgICAgICAgIDxUZXh0PkVzYyB0byBjYW5jZWw8L1RleHQ+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPFRleHQ+VGFiIHRvIHRvZ2dsZSDCtyBFbnRlciB0byBjb25maXJtIMK3IEVzYyB0byBjYW5jZWw8L1RleHQ+XG4gICAgICAgIClcbiAgICAgIH1cbiAgICA+XG4gICAgICB7dW5hdmFpbGFibGVSZWFzb24gPyAoXG4gICAgICAgIDxCb3ggbWFyZ2luTGVmdD17Mn0+XG4gICAgICAgICAgPFRleHQgY29sb3I9XCJlcnJvclwiPnt1bmF2YWlsYWJsZVJlYXNvbn08L1RleHQ+XG4gICAgICAgIDwvQm94PlxuICAgICAgKSA6IChcbiAgICAgICAgPD5cbiAgICAgICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBnYXA9ezB9IG1hcmdpbkxlZnQ9ezJ9PlxuICAgICAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwicm93XCIgZ2FwPXsyfT5cbiAgICAgICAgICAgICAgPFRleHQgYm9sZD5GYXN0IG1vZGU8L1RleHQ+XG4gICAgICAgICAgICAgIDxUZXh0XG4gICAgICAgICAgICAgICAgY29sb3I9e2VuYWJsZUZhc3RNb2RlID8gJ2Zhc3RNb2RlJyA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICBib2xkPXtlbmFibGVGYXN0TW9kZX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtlbmFibGVGYXN0TW9kZSA/ICdPTiAnIDogJ09GRid9XG4gICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+e3ByaWNpbmd9PC9UZXh0PlxuICAgICAgICAgICAgPC9Cb3g+XG4gICAgICAgICAgPC9Cb3g+XG5cbiAgICAgICAgICB7aXNDb29sZG93biAmJiBydW50aW1lU3RhdGUuc3RhdHVzID09PSAnY29vbGRvd24nICYmIChcbiAgICAgICAgICAgIDxCb3ggbWFyZ2luTGVmdD17Mn0+XG4gICAgICAgICAgICAgIDxUZXh0IGNvbG9yPVwid2FybmluZ1wiPlxuICAgICAgICAgICAgICAgIHtydW50aW1lU3RhdGUucmVhc29uID09PSAnb3ZlcmxvYWRlZCdcbiAgICAgICAgICAgICAgICAgID8gJ0Zhc3QgbW9kZSBvdmVybG9hZGVkIGFuZCBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSdcbiAgICAgICAgICAgICAgICAgIDogXCJZb3UndmUgaGl0IHlvdXIgZmFzdCBsaW1pdFwifVxuICAgICAgICAgICAgICAgIHsnIMK3IHJlc2V0cyBpbiAnfVxuICAgICAgICAgICAgICAgIHtmb3JtYXREdXJhdGlvbihydW50aW1lU3RhdGUucmVzZXRBdCAtIERhdGUubm93KCksIHtcbiAgICAgICAgICAgICAgICAgIGhpZGVUcmFpbGluZ1plcm9zOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICA8L0JveD5cbiAgICAgICAgICApfVxuICAgICAgICA8Lz5cbiAgICAgICl9XG4gICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgTGVhcm4gbW9yZTp7JyAnfVxuICAgICAgICA8TGluayB1cmw9XCJodHRwczovL2NvZGUuY2xhdWRlLmNvbS9kb2NzL2VuL2Zhc3QtbW9kZVwiPlxuICAgICAgICAgIGh0dHBzOi8vY29kZS5jbGF1ZGUuY29tL2RvY3MvZW4vZmFzdC1tb2RlXG4gICAgICAgIDwvTGluaz5cbiAgICAgIDwvVGV4dD5cbiAgICA8L0RpYWxvZz5cbiAgKVxufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVGYXN0TW9kZVNob3J0Y3V0KFxuICBlbmFibGU6IGJvb2xlYW4sXG4gIGdldEFwcFN0YXRlOiAoKSA9PiBBcHBTdGF0ZSxcbiAgc2V0QXBwU3RhdGU6IChmOiAocHJldjogQXBwU3RhdGUpID0+IEFwcFN0YXRlKSA9PiB2b2lkLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgdW5hdmFpbGFibGVSZWFzb24gPSBnZXRGYXN0TW9kZVVuYXZhaWxhYmxlUmVhc29uKClcbiAgaWYgKHVuYXZhaWxhYmxlUmVhc29uKSB7XG4gICAgcmV0dXJuIGBGYXN0IG1vZGUgdW5hdmFpbGFibGU6ICR7dW5hdmFpbGFibGVSZWFzb259YFxuICB9XG5cbiAgY29uc3QgeyBtYWluTG9vcE1vZGVsIH0gPSBnZXRBcHBTdGF0ZSgpXG4gIGFwcGx5RmFzdE1vZGUoZW5hYmxlLCBzZXRBcHBTdGF0ZSlcbiAgbG9nRXZlbnQoJ3Rlbmd1X2Zhc3RfbW9kZV90b2dnbGVkJywge1xuICAgIGVuYWJsZWQ6IGVuYWJsZSxcbiAgICBzb3VyY2U6XG4gICAgICAnc2hvcnRjdXQnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gIH0pXG5cbiAgaWYgKGVuYWJsZSkge1xuICAgIGNvbnN0IGZhc3RJY29uID0gZ2V0RmFzdEljb25TdHJpbmcodHJ1ZSlcbiAgICBjb25zdCBtb2RlbFVwZGF0ZWQgPSAhaXNGYXN0TW9kZVN1cHBvcnRlZEJ5TW9kZWwobWFpbkxvb3BNb2RlbClcbiAgICAgID8gYCDCtyBtb2RlbCBzZXQgdG8gJHtGQVNUX01PREVfTU9ERUxfRElTUExBWX1gXG4gICAgICA6ICcnXG4gICAgY29uc3QgcHJpY2luZyA9IGZvcm1hdE1vZGVsUHJpY2luZyhnZXRPcHVzNDZDb3N0VGllcih0cnVlKSlcbiAgICByZXR1cm4gYCR7ZmFzdEljb259IEZhc3QgbW9kZSBPTiR7bW9kZWxVcGRhdGVkfSDCtyAke3ByaWNpbmd9YFxuICB9IGVsc2Uge1xuICAgIHJldHVybiBgRmFzdCBtb2RlIE9GRmBcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FsbChcbiAgb25Eb25lOiBMb2NhbEpTWENvbW1hbmRPbkRvbmUsXG4gIGNvbnRleHQ6IExvY2FsSlNYQ29tbWFuZENvbnRleHQsXG4gIGFyZ3M/OiBzdHJpbmcsXG4pOiBQcm9taXNlPFJlYWN0LlJlYWN0Tm9kZSB8IG51bGw+IHtcbiAgaWYgKCFpc0Zhc3RNb2RlRW5hYmxlZCgpKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8vIEZldGNoIG9yZyBmYXN0IG1vZGUgc3RhdHVzIGJlZm9yZSBzaG93aW5nIHRoZSBwaWNrZXIuIFdlIG11c3Qga25vd1xuICAvLyB3aGV0aGVyIHRoZSBvcmcgaGFzIGRpc2FibGVkIGZhc3QgbW9kZSBiZWZvcmUgYWxsb3dpbmcgYW55IHRvZ2dsZS5cbiAgLy8gSWYgYSBzdGFydHVwIHByZWZldGNoIGlzIGFscmVhZHkgaW4gZmxpZ2h0LCB0aGlzIGF3YWl0cyBpdC5cbiAgYXdhaXQgcHJlZmV0Y2hGYXN0TW9kZVN0YXR1cygpXG5cbiAgY29uc3QgYXJnID0gYXJncz8udHJpbSgpLnRvTG93ZXJDYXNlKClcbiAgaWYgKGFyZyA9PT0gJ29uJyB8fCBhcmcgPT09ICdvZmYnKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlRmFzdE1vZGVTaG9ydGN1dChcbiAgICAgIGFyZyA9PT0gJ29uJyxcbiAgICAgIGNvbnRleHQuZ2V0QXBwU3RhdGUsXG4gICAgICBjb250ZXh0LnNldEFwcFN0YXRlLFxuICAgIClcbiAgICBvbkRvbmUocmVzdWx0KVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCB1bmF2YWlsYWJsZVJlYXNvbiA9IGdldEZhc3RNb2RlVW5hdmFpbGFibGVSZWFzb24oKVxuICBsb2dFdmVudCgndGVuZ3VfZmFzdF9tb2RlX3BpY2tlcl9zaG93bicsIHtcbiAgICB1bmF2YWlsYWJsZV9yZWFzb246ICh1bmF2YWlsYWJsZVJlYXNvbiA/P1xuICAgICAgJycpIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gIH0pXG4gIHJldHVybiAoXG4gICAgPEZhc3RNb2RlUGlja2VyIG9uRG9uZT17b25Eb25lfSB1bmF2YWlsYWJsZVJlYXNvbj17dW5hdmFpbGFibGVSZWFzb259IC8+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sS0FBS0EsS0FBSyxNQUFNLE9BQU87QUFDOUIsU0FBU0MsUUFBUSxRQUFRLE9BQU87QUFDaEMsY0FDRUMsb0JBQW9CLEVBQ3BCQyxzQkFBc0IsUUFDakIsbUJBQW1CO0FBQzFCLFNBQVNDLE1BQU0sUUFBUSwwQ0FBMEM7QUFDakUsU0FBU0MsUUFBUSxFQUFFQyxpQkFBaUIsUUFBUSw4QkFBOEI7QUFDMUUsU0FBU0Ms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QUltQixNQUFNLEVBQUU7SUFDVixNQUFNa0MsUUFBUSxHQUFHMUQsaUJBQWlCLENBQUMsSUFBSSxDQUFDO0lBQ3hDLE1BQU0yRCxZQUFZLEdBQUcsQ0FBQzFDLDBCQUEwQixDQUFDYyxhQUFhLENBQUMsR0FDM0QsbUJBQW1CbkIsdUJBQXVCLEVBQUUsR0FDNUMsRUFBRTtJQUNOLE1BQU15QyxPQUFPLEdBQUdqQyxrQkFBa0IsQ0FBQ0MsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0QsT0FBTyxHQUFHcUMsUUFBUSxnQkFBZ0JDLFlBQVksTUFBTU4sT0FBTyxFQUFFO0VBQy9ELENBQUMsTUFBTTtJQUNMLE9BQU8sZUFBZTtFQUN4QjtBQUNGO0FBRUEsT0FBTyxlQUFlc0MsSUFBSUEsQ0FDeEJ0RCxNQUFNLEVBQUUzQixxQkFBcUIsRUFDN0I0RCxPQUFPLEVBQUV6RSxzQkFBc0IsRUFDL0IrRixJQUFhLENBQVIsRUFBRSxNQUFNLENBQ2QsRUFBRUYsT0FBTyxDQUFDaEcsS0FBSyxDQUFDbUcsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDO0VBQ2pDLElBQUksQ0FBQzdFLGlCQUFpQixDQUFDLENBQUMsRUFBRTtJQUN4QixPQUFPLElBQUk7RUFDYjs7RUFFQTtFQUNBO0VBQ0E7RUFDQSxNQUFNRSxzQkFBc0IsQ0FBQyxDQUFDO0VBRTlCLE1BQU00RSxHQUFHLEdBQUdGLElBQUksRUFBRUcsSUFBSSxDQUFDLENBQUMsQ0FBQ0MsV0FBVyxDQUFDLENBQUM7RUFDdEMsSUFBSUYsR0FBRyxLQUFLLElBQUksSUFBSUEsR0FBRyxLQUFLLEtBQUssRUFBRTtJQUNqQyxNQUFNRyxNQUFNLEdBQUcsTUFBTVQsc0JBQXNCLENBQ3pDTSxHQUFHLEtBQUssSUFBSSxFQUNaeEIsT0FBTyxDQUFDbUIsV0FBVyxFQUNuQm5CLE9BQU8sQ0FBQzdDLFdBQ1YsQ0FBQztJQUNEWSxNQUFNLENBQUM0RCxNQUFNLENBQUM7SUFDZCxPQUFPLElBQUk7RUFDYjtFQUVBLE1BQU0zRCxpQkFBaUIsR0FBR3ZCLDRCQUE0QixDQUFDLENBQUM7RUFDeERULFFBQVEsQ0FBQyw4QkFBOEIsRUFBRTtJQUN2QzRGLGtCQUFrQixFQUFFLENBQUM1RCxpQkFBaUIsSUFDcEMsRUFBRSxLQUFLakM7RUFDWCxDQUFDLENBQUM7RUFDRixPQUNFLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDZ0MsTUFBTSxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQ0MsaUJBQWlCLENBQUMsR0FBRztBQUU1RSIsImlnbm9yZUxpc3QiOltdfQ==