react-lightning-design-components
Version:
Salesforce Lightning Design System components built with React 16
364 lines (307 loc) • 35.3 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactDom = require('react-dom');
var _reactDom2 = _interopRequireDefault(_reactDom);
var _classnames = require('classnames');
var _classnames2 = _interopRequireDefault(_classnames);
var _util = require('./util');
var _DropdownButton = require('./DropdownButton');
var _DropdownButton2 = _interopRequireDefault(_DropdownButton);
var _DropdownMenu = require('./DropdownMenu');
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var Tabs = function (_Component) {
(0, _inherits3.default)(Tabs, _Component);
function Tabs(props) {
(0, _classCallCheck3.default)(this, Tabs);
var _this = (0, _possibleConstructorReturn3.default)(this, (Tabs.__proto__ || (0, _getPrototypeOf2.default)(Tabs)).call(this, props));
var _this$getvisibleAndHi = _this.getvisibleAndHiddenTabs(props),
_this$getvisibleAndHi2 = (0, _slicedToArray3.default)(_this$getvisibleAndHi, 2),
visibleTabs = _this$getvisibleAndHi2[0],
hiddenTabs = _this$getvisibleAndHi2[1];
_this.state = {
visibleTabs: visibleTabs,
hiddenTabs: hiddenTabs
};
_this.modifyVisibleTabs = _this.modifyVisibleTabs.bind(_this);
_this.activeTabRef = _this.activeTabRef.bind(_this);
(0, _util.registerStyle)('tab-menu', [['.slds-tabs__item.react-slds-tab-with-menu', '{ position: relative !important; overflow: visible !important; }'], ['.slds-tabs__item.react-slds-tab-with-menu > .react-slds-tab-item-inner', '{ overflow: hidden }'], ['.slds-tabs__item.react-slds-tab-with-menu > .react-slds-tab-item-inner > a', '{ padding-right: 2rem; }'], ['.react-slds-tab-menu', '{ position: absolute; top: 0; right: 0; visibility: hidden }'], ['.react-slds-tab-menu button', '{ height: 3rem; line-height: 3rem; width: 2rem; }'], ['.slds-tabs__item.slds-active .react-slds-tab-menu', '.slds-tabs__item:hover .react-slds-tab-menu', '{ visibility: visible }']]);
return _this;
}
(0, _createClass3.default)(Tabs, [{
key: 'componentWillReceiveProps',
value: function componentWillReceiveProps(nextProps) {
var _getvisibleAndHiddenT = this.getvisibleAndHiddenTabs(nextProps),
_getvisibleAndHiddenT2 = (0, _slicedToArray3.default)(_getvisibleAndHiddenT, 2),
visibleTabs = _getvisibleAndHiddenT2[0],
hiddenTabs = _getvisibleAndHiddenT2[1];
this.setState({
visibleTabs: visibleTabs,
hiddenTabs: hiddenTabs
});
}
}, {
key: 'componentDidUpdate',
value: function componentDidUpdate() {
if (this.state.focusTab) {
var el = _reactDom2.default.findDOMNode(this.activeTab);
if (el) {
el.focus();
}
/* eslint-disable react/no-did-update-set-state */
this.setState({ focusTab: false });
}
}
}, {
key: 'onTabClick',
value: function onTabClick(tabKey) {
if (this.props.onSelect) {
this.props.onSelect(tabKey);
}
// Uncontrolled
this.setState({ activeKey: tabKey, focusTab: true });
}
}, {
key: 'onTabKeyDown',
value: function onTabKeyDown(tabKey, e) {
if (e.keyCode === 37 || e.keyCode === 39) {
// left/right cursor key
var idx = 0;
var tabKeys = [];
_react2.default.Children.forEach(this.props.children, function (tab, i) {
tabKeys.push(tab.props.eventKey);
if (tabKey === tab.props.eventKey) {
idx = i;
}
});
var dir = e.keyCode === 37 ? -1 : 1;
var activeIdx = (idx + dir + tabKeys.length) % tabKeys.length;
var activeKey = tabKeys[activeIdx];
this.onTabClick(activeKey);
e.preventDefault();
e.stopPropagation();
}
}
}, {
key: 'getActiveKey',
value: function getActiveKey(props) {
var activeKey = props.activeKey,
defaultActiveKey = props.defaultActiveKey;
if (typeof activeKey !== 'undefined') return activeKey;
if (this.state && typeof this.state.activeKey !== 'undefined') return this.state.activeKey;
return defaultActiveKey;
}
}, {
key: 'getvisibleAndHiddenTabs',
value: function getvisibleAndHiddenTabs(props) {
var children = props.children,
maxVisibleTabs = props.maxVisibleTabs;
var _ref = [children.slice(0, maxVisibleTabs), children.slice(maxVisibleTabs, children.length)],
visibleTabs = _ref[0],
hiddenTabs = _ref[1];
var activeKey = this.getActiveKey(props);
var isActiveTabHidden = hiddenTabs.findIndex(function (tab) {
return tab.props.eventKey === activeKey;
}) !== -1;
return isActiveTabHidden ? this.selectHiddenTab(visibleTabs, hiddenTabs, activeKey) : [visibleTabs, hiddenTabs];
}
}, {
key: 'selectHiddenTab',
value: function selectHiddenTab(visibleTabs, hiddenTabs, activeKey) {
var tabToShowIndex = hiddenTabs.findIndex(function (tab) {
return tab.props.eventKey === activeKey;
});
var tabToShow = hiddenTabs[tabToShowIndex];
var tabToHide = visibleTabs[visibleTabs.length - 1];
var newVisibleTabs = [].concat((0, _toConsumableArray3.default)(visibleTabs.slice(0, visibleTabs.length - 1)), [tabToShow]);
var newHiddenTabs = [tabToHide].concat((0, _toConsumableArray3.default)(hiddenTabs.filter(function (tab) {
return tab.props.eventKey !== activeKey;
})));
return [newVisibleTabs, newHiddenTabs];
}
}, {
key: 'tabsType',
value: function tabsType() {
return this.props.type === 'scoped' ? 'scoped' : 'default';
}
}, {
key: 'modifyVisibleTabs',
value: function modifyVisibleTabs(event) {
var tabIndex = event.tabIndex;
var onSelect = this.props.onSelect;
if (onSelect) onSelect(tabIndex);
var _selectHiddenTab = this.selectHiddenTab(this.state.visibleTabs, this.state.hiddenTabs, tabIndex),
_selectHiddenTab2 = (0, _slicedToArray3.default)(_selectHiddenTab, 2),
visibleTabs = _selectHiddenTab2[0],
hiddenTabs = _selectHiddenTab2[1];
if (this.props.onSelect) {
this.props.onSelect(tabIndex);
}
this.setState({
visibleTabs: visibleTabs,
hiddenTabs: hiddenTabs,
activeKey: tabIndex,
focusTab: true
});
}
}, {
key: 'activeTabRef',
value: function activeTabRef(ref) {
this.activeTab = ref;
}
}, {
key: 'renderController',
value: function renderController() {
var label = this.props.moreLabel;
var normalizedLabel = this.props.allCaps ? label.toUpperCase() : label;
var marginTop = this.props.allCaps ? 4 : 7;
return _react2.default.createElement(
_DropdownButton2.default,
{
label: normalizedLabel,
style: { marginTop: marginTop, marginLeft: 20, color: '#54698d' },
onMenuItemClick: this.modifyVisibleTabs
},
this.state.hiddenTabs.map(function (tab) {
return _react2.default.createElement(
_DropdownMenu.MenuItem,
{ key: tab.props.eventKey, tabIndex: tab.props.eventKey },
tab.props.title
);
})
);
}
}, {
key: 'renderTabNav',
value: function renderTabNav() {
var _this2 = this;
var type = this.tabsType();
var _props = this.props,
children = _props.children,
maxVisibleTabs = _props.maxVisibleTabs;
var currentActiveKey = this.getActiveKey(this.props);
var tabNavClassName = 'slds-tabs--' + type + '__nav';
return _react2.default.createElement(
'ul',
{ className: tabNavClassName, role: 'tablist' },
this.state.visibleTabs.map(function (tab) {
var _tab$props = tab.props,
title = _tab$props.title,
eventKey = _tab$props.eventKey,
menu = _tab$props.menu,
menuIcon = _tab$props.menuIcon;
var menuItems = tab.props.menuItems;
menuItems = menu ? menu.props.children : menuItems;
var menuProps = menu ? menu.props : {};
var isActive = eventKey === currentActiveKey;
var tabItemClassName = (0, _classnames2.default)('slds-tabs__item', 'slds-tabs--' + type + '__item', 'slds-text-heading---label', { 'slds-active': isActive }, { 'react-slds-tab-with-menu': menu || menuItems });
var tabLinkClassName = 'slds-tabs--' + type + '__link';
return _react2.default.createElement(
'li',
{ className: tabItemClassName, role: 'presentation', key: tab.props.eventKey },
_react2.default.createElement(
'span',
{ className: 'react-slds-tab-item-inner' },
_react2.default.createElement(
'a',
{
className: tabLinkClassName,
onClick: _this2.onTabClick.bind(_this2, eventKey),
onKeyDown: _this2.onTabKeyDown.bind(_this2, eventKey),
role: 'tab',
ref: isActive ? _this2.activeTabRef : null,
tabIndex: isActive ? 0 : -1,
'aria-selected': isActive
},
title
),
menuItems ? _this2.renderTabMenu(menuIcon, menuItems, menuProps) : null
)
);
}),
maxVisibleTabs < children.length && this.renderController()
);
}
}, {
key: 'renderTabMenu',
value: function renderTabMenu() {
var menuIcon = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'down';
var menuItems = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
var menuProps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
return _react2.default.createElement(
_DropdownButton2.default,
(0, _extends3.default)({
className: 'react-slds-tab-menu',
icon: menuIcon,
type: 'icon-bare',
iconSize: 'small',
nubbinTop: true
}, menuProps),
menuItems
);
}
}, {
key: 'renderTabPanel',
value: function renderTabPanel() {
var activeKey = this.getActiveKey(this.props);
return this.state.visibleTabs.map(function (tab) {
var eventKey = tab.props.eventKey;
var isActive = eventKey === activeKey;
return _react2.default.cloneElement(tab, { active: isActive, key: tab.props.eventKey });
});
}
}, {
key: 'render',
value: function render() {
var className = this.props.className;
var tabsClassNames = (0, _classnames2.default)(className, 'slds-tabs--' + this.tabsType());
return _react2.default.createElement(
'div',
{ className: tabsClassNames },
this.renderTabNav(),
this.renderTabPanel()
);
}
}]);
return Tabs;
}(_react.Component);
exports.default = Tabs;
var TAB_TYPES = ['default', 'scoped'];
Tabs.propTypes = {
className: _propTypes2.default.string,
type: _propTypes2.default.oneOf(TAB_TYPES),
defaultActiveKey: _propTypes2.default.any,
activeKey: _propTypes2.default.any,
onSelect: _propTypes2.default.func,
children: _propTypes2.default.node,
controller: _propTypes2.default.node,
maxVisibleTabs: _propTypes2.default.number,
allCaps: _propTypes2.default.bool,
moreLabel: _propTypes2.default.string
};
Tabs.defaultProps = {
maxVisibleTabs: 10,
moreLabel: 'More'
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL1RhYnMuanMiXSwibmFtZXMiOlsiVGFicyIsInByb3BzIiwiZ2V0dmlzaWJsZUFuZEhpZGRlblRhYnMiLCJ2aXNpYmxlVGFicyIsImhpZGRlblRhYnMiLCJzdGF0ZSIsIm1vZGlmeVZpc2libGVUYWJzIiwiYmluZCIsImFjdGl2ZVRhYlJlZiIsIm5leHRQcm9wcyIsInNldFN0YXRlIiwiZm9jdXNUYWIiLCJlbCIsImZpbmRET01Ob2RlIiwiYWN0aXZlVGFiIiwiZm9jdXMiLCJ0YWJLZXkiLCJvblNlbGVjdCIsImFjdGl2ZUtleSIsImUiLCJrZXlDb2RlIiwiaWR4IiwidGFiS2V5cyIsIkNoaWxkcmVuIiwiZm9yRWFjaCIsImNoaWxkcmVuIiwidGFiIiwiaSIsInB1c2giLCJldmVudEtleSIsImRpciIsImFjdGl2ZUlkeCIsImxlbmd0aCIsIm9uVGFiQ2xpY2siLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsImRlZmF1bHRBY3RpdmVLZXkiLCJtYXhWaXNpYmxlVGFicyIsInNsaWNlIiwiZ2V0QWN0aXZlS2V5IiwiaXNBY3RpdmVUYWJIaWRkZW4iLCJmaW5kSW5kZXgiLCJzZWxlY3RIaWRkZW5UYWIiLCJ0YWJUb1Nob3dJbmRleCIsInRhYlRvU2hvdyIsInRhYlRvSGlkZSIsIm5ld1Zpc2libGVUYWJzIiwibmV3SGlkZGVuVGFicyIsImZpbHRlciIsInR5cGUiLCJldmVudCIsInRhYkluZGV4IiwicmVmIiwibGFiZWwiLCJtb3JlTGFiZWwiLCJub3JtYWxpemVkTGFiZWwiLCJhbGxDYXBzIiwidG9VcHBlckNhc2UiLCJtYXJnaW5Ub3AiLCJtYXJnaW5MZWZ0IiwiY29sb3IiLCJtYXAiLCJ0aXRsZSIsInRhYnNUeXBlIiwiY3VycmVudEFjdGl2ZUtleSIsInRhYk5hdkNsYXNzTmFtZSIsIm1lbnUiLCJtZW51SWNvbiIsIm1lbnVJdGVtcyIsIm1lbnVQcm9wcyIsImlzQWN0aXZlIiwidGFiSXRlbUNsYXNzTmFtZSIsInRhYkxpbmtDbGFzc05hbWUiLCJvblRhYktleURvd24iLCJyZW5kZXJUYWJNZW51IiwicmVuZGVyQ29udHJvbGxlciIsImNsb25lRWxlbWVudCIsImFjdGl2ZSIsImtleSIsImNsYXNzTmFtZSIsInRhYnNDbGFzc05hbWVzIiwicmVuZGVyVGFiTmF2IiwicmVuZGVyVGFiUGFuZWwiLCJUQUJfVFlQRVMiLCJwcm9wVHlwZXMiLCJzdHJpbmciLCJvbmVPZiIsImFueSIsImZ1bmMiLCJub2RlIiwiY29udHJvbGxlciIsIm51bWJlciIsImJvb2wiLCJkZWZhdWx0UHJvcHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7Ozs7O0lBRXFCQSxJOzs7QUFDbkIsZ0JBQVlDLEtBQVosRUFBbUI7QUFBQTs7QUFBQSxrSUFDWEEsS0FEVzs7QUFBQSxnQ0FFaUIsTUFBS0MsdUJBQUwsQ0FBNkJELEtBQTdCLENBRmpCO0FBQUE7QUFBQSxRQUVWRSxXQUZVO0FBQUEsUUFFR0MsVUFGSDs7QUFJakIsVUFBS0MsS0FBTCxHQUFhO0FBQ1hGLDhCQURXO0FBRVhDO0FBRlcsS0FBYjs7QUFLQSxVQUFLRSxpQkFBTCxHQUF5QixNQUFLQSxpQkFBTCxDQUF1QkMsSUFBdkIsT0FBekI7QUFDQSxVQUFLQyxZQUFMLEdBQW9CLE1BQUtBLFlBQUwsQ0FBa0JELElBQWxCLE9BQXBCOztBQUVBLDZCQUFjLFVBQWQsRUFBMEIsQ0FDeEIsQ0FDRSwyQ0FERixFQUVFLGtFQUZGLENBRHdCLEVBS3hCLENBQ0Usd0VBREYsRUFFRSxzQkFGRixDQUx3QixFQVN4QixDQUNFLDRFQURGLEVBRUUsMEJBRkYsQ0FUd0IsRUFheEIsQ0FDRSxzQkFERixFQUVFLDhEQUZGLENBYndCLEVBaUJ4QixDQUNFLDZCQURGLEVBRUUsbURBRkYsQ0FqQndCLEVBcUJ4QixDQUNFLG1EQURGLEVBRUUsNkNBRkYsRUFHRSx5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ZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IHJlZ2lzdGVyU3R5bGUgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IERyb3Bkb3duQnV0dG9uIGZyb20gJy4vRHJvcGRvd25CdXR0b24nO1xuaW1wb3J0IHsgTWVudUl0ZW0gfSBmcm9tICcuL0Ryb3Bkb3duTWVudSc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUYWJzIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgY29uc3QgW3Zpc2libGVUYWJzLCBoaWRkZW5UYWJzXSA9IHRoaXMuZ2V0dmlzaWJsZUFuZEhpZGRlblRhYnMocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHZpc2libGVUYWJzLFxuICAgICAgaGlkZGVuVGFicyxcbiAgICB9O1xuXG4gICAgdGhpcy5tb2RpZnlWaXNpYmxlVGFicyA9IHRoaXMubW9kaWZ5VmlzaWJsZVRhYnMuYmluZCh0aGlzKTtcbiAgICB0aGlzLmFjdGl2ZVRhYlJlZiA9IHRoaXMuYWN0aXZlVGFiUmVmLmJpbmQodGhpcyk7XG5cbiAgICByZWdpc3RlclN0eWxlKCd0YWItbWVudScsIFtcbiAgICAgIFtcbiAgICAgICAgJy5zbGRzLXRhYnNfX2l0ZW0ucmVhY3Qtc2xkcy10YWItd2l0aC1tZW51JyxcbiAgICAgICAgJ3sgcG9zaXRpb246IHJlbGF0aXZlICFpbXBvcnRhbnQ7IG92ZXJmbG93OiB2aXNpYmxlICFpbXBvcnRhbnQ7IH0nLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJy5zbGRzLXRhYnNfX2l0ZW0ucmVhY3Qtc2xkcy10YWItd2l0aC1tZW51ID4gLnJlYWN0LXNsZHMtdGFiLWl0ZW0taW5uZXInLFxuICAgICAgICAneyBvdmVyZmxvdzogaGlkZGVuIH0nLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJy5zbGRzLXRhYnNfX2l0ZW0ucmVhY3Qtc2xkcy10YWItd2l0aC1tZW51ID4gLnJlYWN0LXNsZHMtdGFiLWl0ZW0taW5uZXIgPiBhJyxcbiAgICAgICAgJ3sgcGFkZGluZy1yaWdodDogMnJlbTsgfScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnLnJlYWN0LXNsZHMtdGFiLW1lbnUnLFxuICAgICAgICAneyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgcmlnaHQ6IDA7IHZpc2liaWxpdHk6IGhpZGRlbiB9JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcucmVhY3Qtc2xkcy10YWItbWVudSBidXR0b24nLFxuICAgICAgICAneyBoZWlnaHQ6IDNyZW07IGxpbmUtaGVpZ2h0OiAzcmVtOyB3aWR0aDogMnJlbTsgfScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnLnNsZHMtdGFic19faXRlbS5zbGRzLWFjdGl2ZSAucmVhY3Qtc2xkcy10YWItbWVudScsXG4gICAgICAgICcuc2xkcy10YWJzX19pdGVtOmhvdmVyIC5yZWFjdC1zbGRzLXRhYi1tZW51JyxcbiAgICAgICAgJ3sgdmlzaWJpbGl0eTogdmlzaWJsZSB9JyxcbiAgICAgIF0sXG4gICAgXSk7XG4gIH1cblxuICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgIGNvbnN0IFt2aXNpYmxlVGFicywgaGlkZGVuVGFic10gPSB0aGlzLmdldHZpc2libGVBbmRIaWRkZW5UYWJzKG5leHRQcm9wcyk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICB2aXNpYmxlVGFicyxcbiAgICAgIGhpZGRlblRhYnMsXG4gICAgfSk7XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZm9jdXNUYWIpIHtcbiAgICAgIGNvbnN0IGVsID0gUmVhY3RET00uZmluZERPTU5vZGUodGhpcy5hY3RpdmVUYWIpO1xuICAgICAgaWYgKGVsKSB7XG4gICAgICAgIGVsLmZvY3VzKCk7XG4gICAgICB9XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9uby1kaWQtdXBkYXRlLXNldC1zdGF0ZSAqL1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGZvY3VzVGFiOiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICBvblRhYkNsaWNrKHRhYktleSkge1xuICAgIGlmICh0aGlzLnByb3BzLm9uU2VsZWN0KSB7XG4gICAgICB0aGlzLnByb3BzLm9uU2VsZWN0KHRhYktleSk7XG4gICAgfVxuICAgIC8vIFVuY29udHJvbGxlZFxuICAgIHRoaXMuc2V0U3RhdGUoeyBhY3RpdmVLZXk6IHRhYktleSwgZm9jdXNUYWI6IHRydWUgfSk7XG4gIH1cblxuICBvblRhYktleURvd24odGFiS2V5LCBlKSB7XG4gICAgaWYgKGUua2V5Q29kZSA9PT0gMzcgfHwgZS5rZXlDb2RlID09PSAzOSkgeyAvLyBsZWZ0L3JpZ2h0IGN1cnNvciBrZXlcbiAgICAgIGxldCBpZHggPSAwO1xuICAgICAgY29uc3QgdGFiS2V5cyA9IFtdO1xuICAgICAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaCh0aGlzLnByb3BzLmNoaWxkcmVuLCAodGFiLCBpKSA9PiB7XG4gICAgICAgIHRhYktleXMucHVzaCh0YWIucHJvcHMuZXZlbnRLZXkpO1xuICAgICAgICBpZiAodGFiS2V5ID09PSB0YWIucHJvcHMuZXZlbnRLZXkpIHtcbiAgICAgICAgICBpZHggPSBpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRpciA9IGUua2V5Q29kZSA9PT0gMzcgPyAtMSA6IDE7XG4gICAgICBjb25zdCBhY3RpdmVJZHggPSAoaWR4ICsgZGlyICsgdGFiS2V5cy5sZW5ndGgpICUgdGFiS2V5cy5sZW5ndGg7XG4gICAgICBjb25zdCBhY3RpdmVLZXkgPSB0YWJLZXlzW2FjdGl2ZUlkeF07XG4gICAgICB0aGlzLm9uVGFiQ2xpY2soYWN0aXZlS2V5KTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QWN0aXZlS2V5KHByb3BzKSB7XG4gICAgY29uc3QgeyBhY3RpdmVLZXksIGRlZmF1bHRBY3RpdmVLZXkgfSA9IHByb3BzO1xuICAgIGlmICh0eXBlb2YgYWN0aXZlS2V5ICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIGFjdGl2ZUtleTtcbiAgICBpZiAodGhpcy5zdGF0ZSAmJiB0eXBlb2YgdGhpcy5zdGF0ZS5hY3RpdmVLZXkgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gdGhpcy5zdGF0ZS5hY3RpdmVLZXk7XG4gICAgcmV0dXJuIGRlZmF1bHRBY3RpdmVLZXk7XG4gIH1cblxuICBnZXR2aXNpYmxlQW5kSGlkZGVuVGFicyhwcm9wcykge1xuICAgIGNvbnN0IHsgY2hpbGRyZW4sIG1heFZpc2libGVUYWJzIH0gPSBwcm9wcztcblxuICAgIGNvbnN0IFt2aXNpYmxlVGFicywgaGlkZGVuVGFic10gPSBbXG4gICAgICBjaGlsZHJlbi5zbGljZSgwLCBtYXhWaXNpYmxlVGFicyksXG4gICAgICBjaGlsZHJlbi5zbGljZShtYXhWaXNpYmxlVGFicywgY2hpbGRyZW4ubGVuZ3RoKSxcbiAgICBdO1xuICAgIGNvbnN0IGFjdGl2ZUtleSA9IHRoaXMuZ2V0QWN0aXZlS2V5KHByb3BzKTtcbiAgICBjb25zdCBpc0FjdGl2ZVRhYkhpZGRlbiA9IGhpZGRlblRhYnMuZmluZEluZGV4KHRhYiA9PiB0YWIucHJvcHMuZXZlbnRLZXkgPT09IGFjdGl2ZUtleSkgIT09IC0xO1xuICAgIHJldHVybiBpc0FjdGl2ZVRhYkhpZGRlbiA/XG4gICAgICB0aGlzLnNlbGVjdEhpZGRlblRhYih2aXNpYmxlVGFicywgaGlkZGVuVGFicywgYWN0aXZlS2V5KSA6IFt2aXNpYmxlVGFicywgaGlkZGVuVGFic107XG4gIH1cblxuICBzZWxlY3RIaWRkZW5UYWIodmlzaWJsZVRhYnMsIGhpZGRlblRhYnMsIGFjdGl2ZUtleSkge1xuICAgIGNvbnN0IHRhYlRvU2hvd0luZGV4ID0gaGlkZGVuVGFicy5maW5kSW5kZXgodGFiID0+IHRhYi5wcm9wcy5ldmVudEtleSA9PT0gYWN0aXZlS2V5KTtcbiAgICBjb25zdCB0YWJUb1Nob3cgPSBoaWRkZW5UYWJzW3RhYlRvU2hvd0luZGV4XTtcbiAgICBjb25zdCB0YWJUb0hpZGUgPSB2aXNpYmxlVGFic1t2aXNpYmxlVGFicy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBuZXdWaXNpYmxlVGFicyA9IFsuLi52aXNpYmxlVGFicy5zbGljZSgwLCB2aXNpYmxlVGFicy5sZW5ndGggLSAxKSwgdGFiVG9TaG93XTtcbiAgICBjb25zdCBuZXdIaWRkZW5UYWJzID0gW1xuICAgICAgdGFiVG9IaWRlLFxuICAgICAgLi4uaGlkZGVuVGFicy5maWx0ZXIodGFiID0+IHRhYi5wcm9wcy5ldmVudEtleSAhPT0gYWN0aXZlS2V5KSxcbiAgICBdO1xuXG4gICAgcmV0dXJuIFtuZXdWaXNpYmxlVGFicywgbmV3SGlkZGVuVGFic107XG4gIH1cblxuICB0YWJzVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy50eXBlID09PSAnc2NvcGVkJyA/ICdzY29wZWQnIDogJ2RlZmF1bHQnO1xuICB9XG5cbiAgbW9kaWZ5VmlzaWJsZVRhYnMoZXZlbnQpIHtcbiAgICBjb25zdCB7IHRhYkluZGV4IH0gPSBldmVudDtcbiAgICBjb25zdCB7IG9uU2VsZWN0IH0gPSB0aGlzLnByb3BzO1xuICAgIGlmIChvblNlbGVjdCkgb25TZWxlY3QodGFiSW5kZXgpO1xuICAgIGNvbnN0IFt2aXNpYmxlVGFicywgaGlkZGVuVGFic10gPVxuICAgICAgdGhpcy5zZWxlY3RIaWRkZW5UYWIodGhpcy5zdGF0ZS52aXNpYmxlVGFicywgdGhpcy5zdGF0ZS5oaWRkZW5UYWJzLCB0YWJJbmRleCk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5vblNlbGVjdCkge1xuICAgICAgdGhpcy5wcm9wcy5vblNlbGVjdCh0YWJJbmRleCk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICB2aXNpYmxlVGFicyxcbiAgICAgIGhpZGRlblRhYnMsXG4gICAgICBhY3RpdmVLZXk6IHRhYkluZGV4LFxuICAgICAgZm9jdXNUYWI6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICBhY3RpdmVUYWJSZWYocmVmKSB7XG4gICAgdGhpcy5hY3RpdmVUYWIgPSByZWY7XG4gIH1cblxuICByZW5kZXJDb250cm9sbGVyKCkge1xuICAgIGNvbnN0IGxhYmVsID0gdGhpcy5wcm9wcy5tb3JlTGFiZWw7XG4gICAgY29uc3Qgbm9ybWFsaXplZExhYmVsID0gdGhpcy5wcm9wcy5hbGxDYXBzID8gbGFiZWwudG9VcHBlckNhc2UoKSA6IGxhYmVsO1xuICAgIGNvbnN0IG1hcmdpblRvcCA9IHRoaXMucHJvcHMuYWxsQ2FwcyA/IDQgOiA3O1xuICAgIHJldHVybiAoXG4gICAgICA8RHJvcGRvd25CdXR0b25cbiAgICAgICAgbGFiZWw9e25vcm1hbGl6ZWRMYWJlbH1cbiAgICAgICAgc3R5bGU9e3sgbWFyZ2luVG9wLCBtYXJnaW5MZWZ0OiAyMCwgY29sb3I6ICcjNTQ2OThkJyB9fVxuICAgICAgICBvbk1lbnVJdGVtQ2xpY2s9e3RoaXMubW9kaWZ5VmlzaWJsZVRhYnN9XG4gICAgICA+XG4gICAgICAgIHtcbiAgICAgICAgICB0aGlzLnN0YXRlLmhpZGRlblRhYnMubWFwKCh0YWIpID0+IChcbiAgICAgICAgICAgIDxNZW51SXRlbSBrZXk9e3RhYi5wcm9wcy5ldmVudEtleX0gdGFiSW5kZXg9e3RhYi5wcm9wcy5ldmVudEtleX0+XG4gICAgICAgICAgICAgIHt0YWIucHJvcHMudGl0bGV9XG4gICAgICAgICAgICA8L01lbnVJdGVtPlxuICAgICAgICAgICkpXG4gICAgICAgIH1cbiAgICAgIDwvRHJvcGRvd25CdXR0b24+XG4gICAgKTtcbiAgfVxuXG4gIHJlbmRlclRhYk5hdigpIHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy50YWJzVHlwZSgpO1xuICAgIGNvbnN0IHsgY2hpbGRyZW4sIG1heFZpc2libGVUYWJzIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IGN1cnJlbnRBY3RpdmVLZXkgPSB0aGlzLmdldEFjdGl2ZUtleSh0aGlzLnByb3BzKTtcbiAgICBjb25zdCB0YWJOYXZDbGFzc05hbWUgPSBgc2xkcy10YWJzLS0ke3R5cGV9X19uYXZgO1xuICAgIHJldHVybiAoXG4gICAgICA8dWwgY2xhc3NOYW1lPXsgdGFiTmF2Q2xhc3NOYW1lIH0gcm9sZT0ndGFibGlzdCc+XG4gICAgICB7XG4gICAgICAgIHRoaXMuc3RhdGUudmlzaWJsZVRhYnMubWFwKCh0YWIpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHRpdGxlLCBldmVudEtleSwgbWVudSwgbWVudUljb24gfSA9IHRhYi5wcm9wcztcbiAgICAgICAgICBsZXQgeyBtZW51SXRlbXMgfSA9IHRhYi5wcm9wcztcbiAgICAgICAgICBtZW51SXRlbXMgPSBtZW51ID8gbWVudS5wcm9wcy5jaGlsZHJlbiA6IG1lbnVJdGVtcztcbiAgICAgICAgICBjb25zdCBtZW51UHJvcHMgPSBtZW51ID8gbWVudS5wcm9wcyA6IHt9O1xuICAgICAgICAgIGNvbnN0IGlzQWN0aXZlID0gZXZlbnRLZXkgPT09IGN1cnJlbnRBY3RpdmVLZXk7XG4gICAgICAgICAgY29uc3QgdGFiSXRlbUNsYXNzTmFtZSA9IGNsYXNzbmFtZXMoXG4gICAgICAgICAgICAnc2xkcy10YWJzX19pdGVtJyxcbiAgICAgICAgICAgIGBzbGRzLXRhYnMtLSR7dHlwZX1fX2l0ZW1gLFxuICAgICAgICAgICAgJ3NsZHMtdGV4dC1oZWFkaW5nLS0tbGFiZWwnLFxuICAgICAgICAgICAgeyAnc2xkcy1hY3RpdmUnOiBpc0FjdGl2ZSB9LFxuICAgICAgICAgICAgeyAncmVhY3Qtc2xkcy10YWItd2l0aC1tZW51JzogbWVudSB8fCBtZW51SXRlbXMgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgdGFiTGlua0NsYXNzTmFtZSA9IGBzbGRzLXRhYnMtLSR7dHlwZX1fX2xpbmtgO1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8bGkgY2xhc3NOYW1lPXsgdGFiSXRlbUNsYXNzTmFtZSB9IHJvbGU9J3ByZXNlbnRhdGlvbicga2V5PXt0YWIucHJvcHMuZXZlbnRLZXl9PlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J3JlYWN0LXNsZHMtdGFiLWl0ZW0taW5uZXInPlxuICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9eyB0YWJMaW5rQ2xhc3NOYW1lIH1cbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyB0aGlzLm9uVGFiQ2xpY2suYmluZCh0aGlzLCBldmVudEtleSkgfVxuICAgICAgICAgICAgICAgICAgb25LZXlEb3duPXsgdGhpcy5vblRhYktleURvd24uYmluZCh0aGlzLCBldmVudEtleSkgfVxuICAgICAgICAgICAgICAgICAgcm9sZT0ndGFiJ1xuICAgICAgICAgICAgICAgICAgcmVmPXsgaXNBY3RpdmUgPyB0aGlzLmFjdGl2ZVRhYlJlZiA6IG51bGwgfVxuICAgICAgICAgICAgICAgICAgdGFiSW5kZXg9eyBpc0FjdGl2ZSA/IDAgOiAtMSB9XG4gICAgICAgICAgICAgICAgICBhcmlhLXNlbGVjdGVkPXsgaXNBY3RpdmUgfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHsgdGl0bGUgfVxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICB7IG1lbnVJdGVtcyA/IHRoaXMucmVuZGVyVGFiTWVudShtZW51SWNvbiwgbWVudUl0ZW1zLCBtZW51UHJvcHMpIDogbnVsbCB9XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHtcbiAgICAgICAgbWF4VmlzaWJsZVRhYnMgPCBjaGlsZHJlbi5sZW5ndGggJiYgdGhpcy5yZW5kZXJDb250cm9sbGVyKClcbiAgICAgIH1cbiAgICAgIDwvdWw+XG4gICAgKTtcbiAgfVxuXG4gIHJlbmRlclRhYk1lbnUobWVudUljb24gPSAnZG93bicsIG1lbnVJdGVtcyA9IFtdLCBtZW51UHJvcHMgPSB7fSkge1xuICAgIHJldHVybiAoXG4gICAgICA8RHJvcGRvd25CdXR0b25cbiAgICAgICAgY2xhc3NOYW1lPSdyZWFjdC1zbGRzLXRhYi1tZW51J1xuICAgICAgICBpY29uPXsgbWVudUljb24gfVxuICAgICAgICB0eXBlPSdpY29uLWJhcmUnXG4gICAgICAgIGljb25TaXplPSdzbWFsbCdcbiAgICAgICAgbnViYmluVG9wXG4gICAgICAgIHsgLi4ubWVudVByb3BzIH1cbiAgICAgID5cbiAgICAgICAgeyBtZW51SXRlbXMgfVxuICAgICAgPC9Ecm9wZG93bkJ1dHRvbj5cbiAgICApO1xuICB9XG5cbiAgcmVuZGVyVGFiUGFuZWwoKSB7XG4gICAgY29uc3QgYWN0aXZlS2V5ID0gdGhpcy5nZXRBY3RpdmVLZXkodGhpcy5wcm9wcyk7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc3RhdGUudmlzaWJsZVRhYnMubWFwKCh0YWIpID0+IHtcbiAgICAgICAgY29uc3QgeyBldmVudEtleSB9ID0gdGFiLnByb3BzO1xuICAgICAgICBjb25zdCBpc0FjdGl2ZSA9IGV2ZW50S2V5ID09PSBhY3RpdmVLZXk7XG4gICAgICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQodGFiLCB7IGFjdGl2ZTogaXNBY3RpdmUsIGtleTogdGFiLnByb3BzLmV2ZW50S2V5IH0pO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHsgY2xhc3NOYW1lIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHRhYnNDbGFzc05hbWVzID0gY2xhc3NuYW1lcyhjbGFzc05hbWUsIGBzbGRzLXRhYnMtLSR7dGhpcy50YWJzVHlwZSgpfWApO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17IHRhYnNDbGFzc05hbWVzIH0+XG4gICAgICAgIHsgdGhpcy5yZW5kZXJUYWJOYXYoKSB9XG4gICAgICAgIHsgdGhpcy5yZW5kZXJUYWJQYW5lbCgpIH1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgVEFCX1RZUEVTID0gWydkZWZhdWx0JywgJ3Njb3BlZCddO1xuXG5UYWJzLnByb3BUeXBlcyA9IHtcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICB0eXBlOiBQcm9wVHlwZXMub25lT2YoVEFCX1RZUEVTKSxcbiAgZGVmYXVsdEFjdGl2ZUtleTogUHJvcFR5cGVzLmFueSxcbiAgYWN0aXZlS2V5OiBQcm9wVHlwZXMuYW55LFxuICBvblNlbGVjdDogUHJvcFR5cGVzLmZ1bmMsXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbiAgY29udHJvbGxlcjogUHJvcFR5cGVzLm5vZGUsXG4gIG1heFZpc2libGVUYWJzOiBQcm9wVHlwZXMubnVtYmVyLFxuICBhbGxDYXBzOiBQcm9wVHlwZXMuYm9vbCxcbiAgbW9yZUxhYmVsOiBQcm9wVHlwZXMuc3RyaW5nLFxufTtcblxuVGFicy5kZWZhdWx0UHJvcHMgPSB7XG4gIG1heFZpc2libGVUYWJzOiAxMCxcbiAgbW9yZUxhYmVsOiAnTW9yZScsXG59O1xuIl19