@pie-element/passage 5.1.0 → 5.2.0-mui-update.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,122 +1,65 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
- exports["default"] = void 0;
9
-
10
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
-
12
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
-
14
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
15
-
16
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
17
-
18
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
19
-
20
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
21
-
7
+ exports.default = void 0;
22
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
23
-
24
9
  var _react = _interopRequireDefault(require("react"));
25
-
26
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
27
-
28
- var _Tabs = _interopRequireDefault(require("@material-ui/core/Tabs"));
29
-
30
- var _Tab = _interopRequireDefault(require("@material-ui/core/Tab"));
31
-
32
- var _styles = require("@material-ui/core/styles");
33
-
11
+ var _Tabs = _interopRequireDefault(require("@mui/material/Tabs"));
12
+ var _Tab = _interopRequireDefault(require("@mui/material/Tab"));
13
+ var _styles = require("@mui/material/styles");
34
14
  var _renderUi = require("@pie-lib/render-ui");
35
-
36
- var _classnames = _interopRequireDefault(require("classnames"));
37
-
38
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
39
-
40
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
41
-
42
- var styles = function styles(theme) {
43
- return {
44
- passages: {
45
- flexGrow: 1,
46
- backgroundColor: _renderUi.color.background(),
47
- color: _renderUi.color.text(),
48
- '&:not(.MathJax) table': {
49
- borderCollapse: 'collapse'
50
- },
51
- '&:not(.MathJax) table td, &:not(.MathJax) table th': {
52
- padding: '.6em 1em',
53
- textAlign: 'left'
54
- }
55
- },
56
- passage: {
57
- backgroundColor: _renderUi.color.background(),
58
- color: _renderUi.color.text(),
59
- padding: theme.spacing.unit * 2
60
- },
61
- passageTitle: {
62
- fontSize: '1.75rem'
63
- },
64
- passageSubtitle: {
65
- fontSize: '1.5rem'
66
- },
67
- passageAuthor: {
68
- fontSize: '1.25rem'
69
- },
70
- passageText: {},
71
- stickyTabs: {
72
- background: _renderUi.color.background(),
73
- position: 'sticky',
74
- top: 0
75
- },
76
- tab: {
77
- background: theme.palette.common.white,
78
- // replace with color.background() once PD-2801 is DONE
79
- fontSize: 'inherit',
80
- color: theme.palette.common.black // remove when PD-2801 is DONE
81
-
82
- },
83
- tabButton: {
84
- background: theme.palette.common.white // replace with color.background() once PD-2801 is DONE
85
-
86
- },
87
- teacherInstructions: {
88
- marginBottom: theme.spacing.unit * 2
89
- }
90
- };
91
- };
92
-
93
- var StimulusTabs = /*#__PURE__*/function (_React$Component) {
94
- (0, _inherits2["default"])(StimulusTabs, _React$Component);
95
-
96
- var _super = _createSuper(StimulusTabs);
97
-
98
- function StimulusTabs() {
99
- var _this;
100
-
101
- (0, _classCallCheck2["default"])(this, StimulusTabs);
102
-
103
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
104
- args[_key] = arguments[_key];
105
- }
106
-
107
- _this = _super.call.apply(_super, [this].concat(args));
108
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", {
15
+ const PassagesContainer = (0, _styles.styled)('div')({
16
+ flexGrow: 1,
17
+ backgroundColor: _renderUi.color.background(),
18
+ color: _renderUi.color.text(),
19
+ '&:not(.MathJax) table': {
20
+ borderCollapse: 'collapse'
21
+ },
22
+ '&:not(.MathJax) table td, &:not(.MathJax) table th': {
23
+ padding: '.6em 1em',
24
+ textAlign: 'left'
25
+ }
26
+ });
27
+ const Passage = (0, _styles.styled)('div')(({
28
+ theme
29
+ }) => ({
30
+ backgroundColor: _renderUi.color.background(),
31
+ color: _renderUi.color.text(),
32
+ padding: theme.spacing(2)
33
+ }));
34
+ const PassageTitle = (0, _styles.styled)('div')({
35
+ fontSize: '1.75rem'
36
+ });
37
+ const PassageSubtitle = (0, _styles.styled)('div')({
38
+ fontSize: '1.5rem'
39
+ });
40
+ const PassageAuthor = (0, _styles.styled)('div')({
41
+ fontSize: '1.25rem'
42
+ });
43
+ const TabStyled = (0, _styles.styled)(_Tab.default)(({
44
+ theme
45
+ }) => ({
46
+ background: theme.palette.common.white,
47
+ // replace with color.background() once PD-2801 is DONE
48
+ fontSize: 'inherit',
49
+ color: theme.palette.common.black // remove when PD-2801 is DONE
50
+ }));
51
+ class StimulusTabs extends _react.default.Component {
52
+ constructor(...args) {
53
+ super(...args);
54
+ (0, _defineProperty2.default)(this, "state", {
109
55
  activeTab: 0
110
56
  });
111
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleChange", function (event, activeTab) {
112
- _this.setState(function () {
113
- return {
114
- activeTab: activeTab
115
- };
116
- });
117
-
118
- setTimeout(function () {
119
- var tabChangeEvent = new CustomEvent('pie-ui-passage-tabChanged', {
57
+ (0, _defineProperty2.default)(this, "handleChange", (event, activeTab) => {
58
+ this.setState(() => ({
59
+ activeTab
60
+ }));
61
+ setTimeout(() => {
62
+ const tabChangeEvent = new CustomEvent('pie-ui-passage-tabChanged', {
120
63
  detail: {
121
64
  tab: activeTab
122
65
  }
@@ -124,20 +67,20 @@ var StimulusTabs = /*#__PURE__*/function (_React$Component) {
124
67
  window.dispatchEvent(tabChangeEvent);
125
68
  });
126
69
  });
127
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleKeyDown", function (event, currentTabId) {
128
- var key = event.key;
129
- var tabs = _this.props.tabs;
130
- var newTabIndex = -1;
131
- var currentIndex = tabs.findIndex(function (tab) {
132
- return tab.id === currentTabId;
133
- });
134
-
70
+ (0, _defineProperty2.default)(this, "handleKeyDown", (event, currentTabId) => {
71
+ const {
72
+ key
73
+ } = event;
74
+ const {
75
+ tabs
76
+ } = this.props;
77
+ let newTabIndex = -1;
78
+ const currentIndex = tabs.findIndex(tab => tab.id === currentTabId);
135
79
  switch (key) {
136
80
  case 'ArrowRight':
137
81
  // Move to the next tab
138
82
  newTabIndex = (currentIndex + 1) % tabs.length;
139
83
  break;
140
-
141
84
  case 'ArrowLeft':
142
85
  // Move to the previous tab
143
86
  newTabIndex = (currentIndex - 1 + tabs.length) % tabs.length;
@@ -151,201 +94,158 @@ var StimulusTabs = /*#__PURE__*/function (_React$Component) {
151
94
  // // Move to the previous tab (for vertical alignment)
152
95
  // newTabIndex = (currentIndex - 1 + tabs.length) % tabs.length;
153
96
  // break;
154
-
155
97
  case 'Home':
156
98
  // Move to the first tab
157
99
  newTabIndex = 0;
158
100
  break;
159
-
160
101
  case 'End':
161
102
  // Move to the last tab
162
103
  newTabIndex = tabs.length - 1;
163
104
  break;
164
-
165
105
  case 'Enter':
166
106
  case ' ':
167
107
  // Activate the current tab
168
108
  newTabIndex = currentIndex;
169
109
  break;
170
-
171
110
  default:
172
111
  break;
173
112
  }
174
-
175
113
  if (newTabIndex !== -1) {
176
114
  event.preventDefault();
177
-
178
- _this.handleChange(event, tabs[newTabIndex].id);
179
-
180
- document.getElementById("button-".concat(tabs[newTabIndex].id)).focus();
115
+ this.handleChange(event, tabs[newTabIndex].id);
116
+ document.getElementById(`button-${tabs[newTabIndex].id}`).focus();
181
117
  }
182
118
  });
183
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "parsedText", function () {
184
- var text = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
119
+ (0, _defineProperty2.default)(this, "parsedText", (text = '') => {
185
120
  // fix imported audio content for Safari PD-1391
186
- var div = document.createElement('div');
121
+ const div = document.createElement('div');
187
122
  div.innerHTML = text.replace(/(<br\/>\n)/g, '<br/>');
188
- var audio = div.querySelector('audio');
189
-
123
+ const audio = div.querySelector('audio');
190
124
  if (audio) {
191
- var source = document.createElement('source');
125
+ const source = document.createElement('source');
192
126
  source.setAttribute('type', 'audio/mp3');
193
127
  source.setAttribute('src', audio.getAttribute('src'));
194
128
  audio.removeAttribute('src');
195
129
  audio.appendChild(source);
196
130
  }
197
-
198
131
  return div.innerHTML;
199
132
  });
200
- return _this;
201
133
  }
202
-
203
- (0, _createClass2["default"])(StimulusTabs, [{
204
- key: "renderInstructions",
205
- value: function renderInstructions(teacherInstructions) {
206
- var disabledTabs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
207
-
208
- if (!teacherInstructions) {
209
- return;
134
+ renderInstructions(teacherInstructions, disabledTabs = false) {
135
+ if (!teacherInstructions) {
136
+ return;
137
+ }
138
+ const teacherInstructionsDiv = /*#__PURE__*/_react.default.createElement(_renderUi.PreviewPrompt, {
139
+ tagName: "div",
140
+ className: "prompt",
141
+ defaultClassName: "teacher-instructions",
142
+ prompt: teacherInstructions
143
+ });
144
+ if (disabledTabs) {
145
+ return teacherInstructionsDiv;
146
+ }
147
+ return /*#__PURE__*/_react.default.createElement(_renderUi.Collapsible, {
148
+ labels: {
149
+ hidden: 'Show Teacher Instructions',
150
+ visible: 'Hide Teacher Instructions'
210
151
  }
211
-
212
- var teacherInstructionsDiv = /*#__PURE__*/_react["default"].createElement(_renderUi.PreviewPrompt, {
213
- tagName: "div",
214
- className: "prompt",
215
- defaultClassName: "teacher-instructions",
216
- prompt: teacherInstructions
217
- });
218
-
219
- if (disabledTabs) {
220
- return teacherInstructionsDiv;
152
+ }, teacherInstructionsDiv);
153
+ }
154
+ renderTab(tab, disabledTabs) {
155
+ return /*#__PURE__*/_react.default.createElement(Passage, {
156
+ key: tab.id,
157
+ id: `tabpanel-${tab.id}`,
158
+ role: "tabpanel",
159
+ "aria-labelledby": `button-${tab.id}`
160
+ }, this.renderInstructions(tab.teacherInstructions, disabledTabs), (tab.title || tab.subtitle) && /*#__PURE__*/_react.default.createElement("h2", null, tab.title && /*#__PURE__*/_react.default.createElement(_renderUi.Purpose, {
161
+ purpose: "passage-title"
162
+ }, /*#__PURE__*/_react.default.createElement(PassageTitle, {
163
+ dangerouslySetInnerHTML: {
164
+ __html: this.parsedText(tab.title)
221
165
  }
222
-
223
- return /*#__PURE__*/_react["default"].createElement(_renderUi.Collapsible, {
224
- labels: {
225
- hidden: 'Show Teacher Instructions',
226
- visible: 'Hide Teacher Instructions'
227
- }
228
- }, teacherInstructionsDiv);
166
+ })), tab.subtitle && /*#__PURE__*/_react.default.createElement(_renderUi.Purpose, {
167
+ purpose: "passage-subtitle"
168
+ }, /*#__PURE__*/_react.default.createElement(PassageSubtitle, {
169
+ dangerouslySetInnerHTML: {
170
+ __html: this.parsedText(tab.subtitle)
171
+ }
172
+ }))), tab.author && /*#__PURE__*/_react.default.createElement(_renderUi.Purpose, {
173
+ purpose: "passage-author"
174
+ }, /*#__PURE__*/_react.default.createElement(PassageAuthor, {
175
+ className: "author",
176
+ dangerouslySetInnerHTML: {
177
+ __html: this.parsedText(tab.author)
178
+ }
179
+ })), tab.text && /*#__PURE__*/_react.default.createElement(_renderUi.Purpose, {
180
+ purpose: "passage-text"
181
+ }, /*#__PURE__*/_react.default.createElement("div", {
182
+ key: tab.id,
183
+ className: "text",
184
+ dangerouslySetInnerHTML: {
185
+ __html: this.parsedText(tab.text)
186
+ }
187
+ })));
188
+ }
189
+ render() {
190
+ const {
191
+ model,
192
+ tabs,
193
+ disabledTabs
194
+ } = this.props;
195
+ const {
196
+ activeTab
197
+ } = this.state;
198
+ if (!tabs?.length) {
199
+ return;
229
200
  }
230
- }, {
231
- key: "renderTab",
232
- value: function renderTab(tab, disabledTabs) {
233
- var classes = this.props.classes;
234
- return /*#__PURE__*/_react["default"].createElement("div", {
235
- className: (0, _classnames["default"])(classes.passage, 'passage'),
236
- key: tab.id,
237
- id: "tabpanel-".concat(tab.id),
238
- role: "tabpanel",
239
- "aria-labelledby": "button-".concat(tab.id)
240
- }, this.renderInstructions(tab.teacherInstructions, disabledTabs), (tab.title || tab.subtitle) && /*#__PURE__*/_react["default"].createElement("h2", null, tab.title && /*#__PURE__*/_react["default"].createElement(_renderUi.Purpose, {
241
- purpose: "passage-title"
242
- }, /*#__PURE__*/_react["default"].createElement("div", {
243
- className: (0, _classnames["default"])(classes.passageTitle, 'title'),
244
- dangerouslySetInnerHTML: {
245
- __html: this.parsedText(tab.title)
246
- }
247
- })), tab.subtitle && /*#__PURE__*/_react["default"].createElement(_renderUi.Purpose, {
248
- purpose: "passage-subtitle"
249
- }, /*#__PURE__*/_react["default"].createElement("div", {
250
- className: (0, _classnames["default"])(classes.passageSubtitle, 'subtitle'),
251
- dangerouslySetInnerHTML: {
252
- __html: this.parsedText(tab.subtitle)
253
- }
254
- }))), tab.author && /*#__PURE__*/_react["default"].createElement(_renderUi.Purpose, {
255
- purpose: "passage-author"
256
- }, /*#__PURE__*/_react["default"].createElement("div", {
257
- className: (0, _classnames["default"])(classes.passageAuthor, 'author'),
258
- dangerouslySetInnerHTML: {
259
- __html: this.parsedText(tab.author)
260
- }
261
- })), tab.text && /*#__PURE__*/_react["default"].createElement(_renderUi.Purpose, {
262
- purpose: "passage-text"
263
- }, /*#__PURE__*/_react["default"].createElement("div", {
264
- key: tab.id,
265
- className: (0, _classnames["default"])(classes.passageText, 'text'),
201
+ const {
202
+ extraCSSRules
203
+ } = model || {};
204
+ const selectedTab = (tabs || []).find(tab => tab.id === activeTab);
205
+ return /*#__PURE__*/_react.default.createElement(_renderUi.UiLayout, {
206
+ extraCSSRules: extraCSSRules
207
+ }, /*#__PURE__*/_react.default.createElement(PassagesContainer, {
208
+ className: "passages"
209
+ }, disabledTabs || tabs.length === 1 ? tabs.map(tab => this.renderTab(tab, disabledTabs)) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_Tabs.default, {
210
+ sx: {
211
+ position: 'sticky',
212
+ top: 0,
213
+ background: _renderUi.color.background(),
214
+ color: _renderUi.color.text()
215
+ },
216
+ value: activeTab,
217
+ onChange: this.handleChange
218
+ }, tabs.map(tab => /*#__PURE__*/_react.default.createElement(TabStyled, {
219
+ key: tab.id,
220
+ id: `button-${tab.id}`,
221
+ label: /*#__PURE__*/_react.default.createElement(_renderUi.Purpose, {
222
+ purpose: "passage-label"
223
+ }, /*#__PURE__*/_react.default.createElement("span", {
266
224
  dangerouslySetInnerHTML: {
267
- __html: this.parsedText(tab.text)
225
+ __html: this.parsedText(tab.label)
268
226
  }
269
- })));
270
- }
271
- }, {
272
- key: "render",
273
- value: function render() {
274
- var _this2 = this;
275
-
276
- var _this$props = this.props,
277
- classes = _this$props.classes,
278
- model = _this$props.model,
279
- tabs = _this$props.tabs,
280
- disabledTabs = _this$props.disabledTabs;
281
- var activeTab = this.state.activeTab;
282
-
283
- if (!(tabs !== null && tabs !== void 0 && tabs.length)) {
284
- return;
285
- }
286
-
287
- var _ref = model || {},
288
- extraCSSRules = _ref.extraCSSRules;
289
-
290
- var selectedTab = (tabs || []).find(function (tab) {
291
- return tab.id === activeTab;
292
- });
293
- return /*#__PURE__*/_react["default"].createElement(_renderUi.UiLayout, {
294
- extraCSSRules: extraCSSRules,
295
- className: (0, _classnames["default"])(classes.passages, 'passages')
296
- }, disabledTabs || tabs.length === 1 ? tabs.map(function (tab) {
297
- return _this2.renderTab(tab, disabledTabs);
298
- }) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_Tabs["default"], {
299
- classes: {
300
- root: classes.stickyTabs,
301
- flexContainer: classes.tabButton
302
- },
303
- value: activeTab,
304
- onChange: this.handleChange
305
- }, tabs.map(function (tab) {
306
- return /*#__PURE__*/_react["default"].createElement(_Tab["default"], {
307
- className: classes.tab,
308
- key: tab.id,
309
- id: "button-".concat(tab.id),
310
- label: /*#__PURE__*/_react["default"].createElement(_renderUi.Purpose, {
311
- purpose: "passage-label"
312
- }, /*#__PURE__*/_react["default"].createElement("span", {
313
- dangerouslySetInnerHTML: {
314
- __html: _this2.parsedText(tab.label)
315
- }
316
- })),
317
- value: tab.id,
318
- tabIndex: activeTab === tab.id ? 0 : -1,
319
- "aria-controls": "tabpanel-".concat(tab.id),
320
- "aria-selected": activeTab === tab.id,
321
- onFocus: function onFocus() {
322
- return _this2.handleChange(null, tab.id);
323
- },
324
- onKeyDown: function onKeyDown(event) {
325
- return _this2.handleKeyDown(event, tab.id);
326
- }
327
- });
328
- })), selectedTab ? this.renderTab(selectedTab, disabledTabs) : null));
329
- }
330
- }]);
331
- return StimulusTabs;
332
- }(_react["default"].Component);
333
-
227
+ })),
228
+ value: tab.id,
229
+ tabIndex: activeTab === tab.id ? 0 : -1,
230
+ "aria-controls": `tabpanel-${tab.id}`,
231
+ "aria-selected": activeTab === tab.id,
232
+ onFocus: () => this.handleChange(null, tab.id),
233
+ onKeyDown: event => this.handleKeyDown(event, tab.id)
234
+ }))), selectedTab ? this.renderTab(selectedTab, disabledTabs) : null)));
235
+ }
236
+ }
334
237
  StimulusTabs.propTypes = {
335
- classes: _propTypes["default"].object.isRequired,
336
- tabs: _propTypes["default"].arrayOf(_propTypes["default"].shape({
337
- id: _propTypes["default"].number.isRequired,
338
- label: _propTypes["default"].string.isRequired,
339
- title: _propTypes["default"].string.isRequired,
340
- subtitle: _propTypes["default"].string,
341
- author: _propTypes["default"].string,
342
- text: _propTypes["default"].string.isRequired,
343
- teacherInstructions: _propTypes["default"].string
238
+ tabs: _propTypes.default.arrayOf(_propTypes.default.shape({
239
+ id: _propTypes.default.number.isRequired,
240
+ label: _propTypes.default.string.isRequired,
241
+ title: _propTypes.default.string.isRequired,
242
+ subtitle: _propTypes.default.string,
243
+ author: _propTypes.default.string,
244
+ text: _propTypes.default.string.isRequired,
245
+ teacherInstructions: _propTypes.default.string
344
246
  }).isRequired).isRequired,
345
- disabledTabs: _propTypes["default"].bool
247
+ disabledTabs: _propTypes.default.bool,
248
+ model: _propTypes.default.object
346
249
  };
347
-
348
- var _default = (0, _styles.withStyles)(styles)(StimulusTabs);
349
-
350
- exports["default"] = _default;
351
- //# sourceMappingURL=stimulus-tabs.js.map
250
+ var _default = exports.default = StimulusTabs;
251
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9wcm9wVHlwZXMiLCJfVGFicyIsIl9UYWIiLCJfc3R5bGVzIiwiX3JlbmRlclVpIiwiUGFzc2FnZXNDb250YWluZXIiLCJzdHlsZWQiLCJmbGV4R3JvdyIsImJhY2tncm91bmRDb2xvciIsImNvbG9yIiwiYmFja2dyb3VuZCIsInRleHQiLCJib3JkZXJDb2xsYXBzZSIsInBhZGRpbmciLCJ0ZXh0QWxpZ24iLCJQYXNzYWdlIiwidGhlbWUiLCJzcGFjaW5nIiwiUGFzc2FnZVRpdGxlIiwiZm9udFNpemUiLCJQYXNzYWdlU3VidGl0bGUiLCJQYXNzYWdlQXV0aG9yIiwiVGFiU3R5bGVkIiwiVGFiIiwicGFsZXR0ZSIsImNvbW1vbiIsIndoaXRlIiwiYmxhY2siLCJTdGltdWx1c1RhYnMiLCJSZWFjdCIsIkNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwiYXJncyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0IiwiYWN0aXZlVGFiIiwiZXZlbnQiLCJzZXRTdGF0ZSIsInNldFRpbWVvdXQiLCJ0YWJDaGFuZ2VFdmVudCIsIkN1c3RvbUV2ZW50IiwiZGV0YWlsIiwidGFiIiwid2luZG93IiwiZGlzcGF0Y2hFdmVudCIsImN1cnJlbnRUYWJJZCIsImtleSIsInRhYnMiLCJwcm9wcyIsIm5ld1RhYkluZGV4IiwiY3VycmVudEluZGV4IiwiZmluZEluZGV4IiwiaWQiLCJsZW5ndGgiLCJwcmV2ZW50RGVmYXVsdCIsImhhbmRsZUNoYW5nZSIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJmb2N1cyIsImRpdiIsImNyZWF0ZUVsZW1lbnQiLCJpbm5lckhUTUwiLCJyZXBsYWNlIiwiYXVkaW8iLCJxdWVyeVNlbGVjdG9yIiwic291cmNlIiwic2V0QXR0cmlidXRlIiwiZ2V0QXR0cmlidXRlIiwicmVtb3ZlQXR0cmlidXRlIiwiYXBwZW5kQ2hpbGQiLCJyZW5kZXJJbnN0cnVjdGlvbnMiLCJ0ZWFjaGVySW5zdHJ1Y3Rpb25zIiwiZGlzYWJsZWRUYWJzIiwidGVhY2hlckluc3RydWN0aW9uc0RpdiIsIlByZXZpZXdQcm9tcHQiLCJ0YWdOYW1lIiwiY2xhc3NOYW1lIiwiZGVmYXVsdENsYXNzTmFtZSIsInByb21wdCIsIkNvbGxhcHNpYmxlIiwibGFiZWxzIiwiaGlkZGVuIiwidmlzaWJsZSIsInJlbmRlclRhYiIsInJvbGUiLCJ0aXRsZSIsInN1YnRpdGxlIiwiUHVycG9zZSIsInB1cnBvc2UiLCJkYW5nZXJvdXNseVNldElubmVySFRNTCIsIl9faHRtbCIsInBhcnNlZFRleHQiLCJhdXRob3IiLCJyZW5kZXIiLCJtb2RlbCIsInN0YXRlIiwiZXh0cmFDU1NSdWxlcyIsInNlbGVjdGVkVGFiIiwiZmluZCIsIlVpTGF5b3V0IiwibWFwIiwiRnJhZ21lbnQiLCJzeCIsInBvc2l0aW9uIiwidG9wIiwidmFsdWUiLCJvbkNoYW5nZSIsImxhYmVsIiwidGFiSW5kZXgiLCJvbkZvY3VzIiwib25LZXlEb3duIiwiaGFuZGxlS2V5RG93biIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsImFycmF5T2YiLCJzaGFwZSIsIm51bWJlciIsImlzUmVxdWlyZWQiLCJzdHJpbmciLCJib29sIiwib2JqZWN0IiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL3N0aW11bHVzLXRhYnMuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFRhYnMgZnJvbSAnQG11aS9tYXRlcmlhbC9UYWJzJztcbmltcG9ydCBUYWIgZnJvbSAnQG11aS9tYXRlcmlhbC9UYWInO1xuaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQG11aS9tYXRlcmlhbC9zdHlsZXMnO1xuaW1wb3J0IHsgQ29sbGFwc2libGUsIGNvbG9yLCBQcmV2aWV3UHJvbXB0LCBQdXJwb3NlLCBVaUxheW91dCB9IGZyb20gJ0BwaWUtbGliL3JlbmRlci11aSc7XG5cbmNvbnN0IFBhc3NhZ2VzQ29udGFpbmVyID0gc3R5bGVkKCdkaXYnKSh7XG4gIGZsZXhHcm93OiAxLFxuICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yLmJhY2tncm91bmQoKSxcbiAgY29sb3I6IGNvbG9yLnRleHQoKSxcbiAgJyY6bm90KC5NYXRoSmF4KSB0YWJsZSc6IHtcbiAgICBib3JkZXJDb2xsYXBzZTogJ2NvbGxhcHNlJyxcbiAgfSxcbiAgJyY6bm90KC5NYXRoSmF4KSB0YWJsZSB0ZCwgJjpub3QoLk1hdGhKYXgpIHRhYmxlIHRoJzoge1xuICAgIHBhZGRpbmc6ICcuNmVtIDFlbScsXG4gICAgdGV4dEFsaWduOiAnbGVmdCcsXG4gIH0sXG59KTtcblxuY29uc3QgUGFzc2FnZSA9IHN0eWxlZCgnZGl2JykoKHsgdGhlbWUgfSkgPT4gKHtcbiAgYmFja2dyb3VuZENvbG9yOiBjb2xvci5iYWNrZ3JvdW5kKCksXG4gIGNvbG9yOiBjb2xvci50ZXh0KCksXG4gIHBhZGRpbmc6IHRoZW1lLnNwYWNpbmcoMiksXG59KSk7XG5cbmNvbnN0IFBhc3NhZ2VUaXRsZSA9IHN0eWxlZCgnZGl2Jykoe1xuICBmb250U2l6ZTogJzEuNzVyZW0nLFxufSk7XG5cbmNvbnN0IFBhc3NhZ2VTdWJ0aXRsZSA9IHN0eWxlZCgnZGl2Jykoe1xuICBmb250U2l6ZTogJzEuNXJlbScsXG59KTtcblxuY29uc3QgUGFzc2FnZUF1dGhvciA9IHN0eWxlZCgnZGl2Jykoe1xuICBmb250U2l6ZTogJzEuMjVyZW0nLFxufSk7XG5cbmNvbnN0IFRhYlN0eWxlZCA9IHN0eWxlZChUYWIpKCh7IHRoZW1lIH0pID0+ICh7XG4gIGJhY2tncm91bmQ6IHRoZW1lLnBhbGV0dGUuY29tbW9uLndoaXRlLCAvLyByZXBsYWNlIHdpdGggY29sb3IuYmFja2dyb3VuZCgpIG9uY2UgUEQtMjgwMSBpcyBET05FXG4gIGZvbnRTaXplOiAnaW5oZXJpdCcsXG4gIGNvbG9yOiB0aGVtZS5wYWxldHRlLmNvbW1vbi5ibGFjaywgLy8gcmVtb3ZlIHdoZW4gUEQtMjgwMSBpcyBET05FXG59KSk7XG5cbmNsYXNzIFN0aW11bHVzVGFicyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHN0YXRlID0ge1xuICAgIGFjdGl2ZVRhYjogMCxcbiAgfTtcblxuICBoYW5kbGVDaGFuZ2UgPSAoZXZlbnQsIGFjdGl2ZVRhYikgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoKCkgPT4gKHsgYWN0aXZlVGFiIH0pKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgdGFiQ2hhbmdlRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3BpZS11aS1wYXNzYWdlLXRhYkNoYW5nZWQnLCB7XG4gICAgICAgIGRldGFpbDogeyB0YWI6IGFjdGl2ZVRhYiB9LFxuICAgICAgfSk7XG5cbiAgICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KHRhYkNoYW5nZUV2ZW50KTtcbiAgICB9KTtcbiAgfTtcblxuICBoYW5kbGVLZXlEb3duID0gKGV2ZW50LCBjdXJyZW50VGFiSWQpID0+IHtcbiAgICBjb25zdCB7IGtleSB9ID0gZXZlbnQ7XG4gICAgY29uc3QgeyB0YWJzIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgbGV0IG5ld1RhYkluZGV4ID0gLTE7XG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gdGFicy5maW5kSW5kZXgoKHRhYikgPT4gdGFiLmlkID09PSBjdXJyZW50VGFiSWQpO1xuXG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICAvLyBNb3ZlIHRvIHRoZSBuZXh0IHRhYlxuICAgICAgICBuZXdUYWJJbmRleCA9IChjdXJyZW50SW5kZXggKyAxKSAlIHRhYnMubGVuZ3RoO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIC8vIE1vdmUgdG8gdGhlIHByZXZpb3VzIHRhYlxuICAgICAgICBuZXdUYWJJbmRleCA9IChjdXJyZW50SW5kZXggLSAxICsgdGFicy5sZW5ndGgpICUgdGFicy5sZW5ndGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gQ29tbWVudGVkIG91dCBBcnJvd0Rvd24gYW5kIEFycm93VXAgZm9yIGZ1dHVyZSB2ZXJ0aWNhbCB0YWIgbmF2aWdhdGlvblxuICAgICAgLy8gY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgIC8vICAgLy8gTW92ZSB0byB0aGUgbmV4dCB0YWIgKGZvciB2ZXJ0aWNhbCBhbGlnbm1lbnQpXG4gICAgICAvLyAgIG5ld1RhYkluZGV4ID0gKGN1cnJlbnRJbmRleCArIDEpICUgdGFicy5sZW5ndGg7XG4gICAgICAvLyAgIGJyZWFrO1xuICAgICAgLy8gY2FzZSAnQXJyb3dVcCc6XG4gICAgICAvLyAgIC8vIE1vdmUgdG8gdGhlIHByZXZpb3VzIHRhYiAoZm9yIHZlcnRpY2FsIGFsaWdubWVudClcbiAgICAgIC8vICAgbmV3VGFiSW5kZXggPSAoY3VycmVudEluZGV4IC0gMSArIHRhYnMubGVuZ3RoKSAlIHRhYnMubGVuZ3RoO1xuICAgICAgLy8gICBicmVhaztcbiAgICAgIGNhc2UgJ0hvbWUnOlxuICAgICAgICAvLyBNb3ZlIHRvIHRoZSBmaXJzdCB0YWJcbiAgICAgICAgbmV3VGFiSW5kZXggPSAwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VuZCc6XG4gICAgICAgIC8vIE1vdmUgdG8gdGhlIGxhc3QgdGFiXG4gICAgICAgIG5ld1RhYkluZGV4ID0gdGFicy5sZW5ndGggLSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgIGNhc2UgJyAnOlxuICAgICAgICAvLyBBY3RpdmF0ZSB0aGUgY3VycmVudCB0YWJcbiAgICAgICAgbmV3VGFiSW5kZXggPSBjdXJyZW50SW5kZXg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKG5ld1RhYkluZGV4ICE9PSAtMSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlKGV2ZW50LCB0YWJzW25ld1RhYkluZGV4XS5pZCk7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgYnV0dG9uLSR7dGFic1tuZXdUYWJJbmRleF0uaWR9YCkuZm9jdXMoKTtcbiAgICB9XG4gIH07XG5cbiAgcGFyc2VkVGV4dCA9ICh0ZXh0ID0gJycpID0+IHtcbiAgICAvLyBmaXggaW1wb3J0ZWQgYXVkaW8gY29udGVudCBmb3IgU2FmYXJpIFBELTEzOTFcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYuaW5uZXJIVE1MID0gdGV4dC5yZXBsYWNlKC8oPGJyXFwvPlxcbikvZywgJzxici8+Jyk7XG5cbiAgICBjb25zdCBhdWRpbyA9IGRpdi5xdWVyeVNlbGVjdG9yKCdhdWRpbycpO1xuXG4gICAgaWYgKGF1ZGlvKSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzb3VyY2UnKTtcblxuICAgICAgc291cmNlLnNldEF0dHJpYnV0ZSgndHlwZScsICdhdWRpby9tcDMnKTtcbiAgICAgIHNvdXJjZS5zZXRBdHRyaWJ1dGUoJ3NyYycsIGF1ZGlvLmdldEF0dHJpYnV0ZSgnc3JjJykpO1xuXG4gICAgICBhdWRpby5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpO1xuICAgICAgYXVkaW8uYXBwZW5kQ2hpbGQoc291cmNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGl2LmlubmVySFRNTDtcbiAgfTtcblxuICByZW5kZXJJbnN0cnVjdGlvbnModGVhY2hlckluc3RydWN0aW9ucywgZGlzYWJsZWRUYWJzID0gZmFsc2UpIHtcbiAgICBpZiAoIXRlYWNoZXJJbnN0cnVjdGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRGl2ID0gKFxuICAgICAgPFByZXZpZXdQcm9tcHRcbiAgICAgICAgdGFnTmFtZT1cImRpdlwiXG4gICAgICAgIGNsYXNzTmFtZT1cInByb21wdFwiXG4gICAgICAgIGRlZmF1bHRDbGFzc05hbWU9XCJ0ZWFjaGVyLWluc3RydWN0aW9uc1wiXG4gICAgICAgIHByb21wdD17dGVhY2hlckluc3RydWN0aW9uc31cbiAgICAgIC8+XG4gICAgKTtcblxuICAgIGlmIChkaXNhYmxlZFRhYnMpIHtcbiAgICAgIHJldHVybiB0ZWFjaGVySW5zdHJ1Y3Rpb25zRGl2O1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8Q29sbGFwc2libGVcbiAgICAgICAgbGFiZWxzPXt7XG4gICAgICAgICAgaGlkZGVuOiAnU2hvdyBUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgICAgdmlzaWJsZTogJ0hpZGUgVGVhY2hlciBJbnN0cnVjdGlvbnMnLFxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICB7dGVhY2hlckluc3RydWN0aW9uc0Rpdn1cbiAgICAgIDwvQ29sbGFwc2libGU+XG4gICAgKTtcbiAgfVxuXG4gIHJlbmRlclRhYih0YWIsIGRpc2FibGVkVGFicykge1xuICAgIHJldHVybiAoXG4gICAgICA8UGFzc2FnZSBrZXk9e3RhYi5pZH0gaWQ9e2B0YWJwYW5lbC0ke3RhYi5pZH1gfSByb2xlPVwidGFicGFuZWxcIiBhcmlhLWxhYmVsbGVkYnk9e2BidXR0b24tJHt0YWIuaWR9YH0+XG4gICAgICAgIHt0aGlzLnJlbmRlckluc3RydWN0aW9ucyh0YWIudGVhY2hlckluc3RydWN0aW9ucywgZGlzYWJsZWRUYWJzKX1cblxuICAgICAgICB7KHRhYi50aXRsZSB8fCB0YWIuc3VidGl0bGUpICYmIChcbiAgICAgICAgICA8aDI+XG4gICAgICAgICAgICB7dGFiLnRpdGxlICYmIChcbiAgICAgICAgICAgICAgPFB1cnBvc2UgcHVycG9zZT1cInBhc3NhZ2UtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICA8UGFzc2FnZVRpdGxlIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogdGhpcy5wYXJzZWRUZXh0KHRhYi50aXRsZSkgfX0vPlxuICAgICAgICAgICAgICA8L1B1cnBvc2U+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAge3RhYi5zdWJ0aXRsZSAmJiAoXG4gICAgICAgICAgICAgIDxQdXJwb3NlIHB1cnBvc2U9XCJwYXNzYWdlLXN1YnRpdGxlXCI+XG4gICAgICAgICAgICAgICAgPFBhc3NhZ2VTdWJ0aXRsZSBkYW5nZXJvdXNseVNldElubmVySFRNTD17eyBfX2h0bWw6IHRoaXMucGFyc2VkVGV4dCh0YWIuc3VidGl0bGUpIH19XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9QdXJwb3NlPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2gyPlxuICAgICAgICApfVxuXG4gICAgICAgIHt0YWIuYXV0aG9yICYmIChcbiAgICAgICAgICA8UHVycG9zZSBwdXJwb3NlPVwicGFzc2FnZS1hdXRob3JcIj5cbiAgICAgICAgICAgIDxQYXNzYWdlQXV0aG9yIGNsYXNzTmFtZT1cImF1dGhvclwiIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogdGhpcy5wYXJzZWRUZXh0KHRhYi5hdXRob3IpIH19Lz5cbiAgICAgICAgICA8L1B1cnBvc2U+XG4gICAgICAgICl9XG5cbiAgICAgICAge3RhYi50ZXh0ICYmIChcbiAgICAgICAgICA8UHVycG9zZSBwdXJwb3NlPVwicGFzc2FnZS10ZXh0XCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGtleT17dGFiLmlkfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3sgX19odG1sOiB0aGlzLnBhcnNlZFRleHQodGFiLnRleHQpIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvUHVycG9zZT5cbiAgICAgICAgKX1cbiAgICAgIDwvUGFzc2FnZT5cbiAgICApO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHsgbW9kZWwsIHRhYnMsIGRpc2FibGVkVGFicyB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7IGFjdGl2ZVRhYiB9ID0gdGhpcy5zdGF0ZTtcblxuICAgIGlmICghdGFicz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBleHRyYUNTU1J1bGVzIH0gPSBtb2RlbCB8fCB7fTtcbiAgICBjb25zdCBzZWxlY3RlZFRhYiA9ICh0YWJzIHx8IFtdKS5maW5kKCh0YWIpID0+IHRhYi5pZCA9PT0gYWN0aXZlVGFiKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8VWlMYXlvdXQgZXh0cmFDU1NSdWxlcz17ZXh0cmFDU1NSdWxlc30+XG4gICAgICAgIDxQYXNzYWdlc0NvbnRhaW5lciBjbGFzc05hbWU9XCJwYXNzYWdlc1wiPlxuICAgICAgICAgIHtkaXNhYmxlZFRhYnMgfHwgdGFicy5sZW5ndGggPT09IDEgPyAoXG4gICAgICAgICAgICB0YWJzLm1hcCgodGFiKSA9PiB0aGlzLnJlbmRlclRhYih0YWIsIGRpc2FibGVkVGFicykpXG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgIDxUYWJzXG4gICAgICAgICAgICAgICAgc3g9e3sgcG9zaXRpb246ICdzdGlja3knLCB0b3A6IDAsIGJhY2tncm91bmQ6IGNvbG9yLmJhY2tncm91bmQoKSwgY29sb3I6IGNvbG9yLnRleHQoKSB9fVxuICAgICAgICAgICAgICAgIHZhbHVlPXthY3RpdmVUYWJ9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuaGFuZGxlQ2hhbmdlfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3RhYnMubWFwKCh0YWIpID0+IChcbiAgICAgICAgICAgICAgICAgIDxUYWJTdHlsZWRcbiAgICAgICAgICAgICAgICAgICAga2V5PXt0YWIuaWR9XG4gICAgICAgICAgICAgICAgICAgIGlkPXtgYnV0dG9uLSR7dGFiLmlkfWB9XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsPXtcbiAgICAgICAgICAgICAgICAgICAgICA8UHVycG9zZSBwdXJwb3NlPVwicGFzc2FnZS1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3sgX19odG1sOiB0aGlzLnBhcnNlZFRleHQodGFiLmxhYmVsKSB9fS8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9QdXJwb3NlPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0YWIuaWR9XG4gICAgICAgICAgICAgICAgICAgIHRhYkluZGV4PXthY3RpdmVUYWIgPT09IHRhYi5pZCA/IDAgOiAtMX1cbiAgICAgICAgICAgICAgICAgICAgYXJpYS1jb250cm9scz17YHRhYnBhbmVsLSR7dGFiLmlkfWB9XG4gICAgICAgICAgICAgICAgICAgIGFyaWEtc2VsZWN0ZWQ9e2FjdGl2ZVRhYiA9PT0gdGFiLmlkfVxuICAgICAgICAgICAgICAgICAgICBvbkZvY3VzPXsoKSA9PiB0aGlzLmhhbmRsZUNoYW5nZShudWxsLCB0YWIuaWQpfVxuICAgICAgICAgICAgICAgICAgICBvbktleURvd249eyhldmVudCkgPT4gdGhpcy5oYW5kbGVLZXlEb3duKGV2ZW50LCB0YWIuaWQpfVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgPC9UYWJzPlxuICAgICAgICAgICAgICB7c2VsZWN0ZWRUYWIgPyB0aGlzLnJlbmRlclRhYihzZWxlY3RlZFRhYiwgZGlzYWJsZWRUYWJzKSA6IG51bGx9XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApfVxuICAgICAgICA8L1Bhc3NhZ2VzQ29udGFpbmVyPlxuICAgICAgPC9VaUxheW91dD5cbiAgICApO1xuICB9XG59XG5cblN0aW11bHVzVGFicy5wcm9wVHlwZXMgPSB7XG4gIHRhYnM6IFByb3BUeXBlcy5hcnJheU9mKFxuICAgIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICBpZDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICAgICAgbGFiZWw6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICAgIHRpdGxlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgICBzdWJ0aXRsZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgIGF1dGhvcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgIHRleHQ6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgfSkuaXNSZXF1aXJlZCxcbiAgKS5pc1JlcXVpcmVkLFxuICBkaXNhYmxlZFRhYnM6IFByb3BUeXBlcy5ib29sLFxuICBtb2RlbDogUHJvcFR5cGVzLm9iamVjdCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFN0aW11bHVzVGFicztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxVQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxLQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxJQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxPQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxTQUFBLEdBQUFMLE9BQUE7QUFFQSxNQUFNTSxpQkFBaUIsR0FBRyxJQUFBQyxjQUFNLEVBQUMsS0FBSyxDQUFDLENBQUM7RUFDdENDLFFBQVEsRUFBRSxDQUFDO0VBQ1hDLGVBQWUsRUFBRUMsZUFBSyxDQUFDQyxVQUFVLENBQUMsQ0FBQztFQUNuQ0QsS0FBSyxFQUFFQSxlQUFLLENBQUNFLElBQUksQ0FBQyxDQUFDO0VBQ25CLHVCQUF1QixFQUFFO0lBQ3ZCQyxjQUFjLEVB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