UNPKG

14.8 kBJavaScriptView Raw
1/**
2 * Toast component
3 * @class ApToast
4 */
5
6'use strict';
7
8Object.defineProperty(exports, "__esModule", {
9 value: true
10});
11
12var _react = require('react');
13
14var _react2 = _interopRequireDefault(_react);
15
16var _apemanReactMixins = require('apeman-react-mixins');
17
18var _classnames = require('classnames');
19
20var _classnames2 = _interopRequireDefault(_classnames);
21
22var _arrayfilter = require('arrayfilter');
23
24var _arrayfilter2 = _interopRequireDefault(_arrayfilter);
25
26var _ap_toast_item = require('./ap_toast_item');
27
28var _ap_toast_item2 = _interopRequireDefault(_ap_toast_item);
29
30function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
32/** @lends ApToast */
33var ApToast = _react2.default.createClass({
34 displayName: 'ApToast',
35
36
37 // --------------------
38 // Specs
39 // --------------------
40
41 propTypes: {
42 message: _react.PropTypes.string,
43 duration: _react.PropTypes.number,
44 icon: _react.PropTypes.string,
45 name: _react.PropTypes.string,
46 onDismiss: _react.PropTypes.func
47 },
48
49 mixins: [_apemanReactMixins.ApPureMixin],
50
51 statics: {
52 itemJoiner: '____'
53 },
54
55 getInitialState: function getInitialState() {
56 return {
57 items: ''
58 };
59 },
60 getDefaultProps: function getDefaultProps() {
61 return {
62 message: null,
63 duration: 2000,
64 icon: null,
65 name: null,
66 onDismiss: null
67 };
68 },
69 render: function render() {
70 var s = this;
71 var state = s.state;
72 var props = s.props;
73
74
75 var valid = state.items.length;
76 if (!valid) {
77 return null;
78 }
79 return _react2.default.createElement(
80 'div',
81 { className: (0, _classnames2.default)('ap-toast', props.className, {}),
82 style: Object.assign({}, props.style) },
83 _react2.default.createElement(
84 'div',
85 { className: 'ap-toast-inner' },
86 s._renderToastItem()
87 )
88 );
89 },
90
91
92 // --------------------
93 // Lifecycle
94 // --------------------
95
96 componentWillMount: function componentWillMount() {
97 var s = this;
98 },
99 componentDidMount: function componentDidMount() {
100 var s = this;
101 var props = s.props;
102
103 s.startTicking();
104 s.pushToastItem(props.message);
105 },
106 componentWillReceiveProps: function componentWillReceiveProps(nextProps) {
107 var s = this;
108 s.pushToastItem(nextProps.message);
109 },
110 componentWillUnmount: function componentWillUnmount() {
111 var s = this;
112 s.stopTicking();
113 },
114
115
116 // ------------------
117 // Custom
118 // ------------------
119
120 startTicking: function startTicking() {
121 var s = this;
122 clearTimeout(s._tickTimer);
123 s._ticking = true;
124 s.doTick();
125 },
126 stopTicking: function stopTicking() {
127 var s = this;
128 clearTimeout(s._tickTimer);
129 s._ticking = false;
130 },
131 doTick: function doTick() {
132 var s = this;
133 var props = s.props;
134
135 if (!s._ticking) {
136 return;
137 }
138 s._tickTimer = setTimeout(function () {
139 s.shiftToastItem();
140 s.doTick();
141 }, props.duration);
142 },
143 pushToastItem: function pushToastItem(message) {
144 var s = this;
145 if (!message) {
146 return;
147 }
148 var items = (s.state.items || '').split(ApToast.itemJoiner);
149 var duplicate = items[items.length - 1] === message;
150 if (duplicate) {
151 return;
152 }
153 s.setState({
154 items: items.concat(message).join(ApToast.itemJoiner)
155 });
156 },
157 shiftToastItem: function shiftToastItem() {
158 var s = this;
159 var props = s.props;
160
161 var items = (s.state.items || '').split(ApToast.itemJoiner);
162 if (!items.length) {
163 s.setState({ items: null });
164 return;
165 }
166 s.dismissToastItem(items[0]);
167 },
168 dismissToastItem: function dismissToastItem(message) {
169 var s = this;
170 var props = s.props;
171
172 var items = (s.state.items || '').split(ApToast.itemJoiner);
173 s.setState({
174 items: items.filter(function (filtering) {
175 return filtering !== message;
176 }).join(ApToast.itemJoiner)
177 });
178 if (props.onDismiss) {
179 props.onDismiss({ dismissed: message, name: props.name });
180 }
181 },
182 handleToastItemTap: function handleToastItemTap(e) {
183 var s = this;
184 var text = e.target.dataset['text'];
185 s.dismissToastItem(text);
186 },
187
188
189 // ------------------
190 // Private
191 // ------------------
192 _ticking: false,
193 _tickTimer: null,
194 _renderToastItem: function _renderToastItem() {
195 var s = this;
196 var state = s.state;
197 var props = s.props;
198
199 return (state.items || '').split(ApToast.itemJoiner).filter(_arrayfilter2.default.emptyReject()).map(function (text, i) {
200 return _react2.default.createElement(_ap_toast_item2.default, { key: 'toast-' + text + '-' + i,
201 text: text,
202 icon: props.icon,
203 onTap: s.handleToastItemTap
204 });
205 });
206 }
207});
208
209exports.default = ApToast;
210//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwX3RvYXN0LmpzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUtBOzs7Ozs7QUFFQTs7OztBQUNBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7OztBQUdBLElBQU0sVUFBVSxnQkFBTSxXQUFOLENBQWtCO0FBQUE7Ozs7Ozs7QUFNaEMsYUFBVztBQUNULGFBQVMsaUJBQU0sTUFETjtBQUVULGNBQVUsaUJBQU0sTUFGUDtBQUdULFVBQU0saUJBQU0sTUFISDtBQUlULFVBQU0saUJBQU0sTUFKSDtBQUtULGVBQVcsaUJBQU07QUFMUixHQU5xQjs7QUFjaEMsVUFBUSxnQ0Fkd0I7O0FBa0JoQyxXQUFTO0FBQ1AsZ0JBQVk7QUFETCxHQWxCdUI7O0FBc0JoQyxpQkF0QmdDLDZCQXNCYjtBQUNqQixXQUFPO0FBQ0wsYUFBTztBQURGLEtBQVA7QUFHRCxHQTFCK0I7QUE0QmhDLGlCQTVCZ0MsNkJBNEJiO0FBQ2pCLFdBQU87QUFDTCxlQUFTLElBREo7QUFFTCxnQkFBVSxJQUZMO0FBR0wsWUFBTSxJQUhEO0FBSUwsWUFBTSxJQUpEO0FBS0wsaUJBQVc7QUFMTixLQUFQO0FBT0QsR0FwQytCO0FBc0NoQyxRQXRDZ0Msb0JBc0N0QjtBQUNSLFFBQU0sSUFBSSxJQUFWO0FBRFEsUUFFRixLQUZFLEdBRWUsQ0FGZixDQUVGLEtBRkU7QUFBQSxRQUVLLEtBRkwsR0FFZSxDQUZmLENBRUssS0FGTDs7O0FBSVIsUUFBSSxRQUFRLE1BQU0sS0FBTixDQUFZLE1BQXhCO0FBQ0EsUUFBSSxDQUFDLEtBQUwsRUFBWTtBQUNWLGFBQU8sSUFBUDtBQUNEO0FBQ0QsV0FDRTtBQUFBO01BQUEsRUFBSyxXQUFZLDBCQUFXLFVBQVgsRUFBdUIsTUFBTSxTQUE3QixFQUF3QyxFQUF4QyxDQUFqQjtBQUNLLGVBQVEsT0FBTyxNQUFQLENBQWMsRUFBZCxFQUFrQixNQUFNLEtBQXhCLENBRGI7TUFFRTtBQUFBO1FBQUEsRUFBSyxXQUFVLGdCQUFmO1FBQ0csRUFBRSxnQkFBRjtBQURIO0FBRkYsS0FERjtBQVFELEdBdEQrQjs7Ozs7OztBQTREaEMsb0JBNURnQyxnQ0E0RFY7QUFDcEIsUUFBTSxJQUFJLElBQVY7QUFDRCxHQTlEK0I7QUFnRWhDLG1CQWhFZ0MsK0JBZ0VYO0FBQ25CLFFBQU0sSUFBSSxJQUFWO0FBRG1CLFFBRWIsS0FGYSxHQUVILENBRkcsQ0FFYixLQUZhOztBQUduQixNQUFFLFlBQUY7QUFDQSxNQUFFLGFBQUYsQ0FBZ0IsTUFBTSxPQUF0QjtBQUNELEdBckUrQjtBQXVFaEMsMkJBdkVnQyxxQ0F1RUwsU0F2RUssRUF1RU07QUFDcEMsUUFBTSxJQUFJLElBQVY7QUFDQSxNQUFFLGFBQUYsQ0FBZ0IsVUFBVSxPQUExQjtBQUNELEdBMUUrQjtBQTRFaEMsc0JBNUVnQyxrQ0E0RVI7QUFDdEIsUUFBTSxJQUFJLElBQVY7QUFDQSxNQUFFLFdBQUY7QUFDRCxHQS9FK0I7Ozs7Ozs7QUFxRmhDLGNBckZnQywwQkFxRmhCO0FBQ2QsUUFBTSxJQUFJLElBQVY7QUFDQSxpQkFBYSxFQUFFLFVBQWY7QUFDQSxNQUFFLFFBQUYsR0FBYSxJQUFiO0FBQ0EsTUFBRSxNQUFGO0FBQ0QsR0ExRitCO0FBNEZoQyxhQTVGZ0MseUJBNEZqQjtBQUNiLFFBQU0sSUFBSSxJQUFWO0FBQ0EsaUJBQWEsRUFBRSxVQUFmO0FBQ0EsTUFBRSxRQUFGLEdBQWEsS0FBYjtBQUNELEdBaEcrQjtBQWtHaEMsUUFsR2dDLG9CQWtHdEI7QUFDUixRQUFNLElBQUksSUFBVjtBQURRLFFBRUYsS0FGRSxHQUVRLENBRlIsQ0FFRixLQUZFOztBQUdSLFFBQUksQ0FBQyxFQUFFLFFBQVAsRUFBaUI7QUFDZjtBQUNEO0FBQ0QsTUFBRSxVQUFGLEdBQWUsV0FBVyxZQUFNO0FBQzlCLFFBQUUsY0FBRjtBQUNBLFFBQUUsTUFBRjtBQUNELEtBSGMsRUFHWixNQUFNLFFBSE0sQ0FBZjtBQUlELEdBNUcrQjtBQThHaEMsZUE5R2dDLHlCQThHakIsT0E5R2lCLEVBOEdSO0FBQ3RCLFFBQU0sSUFBSSxJQUFWO0FBQ0EsUUFBSSxDQUFDLE9BQUwsRUFBYztBQUNaO0FBQ0Q7QUFDRCxRQUFJLFFBQVEsQ0FBQyxFQUFFLEtBQUYsQ0FBUSxLQUFSLElBQWlCLEVBQWxCLEVBQXNCLEtBQXRCLENBQTRCLFFBQVEsVUFBcEMsQ0FBWjtBQUNBLFFBQUksWUFBWSxNQUFPLE1BQU0sTUFBTixHQUFlLENBQXRCLE1BQThCLE9BQTlDO0FBQ0EsUUFBSSxTQUFKLEVBQWU7QUFDYjtBQUNEO0FBQ0QsTUFBRSxRQUFGLENBQVc7QUFDVCxhQUFPLE1BQU0sTUFBTixDQUFhLE9BQWIsRUFBc0IsSUFBdEIsQ0FBMkIsUUFBUSxVQUFuQztBQURFLEtBQVg7QUFHRCxHQTNIK0I7QUE2SGhDLGdCQTdIZ0MsNEJBNkhkO0FBQ2hCLFFBQU0sSUFBSSxJQUFWO0FBRGdCLFFBRVYsS0FGVSxHQUVBLENBRkEsQ0FFVixLQUZVOztBQUdoQixRQUFJLFFBQVEsQ0FBQyxFQUFFLEtBQUYsQ0FBUSxLQUFSLElBQWlCLEVBQWxCLEVBQXNCLEtBQXRCLENBQTRCLFFBQVEsVUFBcEMsQ0FBWjtBQUNBLFFBQUksQ0FBQyxNQUFNLE1BQVgsRUFBbUI7QUFDakIsUUFBRSxRQUFGLENBQVcsRUFBRSxPQUFPLElBQVQsRUFBWDtBQUNBO0FBQ0Q7QUFDRCxNQUFFLGdCQUFGLENBQW1CLE1BQU8sQ0FBUCxDQUFuQjtBQUNELEdBdEkrQjtBQXdJaEMsa0JBeElnQyw0QkF3SWQsT0F4SWMsRUF3SUw7QUFDekIsUUFBTSxJQUFJLElBQVY7QUFEeUIsUUFFbkIsS0FGbUIsR0FFVCxDQUZTLENBRW5CLEtBRm1COztBQUd6QixRQUFJLFFBQVEsQ0FBQyxFQUFFLEtBQUYsQ0FBUSxLQUFSLElBQWlCLEVBQWxCLEVBQXNCLEtBQXRCLENBQTRCLFFBQVEsVUFBcEMsQ0FBWjtBQUNBLE1BQUUsUUFBRixDQUFXO0FBQ1QsYUFBTyxNQUFNLE1BQU4sQ0FBYSxVQUFDLFNBQUQ7QUFBQSxlQUFlLGNBQWMsT0FBN0I7QUFBQSxPQUFiLEVBQ0osSUFESSxDQUNDLFFBQVEsVUFEVDtBQURFLEtBQVg7QUFJQSxRQUFJLE1BQU0sU0FBVixFQUFxQjtBQUNuQixZQUFNLFNBQU4sQ0FBZ0IsRUFBRSxXQUFXLE9BQWIsRUFBc0IsTUFBTSxNQUFNLElBQWxDLEVBQWhCO0FBQ0Q7QUFDRixHQW5KK0I7QUFxSmhDLG9CQXJKZ0MsOEJBcUpaLENBckpZLEVBcUpUO0FBQ3JCLFFBQU0sSUFBSSxJQUFWO0FBQ0EsUUFBSSxPQUFPLEVBQUUsTUFBRixDQUFTLE9BQVQsQ0FBa0IsTUFBbEIsQ0FBWDtBQUNBLE1BQUUsZ0JBQUYsQ0FBbUIsSUFBbkI7QUFDRCxHQXpKK0I7Ozs7OztBQThKaEMsWUFBVSxLQTlKc0I7QUErSmhDLGNBQVksSUEvSm9CO0FBZ0toQyxrQkFoS2dDLDhCQWdLWjtBQUNsQixRQUFNLElBQUksSUFBVjtBQURrQixRQUVaLEtBRlksR0FFSyxDQUZMLENBRVosS0FGWTtBQUFBLFFBRUwsS0FGSyxHQUVLLENBRkwsQ0FFTCxLQUZLOztBQUdsQixXQUFPLENBQUMsTUFBTSxLQUFOLElBQWUsRUFBaEIsRUFBb0IsS0FBcEIsQ0FBMEIsUUFBUSxVQUFsQyxFQUNKLE1BREksQ0FDRyxzQkFBWSxXQUFaLEVBREgsRUFFSixHQUZJLENBRUEsVUFBQyxJQUFELEVBQU8sQ0FBUDtBQUFBLGFBQ0QseURBQWEsZ0JBQWMsSUFBZCxTQUFzQixDQUFuQztBQUNhLGNBQU0sSUFEbkI7QUFFYSxjQUFNLE1BQU0sSUFGekI7QUFHYSxlQUFPLEVBQUU7QUFIdEIsUUFEQztBQUFBLEtBRkEsQ0FBUDtBQVdEO0FBOUsrQixDQUFsQixDQUFoQjs7a0JBaUxlLE8iLCJmaWxlIjoiYXBfdG9hc3QuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL29rdW5pc2hpbmlzaGkvUHJvamVjdHMvYXBlbWFuLXByb2plY3RzL2FwZW1hbi1yZWFjdC10b2FzdC9saWIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRvYXN0IGNvbXBvbmVudFxuICogQGNsYXNzIEFwVG9hc3RcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzIGFzIHR5cGVzfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7QXBQdXJlTWl4aW59IGZyb20gJ2FwZW1hbi1yZWFjdC1taXhpbnMnXG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJ1xuaW1wb3J0IGFycmF5ZmlsdGVyIGZyb20gJ2FycmF5ZmlsdGVyJ1xuaW1wb3J0IEFwVG9hc3RJdGVtIGZyb20gJy4vYXBfdG9hc3RfaXRlbSdcblxuLyoqIEBsZW5kcyBBcFRvYXN0ICovXG5jb25zdCBBcFRvYXN0ID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFNwZWNzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJvcFR5cGVzOiB7XG4gICAgbWVzc2FnZTogdHlwZXMuc3RyaW5nLFxuICAgIGR1cmF0aW9uOiB0eXBlcy5udW1iZXIsXG4gICAgaWNvbjogdHlwZXMuc3RyaW5nLFxuICAgIG5hbWU6IHR5cGVzLnN0cmluZyxcbiAgICBvbkRpc21pc3M6IHR5cGVzLmZ1bmNcbiAgfSxcblxuICBtaXhpbnM6IFtcbiAgICBBcFB1cmVNaXhpblxuICBdLFxuXG4gIHN0YXRpY3M6IHtcbiAgICBpdGVtSm9pbmVyOiAnX19fXydcbiAgfSxcblxuICBnZXRJbml0aWFsU3RhdGUgKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpdGVtczogJydcbiAgICB9XG4gIH0sXG5cbiAgZ2V0RGVmYXVsdFByb3BzICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogbnVsbCxcbiAgICAgIGR1cmF0aW9uOiAyMDAwLFxuICAgICAgaWNvbjogbnVsbCxcbiAgICAgIG5hbWU6IG51bGwsXG4gICAgICBvbkRpc21pc3M6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCBzID0gdGhpc1xuICAgIGxldCB7IHN0YXRlLCBwcm9wcyB9ID0gc1xuXG4gICAgbGV0IHZhbGlkID0gc3RhdGUuaXRlbXMubGVuZ3RoXG4gICAgaWYgKCF2YWxpZCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXsgY2xhc3NuYW1lcygnYXAtdG9hc3QnLCBwcm9wcy5jbGFzc05hbWUsIHt9KSB9XG4gICAgICAgICAgIHN0eWxlPXsgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMuc3R5bGUpIH0+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYXAtdG9hc3QtaW5uZXJcIj5cbiAgICAgICAgICB7cy5fcmVuZGVyVG9hc3RJdGVtKCl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9LFxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIExpZmVjeWNsZVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIGNvbXBvbmVudFdpbGxNb3VudCAoKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgfSxcblxuICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBsZXQgeyBwcm9wcyB9ID0gc1xuICAgIHMuc3RhcnRUaWNraW5nKClcbiAgICBzLnB1c2hUb2FzdEl0ZW0ocHJvcHMubWVzc2FnZSlcbiAgfSxcblxuICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIChuZXh0UHJvcHMpIHtcbiAgICBjb25zdCBzID0gdGhpc1xuICAgIHMucHVzaFRvYXN0SXRlbShuZXh0UHJvcHMubWVzc2FnZSlcbiAgfSxcblxuICBjb21wb25lbnRXaWxsVW5tb3VudCAoKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBzLnN0b3BUaWNraW5nKClcbiAgfSxcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQ3VzdG9tXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHN0YXJ0VGlja2luZyAoKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBjbGVhclRpbWVvdXQocy5fdGlja1RpbWVyKVxuICAgIHMuX3RpY2tpbmcgPSB0cnVlXG4gICAgcy5kb1RpY2soKVxuICB9LFxuXG4gIHN0b3BUaWNraW5nICgpIHtcbiAgICBjb25zdCBzID0gdGhpc1xuICAgIGNsZWFyVGltZW91dChzLl90aWNrVGltZXIpXG4gICAgcy5fdGlja2luZyA9IGZhbHNlXG4gIH0sXG5cbiAgZG9UaWNrICgpIHtcbiAgICBjb25zdCBzID0gdGhpc1xuICAgIGxldCB7IHByb3BzIH0gPSBzXG4gICAgaWYgKCFzLl90aWNraW5nKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcy5fdGlja1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBzLnNoaWZ0VG9hc3RJdGVtKClcbiAgICAgIHMuZG9UaWNrKClcbiAgICB9LCBwcm9wcy5kdXJhdGlvbilcbiAgfSxcblxuICBwdXNoVG9hc3RJdGVtIChtZXNzYWdlKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBsZXQgaXRlbXMgPSAocy5zdGF0ZS5pdGVtcyB8fCAnJykuc3BsaXQoQXBUb2FzdC5pdGVtSm9pbmVyKVxuICAgIGxldCBkdXBsaWNhdGUgPSBpdGVtc1sgaXRlbXMubGVuZ3RoIC0gMSBdID09PSBtZXNzYWdlXG4gICAgaWYgKGR1cGxpY2F0ZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHMuc2V0U3RhdGUoe1xuICAgICAgaXRlbXM6IGl0ZW1zLmNvbmNhdChtZXNzYWdlKS5qb2luKEFwVG9hc3QuaXRlbUpvaW5lcilcbiAgICB9KVxuICB9LFxuXG4gIHNoaWZ0VG9hc3RJdGVtICgpIHtcbiAgICBjb25zdCBzID0gdGhpc1xuICAgIGxldCB7IHByb3BzIH0gPSBzXG4gICAgbGV0IGl0ZW1zID0gKHMuc3RhdGUuaXRlbXMgfHwgJycpLnNwbGl0KEFwVG9hc3QuaXRlbUpvaW5lcilcbiAgICBpZiAoIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgcy5zZXRTdGF0ZSh7IGl0ZW1zOiBudWxsIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcy5kaXNtaXNzVG9hc3RJdGVtKGl0ZW1zWyAwIF0pXG4gIH0sXG5cbiAgZGlzbWlzc1RvYXN0SXRlbSAobWVzc2FnZSkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgbGV0IHsgcHJvcHMgfSA9IHNcbiAgICBsZXQgaXRlbXMgPSAocy5zdGF0ZS5pdGVtcyB8fCAnJykuc3BsaXQoQXBUb2FzdC5pdGVtSm9pbmVyKVxuICAgIHMuc2V0U3RhdGUoe1xuICAgICAgaXRlbXM6IGl0ZW1zLmZpbHRlcigoZmlsdGVyaW5nKSA9PiBmaWx0ZXJpbmcgIT09IG1lc3NhZ2UpXG4gICAgICAgIC5qb2luKEFwVG9hc3QuaXRlbUpvaW5lcilcbiAgICB9KVxuICAgIGlmIChwcm9wcy5vbkRpc21pc3MpIHtcbiAgICAgIHByb3BzLm9uRGlzbWlzcyh7IGRpc21pc3NlZDogbWVzc2FnZSwgbmFtZTogcHJvcHMubmFtZSB9KVxuICAgIH1cbiAgfSxcblxuICBoYW5kbGVUb2FzdEl0ZW1UYXAgKGUpIHtcbiAgICBjb25zdCBzID0gdGhpc1xuICAgIGxldCB0ZXh0ID0gZS50YXJnZXQuZGF0YXNldFsgJ3RleHQnIF1cbiAgICBzLmRpc21pc3NUb2FzdEl0ZW0odGV4dClcbiAgfSxcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUHJpdmF0ZVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS1cbiAgX3RpY2tpbmc6IGZhbHNlLFxuICBfdGlja1RpbWVyOiBudWxsLFxuICBfcmVuZGVyVG9hc3RJdGVtICgpIHtcbiAgICBjb25zdCBzID0gdGhpc1xuICAgIGxldCB7IHN0YXRlLCBwcm9wcyB9ID0gc1xuICAgIHJldHVybiAoc3RhdGUuaXRlbXMgfHwgJycpLnNwbGl0KEFwVG9hc3QuaXRlbUpvaW5lcilcbiAgICAgIC5maWx0ZXIoYXJyYXlmaWx0ZXIuZW1wdHlSZWplY3QoKSlcbiAgICAgIC5tYXAoKHRleHQsIGkpID0+IChcbiAgICAgICAgICA8QXBUb2FzdEl0ZW0ga2V5PXtgdG9hc3QtJHt0ZXh0fS0ke2l9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgdGV4dD17dGV4dH1cbiAgICAgICAgICAgICAgICAgICAgICAgaWNvbj17cHJvcHMuaWNvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgb25UYXA9e3MuaGFuZGxlVG9hc3RJdGVtVGFwfVxuICAgICAgICAgID5cbiAgICAgICAgICA8L0FwVG9hc3RJdGVtPlxuICAgICAgICApXG4gICAgICApXG4gIH1cbn0pXG5cbmV4cG9ydCBkZWZhdWx0IEFwVG9hc3RcbiJdfQ==
\No newline at end of file