UNPKG

material-ui-datetime-range-picker

Version:

React Datetime Range Picker Component that Implements Google's Material Design Via Material-UI.

267 lines (227 loc) 27.7 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _transitions = require('../styles/transitions'); var _transitions2 = _interopRequireDefault(_transitions); var _dateUtils = require('./dateUtils'); var _EnhancedButton = require('../internal/EnhancedButton'); var _EnhancedButton2 = _interopRequireDefault(_EnhancedButton); var _parseNum = require('parse-num'); var _parseNum2 = _interopRequireDefault(_parseNum); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } function getStyles(props, context, state) { var dayButtonSize = props.dayButtonSize, calendarDateWidth = props.calendarDateWidth, containsBlockedTime = props.containsBlockedTime, date = props.date, disabled = props.disabled, isBetweenDates = props.isBetweenDates, isEndDate = props.isEndDate, isStartDate = props.isStartDate, selected = props.selected; var hover = state.hover; var _context$muiTheme = context.muiTheme, baseTheme = _context$muiTheme.baseTheme, datePicker = _context$muiTheme.datePicker; var buttonStateSize = (0, _parseNum2.default)(dayButtonSize || '34px'); var calendarWidth = (0, _parseNum2.default)(calendarDateWidth || '310') - buttonStateSize / 2; // -btn/2 for padding var margin = 'auto'; var spacerRight = 0; var spacerLeft = 0; var spacerDisplay = 'none'; var labelColor = baseTheme.palette.textColor; var buttonStateOpacity = 0; var buttonStateBorderRadius = '50%'; var buttonStateTransform = 'scale(0)'; var buttonStateWidth = buttonStateSize; var unit = (dayButtonSize || 'px').replace(/[0-9.]/g, ''); var buttonStateLeft = 0; var diff = (calendarWidth - buttonStateSize * 7) / 14; if (hover || selected || isBetweenDates) { labelColor = datePicker.selectTextColor; buttonStateOpacity = selected || isBetweenDates ? 1 : 0.6; buttonStateTransform = 'scale(1)'; if (isEndDate && !isStartDate) { buttonStateBorderRadius = '0% 50% 50% 0%'; buttonStateWidth += diff; margin = 'auto auto auto 0'; buttonStateLeft = diff; spacerRight = 'unset'; spacerDisplay = 'block'; } else if (isStartDate && !isEndDate) { buttonStateBorderRadius = '50% 0% 0% 50%'; buttonStateWidth += diff; margin = 'auto 0 auto auto'; buttonStateLeft = -diff; spacerLeft = 'unset'; spacerDisplay = 'block'; } else if (!isEndDate && !isStartDate && isBetweenDates) { buttonStateBorderRadius = '0%'; buttonStateWidth += diff * 2; margin = 'auto 0'; } } else if (containsBlockedTime === true || (0, _dateUtils.isEqualDate)(date, new Date())) { labelColor = datePicker.color; } return { root: { boxSizing: 'border-box', fontWeight: '400', opacity: disabled && '0.4', padding: '0', position: 'relative', WebkitTapHighlightColor: 'rgba(0,0,0,0)', // Remove mobile color flashing (deprecated) margin: margin, minWidth: '' + buttonStateWidth + unit, minHeight: '' + buttonStateWidth + unit }, label: { color: labelColor, fontWeight: '400', position: 'absolute', top: 0, bottom: 0, left: buttonStateLeft, right: 0, margin: 'auto', lineHeight: '' + buttonStateSize + unit, height: '' + buttonStateSize + unit }, buttonState: { backgroundColor: datePicker.selectColor, borderRadius: buttonStateBorderRadius, height: '' + buttonStateSize + unit, opacity: buttonStateOpacity, position: 'absolute', top: 0, bottom: 0, left: buttonStateLeft, right: 0, margin: 'auto', transform: buttonStateTransform, transition: _transitions2.default.easeOut(), width: '' + buttonStateWidth + unit }, spacer: { width: '' + diff + unit, position: 'absolute', right: spacerRight, left: spacerLeft, top: 0, bottom: 0, height: '' + buttonStateSize + unit, backgroundColor: datePicker.selectColor, display: spacerDisplay, margin: 'auto' } }; } var DayButton = function (_Component) { _inherits(DayButton, _Component); function DayButton() { var _ref; var _temp, _this, _ret; _classCallCheck(this, DayButton); for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = DayButton.__proto__ || Object.getPrototypeOf(DayButton)).call.apply(_ref, [this].concat(args))), _this), _this.state = { hover: false }, _this.handleMouseEnter = function () { if (!_this.props.disabled) { _this.setState({ hover: true }); } }, _this.handleMouseLeave = function () { if (!_this.props.disabled) { _this.setState({ hover: false }); } }, _this.handleTouchTap = function (event) { if (!_this.props.disabled && _this.props.onClick) { _this.props.onClick(event, _this.props.date); } }, _this.handleKeyboardFocus = function (event, keyboardFocused) { if (!_this.props.disabled && _this.props.onKeyboardFocus) { _this.props.onKeyboardFocus(event, keyboardFocused, _this.props.date); } }, _temp), _possibleConstructorReturn(_this, _ret); } _createClass(DayButton, [{ key: 'render', value: function render() { var _props = this.props, containsBlockedTime = _props.containsBlockedTime, DateTimeFormat = _props.DateTimeFormat, calendarDateWidth = _props.calendarDateWidth, date = _props.date, dayButtonSize = _props.dayButtonSize, disabled = _props.disabled, isBetweenDates = _props.isBetweenDates, isEndDate = _props.isEndDate, isStartDate = _props.isStartDate, locale = _props.locale, onClick = _props.onClick, selected = _props.selected, other = _objectWithoutProperties(_props, ['containsBlockedTime', 'DateTimeFormat', 'calendarDateWidth', 'date', 'dayButtonSize', 'disabled', 'isBetweenDates', 'isEndDate', 'isStartDate', 'locale', 'onClick', 'selected']); var prepareStyles = this.context.muiTheme.prepareStyles; var styles = getStyles(this.props, this.context, this.state); return date ? _react2.default.createElement( _EnhancedButton2.default, _extends({}, other, { disabled: disabled, disableFocusRipple: true, disableTouchRipple: true, onKeyboardFocus: this.handleKeyboardFocus, onMouseEnter: this.handleMouseEnter, onMouseLeave: this.handleMouseLeave, onClick: this.handleTouchTap, style: styles.root }), _react2.default.createElement('div', { style: prepareStyles(styles.buttonState) }), _react2.default.createElement( 'span', { style: prepareStyles(styles.label) }, new DateTimeFormat(locale, { day: 'numeric' }).format(date) ), _react2.default.createElement('div', { style: prepareStyles(styles.spacer) }) ) : _react2.default.createElement('span', { style: prepareStyles(styles.root) }); } }]); return DayButton; }(_react.Component); DayButton.propTypes = { DateTimeFormat: _propTypes2.default.func.isRequired, calendarDateWidth: _propTypes2.default.string, containsBlockedTime: _propTypes2.default.bool, date: _propTypes2.default.object, dayButtonSize: _propTypes2.default.string, disabled: _propTypes2.default.bool, isBetweenDates: _propTypes2.default.bool, isEndDate: _propTypes2.default.bool, isStartDate: _propTypes2.default.bool, locale: _propTypes2.default.string.isRequired, onClick: _propTypes2.default.func, onKeyboardFocus: _propTypes2.default.func, selected: _propTypes2.default.bool }; DayButton.defaultProps = { selected: false, disabled: false }; DayButton.contextTypes = { muiTheme: _propTypes2.default.object.isRequired }; exports.default = DayButton; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9EYXRlUGlja2VyL0RheUJ1dHRvbi5qcyJdLCJuYW1lcyI6WyJnZXRTdHlsZXMiLCJwcm9wcyIsImNvbnRleHQiLCJzdGF0ZSIsImRheUJ1dHRvblNpemUiLCJjYWxlbmRhckRhdGVXaWR0aCIsImNvbnRhaW5zQmxvY2tlZFRpbWUiLCJkYXRlIiwiZGlzYWJsZWQiLCJpc0JldHdlZW5EYXRlcyIsImlzRW5kRGF0ZSIsImlzU3RhcnREYXRlIiwic2VsZWN0ZWQiLCJob3ZlciIsIm11aVRoZW1lIiwiYmFzZVRoZW1lIiwiZGF0ZVBpY2tlciIsImJ1dHRvblN0YXRlU2l6ZSIsImNhbGVuZGFyV2lkdGgiLCJtYXJnaW4iLCJzcGFjZXJSaWdodCIsInNwYWNlckxlZnQiLCJzcGFjZXJEaXNwbGF5IiwibGFiZWxDb2xvciIsInBhbGV0dGUiLCJ0ZXh0Q29sb3IiLCJidXR0b25TdGF0ZU9wYWNpdHkiLCJidXR0b25TdGF0ZUJvcmRlclJhZGl1cyIsImJ1dHRvblN0YXRlVHJhbnNmb3JtIiwiYnV0dG9uU3RhdGVXaWR0aCIsInVuaXQiLCJyZXBsYWNlIiwiYnV0dG9uU3RhdGVMZWZ0IiwiZGlmZiIsInNlbGVjdFRleHRDb2xvciIsIkRhdGUiLCJjb2xvciIsInJvb3QiLCJib3hTaXppbmciLCJmb250V2VpZ2h0Iiwib3BhY2l0eSIsInBhZGRpbmciLCJwb3NpdGlvbiIsIldlYmtpdFRhcEhpZ2hsaWdodENvbG9yIiwibWluV2lkdGgiLCJtaW5IZWlnaHQiLCJsYWJlbCIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsImxpbmVIZWlnaHQiLCJoZWlnaHQiLCJidXR0b25TdGF0ZSIsImJhY2tncm91bmRDb2xvciIsInNlbGVjdENvbG9yIiwiYm9yZGVyUmFkaXVzIiwidHJhbnNmb3JtIiwidHJhbnNpdGlvbiIsIlRyYW5zaXRpb24iLCJlYXNlT3V0Iiwid2lkdGgiLCJzcGFjZXIiLCJkaXNwbGF5IiwiRGF5QnV0dG9uIiwiaGFuZGxlTW91c2VFbnRlciIsInNldFN0YXRlIiwiaGFuZGxlTW91c2VMZWF2ZSIsImhhbmRsZVRvdWNoVGFwIiwiZXZlbnQiLCJvbkNsaWNrIiwiaGFuZGxlS2V5Ym9hcmRGb2N1cyIsImtleWJvYXJkRm9jdXNlZCIsIm9uS2V5Ym9hcmRGb2N1cyIsIkRhdGVUaW1lRm9ybWF0IiwibG9jYWxlIiwib3RoZXIiLCJwcmVwYXJlU3R5bGVzIiwic3R5bGVzIiwiZGF5IiwiZm9ybWF0IiwiQ29tcG9uZW50IiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwiZnVuYyIsImlzUmVxdWlyZWQiLCJzdHJpbmciLCJib29sIiwib2JqZWN0IiwiZGVmYXVsdFByb3BzIiwiY29udGV4dFR5cGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUFFQSxTQUFTQSxTQUFULENBQW1CQyxLQUFuQixFQUEwQkMsT0FBMUIsRUFBbUNDLEtBQW5DLEVBQTBDO0FBQUEsTUFFdENDLGFBRnNDLEdBV3BDSCxLQVhvQyxDQUV0Q0csYUFGc0M7QUFBQSxNQUd0Q0MsaUJBSHNDLEdBV3BDSixLQVhvQyxDQUd0Q0ksaUJBSHNDO0FBQUEsTUFJdENDLG1CQUpzQyxHQVdwQ0wsS0FYb0MsQ0FJdENLLG1CQUpzQztBQUFBLE1BS3RDQyxJQUxzQyxHQVdwQ04sS0FYb0MsQ0FLdENNLElBTHNDO0FBQUEsTUFNdENDLFFBTnNDLEdBV3BDUCxLQVhvQyxDQU10Q08sUUFOc0M7QUFBQSxNQU90Q0MsY0FQc0MsR0FXcENSLEtBWG9DLENBT3RDUSxjQVBzQztBQUFBLE1BUXRDQyxTQVJzQyxHQVdwQ1QsS0FYb0MsQ0FRdENTLFNBUnNDO0FBQUEsTUFTdENDLFdBVHNDLEdBV3BDVixLQVhvQyxDQVN0Q1UsV0FUc0M7QUFBQSxNQVV0Q0MsUUFWc0MsR0FXcENYLEtBWG9DLENBVXRDVyxRQVZzQztBQUFBLE1BWWpDQyxLQVppQyxHQVl4QlYsS0Fad0IsQ0FZakNVLEtBWmlDO0FB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cEI3RSxZQUFVLEtBRFU7QUFFcEJKLFlBQVU7QUFGVSxDO0FBbEJsQndELFMsQ0F1QkcwQixZLEdBQWU7QUFDcEI1RSxZQUFVcUUsb0JBQVVLLE1BQVYsQ0FBaUJIO0FBRFAsQztrQkE4RVRyQixTIiwiZmlsZSI6IkRheUJ1dHRvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBUcmFuc2l0aW9uIGZyb20gJy4uL3N0eWxlcy90cmFuc2l0aW9ucyc7XG5pbXBvcnQge2lzRXF1YWxEYXRlfSBmcm9tICcuL2RhdGVVdGlscyc7XG5pbXBvcnQgRW5oYW5jZWRCdXR0b24gZnJvbSAnLi4vaW50ZXJuYWwvRW5oYW5jZWRCdXR0b24nO1xuaW1wb3J0IHBhcnNlTnVtIGZyb20gJ3BhcnNlLW51bSc7XG5cbmZ1bmN0aW9uIGdldFN0eWxlcyhwcm9wcywgY29udGV4dCwgc3RhdGUpIHtcbiAgY29uc3Qge1xuICAgIGRheUJ1dHRvblNpemUsXG4gICAgY2FsZW5kYXJEYXRlV2lkdGgsXG4gICAgY29udGFpbnNCbG9ja2VkVGltZSxcbiAgICBkYXRlLFxuICAgIGRpc2FibGVkLFxuICAgIGlzQmV0d2VlbkRhdGVzLFxuICAgIGlzRW5kRGF0ZSxcbiAgICBpc1N0YXJ0RGF0ZSxcbiAgICBzZWxlY3RlZCxcbiAgfSA9IHByb3BzO1xuICBjb25zdCB7aG92ZXJ9ID0gc3RhdGU7XG4gIGNvbnN0IHtiYXNlVGhlbWUsIGRhdGVQaWNrZXJ9ID0gY29udGV4dC5tdWlUaGVtZTtcblxuICBjb25zdCBidXR0b25TdGF0ZVNpemUgPSBwYXJzZU51bShkYXlCdXR0b25TaXplIHx8ICczNHB4Jyk7XG4gIGNvbnN0IGNhbGVuZGFyV2lkdGggPSBwYXJzZU51bShjYWxlbmRhckRhdGVXaWR0aCB8fCAnMzEwJykgLSAoYnV0dG9uU3RhdGVTaXplIC8gMik7IC8vIC1idG4vMiBmb3IgcGFkZGluZ1xuICBsZXQgbWFyZ2luID0gJ2F1dG8nO1xuXG4gIGxldCBzcGFjZXJSaWdodCA9IDA7XG4gIGxldCBzcGFjZXJMZWZ0ID0gMDtcbiAgbGV0IHNwYWNlckRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgbGV0IGxhYmVsQ29sb3IgPSBiYXNlVGhlbWUucGFsZXR0ZS50ZXh0Q29sb3I7XG4gIGxldCBidXR0b25TdGF0ZU9wYWNpdHkgPSAwO1xuICBsZXQgYnV0dG9uU3RhdGVCb3JkZXJSYWRpdXMgPSAnNTAlJztcbiAgbGV0IGJ1dHRvblN0YXRlVHJhbnNmb3JtID0gJ3NjYWxlKDApJztcbiAgbGV0IGJ1dHRvblN0YXRlV2lkdGggPSBidXR0b25TdGF0ZVNpemU7XG4gIGNvbnN0IHVuaXQgPSAoZGF5QnV0dG9uU2l6ZSB8fCAncHgnKS5yZXBsYWNlKC9bMC05Ll0vZywgJycpO1xuXG4gIGxldCBidXR0b25TdGF0ZUxlZnQgPSAwO1xuXG4gIGNvbnN0IGRpZmYgPSAoY2FsZW5kYXJXaWR0aCAtIGJ1dHRvblN0YXRlU2l6ZSAqIDcpIC8gMTQ7XG5cbiAgaWYgKGhvdmVyIHx8IHNlbGVjdGVkIHx8IGlzQmV0d2VlbkRhdGVzKSB7XG4gICAgbGFiZWxDb2xvciA9IGRhdGVQaWNrZXIuc2VsZWN0VGV4dENvbG9yO1xuICAgIGJ1dHRvblN0YXRlT3BhY2l0eSA9IChzZWxlY3RlZCB8fCBpc0JldHdlZW5EYXRlcykgPyAxIDogMC42O1xuICAgIGJ1dHRvblN0YXRlVHJhbnNmb3JtID0gJ3NjYWxlKDEpJztcbiAgICBpZiAoaXNFbmREYXRlICYmICFpc1N0YXJ0RGF0ZSkge1xuICAgICAgYnV0dG9uU3RhdGVCb3JkZXJSYWRpdXMgPSAnMCUgNTAlIDUwJSAwJSc7XG4gICAgICBidXR0b25TdGF0ZVdpZHRoICs9IGRpZmY7XG4gICAgICBtYXJnaW4gPSAnYXV0byBhdXRvIGF1dG8gMCc7XG4gICAgICBidXR0b25TdGF0ZUxlZnQgPSBkaWZmO1xuICAgICAgc3BhY2VyUmlnaHQgPSAndW5zZXQnO1xuICAgICAgc3BhY2VyRGlzcGxheSA9ICdibG9jayc7XG4gICAgfSBlbHNlIGlmIChpc1N0YXJ0RGF0ZSAmJiAhaXNFbmREYXRlKSB7XG4gICAgICBidXR0b25TdGF0ZUJvcmRlclJhZGl1cyA9ICc1MCUgMCUgMCUgNTAlJztcbiAgICAgIGJ1dHRvblN0YXRlV2lkdGggKz0gZGlmZjtcbiAgICAgIG1hcmdpbiA9ICdhdXRvIDAgYXV0byBhdXRvJztcbiAgICAgIGJ1dHRvblN0YXRlTGVmdCA9IC1kaWZmO1xuICAgICAgc3BhY2VyTGVmdCA9ICd1bnNldCc7XG4gICAgICBzcGFjZXJEaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB9IGVsc2UgaWYgKCFpc0VuZERhdGUgJiYgIWlzU3RhcnREYXRlICYmIGlzQmV0d2VlbkRhdGVzKSB7XG4gICAgICBidXR0b25TdGF0ZUJvcmRlclJhZGl1cyA9ICcwJSc7XG4gICAgICBidXR0b25TdGF0ZVdpZHRoICs9IChkaWZmICogMik7XG4gICAgICBtYXJnaW4gPSAnYXV0byAwJztcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29udGFpbnNCbG9ja2VkVGltZSA9PT0gdHJ1ZSB8fCBpc0VxdWFsRGF0ZShkYXRlLCBuZXcgRGF0ZSgpKSkge1xuICAgIGxhYmVsQ29sb3IgPSBkYXRlUGlja2VyLmNvbG9yO1xuICB9XG4gIHJldHVybiB7XG4gICAgcm9vdDoge1xuICAgICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gICAgICBmb250V2VpZ2h0OiAnNDAwJyxcbiAgICAgIG9wYWNpdHk6IGRpc2FibGVkICYmICcwLjQnLFxuICAgICAgcGFkZGluZzogJzAnLFxuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICBXZWJraXRUYXBIaWdobGlnaHRDb2xvcjogJ3JnYmEoMCwwLDAsMCknLCAvLyBSZW1vdmUgbW9iaWxlIGNvbG9yIGZsYXNoaW5nIChkZXByZWNhdGVkKVxuICAgICAgbWFyZ2luOiBtYXJnaW4sXG4gICAgICBtaW5XaWR0aDogYCR7YnV0dG9uU3RhdGVXaWR0aH0ke3VuaXR9YCxcbiAgICAgIG1pbkhlaWdodDogYCR7YnV0dG9uU3RhdGVXaWR0aH0ke3VuaXR9YCxcbiAgICB9LFxuICAgIGxhYmVsOiB7XG4gICAgICBjb2xvcjogbGFiZWxDb2xvcixcbiAgICAgIGZvbnRXZWlnaHQ6ICc0MDAnLFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICB0b3A6IDAsXG4gICAgICBib3R0b206IDAsXG4gICAgICBsZWZ0OiBidXR0b25TdGF0ZUxlZnQsXG4gICAgICByaWdodDogMCxcbiAgICAgIG1hcmdpbjogJ2F1dG8nLFxuICAgICAgbGluZUhlaWdodDogYCR7YnV0dG9uU3RhdGVTaXplfSR7dW5pdH1gLFxuICAgICAgaGVpZ2h0OiBgJHtidXR0b25TdGF0ZVNpemV9JHt1bml0fWAsXG4gICAgfSxcbiAgICBidXR0b25TdGF0ZToge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiBkYXRlUGlja2VyLnNlbGVjdENvbG9yLFxuICAgICAgYm9yZGVyUmFkaXVzOiBidXR0b25TdGF0ZUJvcmRlclJhZGl1cyxcbiAgICAgIGhlaWdodDogYCR7YnV0dG9uU3RhdGVTaXplfSR7dW5pdH1gLFxuICAgICAgb3BhY2l0eTogYnV0dG9uU3RhdGVPcGFjaXR5LFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICB0b3A6IDAsXG4gICAgICBib3R0b206IDAsXG4gICAgICBsZWZ0OiBidXR0b25TdGF0ZUxlZnQsXG4gICAgICByaWdodDogMCxcbiAgICAgIG1hcmdpbjogJ2F1dG8nLFxuICAgICAgdHJhbnNmb3JtOiBidXR0b25TdGF0ZVRyYW5zZm9ybSxcbiAgICAgIHRyYW5zaXRpb246IFRyYW5zaXRpb24uZWFzZU91dCgpLFxuICAgICAgd2lkdGg6IGAke2J1dHRvblN0YXRlV2lkdGh9JHt1bml0fWAsXG4gICAgfSxcbiAgICBzcGFjZXI6IHtcbiAgICAgIHdpZHRoOiBgJHtkaWZmfSR7dW5pdH1gLFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICByaWdodDogc3BhY2VyUmlnaHQsXG4gICAgICBsZWZ0OiBzcGFjZXJMZWZ0LFxuICAgICAgdG9wOiAwLFxuICAgICAgYm90dG9tOiAwLFxuICAgICAgaGVpZ2h0OiBgJHtidXR0b25TdGF0ZVNpemV9JHt1bml0fWAsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IGRhdGVQaWNrZXIuc2VsZWN0Q29sb3IsXG4gICAgICBkaXNwbGF5OiBzcGFjZXJEaXNwbGF5LFxuICAgICAgbWFyZ2luOiAnYXV0bycsXG4gICAgfSxcbiAgfTtcbn1cblxuY2xhc3MgRGF5QnV0dG9uIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICBEYXRlVGltZUZvcm1hdDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBjYWxlbmRhckRhdGVXaWR0aDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBjb250YWluc0Jsb2NrZWRUaW1lOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBkYXRlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGRheUJ1dHRvblNpemU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuICAgIGlzQmV0d2VlbkRhdGVzOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBpc0VuZERhdGU6IFByb3BUeXBlcy5ib29sLFxuICAgIGlzU3RhcnREYXRlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBsb2NhbGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBvbktleWJvYXJkRm9jdXM6IFByb3BUeXBlcy5mdW5jLFxuICAgIHNlbGVjdGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICB9O1xuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgfTtcblxuICBzdGF0aWMgY29udGV4dFR5cGVzID0ge1xuICAgIG11aVRoZW1lOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIH07XG5cbiAgc3RhdGUgPSB7XG4gICAgaG92ZXI6IGZhbHNlLFxuICB9O1xuXG4gIGhhbmRsZU1vdXNlRW50ZXIgPSAoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnByb3BzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtob3ZlcjogdHJ1ZX0pO1xuICAgIH1cbiAgfTtcblxuICBoYW5kbGVNb3VzZUxlYXZlID0gKCkgPT4ge1xuICAgIGlmICghdGhpcy5wcm9wcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7aG92ZXI6IGZhbHNlfSk7XG4gICAgfVxuICB9O1xuXG4gIGhhbmRsZVRvdWNoVGFwID0gKGV2ZW50KSA9PiB7XG4gICAgaWYgKCF0aGlzLnByb3BzLmRpc2FibGVkICYmIHRoaXMucHJvcHMub25DbGljaykge1xuICAgICAgdGhpcy5wcm9wcy5vbkNsaWNrKGV2ZW50LCB0aGlzLnByb3BzLmRhdGUpO1xuICAgIH1cbiAgfTtcblxuICBoYW5kbGVLZXlib2FyZEZvY3VzID0gKGV2ZW50LCBrZXlib2FyZEZvY3VzZWQpID0+IHtcbiAgICBpZiAoIXRoaXMucHJvcHMuZGlzYWJsZWQgJiYgdGhpcy5wcm9wcy5vbktleWJvYXJkRm9jdXMpIHtcbiAgICAgIHRoaXMucHJvcHMub25LZXlib2FyZEZvY3VzKGV2ZW50LCBrZXlib2FyZEZvY3VzZWQsIHRoaXMucHJvcHMuZGF0ZSk7XG4gICAgfVxuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBjb250YWluc0Jsb2NrZWRUaW1lLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICBEYXRlVGltZUZvcm1hdCxcbiAgICAgIGNhbGVuZGFyRGF0ZVdpZHRoLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICBkYXRlLFxuICAgICAgZGF5QnV0dG9uU2l6ZSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgZGlzYWJsZWQsXG4gICAgICBpc0JldHdlZW5EYXRlcywgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgaXNFbmREYXRlLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICBpc1N0YXJ0RGF0ZSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgbG9jYWxlLFxuICAgICAgb25DbGljaywgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgc2VsZWN0ZWQsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIC4uLm90aGVyXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBjb25zdCB7cHJlcGFyZVN0eWxlc30gPSB0aGlzLmNvbnRleHQubXVpVGhlbWU7XG4gICAgY29uc3Qgc3R5bGVzID0gZ2V0U3R5bGVzKHRoaXMucHJvcHMsIHRoaXMuY29udGV4dCwgdGhpcy5zdGF0ZSk7XG5cbiAgICByZXR1cm4gZGF0ZSA/IChcbiAgICAgIDxFbmhhbmNlZEJ1dHRvblxuICAgICAgICB7Li4ub3RoZXJ9XG4gICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgZGlzYWJsZUZvY3VzUmlwcGxlPXt0cnVlfVxuICAgICAgICBkaXNhYmxlVG91Y2hSaXBwbGU9e3RydWV9XG4gICAgICAgIG9uS2V5Ym9hcmRGb2N1cz17dGhpcy5oYW5kbGVLZXlib2FyZEZvY3VzfVxuICAgICAgICBvbk1vdXNlRW50ZXI9e3RoaXMuaGFuZGxlTW91c2VFbnRlcn1cbiAgICAgICAgb25Nb3VzZUxlYXZlPXt0aGlzLmhhbmRsZU1vdXNlTGVhdmV9XG4gICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlVG91Y2hUYXB9XG4gICAgICAgIHN0eWxlPXtzdHlsZXMucm9vdH1cbiAgICAgID5cbiAgICAgICAgPGRpdiBzdHlsZT17cHJlcGFyZVN0eWxlcyhzdHlsZXMuYnV0dG9uU3RhdGUpfSAvPlxuICAgICAgICA8c3BhbiBzdHlsZT17cHJlcGFyZVN0eWxlcyhzdHlsZXMubGFiZWwpfT5cbiAgICAgICAgICB7bmV3IERhdGVUaW1lRm9ybWF0KGxvY2FsZSwge1xuICAgICAgICAgICAgZGF5OiAnbnVtZXJpYycsXG4gICAgICAgICAgfSkuZm9ybWF0KGRhdGUpfVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxkaXYgc3R5bGU9e3ByZXBhcmVTdHlsZXMoc3R5bGVzLnNwYWNlcil9IC8+XG4gICAgICA8L0VuaGFuY2VkQnV0dG9uPlxuICAgICkgOiAoXG4gICAgICA8c3BhbiBzdHlsZT17cHJlcGFyZVN0eWxlcyhzdHlsZXMucm9vdCl9IC8+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEYXlCdXR0b247XG4iXX0=