/ components / ThemePicker.tsx
ThemePicker.tsx
  1  import { c as _c } from "react/compiler-runtime";
  2  import { feature } from 'bun:bundle';
  3  import * as React from 'react';
  4  import { useExitOnCtrlCDWithKeybindings } from '../hooks/useExitOnCtrlCDWithKeybindings.js';
  5  import { useTerminalSize } from '../hooks/useTerminalSize.js';
  6  import { Box, Text, usePreviewTheme, useTheme, useThemeSetting } from '../ink.js';
  7  import { useRegisterKeybindingContext } from '../keybindings/KeybindingContext.js';
  8  import { useKeybinding } from '../keybindings/useKeybinding.js';
  9  import { useShortcutDisplay } from '../keybindings/useShortcutDisplay.js';
 10  import { useAppState, useSetAppState } from '../state/AppState.js';
 11  import { gracefulShutdown } from '../utils/gracefulShutdown.js';
 12  import { updateSettingsForSource } from '../utils/settings/settings.js';
 13  import type { ThemeSetting } from '../utils/theme.js';
 14  import { Select } from './CustomSelect/index.js';
 15  import { Byline } from './design-system/Byline.js';
 16  import { KeyboardShortcutHint } from './design-system/KeyboardShortcutHint.js';
 17  import { getColorModuleUnavailableReason, getSyntaxTheme } from './StructuredDiff/colorDiff.js';
 18  import { StructuredDiff } from './StructuredDiff.js';
 19  export type ThemePickerProps = {
 20    onThemeSelect: (setting: ThemeSetting) => void;
 21    showIntroText?: boolean;
 22    helpText?: string;
 23    showHelpTextBelow?: boolean;
 24    hideEscToCancel?: boolean;
 25    /** Skip exit handling when running in a context that already has it (e.g., onboarding) */
 26    skipExitHandling?: boolean;
 27    /** Called when the user cancels (presses Escape). If skipExitHandling is true and this is provided, it will be called instead of just saving the preview. */
 28    onCancel?: () => void;
 29  };
 30  export function ThemePicker(t0) {
 31    const $ = _c(59);
 32    const {
 33      onThemeSelect,
 34      showIntroText: t1,
 35      helpText: t2,
 36      showHelpTextBelow: t3,
 37      hideEscToCancel: t4,
 38      skipExitHandling: t5,
 39      onCancel: onCancelProp
 40    } = t0;
 41    const showIntroText = t1 === undefined ? false : t1;
 42    const helpText = t2 === undefined ? "" : t2;
 43    const showHelpTextBelow = t3 === undefined ? false : t3;
 44    const hideEscToCancel = t4 === undefined ? false : t4;
 45    const skipExitHandling = t5 === undefined ? false : t5;
 46    const [theme] = useTheme();
 47    const themeSetting = useThemeSetting();
 48    const {
 49      columns
 50    } = useTerminalSize();
 51    let t6;
 52    if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
 53      t6 = getColorModuleUnavailableReason();
 54      $[0] = t6;
 55    } else {
 56      t6 = $[0];
 57    }
 58    const colorModuleUnavailableReason = t6;
 59    let t7;
 60    if ($[1] !== theme) {
 61      t7 = colorModuleUnavailableReason === null ? getSyntaxTheme(theme) : null;
 62      $[1] = theme;
 63      $[2] = t7;
 64    } else {
 65      t7 = $[2];
 66    }
 67    const syntaxTheme = t7;
 68    const {
 69      setPreviewTheme,
 70      savePreview,
 71      cancelPreview
 72    } = usePreviewTheme();
 73    const syntaxHighlightingDisabled = useAppState(_temp) ?? false;
 74    const setAppState = useSetAppState();
 75    useRegisterKeybindingContext("ThemePicker");
 76    const syntaxToggleShortcut = useShortcutDisplay("theme:toggleSyntaxHighlighting", "ThemePicker", "ctrl+t");
 77    let t8;
 78    if ($[3] !== setAppState || $[4] !== syntaxHighlightingDisabled) {
 79      t8 = () => {
 80        if (colorModuleUnavailableReason === null) {
 81          const newValue = !syntaxHighlightingDisabled;
 82          updateSettingsForSource("userSettings", {
 83            syntaxHighlightingDisabled: newValue
 84          });
 85          setAppState(prev => ({
 86            ...prev,
 87            settings: {
 88              ...prev.settings,
 89              syntaxHighlightingDisabled: newValue
 90            }
 91          }));
 92        }
 93      };
 94      $[3] = setAppState;
 95      $[4] = syntaxHighlightingDisabled;
 96      $[5] = t8;
 97    } else {
 98      t8 = $[5];
 99    }
