UNPKG

material-ui-datetime-range-picker

Version:

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

691 lines (618 loc) 78.6 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 _reactEventListener = require('react-event-listener'); var _reactEventListener2 = _interopRequireDefault(_reactEventListener); var _keycode = require('keycode'); var _keycode2 = _interopRequireDefault(_keycode); var _DateRangeDisplay = require('./DateRangeDisplay'); var _DateRangeDisplay2 = _interopRequireDefault(_DateRangeDisplay); var _DateRangeStatusDisplay = require('./DateRangeStatusDisplay'); var _DateRangeStatusDisplay2 = _interopRequireDefault(_DateRangeStatusDisplay); var _RangeCalendar = require('./RangeCalendar'); var _RangeCalendar2 = _interopRequireDefault(_RangeCalendar); var _Dialog = require('@material-ui/core/Dialog'); var _Dialog2 = _interopRequireDefault(_Dialog); var _Popover = require('@material-ui/core/Popover'); var _Popover2 = _interopRequireDefault(_Popover); var _reactAddonsUpdate = require('react-addons-update'); var _reactAddonsUpdate2 = _interopRequireDefault(_reactAddonsUpdate); var _dateUtils = require('./dateUtils'); 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 _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { 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) : subClass.__proto__ = superClass; } var DateRangePickerDialog = function (_Component) { _inherits(DateRangePickerDialog, _Component); function DateRangePickerDialog(props) { _classCallCheck(this, DateRangePickerDialog); var _this = _possibleConstructorReturn(this, (DateRangePickerDialog.__proto__ || Object.getPrototypeOf(DateRangePickerDialog)).call(this, props)); _this.state = { allRefs: { endDate: null, endTime: null, startDate: null, startTime: null }, anchorEl: null, edit: 'start', displayTime: false, end: { displayDate: undefined, displayMonthDay: undefined, maxDate: undefined, minDate: undefined, selectedDate: undefined, shouldDisableDate: undefined }, open: false, start: { displayDate: undefined, displayMonthDay: undefined, maxDate: undefined, minDate: undefined, selectedDate: undefined, shouldDisableDate: undefined } }; _this.show = function (showRef, startEnd, dateTime, allRefs) { if (_this.props.onShow && !_this.state.open) { _this.props.onShow(); } _this.setState({ allRefs: allRefs, anchorEl: showRef, edit: startEnd, displayTime: dateTime === 'time' }, function () { _this.setState({ open: true }); }); }; _this.reset = function () { _this.setState({ allRefs: { endDate: null, endTime: null, startDate: null, startTime: null }, anchorEl: null, edit: 'start', displayTime: false, end: { displayDate: _this.props.utils.getFirstDayOfMonth(_this.props.initialEndDate), maxDate: _this.props.end ? _this.props.end.maxDate : undefined, minDate: _this.props.end ? _this.props.end.minDate : undefined, selectedDate: _this.props.initialEndDate, shouldDisableDate: _this.props.end ? _this.props.end.shouldDisableDate : undefined }, open: false, start: { displayDate: _this.props.utils.getFirstDayOfMonth(_this.props.initialStartDate), maxDate: _this.props.start ? _this.props.start.maxDate : undefined, minDate: _this.props.start ? _this.props.start.minDate : undefined, selectedDate: _this.props.initialStartDate, shouldDisableDate: _this.props.start ? _this.props.start.shouldDisableDate : undefined } }); }; _this.dismiss = function () { if (_this.props.onDismiss && _this.state.open) { if (_this.state.start.selectedDate && _this.state.end.selectedDate && !(0, _dateUtils.isEqualDateTime)(_this.state.start.selectedDate, _this.state.end.selectedDate)) { _this.props.onDismiss({ start: _this.state.start.selectedDate, end: _this.state.end.selectedDate }); } else { _this.props.onDismiss({ start: null, end: null }); } } _this.setState({ // edit: 'start', // displayTime: false, open: false }); }; _this.handleTouchTapDay = function (event, date) { var newState = _this.setSelectedDate(date); var _this$state = _this.state, allRefs = _this$state.allRefs, edit = _this$state.edit; var keepOpen = false; if (!_this.props.autoOpenField) { newState = (0, _reactAddonsUpdate2.default)(newState, { open: { $set: false } }); } else { newState = (0, _reactAddonsUpdate2.default)(newState, { displayTime: { $set: true }, anchorEl: { $set: edit === 'start' ? allRefs.startTime : allRefs.endTime } }); keepOpen = true; } _this.setState(newState, function () { _this.props.onAccept({ start: newState.start.selectedDate, end: newState.end.selectedDate }, keepOpen); _this.popover.current.updatePosition(); }); }; _this.handleTouchTapHour = function (hour) { var edit = _this.state.edit; var newState = _this.setSelectedTime(hour); var keepOpen = false; if (!_this.props.autoOpenField) { newState = (0, _reactAddonsUpdate2.default)(newState, { open: { $set: false } }); } else { if (edit === 'start') { newState = (0, _reactAddonsUpdate2.default)(newState, { displayTime: { $set: false }, edit: { $set: 'end' } }); keepOpen = true; } else { newState = (0, _reactAddonsUpdate2.default)(newState, { open: { $set: false } }); } } _this.setState(newState); _this.props.onAccept({ start: newState.start.selectedDate, end: newState.end.selectedDate }, keepOpen); }; _this.handleTouchTapCancel = function () { _this.dismiss(); }; _this.handleRequestClose = function () { _this.dismiss(); }; _this.handleTouchTapOk = function () { // should return an object with start and end dates if (_this.props.onAccept) { _this.props.onAccept({ start: _this.state.start.selectedDate, end: _this.state.end.selectedDate }); } _this.setState({ open: false }); }; _this.handleWindowKeyUp = function (event) { switch ((0, _keycode2.default)(event)) { case 'enter': _this.handleTouchTapOk(); break; } }; _this.handleMonthChange = function (months) { var _this$state2 = _this.state, edit = _this$state2.edit, start = _this$state2.start; var direction = months >= 0 ? 'left' : 'right'; _this.setState(_defineProperty({}, _this.state.edit, { transitionDirection: direction, displayDate: _this.props.utils.addMonths(_this.state[edit].displayDate ? _this.state[edit].displayDate : start.displayDate, months), selectedDate: _this.state[edit].selectedDate ? _this.state[edit].selectedDate : start.selectedDate, shouldDisableDate: _this.state[edit].shouldDisableDate ? _this.state[edit].shouldDisableDate : start.shouldDisableDate })); }; _this.handleTouchTapMenu = function (edit, displayTime) { _this.setState({ edit: edit ? edit : _this.props.edit, displayTime: displayTime ? displayTime : _this.props.displayTime }); }; _this.handleTouchTapYear = function (event, year) { _this.setSelectedDate(_this.props.utils.setYear(_this.state.selectedDate, year), event); _this.handleTouchTapDateDisplayMonthDay(); }; _this.handleTouchTapDateDisplayMonthDay = function () { var newState = (0, _reactAddonsUpdate2.default)(_this.state, _defineProperty({}, _this.state.edit, { displayMonthDay: { $set: true } })); _this.setState(newState); }; _this.popover = _react2.default.createRef(); return _this; } _createClass(DateRangePickerDialog, [{ key: 'UNSAFE_componentWillMount', value: function UNSAFE_componentWillMount() { this.setState({ end: { displayDate: this.props.utils.getFirstDayOfMonth(this.props.initialEndDate), maxDate: this.props.end ? this.props.end.maxDate : undefined, minDate: this.props.end ? this.props.end.minDate : undefined, selectedDate: this.props.initialEndDate, shouldDisableDate: this.props.end ? this.props.end.shouldDisableDate : undefined }, start: { displayDate: this.props.utils.getFirstDayOfMonth(this.props.initialStartDate), maxDate: this.props.start ? this.props.start.maxDate : undefined, minDate: this.props.start ? this.props.start.minDate : undefined, selectedDate: this.props.initialStartDate, shouldDisableDate: this.props.start ? this.props.start.shouldDisableDate : undefined } }); } }, { key: 'getMinDate', value: function getMinDate() { return this.state[this.state.edit].minDate || this.props.utils.addYears(new Date(), -100); } }, { key: 'getMaxDate', value: function getMaxDate() { return this.state[this.state.edit].maxDate || this.props.utils.addYears(new Date(), 100); } }, { key: 'setDisplayDate', value: function setDisplayDate(date, newSelectedDate) { var newDisplayDate = this.props.utils.getFirstDayOfMonth(date); var newSelectedEndDate = (0, _dateUtils.cloneDate)(newSelectedDate); newSelectedEndDate.setTime(newSelectedEndDate.getTime() + 1 * 60 * 60 * 1000); if (newDisplayDate !== this.state[this.state.edit].displayDate) { var direction = newDisplayDate > this.state[this.state.edit].displayDate ? 'left' : 'right'; var newState = (0, _reactAddonsUpdate2.default)(this.state, _defineProperty({}, this.state.edit, { displayDate: { $set: newDisplayDate }, transitionDirection: { $set: direction }, selectedDate: { $set: newSelectedDate || this.state[this.state.edit].selectedDate } })); if (this.state.edit === 'start' && this.state.end.selectedDate && ((0, _dateUtils.isAfterDateTime)(newSelectedDate, this.state.end.selectedDate) || (0, _dateUtils.isEqualDateTime)(newSelectedDate, this.state.end.selectedDate) || this.blockedRangeOverlaps(newSelectedDate))) { newState = (0, _reactAddonsUpdate2.default)(newState, { end: { displayDate: { $set: undefined }, // displayDate: {$set: newDisplayDate}, transitionDirection: { $set: direction }, selectedDate: { $set: undefined } // selectedDate: {$set: newSelectedEndDate || this.state[this.state.edit].selectedDate}, } }); } // if (this.props.autoOpenField) { // newState = update(newState, { // displayTime: {$set: true}, // }) // } return newState; } return this.state; } }, { key: 'blockedRangeOverlaps', value: function blockedRangeOverlaps(adjustedDate) { var closestRange = (0, _dateUtils.closestRangeAfterStart)(this.props.blockedDateTimeRanges, adjustedDate); var endDate = this.state.end.selectedDate; return endDate && closestRange && (0, _dateUtils.isAfterDateTime)(endDate, closestRange.start); } }, { key: 'setSelectedDate', value: function setSelectedDate(date) { var adjustedDate = date; var newState = void 0; var minDate = this.getMinDate(); var maxDate = this.getMaxDate(); var _state = this.state, edit = _state.edit, start = _state.start; if ((0, _dateUtils.isBeforeDateTime)(date, minDate)) { adjustedDate = minDate; } else if ((0, _dateUtils.isAfterDateTime)(date, maxDate)) { adjustedDate = maxDate; } adjustedDate = this.firstAvailableTime(adjustedDate); if (edit === 'end' && (0, _dateUtils.isBeforeDateTime)(adjustedDate, start.selectedDate)) { adjustedDate = new Date(start.selectedDate.getTime()); } var adjustedEndDate = (0, _dateUtils.cloneDate)(adjustedDate); adjustedEndDate.setTime(adjustedEndDate.getTime() + 1 * 60 * 60 * 1000); var newDisplayDate = this.props.utils.getFirstDayOfMonth(adjustedDate); if (newDisplayDate !== this.state[this.state.edit].displayDate) { newState = this.setDisplayDate(newDisplayDate, adjustedDate); } else { newState = (0, _reactAddonsUpdate2.default)(this.state, _defineProperty({}, this.state.edit, { selectedDate: { $set: adjustedDate } })); if (this.state.edit === 'start' && this.state.end.selectedDate && ((0, _dateUtils.isAfterDateTime)(adjustedDate, this.state.end.selectedDate) || (0, _dateUtils.isEqualDateTime)(adjustedDate, this.state.end.selectedDate) || this.blockedRangeOverlaps(adjustedDate))) { newState = (0, _reactAddonsUpdate2.default)(newState, { end: { selectedDate: { $set: undefined } // selectedDate: {$set: adjustedEndDate}, } }); } } if (this.props.autoOpenField) { newState = (0, _reactAddonsUpdate2.default)(newState, { displayTime: { $set: true } }); } // newState = update(newState, { // displayTime: {$set: true}, // }); return newState; } }, { key: 'firstAvailableTime', value: function firstAvailableTime(dateToCheck) { var hoursInDay = 24; var blockedDateTimeRanges = this.props.blockedDateTimeRanges; var _state2 = this.state, edit = _state2.edit, start = _state2.start; var adjustedDate = (0, _dateUtils.cloneDate)(dateToCheck); for (var hour = 0; hour < hoursInDay; hour++) { adjustedDate.setHours(hour, 0, 0, 0); if (edit === 'start') { if (!(0, _dateUtils.isBeforeDateTime)(adjustedDate, new Date()) && !(0, _dateUtils.isDateTimeInRanges)(blockedDateTimeRanges, adjustedDate)) { return adjustedDate; } } else { var selectedStartDate = start.selectedDate; var closestRange = (0, _dateUtils.closestRangeAfterStart)(blockedDateTimeRanges, selectedStartDate); if (closestRange) { if (!(0, _dateUtils.isEqualDateTime)(start.selectedDate, adjustedDate) && !(0, _dateUtils.isBeforeDateTime)(adjustedDate, selectedStartDate) && !(0, _dateUtils.isAfterDateTime)(adjustedDate, closestRange.start)) { return adjustedDate; } } else { if (!(0, _dateUtils.isEqualDateTime)(start.selectedDate, adjustedDate) && !(0, _dateUtils.isBeforeDateTime)(adjustedDate, selectedStartDate)) { return adjustedDate; } } } } return adjustedDate; } }, { key: 'getTimeElements', value: function getTimeElements(styles) { var _this2 = this; var hourArray = []; var hoursInDay = 24; for (var i = 0; i < hoursInDay; i++) { hourArray.push(i); } return hourArray.map(function (hour, i) { return _react2.default.createElement( 'div', { key: i, style: styles.hour }, _this2.getHourElement(hour) ); }, this); } }, { key: 'setSelectedTime', value: function setSelectedTime(hour) { var mode = this.state.edit === 'start' ? 'end' : 'start'; var adjustedDate = (0, _dateUtils.cloneDate)(this.state[this.state.edit].selectedDate); adjustedDate.setHours(hour, 0, 0, 0); var adjustedEndDate = (0, _dateUtils.cloneDate)(adjustedDate); adjustedEndDate.setTime(adjustedEndDate.getTime() + 1 * 60 * 60 * 1000); var newState = (0, _reactAddonsUpdate2.default)(this.state, _defineProperty({}, this.state.edit, { selectedDate: { $set: adjustedDate } })); if (this.state.edit === 'start' && this.state.end.selectedDate && adjustedDate > this.state.end.selectedDate) { newState = (0, _reactAddonsUpdate2.default)(newState, { end: { selectedDate: { $set: undefined } // selectedDate: {$set: adjustedEndDate}, } }); } if (this.props.autoOpenField) { newState = (0, _reactAddonsUpdate2.default)(newState, { displayTime: { $set: false }, edit: { $set: mode } }); } return newState; } }, { key: 'setEditMode', value: function setEditMode(mode) { if (!mode) { mode = this.state.edit === 'start' ? 'end' : 'start'; } var newState = (0, _reactAddonsUpdate2.default)(this.state, { edit: { $set: mode } }); this.setState(newState); } }, { key: 'render', value: function render() { var _props = this.props, DateTimeFormat = _props.DateTimeFormat, autoOk = _props.autoOk, autoOpenField = _props.autoOpenField, blockedDateTimeRanges = _props.blockedDateTimeRanges, calendarDateWidth = _props.calendarDateWidth, calendarTimeWidth = _props.calendarTimeWidth, cancelLabel = _props.cancelLabel, container = _props.container, dayButtonSize = _props.dayButtonSize, displayTime = _props.displayTime, edit = _props.edit, endLabel = _props.endLabel, showCalendarDate = _props.showCalendarDate, showCalendarStatus = _props.showCalendarStatus, initialStartDate = _props.initialStartDate, initialEndDate = _props.initialEndDate, firstDayOfWeek = _props.firstDayOfWeek, locale = _props.locale, mode = _props.mode, okLabel = _props.okLabel, onAccept = _props.onAccept, onUpdate = _props.onUpdate, onDismiss = _props.onDismiss, onShow = _props.onShow, startLabel = _props.startLabel, style = _props.style, utils = _props.utils, other = _objectWithoutProperties(_props, ['DateTimeFormat', 'autoOk', 'autoOpenField', 'blockedDateTimeRanges', 'calendarDateWidth', 'calendarTimeWidth', 'cancelLabel', 'container', 'dayButtonSize', 'displayTime', 'edit', 'endLabel', 'showCalendarDate', 'showCalendarStatus', 'initialStartDate', 'initialEndDate', 'firstDayOfWeek', 'locale', 'mode', 'okLabel', 'onAccept', 'onUpdate', 'onDismiss', 'onShow', 'startLabel', 'style', 'utils']); var _state3 = this.state, allRefs = _state3.allRefs, open = _state3.open; var newAnchorEl = this.state.anchorEl; if (this.state.edit === 'start') { newAnchorEl = this.state.displayTime ? allRefs.startTime : allRefs.startDate; } else { newAnchorEl = this.state.displayTime ? allRefs.endTime : allRefs.endDate; } var content = _react2.default.createElement( 'span', null, _react2.default.createElement(_reactEventListener2.default, { target: 'window', onKeyUp: this.handleWindowKeyUp }), showCalendarDate && _react2.default.createElement(_DateRangeDisplay2.default, { DateTimeFormat: DateTimeFormat, disableYearSelection: true, displayTime: this.state.displayTime, onTouchTapMonthDay: this.handleTouchTapDateDisplayMonthDay, onTouchTapYear: this.handleTouchTapDateDisplayYear, onTouchTapMenu: this.handleTouchTapMenu.bind(this), locale: locale, monthDaySelected: true, mode: this.props.mode, end: this.state.end, edit: this.state.edit, start: this.state.start }), showCalendarStatus && _react2.default.createElement(_DateRangeStatusDisplay2.default, { displayTime: this.state.displayTime, edit: this.state.edit, endLabel: endLabel, mode: this.props.mode, startLabel: startLabel }), _react2.default.createElement(_RangeCalendar2.default, { autoOk: autoOk, blockedDateTimeRanges: blockedDateTimeRanges, DateTimeFormat: DateTimeFormat, calendarDateWidth: calendarDateWidth, calendarTimeWidth: calendarTimeWidth, cancelLabel: cancelLabel, disableYearSelection: true, displayTime: this.state.displayTime, dayButtonSize: dayButtonSize, firstDayOfWeek: firstDayOfWeek, locale: locale, onTouchTapDay: this.handleTouchTapDay.bind(this), onTouchTapHour: this.handleTouchTapHour.bind(this), mode: mode, open: open, ref: 'startCalendar', onTouchTapCancel: this.handleTouchTapCancel, onTouchTapOk: this.handleTouchTapOk, okLabel: okLabel, openToYearSelection: false, edit: this.state.edit, end: this.state.end, start: this.state.start, setSelectedDate: this.setSelectedDate.bind(this), onMonthChange: this.handleMonthChange, utils: utils }) ); return _react2.default.createElement( 'div', _extends({}, other, { ref: 'root' }), container === 'inline' ? _react2.default.createElement( _Popover2.default, { action: this.popover, anchorEl: newAnchorEl || this.refs.root, anchorOrigin: { horizontal: 'left', vertical: 'bottom' }, transformOrigin: { horizontal: 'left', vertical: 'top' }, ref: 'dialog', open: open, onClose: this.handleRequestClose }, content ) : _react2.default.createElement( _Dialog2.default, { ref: 'dialog', open: open, onClose: this.handleRequestClose }, content ) ); } }]); return DateRangePickerDialog; }(_react.Component); DateRangePickerDialog.propTypes = { DateTimeFormat: _propTypes2.default.func, autoOk: _propTypes2.default.bool, autoOpenField: _propTypes2.default.bool, blockedDateTimeRanges: _propTypes2.default.array, calendarDateWidth: _propTypes2.default.string, calendarTimeWidth: _propTypes2.default.string, cancelLabel: _propTypes2.default.node, container: _propTypes2.default.oneOf(['dialog', 'inline']), dayButtonSize: _propTypes2.default.string, displayTime: _propTypes2.default.bool, edit: _propTypes2.default.string, end: _propTypes2.default.object, endLabel: _propTypes2.default.string, firstDayOfWeek: _propTypes2.default.number, initialEndDate: _propTypes2.default.object, initialStartDate: _propTypes2.default.object, locale: _propTypes2.default.string, mode: _propTypes2.default.oneOf(['portrait', 'landscape']), okLabel: _propTypes2.default.node, onAccept: _propTypes2.default.func, onDismiss: _propTypes2.default.func, onShow: _propTypes2.default.func, onUpdate: _propTypes2.default.func, open: _propTypes2.default.bool, showCalendarDate: _propTypes2.default.bool, showCalendarStatus: _propTypes2.default.bool, start: _propTypes2.default.object, startLabel: _propTypes2.default.string, style: _propTypes2.default.object, utils: _propTypes2.default.object }; DateRangePickerDialog.defaultProps = { DateTimeFormat: _dateUtils.dateTimeFormat, cancelLabel: 'Cancel', container: 'dialog', initialEndDate: new Date(), initialStartDate: new Date(), locale: 'en-US', okLabel: 'OK', utils: _dateUtils.defaultUtils }; DateRangePickerDialog.contextTypes = { muiTheme: _propTypes2.default.object.isRequired }; exports.default = DateRangePickerDialog; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9EYXRlUGlja2VyL0RhdGVSYW5nZVBpY2tlckRpYWxvZy5qcyJdLCJuYW1lcyI6WyJEYXRlUmFuZ2VQaWNrZXJEaWFsb2ciLCJwcm9wcyIsInN0YXRlIiwiYWxsUmVmcyIsImVuZERhdGUiLCJlbmRUaW1lIiwic3RhcnREYXRlIiwic3RhcnRUaW1lIiwiYW5jaG9yRWwiLCJlZGl0IiwiZGlzcGxheVRpbWUiLCJlbmQiLCJkaXNwbGF5RGF0ZSIsInVuZGVmaW5lZCIsImRpc3BsYXlNb250aERheSIsIm1heERhdGUiLCJtaW5EYXRlIiwic2VsZWN0ZWREYXRlIiwic2hvdWxkRGlzYWJsZURhdGUiLCJvcGVuIiwic3RhcnQiLCJzaG93Iiwic2hvd1JlZiIsInN0YXJ0RW5kIiwiZGF0ZVRpbWUiLCJvblNob3ciLCJzZXRTdGF0ZSIsInJlc2V0IiwidXRpbHMiLCJnZXRGaXJzdERheU9mTW9udGgiLCJpbml0aWFsRW5kRGF0ZSIsImluaXRpYWxTdGFydERhdGUiLCJkaXNtaXNzIiwib25EaXNtaXNzIiwiaGFuZGxlVG91Y2hUYXBEYXkiLCJldmVudCIsImRhdGUiLCJuZXdTdGF0ZSIsInNldFNlbGVjdGVkRGF0ZSIsImtlZXBPcGVuIiwiYXV0b09wZW5GaWVsZCIsIiRzZXQiLCJvbkFjY2VwdCIsInBvcG92ZXIiLCJjdXJyZW50IiwidXBkYXRlUG9zaXRpb24iLCJoYW5kbGVUb3VjaFRhcEhvdXIiLCJob3VyIiwic2V0U2VsZWN0ZWRUaW1lIiwiaGFuZGxlVG91Y2hUYXBDYW5jZWwiLCJoYW5kbGVSZXF1ZXN0Q2xvc2UiLCJoYW5kbGVUb3VjaFRhcE9rIiwiaGFuZGxlV2luZG93S2V5VXAiLCJoYW5kbGVNb250aENoYW5nZSIsIm1vbnRocyIsImRpcmVjdGlvbiIsInRyYW5zaXRpb25EaXJlY3Rpb24iLCJhZGRNb250aHMiLCJoYW5kbGVUb3VjaFRhcE1lbnUiLCJoYW5kbGVUb3VjaFRhcFllYXIiLCJ5ZWFyIiwic2V0WWVhciIsImhhbmRsZVRvdWNoVGFwRGF0ZURpc3BsYXlNb250aERheSIsIlJlYWN0IiwiY3JlYXRlUmVmIiwiYWRkWWVhcnMiLCJEYXRlIiwibmV3U2VsZWN0ZWREYXRlIiwibmV3RGlzcGxheURhdGUiLCJuZXdTZWxlY3RlZEVuZERhdGUiLCJzZXRUaW1lIiwiZ2V0VGltZSIsImJsb2NrZWRSYW5nZU92ZXJsYXBzIiwiYWRqdXN0ZWREYXRlIiwiY2xvc2VzdFJhbmdlIiwiYmxvY2tlZERhdGVUaW1lUmFuZ2VzIiwiZ2V0TWluRGF0ZSIsImdldE1heERhdGUiLCJmaXJzdEF2YWlsYWJsZVRpbWUiLCJhZGp1c3RlZEVuZERhdGUiLCJzZXREaXNwbGF5RGF0ZSIsImRhdGVUb0NoZWNrIiwiaG91cnNJbkRheSIsInNldEhvdXJzIiwic2VsZWN0ZWRTdGFydERhdGUiLCJzdHlsZXMiLCJob3VyQXJyYXkiLCJpIiwicHVzaCIsIm1hcCIsImdldEhvdXJFbGVtZW50IiwibW9kZSIsIkRhdGVUaW1lRm9ybWF0IiwiYXV0b09rIiwiY2FsZW5kYXJEYXRlV2lkdGgiLCJjYWxlbmRhclRpbWVXaWR0aCIsImNhbmNlbExhYmVsIiwiY29udGFpbmVyIiwiZGF5QnV0dG9uU2l6ZSIsImVuZExhYmVsIiwic2hvd0NhbGVuZGFyRGF0ZSIsInNob3dDYWxlbmRhclN0YXR1cyIsImZpcnN0RGF5T2ZXZWVrIiwibG9jYWxlIiwib2tMYWJlbCIsIm9uVXBkYXRlIiwic3RhcnRMYWJlbCIsInN0eWxlIiwib3RoZXIiLCJuZXdBbmNob3JFbCIsImNvbnRlbnQiLCJoYW5kbGVUb3VjaFRhcERhdGVEaXNwbGF5WWVhciIsImJpbmQiLCJyZWZzIiwicm9vdCIsImhvcml6b250YWwiLCJ2ZXJ0aWNhbCIsIkNvbXBvbmVudCIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsImZ1bmMiLCJib29sIiwiYXJyYXkiLCJzdHJpbmciLCJub2RlIiwib25lT2YiLCJvYmplY3QiLCJudW1iZXIiLCJkZWZhdWx0UHJvcHMiLCJkYXRlVGltZUZvcm1hdCIsImRlZmF1bHRVdGls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