@agilemotion/oui-react-js 2.0.12 → 2.0.14

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.
@@ -0,0 +1,407 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.MultiLookupField = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _Utils = _interopRequireDefault(require("../../Utils"));
9
+ var _IconButton = _interopRequireDefault(require("@mui/material/IconButton"));
10
+ var _Dialog = _interopRequireDefault(require("@mui/material/Dialog"));
11
+ var _DialogActions = _interopRequireDefault(require("@mui/material/DialogActions"));
12
+ var _DialogTitle = _interopRequireDefault(require("@mui/material/DialogTitle"));
13
+ var _DialogContent = _interopRequireDefault(require("@mui/material/DialogContent"));
14
+ var _Button = _interopRequireDefault(require("@mui/material/Button"));
15
+ var _Chip = _interopRequireDefault(require("@mui/material/Chip"));
16
+ var _InputLabel = _interopRequireDefault(require("@mui/material/InputLabel"));
17
+ var _FormHelperText = _interopRequireDefault(require("@mui/material/FormHelperText"));
18
+ var _Tooltip = _interopRequireDefault(require("@mui/material/Tooltip"));
19
+ var _Typography = _interopRequireDefault(require("@mui/material/Typography"));
20
+ var _Divider = _interopRequireDefault(require("@mui/material/Divider"));
21
+ var _BaseField = require("./BaseField");
22
+ var _DataGrid = require("../DataGrid");
23
+ var _Observable = _interopRequireDefault(require("../../event/Observable"));
24
+ var _Icon = _interopRequireDefault(require("../Icon"));
25
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
26
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
27
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
28
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
29
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
30
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
31
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
32
+ // Multi-select counterpart to LookupField. Renders selected items as MUI
33
+ // Chips sitting inside a faux-outlined input, with a "..." button matching
34
+ // LookupField's layout for visual continuity. The popup picker reuses the
35
+ // same DataGrid component LookupField uses but forces multiSelect mode so
36
+ // the operator can tick several rows in one go.
37
+ const MultiLookupFieldComponent = /*#__PURE__*/_react.default.memo(props => {
38
+ var _props$config$attribu, _props$config$attribu2, _props$config$attribu3, _props$config$attribu4, _props$config$attribu5, _props$config$attribu6;
39
+ const base = props.base;
40
+ const [currentSelection, setCurrentSelection] = _react.default.useState([]);
41
+ const [open, setOpen] = _react.default.useState(false);
42
+ const width = (_props$config$attribu = props.config.attributes) !== null && _props$config$attribu !== void 0 && (_props$config$attribu = _props$config$attribu.style) !== null && _props$config$attribu !== void 0 && _props$config$attribu.width ? props.config.attributes.style.width : '100%';
43
+ const minWidth = (_props$config$attribu2 = props.config.attributes) !== null && _props$config$attribu2 !== void 0 && (_props$config$attribu2 = _props$config$attribu2.style) !== null && _props$config$attribu2 !== void 0 && _props$config$attribu2.minWidth ? props.config.attributes.style.minWidth : '240px';
44
+ const margin = !_Utils.default.isNull((_props$config$attribu3 = props.config.attributes) === null || _props$config$attribu3 === void 0 || (_props$config$attribu3 = _props$config$attribu3.style) === null || _props$config$attribu3 === void 0 ? void 0 : _props$config$attribu3.margin) ? props.config.attributes.style.margin : '4px 0';
45
+ const value = Array.isArray(base.value) ? base.value : [];
46
+ const label = !_Utils.default.isNull(props.config.attributes) && !_Utils.default.isNull(props.config.attributes.label) ? props.config.attributes.label : null;
47
+ const placeholder = _Utils.default.getComponentAttribute(props.config, 'placeholder', 'No selection');
48
+ // Optional cap on how many items the field can hold. When set, Add
49
+ // appends and trims from the front (so the most-recent N picks win) —
50
+ // making maxItems=1 a clean "replace existing" interaction.
51
+ const rawMax = _Utils.default.getComponentAttribute(props.config, 'maxItems', null);
52
+ const maxItems = typeof rawMax === 'number' && rawMax > 0 ? rawMax : null;
53
+ const handleClose = () => {
54
+ setOpen(false);
55
+ setCurrentSelection([]);
56
+ _Observable.default.clearComponentEventListeners(props.gridHandle.api.id);
57
+ };
58
+ _react.default.useEffect(() => {
59
+ if (props.config && props.config.grid) {
60
+ if (!props.config.grid.attributes) {
61
+ props.config.grid.attributes = {};
62
+ }
63
+ props.config.grid.attributes['margin'] = _Utils.default.getComponentAttribute(props.config.grid, 'margin', '16px');
64
+ // Intentionally do NOT set selectionMode='MULTIPLE' on the grid
65
+ // config. That mode renders a checkbox column in the header AND
66
+ // every row, which (a) doesn't account for any configured column
67
+ // widths that already sum to 100% — causing the last column to
68
+ // wrap on an empty/unsearched grid — and (b) is redundant: the
69
+ // multi-select click-toggle on rows (enabled below via the
70
+ // `multiSelect` prop) handles selection just as well, with the
71
+ // selected-row highlight giving visual feedback.
72
+ if (props.config.grid.selectionMode === 'MULTIPLE') {
73
+ delete props.config.grid.selectionMode;
74
+ }
75
+ }
76
+ }, []);
77
+ function buildSelectedItem(row) {
78
+ let item = {};
79
+ let properties = Object.getOwnPropertyNames(row);
80
+ let displayTemplate = _Utils.default.getComponentAttribute(props.config, 'displayTemplate', '@{dataRecordDescription}');
81
+ let renderedLabel = displayTemplate;
82
+ for (const property of properties) {
83
+ renderedLabel = renderedLabel.replace('@{' + property + '}', row[property]);
84
+ if (property !== 'label') {
85
+ item[property] = row[property];
86
+ }
87
+ }
88
+ item.__oui_label = renderedLabel;
89
+ item.toString = () => renderedLabel;
90
+ return item;
91
+ }
92
+
93
+ // Stable lookup of usernames that are already in the field's value. The
94
+ // picker's search service (e.g. /auth/api/v1/user/search) returns rows
95
+ // with the auth user's UUID as `id`, while the chips were built from
96
+ // the DemandPlanner row's UUID — so de-duplicating by `id` would not
97
+ // catch repeats. `username` is the only field that's reliably the
98
+ // same on both sides.
99
+ const existingUsernames = _react.default.useMemo(() => {
100
+ const set = new Set();
101
+ for (const v of value) {
102
+ if (v && v.username) set.add(String(v.username).toLowerCase());
103
+ }
104
+ return set;
105
+ }, [value]);
106
+ const addSelection = () => {
107
+ if (!currentSelection || currentSelection.length === 0) {
108
+ handleClose();
109
+ return;
110
+ }
111
+ const additions = currentSelection.filter(row => row && row.username && !existingUsernames.has(String(row.username).toLowerCase())).map(buildSelectedItem);
112
+ let next = [...value, ...additions];
113
+ if (maxItems != null && next.length > maxItems) {
114
+ // Newer picks take precedence — drop the oldest entries until
115
+ // we fit. With maxItems=1 this implements the "replace existing"
116
+ // semantics: existing chip is dropped, new pick takes its place.
117
+ next = next.slice(next.length - maxItems);
118
+ }
119
+ base.handleValueChange(next.length > 0 ? next : null);
120
+ handleClose();
121
+ };
122
+
123
+ // Pre-select rows returned by the search that match users already in
124
+ // the field's value, so the operator can see at a glance which results
125
+ // they have already added. The DataGrid fires onRowsLoaded after every
126
+ // data refresh; we tick matching rows via the grid api.
127
+ const preselectExistingRows = _react.default.useCallback(loadedRows => {
128
+ if (!loadedRows || loadedRows.length === 0) return;
129
+ if (!props.gridHandle || !props.gridHandle.api) return;
130
+ const matchingIds = [];
131
+ for (const row of loadedRows) {
132
+ if (row && row.username && existingUsernames.has(String(row.username).toLowerCase())) {
133
+ matchingIds.push(row.id);
134
+ }
135
+ }
136
+ if (matchingIds.length > 0) {
137
+ props.gridHandle.api.select(matchingIds);
138
+ const matchingRows = loadedRows.filter(r => matchingIds.includes(r.id));
139
+ setCurrentSelection(matchingRows);
140
+ }
141
+ }, [existingUsernames, props.gridHandle]);
142
+ const removeItem = id => {
143
+ const next = value.filter(v => v.id !== id);
144
+ base.handleValueChange(next.length > 0 ? next : null);
145
+ };
146
+ const clearAll = () => {
147
+ if (value.length === 0) return;
148
+ base.handleValueChange(null);
149
+ };
150
+ const openSearch = () => {
151
+ setOpen(true);
152
+ };
153
+ const borderColor = base.hasError ? '#f44336' : '#cccccc';
154
+ return /*#__PURE__*/_react.default.createElement("div", {
155
+ className: "w-100 multi-lookup row no-margin no-padding oui-form-item",
156
+ style: _Utils.default.mergeStyles({
157
+ width: width,
158
+ minWidth: minWidth,
159
+ margin: margin,
160
+ marginBottom: base.hasError ? '20px' : '4px',
161
+ marginTop: '8px'
162
+ }, props.config)
163
+ }, !base.disabled && /*#__PURE__*/_react.default.createElement("div", {
164
+ className: 'col-*-*',
165
+ style: {
166
+ width: '72px'
167
+ }
168
+ }, /*#__PURE__*/_react.default.createElement(_Tooltip.default, {
169
+ title: 'Select ' + (label ? label.toLowerCase() : 'items')
170
+ }, /*#__PURE__*/_react.default.createElement("span", null, /*#__PURE__*/_react.default.createElement(_Button.default, {
171
+ style: {
172
+ height: '40px',
173
+ minWidth: '64px'
174
+ },
175
+ variant: 'outlined',
176
+ onClick: openSearch,
177
+ disabled: base.disabled,
178
+ "aria-label": "open picker"
179
+ }, "...")))), /*#__PURE__*/_react.default.createElement("div", {
180
+ className: 'col-*-* no-margin no-padding',
181
+ style: {
182
+ width: !base.disabled ? 'calc(100% - 72px)' : '100%',
183
+ position: 'relative'
184
+ }
185
+ }, label && /*#__PURE__*/_react.default.createElement(_InputLabel.default, {
186
+ required: base.required,
187
+ error: base.hasError,
188
+ shrink: true,
189
+ sx: {
190
+ fontSize: '0.75rem',
191
+ transform: 'translate(8px, -6px) scale(1)',
192
+ background: '#fff',
193
+ padding: '0 4px',
194
+ position: 'absolute',
195
+ zIndex: 1,
196
+ top: 0
197
+ }
198
+ }, label), !base.required && !base.disabled && value.length > 0 && /*#__PURE__*/_react.default.createElement(_Tooltip.default, {
199
+ title: 'Clear all'
200
+ }, /*#__PURE__*/_react.default.createElement(_IconButton.default, {
201
+ size: "small",
202
+ onClick: clearAll,
203
+ sx: {
204
+ position: 'absolute',
205
+ right: 4,
206
+ top: 4,
207
+ zIndex: 2
208
+ }
209
+ }, /*#__PURE__*/_react.default.createElement(_Icon.default, {
210
+ id: 'CLEAR'
211
+ }))), /*#__PURE__*/_react.default.createElement("div", {
212
+ onClick: base.disabled ? undefined : openSearch,
213
+ style: {
214
+ minHeight: '40px',
215
+ border: "1px solid ".concat(borderColor),
216
+ borderRadius: '4px',
217
+ padding: value.length === 0 ? '8px 12px' : '6px 36px 6px 8px',
218
+ display: 'flex',
219
+ flexWrap: 'wrap',
220
+ alignItems: 'center',
221
+ gap: '4px',
222
+ cursor: base.disabled ? 'default' : 'pointer',
223
+ background: base.disabled ? '#fafafa' : '#fff',
224
+ transition: 'border-color 120ms ease'
225
+ }
226
+ }, value.length === 0 && /*#__PURE__*/_react.default.createElement("span", {
227
+ style: {
228
+ color: '#9e9e9e',
229
+ fontSize: '0.875rem',
230
+ fontStyle: 'italic'
231
+ }
232
+ }, base.disabled ? '—' : placeholder), value.map(item => /*#__PURE__*/_react.default.createElement(_Chip.default, {
233
+ key: item.id,
234
+ label: item.__oui_label || item.dataRecordDescription || item.label || item.username || String(item.id),
235
+ onDelete: base.disabled ? undefined : e => {
236
+ e.stopPropagation();
237
+ removeItem(item.id);
238
+ },
239
+ onClick: e => e.stopPropagation(),
240
+ size: "small",
241
+ variant: "outlined",
242
+ sx: {
243
+ maxWidth: '100%',
244
+ '& .MuiChip-label': {
245
+ overflow: 'hidden',
246
+ textOverflow: 'ellipsis'
247
+ }
248
+ }
249
+ }))), base.errorMessage && /*#__PURE__*/_react.default.createElement(_FormHelperText.default, {
250
+ error: true,
251
+ sx: {
252
+ marginLeft: '8px'
253
+ }
254
+ }, base.errorMessage)), /*#__PURE__*/_react.default.createElement(_Dialog.default, {
255
+ open: open,
256
+ onClose: handleClose,
257
+ "aria-labelledby": "multi-lookup-dialog-title",
258
+ fullWidth: true,
259
+ maxWidth: false,
260
+ PaperProps: {
261
+ sx: {
262
+ width: _Utils.default.getComponentAttribute(props.config, 'pickerListWidth', 880),
263
+ maxWidth: '92vw'
264
+ }
265
+ },
266
+ disableBackdropClick: true
267
+ }, /*#__PURE__*/_react.default.createElement(_DialogTitle.default, {
268
+ id: "multi-lookup-dialog-title",
269
+ sx: {
270
+ padding: '16px 24px 12px 24px',
271
+ fontSize: '1.05rem',
272
+ fontWeight: 500
273
+ }
274
+ }, !_Utils.default.isNull(props.config.attributes) && !_Utils.default.isNull((_props$config$attribu4 = props.config.attributes) === null || _props$config$attribu4 === void 0 ? void 0 : _props$config$attribu4.pickerLabel) ? (_props$config$attribu5 = props.config.attributes) === null || _props$config$attribu5 === void 0 ? void 0 : _props$config$attribu5.pickerLabel : (_props$config$attribu6 = props.config.attributes) === null || _props$config$attribu6 === void 0 ? void 0 : _props$config$attribu6.label, /*#__PURE__*/_react.default.createElement(_Typography.default, {
275
+ variant: "caption",
276
+ sx: {
277
+ display: 'block',
278
+ marginTop: '4px',
279
+ color: 'text.secondary',
280
+ fontStyle: 'italic',
281
+ fontSize: '0.75rem'
282
+ }
283
+ }, (() => {
284
+ const tickedNew = currentSelection.filter(r => r && r.username && !existingUsernames.has(String(r.username).toLowerCase())).length;
285
+ const tickedExisting = currentSelection.length - tickedNew;
286
+ const willReplace = maxItems != null && value.length > 0 && tickedNew > 0;
287
+ if (currentSelection.length === 0) {
288
+ if (maxItems === 1 && value.length > 0) {
289
+ return 'Pick a user to replace the current selection (limit: 1)';
290
+ }
291
+ if (maxItems != null) {
292
+ return "Tick a user to add (limit: ".concat(maxItems, ")");
293
+ }
294
+ return 'Tick one or more rows, then press OK';
295
+ }
296
+ if (tickedNew === 0) {
297
+ return "".concat(tickedExisting, " already in your selection \u2014 pick someone new to ").concat(maxItems === 1 ? 'replace it' : 'add');
298
+ }
299
+ if (willReplace && maxItems === 1) {
300
+ return "Will replace the current selection with the newly ticked user";
301
+ }
302
+ if (tickedExisting === 0) {
303
+ return "".concat(tickedNew, " new \u2014 press OK to add to selection");
304
+ }
305
+ return "".concat(tickedNew, " new (").concat(tickedExisting, " already in selection) \u2014 press OK to add the new ").concat(tickedNew === 1 ? 'one' : 'ones');
306
+ })())), /*#__PURE__*/_react.default.createElement(_Divider.default, null), /*#__PURE__*/_react.default.createElement(_DialogContent.default, {
307
+ sx: {
308
+ padding: '0',
309
+ minHeight: '360px',
310
+ maxHeight: '60vh',
311
+ overflow: 'auto'
312
+ }
313
+ }, /*#__PURE__*/_react.default.createElement(_DataGrid.DataGrid, {
314
+ config: props.config.grid,
315
+ handle: props.gridHandle,
316
+ ref: /*#__PURE__*/_react.default.createRef(),
317
+ multiSelect: true,
318
+ viewId: props.viewId,
319
+ onSelectionChange: selection => setCurrentSelection(selection),
320
+ onRowsLoaded: preselectExistingRows
321
+ })), /*#__PURE__*/_react.default.createElement(_Divider.default, null), /*#__PURE__*/_react.default.createElement(_DialogActions.default, {
322
+ sx: {
323
+ padding: '12px 20px'
324
+ }
325
+ }, /*#__PURE__*/_react.default.createElement(_Typography.default, {
326
+ variant: "caption",
327
+ sx: {
328
+ marginRight: 'auto',
329
+ color: 'text.secondary'
330
+ }
331
+ }, value.length > 0 ? "".concat(value.length, " already in selection") : 'Nothing in selection yet'), /*#__PURE__*/_react.default.createElement(_Button.default, {
332
+ onClick: handleClose,
333
+ color: "primary"
334
+ }, "Cancel"), (() => {
335
+ const newCount = currentSelection.filter(r => r && r.username && !existingUsernames.has(String(r.username).toLowerCase())).length;
336
+ const isReplace = maxItems === 1 && value.length > 0 && newCount > 0;
337
+ return /*#__PURE__*/_react.default.createElement(_Button.default, {
338
+ onClick: addSelection,
339
+ color: "primary",
340
+ variant: "contained",
341
+ disabled: newCount === 0
342
+ }, isReplace ? 'Replace' : newCount > 1 ? "Add ".concat(newCount) : 'Add');
343
+ })())));
344
+ });
345
+ const MultiLookupField = exports.MultiLookupField = /*#__PURE__*/_react.default.memo(props => {
346
+ const [gridHandle] = _react.default.useState({});
347
+ return /*#__PURE__*/_react.default.createElement(_BaseField.BaseField, _extends({}, props, {
348
+ handle: props.handle,
349
+ getChildren: () => {
350
+ let children = [];
351
+ children.push(gridHandle);
352
+ return children;
353
+ },
354
+ valueParser: (value, inbound) => {
355
+ if (_Utils.default.isNull(value)) {
356
+ return inbound ? [] : null;
357
+ }
358
+ if (!Array.isArray(value)) {
359
+ // Tolerate the legacy single-object shape coming
360
+ // from older payloads — wrap it into a single-
361
+ // element array so the field can still render.
362
+ value = [value];
363
+ }
364
+
365
+ // Username-keyed dedupe on both inbound and outbound.
366
+ // Legacy data may carry the same user multiple times
367
+ // (different DemandPlanner row UUIDs for the same
368
+ // person). The field shape is supposed to be a Set
369
+ // of users — enforce that here so duplicates never
370
+ // reach the render, save, or chip-removal paths.
371
+ const seen = new Set();
372
+ const deduped = [];
373
+ for (const v of value) {
374
+ if (_Utils.default.isNull(v)) continue;
375
+ const key = v.username ? String(v.username).toLowerCase() : '__id:' + v.id;
376
+ if (seen.has(key)) continue;
377
+ seen.add(key);
378
+ deduped.push(v);
379
+ }
380
+ if (inbound) {
381
+ const result = [];
382
+ for (const v of deduped) {
383
+ const copy = _objectSpread({}, v);
384
+ const renderedLabel = copy.dataRecordDescription || copy.fullName || copy.label || copy.username || String(copy.id || '');
385
+ copy.__oui_label = renderedLabel;
386
+ copy.toString = () => renderedLabel;
387
+ result.push(copy);
388
+ }
389
+ return result;
390
+ }
391
+
392
+ // Outbound — strip transient fields the server has
393
+ // no business seeing back.
394
+ return deduped.map(v => {
395
+ const out = _objectSpread({}, v);
396
+ delete out.__oui_label;
397
+ delete out.toString;
398
+ return out;
399
+ });
400
+ }
401
+ }), base => /*#__PURE__*/_react.default.createElement(MultiLookupFieldComponent, _extends({
402
+ gridHandle: gridHandle,
403
+ base: base
404
+ }, props)));
405
+ });
406
+ var _default = exports.default = MultiLookupField;
407
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9VdGlscyIsIl9JY29uQnV0dG9uIiwiX0RpYWxvZyIsIl9EaWFsb2dBY3Rpb25zIiwiX0RpYWxvZ1RpdGxlIiwiX0RpYWxvZ0NvbnRlbnQiLCJfQnV0dG9uIiwiX0NoaXAiLCJfSW5wdXRMYWJlbCIsIl9Gb3JtSGVscGVyVGV4dCIsIl9Ub29sdGlwIiwiX1R5cG9ncmFwaHkiLCJfRGl2aWRlciIsIl9CYXNlRmllbGQiLCJfRGF0YUdyaWQiLCJfT2JzZXJ2YWJsZSIsIl9JY29uIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiX2V4dGVuZHMiLCJPYmplY3QiLCJhc3NpZ24iLCJiaW5kIiwibiIsImFyZ3VtZW50cyIsImxlbmd0aCIsInQiLCJyIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiYXBwbHkiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsIl9vYmplY3RTcHJlYWQiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIl90b1Byb3BlcnR5S2V5IiwidmFsdWUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImkiLCJfdG9QcmltaXRpdmUiLCJTeW1ib2wiLCJ0b1ByaW1pdGl2ZSIsIlR5cGVFcnJvciIsIlN0cmluZyIsIk51bWJlciIsIk11bHRpTG9va3VwRmllbGRDb21wb25lbnQiLCJSZWFjdCIsIm1lbW8iLCJwcm9wcyIsIl9wcm9wcyRjb25maWckYXR0cmlidSIsIl9wcm9wcyRjb25maWckYXR0cmlidTIiLCJfcHJvcHMkY29uZmlnJGF0dHJpYnUzIiwiX3Byb3BzJGNvbmZpZyRhdHRyaWJ1NCIsIl9wcm9wcyRjb25maWckYXR0cmlidTUiLCJfcHJvcHMkY29uZmlnJGF0dHJpYnU2IiwiYmFzZSIsImN1cnJlbnRTZWxlY3Rpb24iLCJzZXRDdXJyZW50U2VsZWN0aW9uIiwidXNlU3RhdGUiLCJvcGVuIiwic2V0T3BlbiIsIndpZHRoIiwiY29uZmlnIiwiYXR0cmlidXRlcyIsInN0eWxlIiwibWluV2lkdGgiLCJtYXJnaW4iLCJVdGlscyIsImlzTnVsbCIsIkFycmF5IiwiaXNBcnJheSIsImxhYmVsIiwicGxhY2Vob2xkZXIiLCJnZXRDb21wb25lbnRBdHRyaWJ1dGUiLCJyYXdNYXgiLCJtYXhJdGVtcyIsImhhbmRsZUNsb3NlIiwiZXZlbnRNYW5hZ2VyIiwiY2xlYXJDb21wb25lbnRFdmVudExpc3RlbmVycyIsImdyaWRIYW5kbGUiLCJhcGkiLCJpZCIsInVzZUVmZmVjdCIsImdyaWQiLCJzZWxlY3Rpb25Nb2RlIiwiYnVpbGRTZWxlY3RlZEl0ZW0iLCJyb3ciLCJpdGVtIiwicHJvcGVydGllcyIsImdldE93blByb3BlcnR5TmFtZXMiLCJkaXNwbGF5VGVtcGxhdGUiLCJyZW5kZXJlZExhYmVsIiwicHJvcGVydHkiLCJyZXBsYWNlIiwiX19vdWlfbGFiZWwiLCJ0b1N0cmluZyIsImV4aXN0aW5nVXNlcm5hbWVzIiwidXNlTWVtbyIsInNldCIsIlNldCIsInYiLCJ1c2VybmFtZSIsImFkZCIsInRvTG93ZXJDYXNlIiwiYWRkU2VsZWN0aW9uIiwiYWRkaXRpb25zIiwiaGFzIiwibWFwIiwibmV4dCIsInNsaWNlIiwiaGFuZGxlVmFsdWVDaGFuZ2UiLCJwcmVzZWxlY3RFeGlzdGluZ1Jvd3MiLCJ1c2VDYWxsYmFjayIsImxvYWRlZFJvd3MiLCJtYXRjaGluZ0lkcyIsInNlbGVjdCIsIm1hdGNoaW5nUm93cyIsImluY2x1ZGVzIiwicmVtb3ZlSXRlbSIsImNsZWFyQWxsIiwib3BlblNlYXJjaCIsImJvcmRlckNvbG9yIiwiaGFzRXJyb3IiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwibWVyZ2VTdHlsZXMiLCJtYXJnaW5Cb3R0b20iLCJtYXJnaW5Ub3AiLCJkaXNhYmxlZCIsInRpdGxlIiwiaGVpZ2h0IiwidmFyaWFudCIsIm9uQ2xpY2siLCJwb3NpdGlvbiIsInJlcXVpcmVkIiwiZXJyb3IiLCJzaHJpbmsiLCJzeCIsImZvbnRTaXplIiwidHJhbnNmb3JtIiwiYmFja2dyb3VuZCIsInBhZGRpbmciLCJ6SW5kZXgiLCJ0b3AiLCJzaXplIiwicmlnaHQiLCJ1bmRlZmluZWQiLCJtaW5IZWlnaHQiLCJib3JkZXIiLCJjb25jYXQiLCJib3JkZXJSYWRpdXMiLCJkaXNwbGF5IiwiZmxleFdyYXAiLCJhbGlnbkl0ZW1zIiwiZ2FwIiwiY3Vyc29yIiwidHJhbnNpdGlvbiIsImNvbG9yIiwiZm9udFN0eWxlIiwia2V5IiwiZGF0YVJlY29yZERlc2NyaXB0aW9uIiwib25EZWxldGUiLCJzdG9wUHJvcGFnYXRpb24iLCJtYXhXaWR0aCIsIm92ZXJmbG93IiwidGV4dE92ZXJmbG93IiwiZXJyb3JNZXNzYWdlIiwibWFyZ2luTGVmdCIsIm9uQ2xvc2UiLCJmdWxsV2lkdGgiLCJQYXBlclByb3BzIiwiZGlzYWJsZUJhY2tkcm9wQ2xpY2siLCJmb250V2VpZ2h0IiwicGlja2VyTGFiZWwiLCJ0aWNrZWROZXciLCJ0aWNrZWRFeGlzdGluZyIsIndpbGxSZXBsYWNlIiwibWF4SGVpZ2h0IiwiRGF0YUdyaWQiLCJoYW5kbGUiLCJyZWYiLCJjcmVhdGVSZWYiLCJtdWx0aVNlbGVjdCIsInZpZXdJZCIsIm9uU2VsZWN0aW9uQ2hhbmdlIiwic2VsZWN0aW9uIiwib25Sb3dzTG9hZGVkIiwibWFyZ2luUmlnaHQiLCJuZXdDb3VudCIsImlzUmVwbGFjZSIsIk11bHRpTG9va3VwRmllbGQiLCJleHBvcnRzIiwiQmFzZUZpZWxkIiwiZ2V0Q2hpbGRyZW4iLCJjaGlsZHJlbiIsInZhbHVlUGFyc2VyIiwiaW5ib3VuZCIsInNlZW4iLCJkZWR1cGVkIiwicmVzdWx0IiwiY29weSIsImZ1bGxOYW1lIiwib3V0IiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9NdWx0aUxvb2t1cEZpZWxkLmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4uLy4uL1V0aWxzJztcbmltcG9ydCBJY29uQnV0dG9uIGZyb20gJ0BtdWkvbWF0ZXJpYWwvSWNvbkJ1dHRvbic7XG5pbXBvcnQgRGlhbG9nIGZyb20gJ0BtdWkvbWF0ZXJpYWwvRGlhbG9nJztcbmltcG9ydCBEaWFsb2dBY3Rpb25zIGZyb20gJ0BtdWkvbWF0ZXJpYWwvRGlhbG9nQWN0aW9ucyc7XG5pbXBvcnQgRGlhbG9nVGl0bGUgZnJvbSAnQG11aS9tYXRlcmlhbC9EaWFsb2dUaXRsZSc7XG5pbXBvcnQgRGlhbG9nQ29udGVudCBmcm9tICdAbXVpL21hdGVyaWFsL0RpYWxvZ0NvbnRlbnQnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICdAbXVpL21hdGVyaWFsL0J1dHRvbic7XG5pbXBvcnQgQ2hpcCBmcm9tICdAbXVpL21hdGVyaWFsL0NoaXAnO1xuaW1wb3J0IElucHV0TGFiZWwgZnJvbSAnQG11aS9tYXRlcmlhbC9JbnB1dExhYmVsJztcbmltcG9ydCBGb3JtSGVscGVyVGV4dCBmcm9tICdAbXVpL21hdGVyaWFsL0Zvcm1IZWxwZXJUZXh0JztcbmltcG9ydCBUb29sdGlwIGZyb20gJ0BtdWkvbWF0ZXJpYWwvVG9vbHRpcCc7XG5pbXBvcnQgVHlwb2dyYXBoeSBmcm9tICdAbXVpL21hdGVyaWFsL1R5cG9ncmFwaHknO1xuaW1wb3J0IERpdmlkZXIgZnJvbSAnQG11aS9tYXRlcmlhbC9EaXZpZGVyJztcbmltcG9ydCB7IEJhc2VGaWVsZCB9IGZyb20gJy4vQmFzZUZpZWxkJztcbmltcG9ydCB7IERhdGFHcmlkIH0gZnJvbSAnLi4vRGF0YUdyaWQnO1xuaW1wb3J0IGV2ZW50TWFuYWdlciBmcm9tICcuLi8uLi9ldmVudC9PYnNlcnZhYmxlJztcbmltcG9ydCBJY29uIGZyb20gJy4uL0ljb24nO1xuXG4vLyBNdWx0aS1zZWxlY3QgY291bnRlcnBhcnQgdG8gTG9va3VwRmllbGQuIFJlbmRlcnMgc2VsZWN0ZWQgaXRlbXMgYXMgTVVJXG4vLyBDaGlwcyBzaXR0aW5nIGluc2lkZSBhIGZhdXgtb3V0bGluZWQgaW5wdXQsIHdpdGggYSBcIi4uLlwiIGJ1dHRvbiBtYXRjaGluZ1xuLy8gTG9va3VwRmllbGQncyBsYXlvdXQgZm9yIHZpc3VhbCBjb250aW51aXR5LiBUaGUgcG9wdXAgcGlja2VyIHJldXNlcyB0aGVcbi8vIHNhbWUgRGF0YUdyaWQgY29tcG9uZW50IExvb2t1cEZpZWxkIHVzZXMgYnV0IGZvcmNlcyBtdWx0aVNlbGVjdCBtb2RlIHNvXG4vLyB0aGUgb3BlcmF0b3IgY2FuIHRpY2sgc2V2ZXJhbCByb3dzIGluIG9uZSBnby5cbmNvbnN0IE11bHRpTG9va3VwRmllbGRDb21wb25lbnQgPSBSZWFjdC5tZW1vKChwcm9wcykgPT4ge1xuICAgIGNvbnN0IGJhc2UgPSBwcm9wcy5iYXNlO1xuICAgIGNvbnN0IFtjdXJyZW50U2VsZWN0aW9uLCBzZXRDdXJyZW50U2VsZWN0aW9uXSA9IFJlYWN0LnVzZVN0YXRlKFtdKTtcbiAgICBjb25zdCBbb3Blbiwgc2V0T3Blbl0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3Qgd2lkdGggPSBwcm9wcy5jb25maWcuYXR0cmlidXRlcz8uc3R5bGU/LndpZHRoID8gcHJvcHMuY29uZmlnLmF0dHJpYnV0ZXMuc3R5bGUud2lkdGggOiAnMTAwJSc7XG4gICAgY29uc3QgbWluV2lkdGggPSBwcm9wcy5jb25maWcuYXR0cmlidXRlcz8uc3R5bGU/Lm1pbldpZHRoID8gcHJvcHMuY29uZmlnLmF0dHJpYnV0ZXMuc3R5bGUubWluV2lkdGggOiAnMjQwcHgnO1xuICAgIGNvbnN0IG1hcmdpbiA9ICFVdGlscy5pc051bGwocHJvcHMuY29uZmlnLmF0dHJpYnV0ZXM/LnN0eWxlPy5tYXJnaW4pID8gcHJvcHMuY29uZmlnLmF0dHJpYnV0ZXMuc3R5bGUubWFyZ2luIDogJzRweCAwJztcblxuICAgIGNvbnN0IHZhbHVlID0gQXJyYXkuaXNBcnJheShiYXNlLnZhbHVlKSA/IGJhc2UudmFsdWUgOiBbXTtcbiAgICBjb25zdCBsYWJlbCA9ICFVdGlscy5pc051bGwocHJvcHMuY29uZmlnLmF0dHJpYnV0ZXMpICYmICFVdGlscy5pc051bGwocHJvcHMuY29uZmlnLmF0dHJpYnV0ZXMubGFiZWwpXG4gICAgICAgID8gcHJvcHMuY29uZmlnLmF0dHJpYnV0ZXMubGFiZWwgOiBudWxsO1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gVXRpbHMuZ2V0Q29tcG9uZW50QXR0cmlidXRlKHByb3BzLmNvbmZpZywgJ3BsYWNlaG9sZGVyJywgJ05vIHNlbGVjdGlvbicpO1xuICAgIC8vIE9wdGlvbmFsIGNhcCBvbiBob3cgbWFueSBpdGVtcyB0aGUgZmllbGQgY2FuIGhvbGQuIFdoZW4gc2V0LCBBZGRcbiAgICAvLyBhcHBlbmRzIGFuZCB0cmltcyBmcm9tIHRoZSBmcm9udCAoc28gdGhlIG1vc3QtcmVjZW50IE4gcGlja3Mgd2luKSDigJRcbiAgICAvLyBtYWtpbmcgbWF4SXRlbXM9MSBhIGNsZWFuIFwicmVwbGFjZSBleGlzdGluZ1wiIGludGVyYWN0aW9uLlxuICAgIGNvbnN0IHJhd01heCA9IFV0aWxzLmdldENvbXBvbmVudEF0dHJpYnV0ZShwcm9wcy5jb25maWcsICdtYXhJdGVtcycsIG51bGwpO1xuICAgIGNvbnN0IG1heEl0ZW1zID0gKHR5cGVvZiByYXdNYXggPT09ICdudW1iZXInICYmIHJhd01heCA+IDApID8gcmF3TWF4IDogbnVsbDtcblxuICAgIGNvbnN0IGhhbmRsZUNsb3NlID0gKCkgPT4ge1xuICAgICAgICBzZXRPcGVuKGZhbHNlKTtcbiAgICAgICAgc2V0Q3VycmVudFNlbGVjdGlvbihbXSk7XG4gICAgICAgIGV2ZW50TWFuYWdlci5jbGVhckNvbXBvbmVudEV2ZW50TGlzdGVuZXJzKHByb3BzLmdyaWRIYW5kbGUuYXBpLmlkKTtcbiAgICB9O1xuXG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKHByb3BzLmNvbmZpZyAmJiBwcm9wcy5jb25maWcuZ3JpZCkge1xuICAgICAgICAgICAgaWYgKCFwcm9wcy5jb25maWcuZ3JpZC5hdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgcHJvcHMuY29uZmlnLmdyaWQuYXR0cmlidXRlcyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJvcHMuY29uZmlnLmdyaWQuYXR0cmlidXRlc1snbWFyZ2luJ10gPSBVdGlscy5nZXRDb21wb25lbnRBdHRyaWJ1dGUocHJvcHMuY29uZmlnLmdyaWQsICdtYXJnaW4nLCAnMTZweCcpO1xuICAgICAgICAgICAgLy8gSW50ZW50aW9uYWxseSBkbyBOT1Qgc2V0IHNlbGVjdGlvbk1vZGU9J01VTFRJUExFJyBvbiB0aGUgZ3JpZFxuICAgICAgICAgICAgLy8gY29uZmlnLiBUaGF0IG1vZGUgcmVuZGVycyBhIGNoZWNrYm94IGNvbHVtbiBpbiB0aGUgaGVhZGVyIEFORFxuICAgICAgICAgICAgLy8gZXZlcnkgcm93LCB3aGljaCAoYSkgZG9lc24ndCBhY2NvdW50IGZvciBhbnkgY29uZmlndXJlZCBjb2x1bW5cbiAgICAgICAgICAgIC8vIHdpZHRocyB0aGF0IGFscmVhZHkgc3VtIHRvIDEwMCUg4oCUIGNhdXNpbmcgdGhlIGxhc3QgY29sdW1uIHRvXG4gICAgICAgICAgICAvLyB3cmFwIG9uIGFuIGVtcHR5L3Vuc2VhcmNoZWQgZ3JpZCDigJQgYW5kIChiKSBpcyByZWR1bmRhbnQ6IHRoZVxuICAgICAgICAgICAgLy8gbXVsdGktc2VsZWN0IGNsaWNrLXRvZ2dsZSBvbiByb3dzIChlbmFibGVkIGJlbG93IHZpYSB0aGVcbiAgICAgICAgICAgIC8vIGBtdWx0aVNlbGVjdGAgcHJvcCkgaGFuZGxlcyBzZWxlY3Rpb24ganVzdCBhcyB3ZWxsLCB3aXRoIHRoZVxuICAgICAgICAgICAgLy8gc2VsZWN0ZWQtcm93IGhpZ2hsaWdodCBnaXZpbmcgdmlzdWFsIGZlZWRiYWNrLlxuICAgICAgICAgICAgaWYgKHByb3BzLmNvbmZpZy5ncmlkLnNlbGVjdGlvbk1vZGUgPT09ICdNVUxUSVBMRScpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgcHJvcHMuY29uZmlnLmdyaWQuc2VsZWN0aW9uTW9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIFtdKTtcblxuICAgIGZ1bmN0aW9uIGJ1aWxkU2VsZWN0ZWRJdGVtKHJvdykge1xuICAgICAgICBsZXQgaXRlbSA9IHt9O1xuICAgICAgICBsZXQgcHJvcGVydGllcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHJvdyk7XG4gICAgICAgIGxldCBkaXNwbGF5VGVtcGxhdGUgPSBVdGlscy5nZXRDb21wb25lbnRBdHRyaWJ1dGUocHJvcHMuY29uZmlnLCAnZGlzcGxheVRlbXBsYXRlJywgJ0B7ZGF0YVJlY29yZERlc2NyaXB0aW9ufScpO1xuICAgICAgICBsZXQgcmVuZGVyZWRMYWJlbCA9IGRpc3BsYXlUZW1wbGF0ZTtcblxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIHJlbmRlcmVkTGFiZWwgPSByZW5kZXJlZExhYmVsLnJlcGxhY2UoJ0B7JyArIHByb3BlcnR5ICsgJ30nLCByb3dbcHJvcGVydHldKTtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPT0gJ2xhYmVsJykge1xuICAgICAgICAgICAgICAgIGl0ZW1bcHJvcGVydHldID0gcm93W3Byb3BlcnR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW0uX19vdWlfbGFiZWwgPSByZW5kZXJlZExhYmVsO1xuICAgICAgICBpdGVtLnRvU3RyaW5nID0gKCkgPT4gcmVuZGVyZWRMYWJlbDtcbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuXG4gICAgLy8gU3RhYmxlIGxvb2t1cCBvZiB1c2VybmFtZXMgdGhhdCBhcmUgYWxyZWFkeSBpbiB0aGUgZmllbGQncyB2YWx1ZS4gVGhlXG4gICAgLy8gcGlja2VyJ3Mgc2VhcmNoIHNlcnZpY2UgKGUuZy4gL2F1dGgvYXBpL3YxL3VzZXIvc2VhcmNoKSByZXR1cm5zIHJvd3NcbiAgICAvLyB3aXRoIHRoZSBhdXRoIHVzZXIncyBVVUlEIGFzIGBpZGAsIHdoaWxlIHRoZSBjaGlwcyB3ZXJlIGJ1aWx0IGZyb21cbiAgICAvLyB0aGUgRGVtYW5kUGxhbm5lciByb3cncyBVVUlEIOKAlCBzbyBkZS1kdXBsaWNhdGluZyBieSBgaWRgIHdvdWxkIG5vdFxuICAgIC8vIGNhdGNoIHJlcGVhdHMuIGB1c2VybmFtZWAgaXMgdGhlIG9ubHkgZmllbGQgdGhhdCdzIHJlbGlhYmx5IHRoZVxuICAgIC8vIHNhbWUgb24gYm90aCBzaWRlcy5cbiAgICBjb25zdCBleGlzdGluZ1VzZXJuYW1lcyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBjb25zdCBzZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHYgJiYgdi51c2VybmFtZSkgc2V0LmFkZChTdHJpbmcodi51c2VybmFtZSkudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNldDtcbiAgICB9LCBbdmFsdWVdKTtcblxuICAgIGNvbnN0IGFkZFNlbGVjdGlvbiA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFjdXJyZW50U2VsZWN0aW9uIHx8IGN1cnJlbnRTZWxlY3Rpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBoYW5kbGVDbG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWRkaXRpb25zID0gY3VycmVudFNlbGVjdGlvblxuICAgICAgICAgICAgLmZpbHRlcihyb3cgPT4gcm93ICYmIHJvdy51c2VybmFtZSAmJiAhZXhpc3RpbmdVc2VybmFtZXMuaGFzKFN0cmluZyhyb3cudXNlcm5hbWUpLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAgICAgLm1hcChidWlsZFNlbGVjdGVkSXRlbSk7XG5cbiAgICAgICAgbGV0IG5leHQgPSBbLi4udmFsdWUsIC4uLmFkZGl0aW9uc107XG4gICAgICAgIGlmIChtYXhJdGVtcyAhPSBudWxsICYmIG5leHQubGVuZ3RoID4gbWF4SXRlbXMpIHtcbiAgICAgICAgICAgIC8vIE5ld2VyIHBpY2tzIHRha2UgcHJlY2VkZW5jZSDigJQgZHJvcCB0aGUgb2xkZXN0IGVudHJpZXMgdW50aWxcbiAgICAgICAgICAgIC8vIHdlIGZpdC4gV2l0aCBtYXhJdGVtcz0xIHRoaXMgaW1wbGVtZW50cyB0aGUgXCJyZXBsYWNlIGV4aXN0aW5nXCJcbiAgICAgICAgICAgIC8vIHNlbWFudGljczogZXhpc3RpbmcgY2hpcCBpcyBkcm9wcGVkLCBuZXcgcGljayB0YWtlcyBpdHMgcGxhY2UuXG4gICAgICAgICAgICBuZXh0ID0gbmV4dC5zbGljZShuZXh0Lmxlbmd0aCAtIG1heEl0ZW1zKTtcbiAgICAgICAgfVxuICAgICAgICBiYXNlLmhhbmRsZVZhbHVlQ2hhbmdlKG5leHQubGVuZ3RoID4gMCA/IG5leHQgOiBudWxsKTtcbiAgICAgICAgaGFuZGxlQ2xvc2UoKTtcbiAgICB9O1xuXG4gICAgLy8gUHJlLXNlbGVjdCByb3dzIHJldHVybmVkIGJ5IHRoZSBzZWFyY2ggdGhhdCBtYXRjaCB1c2VycyBhbHJlYWR5IGluXG4gICAgLy8gdGhlIGZpZWxkJ3MgdmFsdWUsIHNvIHRoZSBvcGVyYXRvciBjYW4gc2VlIGF0IGEgZ2xhbmNlIHdoaWNoIHJlc3VsdHNcbiAgICAvLyB0aGV5IGhhdmUgYWxyZWFkeSBhZGRlZC4gVGhlIERhdGFHcmlkIGZpcmVzIG9uUm93c0xvYWRlZCBhZnRlciBldmVyeVxuICAgIC8vIGRhdGEgcmVmcmVzaDsgd2UgdGljayBtYXRjaGluZyByb3dzIHZpYSB0aGUgZ3JpZCBhcGkuXG4gICAgY29uc3QgcHJlc2VsZWN0RXhpc3RpbmdSb3dzID0gUmVhY3QudXNlQ2FsbGJhY2soKGxvYWRlZFJvd3MpID0+IHtcbiAgICAgICAgaWYgKCFsb2FkZWRSb3dzIHx8IGxvYWRlZFJvd3MubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgIGlmICghcHJvcHMuZ3JpZEhhbmRsZSB8fCAhcHJvcHMuZ3JpZEhhbmRsZS5hcGkpIHJldHVybjtcblxuICAgICAgICBjb25zdCBtYXRjaGluZ0lkcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiBsb2FkZWRSb3dzKSB7XG4gICAgICAgICAgICBpZiAocm93ICYmIHJvdy51c2VybmFtZSAmJiBleGlzdGluZ1VzZXJuYW1lcy5oYXMoU3RyaW5nKHJvdy51c2VybmFtZSkudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICBtYXRjaGluZ0lkcy5wdXNoKHJvdy5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF0Y2hpbmdJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcHJvcHMuZ3JpZEhhbmRsZS5hcGkuc2VsZWN0KG1hdGNoaW5nSWRzKTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nUm93cyA9IGxvYWRlZFJvd3MuZmlsdGVyKHIgPT4gbWF0Y2hpbmdJZHMuaW5jbHVkZXMoci5pZCkpO1xuICAgICAgICAgICAgc2V0Q3VycmVudFNlbGVjdGlvbihtYXRjaGluZ1Jvd3MpO1xuICAgICAgICB9XG4gICAgfSwgW2V4aXN0aW5nVXNlcm5hbWVzLCBwcm9wcy5ncmlkSGFuZGxlXSk7XG5cbiAgICBjb25zdCByZW1vdmVJdGVtID0gKGlkKSA9PiB7XG4gICAgICAgIGNvbnN0IG5leHQgPSB2YWx1ZS5maWx0ZXIodiA9PiB2LmlkICE9PSBpZCk7XG4gICAgICAgIGJhc2UuaGFuZGxlVmFsdWVDaGFuZ2UobmV4dC5sZW5ndGggPiAwID8gbmV4dCA6IG51bGwpO1xuICAgIH07XG5cbiAgICBjb25zdCBjbGVhckFsbCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICBiYXNlLmhhbmRsZVZhbHVlQ2hhbmdlKG51bGwpO1xuICAgIH07XG5cbiAgICBjb25zdCBvcGVuU2VhcmNoID0gKCkgPT4ge1xuICAgICAgICBzZXRPcGVuKHRydWUpO1xuICAgIH07XG5cbiAgICBjb25zdCBib3JkZXJDb2xvciA9IGJhc2UuaGFzRXJyb3IgPyAnI2Y0NDMzNicgOiAnI2NjY2NjYyc7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInctMTAwIG11bHRpLWxvb2t1cCByb3cgbm8tbWFyZ2luIG5vLXBhZGRpbmcgb3VpLWZvcm0taXRlbVwiXG4gICAgICAgICAgICAgc3R5bGU9e1V0aWxzLm1lcmdlU3R5bGVzKHtcbiAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICAgICAgICAgICBtaW5XaWR0aDogbWluV2lkdGgsXG4gICAgICAgICAgICAgICAgIG1hcmdpbjogbWFyZ2luLFxuICAgICAgICAgICAgICAgICBtYXJnaW5Cb3R0b206IGJhc2UuaGFzRXJyb3IgPyAnMjBweCcgOiAnNHB4JyxcbiAgICAgICAgICAgICAgICAgbWFyZ2luVG9wOiAnOHB4J1xuICAgICAgICAgICAgIH0sIHByb3BzLmNvbmZpZyl9PlxuICAgICAgICAgICAgeyFiYXNlLmRpc2FibGVkICYmIChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17J2NvbC0qLSonfSBzdHlsZT17e3dpZHRoOiAnNzJweCd9fT5cbiAgICAgICAgICAgICAgICAgICAgPFRvb2x0aXAgdGl0bGU9eydTZWxlY3QgJyArIChsYWJlbCA/IGxhYmVsLnRvTG93ZXJDYXNlKCkgOiAnaXRlbXMnKX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7aGVpZ2h0OiAnNDBweCcsIG1pbldpZHRoOiAnNjRweCd9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PXsnb3V0bGluZWQnfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXtvcGVuU2VhcmNofVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17YmFzZS5kaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIm9wZW4gcGlja2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9eydjb2wtKi0qIG5vLW1hcmdpbiBuby1wYWRkaW5nJ31cbiAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAhYmFzZS5kaXNhYmxlZCA/ICdjYWxjKDEwMCUgLSA3MnB4KScgOiAnMTAwJScsXG4gICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJ1xuICAgICAgICAgICAgICAgICB9fT5cbiAgICAgICAgICAgICAgICB7bGFiZWwgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRMYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9e2Jhc2UucmVxdWlyZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcj17YmFzZS5oYXNFcnJvcn1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNocmlua1xuICAgICAgICAgICAgICAgICAgICAgICAgc3g9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogJzAuNzVyZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZSg4cHgsIC02cHgpIHNjYWxlKDEpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAnI2ZmZicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogJzAgNHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6SW5kZXg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiAwXG4gICAgICAgICAgICAgICAgICAgICAgICB9fT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtsYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgPC9JbnB1dExhYmVsPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgeyFiYXNlLnJlcXVpcmVkICYmICFiYXNlLmRpc2FibGVkICYmIHZhbHVlLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8VG9vbHRpcCB0aXRsZT17J0NsZWFyIGFsbCd9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPEljb25CdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2NsZWFyQWxsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN4PXt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodDogNCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6SW5kZXg6IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SWNvbiBpZD17J0NMRUFSJ30vPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9JY29uQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2Jhc2UuZGlzYWJsZWQgPyB1bmRlZmluZWQgOiBvcGVuU2VhcmNofVxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgICAgbWluSGVpZ2h0OiAnNDBweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IGAxcHggc29saWQgJHtib3JkZXJDb2xvcn1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnNHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IHZhbHVlLmxlbmd0aCA9PT0gMCA/ICc4cHggMTJweCcgOiAnNnB4IDM2cHggNnB4IDhweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGV4V3JhcDogJ3dyYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBnYXA6ICc0cHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBiYXNlLmRpc2FibGVkID8gJ2RlZmF1bHQnIDogJ3BvaW50ZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogYmFzZS5kaXNhYmxlZCA/ICcjZmFmYWZhJyA6ICcjZmZmJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246ICdib3JkZXItY29sb3IgMTIwbXMgZWFzZSdcbiAgICAgICAgICAgICAgICAgICAgfX0+XG4gICAgICAgICAgICAgICAgICAgIHt2YWx1ZS5sZW5ndGggPT09IDAgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyM5ZTllOWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMC44NzVyZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTdHlsZTogJ2l0YWxpYydcbiAgICAgICAgICAgICAgICAgICAgICAgIH19PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtiYXNlLmRpc2FibGVkID8gJ+KAlCcgOiBwbGFjZWhvbGRlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAge3ZhbHVlLm1hcCgoaXRlbSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPENoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2l0ZW0uaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e2l0ZW0uX19vdWlfbGFiZWwgfHwgaXRlbS5kYXRhUmVjb3JkRGVzY3JpcHRpb24gfHwgaXRlbS5sYWJlbCB8fCBpdGVtLnVzZXJuYW1lIHx8IFN0cmluZyhpdGVtLmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkRlbGV0ZT17YmFzZS5kaXNhYmxlZCA/IHVuZGVmaW5lZCA6IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUl0ZW0oaXRlbS5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4gZS5zdG9wUHJvcGFnYXRpb24oKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3g9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyYgLk11aUNoaXAtbGFiZWwnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0T3ZlcmZsb3c6ICdlbGxpcHNpcydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB7YmFzZS5lcnJvck1lc3NhZ2UgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8Rm9ybUhlbHBlclRleHQgZXJyb3Igc3g9e3ttYXJnaW5MZWZ0OiAnOHB4J319PlxuICAgICAgICAgICAgICAgICAgICAgICAge2Jhc2UuZXJyb3JNZXNzYWdlfVxuICAgICAgICAgICAgICAgICAgICA8L0Zvcm1IZWxwZXJUZXh0PlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxEaWFsb2cgb3Blbj17b3Blbn0gb25DbG9zZT17aGFuZGxlQ2xvc2V9IGFyaWEtbGFiZWxsZWRieT1cIm11bHRpLWxvb2t1cC1kaWFsb2ctdGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICBmdWxsV2lkdGhcbiAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg9e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgICBQYXBlclByb3BzPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICBzeDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBVdGlscy5nZXRDb21wb25lbnRBdHRyaWJ1dGUocHJvcHMuY29uZmlnLCAncGlja2VyTGlzdFdpZHRoJywgODgwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogJzkydncnXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVCYWNrZHJvcENsaWNrPXt0cnVlfT5cbiAgICAgICAgICAgICAgICA8RGlhbG9nVGl0bGUgaWQ9XCJtdWx0aS1sb29rdXAtZGlhbG9nLXRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3g9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6ICcxNnB4IDI0cHggMTJweCAyNHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMS4wNXJlbScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiA1MDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0+XG4gICAgICAgICAgICAgICAgICAgIHshVXRpbHMuaXNOdWxsKHByb3BzLmNvbmZpZy5hdHRyaWJ1dGVzKSAmJiAhVXRpbHMuaXNOdWxsKHByb3BzLmNvbmZpZy5hdHRyaWJ1dGVzPy5waWNrZXJMYWJlbClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcHJvcHMuY29uZmlnLmF0dHJpYnV0ZXM/LnBpY2tlckxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHByb3BzLmNvbmZpZy5hdHRyaWJ1dGVzPy5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgPFR5cG9ncmFwaHkgdmFyaWFudD1cImNhcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeD17e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpblRvcDogJzRweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3RleHQuc2Vjb25kYXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTdHlsZTogJ2l0YWxpYycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogJzAuNzVyZW0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PlxuICAgICAgICAgICAgICAgICAgICAgICAgeygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGlja2VkTmV3ID0gY3VycmVudFNlbGVjdGlvbi5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPT4gciAmJiByLnVzZXJuYW1lICYmICFleGlzdGluZ1VzZXJuYW1lcy5oYXMoU3RyaW5nKHIudXNlcm5hbWUpLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGlja2VkRXhpc3RpbmcgPSBjdXJyZW50U2VsZWN0aW9uLmxlbmd0aCAtIHRpY2tlZE5ldztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3aWxsUmVwbGFjZSA9IG1heEl0ZW1zICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiB0aWNrZWROZXcgPiAwO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTZWxlY3Rpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhJdGVtcyA9PT0gMSAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1BpY2sgYSB1c2VyIHRvIHJlcGxhY2UgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIChsaW1pdDogMSknO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhJdGVtcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFRpY2sgYSB1c2VyIHRvIGFkZCAobGltaXQ6ICR7bWF4SXRlbXN9KWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdUaWNrIG9uZSBvciBtb3JlIHJvd3MsIHRoZW4gcHJlc3MgT0snO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGlja2VkTmV3ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHt0aWNrZWRFeGlzdGluZ30gYWxyZWFkeSBpbiB5b3VyIHNlbGVjdGlvbiDigJQgcGljayBzb21lb25lIG5ldyB0byAke21heEl0ZW1zID09PSAxID8gJ3JlcGxhY2UgaXQnIDogJ2FkZCd9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbGxSZXBsYWNlICYmIG1heEl0ZW1zID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgV2lsbCByZXBsYWNlIHRoZSBjdXJyZW50IHNlbGVjdGlvbiB3aXRoIHRoZSBuZXdseSB0aWNrZWQgdXNlcmA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aWNrZWRFeGlzdGluZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7dGlja2VkTmV3fSBuZXcg4oCUIHByZXNzIE9LIHRvIGFkZCB0byBzZWxlY3Rpb25gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7dGlja2VkTmV3fSBuZXcgKCR7dGlja2VkRXhpc3Rpbmd9IGFscmVhZHkgaW4gc2VsZWN0aW9uKSDigJQgcHJlc3MgT0sgdG8gYWRkIHRoZSBuZXcgJHt0aWNrZWROZXcgPT09IDEgPyAnb25lJyA6ICdvbmVzJ31gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkoKX1cbiAgICAgICAgICAgICAgICAgICAgPC9UeXBvZ3JhcGh5PlxuICAgICAgICAgICAgICAgIDwvRGlhbG9nVGl0bGU+XG4gICAgICAgICAgICAgICAgPERpdmlkZXIvPlxuICAgICAgICAgICAgICAgIDxEaWFsb2dDb250ZW50IHN4PXt7XG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6ICcwJyxcbiAgICAgICAgICAgICAgICAgICAgbWluSGVpZ2h0OiAnMzYwcHgnLFxuICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6ICc2MHZoJyxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6ICdhdXRvJ1xuICAgICAgICAgICAgICAgIH19PlxuICAgICAgICAgICAgICAgICAgICA8RGF0YUdyaWQgY29uZmlnPXtwcm9wcy5jb25maWcuZ3JpZH0gaGFuZGxlPXtwcm9wcy5ncmlkSGFuZGxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPXtSZWFjdC5jcmVhdGVSZWYoKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpU2VsZWN0PXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0lkPXtwcm9wcy52aWV3SWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblNlbGVjdGlvbkNoYW5nZT17KHNlbGVjdGlvbikgPT4gc2V0Q3VycmVudFNlbGVjdGlvbihzZWxlY3Rpb24pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Sb3dzTG9hZGVkPXtwcmVzZWxlY3RFeGlzdGluZ1Jvd3N9Lz5cbiAgICAgICAgICAgICAgICA8L0RpYWxvZ0NvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPERpdmlkZXIvPlxuICAgICAgICAgICAgICAgIDxEaWFsb2dBY3Rpb25zIHN4PXt7cGFkZGluZzogJzEycHggMjBweCd9fT5cbiAgICAgICAgICAgICAgICAgICAgPFR5cG9ncmFwaHkgdmFyaWFudD1cImNhcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeD17e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luUmlnaHQ6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAndGV4dC5zZWNvbmRhcnknXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PlxuICAgICAgICAgICAgICAgICAgICAgICAge3ZhbHVlLmxlbmd0aCA+IDAgPyBgJHt2YWx1ZS5sZW5ndGh9IGFscmVhZHkgaW4gc2VsZWN0aW9uYCA6ICdOb3RoaW5nIGluIHNlbGVjdGlvbiB5ZXQnfVxuICAgICAgICAgICAgICAgICAgICA8L1R5cG9ncmFwaHk+XG4gICAgICAgICAgICAgICAgICAgIDxCdXR0b24gb25DbGljaz17aGFuZGxlQ2xvc2V9IGNvbG9yPVwicHJpbWFyeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICB7KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvdW50ID0gY3VycmVudFNlbGVjdGlvbi5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9PiByICYmIHIudXNlcm5hbWUgJiYgIWV4aXN0aW5nVXNlcm5hbWVzLmhhcyhTdHJpbmcoci51c2VybmFtZSkudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNSZXBsYWNlID0gbWF4SXRlbXMgPT09IDEgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiBuZXdDb3VudCA+IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b24gb25DbGljaz17YWRkU2VsZWN0aW9ufSBjb2xvcj1cInByaW1hcnlcIiB2YXJpYW50PVwiY29udGFpbmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtuZXdDb3VudCA9PT0gMH0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpc1JlcGxhY2UgPyAnUmVwbGFjZScgOiAobmV3Q291bnQgPiAxID8gYEFkZCAke25ld0NvdW50fWAgOiAnQWRkJyl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KSgpfVxuICAgICAgICAgICAgICAgIDwvRGlhbG9nQWN0aW9ucz5cbiAgICAgICAgICAgIDwvRGlhbG9nPlxuICAgICAgICA8L2Rpdj5cbiAgICApO1xufSk7XG5cbmV4cG9ydCBjb25zdCBNdWx0aUxvb2t1cEZpZWxkID0gUmVhY3QubWVtbygocHJvcHMpID0+IHtcbiAgICBjb25zdCBbZ3JpZEhhbmRsZV0gPSBSZWFjdC51c2VTdGF0ZSh7fSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8QmFzZUZpZWxkIHsuLi5wcm9wc30gaGFuZGxlPXtwcm9wcy5oYW5kbGV9IGdldENoaWxkcmVuPXtcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGdyaWRIYW5kbGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbjtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgdmFsdWVQYXJzZXI9eyh2YWx1ZSwgaW5ib3VuZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICBpZiAoVXRpbHMuaXNOdWxsKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluYm91bmQgPyBbXSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUb2xlcmF0ZSB0aGUgbGVnYWN5IHNpbmdsZS1vYmplY3Qgc2hhcGUgY29taW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIG9sZGVyIHBheWxvYWRzIOKAlCB3cmFwIGl0IGludG8gYSBzaW5nbGUtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50IGFycmF5IHNvIHRoZSBmaWVsZCBjYW4gc3RpbGwgcmVuZGVyLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBbdmFsdWVdO1xuICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlcm5hbWUta2V5ZWQgZGVkdXBlIG9uIGJvdGggaW5ib3VuZCBhbmQgb3V0Ym91bmQuXG4gICAgICAgICAgICAgICAgICAgICAgIC8vIExlZ2FjeSBkYXRhIG1heSBjYXJyeSB0aGUgc2FtZSB1c2VyIG11bHRpcGxlIHRpbWVzXG4gICAgICAgICAgICAgICAgICAgICAgIC8vIChkaWZmZXJlbnQgRGVtYW5kUGxhbm5lciByb3cgVVVJRHMgZm9yIHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcnNvbikuIFRoZSBmaWVsZCBzaGFwZSBpcyBzdXBwb3NlZCB0byBiZSBhIFNldFxuICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB1c2VycyDigJQgZW5mb3JjZSB0aGF0IGhlcmUgc28gZHVwbGljYXRlcyBuZXZlclxuICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFjaCB0aGUgcmVuZGVyLCBzYXZlLCBvciBjaGlwLXJlbW92YWwgcGF0aHMuXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZHVwZWQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB2IG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVXRpbHMuaXNOdWxsKHYpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IHYudXNlcm5hbWUgPyBTdHJpbmcodi51c2VybmFtZSkudG9Mb3dlckNhc2UoKSA6ICgnX19pZDonICsgdi5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVkdXBlZC5wdXNoKHYpO1xuICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluYm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB2IG9mIGRlZHVwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb3B5ID0gey4uLnZ9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVkTGFiZWwgPSBjb3B5LmRhdGFSZWNvcmREZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjb3B5LmZ1bGxOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNvcHkubGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY29weS51c2VybmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBTdHJpbmcoY29weS5pZCB8fCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weS5fX291aV9sYWJlbCA9IHJlbmRlcmVkTGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weS50b1N0cmluZyA9ICgpID0+IHJlbmRlcmVkTGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY29weSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgLy8gT3V0Ym91bmQg4oCUIHN0cmlwIHRyYW5zaWVudCBmaWVsZHMgdGhlIHNlcnZlciBoYXNcbiAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gYnVzaW5lc3Mgc2VlaW5nIGJhY2suXG4gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWR1cGVkLm1hcCh2ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dCA9IHsuLi52fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvdXQuX19vdWlfbGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgb3V0LnRvU3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgfX0+XG4gICAgICAgICAgICB7YmFzZSA9PlxuICAgICAgICAgICAgICAgIDxNdWx0aUxvb2t1cEZpZWxkQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgIGdyaWRIYW5kbGU9e2dyaWRIYW5kbGV9XG4gICAgICAgICAgICAgICAgICAgIGJhc2U9e2Jhc2V9XG4gICAgICAgICAgICAgICAgICAgIHsuLi5wcm9wc30+XG4gICAgICAgICAgICAgICAgPC9NdWx0aUxvb2t1cEZpZWxkQ29tcG9uZW50PlxuICAgICAgICAgICAgfVxuICAgICAgICA8L0Jhc2VGaWVsZD5cbiAgICApO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IE11bHRpTG9va3VwRmllbGQ7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLFdBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLGNBQUEsR0FBQUwsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFLLFlBQUEsR0FBQU4sc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFNLGNBQUEsR0FB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