πŸ“„ File detail

components/ui/TreeSelect.tsx

🧩 .tsxπŸ“ 397 linesπŸ’Ύ 38,964 bytesπŸ“ text
← Back to All Files

🎯 Use case

This file lives under β€œcomponents/”, which covers shared React UI pieces. On the API surface it exposes TreeNode, TreeSelectProps, and TreeSelect β€” mainly types, interfaces, or factory objects. Dependencies touch React UI. It composes internal code from ink and CustomSelect (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 React from 'react'; import type { KeyboardEvent } from '../../ink/events/keyboard-event.js'; import { Box } from '../../ink.js'; import { type OptionWithDescription, Select } from '../CustomSelect/select.js';

πŸ“€ Exports (heuristic)

  • TreeNode
  • TreeSelectProps
  • TreeSelect

πŸ“š External import roots

Package roots from from "…" (relative paths omitted).

  • react

πŸ–₯️ Source preview

import { c as _c } from "react/compiler-runtime";
import React from 'react';
import type { KeyboardEvent } from '../../ink/events/keyboard-event.js';
import { Box } from '../../ink.js';
import { type OptionWithDescription, Select } from '../CustomSelect/select.js';
export type TreeNode<T> = {
  id: string | number;
  value: T;
  label: string;
  description?: string;
  dimDescription?: boolean;
  children?: TreeNode<T>[];
  metadata?: Record<string, unknown>;
};
type FlattenedNode<T> = {
  node: TreeNode<T>;
  depth: number;
  isExpanded: boolean;
  hasChildren: boolean;
  parentId?: string | number;
};
export type TreeSelectProps<T> = {
  /**
   * Tree nodes to display.
   */
  readonly nodes: TreeNode<T>[];

  /**
   * Callback when a node is selected.
   */
  readonly onSelect: (node: TreeNode<T>) => void;

  /**
   * Callback when cancel is pressed.
   */
  readonly onCancel?: () => void;

  /**
   * Callback when focused node changes.
   */
  readonly onFocus?: (node: TreeNode<T>) => void;

  /**
   * Node to focus by ID.
   */
  readonly focusNodeId?: string | number;

  /**
   * Number of visible options.
   */
  readonly visibleOptionCount?: number;

  /**
   * Layout of the options.
   */
  readonly layout?: 'compact' | 'expanded' | 'compact-vertical';

  /**
   * When disabled, user input is ignored.
   */
  readonly isDisabled?: boolean;

  /**
   * When true, hides the numeric indexes next to each option.
   */
  readonly hideIndexes?: boolean;

  /**
   * Function to determine if a node should be initially expanded.
   * If not provided, all nodes start collapsed.
   */
  readonly isNodeExpanded?: (nodeId: string | number) => boolean;

  /**
   * Callback when a node is expanded.
   */
  readonly onExpand?: (nodeId: string | number) => void;

  /**
   * Callback when a node is collapsed.
   */
  readonly onCollapse?: (nodeId: string | number) => void;

  /**
   * Custom prefix function for parent nodes
   * @param isExpanded - Whether the parent node is currently expanded
   * @returns The prefix string to display (default: 'β–Ό ' when expanded, 'β–Ά ' when collapsed)
   */
  readonly getParentPrefix?: (isExpanded: boolean) => string;

  /**
   * Custom prefix function for child nodes
   * @param depth - The depth of the child node in the tree (0-indexed from parent)
   * @returns The prefix string to display (default: '  β–Έ ')
   */
  readonly getChildPrefix?: (depth: number) => string;

  /**
   * Callback when user presses up from the first item.
   * If provided, navigation will not wrap to the last item.
   */
  readonly onUpFromFirstItem?: () => void;
};

/**
 * TreeSelect is a generic component for selecting items from a hierarchical tree structure.
 * It handles expand/collapse state, keyboard navigation, and renders the tree as a flat list
 * using the Select component.
 */
export function TreeSelect(t0) {
  const $ = _c(48);
  const {
    nodes,
    onSelect,
    onCancel,
    onFocus,
    focusNodeId,
    visibleOptionCount,
    layout: t1,
    isDisabled: t2,
    hideIndexes: t3,
    isNodeExpanded,
    onExpand,
    onCollapse,
    getParentPrefix,
    getChildPrefix,
    onUpFromFirstItem
  } = t0;
  const layout = t1 === undefined ? "expanded" : t1;
  const isDisabled = t2 === undefined ? false : t2;
  const hideIndexes = t3 === undefined ? false : t3;
  let t4;
  if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
    t4 = new Set();
    $[0] = t4;
  } else {
    t4 = $[0];
  }
  const [internalExpandedIds, setInternalExpandedIds] = React.useState(t4);
  const isProgrammaticFocusRef = React.useRef(false);
  const lastFocusedIdRef = React.useRef(null);
  let t5;
  if ($[1] !== internalExpandedIds || $[2] !== isNodeExpanded) {
    t5 = nodeId => {
      if (isNodeExpanded) {
        return isNodeExpanded(nodeId);
      }
      return internalExpandedIds.has(nodeId);
    };
    $[1] = internalExpandedIds;
    $[2] = isNodeExpanded;
    $[3] = t5;
  } else {
    t5 = $[3];
  }
  const isExpanded = t5;
  let result;
  if ($[4] !== isExpanded || $[5] !== nodes) {
    result = [];
    function traverse(node, depth, parentId) {
      const hasChildren = !!node.children && node.children.length > 0;
      const nodeIsExpanded = isExpanded(node.id);
      result.push({
        node,
        depth,
        isExpanded: nodeIsExpanded,
        hasChildren,
        parentId
      });
      if (hasChildren && nodeIsExpanded && node.children) {
        for (const child of node.children) {
          traverse(child, depth + 1, node.id);
        }
      }
    }
    for (const node_0 of nodes) {
      traverse(node_0, 0);
    }
    $[4] = isExpanded;
    $[5] = nodes;
    $[6] = result;
  } else {
    result = $[6];
  }
  const flattenedNodes = result;
  const defaultGetParentPrefix = _temp;
  const defaultGetChildPrefix = _temp2;
  const parentPrefixFn = getParentPrefix ?? defaultGetParentPrefix;
  const childPrefixFn = getChildPrefix ?? defaultGetChildPrefix;
  let t6;
  if ($[7] !== childPrefixFn || $[8] !== parentPrefixFn) {
    t6 = flatNode => {
      let prefix = "";
      if (flatNode.hasChildren) {
        prefix = parentPrefixFn(flatNode.isExpanded);
      } else {
        if (flatNode.depth > 0) {
          prefix = childPrefixFn(flatNode.depth);
        }
      }
      return prefix + flatNode.node.label;
    };
    $[7] = childPrefixFn;
    $[8] = parentPrefixFn;
    $[9] = t6;
  } else {
    t6 = $[9];
  }
  const buildLabel = t6;
  let t7;
  if ($[10] !== buildLabel || $[11] !== flattenedNodes) {
    t7 = flattenedNodes.map(flatNode_0 => ({
      label: buildLabel(flatNode_0),
      description: flatNode_0.node.description,
      dimDescription: flatNode_0.node.dimDescription ?? true,
      value: flatNode_0.node.id
    }));
    $[10] = buildLabel;
    $[11] = flattenedNodes;
    $[12] = t7;
  } else {
    t7 = $[12];
  }
  const options = t7;
  let map;
  if ($[13] !== flattenedNodes) {
    map = new Map();
    flattenedNodes.forEach(fn => map.set(fn.node.id, fn.node));
    $[13] = flattenedNodes;
    $[14] = map;
  } else {
    map = $[14];
  }
  const nodeMap = map;
  let t8;
  if ($[15] !== flattenedNodes) {
    t8 = nodeId_0 => flattenedNodes.find(fn_0 => fn_0.node.id === nodeId_0);
    $[15] = flattenedNodes;
    $[16] = t8;
  } else {
    t8 = $[16];
  }
  const findFlattenedNode = t8;
  let t9;
  if ($[17] !== findFlattenedNode || $[18] !== onCollapse || $[19] !== onExpand) {
    t9 = (nodeId_1, shouldExpand) => {
      const flatNode_1 = findFlattenedNode(nodeId_1);
      if (!flatNode_1 || !flatNode_1.hasChildren) {
        return;
      }
      if (shouldExpand) {
        if (onExpand) {
          onExpand(nodeId_1);
        } else {
          setInternalExpandedIds(prev => new Set(prev).add(nodeId_1));
        }
      } else {
        if (onCollapse) {
          onCollapse(nodeId_1);
        } else {
          setInternalExpandedIds(prev_0 => {
            const newSet = new Set(prev_0);
            newSet.delete(nodeId_1);
            return newSet;
          });
        }
      }
    };
    $[17] = findFlattenedNode;
    $[18] = onCollapse;
    $[19] = onExpand;
    $[20] = t9;
  } else {
    t9 = $[20];
  }
  const toggleExpand = t9;
  let t10;
  if ($[21] !== findFlattenedNode || $[22] !== focusNodeId || $[23] !== isDisabled || $[24] !== nodeMap || $[25] !== onFocus || $[26] !== toggleExpand) {
    t10 = e => {
      if (!focusNodeId || isDisabled) {
        return;
      }
      const flatNode_2 = findFlattenedNode(focusNodeId);
      if (!flatNode_2) {
        return;
      }
      if (e.key === "right" && flatNode_2.hasChildren) {
        e.preventDefault();
        toggleExpand(focusNodeId, true);
      } else {
        if (e.key === "left") {
          if (flatNode_2.hasChildren && flatNode_2.isExpanded) {
            e.preventDefault();
            toggleExpand(focusNodeId, false);
          } else {
            if (flatNode_2.parentId !== undefined) {
              e.preventDefault();
              isProgrammaticFocusRef.current = true;
              toggleExpand(flatNode_2.parentId, false);
              if (onFocus) {
                const parentNode = nodeMap.get(flatNode_2.parentId);
                if (parentNode) {
                  onFocus(parentNode);
                }
              }
            }
          }
        }
      }
    };
    $[21] = findFlattenedNode;
    $[22] = focusNodeId;
    $[23] = isDisabled;
    $[24] = nodeMap;
    $[25] = onFocus;
    $[26] = toggleExpand;
    $[27] = t10;
  } else {
    t10 = $[27];
  }
  const handleKeyDown = t10;
  let t11;
  if ($[28] !== nodeMap || $[29] !== onSelect) {
    t11 = nodeId_2 => {
      const node_1 = nodeMap.get(nodeId_2);
      if (!node_1) {
        return;
      }
      onSelect(node_1);
    };
    $[28] = nodeMap;
    $[29] = onSelect;
    $[30] = t11;
  } else {
    t11 = $[30];
  }
  const handleChange = t11;
  let t12;
  if ($[31] !== nodeMap || $[32] !== onFocus) {
    t12 = nodeId_3 => {
      if (isProgrammaticFocusRef.current) {
        isProgrammaticFocusRef.current = false;
        return;
      }
      if (lastFocusedIdRef.current === nodeId_3) {
        return;
      }
      lastFocusedIdRef.current = nodeId_3;
      if (onFocus) {
        const node_2 = nodeMap.get(nodeId_3);
        if (node_2) {
          onFocus(node_2);
        }
      }
    };
    $[31] = nodeMap;
    $[32] = onFocus;
    $[33] = t12;
  } else {
    t12 = $[33];
  }
  const handleFocus = t12;
  let t13;
  if ($[34] !== focusNodeId || $[35] !== handleChange || $[36] !== handleFocus || $[37] !== hideIndexes || $[38] !== isDisabled || $[39] !== layout || $[40] !== onCancel || $[41] !== onUpFromFirstItem || $[42] !== options || $[43] !== visibleOptionCount) {
    t13 = <Select options={options} onChange={handleChange} onFocus={handleFocus} onCancel={onCancel} defaultFocusValue={focusNodeId} visibleOptionCount={visibleOptionCount} layout={layout} isDisabled={isDisabled} hideIndexes={hideIndexes} onUpFromFirstItem={onUpFromFirstItem} />;
    $[34] = focusNodeId;
    $[35] = handleChange;
    $[36] = handleFocus;
    $[37] = hideIndexes;
    $[38] = isDisabled;
    $[39] = layout;
    $[40] = onCancel;
    $[41] = onUpFromFirstItem;
    $[42] = options;
    $[43] = visibleOptionCount;
    $[44] = t13;
  } else {
    t13 = $[44];
  }
  let t14;
  if ($[45] !== handleKeyDown || $[46] !== t13) {
    t14 = <Box tabIndex={0} autoFocus={true} onKeyDown={handleKeyDown}>{t13}</Box>;
    $[45] = handleKeyDown;
    $[46] = t13;
    $[47] = t14;
  } else {
    t14 = $[47];
  }
  return t14;
}
function _temp2(_depth) {
  return "  \u25B8 ";
}
function _temp(isExpanded_0) {
  return isExpanded_0 ? "\u25BC " : "\u25B6 ";
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIktleWJvYXJkRXZlbnQiLCJCb3giLCJPcHRpb25XaXRoRGVzY3JpcHRpb24iLCJTZWxlY3QiLCJUcmVlTm9kZSIsImlkIiwidmFsdWUiLCJUIiwibGFiZWwiLCJkZXNjcmlwdGlvbiIsImRpbURlc2NyaXB0aW9uIiwiY2hpbGRyZW4iLCJtZXRhZGF0YSIsIlJlY29yZCIsIkZsYXR0ZW5lZE5vZGUiLCJub2RlIiwiZGVwdGgiLCJpc0V4cGFuZGVkIiwiaGFzQ2hpbGRyZW4iLCJwYXJlbnRJZCIsIlRyZWVTZWxlY3RQcm9wcyIsIm5vZGVzIiwib25TZWxlY3QiLCJvbkNhbmNlbCIsIm9uRm9jdXMiLCJmb2N1c05vZGVJZCIsInZpc2libGVPcHRpb25Db3VudCIsImxheW91dCIsImlzRGlzYWJsZWQiLCJoaWRlSW5kZXhlcyIsImlzTm9kZUV4cGFuZGVkIiwibm9kZUlkIiwib25FeHBhbmQiLCJvbkNvbGxhcHNlIiwiZ2V0UGFyZW50UHJlZml4IiwiZ2V0Q2hpbGRQcmVmaXgiLCJvblVwRnJvbUZpcnN0SXRlbSIsIlRyZWVTZWxlY3QiLCJ0MCIsIiQiLCJfYyIsInQxIiwidDIiLCJ0MyIsInVuZGVmaW5lZCIsInQ0IiwiU3ltYm9sIiwiZm9yIiwiU2V0IiwiaW50ZXJuYWxFeHBhbmRlZElkcyIsInNldEludGVybmFsRXhwYW5kZWRJZHMiLCJ1c2VTdGF0ZSIsImlzUHJvZ3JhbW1hdGljRm9jdXNSZWYiLCJ1c2VSZWYiLCJsYXN0Rm9jdXNlZElkUmVmIiwidDUiLCJoYXMiLCJyZXN1bHQiLCJ0cmF2ZXJzZSIsImxlbmd0aCIsIm5vZGVJc0V4cGFuZGVkIiwicHVzaCIsImNoaWxkIiwibm9kZV8wIiwiZmxhdHRlbmVkTm9kZXMiLCJkZWZhdWx0R2V0UGFyZW50UHJlZml4IiwiX3RlbXAiLCJkZWZhdWx0R2V0Q2hpbGRQcmVmaXgiLCJfdGVtcDIiLCJwYXJlbnRQcmVmaXhGbiIsImNoaWxkUHJlZml4Rm4iLCJ0NiIsImZsYXROb2RlIiwicHJlZml4IiwiYnVpbGRMYWJlbCIsInQ3IiwibWFwIiwiZmxhdE5vZGVfMCIsIm9wdGlvbnMiLCJNYXAiLCJmb3JFYWNoIiwiZm4iLCJzZXQiLCJub2RlTWFwIiwidDgiLCJub2RlSWRfMCIsImZpbmQiLCJmbl8wIiwiZmluZEZsYXR0ZW5lZE5vZGUiLCJ0OSIsIm5vZGVJZF8xIiwic2hvdWxkRXhwYW5kIiwiZmxhdE5vZGVfMSIsInByZXYiLCJhZGQiLCJwcmV2XzAiLCJuZXdTZXQiLCJkZWxldGUiLCJ0b2dnbGVFeHBhbmQiLCJ0MTAiLCJlIiwiZmxhdE5vZGVfMiIsImtleSIsInByZXZlbnREZWZhdWx0IiwiY3VycmVudCIsInBhcmVudE5vZGUiLCJnZXQiLCJoYW5kbGVLZXlEb3duIiwidDExIiwibm9kZUlkXzIiLCJub2RlXzEiLCJoYW5kbGVDaGFuZ2UiLCJ0MTIiLCJub2RlSWRfMyIsIm5vZGVfMiIsImhhbmRsZUZvY3VzIiwidDEzIiwidDE0IiwiX2RlcHRoIiwiaXNFeHBhbmRlZF8wIl0sInNvdXJjZXMiOlsiVHJlZVNlbGVjdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHR5cGUgeyBLZXlib2FyZEV2ZW50IH0gZnJvbSAnLi4vLi4vaW5rL2V2ZW50cy9rZXlib2FyZC1ldmVudC5qcydcbmltcG9ydCB7IEJveCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IHR5cGUgT3B0aW9uV2l0aERlc2NyaXB0aW9uLCBTZWxlY3QgfSBmcm9tICcuLi9DdXN0b21TZWxlY3Qvc2VsZWN0LmpzJ1xuXG5leHBvcnQgdHlwZSBUcmVlTm9kZTxUPiA9IHtcbiAgaWQ6IHN0cmluZyB8IG51bWJlclxuICB2YWx1ZTogVFxuICBsYWJlbDogc3RyaW5nXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gIGRpbURlc2NyaXB0aW9uPzogYm9vbGVhblxuICBjaGlsZHJlbj86IFRyZWVOb2RlPFQ+W11cbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxufVxuXG50eXBlIEZsYXR0ZW5lZE5vZGU8VD4gPSB7XG4gIG5vZGU6IFRyZWVOb2RlPFQ+XG4gIGRlcHRoOiBudW1iZXJcbiAgaXNFeHBhbmRlZDogYm9vbGVhblxuICBoYXNDaGlsZHJlbjogYm9vbGVhblxuICBwYXJlbnRJZD86IHN0cmluZyB8IG51bWJlclxufVxuXG5leHBvcnQgdHlwZSBUcmVlU2VsZWN0UHJvcHM8VD4gPSB7XG4gIC8qKlxuICAgKiBUcmVlIG5vZGVzIHRvIGRpc3BsYXkuXG4gICAqL1xuICByZWFkb25seSBub2RlczogVHJlZU5vZGU8VD5bXVxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB3aGVuIGEgbm9kZSBpcyBzZWxlY3RlZC5cbiAgICovXG4gIHJlYWRvbmx5IG9uU2VsZWN0OiAobm9kZTogVHJlZU5vZGU8VD4pID0+IHZvaWRcblxuICAvKipcbiAgICogQ2FsbGJhY2sgd2hlbiBjYW5jZWwgaXMgcHJlc3NlZC5cbiAgICovXG4gIHJlYWRvbmx5IG9uQ2FuY2VsPzogKCkgPT4gdm9pZFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB3aGVuIGZvY3VzZWQgbm9kZSBjaGFuZ2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgb25Gb2N1cz86IChub2RlOiBUcmVlTm9kZTxUPikgPT4gdm9pZFxuXG4gIC8qKlxuICAgKiBOb2RlIHRvIGZvY3VzIGJ5IElELlxuICAgKi9cbiAgcmVhZG9ubHkgZm9jdXNOb2RlSWQ/OiBzdHJpbmcgfCBudW1iZXJcblxuICAvKipcbiAgICogTnVtYmVyIG9mIHZpc2libGUgb3B0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IHZpc2libGVPcHRpb25Db3VudD86IG51bWJlclxuXG4gIC8qKlxuICAgKiBMYXlvdXQgb2YgdGhlIG9wdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBsYXlvdXQ/OiAnY29tcGFjdCcgfCAnZXhwYW5kZWQnIHwgJ2NvbXBhY3QtdmVydGljYWwnXG5cbiAgLyoqXG4gICAqIFdoZW4gZGlzYWJsZWQsIHVzZXIgaW5wdXQgaXMgaWdub3JlZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzRGlzYWJsZWQ/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgaGlkZXMgdGhlIG51bWVyaWMgaW5kZXhlcyBuZXh0IHRvIGVhY2ggb3B0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgaGlkZUluZGV4ZXM/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIG5vZGUgc2hvdWxkIGJlIGluaXRpYWxseSBleHBhbmRlZC5cbiAgICogSWYgbm90IHByb3ZpZGVkLCBhbGwgbm9kZXMgc3RhcnQgY29sbGFwc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNOb2RlRXhwYW5kZWQ/OiAobm9kZUlkOiBzdHJpbmcgfCBudW1iZXIpID0+IGJvb2xlYW5cblxuICAvKipcbiAgICogQ2FsbGJhY2sgd2hlbiBhIG5vZGUgaXMgZXhwYW5kZWQuXG4gICAqL1xuICByZWFkb25seSBvbkV4cGFuZD86IChub2RlSWQ6IHN0cmluZyB8IG51bWJlcikgPT4gdm9pZFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB3aGVuIGEgbm9kZSBpcyBjb2xsYXBzZWQuXG4gICAqL1xuICByZWFkb25seSBvbkNvbGxhcHNlPzogKG5vZGVJZDogc3RyaW5nIHwgbnVtYmVyKSA9PiB2b2lkXG5cbiAgLyoqXG4gICAqIEN1c3RvbSBwcmVmaXggZnVuY3Rpb24gZm9yIHBhcmVudCBub2Rlc1xuICAgKiBAcGFyYW0gaXNFeHBhbmRlZCAtIFdoZXRoZXIgdGhlIHBhcmVudCBub2RlIGlzIGN1cnJlbnRseSBleHBhbmRlZFxuICAgKiBAcmV0dXJucyBUaGUgcHJlZml4IHN0cmluZyB0byBkaXNwbGF5IChkZWZhdWx0OiAn4pa8ICcgd2hlbiBleHBhbmRlZCwgJ+KWtiAnIHdoZW4gY29sbGFwc2VkKVxuICAgKi9cbiAgcmVhZG9ubHkgZ2V0UGFyZW50UHJlZml4PzogKGlzRXhwYW5kZWQ6IGJvb2xlYW4pID0+IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBDdXN0b20gcHJlZml4IGZ1bmN0aW9uIGZvciBjaGlsZCBub2Rlc1xuICAgKiBAcGFyYW0gZGVwdGggLSBUaGUgZGVwdGggb2YgdGhlIGNoaWxkIG5vZGUgaW4gdGhlIHRyZWUgKDAtaW5kZXhlZCBmcm9tIHBhcmVudClcbiAgICogQHJldHVybnMgVGhlIHByZWZpeCBzdHJpbmcgdG8gZGlzcGxheSAoZGVmYXVsdDogJyAg4pa4ICcpXG4gICAqL1xuICByZWFkb25seSBnZXRDaGlsZFByZWZpeD86IChkZXB0aDogbnVtYmVyKSA9PiBzdHJpbmdcblxuICAvKipcbiAgICogQ2FsbGJhY2sgd2hlbiB1c2VyIHByZXNzZXMgdXAgZnJvbSB0aGUgZmlyc3QgaXRlbS5cbiAgICogSWYgcHJvdmlkZWQsIG5hdmlnYXRpb24gd2lsbCBub3Qgd3JhcCB0byB0aGUgbGFzdCBpdGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgb25VcEZyb21GaXJzdEl0ZW0/OiAoKSA9PiB2b2lkXG59XG5cbi8qKlxuICogVHJlZVNlbGVjdCBpcyBhIGdlbmVyaWMgY29tcG9uZW50IGZvciBzZWxlY3RpbmcgaXRlbXMgZnJvbSBhIGhpZXJhcmNoaWNhbCB0cmVlIHN0cnVjdHVyZS5cbiAqIEl0IGhhbmRsZXMgZXhwYW5kL2NvbGxhcHNlIHN0YXRlLCBrZXlib2FyZCBuYXZpZ2F0aW9uLCBhbmQgcmVuZGVycyB0aGUgdHJlZSBhcyBhIGZsYXQgbGlzdFxuICogdXNpbmcgdGhlIFNlbGVjdCBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBUcmVlU2VsZWN0PFQ+KHtcbiAgbm9kZXMsXG4gIG9uU2VsZWN0LFxuICBvbkNhbmNlbCxcbiAgb25Gb2N1cyxcbiAgZm9jdXNOb2RlSWQsXG4gIHZpc2libGVPcHRpb25Db3VudCxcbiAgbGF5b3V0ID0gJ2V4cGFuZGVkJyxcbiAgaXNEaXNhYmxlZCA9IGZhbHNlLFxuICBoaWRlSW5kZXhlcyA9IGZhbHNlLFxuICBpc05vZGVFeHBhbmRlZCxcbiAgb25FeHBhbmQsXG4gIG9uQ29sbGFwc2UsXG4gIGdldFBhcmVudFByZWZpeCxcbiAgZ2V0Q2hpbGRQcmVmaXgsXG4gIG9uVXBGcm9tRmlyc3RJdGVtLFxufTogVHJlZVNlbGVjdFByb3BzPFQ+KTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgLy8gVHJhY2sgd2hpY2ggbm9kZXMgYXJlIGV4cGFuZGVkIChpbnRlcm5hbCBzdGF0ZSBpZiBub3QgY29udHJvbGxlZCBleHRlcm5hbGx5KVxuICBjb25zdCBbaW50ZXJuYWxFeHBhbmRlZElkcywgc2V0SW50ZXJuYWxFeHBhbmRlZElkc10gPSBSZWFjdC51c2VTdGF0ZTxcbiAgICBTZXQ8c3RyaW5nIHwgbnVtYmVyPlxuICA+KG5ldyBTZXQoKSlcblxuICAvLyBUcmFjayBpZiB3ZSdyZSBwcm9ncmFtbWF0aWNhbGx5IHNldHRpbmcgZm9jdXMgdG8gYXZvaWQgaW5maW5pdGUgbG9vcHNcbiAgY29uc3QgaXNQcm9ncmFtbWF0aWNGb2N1c1JlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSlcblxuICAvLyBUcmFjayBsYXN0IGZvY3VzZWQgSUQgdG8gcHJldmVudCBkdXBsaWNhdGUgZm9jdXMgY2FsbHNcbiAgY29uc3QgbGFzdEZvY3VzZWRJZFJlZiA9IFJlYWN0LnVzZVJlZjxzdHJpbmcgfCBudW1iZXIgfCBudWxsPihudWxsKVxuXG4gIC8vIERldGVybWluZSBpZiBhIG5vZGUgaXMgZXhwYW5kZWQgKHVzZSBleHRlcm5hbCBmdW5jdGlvbiBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIHVzZSBpbnRlcm5hbCBzdGF0ZSlcbiAgY29uc3QgaXNFeHBhbmRlZCA9IFJlYWN0LnVzZUNhbGxiYWNrKFxuICAgIChub2RlSWQ6IHN0cmluZyB8IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICAgICAgaWYgKGlzTm9kZUV4cGFuZGVkKSB7XG4gICAgICAgIHJldHVybiBpc05vZGVFeHBhbmRlZChub2RlSWQpXG4gICAgICB9XG4gICAgICByZXR1cm4gaW50ZXJuYWxFeHBhbmRlZElkcy5oYXMobm9kZUlkKVxuICAgIH0sXG4gICAgW2lzTm9kZUV4cGFuZGVkLCBpbnRlcm5hbEV4cGFuZGVkSWRzXSxcbiAgKVxuXG4gIC8vIEZsYXR0ZW4gdGhlIHRyZWUgaW50byBhIGxpbmVhciBsaXN0IGZvciB0aGUgU2VsZWN0IGNvbXBvbmVudFxuICBjb25zdCBmbGF0dGVuZWROb2RlcyA9IFJlYWN0LnVzZU1lbW8oKCk6IEZsYXR0ZW5lZE5vZGU8VD5bXSA9PiB7XG4gICAgY29uc3QgcmVzdWx0OiBGbGF0dGVuZWROb2RlPFQ+W10gPSBbXVxuXG4gICAgZnVuY3Rpb24gdHJhdmVyc2UoXG4gICAgICBub2RlOiBUcmVlTm9kZTxUPixcbiAgICAgIGRlcHRoOiBudW1iZXIsXG4gICAgICBwYXJlbnRJZD86IHN0cmluZyB8IG51bWJlcixcbiAgICApOiB2b2lkIHtcbiAgICAgIGNvbnN0IGhhc0NoaWxkcmVuID0gISFub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMFxuICAgICAgY29uc3Qgbm9kZUlzRXhwYW5kZWQgPSBpc0V4cGFuZGVkKG5vZGUuaWQpXG5cbiAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgbm9kZSxcbiAgICAgICAgZGVwdGgsXG4gICAgICAgIGlzRXhwYW5kZWQ6IG5vZGVJc0V4cGFuZGVkLFxuICAgICAgICBoYXNDaGlsZHJlbixcbiAgICAgICAgcGFyZW50SWQsXG4gICAgICB9KVxuXG4gICAgICAvLyBPbmx5IHRyYXZlcnNlIGNoaWxkcmVuIGlmIHRoaXMgbm9kZSBpcyBleHBhbmRlZFxuICAgICAgaWYgKGhhc0NoaWxkcmVuICYmIG5vZGVJc0V4cGFuZGVkICYmIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgdHJhdmVyc2UoY2hpbGQsIGRlcHRoICsgMSwgbm9kZS5pZClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgdHJhdmVyc2Uobm9kZSwgMClcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH0sIFtub2RlcywgaXNFeHBhbmRlZF0pXG5cbiAgLy8gRGVmYXVsdCBwcmVmaXggZnVuY3Rpb25zXG4gIGNvbnN0IGRlZmF1bHRHZXRQYXJlbnRQcmVmaXggPSBSZWFjdC51c2VDYWxsYmFjayhcbiAgICAoaXNFeHBhbmRlZDogYm9vbGVhbik6IHN0cmluZyA9PiAoaXNFeHBhbmRlZCA/ICfilrwgJyA6ICfilrYgJyksXG4gICAgW10sXG4gIClcbiAgY29uc3QgZGVmYXVsdEdldENoaWxkUHJlZml4ID0gUmVhY3QudXNlQ2FsbGJhY2soXG4gICAgKF9kZXB0aDogbnVtYmVyKTogc3RyaW5nID0+ICcgIOKWuCAnLFxuICAgIFtdLFxuICApXG5cbiAgY29uc3QgcGFyZW50UHJlZml4Rm4gPSBnZXRQYXJlbnRQcmVmaXggPz8gZGVmYXVsdEdldFBhcmVudFByZWZpeFxuICBjb25zdCBjaGlsZFByZWZpeEZuID0gZ2V0Q2hpbGRQcmVmaXggPz8gZGVmYXVsdEdldENoaWxkUHJlZml4XG5cbiAgLy8gQnVpbGQgdGhlIGxhYmVsIHdpdGggYXBwcm9wcmlhdGUgcHJlZml4ZXMgYmFzZWQgb24gdHJlZSBwb3NpdGlvblxuICBjb25zdCBidWlsZExhYmVsID0gUmVhY3QudXNlQ2FsbGJhY2soXG4gICAgKGZsYXROb2RlOiBGbGF0dGVuZWROb2RlPFQ+KTogc3RyaW5nID0+IHtcbiAgICAgIGxldCBwcmVmaXggPSAnJ1xuXG4gICAgICBpZiAoZmxhdE5vZGUuaGFzQ2hpbGRyZW4pIHtcbiAgICAgICAgLy8gUGFyZW50IG5vZGUgd2l0aCBjaGlsZHJlblxuICAgICAgICBwcmVmaXggPSBwYXJlbnRQcmVmaXhGbihmbGF0Tm9kZS5pc0V4cGFuZGVkKVxuICAgICAgfSBlbHNlIGlmIChmbGF0Tm9kZS5kZXB0aCA+IDApIHtcbiAgICAgICAgLy8gQ2hpbGQgbm9kZVxuICAgICAgICBwcmVmaXggPSBjaGlsZFByZWZpeEZuKGZsYXROb2RlLmRlcHRoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJlZml4ICsgZmxhdE5vZGUubm9kZS5sYWJlbFxuICAgIH0sXG4gICAgW3BhcmVudFByZWZpeEZuLCBjaGlsZFByZWZpeEZuXSxcbiAgKVxuXG4gIC8vIENvbnZlcnQgZmxhdHRlbmVkIG5vZGVzIHRvIFNlbGVjdCBvcHRpb25zXG4gIGNvbnN0IG9wdGlvbnMgPSBSZWFjdC51c2VNZW1vKCgpOiBPcHRpb25XaXRoRGVzY3JpcHRpb248XG4gICAgc3RyaW5nIHwgbnVtYmVyXG4gID5bXSA9PiB7XG4gICAgcmV0dXJuIGZsYXR0ZW5lZE5vZGVzLm1hcChmbGF0Tm9kZSA9PiAoe1xuICAgICAgbGFiZWw6IGJ1aWxkTGFiZWwoZmxhdE5vZGUpLFxuICAgICAgZGVzY3JpcHRpb246IGZsYXROb2RlLm5vZGUuZGVzY3JpcHRpb24sXG4gICAgICBkaW1EZXNjcmlwdGlvbjogZmxhdE5vZGUubm9kZS5kaW1EZXNjcmlwdGlvbiA/PyB0cnVlLFxuICAgICAgdmFsdWU6IGZsYXROb2RlLm5vZGUuaWQsXG4gICAgfSkpXG4gIH0sIFtmbGF0dGVuZWROb2RlcywgYnVpbGRMYWJlbF0pXG5cbiAgLy8gTWFwIGZyb20gbm9kZSBJRCB0byB0aGUgYWN0dWFsIG5vZGUgZm9yIHF1aWNrIGxvb2t1cFxuICBjb25zdCBub2RlTWFwID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcgfCBudW1iZXIsIFRyZWVOb2RlPFQ+PigpXG4gICAgZmxhdHRlbmVkTm9kZXMuZm9yRWFjaChmbiA9PiBtYXAuc2V0KGZuLm5vZGUuaWQsIGZuLm5vZGUpKVxuICAgIHJldHVybiBtYXBcbiAgfSwgW2ZsYXR0ZW5lZE5vZGVzXSlcblxuICAvLyBGaW5kIHRoZSBmbGF0dGVuZWQgbm9kZSBieSBJRFxuICBjb25zdCBmaW5kRmxhdHRlbmVkTm9kZSA9IFJlYWN0LnVzZUNhbGxiYWNrKFxuICAgIChub2RlSWQ6IHN0cmluZyB8IG51bWJlcik6IEZsYXR0ZW5lZE5vZGU8VD4gfCB1bmRlZmluZWQgPT4ge1xuICAgICAgcmV0dXJuIGZsYXR0ZW5lZE5vZGVzLmZpbmQoZm4gPT4gZm4ubm9kZS5pZCA9PT0gbm9kZUlkKVxuICAgIH0sXG4gICAgW2ZsYXR0ZW5lZE5vZGVzXSxcbiAgKVxuXG4gIC8vIEhhbmRsZSBleHBhbmQvY29sbGFwc2VcbiAgY29uc3QgdG9nZ2xlRXhwYW5kID0gUmVhY3QudXNlQ2FsbGJhY2soXG4gICAgKG5vZGVJZDogc3RyaW5nIHwgbnVtYmVyLCBzaG91bGRFeHBhbmQ6IGJvb2xlYW4pID0+IHtcbiAgICAgIGNvbnN0IGZsYXROb2RlID0gZmluZEZsYXR0ZW5lZE5vZGUobm9kZUlkKVxuICAgICAgaWYgKCFmbGF0Tm9kZSB8fCAhZmxhdE5vZGUuaGFzQ2hpbGRyZW4pIHJldHVyblxuXG4gICAgICBpZiAoc2hvdWxkRXhwYW5kKSB7XG4gICAgICAgIGlmIChvbkV4cGFuZCkge1xuICAgICAgICAgIG9uRXhwYW5kKG5vZGVJZClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRJbnRlcm5hbEV4cGFuZGVkSWRzKHByZXYgPT4gbmV3IFNldChwcmV2KS5hZGQobm9kZUlkKSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9uQ29sbGFwc2UpIHtcbiAgICAgICAgICBvbkNvbGxhcHNlKG5vZGVJZClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRJbnRlcm5hbEV4cGFuZGVkSWRzKHByZXYgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3U2V0ID0gbmV3IFNldChwcmV2KVxuICAgICAgICAgICAgbmV3U2V0LmRlbGV0ZShub2RlSWQpXG4gICAgICAgICAgICByZXR1cm4gbmV3U2V0XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW2ZpbmRGbGF0dGVuZWROb2RlLCBvbkV4cGFuZCwgb25Db2xsYXBzZV0sXG4gIClcblxuICAvLyBIYW5kbGUgbGVmdC9yaWdodCBhcnJvdyBrZXlzIGZvciBleHBhbmQvY29sbGFwc2VcbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgaWYgKCFmb2N1c05vZGVJZCB8fCBpc0Rpc2FibGVkKSByZXR1cm5cblxuICAgIGNvbnN0IGZsYXROb2RlID0gZmluZEZsYXR0ZW5lZE5vZGUoZm9jdXNOb2RlSWQpXG4gICAgaWYgKCFmbGF0Tm9kZSkgcmV0dXJuXG5cbiAgICBpZiAoZS5rZXkgPT09ICdyaWdodCcgJiYgZmxhdE5vZGUuaGFzQ2hpbGRyZW4pIHtcbiAgICAgIC8vIEV4cGFuZCB0aGUgZm9jdXNlZCBub2RlIChvbmx5IGlmIGl0IGhhcyBjaGlsZHJlbilcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgdG9nZ2xlRXhwYW5kKGZvY3VzTm9kZUlkLCB0cnVlKVxuICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdsZWZ0Jykge1xuICAgICAgaWYgKGZsYXROb2RlLmhhc0NoaWxkcmVuICYmIGZsYXROb2RlLmlzRXhwYW5kZWQpIHtcbiAgICAgICAgLy8gQ29sbGFwc2UgdGhlIGZvY3VzZWQgcGFyZW50IG5vZGVcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIHRvZ2dsZUV4cGFuZChmb2N1c05vZGVJZCwgZmFsc2UpXG4gICAgICB9IGVsc2UgaWYgKGZsYXROb2RlLnBhcmVudElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGNoaWxkIG5vZGUgT1IgYSBjb2xsYXBzZWQgcGFyZW50IHdpdGggYSBwYXJlbnQsXG4gICAgICAgIC8vIGNvbGxhcHNlIHRoZSBwYXJlbnQgYW5kIGZvY3VzIGl0XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICBpc1Byb2dyYW1tYXRpY0ZvY3VzUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICAgIHRvZ2dsZUV4cGFuZChmbGF0Tm9kZS5wYXJlbnRJZCwgZmFsc2UpXG4gICAgICAgIGlmIChvbkZvY3VzKSB7XG4gICAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IG5vZGVNYXAuZ2V0KGZsYXROb2RlLnBhcmVudElkKVxuICAgICAgICAgIGlmIChwYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBvbkZvY3VzKHBhcmVudE5vZGUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIHNlbGVjdGlvblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSBSZWFjdC51c2VDYWxsYmFjayhcbiAgICAobm9kZUlkOiBzdHJpbmcgfCBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IG5vZGUgPSBub2RlTWFwLmdldChub2RlSWQpXG4gICAgICBpZiAoIW5vZGUpIHJldHVyblxuXG4gICAgICAvLyBBbHdheXMgc2VsZWN0IHRoZSBub2RlIC0gZXhwYW5kL2NvbGxhcHNlIGlzIGhhbmRsZWQgYnkgYXJyb3cga2V5c1xuICAgICAgb25TZWxlY3Qobm9kZSlcbiAgICB9LFxuICAgIFtub2RlTWFwLCBvblNlbGVjdF0sXG4gIClcblxuICAvLyBIYW5kbGUgZm9jdXMgY2hhbmdlc1xuICBjb25zdCBoYW5kbGVGb2N1cyA9IFJlYWN0LnVzZUNhbGxiYWNrKFxuICAgIChub2RlSWQ6IHN0cmluZyB8IG51bWJlcikgPT4ge1xuICAgICAgLy8gU2tpcCBpZiB0aGlzIGlzIGEgcHJvZ3JhbW1hdGljIGZvY3VzIGNoYW5nZVxuICAgICAgaWYgKGlzUHJvZ3JhbW1hdGljRm9jdXNSZWYuY3VycmVudCkge1xuICAgICAgICBpc1Byb2dyYW1tYXRpY0ZvY3VzUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gU2tpcCBpZiBzYW1lIG5vZGUgYWxyZWFkeSBmb2N1c2VkXG4gICAgICBpZiAobGFzdEZvY3VzZWRJZFJlZi5jdXJyZW50ID09PSBub2RlSWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBsYXN0Rm9jdXNlZElkUmVmLmN1cnJlbnQgPSBub2RlSWRcblxuICAgICAgaWYgKG9uRm9jdXMpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVNYXAuZ2V0KG5vZGVJZClcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICBvbkZvY3VzKG5vZGUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFtvbkZvY3VzLCBub2RlTWFwXSxcbiAgKVxuXG4gIHJldHVybiAoXG4gICAgPEJveCB0YWJJbmRleD17MH0gYXV0b0ZvY3VzIG9uS2V5RG93bj17aGFuZGxlS2V5RG93bn0+XG4gICAgICA8U2VsZWN0XG4gICAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgIG9uRm9jdXM9e2hhbmRsZUZvY3VzfVxuICAgICAgICBvbkNhbmNlbD17b25DYW5jZWx9XG4gICAgICAgIGRlZmF1bHRGb2N1c1ZhbHVlPXtmb2N1c05vZGVJZH1cbiAgICAgICAgdmlzaWJsZU9wdGlvbkNvdW50PXt2aXNpYmxlT3B0aW9uQ291bnR9XG4gICAgICAgIGxheW91dD17bGF5b3V0fVxuICAgICAgICBpc0Rpc2FibGVkPXtpc0Rpc2FibGVkfVxuICAgICAgICBoaWRlSW5kZXhlcz17aGlkZUluZGV4ZXN9XG4gICAgICAgIG9uVXBGcm9tRmlyc3RJdGVtPXtvblVwRnJvbUZpcnN0SXRlbX1cbiAgICAgIC8+XG4gICAgPC9Cb3g+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU9BLEtBQUssTUFBTSxPQUFPO0FBQ3pCLGNBQWNDLGFBQWEsUUFBUSxvQ0FBb0M7QUFDdkUsU0FBU0MsR0FBRyxRQUFRLGNBQWM7QUFDbEMsU0FBUyxLQUFLQyxxQkFBcUIsRUFBRUMsTUFBTSxRQUFRLDJCQUEyQjtBQUU5RSxPQUFPLEtBQUtDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRztFQUN4QkMsRUFBRSxFQUFFLE1BQU0sR0FBRyxNQUFN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