UNPKG

focus-components-v3

Version:

Focus web components to build applications (based on Material Design)

318 lines (269 loc) 30.4 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 _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactDom = require('react-dom'); var _reactDom2 = _interopRequireDefault(_reactDom); var _includes = require('lodash/includes'); var _includes2 = _interopRequireDefault(_includes); var _i18next = require('i18next'); var _i18next2 = _interopRequireDefault(_i18next); 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); } /** * Small overlay component used to listen to scroll and prevent it to leave the Modal component */ var ModalOverlay = function (_Component) { _inherits(ModalOverlay, _Component); function ModalOverlay(props) { _classCallCheck(this, ModalOverlay); var _this = _possibleConstructorReturn(this, _Component.call(this, props)); _this._hideBodyOverflow = _this._hideBodyOverflow.bind(_this); _this._restoreBodyOverflow = _this._restoreBodyOverflow.bind(_this); return _this; } ModalOverlay.prototype.componentDidMount = function componentDidMount() { this._hideBodyOverflow(); }; /** * Store the body overgflow property, and set it to hidden * @private */ ModalOverlay.prototype._hideBodyOverflow = function _hideBodyOverflow() { document.body.style['overflow-y'] = 'hidden'; }; /** * Restore body overflow property * @private */ ModalOverlay.prototype._restoreBodyOverflow = function _restoreBodyOverflow() { document.body.style['overflow-y'] = 'auto'; }; /** * Component will unmount event handler. * Remove the mouse wheel listener. */ ModalOverlay.prototype.componentWillUnmount = function componentWillUnmount() { // ReactDOM.findDOMNode(this.refs.overlay).removeEventListener('mousewheel', this._onScroll); this._restoreBodyOverflow(); }; /** * Render the component * @return {XML} the rendered HTML */ ModalOverlay.prototype.render = function render() { var _props = this.props, children = _props.children, clickHandler = _props.clickHandler, show = _props.show; var otherProps = clickHandler ? { onClick: clickHandler } : {}; return _react2.default.createElement( 'div', _extends({ className: 'animated fadeIn', 'data-animation': 'fadeIn', 'data-closing-animation': 'fadeOut', 'data-focus': 'modal-overlay', 'data-visible': show, ref: 'overlay' }, otherProps), children ); }; return ModalOverlay; }(_react.Component); ; ModalOverlay.displayName = 'ModalOverlay'; ModalOverlay.propTypes = { children: _react.PropTypes.object, clickHandler: _react.PropTypes.func, show: _react.PropTypes.bool }; ModalOverlay.defaultProps = { show: false }; /** * The modal component configuration * @type {Object} */ var Modal = function (_Component2) { _inherits(Modal, _Component2); function Modal(props) { _classCallCheck(this, Modal); var _this2 = _possibleConstructorReturn(this, _Component2.call(this, props)); _this2._onWheel = _this2._onWheel.bind(_this2); _this2.toggleOpen = _this2.toggleOpen.bind(_this2); _this2._getAnimationProps = _this2._getAnimationProps.bind(_this2); _this2._closePopin = _this2._closePopin.bind(_this2); _this2.state = { opened: _this2.props.open }; return _this2; } Modal.prototype.componentWillUnmount = function componentWillUnmount() { window.clearTimeout(this._openTimeoutID); }; /** * Wheel event handler. * @param {object} event wheel event */ Modal.prototype._onWheel = function _onWheel(event) { _reactDom2.default.findDOMNode(this.refs['modal-window']).scrollTop += 0 < event.deltaY ? 100 : -100; }; Modal.prototype._closePopin = function _closePopin() { var _this3 = this; var timeout = 0; if (opened) { var modalWindow = _reactDom2.default.findDOMNode(this.refs['modal-window']); var modalOverlay = _reactDom2.default.findDOMNode(this.refs['modal-overlay']); modalWindow.classList.remove(modalWindow.getAttribute('data-animation')); modalWindow.classList.add(modalWindow.getAttribute('data-closing-animation')); modalOverlay.classList.remove(modalOverlay.getAttribute('data-animation')); modalOverlay.classList.add(modalOverlay.getAttribute('data-closing-animation')); timeout = 200; } var opened = this.state.opened; var onModalClose = this.props.onModalClose; if (opened && onModalClose) { onModalClose(); } this._openTimeoutID = setTimeout(function () { // Store the current modal state var wasOpened = _this3.state.opened; // If it was opened, then we are closing it, so restore the body overflow before closing. if (wasOpened && _this3.refs['modal-overlay']) { _this3.refs['modal-overlay']._restoreBodyOverflow(); } _this3.setState({ opened: !wasOpened }, function () { if (_this3.refs['modal-overlay']) { if (!wasOpened) { // We just opened the modal, so store and hide the body overflow. _this3.refs['modal-overlay']._hideBodyOverflow(); } } }); }, timeout); }; /** * Toggle the modal's open state */ Modal.prototype.toggleOpen = function toggleOpen() { var opened = this.state.opened; var _props2 = this.props, ConfirmContentComponent = _props2.ConfirmContentComponent, confirmFunction = _props2.confirmFunction; if (opened && confirmFunction) { confirmFunction(ConfirmContentComponent, { resolve: this._closePopin }); } else { this._closePopin(); } }; /** * Render the component * @return {XML} the rendered HTML */ Modal.prototype.render = function render() { // test for this.state.opened and return an Overlay component if true var _props3 = this.props, children = _props3.children, level = _props3.level, modal = _props3.modal, overlay = _props3.overlay, size = _props3.size, type = _props3.type; var animationProps = this._getAnimationProps(); return _react2.default.createElement( 'div', { 'data-focus': 'modal', 'data-level': level, 'data-size': size, 'data-type': type }, this.state.opened && _react2.default.createElement( ModalOverlay, { clickHandler: !modal && this.toggleOpen, ref: 'modal-overlay', resize: 'full' === type, show: overlay }, _react2.default.createElement( 'div', _extends({}, animationProps, { 'data-focus': 'modal-window', onClick: this._preventModalClose, ref: 'modal-window' }), _react2.default.createElement( 'i', { className: 'material-icons', 'data-focus': 'modal-window-close', onClick: this.toggleOpen }, 'close' ), _react2.default.createElement( 'div', { onWheel: this._onWheel }, children ) ) ) ); }; /** * Compute the animation classes * @return {Object} the props to attach to the component * @private */ Modal.prototype._getAnimationProps = function _getAnimationProps() { var openingAnimation = void 0; var closingAnimation = void 0; switch (this.props.type) { case 'from-menu': openingAnimation = 'slideInLeft'; closingAnimation = 'slideOutLeft'; break; case 'from-right': openingAnimation = 'slideInRight'; closingAnimation = 'slideOutRight'; break; default: openingAnimation = 'zoomIn'; closingAnimation = 'zoomOut'; break; } return { className: 'animated ' + openingAnimation, 'data-animation': openingAnimation, 'data-closing-animation': closingAnimation }; }; /** * Prevent modal close when there's a click on the modal window * @param {Object} event - raised by the click * @private */ Modal.prototype._preventModalClose = function _preventModalClose(event) { event.stopPropagation(); }; return Modal; }(_react.Component); ; Modal.displayName = 'Modal'; Modal.defaultProps = { ConfirmContentComponent: function ConfirmContentComponent() { return _react2.default.createElement( 'span', null, _i18next2.default.t('focus.components.modal.confirmation.text') ); }, level: 0, modal: false, open: false, overlay: true, size: 'medium', type: 'full' }; Modal.propTypes = { confirmFunction: _react.PropTypes.func, ConfirmContentComponent: _react.PropTypes.func, level: _react.PropTypes.number.isRequired, modal: _react.PropTypes.bool.isRequired, onModalClose: _react.PropTypes.func, open: _react.PropTypes.bool.isRequired, overlay: _react.PropTypes.bool.isRequired, size: _react.PropTypes.oneOf(['small', 'medium', 'large']).isRequired, type: _react.PropTypes.string.isRequired }; exports.default = Modal; module.exports = exports['default']; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZyLUZSLmpzIl0sIm5hbWVzIjpbIk1vZGFsT3ZlcmxheSIsInByb3BzIiwiX2hpZGVCb2R5T3ZlcmZsb3ciLCJiaW5kIiwiX3Jlc3RvcmVCb2R5T3ZlcmZsb3ciLCJjb21wb25lbnREaWRNb3VudCIsImRvY3VtZW50IiwiYm9keSIsInN0eWxlIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJyZW5kZXIiLCJjaGlsZHJlbiIsImNsaWNrSGFuZGxlciIsInNob3ciLCJvdGhlclByb3BzIiwib25DbGljayIsImRpc3BsYXlOYW1lIiwicHJvcFR5cGVzIiwib2JqZWN0IiwiZnVuYyIsImJvb2wiLCJkZWZhdWx0UHJvcHMiLCJNb2RhbCIsIl9vbldoZWVsIiwidG9nZ2xlT3BlbiIsIl9nZXRBbmltYXRpb25Qcm9wcyIsIl9jbG9zZVBvcGluIiwic3RhdGUiLCJvcGVuZWQiLCJvcGVuIiwid2luZG93IiwiY2xlYXJUaW1lb3V0IiwiX29wZW5UaW1lb3V0SUQiLCJldmVudCIsImZpbmRET01Ob2RlIiwicmVmcyIsInNjcm9sbFRvcCIsImRlbHRhWSIsInRpbWVvdXQiLCJtb2RhbFdpbmRvdyIsIm1vZGFsT3ZlcmxheSIsImNsYXNzTGlzdCIsInJlbW92ZSIsImdldEF0dHJpYnV0ZSIsImFkZCIsIm9uTW9kYWxDbG9zZSIsInNldFRpbWVvdXQiLCJ3YXNPcGVuZWQiLCJzZXRTdGF0ZSIsIkNvbmZpcm1Db250ZW50Q29tcG9uZW50IiwiY29uZmlybUZ1bmN0aW9uIiwicmVzb2x2ZSIsImxldmVsIiwibW9kYWwiLCJvdmVybGF5Iiwic2l6ZSIsInR5cGUiLCJhbmltYXRpb25Qcm9wcyIsIl9wcmV2ZW50TW9kYWxDbG9zZSIsIm9wZW5pbmdBbmltYXRpb24iLCJjbG9zaW5nQW5pbWF0aW9uIiwiY2xhc3NOYW1lIiwic3RvcFByb3BhZ2F0aW9uIiwidCIsIm51bWJlciIsImlzUmVxdWlyZWQiLCJvbmVPZiIsInN0cmluZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7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RlU7QUFHakJDLFdBQU8sS0FIVTtBQUlqQnhCLFVBQU0sS0FKVztBQUtqQnlCLGFBQVMsSUFMUTtBQU1qQkMsVUFBTSxRQU5XO0FBT2pCQyxVQUFNO0FBUFcsQ0FBckI7QUFTQWxDLE1BQU1MLFNBQU4sR0FBa0I7QUFDZGlDLHFCQUFpQixpQkFBVS9CLElBRGI7QUFFZDhCLDZCQUF5QixpQkFBVTlCLElBRnJCO0FBR2RpQyxXQUFPLGlCQUFVWSxNQUFWLENBQWlCQyxVQUhWO0FBSWRaLFdBQU8saUJBQVVqQyxJQUFWLENBQWU2QyxVQUpSO0FBS2RwQixrQkFBYyxpQkFBVTFCLElBTFY7QUFNZFUsVUFBTSxpQkFBVVQsSUFBVixDQUFlNkMsVUFOUDtBQU9kWCxhQUFTLGlCQUFVbEMsSUFBVixDQUFlNkMsVUFQVjtBQVFkVixVQUFNLGlCQUFVVyxLQUFWLENBQWdCLENBQUMsT0FBRCxFQUFVLFFBQVYsRUFBb0IsT0FBcEIsQ0FBaEIsRUFBOENELFVBUnRDO0FBU2RULFVBQU0saUJBQVVXLE1BQVYsQ0FBaUJGO0FBVFQsQ0FBbEI7a0JBV2UzQyxLIiwiZmlsZSI6ImZyLUZSLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzLCBDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XHJcbmltcG9ydCBpbmNsdWRlcyBmcm9tICdsb2Rhc2gvaW5jbHVkZXMnO1xyXG5pbXBvcnQgaTE4bmV4dCBmcm9tICdpMThuZXh0JztcclxuXHJcbi8qKlxyXG4qIFNtYWxsIG92ZXJsYXkgY29tcG9uZW50IHVzZWQgdG8gbGlzdGVuIHRvIHNjcm9sbCBhbmQgcHJldmVudCBpdCB0byBsZWF2ZSB0aGUgTW9kYWwgY29tcG9uZW50XHJcbiovXHJcbmNsYXNzIE1vZGFsT3ZlcmxheSBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLl9oaWRlQm9keU92ZXJmbG93ID0gdGhpcy5faGlkZUJvZHlPdmVyZmxvdy5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX3Jlc3RvcmVCb2R5T3ZlcmZsb3cgPSB0aGlzLl9yZXN0b3JlQm9keU92ZXJmbG93LmJpbmQodGhpcyk7XHJcbiAgICB9XHJcbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcclxuICAgICAgICB0aGlzLl9oaWRlQm9keU92ZXJmbG93KCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICogU3RvcmUgdGhlIGJvZHkgb3ZlcmdmbG93IHByb3BlcnR5LCBhbmQgc2V0IGl0IHRvIGhpZGRlblxyXG4gICAgKiBAcHJpdmF0ZVxyXG4gICAgKi9cclxuICAgIF9oaWRlQm9keU92ZXJmbG93KCkge1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGVbJ292ZXJmbG93LXknXSA9ICdoaWRkZW4nO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgKiBSZXN0b3JlIGJvZHkgb3ZlcmZsb3cgcHJvcGVydHlcclxuICAgICogQHByaXZhdGVcclxuICAgICovXHJcbiAgICBfcmVzdG9yZUJvZHlPdmVyZmxvdygpIHtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlWydvdmVyZmxvdy15J10gPSAnYXV0byc7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAqIENvbXBvbmVudCB3aWxsIHVubW91bnQgZXZlbnQgaGFuZGxlci5cclxuICAgICogUmVtb3ZlIHRoZSBtb3VzZSB3aGVlbCBsaXN0ZW5lci5cclxuICAgICovXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcclxuICAgICAgICAvLyBSZWFjdERPTS5maW5kRE9NTm9kZSh0aGlzLnJlZnMub3ZlcmxheSkucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V3aGVlbCcsIHRoaXMuX29uU2Nyb2xsKTtcclxuICAgICAgICB0aGlzLl9yZXN0b3JlQm9keU92ZXJmbG93KCk7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAqIFJlbmRlciB0aGUgY29tcG9uZW50XHJcbiAgICAqIEByZXR1cm4ge1hNTH0gdGhlIHJlbmRlcmVkIEhUTUxcclxuICAgICovXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge2NoaWxkcmVuLCBjbGlja0hhbmRsZXIsIHNob3d9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICBjb25zdCBvdGhlclByb3BzID0gY2xpY2tIYW5kbGVyID8geyBvbkNsaWNrOiBjbGlja0hhbmRsZXIgfSA6IHt9O1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdhbmltYXRlZCBmYWRlSW4nIGRhdGEtYW5pbWF0aW9uPSdmYWRlSW4nIGRhdGEtY2xvc2luZy1hbmltYXRpb249J2ZhZGVPdXQnIGRhdGEtZm9jdXM9J21vZGFsLW92ZXJsYXknIGRhdGEtdmlzaWJsZT17c2hvd30gcmVmPSdvdmVybGF5JyB7Li4ub3RoZXJQcm9wc30+XHJcbiAgICAgICAgICAgICAgICB7Y2hpbGRyZW59XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICk7XHJcbiAgICB9O1xyXG59O1xyXG5Nb2RhbE92ZXJsYXkuZGlzcGxheU5hbWUgPSAnTW9kYWxPdmVybGF5JztcclxuTW9kYWxPdmVybGF5LnByb3BUeXBlcyA9IHtcclxuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMub2JqZWN0LFxyXG4gICAgY2xpY2tIYW5kbGVyOiBQcm9wVHlwZXMuZnVuYyxcclxuICAgIHNob3c6IFByb3BUeXBlcy5ib29sXHJcbn07XHJcbk1vZGFsT3ZlcmxheS5kZWZhdWx0UHJvcHMgPSB7XHJcbiAgICBzaG93OiBmYWxzZVxyXG59O1xyXG5cclxuXHJcbi8qKlxyXG4qIFRoZSBtb2RhbCBjb21wb25lbnQgY29uZmlndXJhdGlvblxyXG4qIEB0eXBlIHtPYmplY3R9XHJcbiovXHJcbmNsYXNzIE1vZGFsIGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuX29uV2hlZWwgPSB0aGlzLl9vbldoZWVsLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy50b2dnbGVPcGVuID0gdGhpcy50b2dnbGVPcGVuLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fZ2V0QW5pbWF0aW9uUHJvcHMgPSB0aGlzLl9nZXRBbmltYXRpb25Qcm9wcy5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX2Nsb3NlUG9waW4gPSB0aGlzLl9jbG9zZVBvcGluLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgb3BlbmVkOiB0aGlzLnByb3BzLm9wZW5cclxuICAgICAgICB9O1xyXG4gICAgfTtcclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcclxuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX29wZW5UaW1lb3V0SUQpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICogV2hlZWwgZXZlbnQgaGFuZGxlci5cclxuICAgICogQHBhcmFtICB7b2JqZWN0fSBldmVudCB3aGVlbCBldmVudFxyXG4gICAgKi9cclxuICAgIF9vbldoZWVsKGV2ZW50KSB7XHJcbiAgICAgICAgUmVhY3RET00uZmluZERPTU5vZGUodGhpcy5yZWZzWydtb2RhbC13aW5kb3cnXSkuc2Nyb2xsVG9wICs9IDAgPCBldmVudC5kZWx0YVkgPyAxMDAgOiAtMTAwO1xyXG4gICAgfTtcclxuXHJcbiAgICBfY2xvc2VQb3BpbigpIHtcclxuICAgICAgICBsZXQgdGltZW91dCA9IDA7XHJcbiAgICAgICAgaWYgKG9wZW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBtb2RhbFdpbmRvdyA9IFJlYWN0RE9NLmZpbmRET01Ob2RlKHRoaXMucmVmc1snbW9kYWwtd2luZG93J10pO1xyXG4gICAgICAgICAgICBjb25zdCBtb2RhbE92ZXJsYXkgPSBSZWFjdERPTS5maW5kRE9NTm9kZSh0aGlzLnJlZnNbJ21vZGFsLW92ZXJsYXknXSk7XHJcbiAgICAgICAgICAgIG1vZGFsV2luZG93LmNsYXNzTGlzdC5yZW1vdmUobW9kYWxXaW5kb3cuZ2V0QXR0cmlidXRlKCdkYXRhLWFuaW1hdGlvbicpKTtcclxuICAgICAgICAgICAgbW9kYWxXaW5kb3cuY2xhc3NMaXN0LmFkZChtb2RhbFdpbmRvdy5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2xvc2luZy1hbmltYXRpb24nKSk7XHJcbiAgICAgICAgICAgIG1vZGFsT3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKG1vZGFsT3ZlcmxheS5nZXRBdHRyaWJ1dGUoJ2RhdGEtYW5pbWF0aW9uJykpO1xyXG4gICAgICAgICAgICBtb2RhbE92ZXJsYXkuY2xhc3NMaXN0LmFkZChtb2RhbE92ZXJsYXkuZ2V0QXR0cmlidXRlKCdkYXRhLWNsb3NpbmctYW5pbWF0aW9uJykpO1xyXG4gICAgICAgICAgICB0aW1lb3V0ID0gMjAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB7b3BlbmVkfSA9IHRoaXMuc3RhdGU7XHJcbiAgICAgICAgY29uc3Qge29uTW9kYWxDbG9zZX0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIGlmIChvcGVuZWQgJiYgb25Nb2RhbENsb3NlKSB7XHJcbiAgICAgICAgICAgIG9uTW9kYWxDbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9vcGVuVGltZW91dElEID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBjdXJyZW50IG1vZGFsIHN0YXRlXHJcbiAgICAgICAgICAgIGNvbnN0IHdhc09wZW5lZCA9IHRoaXMuc3RhdGUub3BlbmVkO1xyXG4gICAgICAgICAgICAvLyBJZiBpdCB3YXMgIG9wZW5lZCwgdGhlbiB3ZSBhcmUgY2xvc2luZyBpdCwgc28gcmVzdG9yZSB0aGUgYm9keSBvdmVyZmxvdyBiZWZvcmUgY2xvc2luZy5cclxuICAgICAgICAgICAgaWYgKHdhc09wZW5lZCAmJiB0aGlzLnJlZnNbJ21vZGFsLW92ZXJsYXknXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWZzWydtb2RhbC1vdmVybGF5J10uX3Jlc3RvcmVCb2R5T3ZlcmZsb3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIG9wZW5lZDogIXdhc09wZW5lZFxyXG4gICAgICAgICAgICB9LCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWZzWydtb2RhbC1vdmVybGF5J10pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXdhc09wZW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBqdXN0IG9wZW5lZCB0aGUgbW9kYWwsIHNvIHN0b3JlIGFuZCBoaWRlIHRoZSBib2R5IG92ZXJmbG93LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnNbJ21vZGFsLW92ZXJsYXknXS5faGlkZUJvZHlPdmVyZmxvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSwgdGltZW91dCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFRvZ2dsZSB0aGUgbW9kYWwncyBvcGVuIHN0YXRlXHJcbiAgICAqL1xyXG4gICAgdG9nZ2xlT3BlbigpIHtcclxuICAgICAgICBjb25zdCB7b3BlbmVkfSA9IHRoaXMuc3RhdGU7XHJcbiAgICAgICAgY29uc3Qge0NvbmZpcm1Db250ZW50Q29tcG9uZW50LCBjb25maXJtRnVuY3Rpb259ID0gdGhpcy5wcm9wcztcclxuICAgICAgICBpZihvcGVuZWQgJiYgY29uZmlybUZ1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgIGNvbmZpcm1GdW5jdGlvbihcclxuICAgICAgICAgICAgICAgIENvbmZpcm1Db250ZW50Q29tcG9uZW50LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmU6IHRoaXMuX2Nsb3NlUG9waW5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9jbG9zZVBvcGluKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICogUmVuZGVyIHRoZSBjb21wb25lbnRcclxuICAgICogQHJldHVybiB7WE1MfSB0aGUgcmVuZGVyZWQgSFRNTFxyXG4gICAgKi9cclxuICAgIHJlbmRlcigpIHsgLy8gdGVzdCBmb3IgdGhpcy5zdGF0ZS5vcGVuZWQgYW5kIHJldHVybiBhbiBPdmVybGF5IGNvbXBvbmVudCBpZiB0cnVlXHJcbiAgICAgICAgY29uc3Qge2NoaWxkcmVuLCBsZXZlbCwgbW9kYWwsIG92ZXJsYXksIHNpemUsIHR5cGV9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICBjb25zdCBhbmltYXRpb25Qcm9wcyA9IHRoaXMuX2dldEFuaW1hdGlvblByb3BzKCk7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPGRpdiBkYXRhLWZvY3VzPSdtb2RhbCcgZGF0YS1sZXZlbD17bGV2ZWx9IGRhdGEtc2l6ZT17c2l6ZX0gZGF0YS10eXBlPXt0eXBlfSA+XHJcbiAgICAgICAgICAgICAgICB7dGhpcy5zdGF0ZS5vcGVuZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICA8TW9kYWxPdmVybGF5IGNsaWNrSGFuZGxlcj17IW1vZGFsICYmIHRoaXMudG9nZ2xlT3Blbn0gcmVmPSdtb2RhbC1vdmVybGF5JyByZXNpemU9eydmdWxsJyA9PT0gdHlwZX0gc2hvdz17b3ZlcmxheX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgey4uLmFuaW1hdGlvblByb3BzfSBkYXRhLWZvY3VzPSdtb2RhbC13aW5kb3cnIG9uQ2xpY2s9e3RoaXMuX3ByZXZlbnRNb2RhbENsb3NlfSByZWY9J21vZGFsLXdpbmRvdyc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9J21hdGVyaWFsLWljb25zJyBkYXRhLWZvY3VzPSdtb2RhbC13aW5kb3ctY2xvc2UnIG9uQ2xpY2s9e3RoaXMudG9nZ2xlT3Blbn0+Y2xvc2U8L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG9uV2hlZWw9e3RoaXMuX29uV2hlZWx9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjaGlsZHJlbn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L01vZGFsT3ZlcmxheT5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIENvbXB1dGUgdGhlIGFuaW1hdGlvbiBjbGFzc2VzXHJcbiAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIHByb3BzIHRvIGF0dGFjaCB0byB0aGUgY29tcG9uZW50XHJcbiAgICAqIEBwcml2YXRlXHJcbiAgICAqL1xyXG4gICAgX2dldEFuaW1hdGlvblByb3BzKCkge1xyXG4gICAgICAgIGxldCBvcGVuaW5nQW5pbWF0aW9uO1xyXG4gICAgICAgIGxldCBjbG9zaW5nQW5pbWF0aW9uO1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5wcm9wcy50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ2Zyb20tbWVudSc6XHJcbiAgICAgICAgICAgIG9wZW5pbmdBbmltYXRpb24gPSAnc2xpZGVJbkxlZnQnO1xyXG4gICAgICAgICAgICBjbG9zaW5nQW5pbWF0aW9uID0gJ3NsaWRlT3V0TGVmdCc7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdmcm9tLXJpZ2h0JzpcclxuICAgICAgICAgICAgb3BlbmluZ0FuaW1hdGlvbiA9ICdzbGlkZUluUmlnaHQnO1xyXG4gICAgICAgICAgICBjbG9zaW5nQW5pbWF0aW9uID0gJ3NsaWRlT3V0UmlnaHQnO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgb3BlbmluZ0FuaW1hdGlvbiA9ICd6b29tSW4nO1xyXG4gICAgICAgICAgICBjbG9zaW5nQW5pbWF0aW9uID0gJ3pvb21PdXQnO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICh7XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZTogYGFuaW1hdGVkICR7b3BlbmluZ0FuaW1hdGlvbn1gLFxyXG4gICAgICAgICAgICAnZGF0YS1hbmltYXRpb24nOiBvcGVuaW5nQW5pbWF0aW9uLFxyXG4gICAgICAgICAgICAnZGF0YS1jbG9zaW5nLWFuaW1hdGlvbic6IGNsb3NpbmdBbmltYXRpb25cclxuICAgICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFByZXZlbnQgbW9kYWwgY2xvc2Ugd2hlbiB0aGVyZSdzIGEgY2xpY2sgb24gdGhlIG1vZGFsIHdpbmRvd1xyXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgLSByYWlzZWQgYnkgdGhlIGNsaWNrXHJcbiAgICAqIEBwcml2YXRlXHJcbiAgICAqL1xyXG4gICAgX3ByZXZlbnRNb2RhbENsb3NlKGV2ZW50KSB7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9O1xyXG59O1xyXG5cclxuTW9kYWwuZGlzcGxheU5hbWUgPSAnTW9kYWwnO1xyXG5Nb2RhbC5kZWZhdWx0UHJvcHMgPSB7XHJcbiAgICBDb25maXJtQ29udGVudENvbXBvbmVudDogKCkgPT4gPHNwYW4+e2kxOG5leHQudCgnZm9jdXMuY29tcG9uZW50cy5tb2RhbC5jb25maXJtYXRpb24udGV4dCcpfTwvc3Bhbj4sXHJcbiAgICBsZXZlbDogMCxcclxuICAgIG1vZGFsOiBmYWxzZSxcclxuICAgIG9wZW46IGZhbHNlLFxyXG4gICAgb3ZlcmxheTogdHJ1ZSxcclxuICAgIHNpemU6ICdtZWRpdW0nLFxyXG4gICAgdHlwZTogJ2Z1bGwnXHJcbn07XHJcbk1vZGFsLnByb3BUeXBlcyA9IHtcclxuICAgIGNvbmZpcm1GdW5jdGlvbjogUHJvcFR5cGVzLmZ1bmMsXHJcbiAgICBDb25maXJtQ29udGVudENvbXBvbmVudDogUHJvcFR5cGVzLmZ1bmMsXHJcbiAgICBsZXZlbDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxyXG4gICAgbW9kYWw6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXHJcbiAgICBvbk1vZGFsQ2xvc2U6IFByb3BUeXBlcy5mdW5jLFxyXG4gICAgb3BlbjogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcclxuICAgIG92ZXJsYXk6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXHJcbiAgICBzaXplOiBQcm9wVHlwZXMub25lT2YoWydzbWFsbCcsICdtZWRpdW0nLCAnbGFyZ2UnXSkuaXNSZXF1aXJlZCxcclxuICAgIHR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxyXG59O1xyXG5leHBvcnQgZGVmYXVsdCBNb2RhbDtcclxuIl19