100    let t9;
101    if ($[6] === Symbol.for("react.memo_cache_sentinel")) {
102      t9 = {
103        context: "ThemePicker"
104      };
105      $[6] = t9;
106    } else {
107      t9 = $[6];
108    }
109    useKeybinding("theme:toggleSyntaxHighlighting", t8, t9);
110    const exitState = useExitOnCtrlCDWithKeybindings(skipExitHandling ? _temp2 : undefined);
111    let t10;
112    if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
113      t10 = [...(feature("AUTO_THEME") ? [{
114        label: "Auto (match terminal)",
115        value: "auto" as const
116      }] : []), {
117        label: "Dark mode",
118        value: "dark"
119      }, {
120        label: "Light mode",
121        value: "light"
122      }, {
123        label: "Dark mode (colorblind-friendly)",
124        value: "dark-daltonized"
125      }, {
126        label: "Light mode (colorblind-friendly)",
127        value: "light-daltonized"
128      }, {
129        label: "Dark mode (ANSI colors only)",
130        value: "dark-ansi"
131      }, {
132        label: "Light mode (ANSI colors only)",
133        value: "light-ansi"
134      }];
135      $[7] = t10;
136    } else {
137      t10 = $[7];
138    }
139    const themeOptions = t10;
140    let t11;
141    if ($[8] !== showIntroText) {
142      t11 = showIntroText ? <Text>Let's get started.</Text> : <Text bold={true} color="permission">Theme</Text>;
143      $[8] = showIntroText;
144      $[9] = t11;
145    } else {
146      t11 = $[9];
147    }
148    let t12;
149    if ($[10] === Symbol.for("react.memo_cache_sentinel")) {
150      t12 = <Text bold={true}>Choose the text style that looks best with your terminal</Text>;
151      $[10] = t12;
152    } else {
153      t12 = $[10];
154    }
155    let t13;
156    if ($[11] !== helpText || $[12] !== showHelpTextBelow) {
157      t13 = helpText && !showHelpTextBelow && <Text dimColor={true}>{helpText}</Text>;
158      $[11] = helpText;
159      $[12] = showHelpTextBelow;
160      $[13] = t13;
161    } else {
162      t13 = $[13];
163    }
164    let t14;
165    if ($[14] !== t13) {
166      t14 = <Box flexDirection="column">{t12}{t13}</Box>;
167      $[14] = t13;
168      $[15] = t14;
169    } else {
170      t14 = $[15];
171    }
172    let t15;
173    if ($[16] !== setPreviewTheme) {
174      t15 = setting => {
175        setPreviewTheme(setting as ThemeSetting);
176      };
177      $[16] = setPreviewTheme;
178      $[17] = t15;
179    } else {
180      t15 = $[17];
181    }
182    let t16;
183    if ($[18] !== onThemeSelect || $[19] !== savePreview) {
184      t16 = setting_0 => {
185        savePreview();
186        onThemeSelect(setting_0 as ThemeSetting);
187      };
188      $[18] = onThemeSelect;
189      $[19] = savePreview;
190      $[20] = t16;
191    } else {
192      t16 = $[20];
193    }
194    let t17;
195    if ($[21] !== cancelPreview || $[22] !== onCancelProp || $[23] !== skipExitHandling) {
196      t17 = skipExitHandling ? () => {
197        cancelPreview();
198        onCancelProp?.();
199      } : async () => {
200        cancelPreview();
201        await gracefulShutdown(0);
202      };
203      $[21] = cancelPreview;
204      $[22] = onCancelProp;
205      $[23] = skipExitHandling;
206      $[24] = t17;
207    } else {
208      t17 = $[24];
209    }
210    let t18;
211    if ($[25] !== t15 || $[26] !== t16 || $[27] !== t17 || $[28] !== themeSetting) {
212      t18 = <Select options={themeOptions} onFocus={t15} onChange={t16} onCancel={t17} visibleOptionCount={themeOptions.length} defaultValue={themeSetting} defaultFocusValue={themeSetting} />;
213      $[25] = t15;
214      $[26] = t16;
215      $[27] = t17;
216      $[28] = themeSetting;
217      $[29] = t18;
218    } else {
219      t18 = $[29];
220    }
221    let t19;
222    if ($[30] !== t11 || $[31] !== t14 || $[32] !== t18) {
223      t19 = <Box flexDirection="column" gap={1}>{t11}{t14}{t18}</Box>;
224      $[30] = t11;
225      $[31] = t14;
226      $[32] = t18;
227      $[33] = t19;
228    } else {
229      t19 = $[33];
230    }
231    let t20;
232    if ($[34] === Symbol.for("react.memo_cache_sentinel")) {
233      t20 = {
234        oldStart: 1,
235        newStart: 1,
236        oldLines: 3,
237        newLines: 3,
238        lines: [" function greet() {", "-  console.log(\"Hello, World!\");", "+  console.log(\"Hello, Claude!\");", " }"]
239      };
240      $[34] = t20;
241    } else {
242      t20 = $[34];
243    }
244    let t21;
245    if ($[35] !== columns) {
246      t21 = <Box flexDirection="column" borderTop={true} borderBottom={true} borderLeft={false} borderRight={false} borderStyle="dashed" borderColor="subtle"><StructuredDiff patch={t20} dim={false} filePath="demo.js" firstLine={null} width={columns} /></Box>;
247      $[35] = columns;
248      $[36] = t21;
249    } else {
250      t21 = $[36];
251    }
252    const t22 = colorModuleUnavailableReason === "env" ? `Syntax highlighting disabled (via CLAUDE_CODE_SYNTAX_HIGHLIGHT=${process.env.CLAUDE_CODE_SYNTAX_HIGHLIGHT})` : syntaxHighlightingDisabled ? `Syntax highlighting disabled (${syntaxToggleShortcut} to enable)` : syntaxTheme ? `Syntax theme: ${syntaxTheme.theme}${syntaxTheme.source ? ` (from ${syntaxTheme.source})` : ""} (${syntaxToggleShortcut} to disable)` : `Syntax highlighting enabled (${syntaxToggleShortcut} to disable)`;
253    let t23;
254    if ($[37] !== t22) {
255      t23 = <Text dimColor={true}>{" "}{t22}</Text>;
256      $[37] = t22;
257      $[38] = t23;
258    } else {
259      t23 = $[38];
260    }
261    let t24;
262    if ($[39] !== t21 || $[40] !== t23) {
263      t24 = <Box flexDirection="column" width="100%">{t21}{t23}</Box>;
264      $[39] = t21;
265      $[40] = t23;
266      $[41] = t24;
267    } else {
268      t24 = $[41];
269    }
270    let t25;
271    if ($[42] !== t19 || $[43] !== t24) {
272      t25 = <Box flexDirection="column" gap={1}>{t19}{t24}</Box>;
273      $[42] = t19;
274      $[43] = t24;
275      $[44] = t25;
276    } else {
277      t25 = $[44];
278    }
279    const content = t25;
280    if (!showIntroText) {
281      let t26;
282      if ($[45] !== content) {
283        t26 = <Box flexDirection="column">{content}</Box>;
284        $[45] = content;
285        $[46] = t26;
286      } else {
287        t26 = $[46];
288      }
289      let t27;
290      if ($[47] !== helpText || $[48] !== showHelpTextBelow) {
291        t27 = showHelpTextBelow && helpText && <Box marginLeft={3}><Text dimColor={true}>{helpText}</Text></Box>;
292        $[47] = helpText;
293        $[48] = showHelpTextBelow;
294        $[49] = t27;
295      } else {
296        t27 = $[49];
297      }
298      let t28;
299      if ($[50] !== exitState || $[51] !== hideEscToCancel) {
300        t28 = !hideEscToCancel && <Box><Text dimColor={true} italic={true}>{exitState.pending ? <>Press {exitState.keyName} again to exit</> : <Byline><KeyboardShortcutHint shortcut="Enter" action="select" /><KeyboardShortcutHint shortcut="Esc" action="cancel" /></Byline>}</Text></Box>;
301        $[50] = exitState;
302        $[51] = hideEscToCancel;
303        $[52] = t28;
304      } else {
305        t28 = $[52];
306      }
307      let t29;
308      if ($[53] !== t27 || $[54] !== t28) {
309        t29 = <Box marginTop={1}>{t27}{t28}</Box>;
310        $[53] = t27;
311        $[54] = t28;
312        $[55] = t29;
313      } else {
314        t29 = $[55];
315      }
316      let t30;
317      if ($[56] !== t26 || $[57] !== t29) {
318        t30 = <>{t26}{t29}</>;
319        $[56] = t26;
320        $[57] = t29;
321        $[58] = t30;
322      } else {
323        t30 = $[58];
324      }
325      return t30;
326    }
327    return content;
328  }
329  function _temp2() {}
330  function _temp(s) {
331    return s.settings.syntaxHighlightingDisabled;
332  }
333  //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmZWF0dXJlIiwiUmVhY3QiLCJ1c2VFeGl0T25DdHJsQ0RXaXRoS2V5YmluZGluZ3MiLCJ1c2VUZXJtaW5hbFNpemUiLCJCb3giLCJUZXh0IiwidXNlUHJldmlld1RoZW1lIiwidXNlVGhlbWUiLCJ1c2VUaGVtZVNldHRpbmciLCJ1c2VSZWdpc3RlcktleWJpbmRpbmdDb250ZXh0IiwidXNlS2V5YmluZGluZyIsInVzZVNob3J0Y3V0RGlzcGxheSIsInVzZUFwcFN0YXRlIiwidXNlU2V0QXBwU3RhdGUiLCJncmFjZWZ1bFNodXRkb3duIiwidXBkYXRlU2V0dGluZ3NGb3JTb3VyY2UiLCJUaGVtZVNldHRpbmciLCJTZWxlY3QiLCJCeWxpbmUiLCJLZXlib2FyZFNob3J0Y3V0SGludCIsImdldENvbG9yTW9kdWxlVW5hdmFpbGFibGVSZWFzb24iLCJnZXRTeW50YXhUaGVtZSIsIlN0cnVjdHVyZWREaWZmIiwiVGhlbWVQaWNrZXJQcm9wcyIsIm9uVGhlbWVTZWxlY3QiLCJzZXR0aW5nIiwic2hvd0ludHJvVGV4dCIsImhlbHBUZXh0Iiwic2hvd0hlbHBUZXh0QmVsb3ciLCJoaWRlRXNjVG9DYW5jZWwiLCJza2lwRXhpdEhhbmRsaW5nIiwib25DYW5jZWwiLCJUaGVtZVBpY2tlciIsInQwIiwiJCIsIl9jIiwidDEiLCJ0MiIsInQzIiwidDQiLCJ0NSIsIm9uQ2FuY2VsUHJvcCIsInVuZGVmaW5lZCIsInRoZW1lIiwidGhlbWVTZXR0aW5nIiwiY29sdW1ucyIsInQ2IiwiU3ltYm9sIiwiZm9yIiwiY29sb3JNb2R1bGVVbmF2YWlsYWJsZVJlYXNvbiIsInQ3Iiwic3ludGF4VGhlbWUiLCJzZXRQcmV2aWV3VGhlbWUiLCJzYXZlUHJldmlldyIsImNhbmNlbFByZXZpZXciLCJzeW50YXhIaWdobGlnaHRpbmdEaXNhYmxlZCIsIl90ZW1wIiwic2V0QXBwU3RhdGUiLCJzeW50YXhUb2dnbGVTaG9ydGN1dCIsInQ4IiwibmV3VmFsdWUiLCJwcmV2Iiwic2V0dGluZ3MiLCJ0OSIsImNvbnRleHQiLCJleGl0U3RhdGUiLCJfdGVtcDIiLCJ0MTAiLCJsYWJlbCIsInZhbHVlIiwiY29uc3QiLCJ0aGVtZU9wdGlvbnMiLCJ0MTEiLCJ0MTIiLCJ0MTMiLCJ0MTQiLCJ0MTUiLCJ0MTYiLCJzZXR0aW5nXzAiLCJ0MTciLCJ0MTgiLCJsZW5ndGgiLCJ0MTkiLCJ0MjAiLCJvbGRTdGFydCIsIm5ld1N0YXJ0Iiwib2xkTGluZXMiLCJuZXdMaW5lcyIsImxpbmVzIiwidDIxIiwidDIyIiwicHJvY2VzcyIsImVudiIsIkNMQVVERV9DT0RFX1NZTlRBWF9ISUdITElHSFQiLCJzb3VyY2UiLCJ0MjMiLCJ0MjQiLCJ0MjUiLCJjb250ZW50IiwidDI2IiwidDI3IiwidDI4IiwicGVuZGluZyIsImtleU5hbWUiLCJ0MjkiLCJ0MzAiLCJzIl0sInNvdXJjZXMiOlsiVGhlbWVQaWNrZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZlYXR1cmUgfSBmcm9tICdidW46YnVuZGxlJ1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VFeGl0T25DdHJsQ0RXaXRoS2V5YmluZGluZ3MgfSBmcm9tICcuLi9ob29rcy91c2VFeGl0T25DdHJsQ0RXaXRoS2V5YmluZGluZ3MuanMnXG5pbXBvcnQgeyB1c2VUZXJtaW5hbFNpemUgfSBmcm9tICcuLi9ob29rcy91c2VUZXJtaW5hbFNpemUuanMnXG5pbXBvcnQge1xuICBCb3gsXG4gIFRleHQsXG4gIHVzZVByZXZpZXdUaGVtZSxcbiAgdXNlVGhlbWUsXG4gIHVzZVRoZW1lU2V0dGluZyxcbn0gZnJvbSAnLi4vaW5rLmpzJ1xuaW1wb3J0IHsgdXNlUmVnaXN0ZXJLZXliaW5kaW5nQ29udGV4dCB9IGZyb20gJy4uL2tleWJpbmRpbmdzL0tleWJpbmRpbmdDb250ZXh0LmpzJ1xuaW1wb3J0IHsgdXNlS2V5YmluZGluZyB9IGZyb20gJy4uL2tleWJpbmRpbmdzL3VzZUtleWJpbmRpbmcuanMnXG5pbXBvcnQgeyB1c2VTaG9ydGN1dERpc3BsYXkgfSBmcm9tICcuLi9rZXliaW5kaW5ncy91c2VTaG9ydGN1dERpc3BsYXkuanMnXG5pbXBvcnQgeyB1c2VBcHBTdGF0ZSwgdXNlU2V0QXBwU3RhdGUgfSBmcm9tICcuLi9zdGF0ZS9BcHBTdGF0ZS5qcydcbmltcG9ydCB7IGdyYWNlZnVsU2h1dGRvd24gfSBmcm9tICcuLi91dGlscy9ncmFjZWZ1bFNodXRkb3duLmpzJ1xuaW1wb3J0IHsgdXBkYXRlU2V0dGluZ3NGb3JTb3VyY2UgfSBmcm9tICcuLi91dGlscy9zZXR0aW5ncy9zZXR0aW5ncy5qcydcbmltcG9ydCB0eXBlIHsgVGhlbWVTZXR0aW5nIH0gZnJvbSAnLi4vdXRpbHMvdGhlbWUuanMnXG5pbXBvcnQgeyBTZWxlY3QgfSBmcm9tICcuL0N1c3RvbVNlbGVjdC9pbmRleC5qcydcbmltcG9ydCB7IEJ5bGluZSB9IGZyb20gJy4vZGVzaWduLXN5c3RlbS9CeWxpbmUuanMnXG5pbXBvcnQgeyBLZXlib2FyZFNob3J0Y3V0SGludCB9IGZyb20gJy4vZGVzaWduLXN5c3RlbS9LZXlib2FyZFNob3J0Y3V0SGludC5qcydcbmltcG9ydCB7XG4gIGdldENvbG9yTW9kdWxlVW5hdmFpbGFibGVSZWFzb24sXG4gIGdldFN5bnRheFRoZW1lLFxufSBmcm9tICcuL1N0cnVjdHVyZWREaWZmL2NvbG9yRGlmZi5qcydcbmltcG9ydCB7IFN0cnVjdHVyZWREaWZmIH0gZnJvbSAnLi9TdHJ1Y3R1cmVkRGlmZi5qcydcblxuZXhwb3J0IHR5cGUgVGhlbWVQaWNrZXJQcm9wcyA9IHtcbiAgb25UaGVtZVNlbGVjdDogKHNldHRpbmc6IFRoZW1lU2V0dGluZykgPT4gdm9pZFxuICBzaG93SW50cm9UZXh0PzogYm9vbGVhblxuICBoZWxwVGV4dD86IHN0cmluZ1xuICBzaG93SGVscFRleHRCZWxvdz86IGJvb2xlYW5cbiAgaGlkZUVzY1RvQ2FuY2VsPzogYm9vbGVhblxuICAvKiogU2tpcCBleGl0IGhhbmRsaW5nIHdoZW4gcnVubmluZyBpbiBhIGNvbnRleHQgdGhhdCBhbHJlYWR5IGhhcyBpdCAoZS5nLiwgb25ib2FyZGluZykgKi9cbiAgc2tpcEV4aXRIYW5kbGluZz86IGJvb2xlYW5cbiAgLyoqIENhbGxlZCB3aGVuIHRoZSB1c2VyIGNhbmNlbHMgKHByZXNzZXMgRXNjYXBlKS4gSWYgc2tpcEV4aXRIYW5kbGluZyBpcyB0cnVlIGFuZCB0aGlzIGlzIHByb3ZpZGVkLCBpdCB3aWxsIGJlIGNhbGxlZCBpbnN0ZWFkIG9mIGp1c3Qgc2F2aW5nIHRoZSBwcmV2aWV3LiAqL1xuICBvbkNhbmNlbD86ICgpID0+IHZvaWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFRoZW1lUGlja2VyKHtcbiAgb25UaGVtZVNlbGVjdCxcbiAgc2hvd0ludHJvVGV4dCA9IGZhbHNlLFxuICBoZWxwVGV4dCA9ICcnLFxuICBzaG93SGVscFRleHRCZWxvdyA9IGZhbHNlLFxuICBoaWRlRXNjVG9DYW5jZWwgPSBmYWxzZSxcbiAgc2tpcEV4aXRIYW5kbGluZyA9IGZhbHNlLFxuICBvbkNhbmNlbDogb25DYW5jZWxQcm9wLFxufTogVGhlbWVQaWNrZXJQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IFt0aGVtZV0gPSB1c2VUaGVtZSgpXG4gIGNvbnN0IHRoZW1lU2V0dGluZyA9IHVzZVRoZW1lU2V0dGluZygpXG4gIGNvbnN0IHsgY29sdW1ucyB9ID0gdXNlVGVybWluYWxTaXplKClcbiAgY29uc3QgY29sb3JNb2R1bGVVbmF2YWlsYWJsZVJlYXNvbiA9IGdldENvbG9yTW9kdWxlVW5hdmFpbGFibGVSZWFzb24oKVxuICBjb25zdCBzeW50YXhUaGVtZSA9XG4gICAgY29sb3JNb2R1bGVVbmF2YWlsYWJsZVJlYXNvbiA9PT0gbnVsbCA/IGdldFN5bnRheFRoZW1lKHRoZW1lKSA6IG51bGxcbiAgY29uc3QgeyBzZXRQcmV2aWV3VGhlbWUsIHNhdmVQcmV2aWV3LCBjYW5jZWxQcmV2aWV3IH0gPSB1c2VQcmV2aWV3VGhlbWUoKVxuICBjb25zdCBzeW50YXhIaWdobGlnaHRpbmdEaXNhYmxlZCA9XG4gICAgdXNlQXBwU3RhdGUocyA9PiBzLnNldHRpbmdzLnN5bnRheEhpZ2hsaWdodGluZ0Rpc2FibGVkKSA/PyBmYWxzZVxuICBjb25zdCBzZXRBcHBTdGF0ZSA9IHVzZVNldEFwcFN0YXRlKClcblxuICAvLyBSZWdpc3RlciBUaGVtZVBpY2tlciBjb250ZXh0IHNvIGl0cyBrZXliaW5kaW5ncyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBHbG9iYWxcbiAgdXNlUmVnaXN0ZXJLZXliaW5kaW5nQ29udGV4dCgnVGhlbWVQaWNrZXInKVxuXG4gIGNvbnN0IHN5bnRheFRvZ2dsZVNob3J0Y3V0ID0gdXNlU2hvcnRjdXREaXNwbGF5KFxuICAgICd0aGVtZTp0b2dnbGVTeW50YXhIaWdobGlnaHRpbmcnLFxuICAgICdUaGVtZVBpY2tlcicsXG4gICAgJ2N0cmwrdCcsXG4gIClcblxuICB1c2VLZXliaW5kaW5nKFxuICAgICd0aGVtZTp0b2dnbGVTeW50YXhIaWdobGlnaHRpbmcnLFxuICAgICgpID0+IHtcbiAgICAgIGlmIChjb2xvck1vZHVsZVVuYXZhaWxhYmxlUmVhc29uID09PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gIXN5bnRheEhpZ2hsaWdodGluZ0Rpc2FibGVkXG4gICAgICAgIHVwZGF0ZVNldHRpbmdzRm9yU291cmNlKCd1c2VyU2V0dGluZ3MnLCB7XG4gICAgICAgICAgc3ludGF4SGlnaGxpZ2h0aW5nRGlzYWJsZWQ6IG5ld1ZhbHVlLFxuICAgICAgICB9KVxuICAgICAgICBzZXRBcHBTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICBzZXR0aW5nczogeyAuLi5wcmV2LnNldHRpbmdzLCBzeW50YXhIaWdobGlnaHRpbmdEaXNhYmxlZDogbmV3VmFsdWUgfSxcbiAgICAgICAgfSkpXG4gICAgICB9XG4gICAgfSxcbiAgICB7IGNvbnRleHQ6ICdUaGVtZVBpY2tlcicgfSxcbiAgKVxuICAvLyBBbHdheXMgY2FsbCB0aGUgaG9vayB0byBmb2xsb3cgUmVhY3QgcnVsZXMsIGJ1dCBjb25kaXRpb25hbGx5IGFzc2lnbiB0aGUgZXhpdCBoYW5kbGVyXG4gIGNvbnN0IGV4aXRTdGF0ZSA9IHVzZUV4aXRPbkN0cmxDRFdpdGhLZXliaW5kaW5ncyhcbiAgICBza2lwRXhpdEhhbmRsaW5nID8gKCkgPT4ge30gOiB1bmRlZmluZWQsXG4gIClcblxuICBjb25zdCB0aGVtZU9wdGlvbnM6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IFRoZW1lU2V0dGluZyB9W10gPSBbXG4gICAgLi4uKGZlYXR1cmUoJ0FVVE9fVEhFTUUnKVxuICAgICAgPyBbeyBsYWJlbDogJ0F1dG8gKG1hdGNoIHRlcm1pbmFsKScsIHZhbHVlOiAnYXV0bycgYXMgY29uc3QgfV1cbiAgICAgIDogW10pLFxuICAgIHsgbGFiZWw6ICdEYXJrIG1vZGUnLCB2YWx1ZTogJ2RhcmsnIH0sXG4gICAgeyBsYWJlbDogJ0xpZ2h0IG1vZGUnLCB2YWx1ZTogJ2xpZ2h0JyB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnRGFyayBtb2RlIChjb2xvcmJsaW5kLWZyaWVuZGx5KScsXG4gICAgICB2YWx1ZTogJ2RhcmstZGFsdG9uaXplZCcsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ0xpZ2h0IG1vZGUgKGNvbG9yYmxpbmQtZnJpZW5kbHkpJyxcbiAgICAgIHZhbHVlOiAnbGlnaHQtZGFsdG9uaXplZCcsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ0RhcmsgbW9kZSAoQU5TSSBjb2xvcnMgb25seSknLFxuICAgICAgdmFsdWU6ICdkYXJrLWFuc2knLFxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6ICdMaWdodCBtb2RlIChBTlNJIGNvbG9ycyBvbmx5KScsXG4gICAgICB2YWx1ZTogJ2xpZ2h0LWFuc2knLFxuICAgIH0sXG4gIF1cblxuICBjb25zdCBjb250ZW50ID0gKFxuICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIGdhcD17MX0+XG4gICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBnYXA9ezF9PlxuICAgICAgICB7c2hvd0ludHJvVGV4dCA/IChcbiAgICAgICAgICA8VGV4dD5MZXQmYXBvcztzIGdldCBzdGFydGVkLjwvVGV4dD5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8VGV4dCBib2xkIGNvbG9yPVwicGVybWlzc2lvblwiPlxuICAgICAgICAgICAgVGhlbWVcbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICl9XG4gICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICAgIDxUZXh0IGJvbGQ+XG4gICAgICAgICAgICBDaG9vc2UgdGhlIHRleHQgc3R5bGUgdGhhdCBsb29rcyBiZXN0IHdpdGggeW91ciB0ZXJtaW5hbFxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICB7aGVscFRleHQgJiYgIXNob3dIZWxwVGV4dEJlbG93ICYmIDxUZXh0IGRpbUNvbG9yPntoZWxwVGV4dH08L1RleHQ+fVxuICAgICAgICA8L0JveD5cbiAgICAgICAgPFNlbGVjdFxuICAgICAgICAgIG9wdGlvbnM9e3RoZW1lT3B0aW9uc31cbiAgICAgICAgICBvbkZvY3VzPXtzZXR0aW5nID0+IHtcbiAgICAgICAgICAgIHNldFByZXZpZXdUaGVtZShzZXR0aW5nIGFzIFRoZW1lU2V0dGluZylcbiAgICAgICAgICB9fVxuICAgICAgICAgIG9uQ2hhbmdlPXsoc2V0dGluZzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBzYXZlUHJldmlldygpXG4gICAgICAgICAgICBvblRoZW1lU2VsZWN0KHNldHRpbmcgYXMgVGhlbWVTZXR0aW5nKVxuICAgICAgICAgIH19XG4gICAgICAgICAgb25DYW5jZWw9e1xuICAgICAgICAgICAgc2tpcEV4aXRIYW5kbGluZ1xuICAgICAgICAgICAgICA/ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNhbmNlbFByZXZpZXcoKVxuICAgICAgICAgICAgICAgICAgb25DYW5jZWxQcm9wPy4oKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjYW5jZWxQcmV2aWV3KClcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGdyYWNlZnVsU2h1dGRvd24oMClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZpc2libGVPcHRpb25Db3VudD17dGhlbWVPcHRpb25zLmxlbmd0aH1cbiAgICAgICAgICBkZWZhdWx0VmFsdWU9e3RoZW1lU2V0dGluZ31cbiAgICAgICAgICBkZWZhdWx0Rm9jdXNWYWx1ZT17dGhlbWVTZXR0aW5nfVxuICAgICAgICAvPlxuICAgICAgPC9Cb3g+XG4gICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiB3aWR0aD1cIjEwMCVcIj5cbiAgICAgICAgPEJveFxuICAgICAgICAgIGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIlxuICAgICAgICAgIGJvcmRlclRvcFxuICAgICAgICAgIGJvcmRlckJvdHRvbVxuICAgICAgICAgIGJvcmRlckxlZnQ9e2ZhbHNlfVxuICAgICAgICAgIGJvcmRlclJpZ2h0PXtmYWxzZX1cbiAgICAgICAgICBib3JkZXJTdHlsZT1cImRhc2hlZFwiXG4gICAgICAgICAgYm9yZGVyQ29sb3I9XCJzdWJ0bGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPFN0cnVjdHVyZWREaWZmXG4gICAgICAgICAgICBwYXRjaD17e1xuICAgICAgICAgICAgICBvbGRTdGFydDogMSxcbiAgICAgICAgICAgICAgbmV3U3RhcnQ6IDEsXG4gICAgICAgICAgICAgIG9sZExpbmVzOiAzLFxuICAgICAgICAgICAgICBuZXdMaW5lczogMyxcbiAgICAgICAgICAgICAgbGluZXM6IFtcbiAgICAgICAgICAgICAgICAnIGZ1bmN0aW9uIGdyZWV0KCkgeycsXG4gICAgICAgICAgICAgICAgJy0gIGNvbnNvbGUubG9nKFwiSGVsbG8sIFdvcmxkIVwiKTsnLFxuICAgICAgICAgICAgICAgICcrICBjb25zb2xlLmxvZyhcIkhlbGxvLCBDbGF1ZGUhXCIpOycsXG4gICAgICAgICAgICAgICAgJyB9JyxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBkaW09e2ZhbHNlfVxuICAgICAgICAgICAgZmlsZVBhdGg9XCJkZW1vLmpzXCJcbiAgICAgICAgICAgIGZpcnN0TGluZT17bnVsbH1cbiAgICAgICAgICAgIHdpZHRoPXtjb2x1bW5zfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvQm94PlxuICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICB7JyAnfVxuICAgICAgICAgIHtjb2xvck1vZHVsZVVuYXZhaWxhYmxlUmVhc29uID09PSAnZW52J1xuICAgICAgICAgICAgPyBgU3ludGF4IGhpZ2hsaWdodGluZyBkaXNhYmxlZCAodmlhIENMQVVERV9DT0RFX1NZTlRBWF9ISUdITElHSFQ9JHtwcm9jZXNzLmVudi5DTEFVREVfQ09ERV9TWU5UQVhfSElHSExJR0hUfSlgXG4gICAgICAgICAgICA6IHN5bnRheEhpZ2hsaWdodGluZ0Rpc2FibGVkXG4gICAgICAgICAgICAgID8gYFN5bnRheCBoaWdobGlnaHRpbmcgZGlzYWJsZWQgKCR7c3ludGF4VG9nZ2xlU2hvcnRjdXR9IHRvIGVuYWJsZSlgXG4gICAgICAgICAgICAgIDogc3ludGF4VGhlbWVcbiAgICAgICAgICAgICAgICA/IGBTeW50YXggdGhlbWU6ICR7c3ludGF4VGhlbWUudGhlbWV9JHtzeW50YXhUaGVtZS5zb3VyY2UgPyBgIChmcm9tICR7c3ludGF4VGhlbWUuc291cmNlfSlgIDogJyd9ICgke3N5bnRheFRvZ2dsZVNob3J0Y3V0fSB0byBkaXNhYmxlKWBcbiAgICAgICAgICAgICAgICA6IGBTeW50YXggaGlnaGxpZ2h0aW5nIGVuYWJsZWQgKCR7c3ludGF4VG9nZ2xlU2hvcnRjdXR9IHRvIGRpc2FibGUpYH1cbiAgICAgICAgPC9UZXh0PlxuICAgICAgPC9Cb3g+XG4gICAgPC9Cb3g+XG4gIClcblxuICAvLyBPbmx5IHdyYXAgaW4gYSBib3ggd2hlbiBub3QgaW4gb25ib2FyZGluZ1xuICBpZiAoIXNob3dJbnRyb1RleHQpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPD5cbiAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+e2NvbnRlbnR9PC9Cb3g+XG4gICAgICAgIDxCb3ggbWFyZ2luVG9wPXsxfT5cbiAgICAgICAgICB7c2hvd0hlbHBUZXh0QmVsb3cgJiYgaGVscFRleHQgJiYgKFxuICAgICAgICAgICAgPEJveCBtYXJnaW5MZWZ0PXszfT5cbiAgICAgICAgICAgICAgPFRleHQgZGltQ29sb3I+e2hlbHBUZXh0fTwvVGV4dD5cbiAgICAgICAgICAgIDwvQm94PlxuICAgICAgICAgICl9XG4gICAgICAgICAgeyFoaWRlRXNjVG9DYW5jZWwgJiYgKFxuICAgICAgICAgICAgPEJveD5cbiAgICAgICAgICAgICAgPFRleHQgZGltQ29sb3IgaXRhbGljPlxuICAgICAgICAgICAgICAgIHtleGl0U3RhdGUucGVuZGluZyA/IChcbiAgICAgICAgICAgICAgICAgIDw+UHJlc3Mge2V4aXRTdGF0ZS5rZXlOYW1lfSBhZ2FpbiB0byBleGl0PC8+XG4gICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgIDxCeWxpbmU+XG4gICAgICAgICAgICAgICAgICAgIDxLZXlib2FyZFNob3J0Y3V0SGludCBzaG9ydGN1dD1cIkVudGVyXCIgYWN0aW9uPVwic2VsZWN0XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPEtleWJvYXJkU2hvcnRjdXRIaW50IHNob3J0Y3V0PVwiRXNjXCIgYWN0aW9uPVwiY2FuY2VsXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvQnlsaW5lPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgIDwvQm94PlxuICAgICAgICAgICl9XG4gICAgICAg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