π File detail
components/skills/SkillsMenu.tsx
π― Use case
This file lives under βcomponents/β, which covers shared React UI pieces. On the API surface it exposes SkillsMenu β mainly types, interfaces, or factory objects. Dependencies touch React UI and lodash-es. It composes internal code from commands, ink, skills, utils, and ConfigurableShortcutHint (relative imports).
Generated from folder role, exports, dependency roots, and inline comments β not hand-reviewed for every path.
π§ Inline summary
import { c as _c } from "react/compiler-runtime"; import capitalize from 'lodash-es/capitalize.js'; import * as React from 'react'; import { useMemo } from 'react'; import { type Command, type CommandBase, type CommandResultDisplay, getCommandName, type PromptCommand } from '../../commands.js';
π€ Exports (heuristic)
SkillsMenu
π External import roots
Package roots from from "β¦" (relative paths omitted).
reactlodash-es
π₯οΈ Source preview
import { c as _c } from "react/compiler-runtime";
import capitalize from 'lodash-es/capitalize.js';
import * as React from 'react';
import { useMemo } from 'react';
import { type Command, type CommandBase, type CommandResultDisplay, getCommandName, type PromptCommand } from '../../commands.js';
import { Box, Text } from '../../ink.js';
import { estimateSkillFrontmatterTokens, getSkillsPath } from '../../skills/loadSkillsDir.js';
import { getDisplayPath } from '../../utils/file.js';
import { formatTokens } from '../../utils/format.js';
import { getSettingSourceName, type SettingSource } from '../../utils/settings/constants.js';
import { plural } from '../../utils/stringUtils.js';
import { ConfigurableShortcutHint } from '../ConfigurableShortcutHint.js';
import { Dialog } from '../design-system/Dialog.js';
// Skills are always PromptCommands with CommandBase properties
type SkillCommand = CommandBase & PromptCommand;
type SkillSource = SettingSource | 'plugin' | 'mcp';
type Props = {
onExit: (result?: string, options?: {
display?: CommandResultDisplay;
}) => void;
commands: Command[];
};
function getSourceTitle(source: SkillSource): string {
if (source === 'plugin') {
return 'Plugin skills';
}
if (source === 'mcp') {
return 'MCP skills';
}
return `${capitalize(getSettingSourceName(source))} skills`;
}
function getSourceSubtitle(source: SkillSource, skills: SkillCommand[]): string | undefined {
// MCP skills show server names; file-based skills show filesystem paths.
// Skill names are `<server>:<skill>`, not `mcp__<server>__β¦`.
if (source === 'mcp') {
const servers = [...new Set(skills.map(s => {
const idx = s.name.indexOf(':');
return idx > 0 ? s.name.slice(0, idx) : null;
}).filter((n): n is string => n != null))];
return servers.length > 0 ? servers.join(', ') : undefined;
}
const skillsPath = getDisplayPath(getSkillsPath(source, 'skills'));
const hasCommandsSkills = skills.some(s => s.loadedFrom === 'commands_DEPRECATED');
return hasCommandsSkills ? `${skillsPath}, ${getDisplayPath(getSkillsPath(source, 'commands'))}` : skillsPath;
}
export function SkillsMenu(t0) {
const $ = _c(35);
const {
onExit,
commands
} = t0;
let t1;
if ($[0] !== commands) {
t1 = commands.filter(_temp);
$[0] = commands;
$[1] = t1;
} else {
t1 = $[1];
}
const skills = t1;
let groups;
if ($[2] !== skills) {
groups = {
policySettings: [],
userSettings: [],
projectSettings: [],
localSettings: [],
flagSettings: [],
plugin: [],
mcp: []
};
for (const skill of skills) {
const source = skill.source as SkillSource;
if (source in groups) {
groups[source].push(skill);
}
}
for (const group of Object.values(groups)) {
group.sort(_temp2);
}
$[2] = skills;
$[3] = groups;
} else {
groups = $[3];
}
const skillsBySource = groups;
let t2;
if ($[4] !== onExit) {
t2 = () => {
onExit("Skills dialog dismissed", {
display: "system"
});
};
$[4] = onExit;
$[5] = t2;
} else {
t2 = $[5];
}
const handleCancel = t2;
if (skills.length === 0) {
let t3;
if ($[6] === Symbol.for("react.memo_cache_sentinel")) {
t3 = <Text dimColor={true}>Create skills in .claude/skills/ or ~/.claude/skills/</Text>;
$[6] = t3;
} else {
t3 = $[6];
}
let t4;
if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
t4 = <Text dimColor={true} italic={true}><ConfigurableShortcutHint action="confirm:no" context="Confirmation" fallback="Esc" description="close" /></Text>;
$[7] = t4;
} else {
t4 = $[7];
}
let t5;
if ($[8] !== handleCancel) {
t5 = <Dialog title="Skills" subtitle="No skills found" onCancel={handleCancel} hideInputGuide={true}>{t3}{t4}</Dialog>;
$[8] = handleCancel;
$[9] = t5;
} else {
t5 = $[9];
}
return t5;
}
const renderSkill = _temp3;
let t3;
if ($[10] !== skillsBySource) {
t3 = source_0 => {
const groupSkills = skillsBySource[source_0];
if (groupSkills.length === 0) {
return null;
}
const title = getSourceTitle(source_0);
const subtitle = getSourceSubtitle(source_0, groupSkills);
return <Box flexDirection="column" key={source_0}><Box><Text bold={true} dimColor={true}>{title}</Text>{subtitle && <Text dimColor={true}> ({subtitle})</Text>}</Box>{groupSkills.map(skill_1 => renderSkill(skill_1))}</Box>;
};
$[10] = skillsBySource;
$[11] = t3;
} else {
t3 = $[11];
}
const renderSkillGroup = t3;
const t4 = skills.length;
let t5;
if ($[12] !== skills.length) {
t5 = plural(skills.length, "skill");
$[12] = skills.length;
$[13] = t5;
} else {
t5 = $[13];
}
const t6 = `${t4} ${t5}`;
let t7;
if ($[14] !== renderSkillGroup) {
t7 = renderSkillGroup("projectSettings");
$[14] = renderSkillGroup;
$[15] = t7;
} else {
t7 = $[15];
}
let t8;
if ($[16] !== renderSkillGroup) {
t8 = renderSkillGroup("userSettings");
$[16] = renderSkillGroup;
$[17] = t8;
} else {
t8 = $[17];
}
let t9;
if ($[18] !== renderSkillGroup) {
t9 = renderSkillGroup("policySettings");
$[18] = renderSkillGroup;
$[19] = t9;
} else {
t9 = $[19];
}
let t10;
if ($[20] !== renderSkillGroup) {
t10 = renderSkillGroup("plugin");
$[20] = renderSkillGroup;
$[21] = t10;
} else {
t10 = $[21];
}
let t11;
if ($[22] !== renderSkillGroup) {
t11 = renderSkillGroup("mcp");
$[22] = renderSkillGroup;
$[23] = t11;
} else {
t11 = $[23];
}
let t12;
if ($[24] !== t10 || $[25] !== t11 || $[26] !== t7 || $[27] !== t8 || $[28] !== t9) {
t12 = <Box flexDirection="column" gap={1}>{t7}{t8}{t9}{t10}{t11}</Box>;
$[24] = t10;
$[25] = t11;
$[26] = t7;
$[27] = t8;
$[28] = t9;
$[29] = t12;
} else {
t12 = $[29];
}
let t13;
if ($[30] === Symbol.for("react.memo_cache_sentinel")) {
t13 = <Text dimColor={true} italic={true}><ConfigurableShortcutHint action="confirm:no" context="Confirmation" fallback="Esc" description="close" /></Text>;
$[30] = t13;
} else {
t13 = $[30];
}
let t14;
if ($[31] !== handleCancel || $[32] !== t12 || $[33] !== t6) {
t14 = <Dialog title="Skills" subtitle={t6} onCancel={handleCancel} hideInputGuide={true}>{t12}{t13}</Dialog>;
$[31] = handleCancel;
$[32] = t12;
$[33] = t6;
$[34] = t14;
} else {
t14 = $[34];
}
return t14;
}
function _temp3(skill_0) {
const estimatedTokens = estimateSkillFrontmatterTokens(skill_0);
const tokenDisplay = `~${formatTokens(estimatedTokens)}`;
const pluginName = skill_0.source === "plugin" ? skill_0.pluginInfo?.pluginManifest.name : undefined;
return <Box key={`${skill_0.name}-${skill_0.source}`}><Text>{getCommandName(skill_0)}</Text><Text dimColor={true}>{pluginName ? ` Β· ${pluginName}` : ""} Β· {tokenDisplay} description tokens</Text></Box>;
}
function _temp2(a, b) {
return getCommandName(a).localeCompare(getCommandName(b));
}
function _temp(cmd) {
return cmd.type === "prompt" && (cmd.loadedFrom === "skills" || cmd.loadedFrom === "commands_DEPRECATED" || cmd.loadedFrom === "plugin" || cmd.loadedFrom === "mcp");
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjYXBpdGFsaXplIiwiUmVhY3QiLCJ1c2VNZW1vIiwiQ29tbWFuZCIsIkNvbW1hbmRCYXNlIiwiQ29tbWFuZFJlc3VsdERpc3BsYXkiLCJnZXRDb21tYW5kTmFtZSIsIlByb21wdENvbW1hbmQiLCJCb3giLCJUZXh0IiwiZXN0aW1hdGVTa2lsbEZyb250bWF0dGVyVG9rZW5zIiwiZ2V0U2tpbGxzUGF0aCIsImdldERpc3BsYXlQYXRoIiwiZm9ybWF0VG9rZW5zIiwiZ2V0U2V0dGluZ1NvdXJjZU5hbWUiLCJTZXR0aW5nU291cmNlIiwicGx1cmFsIiwiQ29uZmlndXJhYmxlU2hvcnRjdXRIaW50IiwiRGlhbG9nIiwiU2tpbGxDb21tYW5kIiwiU2tpbGxTb3VyY2UiLCJQcm9wcyIsIm9uRXhpdCIsInJlc3VsdCIsIm9wdGlvbnMiLCJkaXNwbGF5IiwiY29tbWFuZHMiLCJnZXRTb3VyY2VUaXRsZSIsInNvdXJjZSIsImdldFNvdXJjZVN1YnRpdGxlIiwic2tpbGxzIiwic2VydmVycyIsIlNldCIsIm1hcCIsInMiLCJpZHgiLCJuYW1lIiwiaW5kZXhPZiIsInNsaWNlIiwiZmlsdGVyIiwibiIsImxlbmd0aCIsImpvaW4iLCJ1bmRlZmluZWQiLCJza2lsbHNQYXRoIiwiaGFzQ29tbWFuZHNTa2lsbHMiLCJzb21lIiwibG9hZGVkRnJvbSIsIlNraWxsc01lbnUiLCJ0MCIsIiQiLCJfYyIsInQxIiwiX3RlbXAiLCJncm91cHMiLCJwb2xpY3lTZXR0aW5ncyIsInVzZXJTZXR0aW5ncyIsInByb2plY3RTZXR0aW5ncyIsImxvY2FsU2V0dGluZ3MiLCJmbGFnU2V0dGluZ3MiLCJwbHVnaW4iLCJtY3AiLCJza2lsbCIsInB1c2giLCJncm91cCIsIk9iamVjdCIsInZhbHVlcyIsInNvcnQiLCJfdGVtcDIiLCJza2lsbHNCeVNvdXJjZSIsInQyIiwiaGFuZGxlQ2FuY2VsIiwidDMiLCJTeW1ib2wiLCJmb3IiLCJ0NCIsInQ1IiwicmVuZGVyU2tpbGwiLCJfdGVtcDMiLCJzb3VyY2VfMCIsImdyb3VwU2tpbGxzIiwidGl0bGUiLCJzdWJ0aXRsZSIsInNraWxsXzEiLCJyZW5kZXJTa2lsbEdyb3VwIiwidDYiLCJ0NyIsInQ4IiwidDkiLCJ0MTAiLCJ0MTEiLCJ0MTIiLCJ0MTMiLCJ0MTQiLCJza2lsbF8wIiwiZXN0aW1hdGVkVG9rZW5zIiwidG9rZW5EaXNwbGF5IiwicGx1Z2luTmFtZSIsInBsdWdpbkluZm8iLCJwbHVnaW5NYW5pZmVzdCIsImEiLCJiIiwibG9jYWxlQ29tcGFyZSIsImNtZCIsInR5cGUiXSwic291cmNlcyI6WyJTa2lsbHNNZW51LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2FwaXRhbGl6ZSBmcm9tICdsb2Rhc2gtZXMvY2FwaXRhbGl6ZS5qcydcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHtcbiAgdHlwZSBDb21tYW5kLFxuICB0eXBlIENvbW1hbmRCYXNlLFxuICB0eXBlIENvbW1hbmRSZXN1bHREaXNwbGF5LFxuICBnZXRDb21tYW5kTmFtZSxcbiAgdHlwZSBQcm9tcHRDb21tYW5kLFxufSBmcm9tICcuLi8uLi9jb21tYW5kcy5qcydcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7XG4gIGVzdGltYXRlU2tpbGxGcm9udG1hdHRlclRva2VucyxcbiAgZ2V0U2tpbGxzUGF0aCxcbn0gZnJvbSAnLi4vLi4vc2tpbGxzL2xvYWRTa2lsbHNEaXIuanMnXG5pbXBvcnQgeyBnZXREaXNwbGF5UGF0aCB9IGZyb20gJy4uLy4uL3V0aWxzL2ZpbGUuanMnXG5pbXBvcnQgeyBmb3JtYXRUb2tlbnMgfSBmcm9tICcuLi8uLi91dGlscy9mb3JtYXQuanMnXG5pbXBvcnQge1xuICBnZXRTZXR0aW5nU291cmNlTmFtZSxcbiAgdHlwZSBTZXR0aW5nU291cmNlLFxufSBmcm9tICcuLi8uLi91dGlscy9zZXR0aW5ncy9jb25zdGFudHMuanMnXG5pbXBvcnQgeyBwbHVyYWwgfSBmcm9tICcuLi8uLi91dGlscy9zdHJpbmdVdGlscy5qcydcbmltcG9ydCB7IENvbmZpZ3VyYWJsZVNob3J0Y3V0SGludCB9IGZyb20gJy4uL0NvbmZpZ3VyYWJsZVNob3J0Y3V0SGludC5qcydcbmltcG9ydCB7IERpYWxvZyB9IGZyb20gJy4uL2Rlc2lnbi1zeXN0ZW0vRGlhbG9nLmpzJ1xuXG4vLyBTa2lsbHMgYXJlIGFsd2F5cyBQcm9tcHRDb21tYW5kcyB3aXRoIENvbW1hbmRCYXNlIHByb3BlcnRpZXNcbnR5cGUgU2tpbGxDb21tYW5kID0gQ29tbWFuZEJhc2UgJiBQcm9tcHRDb21tYW5kXG5cbnR5cGUgU2tpbGxTb3VyY2UgPSBTZXR0aW5nU291cmNlIHwgJ3BsdWdpbicgfCAnbWNwJ1xuXG50eXBlIFByb3BzID0ge1xuICBvbkV4aXQ6IChcbiAgICByZXN1bHQ/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgZGlzcGxheT86IENvbW1hbmRSZXN1bHREaXNwbGF5IH0sXG4gICkgPT4gdm9pZFxuICBjb21tYW5kczogQ29tbWFuZFtdXG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZVRpdGxlKHNvdXJjZTogU2tpbGxTb3VyY2UpOiBzdHJpbmcge1xuICBpZiAoc291cmNlID09PSAncGx1Z2luJykge1xuICAgIHJldHVybiAnUGx1Z2luIHNraWxscydcbiAgfVxuICBpZiAoc291cmNlID09PSAnbWNwJykge1xuICAgIHJldHVybiAnTUNQIHNraWxscydcbiAgfVxuICByZXR1cm4gYCR7Y2FwaXRhbGl6ZShnZXRTZXR0aW5nU291cmNlTmFtZShzb3VyY2UpKX0gc2tpbGxzYFxufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VTdWJ0aXRsZShcbiAgc291cmNlOiBTa2lsbFNvdXJjZSxcbiAgc2tpbGxzOiBTa2lsbENvbW1hbmRbXSxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIE1DUCBza2lsbHMgc2hvdyBzZXJ2ZXIgbmFtZXM7IGZpbGUtYmFzZWQgc2tpbGxzIHNob3cgZmlsZXN5c3RlbSBwYXRocy5cbiAgLy8gU2tpbGwgbmFtZXMgYXJlIGA8c2VydmVyPjo8c2tpbGw+YCwgbm90IGBtY3BfXzxzZXJ2ZXI+X1/igKZgLlxuICBpZiAoc291cmNlID09PSAnbWNwJykge1xuICAgIGNvbnN0IHNlcnZlcnMgPSBbXG4gICAgICAuLi5uZXcgU2V0KFxuICAgICAgICBza2lsbHNcbiAgICAgICAgICAubWFwKHMgPT4ge1xuICAgICAgICAgICAgY29uc3QgaWR4ID0gcy5uYW1lLmluZGV4T2YoJzonKVxuICAgICAgICAgICAgcmV0dXJuIGlkeCA+IDAgPyBzLm5hbWUuc2xpY2UoMCwgaWR4KSA6IG51bGxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5maWx0ZXIoKG4pOiBuIGlzIHN0cmluZyA9PiBuICE9IG51bGwpLFxuICAgICAgKSxcbiAgICBdXG4gICAgcmV0dXJuIHNlcnZlcnMubGVuZ3RoID4gMCA/IHNlcnZlcnMuam9pbignLCAnKSA6IHVuZGVmaW5lZFxuICB9XG4gIGNvbnN0IHNraWxsc1BhdGggPSBnZXREaXNwbGF5UGF0aChnZXRTa2lsbHNQYXRoKHNvdXJjZSwgJ3NraWxscycpKVxuICBjb25zdCBoYXNDb21tYW5kc1NraWxscyA9IHNraWxscy5zb21lKFxuICAgIHMgPT4gcy5sb2FkZWRGcm9tID09PSAnY29tbWFuZHNfREVQUkVDQVRFRCcsXG4gIClcbiAgcmV0dXJuIGhhc0NvbW1hbmRzU2tpbGxzXG4gICAgPyBgJHtza2lsbHNQYXRofSwgJHtnZXREaXNwbGF5UGF0aChnZXRTa2lsbHNQYXRoKHNvdXJjZSwgJ2NvbW1hbmRzJykpfWBcbiAgICA6IHNraWxsc1BhdGhcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFNraWxsc01lbnUoeyBvbkV4aXQsIGNvbW1hbmRzIH06IFByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgLy8gRmlsdGVyIGNvbW1hbmRzIGZvciBza2lsbHMgYW5kIGNhc3QgdG8gU2tpbGxDb21tYW5kXG4gIGNvbnN0IHNraWxscyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiBjb21tYW5kcy5maWx0ZXIoXG4gICAgICAoY21kKTogY21kIGlzIFNraWxsQ29tbWFuZCA9PlxuICAgICAgICBjbWQudHlwZSA9PT0gJ3Byb21wdCcgJiZcbiAgICAgICAgKGNtZC5sb2FkZWRGcm9tID09PSAnc2tpbGxzJyB8fFxuICAgICAgICAgIGNtZC5sb2FkZWRGcm9tID09PSAnY29tbWFuZHNfREVQUkVDQVRFRCcgfHxcbiAgICAgICAgICBjbWQubG9hZGVkRnJvbSA9PT0gJ3BsdWdpbicgfHxcbiAgICAgICAgICBjbWQubG9hZGVkRnJvbSA9PT0gJ21jcCcpLFxuICAgIClcbiAgfSwgW2NvbW1hbmRzXSlcblxuICBjb25zdCBza2lsbHNCeVNvdXJjZSA9IHVzZU1lbW8oKCk6IFJlY29yZDxTa2lsbFNvdXJjZSwgU2tpbGxDb21tYW5kW10+ID0+IHtcbiAgICBjb25zdCBncm91cHM6IFJlY29yZDxTa2lsbFNvdXJjZSwgU2tpbGxDb21tYW5kW10+ID0ge1xuICAgICAgcG9saWN5U2V0dGluZ3M6IFtdLFxuICAgICAgdXNlclNldHRpbmdzOiBbXSxcbiAgICAgIHByb2plY3RTZXR0aW5nczogW10sXG4gICAgICBsb2NhbFNldHRpbmdzOiBbXSxcbiAgICAgIGZsYWdTZXR0aW5nczogW10sXG4gICAgICBwbHVnaW46IFtdLFxuICAgICAgbWNwOiBbXSxcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNraWxsIG9mIHNraWxscykge1xuICAgICAgY29uc3Qgc291cmNlID0gc2tpbGwuc291cmNlIGFzIFNraWxsU291cmNlXG4gICAgICBpZiAoc291cmNlIGluIGdyb3Vwcykge1xuICAgICAgICBncm91cHNbc291cmNlXS5wdXNoKHNraWxsKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgT2JqZWN0LnZhbHVlcyhncm91cHMpKSB7XG4gICAgICBncm91cC5zb3J0KChhLCBiKSA9PiBnZXRDb21tYW5kTmFtZShhKS5sb2NhbGVDb21wYXJlKGdldENvbW1hbmROYW1lKGIpKSlcbiAgICB9XG5cbiAgICByZXR1cm4gZ3JvdXBzXG4gIH0sIFtza2lsbHNdKVxuXG4gIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpOiB2b2lkID0+IHtcbiAgICBvbkV4aXQoJ1NraWxscyBkaWFsb2cgZGlzbWlzc2VkJywgeyBkaXNwbGF5OiAnc3lzdGVtJyB9KVxuICB9XG5cbiAgaWYgKHNraWxscy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gKFxuICAgICAgPERpYWxvZ1xuICAgICAgICB0aXRsZT1cIlNraWxsc1wiXG4gICAgICAgIHN1YnRpdGxlPVwiTm8gc2tpbGxzIGZvdW5kXCJcbiAgICAgICAgb25DYW5jZWw9e2hhbmRsZUNhbmNlbH1cbiAgICAgICAgaGlkZUlucHV0R3VpZGVcbiAgICAgID5cbiAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgQ3JlYXRlIHNraWxscyBpbiAuY2xhdWRlL3NraWxscy8gb3Igfi8uY2xhdWRlL3NraWxscy9cbiAgICAgICAgPC9UZXh0PlxuICAgICAgICA8VGV4dCBkaW1Db2xvciBpdGFsaWM+XG4gICAgICAgICAgPENvbmZpZ3VyYWJsZVNob3J0Y3V0SGludFxuICAgICAgICAgICAgYWN0aW9uPVwiY29uZmlybTpub1wiXG4gICAgICAgICAgICBjb250ZXh0PVwiQ29uZmlybWF0aW9uXCJcbiAgICAgICAgICAgIGZhbGxiYWNrPVwiRXNjXCJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uPVwiY2xvc2VcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvVGV4dD5cbiAgICAgIDwvRGlhbG9nPlxuICAgIClcbiAgfVxuXG4gIGNvbnN0IHJlbmRlclNraWxsID0gKHNraWxsOiBTa2lsbENvbW1hbmQpID0+IHtcbiAgICBjb25zdCBlc3RpbWF0ZWRUb2tlbnMgPSBlc3RpbWF0ZVNraWxsRnJvbnRtYXR0ZXJUb2tlbnMoc2tpbGwpXG4gICAgY29uc3QgdG9rZW5EaXNwbGF5ID0gYH4ke2Zvcm1hdFRva2Vucyhlc3RpbWF0ZWRUb2tlbnMpfWBcbiAgICBjb25zdCBwbHVnaW5OYW1lID1cbiAgICAgIHNraWxsLnNvdXJjZSA9PT0gJ3BsdWdpbidcbiAgICAgICAgPyBza2lsbC5wbHVnaW5JbmZvPy5wbHVnaW5NYW5pZmVzdC5uYW1lXG4gICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICByZXR1cm4gKFxuICAgICAgPEJveCBrZXk9e2Ake3NraWxsLm5hbWV9LSR7c2tpbGwuc291cmNlfWB9PlxuICAgICAgICA8VGV4dD57Z2V0Q29tbWFuZE5hbWUoc2tpbGwpfTwvVGV4dD5cbiAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAge3BsdWdpbk5hbWUgPyBgIMK3ICR7cGx1Z2luTmFtZX1gIDogJyd9IMK3IHt0b2tlbkRpc3BsYXl9IGRlc2NyaXB0aW9uXG4gICAgICAgICAgdG9rZW5zXG4gICAgICAgIDwvVGV4dD5cbiAgICAgIDwvQm94PlxuICAgIClcbiAgfVxuXG4gIGNvbnN0IHJlbmRlclNraWxsR3JvdXAgPSAoc291cmNlOiBTa2lsbFNvdXJjZSkgPT4ge1xuICAgIGNvbnN0IGdyb3VwU2tpbGxzID0gc2tpbGxzQnlTb3VyY2Vbc291cmNlXVxuICAgIGlmIChncm91cFNraWxscy5sZW5ndGggPT09IDApIHJldHVybiBudWxsXG5cbiAgICBjb25zdCB0aXRsZSA9IGdldFNvdXJjZVRpdGxlKHNvdXJjZSlcbiAgICBjb25zdCBzdWJ0aXRsZSA9IGdldFNvdXJjZVN1YnRpdGxlKHNvdXJjZSwgZ3JvdXBTa2lsbHMpXG5cbiAgICByZXR1cm4gKFxuICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIga2V5PXtzb3VyY2V9PlxuICAgICAgICA8Qm94PlxuICAgICAgICAgIDxUZXh0IGJvbGQgZGltQ29sb3I+XG4gICAgICAgICAgICB7dGl0bGV9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIHtzdWJ0aXRsZSAmJiA8VGV4dCBkaW1Db2xvcj4gKHtzdWJ0aXRsZX0pPC9UZXh0Pn1cbiAgICAgICAgPC9Cb3g+XG4gICAgICAgIHtncm91cFNraWxscy5tYXAoc2tpbGwgPT4gcmVuZGVyU2tpbGwoc2tpbGwpKX1cbiAgICAgIDwvQm94PlxuICAgIClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPERpYWxvZ1xuICAgICAgdGl0bGU9XCJTa2lsbHNcIlxuICAgICAgc3VidGl0bGU9e2Ake3NraWxscy5sZW5ndGh9ICR7cGx1cmFsKHNraWxscy5sZW5ndGgsICdza2lsbCcpfWB9XG4gICAgICBvbkNhbmNlbD17aGFuZGxlQ2FuY2VsfVxuICAgICAgaGlkZUlucHV0R3VpZGVcbiAgICA+XG4gICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBnYXA9ezF9PlxuICAgICAgICB7cmVuZGVyU2tpbGxHcm91cCgncHJvamVjdFNldHRpbmdzJyl9XG4gICAgICAgIHtyZW5kZXJTa2lsbEdyb3VwKCd1c2VyU2V0dGluZ3MnKX1cbiAgICAgICAge3JlbmRlclNraWxsR3JvdXAoJ3BvbGljeVNldHRpbmdzJyl9XG4gICAgICAgIHtyZW5kZXJTa2lsbEdyb3VwKCdwbHVnaW4nKX1cbiAgICAgICAge3JlbmRlclNraWxsR3JvdXAoJ21jcCcpfVxuICAgICAgPC9Cb3g+XG4gICAgICA8VGV4dCBkaW1Db2xvciBpdGFsaWM+XG4gICAgICAgIDxDb25maWd1cmFibGVTaG9ydGN1dEhpbnRcbiAgICAgICAgICBhY3Rpb249XCJjb25maXJtOm5vXCJcbiAgICAgICAgICBjb250ZXh0PVwiQ29uZmlybWF0aW9uXCJcbiAgICAgICAgICBmYWxsYmFjaz1cIkVzY1wiXG4gICAgICAgICAgZGVzY3JpcHRpb249XCJjbG9zZVwiXG4gICAgICAgIC8+XG4gICAgICA8L1RleHQ+XG4gICAgPC9EaWFsb2c+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU9BLFVBQVUsTUFBTSx5QkFBeUI7QUFDaEQsT0FBTyxLQUFLQyxLQUFLLE1BQU0sT0FBTztBQUM5QixTQUFTQyxPQUFPLFFBQVEsT0FBTztBQUMvQixTQUNFLEtBQUtDLE9BQU8sRUFDWixLQUFLQyxXQUFXLEVBQ2hCLEtBQUtDLG9CQUFvQixFQUN6QkMsY0FBYyxFQUNkLEtBQUtDLGFBQWEsUUFDYixtQkFBbUI7QUFDMUIsU0FBU0MsR0FBRyxFQUFFQyxJQUFJLFFBQVEsY0FBYztBQUN4QyxTQUNFQyw4QkFBOEIsRUFDOUJDLGFBQWEsUUFDUiwrQkFBK0I7QUFDdEMsU0FBU0MsY0FBYyxRQUFRLHFCQUFxQjtBQUNwRCxTQUFTQyxZQUFZLFFBQVEsdUJBQXVCO0FBQ3BELFNBQ0VDLG9CQUFvQixFQUNwQixLQUFLQyxhQUFhLFFBQ2IsbUNBQW1DO0FBQzFDLFNBQVNDLE1BQU0sUUFBUSw0QkFBNEI7QUFDbkQsU0FBU0Msd0JBQXdCLFFBQVEsZ0NBQWdDO0FBQ3pFLFNBQVNDLE1BQU0sUUFBUSw0QkFBNEI7O0FBRW5EO0FBQ0EsS0FBS0MsWUFBWSxHQUFHZixXQUFXLEdBQUdHLGFBQWE7QUFFL0MsS0FBS2EsV0FBVyxHQUFHTCxhQUFhLEdBQUcsUUFBUSxHQUFHLEtBQUs7QUFFbkQsS0FBS00sS0FBSyxHQUFHO0VBQ1hDLE1BQU0sRUFBRSxDQUNOQyxNQUFlLENBQVIsRUFBRSxNQUFNLEVBQ2ZDLE9BQTRDLENBQXBDLEVBQUU7SUFBRUMsT0FBTyxDQUFDLEVBQUVwQixvQkFBb0I7RUFBQyxDQUFDLEVBQzVDLEdBQUcsSUFBSTtFQUNUcUIsUUFBUSxFQUFFdkIsT0FBTyxFQUFFO0FBQ3JCLENBQUM7QUFFRCxTQUFTd0IsY0FBY0EsQ0FBQ0MsTUFBTSxFQUFFUixXQUFXLENBQUMsRUFBRSxNQUFNLENBQUM7RUFDbkQsSUFBSVEsTUFBTSxLQUFLLFFBQVEsRUFBRTtJQUN2QixPQUFPLGVBQWU7RUFDeEI7RUFDQSxJQUFJQSxNQUFNLEtBQUssS0FBSyxFQUFFO0lBQ3BCLE9BQU8sWUFBWTtFQUNyQjtFQUNBLE9BQU8sR0FBRzVCLFVBQVUsQ0FBQ2Msb0JBQW9CLENBQUNjLE1BQU0sQ0FBQyxDQUFDLFNBQVM7QUFDN0Q7QUFFQSxTQUFTQyxpQkFBaUJBLENBQ3hCRCxNQUFNLEVBQUVSLFdBQVcsRUFDbkJVLE1BQU0sRUFBRVgsWUFBWSxFQUFFLENBQ3ZCLEVBQUUsTUFBTSxHQUFHLFNBQVMsQ0FBQztFQUNwQjtFQUNBO0VBQ0EsSUFBSVMsTUFBTSxLQUFLLEtBQUssRUFBRTtJQUNwQixNQUFNRyxPQUFPLEdBQUcsQ0FDZCxHQUFHLElBQUlDLEdBQUcsQ0FDUkYsTUFBTSxDQUNIRyxHQUFHLENBQUNDLENBQUMsSUFBSTtNQUNSLE1BQU1DLEdBQUcsR0FBR0QsQ0FBQyxDQUFDRSxJQUFJLENBQUNDLE9BQU8sQ0FBQyxHQUFHLENBQUM7TUFDL0IsT0FBT0YsR0FBRyxHQUFHLENBQUMsR0FBR0QsQ0FBQyxDQUFDRSxJQUFJLENBQUNFLEtBQUssQ0FBQyxDQUFDLEVBQUVILEdBQUcsQ0FBQyxHQUFHLElBQUk7SUFDOUMsQ0FBQyxDQUFDLENBQ0RJLE1BQU0sQ0FBQyxDQUFDQyxDQUFDLENBQUMsRUFBRUEsQ0FBQyxJQUFJLE1BQU0sSUFBSUEsQ0FBQyxJQUFJLElBQUksQ0FDekMsQ0FBQyxDQUNGO0lBQ0QsT0FBT1QsT0FBTyxDQUFDVSxNQUFNLEdBQUcsQ0FBQyxHQUFHVixPQUFPLENBQUNXLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBR0MsU0FBUztFQUM1RDtFQUNBLE1BQU1DLFVBQVUsR0FBR2hDLGNBQWMsQ0FBQ0QsYUFBYSxDQUFDaUIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0VBQ2xFLE1BQU1pQixpQkFBaUIsR0FBR2YsTUFBTSxDQUFDZ0IsSUFBSSxDQUNuQ1osQ0FBQyxJQUFJQSxDQUFDLENBQUNhLFVBQVUsS0FBSyxxQkFDeEIsQ0FBQztFQUNELE9BQU9GLGlCQUFpQixHQUNwQixHQUFHRCxVQUFVLEtBQUtoQyxjQUFjLENBQUNELGFBQWEsQ0FBQ2lCLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQyxFQUFFLEdBQ3JFZ0IsVUFBVTtBQUNoQjtBQUVBLE9BQU8sU0FBQUksV0FBQUMsRUFBQTtFQUFBLE1BQUFDLENBQUEsR0FBQUMsRUFBQTtFQUFvQjtJQUFBN0IsTUFBQTtJQUFBSTtFQUFBLElBQUF1QixFQUEyQjtFQUFBLElBQUFHLEVBQUE7RUFBQSxJQUFBRixDQUFBLFFBQUF4QixRQUFBO0lBRzNDMEIsRUFBQSxHQUFBMUIsUUFBUSxDQUFBYSxNQUFPLENBQ3BCYyxLQU1GLENBQUM7SUFBQUgsQ0FBQSxNQUFBeEIsUUFBQTtJQUFBd0IsQ0FBQSxNQUFBRSxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBRixDQUFBO0VBQUE7RUFSSCxNQUFBcEIsTUFBQSxHQUNFc0IsRUFPQztFQUNXLElBQUFFLE1BQUE7RUFBQSxJQUFBSixDQUFBLFFBQUFwQixNQUFBO0lBR1p3QixNQUFBLEdBQW9EO01BQUFDLGNBQUEsRUFDbEMsRUFBRTtNQUFBQyxZQUFBLEVBQ0osRUFBRTtNQUFBQyxlQUFBLEVBQ0MsRUFBRTtNQUFBQyxhQUFBLEVBQ0osRUFBRTtNQUFBQyxZQUFBLEVBQ0gsRUFBRTtNQUFBQyxNQUFBLEVBQ1IsRUFBRTtNQUFBQyxHQUFBLEVBQ0w7SUFDUCxDQUFDO0lBRUQsS0FBSyxNQUFBQyxLQUFXLElBQUloQyxNQUFNO01BQ3hCLE1BQUFGLE1BQUEsR0FBZWtDLEtBQUssQ0FBQWxDLE1BQU8sSUFBSVIsV0FBVztNQUMxQyxJQUFJUSxNQUFNLElBQUkwQixNQUFNO1FBQ2xCQSxNQUFNLENBQUMxQixNQUFNLENBQUMsQ0FBQW1DLElBQUssQ0FBQ0QsS0FBSyxDQUFDO01BQUE7SUFDM0I7SUFHSCxLQUFLLE1BQUFFLEtBQVcsSUFBSUMsTUFBTSxDQUFBQyxNQUFPLENBQUNaLE1BQU0sQ0FBQztNQUN2Q1UsS0FBSyxDQUFBRyxJQUFLLENBQUNDLE1BQTRELENBQUM7SUFBQTtJQUN6RWxCLENBQUEsTUFBQXBCLE1BQUE7SUFBQW9CLENBQUEsTUFBQUksTUFBQTtFQUFBO0lBQUFBLE1BQUEsR0FBQUosQ0FBQTtFQUFBO0VBcEJILE1BQUFtQixjQUFBLEdBc0JFZixNQUFhO0VBQ0gsSUFBQWdCLEVBQUE7RUFBQSxJQUFBcEIsQ0FBQSxRQUFBNUIsTUFBQTtJQUVTZ0QsRUFBQSxHQUFBQSxDQUFBO01BQ25CaEQsTUFBTSxDQUFDLHlCQUF5QixFQUFFO1FBQUFHLE9BQUEsRUFBVztNQUFTLENBQUMsQ0FBQztJQUFBLENBQ3pEO0lBQUF5QixDQUFBLE1BQUE1QixNQUFBO0lBQUE0QixDQUFBLE1BQUFvQixFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBcEIsQ0FBQTtFQUFBO0VBRkQsTUFBQXFCLFlBQUEsR0FBcUJELEVBRXBCO0VBRUQsSUFBSXhDLE1BQU0sQ0FBQVcsTUFBTyxLQUFLLENBQUM7SUFBQSxJQUFBK0IsRUFBQTtJQUFBLElBQUF0QixDQUFBLFFBQUF1QixNQUFBLENBQUFDLEdBQUE7TUFRakJGLEVBQUEsSUFBQyxJQUFJLENBQUMsUUFBUSxDQUFSLEtBQU8sQ0FBQyxDQUFDLHFEQUVmLEVBRkMsSUFBSSxDQUVFO01BQUF0QixDQUFBLE1BQUFzQixFQUFBO0lBQUE7TUFBQUEsRUFBQSxHQUFBdEIsQ0FBQTtJQUFBO0lBQUEsSUFBQXlCLEVBQUE7SUFBQSxJQUFBekIsQ0FBQSxRQUFBdUIsTUFBQSxDQUFBQyxHQUFBO01BQ1BDLEVBQUEsSUFBQyxJQUFJLENBQUMsUUFBUSxDQUFSLEtBQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBTixLQUFLLENBQUMsQ0FDbkIsQ0FBQyx3QkFBd0IsQ0FDaEIsTUFBWSxDQUFaLFlBQVksQ0FDWCxPQUFjLENBQWQsY0FBYyxDQUNiLFFBQUssQ0FBTCxLQUFLLENBQ0YsV0FBTyxDQUFQLE9BQU8sR0FFdkIsRUFQQyxJQUFJLENBT0U7TUFBQXpCLENBQUEsTUFBQXlCLEVBQUE7SUFBQTtNQUFBQSxFQUFBLEdBQUF6QixDQUFBO0lBQUE7SUFBQSxJQUFBMEIsRUFBQTtJQUFBLElBQUExQixDQUFBLFFBQUFxQixZQUFBO01BaEJUSyxFQUFBLElBQUMsTUFBTSxDQUNDLEtBQVEsQ0FBUixRQUFRLENBQ0wsUUFBaUIsQ0FBakIsaUJBQWlCLENBQ2hCTCxRQUFZLENBQVpBLGFBQVcsQ0FBQyxDQUN0QixjQUFjLENBQWQsS0FBYSxDQUFDLENBRWQsQ0FBQUMsRUFFTSxDQUNOLENBQUFHLEVBT00sQ0FDUixFQWpCQyxNQUFNLENBaUJFO01BQUF6QixDQUFBLE1BQUFxQixZQUFBO01BQUFyQixDQUFBLE1BQUEwQixFQUFBO0lBQUE7TUFBQUEsRUFBQSxHQUFBMUIsQ0FBQTtJQUFBO0lBQUEsT0FqQlQwQixFQWlCUztFQUFBO0VBSWIsTUFBQUMsV0FBQSxHQUFvQkMsTUFpQm5CO0VBQUEsSUFBQU4sRUFBQTtFQUFBLElBQUF0QixDQUFBLFNBQUFtQixjQUFBO0lBRXdCRyxFQUFBLEdBQUFPLFFBQUE7TUFDdkIsTUFBQUMsV0FBQSxHQUFvQlgsY0FBYyxDQUFDekMsUUFBTSxDQUFDO01BQzFDLElBQUlvRCxXQUFXLENBQUF2QyxNQUFPLEtBQUssQ0FBQztRQUFBLE9BQVMsSUFBSTtNQUFBO01BRXpDLE1BQUF3QyxLQUFBLEdBQWN0RCxjQUFjLENBQUNDLFFBQU0sQ0FBQztNQUNwQyxNQUFBc0QsUUFBQSxHQUFpQnJELGlCQUFpQixDQUFDRCxRQUFNLEVBQUVvRCxXQUFXLENBQUM7TUFBQSxPQUdyRCxDQUFDLEdBQUcsQ0FBZSxhQUFRLENBQVIsUUFBUSxDQUFNcEQsR0FBTSxDQUFOQSxTQUFLLENBQUMsQ0FDckMsQ0FBQyxHQUFHLENBQ0YsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFKLEtBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBUixLQUFPLENBQUMsQ0FDaEJxRCxNQUFJLENBQ1AsRUFGQyxJQUFJLENBR0osQ0FBQUMsUUFBK0MsSUFBbkMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFSLEtBQU8sQ0FBQyxDQUFDLEVBQUdBLFNBQU8sQ0FBRSxDQUFDLEVBQTNCLElBQUksQ0FBNkIsQ0FDakQsRUFMQyxHQUFHLENBTUgsQ0FBQUYsV0FBVyxDQUFBL0MsR0FBSSxDQUFDa0QsT0FBQSxJQUFTTixXQUFXLENBQUNmLE9BQUssQ0FBQyxFQUM5QyxFQVJDLEdBQUcsQ0FRRTtJQUFBLENBRVQ7SUFBQVosQ0FBQSxPQUFBbUIsY0FBQTtJQUFBbkIsQ0FBQSxPQUFBc0IsRUFBQTtFQUFBO0lBQUFBLEVBQUEsR0FBQXRCLENBQUE7RUFBQTtFQWxCRCxNQUFBa0MsZ0JBQUEsR0FBeUJaLEVBa0J4QjtFQUtnQixNQUFBRyxFQUFBLEdBQUE3QyxNQUFNLENBQUFXLE1BQU87RUFBQSxJQUFBbUMsRUFBQTtFQUFBLElBQUExQixDQUFBLFNBQUFwQixNQUFBLENBQUFXLE1BQUE7SUFBSW1DLEVBQUEsR0FBQTVELE1BQU0sQ0FBQ2MsTUFBTSxDQUFBVyxNQUFPLEVBQUUsT0FBTyxDQUFDO0lBQUFTLENBQUEsT0FBQXBCLE1BQUEsQ0FBQVcsTUFBQTtJQUFBUyxDQUFBLE9BQUEwQixFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBMUIsQ0FBQTtFQUFBO0VBQWxELE1BQUFtQyxFQUFBLE1BQUdWLEVBQWEsSUFBSUMsRUFBOEIsRUFBRTtFQUFBLElBQUFVLEVBQUE7RUFBQSxJQUFBcEMsQ0FBQSxTQUFBa0MsZ0JBQUE7SUFLM0RFLEVBQUEsR0FBQUYsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUM7SUFBQWxDLENBQUEsT0FBQWtDLGdCQUFBO0lBQUFsQyxDQUFBLE9BQUFvQyxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBcEMsQ0FBQTtFQUFBO0VBQUEsSUFBQXFDLEVBQUE7RUFBQSxJQUFBckMsQ0FBQSxTQUFBa0MsZ0JBQUE7SUFDbkNHLEVBQUEsR0FBQUgsZ0JBQWdCLENBQUMsY0FBYyxDQUFDO0lBQUFsQyxDQUFBLE9BQUFrQyxnQkFBQTtJQUFBbEMsQ0FBQSxPQUFBcUMsRUFBQTtFQUFBO0lBQUFBLEVBQUEsR0FBQXJDLENBQUE7RUFBQTtFQUFBLElBQUFzQyxFQUFBO0VBQUEsSUFBQXRDLENBQUEsU0FBQWtDLGdCQUFBO0lBQ2hDSSxFQUFBLEdBQUFKLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDO0lBQUFsQyxDQUFBLE9BQUFrQyxnQkFBQTtJQUFBbEMsQ0FBQSxPQUFBc0MsRUFBQTtFQUFBO0lBQUFBLEVBQUEsR0FBQXRDLENBQUE7RUFBQTtFQUFBLElBQUF1QyxHQUFBO0VBQUEsSUFBQXZDLENBQUEsU0FBQWtDLGdCQUFBO0lBQ2xDSyxHQUFBLEdBQUFMLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztJQUFBbEMsQ0FBQSxPQUFBa0MsZ0JBQUE7SUFBQWxDLENBQUEsT0FBQXVDLEdBQUE7RUFBQTtJQUFBQSxHQUFBLEdBQUF2QyxDQUFBO0VBQUE7RUFBQSxJQUFBd0MsR0FBQTtFQUFBLElBQUF4QyxDQUFBLFNBQUFrQyxnQkFBQTtJQUMxQk0sR0FBQSxHQUFBTixnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7SUFBQWxDLENBQUEsT0FBQWtDLGdCQUFBO0lBQUFsQyxDQUFBLE9BQUF3QyxHQUFBO0VBQUE7SUFBQUEsR0FBQSxHQUFBeEMsQ0FBQTtFQUFBO0VBQUEsSUFBQXlDLEdBQUE7RUFBQSxJQUFBekMsQ0FBQSxTQUFBdUMsR0FBQSxJQUFBdkMsQ0FBQSxTQUFBd0MsR0FBQSxJQUFBeEMsQ0FBQSxTQUFBb0MsRUFBQSxJQUFBcEMsQ0FBQSxTQUFBcUMsRUFBQSxJQUFBckMsQ0FBQSxTQUFBc0MsRUFBQTtJQUwxQkcsR0FBQSxJQUFDLEdBQUcsQ0FBZSxhQUFRLENBQVIsUUFBUSxDQUFNLEdBQUMsQ0FBRCxHQUFDLENBQy9CLENBQUFMLEVBQWtDLENBQ2xDLENBQUFDLEVBQStCLENBQy9CLENBQUFDLEVBQWlDLENBQ2pDLENBQUFDLEdBQXlCLENBQ3pCLENBQUFDLEdBQXNCLENBQ3pCLEVBTkMsR0FBRyxDQU1FO0lBQUF4QyxDQUFBLE9BQUF1QyxHQUFBO0lBQUF2QyxDQUFBLE9BQUF3QyxHQUFBO0lBQUF4QyxDQUFBLE9BQUFvQyxFQUFBO0lBQUFwQyxDQUFBLE9BQUFxQyxFQUFBO0lBQUFyQyxDQUFBLE9BQUFzQyxFQUFBO0lBQUF0QyxDQUFBLE9BQUF5QyxHQUFBO0VBQUE7SUFBQUEsR0FBQSxHQUFBekMsQ0FBQTtFQUFBO0VBQUEsSUFBQTBDLEdBQUE7RUFBQSxJQUFBMUMsQ0FBQSxTQUFBdUIsTUFBQSxDQUFBQyxHQUFBO0lBQ05rQixHQUFBLElBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBUixLQUFPLENBQUMsQ0FBQyxNQUFNLENBQU4sS0FBSyxDQUFDLENBQ25CLENBQUMsd0JBQXdCLENBQ2hCLE1BQVksQ0FBWixZQUFZLENBQ1gsT0FBYyxDQUFkLGNBQWMsQ0FDYixRQUFLLENBQUwsS0FBSyxDQUNGLFdBQU8sQ0FBUCxPQUFPLEdBRXZCLEVBUEMsSUFBSSxDQU9FO0lBQUExQyxDQUFBLE9BQUEwQyxHQUFBO0VBQUE7SUFBQUEsR0FBQSxHQUFBMUMsQ0FBQTtFQUFBO0VBQUEsSUFBQTJDLEdBQUE7RUFBQSxJQUFBM0MsQ0FBQSxTQUFBcUIsWUFBQSxJQUFBckIsQ0FBQSxTQUFBeUMsR0FBQSxJQUFBekMsQ0FBQSxTQUFBbUMsRUFBQTtJQXBCVFEsR0FBQSxJQUFDLE1BQU0sQ0FDQyxLQUFRLENBQVIsUUFBUSxDQUNKLFFBQW9ELENBQXBELENBQUFSLEVBQW1ELENBQUMsQ0FDcERkLFFBQVksQ0FBWkEsYUFBVyxDQUFDLENBQ3RCLGNBQWMsQ0FBZCxLQUFhLENBQUMsQ0FFZCxDQUFBb0IsR0FNSyxDQUNMLENBQUFDLEdBT00sQ0FDUixFQXJCQyxNQUFNLENBcUJFO0lBQUExQyxDQUFBLE9BQUFxQixZQUFBO0lBQUFyQixDQUFBLE9BQUF5QyxHQUFBO0lBQUF6QyxDQUFBLE9BQUFtQyxFQUFBO0lBQUFuQyxDQUFBLE9BQUEyQyxHQUFBO0VBQUE7SUFBQUEsR0FBQSxHQUFBM0MsQ0FBQTtFQUFBO0VBQUEsT0FyQlQyQyxHQXFCUztBQUFBO0FBOUhOLFNBQUFmLE9BQUFnQixPQUFBO0VBa0VILE1BQUFDLGVBQUEsR0FBd0JyRiw4QkFBOEIsQ0FBQ29ELE9BQUssQ0FBQztFQUM3RCxNQUFBa0MsWUFBQSxHQUFxQixJQUFJbkYsWUFBWSxDQUFDa0YsZUFBZSxDQUFDLEVBQUU7RUFDeEQsTUFBQUUsVUFBQSxHQUNFbkMsT0FBSyxDQUFBbEMsTUFBTyxLQUFLLFFBRUosR0FEVGtDLE9BQUssQ0FBQW9DLFVBQTJCLEVBQUFDLGNBQUssQ0FBQS9ELElBQzVCLEdBRmJPLFNBRWE7RUFBQSxPQUdiLENBQUMsR0FBRyxDQUFNLEdBQStCLENBQS9CLElBQUdtQixPQUFLLENBQUExQixJQUFLLElBQUkwQixPQUFLLENBQUFsQyxNQUFPLEVBQUMsQ0FBQyxDQUN2QyxDQUFDLElBQUksQ0FBRSxDQUFBdEIsY0FBYyxDQUFDd0QsT0FBSyxFQUFFLEVBQTVCLElBQUksQ0FDTCxDQUFDLElBQUksQ0FBQyxRQUFRLENBQVIsS0FBTyxDQUFDLENBQ1gsQ0FBQW1DLFVBQVUsR0FBVixNQUFtQkEsVUFBVSxFQUFPLEdBQXBDLEVBQW1DLENBQUUsR0FBSUQsYUFBVyxDQUFFLG1CQUV6RCxFQUhDLElBQUksQ0FJUCxFQU5DLEdBQUcsQ0FNRTtBQUFBO0FBaEZMLFNBQUE1QixPQUFBZ0MsQ0FBQSxFQUFBQyxDQUFBO0VBQUEsT0FnQ29CL0YsY0FBYyxDQUFDOEYsQ0FBQyxDQUFDLENBQUFFLGFBQWMsQ0FBQ2hHLGNBQWMsQ0FBQytGLENBQUMsQ0FBQyxDQUFDO0FBQUE7QUFoQ3RFLFNBQUFoRCxNQUFBa0QsR0FBQTtFQUFBLE9BS0NBLEdBQUcsQ0FBQUMsSUFBSyxLQUFLLFFBSWMsS0FIMUJELEdBQUcsQ0FBQXhELFVBQVcsS0FBSyxRQUNzQixJQUF4Q3dELEdBQUcsQ0FBQXhELFVBQVcsS0FBSyxxQkFDUSxJQUEzQndELEdBQUcsQ0FBQXhELFVBQVcsS0FBSyxRQUNLLElBQXhCd0QsR0FBRyxDQUFBeEQsVUFBVyxLQUFLLEtBQU07QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==