focus-components-v3
Version:
Focus web components to build applications (based on Material Design)
288 lines (228 loc) • 31 kB
JavaScript
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 _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactDom = require('react-dom');
var _reactDom2 = _interopRequireDefault(_reactDom);
var _moment = require('moment');
var _moment2 = _interopRequireDefault(_moment);
var _i18next = require('i18next');
var _i18next2 = _interopRequireDefault(_i18next);
var _inputText = require('../input-text');
var _inputText2 = _interopRequireDefault(_inputText);
var _reactDatePicker = require('react-date-picker');
var _reactDatePicker2 = _interopRequireDefault(_reactDatePicker);
var _isArray = require('lodash/isArray');
var _isArray2 = _interopRequireDefault(_isArray);
var _uniqueId = require('lodash/uniqueId');
var _uniqueId2 = _interopRequireDefault(_uniqueId);
var _closest = require('closest');
var _closest2 = _interopRequireDefault(_closest);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
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) : _defaults(subClass, superClass); } // Dependencies
var isISOString = function isISOString(value) {
return (0, _moment2.default)(value, _moment2.default.ISO_8601).isValid();
};
var InputDate = function (_Component) {
_inherits(InputDate, _Component);
function InputDate(props) {
_classCallCheck(this, InputDate);
var _this = _possibleConstructorReturn(this, _Component.call(this, props));
_this._isInputFormatCorrect = function (value) {
return _this._parseInputDate(value).isValid();
};
_this._parseInputDate = function (inputDate) {
var format = _this.props.format;
return (0, _moment2.default)(inputDate, format);
};
_this._formatDate = function (isoDate) {
var format = _this.props.format;
if (isISOString(isoDate)) {
if ((0, _isArray2.default)(format)) {
format = format[0];
}
return (0, _moment2.default)(isoDate, _moment2.default.ISO_8601).format(format);
} else {
return isoDate;
}
};
_this._onInputChange = function (inputDate, fromBlur) {
if (_this._isInputFormatCorrect(inputDate)) {
var dropDownDate = _this._parseInputDate(inputDate);
_this.setState({ dropDownDate: dropDownDate, inputDate: inputDate });
} else {
_this.setState({ inputDate: inputDate });
}
if (fromBlur !== true) {
_this.props.onChange(inputDate);
}
};
_this._onInputBlur = function () {
var inputDate = _this.state.inputDate;
_this._onInputChange(inputDate, true);
};
_this._onDropDownChange = function (text, date) {
if (date._isValid) {
_this.setState({ displayPicker: false }, function () {
_this.props.onChange(date.toISOString());
_this._onInputChange(_this._formatDate(date.toISOString()), true); // Add 12 hours to avoid skipping a day due to different locales
});
}
};
_this._onInputFocus = function () {
_this.setState({ displayPicker: true });
};
_this._onDocumentClick = function (_ref) {
var target = _ref.target;
var targetClassAttr = target.getAttribute('class');
var isTriggeredFromPicker = targetClassAttr ? targetClassAttr.includes('dp-cell') : false; //this is the only way to check the target comes from picker cause at this stage, month and year div are unmounted by React.
if (!isTriggeredFromPicker) {
//if target was not triggered inside the date picker, we check it was not triggered by the input
if ((0, _closest2.default)(target, '[data-id=\'' + _this._inputDateId + '\']', true) === undefined) {
_this.setState({ displayPicker: false }, function () {
return _this._onInputBlur();
});
}
}
};
_this._handleKeyDown = function (_ref2) {
var key = _ref2.key;
if (key === 'Tab' || key === 'Enter') {
_this.setState({ displayPicker: false }, function () {
return _this._onInputBlur();
});
}
};
_this.getValue = function () {
var inputDate = _this.state.inputDate;
var rawValue = _this._isInputFormatCorrect(inputDate) ? _this._parseInputDate(inputDate).toISOString() : null;
return _this.props.beforeValueGetter(rawValue);
};
_this.validate = function () {
var inputDate = _this.state.inputDate;
var isRequired = _this.props.isRequired;
if ('' === inputDate || !inputDate) {
return {
isValid: !isRequired,
message: 'focus.components.field.required'
};
} else {
return {
isValid: _this._isInputFormatCorrect(inputDate),
message: _i18next2.default.t('focus.components.input.date.invalid', { date: inputDate })
};
}
};
var rawInputValue = props.rawInputValue;
var state = {
dropDownDate: isISOString(rawInputValue) ? (0, _moment2.default)(rawInputValue, _moment2.default.ISO_8601) : (0, _moment2.default)(),
inputDate: _this._formatDate(rawInputValue),
displayPicker: false
};
_this.state = state;
_this._inputDateId = (0, _uniqueId2.default)('input-date-');
return _this;
}
InputDate.prototype.componentWillMount = function componentWillMount() {
_moment2.default.locale(this.props.locale);
document.addEventListener('click', this._onDocumentClick);
};
InputDate.prototype.componentDidMount = function componentDidMount() {
var _props = this.props,
drops = _props.drops,
showDropdowns = _props.showDropdowns;
var startDate = this.state.inputDate;
};
InputDate.prototype.componentWillReceiveProps = function componentWillReceiveProps(_ref3) {
var rawInputValue = _ref3.rawInputValue;
this.setState({
dropDownDate: isISOString(rawInputValue) ? (0, _moment2.default)(rawInputValue, _moment2.default.ISO_8601) : (0, _moment2.default)(),
inputDate: this._formatDate(rawInputValue)
});
};
InputDate.prototype.componentWillUnmount = function componentWillUnmount() {
document.removeEventListener('click', this._onDocumentClick);
};
InputDate.prototype.render = function render() {
var _props2 = this.props,
disabled = _props2.disabled,
error = _props2.error,
locale = _props2.locale,
name = _props2.name,
placeholder = _props2.placeholder,
valid = _props2.valid;
var _state = this.state,
dropDownDate = _state.dropDownDate,
inputDate = _state.inputDate,
displayPicker = _state.displayPicker;
var _onInputBlur = this._onInputBlur,
_onInputChange = this._onInputChange,
_onInputFocus = this._onInputFocus,
_onDropDownChange = this._onDropDownChange,
_onPickerCloserClick = this._onPickerCloserClick,
_handleKeyDown = this._handleKeyDown;
var inputProps = { disabled: disabled };
return _react2.default.createElement(
'div',
{ 'data-focus': 'input-date', 'data-id': this._inputDateId },
_react2.default.createElement(_inputText2.default, _extends({ error: error, name: name, onChange: _onInputChange, onKeyDown: _handleKeyDown, onFocus: _onInputFocus, placeholder: placeholder, ref: 'input', rawInputValue: inputDate, valid: valid }, inputProps)),
displayPicker && _react2.default.createElement(
'div',
{ 'data-focus': 'picker-zone' },
_react2.default.createElement(_reactDatePicker2.default, {
date: dropDownDate,
hideFooter: true,
locale: locale,
onChange: _onDropDownChange,
ref: 'picker' })
)
);
};
return InputDate;
}(_react.Component);
InputDate.displayName = 'InputDate';
InputDate.propTypes = {
drops: _react.PropTypes.oneOf(['up', 'down']).isRequired,
error: _react.PropTypes.oneOfType([_react.PropTypes.string, _react.PropTypes.bool]),
locale: _react.PropTypes.string.isRequired,
name: _react.PropTypes.string.isRequired,
onChange: _react.PropTypes.func.isRequired,
beforeValueGetter: _react.PropTypes.func.isRequired,
placeholder: _react.PropTypes.string,
showDropdowns: _react.PropTypes.bool.isRequired,
rawInputValue: function rawInputValue(props, propName, componentName) {
var prop = props[propName];
if (prop && !isISOString(prop)) {
throw new Error('The date ' + prop + ' provided to the component ' + componentName + ' is not an ISO date. Please provide a valid date string.');
}
},
valid: _react.PropTypes.bool,
validate: _react.PropTypes.func
};
InputDate.defaultProps = {
drops: 'down',
error: 'focus.components.input.date.error.default',
locale: 'en',
format: 'MM/DD/YYYY',
beforeValueGetter: function beforeValueGetter(value) {
return value;
},
/**
* Default onChange prop, that will log an error.
*/
onChange: function onChange() {
console.error('You did not give an onChange method to an input date, please check your code.');
},
showDropdowns: true,
valid: true,
validate: isISOString
};
exports.default = InputDate;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZyLUZSLmpzIl0sIm5hbWVzIjpbImlzSVNPU3RyaW5nIiwidmFsdWUiLCJJU09fODYwMSIsImlzVmFsaWQiLCJJbnB1dERhdGUiLCJwcm9wcyIsIl9pc0lucHV0Rm9ybWF0Q29ycmVjdCIsIl9wYXJzZUlucHV0RGF0ZSIsImZvcm1hdCIsImlucHV0RGF0ZSIsIl9mb3JtYXREYXRlIiwiaXNvRGF0ZSIsIl9vbklucHV0Q2hhbmdlIiwiZnJvbUJsdXIiLCJkcm9wRG93bkRhdGUiLCJzZXRTdGF0ZSIsIm9uQ2hhbmdlIiwiX29uSW5wdXRCbHVyIiwic3RhdGUiLCJfb25Ecm9wRG93bkNoYW5nZSIsInRleHQiLCJkYXRlIiwiX2lzVmFsaWQiLCJkaXNwbGF5UGlja2VyIiwidG9JU09TdHJpbmciLCJfb25JbnB1dEZvY3VzIiwiX29uRG9jdW1lbnRDbGljayIsInRhcmdldCIsInRhcmdldENsYXNzQXR0ciIsImdldEF0dHJpYnV0ZSIsImlzVHJpZ2dlcmVkRnJvbVBpY2tlciIsImluY2x1ZGVzIiwiX2lucHV0RGF0ZUlkIiwidW5kZWZpbmVkIiwiX2hhbmRsZUtleURvd24iLCJrZXkiLCJnZXRWYWx1ZSIsInJhd1ZhbHVlIiwiYmVmb3JlVmFsdWVHZXR0ZXIiLCJ2YWxpZGF0ZSIsImlzUmVxdWlyZWQiLCJtZXNzYWdlIiwidCIsInJhd0lucHV0VmFsdWUiLCJjb21wb25lbnRXaWxsTW91bnQiLCJsb2NhbGUiLCJkb2N1bWVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJjb21wb25lbnREaWRNb3VudCIsImRyb3BzIiwic2hvd0Ryb3Bkb3ducyIsInN0YXJ0RGF0ZSIsImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJyZW5kZXIiLCJkaXNhYmxlZCIsImVycm9yIiwibmFtZSIsInBsYWNlaG9sZGVyIiwidmFsaWQiLCJfb25QaWNrZXJDbG9zZXJDbGljayIsImlucHV0UHJvcHMiLCJkaXNwbGF5TmFtZSIsInByb3BUeXBlcyIsIm9uZU9mIiwib25lT2ZUeXBlIiwic3RyaW5nIiwiYm9vbCIsImZ1bmMiLCJwcm9wTmFtZSIsImNvbXBvbmVudE5hbWUiLCJwcm9wIiwiRXJyb3IiLCJkZWZhdWx0UHJvcHMiLCJjb25zb2xlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7Ozs7OytlQVRBOzs7QUFXQSxJQUFNQSxjQUFjLFNBQWRBLFdBQWM7QUFBQSxXQUFTLHNCQUFPQyxLQUFQLEVBQWMsaUJBQU9DLFFBQXJCLEVBQStCQyxPQUEvQixFQUFUO0FBQUEsQ0FBcEI7O0lBRU1DLFM7Y0FBQUEsUzs7QUFDRixhQURFQSxTQUNGLENBQVlDLEtBQVosRUFBbUI7QUFBQSw4QkFEakJELFNBQ2lCOztBQUFBLHFEQUNmLHNCQUFNQyxLQUFOLENBRGU7O0FBQUEsY0FrQ25CQyxxQkFsQ21CLEdBa0NLO0FBQUEsbUJBQVMsTUFBS0MsZUFBTCxDQUFxQk4sS0FBckIsRUFBNEJFLE9BQTVCLEVBQVQ7QUFBQSxTQWxDTDs7QUFBQSxjQW9DbkJJLGVBcENtQixHQW9DRCxxQkFBYTtBQUFBLGdCQUNwQkMsTUFEb0IsR0FDVixNQUFLSCxLQURLLENBQ3BCRyxNQURvQjs7QUFFM0IsbUJBQU8sc0JBQU9DLFNBQVAsRUFBa0JELE1BQWxCLENBQVA7QUFDSCxTQXZDa0I7O0FBQUEsY0F5Q25CRSxXQXpDbUIsR0F5Q0wsbUJBQVc7QUFBQSxnQkFDaEJGLE1BRGdCLEdBQ04sTUFBS0gsS0FEQyxDQUNoQkcsTUFEZ0I7O0FBRXJCLGdCQUFJUixZQUFZVyxPQUFaLENBQUosRUFBMEI7QUFDdEIsb0JBQUksdUJBQVFILE1BQVIsQ0FBSixFQUFxQjtBQUNqQkEsNkJBQVNBLE9BQU8sQ0FBUCxDQUFUO0FBQ0g7QUFDRCx1QkFBTyxzQkFBT0csT0FBUCxFQUFnQixpQkFBT1QsUUFBdkIsRUFBaUNN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dUJBQW1CLGlCQUFVK0IsSUFBVixDQUFlN0IsVUFUZjtBQVVuQm1CLGlCQUFhLGlCQUFVUSxNQVZKO0FBV25CakIsbUJBQWUsaUJBQVVrQixJQUFWLENBQWU1QixVQVhYO0FBWW5CRyxtQkFBZSx1QkFBQ3RDLEtBQUQsRUFBUWlFLFFBQVIsRUFBa0JDLGFBQWxCLEVBQW9DO0FBQy9DLFlBQU1DLE9BQU9uRSxNQUFNaUUsUUFBTixDQUFiO0FBQ0EsWUFBSUUsUUFBUSxDQUFDeEUsWUFBWXdFLElBQVosQ0FBYixFQUFnQztBQUM1QixrQkFBTSxJQUFJQyxLQUFKLGVBQXNCRCxJQUF0QixtQ0FBd0RELGFBQXhELDhEQUFOO0FBQ0g7QUFDSixLQWpCa0I7QUFrQm5CWCxXQUFPLGlCQUFVUSxJQWxCRTtBQW1CbkI3QixjQUFVLGlCQUFVOEI7QUFuQkQsQ0FBdkI7QUFxQkFqRSxVQUFVc0UsWUFBVixHQUEwQjtBQUN0QnpCLFdBQU8sTUFEZTtBQUV0QlEsV0FBTywyQ0FGZTtBQUd0QlosWUFBUSxJQUhjO0FBSXRCckMsWUFBUSxZQUpjO0FBS3RCOEIsdUJBQW1CO0FBQUEsZUFBU3JDLEtBQVQ7QUFBQSxLQUxHO0FBTXRCOzs7QUFHQWUsWUFUc0Isc0JBU1g7QUFDUDJELGdCQUFRbEIsS0FBUixDQUFjLCtFQUFkO0FBQ0gsS0FYcUI7O0FBWXRCUCxtQkFBZSxJQVpPO0FBYXRCVSxXQUFPLElBYmU7QUFjdEJyQixjQUFVdkM7QUFkWSxDQUExQjtrQkFnQmVJLFMiLCJmaWxlIjoiZnItRlIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBEZXBlbmRlbmNpZXNcclxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50LCBQcm9wVHlwZXN9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XHJcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IGkxOG5leHQgZnJvbSAnaTE4bmV4dCc7XHJcbmltcG9ydCBJbnB1dFRleHQgZnJvbSAnLi4vaW5wdXQtdGV4dCc7XHJcbmltcG9ydCBEYXRlUGlja2VyIGZyb20gJ3JlYWN0LWRhdGUtcGlja2VyJztcclxuaW1wb3J0IGlzQXJyYXkgZnJvbSAnbG9kYXNoL2lzQXJyYXknO1xyXG5pbXBvcnQgdW5pcXVlSWQgZnJvbSAnbG9kYXNoL3VuaXF1ZUlkJztcclxuaW1wb3J0IGNsb3Nlc3QgZnJvbSAnY2xvc2VzdCc7XHJcblxyXG5jb25zdCBpc0lTT1N0cmluZyA9IHZhbHVlID0+IG1vbWVudCh2YWx1ZSwgbW9tZW50LklTT184NjAxKS5pc1ZhbGlkKCk7XHJcblxyXG5jbGFzcyBJbnB1dERhdGUgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgY29uc3Qge3Jhd0lucHV0VmFsdWV9ID0gcHJvcHM7XHJcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGRyb3BEb3duRGF0ZTogaXNJU09TdHJpbmcocmF3SW5wdXRWYWx1ZSkgPyBtb21lbnQocmF3SW5wdXRWYWx1ZSwgbW9tZW50LklTT184NjAxKSA6IG1vbWVudCgpLFxyXG4gICAgICAgICAgICBpbnB1dERhdGU6IHRoaXMuX2Zvcm1hdERhdGUocmF3SW5wdXRWYWx1ZSksXHJcbiAgICAgICAgICAgIGRpc3BsYXlQaWNrZXI6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XHJcbiAgICAgICAgdGhpcy5faW5wdXREYXRlSWQgPSB1bmlxdWVJZCgnaW5wdXQtZGF0ZS0nKTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsTW91bnQoKSB7XHJcbiAgICAgICAgbW9tZW50LmxvY2FsZSh0aGlzLnByb3BzLmxvY2FsZSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkRvY3VtZW50Q2xpY2spO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcclxuICAgICAgICBjb25zdCB7ZHJvcHMsIHNob3dEcm9wZG93bnN9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICBjb25zdCB7aW5wdXREYXRlOiBzdGFydERhdGV9ID0gdGhpcy5zdGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHtyYXdJbnB1dFZhbHVlfSkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBkcm9wRG93bkRhdGU6IGlzSVNPU3RyaW5nKHJhd0lucHV0VmFsdWUpID8gbW9tZW50KHJhd0lucHV0VmFsdWUsIG1vbWVudC5JU09fODYwMSkgOiBtb21lbnQoKSxcclxuICAgICAgICAgICAgaW5wdXREYXRlOiB0aGlzLl9mb3JtYXREYXRlKHJhd0lucHV0VmFsdWUpXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkRvY3VtZW50Q2xpY2spO1xyXG4gICAgfVxyXG5cclxuICAgIF9pc0lucHV0Rm9ybWF0Q29ycmVjdCA9IHZhbHVlID0+IHRoaXMuX3BhcnNlSW5wdXREYXRlKHZhbHVlKS5pc1ZhbGlkKCk7XHJcblxyXG4gICAgX3BhcnNlSW5wdXREYXRlID0gaW5wdXREYXRlID0+IHtcclxuICAgICAgICBjb25zdCB7Zm9ybWF0fSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgcmV0dXJuIG1vbWVudChpbnB1dERhdGUsIGZvcm1hdCk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9mb3JtYXREYXRlID0gaXNvRGF0ZSA9PiB7XHJcbiAgICAgICAgbGV0IHtmb3JtYXR9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICBpZiAoaXNJU09TdHJpbmcoaXNvRGF0ZSkpIHtcclxuICAgICAgICAgICAgaWYgKGlzQXJyYXkoZm9ybWF0KSkge1xyXG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0WzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQoaXNvRGF0ZSwgbW9tZW50LklTT184NjAxKS5mb3JtYXQoZm9ybWF0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gaXNvRGF0ZTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIF9vbklucHV0Q2hhbmdlID0gKGlucHV0RGF0ZSwgZnJvbUJsdXIpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5faXNJbnB1dEZvcm1hdENvcnJlY3QoaW5wdXREYXRlKSkge1xyXG4gICAgICAgICAgICBjb25zdCBkcm9wRG93bkRhdGUgPSB0aGlzLl9wYXJzZUlucHV0RGF0ZShpbnB1dERhdGUpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtkcm9wRG93bkRhdGUsIGlucHV0RGF0ZX0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2lucHV0RGF0ZX0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihmcm9tQmx1ciAhPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKGlucHV0RGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfb25JbnB1dEJsdXIgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3Qge2lucHV0RGF0ZX0gPSB0aGlzLnN0YXRlO1xyXG4gICAgICAgIHRoaXMuX29uSW5wdXRDaGFuZ2UoaW5wdXREYXRlLCB0cnVlKTtcclxuICAgIH07XHJcblxyXG4gICAgX29uRHJvcERvd25DaGFuZ2UgPSAodGV4dCwgZGF0ZSkgPT4ge1xyXG4gICAgICAgIGlmIChkYXRlLl9pc1ZhbGlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2Rpc3BsYXlQaWNrZXI6IGZhbHNlfSwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZShkYXRlLnRvSVNPU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb25JbnB1dENoYW5nZSh0aGlzLl9mb3JtYXREYXRlKGRhdGUudG9JU09TdHJpbmcoKSksIHRydWUpIC8vIEFkZCAxMiBob3VycyB0byBhdm9pZCBza2lwcGluZyBhIGRheSBkdWUgdG8gZGlmZmVyZW50IGxvY2FsZXNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfb25JbnB1dEZvY3VzID0gKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2Rpc3BsYXlQaWNrZXI6IHRydWV9KTtcclxuICAgIH07XHJcblxyXG4gICAgX29uRG9jdW1lbnRDbGljayA9ICh7dGFyZ2V0fSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldENsYXNzQXR0ciA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJyk7XHJcbiAgICAgICAgY29uc3QgaXNUcmlnZ2VyZWRGcm9tUGlja2VyID0gdGFyZ2V0Q2xhc3NBdHRyID8gdGFyZ2V0Q2xhc3NBdHRyLmluY2x1ZGVzKCdkcC1jZWxsJykgOiBmYWxzZTsgLy90aGlzIGlzIHRoZSBvbmx5IHdheSB0byBjaGVjayB0aGUgdGFyZ2V0IGNvbWVzIGZyb20gcGlja2VyIGNhdXNlIGF0IHRoaXMgc3RhZ2UsIG1vbnRoIGFuZCB5ZWFyIGRpdiBhcmUgdW5tb3VudGVkIGJ5IFJlYWN0LlxyXG4gICAgICAgIGlmKCFpc1RyaWdnZXJlZEZyb21QaWNrZXIpIHtcclxuICAgICAgICAgICAgLy9pZiB0YXJnZXQgd2FzIG5vdCB0cmlnZ2VyZWQgaW5zaWRlIHRoZSBkYXRlIHBpY2tlciwgd2UgY2hlY2sgaXQgd2FzIG5vdCB0cmlnZ2VyZWQgYnkgdGhlIGlucHV0XHJcbiAgICAgICAgICAgIGlmIChjbG9zZXN0KHRhcmdldCwgYFtkYXRhLWlkPScke3RoaXMuX2lucHV0RGF0ZUlkfSddYCwgdHJ1ZSkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7ZGlzcGxheVBpY2tlcjogZmFsc2V9LCAoKSA9PiB0aGlzLl9vbklucHV0Qmx1cigpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgX2hhbmRsZUtleURvd24gPSAoe2tleX0pID0+IHtcclxuICAgICAgICBpZiAoa2V5ID09PSAnVGFiJyB8fCBrZXkgPT09ICdFbnRlcicpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7ZGlzcGxheVBpY2tlcjogZmFsc2V9LCAoKSA9PiB0aGlzLl9vbklucHV0Qmx1cigpKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGdldFZhbHVlID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHtpbnB1dERhdGV9ID0gdGhpcy5zdGF0ZTtcclxuICAgICAgICBjb25zdCByYXdWYWx1ZSA9IHRoaXMuX2lzSW5wdXRGb3JtYXRDb3JyZWN0KGlucHV0RGF0ZSkgPyB0aGlzLl9wYXJzZUlucHV0RGF0ZShpbnB1dERhdGUpLnRvSVNPU3RyaW5nKCkgOiBudWxsO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLmJlZm9yZVZhbHVlR2V0dGVyKHJhd1ZhbHVlKTtcclxuICAgIH07XHJcblxyXG4gICAgdmFsaWRhdGUgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3Qge2lucHV0RGF0ZX0gPSB0aGlzLnN0YXRlO1xyXG4gICAgICAgIGNvbnN0IHtpc1JlcXVpcmVkfSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgaWYgKCcnID09PSBpbnB1dERhdGUgfHwgIWlucHV0RGF0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gKHtcclxuICAgICAgICAgICAgICAgIGlzVmFsaWQ6ICFpc1JlcXVpcmVkLFxyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ2ZvY3VzLmNvbXBvbmVudHMuZmllbGQucmVxdWlyZWQnXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoe1xyXG4gICAgICAgICAgICAgICAgaXNWYWxpZDogdGhpcy5faXNJbnB1dEZvcm1hdENvcnJlY3QoaW5wdXREYXRlKSxcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGkxOG5leHQudCgnZm9jdXMuY29tcG9uZW50cy5pbnB1dC5kYXRlLmludmFsaWQnLCB7ZGF0ZTogaW5wdXREYXRlfSlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge2Rpc2FibGVkLCBlcnJvciwgbG9jYWxlLCBuYW1lLCBwbGFjZWhvbGRlciwgdmFsaWR9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICBjb25zdCB7ZHJvcERvd25EYXRlLCBpbnB1dERhdGUsIGRpc3BsYXlQaWNrZXJ9ID0gdGhpcy5zdGF0ZTtcclxuICAgICAgICBjb25zdCB7X29uSW5wdXRCbHVyLCBfb25JbnB1dENoYW5nZSwgX29uSW5wdXRGb2N1cywgX29uRHJvcERvd25DaGFuZ2UsIF9vblBpY2tlckNsb3NlckNsaWNrLCBfaGFuZGxlS2V5RG93bn0gPSB0aGlzO1xyXG4gICAgICAgIGNvbnN0IGlucHV0UHJvcHMgPSB7IGRpc2FibGVkIH07XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPGRpdiBkYXRhLWZvY3VzPSdpbnB1dC1kYXRlJyBkYXRhLWlkPXt0aGlzLl9pbnB1dERhdGVJZH0+XHJcbiAgICAgICAgICAgICAgICA8SW5wdXRUZXh0IGVycm9yPXtlcnJvcn0gbmFtZT17bmFtZX0gb25DaGFuZ2U9e19vbklucHV0Q2hhbmdlfSBvbktleURvd249e19oYW5kbGVLZXlEb3dufSBvbkZvY3VzPXtfb25JbnB1dEZvY3VzfSBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9IHJlZj0naW5wdXQnIHJhd0lucHV0VmFsdWU9e2lucHV0RGF0ZX0gdmFsaWQ9e3ZhbGlkfSB7Li4uaW5wdXRQcm9wc30gLz5cclxuICAgICAgICAgICAgICAgIHtkaXNwbGF5UGlja2VyICYmXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWZvY3VzPSdwaWNrZXItem9uZSc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxEYXRlUGlja2VyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlPXtkcm9wRG93bkRhdGV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRlRm9vdGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGU9e2xvY2FsZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtfb25Ecm9wRG93bkNoYW5nZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0ncGlja2VyJyAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICApO1xyXG4gICAgfVxyXG59XHJcblxyXG5JbnB1dERhdGUuZGlzcGxheU5hbWUgPSAnSW5wdXREYXRlJztcclxuSW5wdXREYXRlLnByb3BUeXBlcyA9ICB7XHJcbiAgICBkcm9wczogUHJvcFR5cGVzLm9uZU9mKFsndXAnLCAnZG93biddKS5pc1JlcXVpcmVkLFxyXG4gICAgZXJyb3I6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xyXG4gICAgICAgIFByb3BUeXBlcy5zdHJpbmcsXHJcbiAgICAgICAgUHJvcFR5cGVzLmJvb2xcclxuICAgIF0pLFxyXG4gICAgbG9jYWxlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXHJcbiAgICBuYW1lOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXHJcbiAgICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcclxuICAgIGJlZm9yZVZhbHVlR2V0dGVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxyXG4gICAgcGxhY2Vob2xkZXI6IFByb3BUeXBlcy5zdHJpbmcsXHJcbiAgICBzaG93RHJvcGRvd25zOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxyXG4gICAgcmF3SW5wdXRWYWx1ZTogKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHByb3AgPSBwcm9wc1twcm9wTmFtZV07XHJcbiAgICAgICAgaWYgKHByb3AgJiYgIWlzSVNPU3RyaW5nKHByb3ApKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGRhdGUgJHtwcm9wfSBwcm92aWRlZCB0byB0aGUgY29tcG9uZW50ICR7Y29tcG9uZW50TmFtZX0gaXMgbm90IGFuIElTTyBkYXRlLiBQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIGRhdGUgc3RyaW5nLmApO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB2YWxpZDogUHJvcFR5cGVzLmJvb2wsXHJcbiAgICB2YWxpZGF0ZTogUHJvcFR5cGVzLmZ1bmNcclxufTtcclxuSW5wdXREYXRlLmRlZmF1bHRQcm9wcyA9ICB7XHJcbiAgICBkcm9wczogJ2Rvd24nLFxyXG4gICAgZXJyb3I6ICdmb2N1cy5jb21wb25lbnRzLmlucHV0LmRhdGUuZXJyb3IuZGVmYXVsdCcsXHJcbiAgICBsb2NhbGU6ICdlbicsXHJcbiAgICBmb3JtYXQ6ICdNTS9ERC9ZWVlZJyxcclxuICAgIGJlZm9yZVZhbHVlR2V0dGVyOiB2YWx1ZSA9PiB2YWx1ZSxcclxuICAgIC8qKlxyXG4gICAgKiBEZWZhdWx0IG9uQ2hhbmdlIHByb3AsIHRoYXQgd2lsbCBsb2cgYW4gZXJyb3IuXHJcbiAgICAqL1xyXG4gICAgb25DaGFuZ2UoKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignWW91IGRpZCBub3QgZ2l2ZSBhbiBvbkNoYW5nZSBtZXRob2QgdG8gYW4gaW5wdXQgZGF0ZSwgcGxlYXNlIGNoZWNrIHlvdXIgY29kZS4nKTtcclxuICAgIH0sXHJcbiAgICBzaG93RHJvcGRvd25zOiB0cnVlLFxyXG4gICAgdmFsaWQ6IHRydWUsXHJcbiAgICB2YWxpZGF0ZTogaXNJU09TdHJpbmdcclxufTtcclxuZXhwb3J0IGRlZmF1bHQgSW5wdXREYXRlO1xyXG4iXX0=
;