mirror of
http://10.0.2.1:3031/sauer/claude-code.git
synced 2026-06-30 19:26:58 +10:00
401 lines
34 KiB
TypeScript
401 lines
34 KiB
TypeScript
|
|
import { c as _c } from "react/compiler-runtime";
|
||
|
|
import { basename } from 'path';
|
||
|
|
import { toString as qrToString } from 'qrcode';
|
||
|
|
import * as React from 'react';
|
||
|
|
import { useEffect, useState } from 'react';
|
||
|
|
import { getOriginalCwd } from '../bootstrap/state.js';
|
||
|
|
import { buildActiveFooterText, buildIdleFooterText, FAILED_FOOTER_TEXT, getBridgeStatus } from '../bridge/bridgeStatusUtil.js';
|
||
|
|
import { BRIDGE_FAILED_INDICATOR, BRIDGE_READY_INDICATOR } from '../constants/figures.js';
|
||
|
|
import { useRegisterOverlay } from '../context/overlayContext.js';
|
||
|
|
// eslint-disable-next-line custom-rules/prefer-use-keybindings -- raw 'd' key for disconnect, not a configurable keybinding action
|
||
|
|
import { Box, Text, useInput } from '../ink.js';
|
||
|
|
import { useKeybindings } from '../keybindings/useKeybinding.js';
|
||
|
|
import { useAppState, useSetAppState } from '../state/AppState.js';
|
||
|
|
import { saveGlobalConfig } from '../utils/config.js';
|
||
|
|
import { getBranch } from '../utils/git.js';
|
||
|
|
import { Dialog } from './design-system/Dialog.js';
|
||
|
|
type Props = {
|
||
|
|
onDone: () => void;
|
||
|
|
};
|
||
|
|
export function BridgeDialog(t0) {
|
||
|
|
const $ = _c(87);
|
||
|
|
const {
|
||
|
|
onDone
|
||
|
|
} = t0;
|
||
|
|
useRegisterOverlay("bridge-dialog");
|
||
|
|
const connected = useAppState(_temp);
|
||
|
|
const sessionActive = useAppState(_temp2);
|
||
|
|
const reconnecting = useAppState(_temp3);
|
||
|
|
const connectUrl = useAppState(_temp4);
|
||
|
|
const sessionUrl = useAppState(_temp5);
|
||
|
|
const error = useAppState(_temp6);
|
||
|
|
const explicit = useAppState(_temp7);
|
||
|
|
const environmentId = useAppState(_temp8);
|
||
|
|
const sessionId = useAppState(_temp9);
|
||
|
|
const verbose = useAppState(_temp0);
|
||
|
|
const setAppState = useSetAppState();
|
||
|
|
const [showQR, setShowQR] = useState(false);
|
||
|
|
const [qrText, setQrText] = useState("");
|
||
|
|
const [branchName, setBranchName] = useState("");
|
||
|
|
let t1;
|
||
|
|
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
|
||
|
|
t1 = basename(getOriginalCwd());
|
||
|
|
$[0] = t1;
|
||
|
|
} else {
|
||
|
|
t1 = $[0];
|
||
|
|
}
|
||
|
|
const repoName = t1;
|
||
|
|
let t2;
|
||
|
|
let t3;
|
||
|
|
if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
|
||
|
|
t2 = () => {
|
||
|
|
getBranch().then(setBranchName).catch(_temp1);
|
||
|
|
};
|
||
|
|
t3 = [];
|
||
|
|
$[1] = t2;
|
||
|
|
$[2] = t3;
|
||
|
|
} else {
|
||
|
|
t2 = $[1];
|
||
|
|
t3 = $[2];
|
||
|
|
}
|
||
|
|
useEffect(t2, t3);
|
||
|
|
const displayUrl = sessionActive ? sessionUrl : connectUrl;
|
||
|
|
let t4;
|
||
|
|
let t5;
|
||
|
|
if ($[3] !== displayUrl || $[4] !== showQR) {
|
||
|
|
t4 = () => {
|
||
|
|
if (!showQR || !displayUrl) {
|
||
|
|
setQrText("");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
qrToString(displayUrl, {
|
||
|
|
type: "utf8",
|
||
|
|
errorCorrectionLevel: "L",
|
||
|
|
small: true
|
||
|
|
}).then(setQrText).catch(() => setQrText(""));
|
||
|
|
};
|
||
|
|
t5 = [showQR, displayUrl];
|
||
|
|
$[3] = displayUrl;
|
||
|
|
$[4] = showQR;
|
||
|
|
$[5] = t4;
|
||
|
|
$[6] = t5;
|
||
|
|
} else {
|
||
|
|
t4 = $[5];
|
||
|
|
t5 = $[6];
|
||
|
|
}
|
||
|
|
useEffect(t4, t5);
|
||
|
|
let t6;
|
||
|
|
if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
|
||
|
|
t6 = () => {
|
||
|
|
setShowQR(_temp10);
|
||
|
|
};
|
||
|
|
$[7] = t6;
|
||
|
|
} else {
|
||
|
|
t6 = $[7];
|
||
|
|
}
|
||
|
|
let t7;
|
||
|
|
if ($[8] !== onDone) {
|
||
|
|
t7 = {
|
||
|
|
"confirm:yes": onDone,
|
||
|
|
"confirm:toggle": t6
|
||
|
|
};
|
||
|
|
$[8] = onDone;
|
||
|
|
$[9] = t7;
|
||
|
|
} else {
|
||
|
|
t7 = $[9];
|
||
|
|
}
|
||
|
|
let t8;
|
||
|
|
if ($[10] === Symbol.for("react.memo_cache_sentinel")) {
|
||
|
|
t8 = {
|
||
|
|
context: "Confirmation"
|
||
|
|
};
|
||
|
|
$[10] = t8;
|
||
|
|
} else {
|
||
|
|
t8 = $[10];
|
||
|
|
}
|
||
|
|
useKeybindings(t7, t8);
|
||
|
|
let t9;
|
||
|
|
if ($[11] !== explicit || $[12] !== onDone || $[13] !== setAppState) {
|
||
|
|
t9 = input => {
|
||
|
|
if (input === "d") {
|
||
|
|
if (explicit) {
|
||
|
|
saveGlobalConfig(_temp11);
|
||
|
|
}
|
||
|
|
setAppState(_temp12);
|
||
|
|
onDone();
|
||
|
|
}
|
||
|
|
};
|
||
|
|
$[11] = explicit;
|
||
|
|
$[12] = onDone;
|
||
|
|
$[13] = setAppState;
|
||
|
|
$[14] = t9;
|
||
|
|
} else {
|
||
|
|
t9 = $[14];
|
||
|
|
}
|
||
|
|
useInput(t9);
|
||
|
|
let t10;
|
||
|
|
if ($[15] !== connected || $[16] !== error || $[17] !== reconnecting || $[18] !== sessionActive) {
|
||
|
|
t10 = getBridgeStatus({
|
||
|
|
error,
|
||
|
|
connected,
|
||
|
|
sessionActive,
|
||
|
|
reconnecting
|
||
|
|
});
|
||
|
|
$[15] = connected;
|
||
|
|
$[16] = error;
|
||
|
|
$[17] = reconnecting;
|
||
|
|
$[18] = sessionActive;
|
||
|
|
$[19] = t10;
|
||
|
|
} else {
|
||
|
|
t10 = $[19];
|
||
|
|
}
|
||
|
|
const {
|
||
|
|
label: statusLabel,
|
||
|
|
color: statusColor
|
||
|
|
} = t10;
|
||
|
|
const indicator = error ? BRIDGE_FAILED_INDICATOR : BRIDGE_READY_INDICATOR;
|
||
|
|
let T0;
|
||
|
|
let T1;
|
||
|
|
let footerText;
|
||
|
|
let t11;
|
||
|
|
let t12;
|
||
|
|
let t13;
|
||
|
|
let t14;
|
||
|
|
let t15;
|
||
|
|
let t16;
|
||
|
|
let t17;
|
||
|
|
if ($[20] !== branchName || $[21] !== displayUrl || $[22] !== environmentId || $[23] !== error || $[24] !== indicator || $[25] !== onDone || $[26] !== qrText || $[27] !== sessionActive || $[28] !== sessionId || $[29] !== showQR || $[30] !== statusColor || $[31] !== statusLabel || $[32] !== verbose) {
|
||
|
|
const qrLines = qrText ? qrText.split("\n").filter(_temp13) : [];
|
||
|
|
let contextParts;
|
||
|
|
if ($[43] !== branchName) {
|
||
|
|
contextParts = [];
|
||
|
|
if (repoName) {
|
||
|
|
contextParts.push(repoName);
|
||
|
|
}
|
||
|
|
if (branchName) {
|
||
|
|
contextParts.push(branchName);
|
||
|
|
}
|
||
|
|
$[43] = branchName;
|
||
|
|
$[44] = contextParts;
|
||
|
|
} else {
|
||
|
|
contextParts = $[44];
|
||
|
|
}
|
||
|
|
const contextSuffix = contextParts.length > 0 ? " \xB7 " + contextParts.join(" \xB7 ") : "";
|
||
|
|
let t18;
|
||
|
|
if ($[45] !== displayUrl || $[46] !== error || $[47] !== sessionActive) {
|
||
|
|
t18 = error ? FAILED_FOOTER_TEXT : displayUrl ? sessionActive ? buildActiveFooterText(displayUrl) : buildIdleFooterText(displayUrl) : undefined;
|
||
|
|
$[45] = displayUrl;
|
||
|
|
$[46] = error;
|
||
|
|
$[47] = sessionActive;
|
||
|
|
$[48] = t18;
|
||
|
|
} else {
|
||
|
|
t18 = $[48];
|
||
|
|
}
|
||
|
|
footerText = t18;
|
||
|
|
T1 = Dialog;
|
||
|
|
t15 = "Remote Control";
|
||
|
|
t16 = onDone;
|
||
|
|
t17 = true;
|
||
|
|
T0 = Box;
|
||
|
|
t11 = "column";
|
||
|
|
t12 = 1;
|
||
|
|
let t19;
|
||
|
|
if ($[49] !== indicator || $[50] !== statusColor || $[51] !== statusLabel) {
|
||
|
|
t19 = <Text color={statusColor}>{indicator} {statusLabel}</Text>;
|
||
|
|
$[49] = indicator;
|
||
|
|
$[50] = statusColor;
|
||
|
|
$[51] = statusLabel;
|
||
|
|
$[52] = t19;
|
||
|
|
} else {
|
||
|
|
t19 = $[52];
|
||
|
|
}
|
||
|
|
let t20;
|
||
|
|
if ($[53] !== contextSuffix) {
|
||
|
|
t20 = <Text dimColor={true}>{contextSuffix}</Text>;
|
||
|
|
$[53] = contextSuffix;
|
||
|
|
$[54] = t20;
|
||
|
|
} else {
|
||
|
|
t20 = $[54];
|
||
|
|
}
|
||
|
|
let t21;
|
||
|
|
if ($[55] !== t19 || $[56] !== t20) {
|
||
|
|
t21 = <Text>{t19}{t20}</Text>;
|
||
|
|
$[55] = t19;
|
||
|
|
$[56] = t20;
|
||
|
|
$[57] = t21;
|
||
|
|
} else {
|
||
|
|
t21 = $[57];
|
||
|
|
}
|
||
|
|
let t22;
|
||
|
|
if ($[58] !== error) {
|
||
|
|
t22 = error && <Text color="error">{error}</Text>;
|
||
|
|
$[58] = error;
|
||
|
|
$[59] = t22;
|
||
|
|
} else {
|
||
|
|
t22 = $[59];
|
||
|
|
}
|
||
|
|
let t23;
|
||
|
|
if ($[60] !== environmentId || $[61] !== verbose) {
|
||
|
|
t23 = verbose && environmentId && <Text dimColor={true}>Environment: {environmentId}</Text>;
|
||
|
|
$[60] = environmentId;
|
||
|
|
$[61] = verbose;
|
||
|
|
$[62] = t23;
|
||
|
|
} else {
|
||
|
|
t23 = $[62];
|
||
|
|
}
|
||
|
|
let t24;
|
||
|
|
if ($[63] !== sessionId || $[64] !== verbose) {
|
||
|
|
t24 = verbose && sessionId && <Text dimColor={true}>Session: {sessionId}</Text>;
|
||
|
|
$[63] = sessionId;
|
||
|
|
$[64] = verbose;
|
||
|
|
$[65] = t24;
|
||
|
|
} else {
|
||
|
|
t24 = $[65];
|
||
|
|
}
|
||
|
|
if ($[66] !== t21 || $[67] !== t22 || $[68] !== t23 || $[69] !== t24) {
|
||
|
|
t13 = <Box flexDirection="column">{t21}{t22}{t23}{t24}</Box>;
|
||
|
|
$[66] = t21;
|
||
|
|
$[67] = t22;
|
||
|
|
$[68] = t23;
|
||
|
|
$[69] = t24;
|
||
|
|
$[70] = t13;
|
||
|
|
} else {
|
||
|
|
t13 = $[70];
|
||
|
|
}
|
||
|
|
t14 = showQR && qrLines.length > 0 && <Box flexDirection="column">{qrLines.map(_temp14)}</Box>;
|
||
|
|
$[20] = branchName;
|
||
|
|
$[21] = displayUrl;
|
||
|
|
$[22] = environmentId;
|
||
|
|
$[23] = error;
|
||
|
|
$[24] = indicator;
|
||
|
|
$[25] = onDone;
|
||
|
|
$[26] = qrText;
|
||
|
|
$[27] = sessionActive;
|
||
|
|
$[28] = sessionId;
|
||
|
|
$[29] = showQR;
|
||
|
|
$[30] = statusColor;
|
||
|
|
$[31] = statusLabel;
|
||
|
|
$[32] = verbose;
|
||
|
|
$[33] = T0;
|
||
|
|
$[34] = T1;
|
||
|
|
$[35] = footerText;
|
||
|
|
$[36] = t11;
|
||
|
|
$[37] = t12;
|
||
|
|
$[38] = t13;
|
||
|
|
$[39] = t14;
|
||
|
|
$[40] = t15;
|
||
|
|
$[41] = t16;
|
||
|
|
$[42] = t17;
|
||
|
|
} else {
|
||
|
|
T0 = $[33];
|
||
|
|
T1 = $[34];
|
||
|
|
footerText = $[35];
|
||
|
|
t11 = $[36];
|
||
|
|
t12 = $[37];
|
||
|
|
t13 = $[38];
|
||
|
|
t14 = $[39];
|
||
|
|
t15 = $[40];
|
||
|
|
t16 = $[41];
|
||
|
|
t17 = $[42];
|
||
|
|
}
|
||
|
|
let t18;
|
||
|
|
if ($[71] !== footerText) {
|
||
|
|
t18 = footerText && <Text dimColor={true}>{footerText}</Text>;
|
||
|
|
$[71] = footerText;
|
||
|
|
$[72] = t18;
|
||
|
|
} else {
|
||
|
|
t18 = $[72];
|
||
|
|
}
|
||
|
|
let t19;
|
||
|
|
if ($[73] === Symbol.for("react.memo_cache_sentinel")) {
|
||
|
|
t19 = <Text dimColor={true}>d to disconnect · space for QR code · Enter/Esc to close</Text>;
|
||
|
|
$[73] = t19;
|
||
|
|
} else {
|
||
|
|
t19 = $[73];
|
||
|
|
}
|
||
|
|
let t20;
|
||
|
|
if ($[74] !== T0 || $[75] !== t11 || $[76] !== t12 || $[77] !== t13 || $[78] !== t14 || $[79] !== t18) {
|
||
|
|
t20 = <T0 flexDirection={t11} gap={t12}>{t13}{t14}{t18}{t19}</T0>;
|
||
|
|
$[74] = T0;
|
||
|
|
$[75] = t11;
|
||
|
|
$[76] = t12;
|
||
|
|
$[77] = t13;
|
||
|
|
$[78] = t14;
|
||
|
|
$[79] = t18;
|
||
|
|
$[80] = t20;
|
||
|
|
} else {
|
||
|
|
t20 = $[80];
|
||
|
|
}
|
||
|
|
let t21;
|
||
|
|
if ($[81] !== T1 || $[82] !== t15 || $[83] !== t16 || $[84] !== t17 || $[85] !== t20) {
|
||
|
|
t21 = <T1 title={t15} onCancel={t16} hideInputGuide={t17}>{t20}</T1>;
|
||
|
|
$[81] = T1;
|
||
|
|
$[82] = t15;
|
||
|
|
$[83] = t16;
|
||
|
|
$[84] = t17;
|
||
|
|
$[85] = t20;
|
||
|
|
$[86] = t21;
|
||
|
|
} else {
|
||
|
|
t21 = $[86];
|
||
|
|
}
|
||
|
|
return t21;
|
||
|
|
}
|
||
|
|
function _temp14(line, i) {
|
||
|
|
return <Text key={i}>{line}</Text>;
|
||
|
|
}
|
||
|
|
function _temp13(l) {
|
||
|
|
return l.length > 0;
|
||
|
|
}
|
||
|
|
function _temp12(prev_0) {
|
||
|
|
if (!prev_0.replBridgeEnabled) {
|
||
|
|
return prev_0;
|
||
|
|
}
|
||
|
|
return {
|
||
|
|
...prev_0,
|
||
|
|
replBridgeEnabled: false
|
||
|
|
};
|
||
|
|
}
|
||
|
|
function _temp11(current) {
|
||
|
|
if (current.remoteControlAtStartup === false) {
|
||
|
|
return current;
|
||
|
|
}
|
||
|
|
return {
|
||
|
|
...current,
|
||
|
|
remoteControlAtStartup: false
|
||
|
|
};
|
||
|
|
}
|
||
|
|
function _temp10(prev) {
|
||
|
|
return !prev;
|
||
|
|
}
|
||
|
|
function _temp1() {}
|
||
|
|
function _temp0(s_8) {
|
||
|
|
return s_8.verbose;
|
||
|
|
}
|
||
|
|
function _temp9(s_7) {
|
||
|
|
return s_7.replBridgeSessionId;
|
||
|
|
}
|
||
|
|
function _temp8(s_6) {
|
||
|
|
return s_6.replBridgeEnvironmentId;
|
||
|
|
}
|
||
|
|
function _temp7(s_5) {
|
||
|
|
return s_5.replBridgeExplicit;
|
||
|
|
}
|
||
|
|
function _temp6(s_4) {
|
||
|
|
return s_4.replBridgeError;
|
||
|
|
}
|
||
|
|
function _temp5(s_3) {
|
||
|
|
return s_3.replBridgeSessionUrl;
|
||
|
|
}
|
||
|
|
function _temp4(s_2) {
|
||
|
|
return s_2.replBridgeConnectUrl;
|
||
|
|
}
|
||
|
|
function _temp3(s_1) {
|
||
|
|
return s_1.replBridgeReconnecting;
|
||
|
|
}
|
||
|
|
function _temp2(s_0) {
|
||
|
|
return s_0.replBridgeSessionActive;
|
||
|
|
}
|
||
|
|
function _temp(s) {
|
||
|
|
return s.replBridgeConnected;
|
||
|
|
}
|
||
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJiYXNlbmFtZSIsInRvU3RyaW5nIiwicXJUb1N0cmluZyIsIlJlYWN0IiwidXNlRWZmZWN0IiwidXNlU3RhdGUiLCJnZXRPcmlnaW5hbEN3ZCIsImJ1aWxkQWN0aXZlRm9vdGVyVGV4dCIsImJ1aWxkSWRsZUZvb3RlclRleHQiLCJGQUlMRURfRk9PVEVSX1RFWFQiLCJnZXRCcmlkZ2VTdGF0dXMiLCJCUklER0VfRkFJTEVEX0lORElDQVRPUiIsIkJSSURHRV9SRUFEWV9JTkRJQ0FUT1IiLCJ1c2VSZWdpc3Rlck92ZXJsYXkiLCJCb3giLCJUZXh0IiwidXNlSW5wdXQiLCJ1c2VLZXliaW5kaW5ncyIsInVzZUFwcFN0YXRlIiwidXNlU2V0QXBwU3RhdGUiLCJzYXZlR2xvYmFsQ29uZmlnIiwiZ2V0QnJhbmNoIiwiRGlhbG9nIiwiUHJvcHMiLCJvbkRvbmUiLCJCcmlkZ2VEaWFsb2ciLCJ0MCIsIiQiLCJfYyIsImNvbm5lY3RlZCIsIl90ZW1wIiwic2Vzc2lvbkFjdGl2ZSIsIl90ZW1wMiIsInJlY29ubmVjdGluZyIsIl90ZW1wMyIsImNvbm5lY3RVcmwiLCJfdGVtcDQiLCJzZXNzaW9uVXJsIiwiX3RlbXA1IiwiZXJyb3IiLCJfdGVtcDYiLCJleHBsaWNpdCIsIl90ZW1wNyIsImVudmlyb25tZW50SWQiLCJfdGVtcDgiLCJzZXNzaW9uSWQiLCJfdGVtcDkiLCJ2ZXJib3NlIiwiX3RlbXAwIiwic2V0QXBwU3RhdGUiLCJzaG93UVIiLCJzZXRTaG93UVIiLCJxclRleHQiLCJzZXRRclRleHQiLCJicmFuY2hOYW1lIiwic2V0QnJhbmNoTmFtZSIsInQxIiwiU3ltYm9sIiwiZm9yIiwicmVwb05hbWUiLCJ0MiIsInQzIiwidGhlbiIsImNhdGNoIiwiX3RlbXAxIiwiZGlzcGxheVVybCIsInQ0IiwidDUiLCJ0eXBlIiwiZXJyb3JDb3JyZWN0aW9uTGV2ZWwiLCJzbWFsbCIsInQ2IiwiX3RlbXAxMCIsInQ3IiwidDgiLCJjb250ZXh0IiwidDkiLCJpbnB1dCIsIl90ZW1wMTEiLCJfdGVtcDEyIiwidDEwIiwibGFiZWwiLCJzdGF0dXNMYWJlbCIsImNvbG9yIiwic3RhdHVzQ29sb3IiLCJpbmRpY2F0b3IiLCJUMCIsIlQxIiwiZm9vdGVyVGV4dCIsInQxMSIsInQxMiIsInQxMyIsInQxNCIsInQxNSIsInQxNiIsInQxNyIsInFyTGluZXMiLCJzcGxpdCIsImZpbHRlciIsIl90ZW1wMTMiLCJjb250ZXh0UGFydHMiLCJwdXNoIiwiY29udGV4dFN1ZmZpeCIsImxlbmd0aCIsImpvaW4iLCJ0MTgiLCJ1bmRlZmluZWQiLCJ0MTkiLCJ0MjAiLCJ0MjEiLCJ0MjIiLCJ0MjMiLCJ0MjQiLCJtYXAiLCJfdGVtcDE0IiwibGluZSIsImkiLCJsIiwicHJldl8wIiwicHJldiIsInJlcGxCcmlkZ2VFbmFibGVkIiwiY3VycmVudCIsInJlbW90ZUNvbnRyb2xBdFN0YXJ0dXAiLCJzXzgiLCJzIiwic183IiwicmVwbEJyaWRnZVNlc3Npb25JZCIsInNfNiIsInJlcGxCcmlkZ2VFbnZpcm9ubWVudElkIiwic181IiwicmVwbEJyaWRnZUV4cGxpY2l0Iiwic180IiwicmVwbEJyaWRnZUVycm9yIiwic18zIiwicmVwbEJyaWRnZVNlc3Npb25VcmwiLCJzXzIiLCJyZXBsQnJpZGdlQ29ubmVjdFVybCIsInNfMSIsInJlcGxCcmlkZ2VSZWNvbm5lY3RpbmciLCJzXzAiLCJyZXBsQnJpZGdlU2Vzc2lvbkFjdGl2ZSIsInJlcGxCcmlkZ2VDb25uZWN0ZWQiXSwic291cmNlcyI6WyJCcmlkZ2VEaWFsb2cudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJhc2VuYW1lIH0gZnJvbSAncGF0aCdcbmltcG9ydCB7IHRvU3RyaW5nIGFzIHFyVG9TdHJpbmcgfSBmcm9tICdxcmNvZGUnXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGdldE9yaWdpbmFsQ3dkIH0gZnJvbSAnLi4vYm9vdHN0cmFwL3N0YXRlLmpzJ1xuaW1wb3J0IHtcbiAgYnVpbGRBY3RpdmVGb290ZXJUZXh0LFxuICBidWlsZElkbGVGb290ZXJUZXh0LFxuICBGQUlMRURfRk9PVEVSX1RFWFQsXG4gIGdldEJyaWRnZVN0YXR1cyxcbn0gZnJvbSAnLi4vYnJpZGdlL2JyaWRnZVN0YXR1c1V0aWwuanMnXG5pbXBvcnQge1xuICBCUklER0VfRkFJTEVEX0lORElDQVRPUixcbiAgQlJJREdFX1JFQURZX0lORElDQVRPUixcbn0gZnJvbSAnLi4vY29uc3RhbnRzL2ZpZ3VyZXMuanMnXG5pbXBvcnQgeyB1c2VSZWdpc3Rlck92ZXJsYXkgfSBmcm9tICcuLi9jb250ZXh0L292ZXJsYXlDb250ZXh0LmpzJ1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGN1c3RvbS1ydWxlcy9wcmVmZXItdXNlLWtleWJpbmRpbmdzIC0tIHJhdyAnZCcga2V5IGZvciBkaXNjb25uZWN0LCBub3QgYSBjb25maWd1cmFibGUga2V5YmluZGluZyBhY3Rpb25cbmltcG9ydCB7IEJveCwgVGV4dCwgdXNlSW5wdXQgfSBmcm9tICcuLi9pbmsuanMnXG5pbXBvcnQgeyB1c2VLZXliaW5kaW5ncyB9IGZyb20gJy4uL2tleWJpbmRpbmdzL3VzZUtleWJpbmRpbmcuanMnXG5pbXBvcnQgeyB1c2VBcHBTdGF0ZSwgdXNlU2V0QXBwU3RhdGUgfSBmcm9tICcuLi9zdGF0ZS9BcHBTdGF0ZS5qcydcbmltcG9ydCB7IHNhdmVHbG9iYWxDb25maWcgfSBmcm9tICcuLi91dGlscy9jb25maWcuanMnXG5pbXBvcnQgeyBnZXRCcmFuY2ggfSBmcm9tICcuLi91dGlscy9naXQuanMnXG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tICcuL2Rlc2lnbi1zeXN0ZW0vRGlhbG9nLmpzJ1xuXG50eXBlIFByb3BzID0ge1xuICBvbkRvbmU6ICgpID0+IHZvaWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEJyaWRnZURpYWxvZyh7IG9uRG9uZSB9OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIHVzZVJlZ2lzdGVyT3ZlcmxheSgnYnJpZGdlLWRpYWxvZycpXG5cbiAgY29uc3QgY29ubmVjdGVkID0gdXNlQXBwU3RhdGUocyA9PiBzLnJlcGxCcmlkZ2VDb25uZWN0ZWQpXG4gIGNvbnN0IHNlc3Npb25BY3RpdmUgPSB1c2VBcHBTdGF0ZShzID0+IHMucmVwbEJyaWRnZVNlc3Npb25BY3RpdmUpXG4gIGNvbnN0IHJlY29ubmVjdGluZyA9IHVzZUFwcFN0YXRlKHMgPT4gcy5yZXBsQnJpZGdlUmVjb25uZWN0aW5nKVxuICBjb25zdCBjb25uZWN0VXJsID0gdXNlQXBwU3RhdGUocyA9PiBzLnJlcGxCcmlkZ2VDb25uZWN0VXJsKVxuICBjb25zdCBzZXNzaW9
|