openstack-uicore-foundation 4.0.96 → 4.0.98

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.
Files changed (95) hide show
  1. package/lib/components/ajaxloader.js +184 -0
  2. package/lib/components/attendance-tracker.js +1992 -0
  3. package/lib/components/bulk-actions-selector.js +194 -0
  4. package/lib/components/circle-button.js +223 -0
  5. package/lib/components/clock.js +678 -0
  6. package/lib/components/exclusive-wrapper.js +151 -0
  7. package/lib/components/extra-questions.js +1902 -0
  8. package/lib/components/form-validation.js +190 -0
  9. package/lib/components/forms/rsvp-form.js +940 -0
  10. package/lib/components/forms/simple-form.js +708 -0
  11. package/lib/components/free-text-search.js +2042 -0
  12. package/lib/components/google-map.js +576 -0
  13. package/lib/components/index.js +12840 -0
  14. package/lib/components/inputs/access-levels-input.js +2306 -0
  15. package/lib/components/inputs/action-dropdown.js +219 -0
  16. package/lib/components/inputs/checkbox-list.js +339 -0
  17. package/lib/components/inputs/company-input.js +2341 -0
  18. package/lib/components/inputs/country-dropdown.js +2399 -0
  19. package/lib/components/inputs/country-input.js +2302 -0
  20. package/lib/components/inputs/datetimepicker.js +314 -0
  21. package/lib/components/inputs/dropdown.js +259 -0
  22. package/lib/components/inputs/editor-input.js +270 -0
  23. package/lib/components/inputs/event-input.js +2280 -0
  24. package/lib/components/inputs/free-multi-text-input.js +252 -0
  25. package/lib/components/inputs/group-input.js +2275 -0
  26. package/lib/components/inputs/grouped-dropdown.js +244 -0
  27. package/lib/components/inputs/language-input.js +2307 -0
  28. package/lib/components/inputs/member-input.js +2302 -0
  29. package/lib/components/inputs/operator-input.js +328 -0
  30. package/lib/components/inputs/organization-input.js +2325 -0
  31. package/lib/components/inputs/promocode-input.js +2310 -0
  32. package/lib/components/inputs/radio-list.js +297 -0
  33. package/lib/components/inputs/registration-company-input.js +2470 -0
  34. package/lib/components/inputs/speaker-input.js +2336 -0
  35. package/lib/components/inputs/sponsor-input.js +2284 -0
  36. package/lib/components/inputs/stepped-select.js +197 -0
  37. package/lib/components/inputs/summit-days-select.js +162 -0
  38. package/lib/components/inputs/summit-input.js +2282 -0
  39. package/lib/components/inputs/summit-venues-select.js +172 -0
  40. package/lib/components/inputs/tag-input.js +2352 -0
  41. package/lib/components/inputs/text-input.js +202 -0
  42. package/lib/components/inputs/textarea-input.js +181 -0
  43. package/lib/components/inputs/ticket-types-input.js +2338 -0
  44. package/lib/components/inputs/upload-input-v2.js +834 -0
  45. package/lib/components/inputs/upload-input.js +391 -0
  46. package/lib/components/progressive-img.js +289 -0
  47. package/lib/components/raw-html.js +125 -0
  48. package/lib/components/schedule-builder-constants.js +81 -0
  49. package/lib/components/schedule-builder-view.js +1684 -0
  50. package/lib/components/sections/panel.js +156 -0
  51. package/lib/components/simple-link-list.js +790 -0
  52. package/lib/components/sponsored-project-input.js +2281 -0
  53. package/lib/components/summit-dropdown.js +214 -0
  54. package/lib/components/table-editable.js +895 -0
  55. package/lib/components/table-selectable.js +552 -0
  56. package/lib/components/table-sortable.js +657 -0
  57. package/lib/components/table.js +510 -0
  58. package/lib/components/video-stream.js +226 -0
  59. package/lib/css/components/bulk-actions-selector.css +16 -0
  60. package/lib/css/components/circle-button.css +24 -0
  61. package/lib/css/components/extra-questions.css +29 -0
  62. package/lib/css/components/form-validation.css +29 -0
  63. package/lib/css/components/free-text-search.css +29 -0
  64. package/lib/css/components/index.css +1357 -0
  65. package/lib/css/components/inputs/action-dropdown.css +46 -0
  66. package/lib/css/components/inputs/datetimepicker.css +210 -0
  67. package/lib/css/components/inputs/grouped-dropdown.css +25 -0
  68. package/lib/css/components/inputs/stepped-select.css +12 -0
  69. package/lib/css/components/inputs/upload-input-v2.css +106 -0
  70. package/lib/css/components/inputs/upload-input.css +43 -0
  71. package/lib/css/components/progressive-img.css +16 -0
  72. package/lib/css/components/schedule-builder-view.css +230 -0
  73. package/lib/css/components/simple-link-list.css +189 -0
  74. package/lib/css/components/summit-dropdown.css +35 -0
  75. package/lib/css/components/table-editable.css +145 -0
  76. package/lib/css/components/table-selectable.css +147 -0
  77. package/lib/css/components/table-sortable.css +150 -0
  78. package/lib/css/components/table.css +147 -0
  79. package/lib/i18n.js +449 -0
  80. package/lib/models/index.js +238 -0
  81. package/lib/models/summit-event.js +210 -0
  82. package/lib/security/abstract-auth-callback-route.js +2114 -0
  83. package/lib/security/actions.js +1818 -0
  84. package/lib/security/constants.js +71 -0
  85. package/lib/security/methods.js +1818 -0
  86. package/lib/security/reducers.js +1961 -0
  87. package/lib/security/session-checker.js +2179 -0
  88. package/lib/utils/actions.js +1818 -0
  89. package/lib/utils/fragment-parser.js +207 -0
  90. package/lib/utils/methods.js +369 -0
  91. package/lib/utils/query-actions.js +2154 -0
  92. package/lib/utils/questions-set.js +609 -0
  93. package/lib/utils/reducers.js +1874 -0
  94. package/lib/utils/use-fit-text.js +178 -0
  95. package/package.json +1 -1
@@ -0,0 +1,2399 @@
1
+ (function webpackUniversalModuleDefinition(root, factory) {
2
+ if(typeof exports === 'object' && typeof module === 'object')
3
+ module.exports = factory();
4
+ else if(typeof define === 'function' && define.amd)
5
+ define("openstack-uicore-foundation", [], factory);
6
+ else if(typeof exports === 'object')
7
+ exports["openstack-uicore-foundation"] = factory();
8
+ else
9
+ root["openstack-uicore-foundation"] = factory();
10
+ })(this, () => {
11
+ return /******/ (() => { // webpackBootstrap
12
+ /******/ "use strict";
13
+ /******/ var __webpack_modules__ = ({
14
+
15
+ /***/ "./src/components/inputs/dropdown.js":
16
+ /*!*******************************************!*\
17
+ !*** ./src/components/inputs/dropdown.js ***!
18
+ \*******************************************/
19
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
20
+
21
+ __webpack_require__.r(__webpack_exports__);
22
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
23
+ /* harmony export */ "default": () => (/* binding */ Dropdown)
24
+ /* harmony export */ });
25
+ /* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "@babel/runtime/helpers/extends");
26
+ /* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__);
27
+ /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
28
+ /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__);
29
+ /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ "@babel/runtime/helpers/objectWithoutProperties");
30
+ /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__);
31
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "react");
32
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
33
+ /* harmony import */ var react_select__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-select */ "react-select");
34
+ /* harmony import */ var react_select__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_select__WEBPACK_IMPORTED_MODULE_4__);
35
+
36
+
37
+
38
+ const _excluded = ["onChange", "value", "className", "error", "clearable", "disabled", "overrideCSS", "ariaLabelledBy"];
39
+
40
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
41
+
42
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
43
+
44
+ /**
45
+ * Copyright 2017 OpenStack Foundation
46
+ * Licensed under the Apache License, Version 2.0 (the "License");
47
+ * you may not use this file except in compliance with the License.
48
+ * You may obtain a copy of the License at
49
+ * http://www.apache.org/licenses/LICENSE-2.0
50
+ * Unless required by applicable law or agreed to in writing, software
51
+ * distributed under the License is distributed on an "AS IS" BASIS,
52
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
53
+ * See the License for the specific language governing permissions and
54
+ * limitations under the License.
55
+ **/
56
+
57
+
58
+ class Dropdown extends (react__WEBPACK_IMPORTED_MODULE_3___default().Component) {
59
+ constructor(props) {
60
+ super(props);
61
+ this.handleChange = this.handleChange.bind(this);
62
+ }
63
+
64
+ handleChange(selection) {
65
+ let value = null;
66
+
67
+ if (this.props.isMulti) {
68
+ value = selection ? selection.map(val => val.value) : null;
69
+ } else {
70
+ value = selection ? selection.value : null;
71
+ }
72
+
73
+ let ev = {
74
+ target: {
75
+ id: this.props.id,
76
+ value: value,
77
+ type: 'dropdown'
78
+ }
79
+ };
80
+ this.props.onChange(ev);
81
+ }
82
+
83
+ render() {
84
+ let _this$props = this.props,
85
+ {
86
+ onChange,
87
+ value,
88
+ className,
89
+ error,
90
+ clearable,
91
+ disabled,
92
+ overrideCSS,
93
+ ariaLabelledBy
94
+ } = _this$props,
95
+ rest = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2___default()(_this$props, _excluded);
96
+
97
+ let has_error = this.props.hasOwnProperty('error') && error != '';
98
+ let isClearable = this.props.hasOwnProperty('clearable');
99
+ let isDisabled = this.props.hasOwnProperty('disabled') && disabled == true;
100
+ let theValue = null;
101
+ let selectClassName = className;
102
+
103
+ if (!this.props.hasOwnProperty('overrideCSS') || overrideCSS == false) {
104
+ selectClassName = 'dropdown ' + className + ' ' + (has_error ? 'error' : '');
105
+ }
106
+
107
+ if (this.props.isMulti) {
108
+ theValue = this.props.options.filter(op => value.includes(op.value));
109
+ } else {
110
+ theValue = value instanceof Object || value == null ? value : this.props.options.find(opt => opt.value == value);
111
+ }
112
+
113
+ const selectStyles = {
114
+ menu: styles => _objectSpread(_objectSpread({}, styles), {}, {
115
+ zIndex: 999
116
+ })
117
+ };
118
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement((react_select__WEBPACK_IMPORTED_MODULE_4___default()), _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default()({
119
+ className: selectClassName,
120
+ value: theValue,
121
+ onChange: this.handleChange,
122
+ isClearable: isClearable,
123
+ isDisabled: isDisabled,
124
+ styles: selectStyles,
125
+ "aria-labelledby": ariaLabelledBy
126
+ }, rest)), has_error && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement("p", {
127
+ className: "error-label"
128
+ }, error));
129
+ }
130
+
131
+ }
132
+ Dropdown.defaultProps = {
133
+ ariaLabelledBy: null
134
+ };
135
+
136
+ /***/ }),
137
+
138
+ /***/ "./src/components/security/actions.js":
139
+ /*!********************************************!*\
140
+ !*** ./src/components/security/actions.js ***!
141
+ \********************************************/
142
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
143
+
144
+ __webpack_require__.r(__webpack_exports__);
145
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
146
+ /* harmony export */ "CLEAR_SESSION_STATE": () => (/* binding */ CLEAR_SESSION_STATE),
147
+ /* harmony export */ "LOGOUT_USER": () => (/* binding */ LOGOUT_USER),
148
+ /* harmony export */ "RECEIVE_USER_INFO": () => (/* binding */ RECEIVE_USER_INFO),
149
+ /* harmony export */ "REQUEST_USER_INFO": () => (/* binding */ REQUEST_USER_INFO),
150
+ /* harmony export */ "SESSION_STATE_STATUS_CHANGED": () => (/* binding */ SESSION_STATE_STATUS_CHANGED),
151
+ /* harmony export */ "SESSION_STATE_STATUS_ERROR": () => (/* binding */ SESSION_STATE_STATUS_ERROR),
152
+ /* harmony export */ "SESSION_STATE_STATUS_UNCHANGED": () => (/* binding */ SESSION_STATE_STATUS_UNCHANGED),
153
+ /* harmony export */ "SET_LOGGED_USER": () => (/* binding */ SET_LOGGED_USER),
154
+ /* harmony export */ "UPDATE_SESSION_STATE_STATUS": () => (/* binding */ UPDATE_SESSION_STATE_STATUS),
155
+ /* harmony export */ "UPDATE_USER_INFO": () => (/* binding */ UPDATE_USER_INFO),
156
+ /* harmony export */ "doLogout": () => (/* binding */ doLogout),
157
+ /* harmony export */ "getUserInfo": () => (/* binding */ getUserInfo),
158
+ /* harmony export */ "onUserAuth": () => (/* binding */ onUserAuth),
159
+ /* harmony export */ "updateSessionStateStatus": () => (/* binding */ updateSessionStateStatus),
160
+ /* harmony export */ "updateUserInfo": () => (/* binding */ updateUserInfo)
161
+ /* harmony export */ });
162
+ /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
163
+ /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);
164
+ /* harmony import */ var i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! i18n-react/dist/i18n-react */ "i18n-react/dist/i18n-react");
165
+ /* harmony import */ var i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_1__);
166
+ /* harmony import */ var _utils_actions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/actions */ "./src/utils/actions.js");
167
+ /* harmony import */ var _utils_methods__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/methods */ "./src/utils/methods.js");
168
+ /* harmony import */ var _methods__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./methods */ "./src/components/security/methods.js");
169
+
170
+
171
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
172
+
173
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
174
+
175
+ /**
176
+ * Copyright 2018 OpenStack Foundation
177
+ * Licensed under the Apache License, Version 2.0 (the "License");
178
+ * you may not use this file except in compliance with the License.
179
+ * You may obtain a copy of the License at
180
+ * http://www.apache.org/licenses/LICENSE-2.0
181
+ * Unless required by applicable law or agreed to in writing, software
182
+ * distributed under the License is distributed on an "AS IS" BASIS,
183
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
184
+ * See the License for the specific language governing permissions and
185
+ * limitations under the License.
186
+ **/
187
+
188
+
189
+
190
+
191
+ /**
192
+ * @ignore
193
+ */
194
+
195
+ const SET_LOGGED_USER = 'SET_LOGGED_USER';
196
+ const LOGOUT_USER = 'LOGOUT_USER';
197
+ const REQUEST_USER_INFO = 'REQUEST_USER_INFO';
198
+ const RECEIVE_USER_INFO = 'RECEIVE_USER_INFO';
199
+ const CLEAR_SESSION_STATE = 'CLEAR_SESSION_STATE';
200
+ const UPDATE_SESSION_STATE_STATUS = 'UPDATE_SESSION_STATE_STATUS';
201
+ const SESSION_STATE_STATUS_UNCHANGED = 'unchanged';
202
+ const SESSION_STATE_STATUS_CHANGED = 'changed';
203
+ const SESSION_STATE_STATUS_ERROR = 'error';
204
+ const UPDATE_USER_INFO = 'UPDATE_USER_INFO';
205
+ const onUserAuth = (accessToken, idToken, sessionState, expiresIn = 0, refreshToken = null) => dispatch => {
206
+ (0,_methods__WEBPACK_IMPORTED_MODULE_4__.storeAuthInfo)(accessToken, expiresIn, refreshToken, idToken);
207
+ dispatch({
208
+ type: SET_LOGGED_USER,
209
+ payload: {
210
+ sessionState
211
+ }
212
+ });
213
+ };
214
+ const doLogout = backUrl => (dispatch, getState) => {
215
+ dispatch({
216
+ type: LOGOUT_USER,
217
+ payload: {
218
+ backUrl: backUrl
219
+ }
220
+ });
221
+ };
222
+ const getUserInfo = (expand = 'groups', fields = '', backUrl = null, history = null, errorHandler = null) => async (dispatch, getState) => {
223
+ let AllowedUserGroups = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_3__.getAllowedUserGroups)();
224
+ AllowedUserGroups = AllowedUserGroups !== '' ? AllowedUserGroups.split(' ') : [];
225
+ let {
226
+ loggedUserState
227
+ } = getState();
228
+ let {
229
+ member
230
+ } = loggedUserState;
231
+ let accessToken = await (0,_methods__WEBPACK_IMPORTED_MODULE_4__.getAccessToken)();
232
+
233
+ if (member != null) {
234
+ if (history != null && backUrl != null) history.push(backUrl);
235
+ return Promise.resolve();
236
+ }
237
+
238
+ if (errorHandler == null) errorHandler = _utils_actions__WEBPACK_IMPORTED_MODULE_2__.authErrorHandler;
239
+ dispatch((0,_utils_actions__WEBPACK_IMPORTED_MODULE_2__.startLoading)());
240
+ let params = {
241
+ access_token: accessToken,
242
+ expand: expand
243
+ };
244
+
245
+ if (fields) {
246
+ params['fields'] = fields;
247
+ }
248
+
249
+ return (0,_utils_actions__WEBPACK_IMPORTED_MODULE_2__.getRequest)((0,_utils_actions__WEBPACK_IMPORTED_MODULE_2__.createAction)(REQUEST_USER_INFO), (0,_utils_actions__WEBPACK_IMPORTED_MODULE_2__.createAction)(RECEIVE_USER_INFO), (0,_utils_methods__WEBPACK_IMPORTED_MODULE_3__.buildAPIBaseUrl)(`/api/v1/members/me`), errorHandler)(params)(dispatch, getState).then(() => {
250
+ dispatch((0,_utils_actions__WEBPACK_IMPORTED_MODULE_2__.stopLoading)());
251
+ let {
252
+ member
253
+ } = getState().loggedUserState;
254
+
255
+ if (member == null) {
256
+ let error_message = {
257
+ title: 'ERROR',
258
+ html: i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_1___default().translate("errors.user_not_set"),
259
+ type: 'error'
260
+ };
261
+ dispatch((0,_utils_actions__WEBPACK_IMPORTED_MODULE_2__.showMessage)(error_message, _methods__WEBPACK_IMPORTED_MODULE_4__.initLogOut));
262
+ } // check user groups ( if defined )
263
+
264
+
265
+ if (AllowedUserGroups.length > 0) {
266
+ let allowedGroups = member.groups.filter((group, idx) => {
267
+ return AllowedUserGroups.includes(group.code);
268
+ });
269
+
270
+ if (allowedGroups.length === 0) {
271
+ let error_message = {
272
+ title: 'ERROR',
273
+ html: i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_1___default().translate("errors.user_not_authz"),
274
+ type: 'error'
275
+ };
276
+ dispatch((0,_utils_actions__WEBPACK_IMPORTED_MODULE_2__.showMessage)(error_message, _methods__WEBPACK_IMPORTED_MODULE_4__.initLogOut));
277
+ return;
278
+ }
279
+ }
280
+
281
+ if (history != null && backUrl != null) history.push(backUrl);
282
+ });
283
+ };
284
+ const updateUserInfo = updatedMember => (dispatch, getState) => {
285
+ let {
286
+ loggedUserState
287
+ } = getState();
288
+ let {
289
+ member
290
+ } = loggedUserState;
291
+
292
+ if (member == null) {
293
+ throw Error("Member is not set.");
294
+ }
295
+
296
+ if (updatedMember.id != member.id) {
297
+ throw Error("Member is not the same.");
298
+ }
299
+
300
+ dispatch({
301
+ type: UPDATE_USER_INFO,
302
+ payload: _objectSpread({}, updatedMember)
303
+ });
304
+ };
305
+ const updateSessionStateStatus = newStatus => (dispatch, getState) => {
306
+ dispatch({
307
+ type: UPDATE_SESSION_STATE_STATUS,
308
+ payload: {
309
+ sessionStateStatus: newStatus
310
+ }
311
+ });
312
+ };
313
+
314
+ /***/ }),
315
+
316
+ /***/ "./src/components/security/constants.js":
317
+ /*!**********************************************!*\
318
+ !*** ./src/components/security/constants.js ***!
319
+ \**********************************************/
320
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
321
+
322
+ __webpack_require__.r(__webpack_exports__);
323
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
324
+ /* harmony export */ "AUTH_ERROR_ACCESS_TOKEN_EXPIRED": () => (/* binding */ AUTH_ERROR_ACCESS_TOKEN_EXPIRED),
325
+ /* harmony export */ "AUTH_ERROR_ID_TOKEN_INVALID": () => (/* binding */ AUTH_ERROR_ID_TOKEN_INVALID),
326
+ /* harmony export */ "AUTH_ERROR_LOCK_ACQUIRE_ERROR": () => (/* binding */ AUTH_ERROR_LOCK_ACQUIRE_ERROR),
327
+ /* harmony export */ "AUTH_ERROR_MISSING_AUTH_INFO": () => (/* binding */ AUTH_ERROR_MISSING_AUTH_INFO),
328
+ /* harmony export */ "AUTH_ERROR_MISSING_OTP_PARAM": () => (/* binding */ AUTH_ERROR_MISSING_OTP_PARAM),
329
+ /* harmony export */ "AUTH_ERROR_MISSING_REFRESH_TOKEN": () => (/* binding */ AUTH_ERROR_MISSING_REFRESH_TOKEN),
330
+ /* harmony export */ "AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR": () => (/* binding */ AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR)
331
+ /* harmony export */ });
332
+ const AUTH_ERROR_MISSING_AUTH_INFO = 'AUTH_ERROR_MISSING_AUTH_INFO';
333
+ const AUTH_ERROR_MISSING_REFRESH_TOKEN = 'AUTH_ERROR_MISSING_REFRESH_TOKEN';
334
+ const AUTH_ERROR_ACCESS_TOKEN_EXPIRED = 'AUTH_ERROR_ACCESS_TOKEN_EXPIRED';
335
+ const AUTH_ERROR_LOCK_ACQUIRE_ERROR = 'AUTH_ERROR_LOCK_ACQUIRE_ERROR';
336
+ const AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR = 'AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR';
337
+ const AUTH_ERROR_ID_TOKEN_INVALID = 'AUTH_ERROR_ID_TOKEN_INVALID';
338
+ const AUTH_ERROR_MISSING_OTP_PARAM = 'AUTH_ERROR_MISSING_OTP_PARAM';
339
+
340
+ /***/ }),
341
+
342
+ /***/ "./src/components/security/methods.js":
343
+ /*!********************************************!*\
344
+ !*** ./src/components/security/methods.js ***!
345
+ \********************************************/
346
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
347
+
348
+ __webpack_require__.r(__webpack_exports__);
349
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
350
+ /* harmony export */ "ACCESS_TOKEN_SKEW_TIME": () => (/* binding */ ACCESS_TOKEN_SKEW_TIME),
351
+ /* harmony export */ "RESPONSE_TYPE_CODE": () => (/* binding */ RESPONSE_TYPE_CODE),
352
+ /* harmony export */ "RESPONSE_TYPE_IMPLICIT": () => (/* binding */ RESPONSE_TYPE_IMPLICIT),
353
+ /* harmony export */ "clearAccessToken": () => (/* binding */ clearAccessToken),
354
+ /* harmony export */ "clearAuthInfo": () => (/* binding */ clearAuthInfo),
355
+ /* harmony export */ "doLogin": () => (/* binding */ doLogin),
356
+ /* harmony export */ "doLoginBasicLogin": () => (/* binding */ doLoginBasicLogin),
357
+ /* harmony export */ "emitAccessToken": () => (/* binding */ emitAccessToken),
358
+ /* harmony export */ "getAccessToken": () => (/* binding */ getAccessToken),
359
+ /* harmony export */ "getAuthInfo": () => (/* binding */ getAuthInfo),
360
+ /* harmony export */ "getAuthUrl": () => (/* binding */ getAuthUrl),
361
+ /* harmony export */ "getIdToken": () => (/* binding */ getIdToken),
362
+ /* harmony export */ "getLogoutUrl": () => (/* binding */ getLogoutUrl),
363
+ /* harmony export */ "getOAuth2ClientId": () => (/* binding */ getOAuth2ClientId),
364
+ /* harmony export */ "getOAuth2Flow": () => (/* binding */ getOAuth2Flow),
365
+ /* harmony export */ "getOAuth2IDPBaseUrl": () => (/* binding */ getOAuth2IDPBaseUrl),
366
+ /* harmony export */ "getOAuth2Scopes": () => (/* binding */ getOAuth2Scopes),
367
+ /* harmony export */ "initLogOut": () => (/* binding */ initLogOut),
368
+ /* harmony export */ "isIdTokenAlive": () => (/* binding */ isIdTokenAlive),
369
+ /* harmony export */ "passwordlessLogin": () => (/* binding */ passwordlessLogin),
370
+ /* harmony export */ "passwordlessStart": () => (/* binding */ passwordlessStart),
371
+ /* harmony export */ "refreshAccessToken": () => (/* binding */ refreshAccessToken),
372
+ /* harmony export */ "storeAuthInfo": () => (/* binding */ storeAuthInfo),
373
+ /* harmony export */ "useOAuth2RefreshToken": () => (/* binding */ useOAuth2RefreshToken),
374
+ /* harmony export */ "validateIdToken": () => (/* binding */ validateIdToken)
375
+ /* harmony export */ });
376
+ /* harmony import */ var _utils_methods__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../utils/methods */ "./src/utils/methods.js");
377
+ /* harmony import */ var superagent_lib_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! superagent/lib/client */ "superagent/lib/client");
378
+ /* harmony import */ var superagent_lib_client__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(superagent_lib_client__WEBPACK_IMPORTED_MODULE_1__);
379
+ /* harmony import */ var browser_tabs_lock__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! browser-tabs-lock */ "browser-tabs-lock");
380
+ /* harmony import */ var browser_tabs_lock__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(browser_tabs_lock__WEBPACK_IMPORTED_MODULE_2__);
381
+ /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! urijs */ "urijs");
382
+ /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(urijs__WEBPACK_IMPORTED_MODULE_3__);
383
+ /* harmony import */ var idtoken_verifier__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! idtoken-verifier */ "idtoken-verifier");
384
+ /* harmony import */ var idtoken_verifier__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(idtoken_verifier__WEBPACK_IMPORTED_MODULE_4__);
385
+ /* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./actions */ "./src/components/security/actions.js");
386
+ /* harmony import */ var _utils_crypto__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../utils/crypto */ "./src/utils/crypto.js");
387
+ /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./constants */ "./src/components/security/constants.js");
388
+
389
+
390
+
391
+ let http = (superagent_lib_client__WEBPACK_IMPORTED_MODULE_1___default());
392
+ /**
393
+ * @ignore
394
+ */
395
+
396
+ const lock = new (browser_tabs_lock__WEBPACK_IMPORTED_MODULE_2___default())();
397
+ const GET_TOKEN_SILENTLY_LOCK_KEY = 'openstackuicore.lock.getTokenSilently';
398
+ const NONCE_LEN = 16;
399
+ const ACCESS_TOKEN_SKEW_TIME = 20;
400
+ const RESPONSE_TYPE_IMPLICIT = "token id_token";
401
+ const RESPONSE_TYPE_CODE = 'code';
402
+ const AUTH_INFO = 'authInfo';
403
+ const NONCE = 'nonce';
404
+ const PKCE = 'pkce';
405
+
406
+
407
+
408
+
409
+
410
+ /**
411
+ *
412
+ * @param backUrl
413
+ * @param prompt
414
+ * @param tokenIdHint
415
+ * @param provider
416
+ * @param loginHint
417
+ * @param otpLoginHint
418
+ * @returns {*}
419
+ */
420
+
421
+ const getAuthUrl = (backUrl = null, prompt = null, tokenIdHint = null, provider = null, loginHint = null, otpLoginHint = null) => {
422
+ let oauth2ClientId = getOAuth2ClientId();
423
+ let redirectUri = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getAuthCallback)();
424
+ let baseUrl = getOAuth2IDPBaseUrl();
425
+ let scopes = getOAuth2Scopes();
426
+ let flow = getOAuth2Flow();
427
+ if (backUrl != null) redirectUri += `?BackUrl=${encodeURI(backUrl)}`;
428
+ let nonce = createNonce(NONCE_LEN); // store nonce to check it later
429
+
430
+ (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.putOnLocalStorage)(NONCE, nonce);
431
+ let url = urijs__WEBPACK_IMPORTED_MODULE_3___default()(`${baseUrl}/oauth2/auth`);
432
+ let query = {
433
+ "response_type": encodeURI(flow),
434
+ "scope": encodeURI(scopes),
435
+ "nonce": nonce,
436
+ "response_mode": 'fragment',
437
+ "client_id": encodeURI(oauth2ClientId),
438
+ "redirect_uri": encodeURI(redirectUri)
439
+ };
440
+
441
+ if (flow === RESPONSE_TYPE_CODE) {
442
+ const pkce = createPKCECodes();
443
+ (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.putOnLocalStorage)(PKCE, JSON.stringify(pkce));
444
+ query['code_challenge'] = pkce.codeChallenge;
445
+ query['code_challenge_method'] = 'S256';
446
+ query['approval_prompt'] = 'force';
447
+ }
448
+
449
+ if (prompt) {
450
+ query['prompt'] = prompt;
451
+ }
452
+
453
+ if (scopes && scopes.includes('offline_access')) {
454
+ // then we need to force prompt=consent bc we are requesting an offline access
455
+ // and we need to let the user know
456
+ query['prompt'] = 'consent';
457
+ }
458
+
459
+ if (tokenIdHint) {
460
+ query['id_token_hint'] = tokenIdHint;
461
+ }
462
+
463
+ if (provider) {
464
+ query['provider'] = provider;
465
+ }
466
+
467
+ if (otpLoginHint) {
468
+ query['otp_login_hint'] = otpLoginHint;
469
+ }
470
+
471
+ if (loginHint) {
472
+ query['login_hint'] = encodeURI(loginHint);
473
+ }
474
+
475
+ url = url.query(query); //console.log(`getAuthUrl ${url.toString()}`);
476
+
477
+ return url;
478
+ };
479
+ const getLogoutUrl = idToken => {
480
+ let baseUrl = getOAuth2IDPBaseUrl();
481
+ let oauth2ClientId = getOAuth2ClientId();
482
+ let url = urijs__WEBPACK_IMPORTED_MODULE_3___default()(`${baseUrl}/oauth2/end-session`);
483
+ let state = createNonce(NONCE_LEN);
484
+ let postLogOutUri = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getOrigin)() + '/auth/logout'; // store nonce to check it later
485
+
486
+ (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.putOnLocalStorage)('post_logout_state', state);
487
+ /**
488
+ * post_logout_redirect_uri should be listed on oauth2 client settings
489
+ * on IDP
490
+ * "Security Settings" Tab -> Logout Options -> Post Logout Uris
491
+ */
492
+
493
+ return url.query({
494
+ "id_token_hint": idToken,
495
+ "post_logout_redirect_uri": encodeURI(postLogOutUri),
496
+ "client_id": encodeURI(oauth2ClientId),
497
+ "state": state
498
+ });
499
+ };
500
+
501
+ const createNonce = len => {
502
+ let possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
503
+ let nonce = '';
504
+
505
+ for (let i = 0; i < len; i++) {
506
+ nonce += possible.charAt(Math.floor(Math.random() * possible.length));
507
+ }
508
+
509
+ return nonce;
510
+ };
511
+ /**
512
+ *
513
+ * @param backUrl
514
+ * @param provider
515
+ * @param prompt
516
+ * @param loginHint
517
+ * @param otpLoginHint
518
+ */
519
+
520
+
521
+ const doLogin = (backUrl = null, provider = null, prompt = null, loginHint = null, otpLoginHint = null) => {
522
+ let url = getAuthUrl(backUrl, prompt, null, provider, loginHint, otpLoginHint);
523
+ let location = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getCurrentLocation)();
524
+ location.replace(url.toString());
525
+ };
526
+ /**
527
+ *
528
+ * @param backUrl
529
+ * @param loginHint
530
+ * @param otpLoginHint
531
+ */
532
+
533
+ const doLoginBasicLogin = (backUrl = null, loginHint = null, otpLoginHint = null) => {
534
+ doLogin(backUrl, null, null, loginHint, otpLoginHint);
535
+ };
536
+
537
+ const createPKCECodes = () => {
538
+ const codeVerifier = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.base64URLEncode)((0,_utils_crypto__WEBPACK_IMPORTED_MODULE_6__.getRandomBytes)(64));
539
+ const codeChallenge = (0,_utils_crypto__WEBPACK_IMPORTED_MODULE_6__.getSHA256)(codeVerifier, 'Base64url');
540
+ const createdAt = new Date();
541
+ const codePair = {
542
+ codeVerifier,
543
+ codeChallenge,
544
+ createdAt
545
+ };
546
+ return codePair;
547
+ };
548
+
549
+ const emitAccessToken = async (code, backUrl = null) => {
550
+ let baseUrl = getOAuth2IDPBaseUrl();
551
+ let oauth2ClientId = getOAuth2ClientId();
552
+ let redirectUri = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getAuthCallback)();
553
+ let pkce = JSON.parse((0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getFromLocalStorage)(PKCE, true));
554
+ if (backUrl != null) redirectUri += `?BackUrl=${encodeURI(backUrl)}`;
555
+ const payload = {
556
+ 'code': code,
557
+ 'grant_type': 'authorization_code',
558
+ 'code_verifier': pkce.codeVerifier,
559
+ "client_id": encodeURI(oauth2ClientId),
560
+ "redirect_uri": encodeURI(redirectUri)
561
+ };
562
+
563
+ try {
564
+ //const response = await http.post(`${baseUrl}/oauth2/token`, payload);
565
+ //const {body: {access_token, refresh_token, id_token, expires_in}} = response;
566
+ const response = await fetch(`${baseUrl}/oauth2/token`, {
567
+ method: 'POST',
568
+ headers: {
569
+ 'Accept': 'application/json',
570
+ 'Content-Type': 'application/json'
571
+ },
572
+ body: JSON.stringify(payload)
573
+ }).catch(function (error) {
574
+ console.log('Request failed:', error.message);
575
+ });
576
+ const json = await response.json();
577
+ let {
578
+ access_token,
579
+ refresh_token,
580
+ id_token,
581
+ expires_in,
582
+ error,
583
+ error_description
584
+ } = json;
585
+ return {
586
+ access_token,
587
+ refresh_token,
588
+ id_token,
589
+ expires_in,
590
+ error,
591
+ error_description
592
+ };
593
+ } catch (err) {
594
+ console.log(err);
595
+ }
596
+ };
597
+ const clearAccessToken = async () => {
598
+ if (await (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.retryPromise)(() => lock.acquireLock(GET_TOKEN_SILENTLY_LOCK_KEY, 5000), 10)) {
599
+ try {
600
+ let authInfo = getAuthInfo();
601
+
602
+ if (!authInfo) {
603
+ throw Error(_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_MISSING_AUTH_INFO);
604
+ }
605
+
606
+ let {
607
+ accessToken,
608
+ expiresIn,
609
+ accessTokenUpdatedAt,
610
+ refreshToken
611
+ } = authInfo;
612
+ storeAuthInfo(null, 0, refreshToken);
613
+ } finally {
614
+ await lock.releaseLock(GET_TOKEN_SILENTLY_LOCK_KEY);
615
+ }
616
+ }
617
+ };
618
+ const getAccessToken = async () => {
619
+ if (await (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.retryPromise)(() => lock.acquireLock(GET_TOKEN_SILENTLY_LOCK_KEY, 5000), 10)) {
620
+ try {
621
+ let authInfo = getAuthInfo();
622
+
623
+ if (!authInfo) {
624
+ throw Error(_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_MISSING_AUTH_INFO);
625
+ }
626
+
627
+ let {
628
+ accessToken,
629
+ expiresIn,
630
+ accessTokenUpdatedAt,
631
+ refreshToken
632
+ } = authInfo;
633
+ let flow = getOAuth2Flow(); // check life time
634
+
635
+ let now = Math.floor(Date.now() / 1000);
636
+ let timeElapsedSecs = now - accessTokenUpdatedAt;
637
+ expiresIn = expiresIn - ACCESS_TOKEN_SKEW_TIME; //console.log(`getAccessToken now ${now} accessTokenUpdatedAt ${accessTokenUpdatedAt} timeElapsedSecs ${timeElapsedSecs} expiresIn ${expiresIn}.`);
638
+
639
+ if (timeElapsedSecs > expiresIn || accessToken == null) {
640
+ console.log(`getAccessToken access token expired`);
641
+
642
+ if (flow === RESPONSE_TYPE_CODE && useOAuth2RefreshToken()) {
643
+ //console.log('getAccessToken getting new access token, access token got void');
644
+ if (!refreshToken) {
645
+ clearAuthInfo();
646
+ throw Error(_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_MISSING_REFRESH_TOKEN);
647
+ }
648
+
649
+ let response = await refreshAccessToken(refreshToken);
650
+ let {
651
+ access_token,
652
+ expires_in,
653
+ refresh_token
654
+ } = response; //console.log(`getAccessToken access_token ${access_token} expires_in ${expires_in} refresh_token ${refresh_token}`);
655
+
656
+ if (typeof refresh_token === 'undefined') {
657
+ refresh_token = null; // not using rotate policy
658
+ }
659
+
660
+ storeAuthInfo(access_token, expires_in, refresh_token); //console.log(`getAccessToken access_token ${access_token} [NEW]`);
661
+
662
+ return access_token;
663
+ }
664
+
665
+ clearAuthInfo();
666
+ throw Error(_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_ACCESS_TOKEN_EXPIRED);
667
+ } //console.log(`getAccessToken access_token ${accessToken} [CACHED]`);
668
+
669
+
670
+ return accessToken;
671
+ } finally {
672
+ await lock.releaseLock(GET_TOKEN_SILENTLY_LOCK_KEY);
673
+ }
674
+ }
675
+
676
+ throw Error(_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_LOCK_ACQUIRE_ERROR);
677
+ };
678
+ const refreshAccessToken = async refresh_token => {
679
+ let baseUrl = getOAuth2IDPBaseUrl();
680
+ let oauth2ClientId = getOAuth2ClientId();
681
+ const payload = {
682
+ 'grant_type': 'refresh_token',
683
+ "client_id": encodeURI(oauth2ClientId),
684
+ "refresh_token": refresh_token
685
+ };
686
+
687
+ try {
688
+ const response = await fetch(`${baseUrl}/oauth2/token`, {
689
+ method: 'POST',
690
+ headers: {
691
+ 'Accept': 'application/json',
692
+ 'Content-Type': 'application/json'
693
+ },
694
+ body: JSON.stringify(payload)
695
+ }).then(response => {
696
+ if (response.status === 400) {
697
+ let currentLocation = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getCurrentPathName)();
698
+ (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.setSessionClearingState)(true);
699
+ throw Error(`${_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR}: ${response.status} - ${response.statusText}`);
700
+ }
701
+
702
+ return response;
703
+ }).catch(function (error) {
704
+ throw Error(`${_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR}: ${error.message}`);
705
+ });
706
+ const json = await response.json();
707
+ let {
708
+ access_token,
709
+ refresh_token,
710
+ expires_in
711
+ } = json;
712
+ return {
713
+ access_token,
714
+ refresh_token,
715
+ expires_in
716
+ };
717
+ } catch (err) {
718
+ console.log(err);
719
+ throw err;
720
+ }
721
+ };
722
+ const storeAuthInfo = (accessToken, expiresIn, refreshToken = null, idToken = null) => {
723
+ let formerAuthInfo = getAuthInfo();
724
+ let authInfo = {
725
+ accessToken: accessToken,
726
+ expiresIn: expiresIn,
727
+ accessTokenUpdatedAt: Math.floor(Date.now() / 1000)
728
+ };
729
+
730
+ if (refreshToken === null && formerAuthInfo) {
731
+ refreshToken = formerAuthInfo.refreshToken;
732
+ }
733
+
734
+ if (idToken === null && formerAuthInfo) {
735
+ idToken = formerAuthInfo.idToken;
736
+ }
737
+
738
+ if (refreshToken) {
739
+ authInfo['refreshToken'] = refreshToken;
740
+ }
741
+
742
+ if (idToken) {
743
+ authInfo['idToken'] = idToken;
744
+ }
745
+
746
+ (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.putOnLocalStorage)(AUTH_INFO, JSON.stringify(authInfo));
747
+ };
748
+ const getAuthInfo = () => {
749
+ try {
750
+ let res = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getFromLocalStorage)(AUTH_INFO, false);
751
+ if (!res) return null;
752
+ return JSON.parse(res);
753
+ } catch (err) {
754
+ return null;
755
+ }
756
+ };
757
+ const clearAuthInfo = () => {
758
+ if (typeof window !== 'undefined') {
759
+ (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.removeFromLocalStorage)(AUTH_INFO);
760
+ (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.removeFromLocalStorage)(NONCE);
761
+ (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.removeFromLocalStorage)(PKCE);
762
+ return;
763
+ }
764
+ };
765
+ const getIdToken = () => {
766
+ if (typeof window !== 'undefined') {
767
+ const authInfo = getAuthInfo();
768
+
769
+ if (authInfo) {
770
+ return authInfo.idToken;
771
+ }
772
+
773
+ return null;
774
+ }
775
+
776
+ return null;
777
+ };
778
+ const getOAuth2ClientId = () => {
779
+ if (typeof window !== 'undefined') {
780
+ return window.OAUTH2_CLIENT_ID;
781
+ }
782
+
783
+ return null;
784
+ };
785
+ const getOAuth2Flow = () => {
786
+ if (typeof window !== 'undefined') {
787
+ return window.OAUTH2_FLOW || "token id_token";
788
+ }
789
+
790
+ return "token id_token";
791
+ };
792
+ const useOAuth2RefreshToken = () => {
793
+ if (typeof window !== 'undefined') {
794
+ return new Boolean(window.OAUTH2_USE_REFRESH_TOKEN || true);
795
+ }
796
+
797
+ return true;
798
+ };
799
+ const getOAuth2IDPBaseUrl = () => {
800
+ if (typeof window !== 'undefined') {
801
+ return window.IDP_BASE_URL;
802
+ }
803
+
804
+ return null;
805
+ };
806
+ const getOAuth2Scopes = () => {
807
+ if (typeof window !== 'undefined') {
808
+ return window.SCOPES;
809
+ }
810
+
811
+ return null;
812
+ };
813
+ const initLogOut = () => {
814
+ let location = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getCurrentLocation)();
815
+ location.replace(getLogoutUrl(getIdToken()).toString());
816
+ };
817
+ const validateIdToken = (idToken, issuer, audience) => {
818
+ let verifier = new (idtoken_verifier__WEBPACK_IMPORTED_MODULE_4___default())({
819
+ issuer: issuer,
820
+ audience: audience
821
+ });
822
+ let storedNonce = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getFromLocalStorage)(NONCE, true);
823
+ let jwt = verifier.decode(idToken);
824
+ let alg = jwt.header.alg;
825
+ let kid = jwt.header.kid;
826
+ let aud = jwt.payload.aud;
827
+ let iss = jwt.payload.iss;
828
+ let exp = jwt.payload.exp;
829
+ let nbf = jwt.payload.nbf;
830
+ let tnonce = jwt.payload.nonce || null;
831
+ return tnonce == storedNonce && aud == audience && iss == issuer;
832
+ };
833
+ const passwordlessStart = params => {
834
+ let oauth2ClientId = getOAuth2ClientId();
835
+ let scopes = getOAuth2Scopes();
836
+ let nonce = createNonce(NONCE_LEN); // store nonce to check it later
837
+
838
+ (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.putOnLocalStorage)(NONCE, nonce);
839
+ let baseUrl = getOAuth2IDPBaseUrl();
840
+ let url = urijs__WEBPACK_IMPORTED_MODULE_3___default()(`${baseUrl}/oauth2/auth`);
841
+ let payload = {
842
+ "response_type": "otp",
843
+ "scope": encodeURI(scopes),
844
+ "nonce": nonce,
845
+ "client_id": encodeURI(oauth2ClientId),
846
+ "connection": params.connection || "email",
847
+ "send": params.send || "code"
848
+ };
849
+
850
+ if (params.hasOwnProperty('email')) {
851
+ payload["email"] = encodeURIComponent(params.email);
852
+ }
853
+
854
+ if (params.hasOwnProperty('phone_number')) {
855
+ payload["phone_number"] = encodeURIComponent(params.phone_number);
856
+ }
857
+
858
+ if (params.hasOwnProperty('redirect_uri')) {
859
+ payload["redirect_uri"] = encodeURIComponent(params.redirect_uri);
860
+ }
861
+
862
+ let req = http.post(url.toString());
863
+ return req.send(payload).then(res => {
864
+ let json = res.body;
865
+ return Promise.resolve({
866
+ response: json
867
+ });
868
+ }).catch(err => {
869
+ return Promise.reject(err);
870
+ });
871
+ };
872
+ const passwordlessLogin = params => dispatch => {
873
+ let oauth2ClientId = getOAuth2ClientId();
874
+ let scopes = getOAuth2Scopes();
875
+ let baseUrl = getOAuth2IDPBaseUrl();
876
+ let url = urijs__WEBPACK_IMPORTED_MODULE_3___default()(`${baseUrl}/oauth2/token`);
877
+
878
+ if (!params.hasOwnProperty("otp")) {
879
+ throw Error(_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_MISSING_OTP_PARAM);
880
+ }
881
+
882
+ let payload = {
883
+ "grant_type": "passwordless",
884
+ "connection": params.connection || "email",
885
+ "scope": encodeURI(scopes),
886
+ "client_id": encodeURI(oauth2ClientId),
887
+ "otp": params.otp
888
+ };
889
+
890
+ if (params.hasOwnProperty('email')) {
891
+ payload["email"] = encodeURIComponent(params.email);
892
+ }
893
+
894
+ if (params.hasOwnProperty('phone_number')) {
895
+ payload["phone_number"] = encodeURIComponent(params.phone_number);
896
+ }
897
+
898
+ let req = http.post(url.toString());
899
+ return req.send(payload).then(res => {
900
+ try {
901
+ // now we got token
902
+ let json = res.body;
903
+ let {
904
+ access_token,
905
+ expires_in,
906
+ refresh_token,
907
+ id_token
908
+ } = json;
909
+
910
+ if (typeof refresh_token === 'undefined') {
911
+ refresh_token = null; // not using rotate policy
912
+ }
913
+
914
+ if (typeof id_token === 'undefined') {
915
+ id_token = null; // not using rotate policy
916
+ } // verify id token
917
+
918
+
919
+ if (id_token) {
920
+ if (!validateIdToken(id_token, baseUrl, oauth2ClientId)) {
921
+ throw Error(_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_ID_TOKEN_INVALID);
922
+ }
923
+ }
924
+
925
+ storeAuthInfo(access_token, expires_in, refresh_token, id_token);
926
+
927
+ if (dispatch) {
928
+ dispatch({
929
+ type: _actions__WEBPACK_IMPORTED_MODULE_5__.SET_LOGGED_USER,
930
+ payload: {
931
+ sessionState: null
932
+ }
933
+ });
934
+ }
935
+
936
+ return Promise.resolve({
937
+ response: json
938
+ });
939
+ } catch (e) {
940
+ console.log(e);
941
+ return Promise.reject(e);
942
+ }
943
+ }).catch(err => {
944
+ return Promise.reject(err);
945
+ });
946
+ };
947
+ const isIdTokenAlive = (nowEpoch = null) => () => {
948
+ if (!nowEpoch) {
949
+ nowEpoch = Math.floor(Date.now() / 1000);
950
+ }
951
+
952
+ const idToken = getIdToken();
953
+ if (!idToken) throw Error('Id Token not set.');
954
+ const issuer = getOAuth2IDPBaseUrl();
955
+ const audience = getOAuth2ClientId();
956
+ let verifier = new (idtoken_verifier__WEBPACK_IMPORTED_MODULE_4___default())({
957
+ issuer: issuer,
958
+ audience: audience
959
+ });
960
+ const jwt = verifier.decode(idToken);
961
+ const exp = jwt.payload.exp; // check life time
962
+
963
+ return exp - (nowEpoch + ACCESS_TOKEN_SKEW_TIME) > 0;
964
+ };
965
+
966
+ /***/ }),
967
+
968
+ /***/ "./src/utils/actions.js":
969
+ /*!******************************!*\
970
+ !*** ./src/utils/actions.js ***!
971
+ \******************************/
972
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
973
+
974
+ __webpack_require__.r(__webpack_exports__);
975
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
976
+ /* harmony export */ "CLEAR_MESSAGE": () => (/* binding */ CLEAR_MESSAGE),
977
+ /* harmony export */ "GENERIC_ERROR": () => (/* binding */ GENERIC_ERROR),
978
+ /* harmony export */ "RESET_LOADING": () => (/* binding */ RESET_LOADING),
979
+ /* harmony export */ "SHOW_MESSAGE": () => (/* binding */ SHOW_MESSAGE),
980
+ /* harmony export */ "START_LOADING": () => (/* binding */ START_LOADING),
981
+ /* harmony export */ "STOP_LOADING": () => (/* binding */ STOP_LOADING),
982
+ /* harmony export */ "VALIDATE": () => (/* binding */ VALIDATE),
983
+ /* harmony export */ "authErrorHandler": () => (/* binding */ authErrorHandler),
984
+ /* harmony export */ "createAction": () => (/* binding */ createAction),
985
+ /* harmony export */ "defaultErrorHandler": () => (/* binding */ defaultErrorHandler),
986
+ /* harmony export */ "deleteRequest": () => (/* binding */ deleteRequest),
987
+ /* harmony export */ "downloadFileByContent": () => (/* binding */ downloadFileByContent),
988
+ /* harmony export */ "escapeFilterValue": () => (/* binding */ escapeFilterValue),
989
+ /* harmony export */ "fetchErrorHandler": () => (/* binding */ fetchErrorHandler),
990
+ /* harmony export */ "fetchResponseHandler": () => (/* binding */ fetchResponseHandler),
991
+ /* harmony export */ "getCSV": () => (/* binding */ getCSV),
992
+ /* harmony export */ "getHeaderCaseInsensitive": () => (/* binding */ getHeaderCaseInsensitive),
993
+ /* harmony export */ "getRawCSV": () => (/* binding */ getRawCSV),
994
+ /* harmony export */ "getRequest": () => (/* binding */ getRequest),
995
+ /* harmony export */ "postFile": () => (/* binding */ postFile),
996
+ /* harmony export */ "postRequest": () => (/* binding */ postRequest),
997
+ /* harmony export */ "putFile": () => (/* binding */ putFile),
998
+ /* harmony export */ "putRequest": () => (/* binding */ putRequest),
999
+ /* harmony export */ "resetLoading": () => (/* binding */ resetLoading),
1000
+ /* harmony export */ "responseHandler": () => (/* binding */ responseHandler),
1001
+ /* harmony export */ "showMessage": () => (/* binding */ showMessage),
1002
+ /* harmony export */ "showSuccessMessage": () => (/* binding */ showSuccessMessage),
1003
+ /* harmony export */ "startLoading": () => (/* binding */ startLoading),
1004
+ /* harmony export */ "stopLoading": () => (/* binding */ stopLoading)
1005
+ /* harmony export */ });
1006
+ /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ "@babel/runtime/helpers/objectWithoutProperties");
1007
+ /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__);
1008
+ /* harmony import */ var superagent_lib_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! superagent/lib/client */ "superagent/lib/client");
1009
+ /* harmony import */ var superagent_lib_client__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(superagent_lib_client__WEBPACK_IMPORTED_MODULE_1__);
1010
+ /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! urijs */ "urijs");
1011
+ /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(urijs__WEBPACK_IMPORTED_MODULE_2__);
1012
+ /* harmony import */ var sweetalert2__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! sweetalert2 */ "sweetalert2");
1013
+ /* harmony import */ var sweetalert2__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(sweetalert2__WEBPACK_IMPORTED_MODULE_3__);
1014
+ /* harmony import */ var i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! i18n-react/dist/i18n-react */ "i18n-react/dist/i18n-react");
1015
+ /* harmony import */ var i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4__);
1016
+ /* harmony import */ var _methods__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./methods */ "./src/utils/methods.js");
1017
+ /* harmony import */ var _components_security_actions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../components/security/actions */ "./src/components/security/actions.js");
1018
+ /* harmony import */ var _components_security_methods__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../components/security/methods */ "./src/components/security/methods.js");
1019
+
1020
+ const _excluded = ["access_token"];
1021
+
1022
+ /**
1023
+ * Copyright 2017 OpenStack Foundation
1024
+ * Licensed under the Apache License, Version 2.0 (the "License");
1025
+ * you may not use this file except in compliance with the License.
1026
+ * You may obtain a copy of the License at
1027
+ * http://www.apache.org/licenses/LICENSE-2.0
1028
+ * Unless required by applicable law or agreed to in writing, software
1029
+ * distributed under the License is distributed on an "AS IS" BASIS,
1030
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1031
+ * See the License for the specific flanguage governing permissions and
1032
+ * limitations under the License.
1033
+ **/
1034
+
1035
+
1036
+ let http = (superagent_lib_client__WEBPACK_IMPORTED_MODULE_1___default());
1037
+
1038
+
1039
+
1040
+
1041
+
1042
+ const GENERIC_ERROR = "Yikes. Something seems to be broken. Our web team has been notified, and we apologize for the inconvenience.";
1043
+ const RESET_LOADING = 'RESET_LOADING';
1044
+ const START_LOADING = 'START_LOADING';
1045
+ const STOP_LOADING = 'STOP_LOADING';
1046
+ const VALIDATE = 'VALIDATE';
1047
+ const CLEAR_MESSAGE = 'CLEAR_MESSAGE';
1048
+ const SHOW_MESSAGE = 'SHOW_MESSAGE';
1049
+ const createAction = type => payload => ({
1050
+ type,
1051
+ payload
1052
+ });
1053
+ const resetLoading = createAction(RESET_LOADING);
1054
+ const startLoading = createAction(START_LOADING);
1055
+ const stopLoading = createAction(STOP_LOADING);
1056
+ const xhrs = {};
1057
+ const etagCache = {};
1058
+
1059
+ const cancel = key => {
1060
+ if (xhrs[key]) {
1061
+ xhrs[key].abort();
1062
+ console.log(`aborted request ${key}`);
1063
+ delete xhrs[key];
1064
+ }
1065
+ };
1066
+
1067
+ const schedule = (key, req) => {
1068
+ // console.log(`scheduling ${key}`);
1069
+ xhrs[key] = req;
1070
+ };
1071
+
1072
+ const isObjectEmpty = obj => {
1073
+ return Object.keys(obj).length === 0 && obj.constructor === Object;
1074
+ };
1075
+
1076
+ const authErrorHandler = (err, res) => (dispatch, state) => {
1077
+ let code = err.status;
1078
+ let msg = '';
1079
+ dispatch(stopLoading());
1080
+
1081
+ switch (code) {
1082
+ case 403:
1083
+ let error_message = {
1084
+ title: 'ERROR',
1085
+ html: i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4___default().translate("errors.user_not_authz"),
1086
+ type: 'error'
1087
+ };
1088
+ dispatch(showMessage(error_message, _components_security_methods__WEBPACK_IMPORTED_MODULE_7__.initLogOut));
1089
+ break;
1090
+
1091
+ case 401:
1092
+ let currentLocation = (0,_methods__WEBPACK_IMPORTED_MODULE_5__.getCurrentPathName)();
1093
+ let clearing_session_state = (0,_methods__WEBPACK_IMPORTED_MODULE_5__.isClearingSessionState)();
1094
+ dispatch({
1095
+ type: _components_security_actions__WEBPACK_IMPORTED_MODULE_6__.CLEAR_SESSION_STATE,
1096
+ payload: {}
1097
+ });
1098
+
1099
+ if (!clearing_session_state) {
1100
+ (0,_methods__WEBPACK_IMPORTED_MODULE_5__.setSessionClearingState)(true);
1101
+ console.log('authErrorHandler 401 - re login');
1102
+ (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_7__.doLogin)(currentLocation);
1103
+ }
1104
+
1105
+ break;
1106
+
1107
+ case 404:
1108
+ msg = "";
1109
+ if (err.response.body && err.response.body.message) msg = err.response.body.message;else if (err.response.error && err.response.error.message) msg = err.response.error.message;else msg = err.message;
1110
+ sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire("Not Found", msg, "warning");
1111
+ break;
1112
+
1113
+ case 412:
1114
+ for (var [key, value] of Object.entries(err.response.body.errors)) {
1115
+ if (isNaN(key)) {
1116
+ msg += key + ': ';
1117
+ }
1118
+
1119
+ msg += value + '<br>';
1120
+ }
1121
+
1122
+ sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire("Validation error", msg, "warning");
1123
+ dispatch({
1124
+ type: VALIDATE,
1125
+ payload: {
1126
+ errors: err.response.body.errors
1127
+ }
1128
+ });
1129
+ break;
1130
+
1131
+ default:
1132
+ sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire("ERROR", i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4___default().translate("errors.server_error"), "error");
1133
+ }
1134
+ };
1135
+ const getRequest = (requestActionCreator, receiveActionCreator, endpoint, errorHandler = defaultErrorHandler, requestActionPayload = {}, useEtag = false) => (params = {}) => (dispatch, state) => {
1136
+ let url = urijs__WEBPACK_IMPORTED_MODULE_2___default()(endpoint);
1137
+ let key = url.toString();
1138
+
1139
+ if (!isObjectEmpty(params)) {
1140
+ // remove the access token
1141
+ const {
1142
+ access_token: _
1143
+ } = params,
1144
+ newParams = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default()(params, _excluded); // and generate new key
1145
+
1146
+
1147
+ key = url.query(newParams).toString();
1148
+ url = url.query(params);
1149
+ }
1150
+
1151
+ if (requestActionCreator && typeof requestActionCreator === 'function') dispatch(requestActionCreator(requestActionPayload));
1152
+ cancel(key);
1153
+ return new Promise((resolve, reject) => {
1154
+ let req = http.get(url.toString());
1155
+
1156
+ if (useEtag && etagCache.hasOwnProperty(key)) {
1157
+ const {
1158
+ etag
1159
+ } = etagCache[key];
1160
+
1161
+ if (etag) {
1162
+ req.set('If-None-Match', etag);
1163
+ }
1164
+ }
1165
+
1166
+ req.timeout({
1167
+ response: 60000,
1168
+ deadline: 60000
1169
+ }).end(responseHandler(dispatch, state, receiveActionCreator, errorHandler, resolve, reject, key, useEtag));
1170
+ schedule(key, req);
1171
+ });
1172
+ };
1173
+ const putRequest = (requestActionCreator, receiveActionCreator, endpoint, payload, errorHandler = defaultErrorHandler, requestActionPayload = {}) => (params = {}) => (dispatch, state) => {
1174
+ let url = urijs__WEBPACK_IMPORTED_MODULE_2___default()(endpoint);
1175
+ if (!isObjectEmpty(params)) url = url.query(params);
1176
+ if (requestActionCreator && typeof requestActionCreator === 'function') dispatch(requestActionCreator(requestActionPayload));
1177
+ return new Promise((resolve, reject) => {
1178
+ if (payload == null) payload = {};
1179
+ http.put(url.toString()).send(payload).end(responseHandler(dispatch, state, receiveActionCreator, errorHandler, resolve, reject));
1180
+ });
1181
+ };
1182
+ const deleteRequest = (requestActionCreator, receiveActionCreator, endpoint, payload, errorHandler = defaultErrorHandler, requestActionPayload = {}) => params => (dispatch, state) => {
1183
+ let url = urijs__WEBPACK_IMPORTED_MODULE_2___default()(endpoint);
1184
+ if (!isObjectEmpty(params)) url = url.query(params);
1185
+ if (requestActionCreator && typeof requestActionCreator === 'function') dispatch(requestActionCreator(requestActionPayload));
1186
+ return new Promise((resolve, reject) => {
1187
+ if (payload == null) payload = {};
1188
+ http.delete(url).send(payload).end(responseHandler(dispatch, state, receiveActionCreator, errorHandler, resolve, reject));
1189
+ });
1190
+ };
1191
+ const postRequest = (requestActionCreator, receiveActionCreator, endpoint, payload, errorHandler = defaultErrorHandler, requestActionPayload = {}) => (params = {}) => (dispatch, state) => {
1192
+ let url = urijs__WEBPACK_IMPORTED_MODULE_2___default()(endpoint);
1193
+ if (!isObjectEmpty(params)) url = url.query(params);
1194
+ if (requestActionCreator && typeof requestActionCreator === 'function') dispatch(requestActionCreator(requestActionPayload));
1195
+ return new Promise((resolve, reject) => {
1196
+ let request = http.post(url);
1197
+ if (payload != null) request.send(payload);else // to be a simple CORS request
1198
+ request.set('Content-Type', 'text/plain');
1199
+ request.end(responseHandler(dispatch, state, receiveActionCreator, errorHandler, resolve, reject));
1200
+ });
1201
+ };
1202
+ const postFile = (requestActionCreator, receiveActionCreator, endpoint, file, fileMetadata = {}, errorHandler = defaultErrorHandler, requestActionPayload = {}) => (params = {}) => (dispatch, state) => {
1203
+ let url = urijs__WEBPACK_IMPORTED_MODULE_2___default()(endpoint);
1204
+ if (!isObjectEmpty(params)) url = url.query(params);
1205
+ if (requestActionCreator && typeof requestActionCreator === 'function') dispatch(requestActionCreator(requestActionPayload));
1206
+ return new Promise((resolve, reject) => {
1207
+ const req = http.post(url).attach('file', file);
1208
+
1209
+ if (!isObjectEmpty(fileMetadata)) {
1210
+ Object.keys(fileMetadata).forEach(function (key) {
1211
+ let value = fileMetadata[key];
1212
+ req.field(key, value);
1213
+ });
1214
+ }
1215
+
1216
+ req.end(responseHandler(dispatch, state, receiveActionCreator, errorHandler, resolve, reject));
1217
+ });
1218
+ };
1219
+ const putFile = (requestActionCreator, receiveActionCreator, endpoint, file = null, fileMetadata = {}, errorHandler = defaultErrorHandler, requestActionPayload = {}) => (params = {}) => (dispatch, state) => {
1220
+ let url = urijs__WEBPACK_IMPORTED_MODULE_2___default()(endpoint);
1221
+ if (!isObjectEmpty(params)) url = url.query(params);
1222
+ if (requestActionCreator && typeof requestActionCreator === 'function') dispatch(requestActionCreator(requestActionPayload));
1223
+ return new Promise((resolve, reject) => {
1224
+ const req = http.put(url);
1225
+
1226
+ if (file != null) {
1227
+ req.attach('file', file);
1228
+ }
1229
+
1230
+ if (!isObjectEmpty(fileMetadata)) {
1231
+ Object.keys(fileMetadata).forEach(function (key) {
1232
+ let value = fileMetadata[key];
1233
+ req.field(key, value);
1234
+ });
1235
+ }
1236
+
1237
+ req.end(responseHandler(dispatch, state, receiveActionCreator, errorHandler, resolve, reject));
1238
+ });
1239
+ };
1240
+ const defaultErrorHandler = (err, res) => dispatch => {
1241
+ let body = res.body;
1242
+ let text = '';
1243
+
1244
+ if (body instanceof Object) {
1245
+ if (body.hasOwnProperty('message')) text = body.message;
1246
+ }
1247
+
1248
+ sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire(res.statusText, text, "error");
1249
+ };
1250
+
1251
+ const byLowerCase = toFind => value => toLowerCase(value) === toFind;
1252
+
1253
+ const toLowerCase = value => value.toLowerCase();
1254
+
1255
+ const getKeys = headers => Object.keys(headers);
1256
+
1257
+ const getHeaderCaseInsensitive = (headerName, headers = {}) => {
1258
+ const key = getKeys(headers).find(byLowerCase(headerName));
1259
+ return key ? headers[key] : undefined;
1260
+ };
1261
+ const responseHandler = (dispatch, state, receiveActionCreator, errorHandler, resolve, reject, key = null, useEtag = false) => (err, res) => {
1262
+ if (err || !res.ok) {
1263
+ let code = err.status;
1264
+
1265
+ if (code === 304 && etagCache.hasOwnProperty(key) && useEtag) {
1266
+ const {
1267
+ body
1268
+ } = etagCache[key];
1269
+
1270
+ if (typeof receiveActionCreator === 'function') {
1271
+ dispatch(receiveActionCreator({
1272
+ response: body
1273
+ }));
1274
+ return resolve({
1275
+ response: body
1276
+ });
1277
+ }
1278
+
1279
+ dispatch(receiveActionCreator);
1280
+ return resolve({
1281
+ response: body
1282
+ });
1283
+ }
1284
+
1285
+ if (errorHandler) {
1286
+ errorHandler(err, res)(dispatch, state);
1287
+ }
1288
+
1289
+ return reject({
1290
+ err,
1291
+ res,
1292
+ dispatch,
1293
+ state
1294
+ });
1295
+ }
1296
+
1297
+ let json = res.body;
1298
+
1299
+ if (useEtag) {
1300
+ const responseETAG = getHeaderCaseInsensitive('etag', res.headers);
1301
+
1302
+ if (responseETAG) {
1303
+ etagCache[key] = {
1304
+ etag: responseETAG,
1305
+ body: json
1306
+ };
1307
+ }
1308
+ }
1309
+
1310
+ if (typeof receiveActionCreator === 'function') {
1311
+ dispatch(receiveActionCreator({
1312
+ response: json
1313
+ }));
1314
+ return resolve({
1315
+ response: json
1316
+ });
1317
+ }
1318
+
1319
+ dispatch(receiveActionCreator);
1320
+ return resolve({
1321
+ response: json
1322
+ });
1323
+ };
1324
+ const fetchErrorHandler = response => {
1325
+ let code = response.status;
1326
+ let msg = response.statusText;
1327
+
1328
+ switch (code) {
1329
+ case 403:
1330
+ sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire("ERROR", i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4___default().translate("errors.user_not_authz"), "warning");
1331
+ break;
1332
+
1333
+ case 401:
1334
+ sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire("ERROR", i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4___default().translate("errors.session_expired"), "error");
1335
+ break;
1336
+
1337
+ case 412:
1338
+ sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire("ERROR", msg, "warning");
1339
+
1340
+ case 500:
1341
+ sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire("ERROR", i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4___default().translate("errors.server_error"), "error");
1342
+ }
1343
+ };
1344
+ const fetchResponseHandler = response => {
1345
+ if (!response.ok) {
1346
+ throw response;
1347
+ } else {
1348
+ return response.json();
1349
+ }
1350
+ };
1351
+ const showMessage = (settings, callback = {}) => dispatch => {
1352
+ dispatch(stopLoading());
1353
+ sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire(settings).then(result => {
1354
+ if (result.value && typeof callback === 'function') {
1355
+ callback();
1356
+ }
1357
+ });
1358
+ };
1359
+ const showSuccessMessage = html => dispatch => {
1360
+ dispatch(stopLoading());
1361
+ sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire({
1362
+ title: i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4___default().translate("general.done"),
1363
+ html: html,
1364
+ type: 'success'
1365
+ });
1366
+ };
1367
+ const downloadFileByContent = (filename, content, mime) => {
1368
+ let link = document.createElement('a');
1369
+ link.textContent = 'download';
1370
+ link.download = filename;
1371
+ link.href = `data:${mime},${encodeURIComponent(content)}`;
1372
+ document.body.appendChild(link); // Required for FF
1373
+
1374
+ link.click();
1375
+ document.body.removeChild(link);
1376
+ };
1377
+ const getCSV = (endpoint, params, filename, header = null) => dispatch => {
1378
+ let url = urijs__WEBPACK_IMPORTED_MODULE_2___default()(endpoint);
1379
+ if (!isObjectEmpty(params)) url = url.query(params);
1380
+ dispatch(startLoading());
1381
+ return fetch(url.toString()).then(response => {
1382
+ if (!response.ok) {
1383
+ throw response;
1384
+ } else {
1385
+ return response.text();
1386
+ }
1387
+ }).then(csv => {
1388
+ dispatch(stopLoading());
1389
+
1390
+ if (header) {
1391
+ csv = header + '\r\r' + csv;
1392
+ }
1393
+
1394
+ downloadFileByContent(filename, csv, 'text/csv;charset=utf-8');
1395
+ }).catch(fetchErrorHandler);
1396
+ };
1397
+ const getRawCSV = (endpoint, params, header = null) => {
1398
+ let url = urijs__WEBPACK_IMPORTED_MODULE_2___default()(endpoint);
1399
+ if (!isObjectEmpty(params)) url = url.query(params);
1400
+ return fetch(url.toString()).then(response => {
1401
+ if (!response.ok) {
1402
+ throw response;
1403
+ } else {
1404
+ return response.text();
1405
+ }
1406
+ }).then(csv => {
1407
+ if (header) {
1408
+ csv = header + '\r\r' + csv;
1409
+ }
1410
+
1411
+ return csv;
1412
+ }).catch(fetchErrorHandler);
1413
+ };
1414
+ const escapeFilterValue = value => {
1415
+ value = value.replace(/,/g, "\\,");
1416
+ value = value.replace(/;/g, "\\;");
1417
+ return value;
1418
+ };
1419
+
1420
+ /***/ }),
1421
+
1422
+ /***/ "./src/utils/crypto.js":
1423
+ /*!*****************************!*\
1424
+ !*** ./src/utils/crypto.js ***!
1425
+ \*****************************/
1426
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1427
+
1428
+ __webpack_require__.r(__webpack_exports__);
1429
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1430
+ /* harmony export */ "getRandomBytes": () => (/* binding */ getRandomBytes),
1431
+ /* harmony export */ "getSHA256": () => (/* binding */ getSHA256)
1432
+ /* harmony export */ });
1433
+ /* harmony import */ var crypto_js_sha256__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! crypto-js/sha256 */ "crypto-js/sha256");
1434
+ /* harmony import */ var crypto_js_sha256__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(crypto_js_sha256__WEBPACK_IMPORTED_MODULE_0__);
1435
+ /* harmony import */ var crypto_js_enc_base64url__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! crypto-js/enc-base64url */ "crypto-js/enc-base64url");
1436
+ /* harmony import */ var crypto_js_enc_base64url__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(crypto_js_enc_base64url__WEBPACK_IMPORTED_MODULE_1__);
1437
+ /* harmony import */ var crypto_js_enc_hex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! crypto-js/enc-hex */ "crypto-js/enc-hex");
1438
+ /* harmony import */ var crypto_js_enc_hex__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(crypto_js_enc_hex__WEBPACK_IMPORTED_MODULE_2__);
1439
+ // limit of Crypto.getRandomValues()
1440
+ // https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues
1441
+ const MAX_BYTES = 65536; // Node supports requesting up to this number of bytes
1442
+ // https://github.com/nodejs/node/blob/master/lib/internal/crypto/random.js#L48
1443
+
1444
+ const MAX_UINT32 = 4294967295;
1445
+ const crypto = typeof window !== 'undefined' ? window.crypto || window.msCrypto : null;
1446
+
1447
+
1448
+
1449
+ const getRandomBytes = size => {
1450
+ // phantomjs needs to throw
1451
+ if (size > MAX_UINT32) throw new RangeError('requested too many random bytes');
1452
+ const bytes = Buffer.allocUnsafe(size);
1453
+ if (!crypto) return a;
1454
+
1455
+ if (size > 0) {
1456
+ // getRandomValues fails on IE if size == 0
1457
+ if (size > MAX_BYTES) {
1458
+ // this is the max bytes crypto.getRandomValues
1459
+ // can do at once see https://developer.mozilla.org/en-US/docs/Web/API/window.crypto.getRandomValues
1460
+ for (let generated = 0; generated < size; generated += MAX_BYTES) {
1461
+ // buffer.slice automatically checks if the end is past the end of
1462
+ // the buffer so we don't have to here
1463
+ crypto.getRandomValues(bytes.slice(generated, generated + MAX_BYTES));
1464
+ }
1465
+ } else {
1466
+ crypto.getRandomValues(bytes);
1467
+ }
1468
+ }
1469
+
1470
+ return bytes;
1471
+ };
1472
+ const getSHA256 = (message, format = 'hex') => {
1473
+ let f = (crypto_js_enc_hex__WEBPACK_IMPORTED_MODULE_2___default());
1474
+ if (format === 'Base64url') f = (crypto_js_enc_base64url__WEBPACK_IMPORTED_MODULE_1___default());
1475
+ return crypto_js_sha256__WEBPACK_IMPORTED_MODULE_0___default()(message).toString(f);
1476
+ };
1477
+
1478
+ /***/ }),
1479
+
1480
+ /***/ "./src/utils/methods.js":
1481
+ /*!******************************!*\
1482
+ !*** ./src/utils/methods.js ***!
1483
+ \******************************/
1484
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1485
+
1486
+ __webpack_require__.r(__webpack_exports__);
1487
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1488
+ /* harmony export */ "arraysEqual": () => (/* binding */ arraysEqual),
1489
+ /* harmony export */ "base64URLEncode": () => (/* binding */ base64URLEncode),
1490
+ /* harmony export */ "buildAPIBaseUrl": () => (/* binding */ buildAPIBaseUrl),
1491
+ /* harmony export */ "epochToMoment": () => (/* binding */ epochToMoment),
1492
+ /* harmony export */ "epochToMomentTimeZone": () => (/* binding */ epochToMomentTimeZone),
1493
+ /* harmony export */ "findElementPos": () => (/* binding */ findElementPos),
1494
+ /* harmony export */ "formatEpoch": () => (/* binding */ formatEpoch),
1495
+ /* harmony export */ "getAllowedUserGroups": () => (/* binding */ getAllowedUserGroups),
1496
+ /* harmony export */ "getAuthCallback": () => (/* binding */ getAuthCallback),
1497
+ /* harmony export */ "getBackURL": () => (/* binding */ getBackURL),
1498
+ /* harmony export */ "getCurrentHref": () => (/* binding */ getCurrentHref),
1499
+ /* harmony export */ "getCurrentLocation": () => (/* binding */ getCurrentLocation),
1500
+ /* harmony export */ "getCurrentPathName": () => (/* binding */ getCurrentPathName),
1501
+ /* harmony export */ "getCurrentUserLanguage": () => (/* binding */ getCurrentUserLanguage),
1502
+ /* harmony export */ "getFromLocalStorage": () => (/* binding */ getFromLocalStorage),
1503
+ /* harmony export */ "getOrigin": () => (/* binding */ getOrigin),
1504
+ /* harmony export */ "getTimeServiceUrl": () => (/* binding */ getTimeServiceUrl),
1505
+ /* harmony export */ "hasErrors": () => (/* binding */ hasErrors),
1506
+ /* harmony export */ "isClearingSessionState": () => (/* binding */ isClearingSessionState),
1507
+ /* harmony export */ "isEmpty": () => (/* binding */ isEmpty),
1508
+ /* harmony export */ "objectToQueryString": () => (/* binding */ objectToQueryString),
1509
+ /* harmony export */ "putOnLocalStorage": () => (/* binding */ putOnLocalStorage),
1510
+ /* harmony export */ "removeFromLocalStorage": () => (/* binding */ removeFromLocalStorage),
1511
+ /* harmony export */ "retryPromise": () => (/* binding */ retryPromise),
1512
+ /* harmony export */ "scrollToError": () => (/* binding */ scrollToError),
1513
+ /* harmony export */ "setSessionClearingState": () => (/* binding */ setSessionClearingState),
1514
+ /* harmony export */ "shallowEqual": () => (/* binding */ shallowEqual),
1515
+ /* harmony export */ "toSlug": () => (/* binding */ toSlug)
1516
+ /* harmony export */ });
1517
+ /* harmony import */ var moment_timezone__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! moment-timezone */ "moment-timezone");
1518
+ /* harmony import */ var moment_timezone__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(moment_timezone__WEBPACK_IMPORTED_MODULE_0__);
1519
+ /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! urijs */ "urijs");
1520
+ /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(urijs__WEBPACK_IMPORTED_MODULE_1__);
1521
+ /**
1522
+ * Copyright 2018 OpenStack Foundation
1523
+ * Licensed under the Apache License, Version 2.0 (the "License");
1524
+ * you may not use this file except in compliance with the License.
1525
+ * You may obtain a copy of the License at
1526
+ * http://www.apache.org/licenses/LICENSE-2.0
1527
+ * Unless required by applicable law or agreed to in writing, software
1528
+ * distributed under the License is distributed on an "AS IS" BASIS,
1529
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1530
+ * See the License for the specific language governing permissions and
1531
+ * limitations under the License.
1532
+ **/
1533
+
1534
+
1535
+ const findElementPos = obj => {
1536
+ var curtop = -70;
1537
+
1538
+ if (obj.offsetParent) {
1539
+ do {
1540
+ curtop += obj.offsetTop;
1541
+ } while (obj = obj.offsetParent);
1542
+
1543
+ return [curtop];
1544
+ }
1545
+ };
1546
+ const epochToMoment = atime => {
1547
+ if (!atime) return atime;
1548
+ atime = atime * 1000;
1549
+ return moment_timezone__WEBPACK_IMPORTED_MODULE_0___default()(atime);
1550
+ };
1551
+ const epochToMomentTimeZone = (atime, time_zone) => {
1552
+ if (!atime) return atime;
1553
+ atime = atime * 1000;
1554
+ return moment_timezone__WEBPACK_IMPORTED_MODULE_0___default()(atime).tz(time_zone);
1555
+ };
1556
+ const formatEpoch = (atime, format = 'M/D/YYYY h:mm a') => {
1557
+ if (!atime) return atime;
1558
+ return epochToMoment(atime).format(format);
1559
+ };
1560
+ const objectToQueryString = obj => {
1561
+ var str = "";
1562
+
1563
+ for (var key in obj) {
1564
+ if (str != "") {
1565
+ str += "&";
1566
+ }
1567
+
1568
+ str += key + "=" + encodeURIComponent(obj[key]);
1569
+ }
1570
+
1571
+ return str;
1572
+ };
1573
+ const getBackURL = () => {
1574
+ let url = urijs__WEBPACK_IMPORTED_MODULE_1___default()(window.location.href);
1575
+ let query = url.search(true);
1576
+ let fragment = url.fragment();
1577
+ let backUrl = query.hasOwnProperty('BackUrl') ? query['BackUrl'] : null;
1578
+
1579
+ if (fragment != null && fragment != '') {
1580
+ backUrl += `#${fragment}`;
1581
+ }
1582
+
1583
+ return backUrl;
1584
+ };
1585
+ const toSlug = text => {
1586
+ text = text.toLowerCase();
1587
+ return text.replace(/[^a-zA-Z0-9]+/g, '_');
1588
+ };
1589
+ const getAuthCallback = () => {
1590
+ if (typeof window !== 'undefined') {
1591
+ return `${window.location.origin}/auth/callback`;
1592
+ }
1593
+
1594
+ return null;
1595
+ };
1596
+ const getCurrentLocation = () => {
1597
+ let location = '';
1598
+
1599
+ if (typeof window !== 'undefined') {
1600
+ location = window.location; // check if we are on iframe
1601
+
1602
+ if (window.top) location = window.top.location;
1603
+ }
1604
+
1605
+ return location;
1606
+ };
1607
+ const getOrigin = () => {
1608
+ if (typeof window !== 'undefined') {
1609
+ return window.location.origin;
1610
+ }
1611
+
1612
+ return null;
1613
+ };
1614
+ const getCurrentPathName = () => {
1615
+ if (typeof window !== 'undefined') {
1616
+ return window.location.pathname;
1617
+ }
1618
+
1619
+ return null;
1620
+ };
1621
+ const getCurrentHref = () => {
1622
+ if (typeof window !== 'undefined') {
1623
+ return window.location.href;
1624
+ }
1625
+
1626
+ return null;
1627
+ };
1628
+ const getAllowedUserGroups = () => {
1629
+ if (typeof window !== 'undefined') {
1630
+ return window.ALLOWED_USER_GROUPS || '';
1631
+ }
1632
+
1633
+ return null;
1634
+ };
1635
+ const buildAPIBaseUrl = relativeUrl => {
1636
+ if (typeof window !== 'undefined') {
1637
+ return `${window.API_BASE_URL}${relativeUrl}`;
1638
+ }
1639
+
1640
+ return null``;
1641
+ };
1642
+ const putOnLocalStorage = (key, value) => {
1643
+ if (typeof window !== 'undefined') {
1644
+ window.localStorage.setItem(key, value);
1645
+ }
1646
+ };
1647
+ const getFromLocalStorage = (key, removeIt) => {
1648
+ if (typeof window !== 'undefined') {
1649
+ let val = window.localStorage.getItem(key);
1650
+
1651
+ if (removeIt) {
1652
+ console.log(`getFromLocalStorage removing key ${key}`);
1653
+ removeFromLocalStorage(key);
1654
+ }
1655
+
1656
+ return val;
1657
+ }
1658
+
1659
+ return null;
1660
+ };
1661
+ const removeFromLocalStorage = key => {
1662
+ if (typeof window !== 'undefined') {
1663
+ window.localStorage.removeItem(key);
1664
+ }
1665
+ };
1666
+ const isClearingSessionState = () => {
1667
+ if (typeof window !== 'undefined') {
1668
+ return window.clearing_session_state;
1669
+ }
1670
+
1671
+ return false;
1672
+ };
1673
+ const setSessionClearingState = val => {
1674
+ if (typeof window !== 'undefined') {
1675
+ window.clearing_session_state = val;
1676
+ }
1677
+ };
1678
+ const getCurrentUserLanguage = () => {
1679
+ let language = 'en';
1680
+
1681
+ if (typeof navigator !== 'undefined') {
1682
+ language = navigator.languages && navigator.languages[0] || navigator.language || navigator.userLanguage;
1683
+ }
1684
+
1685
+ return language;
1686
+ };
1687
+ const scrollToError = errors => {
1688
+ if (Object.keys(errors).length > 0) {
1689
+ const firstError = Object.keys(errors)[0];
1690
+ const firstNode = document.getElementById(firstError);
1691
+ if (firstNode) window.scrollTo(0, findElementPos(firstNode));
1692
+ }
1693
+ };
1694
+ const hasErrors = (field, errors) => {
1695
+ if (field in errors) {
1696
+ return errors[field];
1697
+ }
1698
+
1699
+ return '';
1700
+ };
1701
+ const shallowEqual = (object1, object2) => {
1702
+ const keys1 = Object.keys(object1);
1703
+ const keys2 = Object.keys(object2);
1704
+
1705
+ if (keys1.length !== keys2.length) {
1706
+ return false;
1707
+ }
1708
+
1709
+ for (let key of keys1) {
1710
+ if (object1[key] !== object2[key]) {
1711
+ return false;
1712
+ }
1713
+ }
1714
+
1715
+ return true;
1716
+ };
1717
+ const arraysEqual = (a1, a2) => a1.length === a2.length && a1.every((o, idx) => shallowEqual(o, a2[idx]));
1718
+ const isEmpty = obj => {
1719
+ return Object.keys(obj).length === 0;
1720
+ };
1721
+ const base64URLEncode = str => {
1722
+ return str.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
1723
+ };
1724
+ const retryPromise = async (cb, maxNumberOfRetries = 3) => {
1725
+ for (let i = 0; i < maxNumberOfRetries; i++) {
1726
+ if (await cb()) {
1727
+ return true;
1728
+ }
1729
+ }
1730
+
1731
+ return false;
1732
+ };
1733
+ const getTimeServiceUrl = () => {
1734
+ if (typeof window !== 'undefined') {
1735
+ return window.TIMEINTERVALSINCE1970_API_URL || process.env.TIMEINTERVALSINCE1970_API_URL;
1736
+ }
1737
+
1738
+ return null;
1739
+ };
1740
+
1741
+ /***/ }),
1742
+
1743
+ /***/ "./src/utils/query-actions.js":
1744
+ /*!************************************!*\
1745
+ !*** ./src/utils/query-actions.js ***!
1746
+ \************************************/
1747
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1748
+
1749
+ __webpack_require__.r(__webpack_exports__);
1750
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1751
+ /* harmony export */ "RECEIVE_COUNTRIES": () => (/* binding */ RECEIVE_COUNTRIES),
1752
+ /* harmony export */ "geoCodeAddress": () => (/* binding */ geoCodeAddress),
1753
+ /* harmony export */ "geoCodeLatLng": () => (/* binding */ geoCodeLatLng),
1754
+ /* harmony export */ "getCountryList": () => (/* binding */ getCountryList),
1755
+ /* harmony export */ "getLanguageList": () => (/* binding */ getLanguageList),
1756
+ /* harmony export */ "queryAccessLevels": () => (/* binding */ queryAccessLevels),
1757
+ /* harmony export */ "queryCompanies": () => (/* binding */ queryCompanies),
1758
+ /* harmony export */ "queryEventTypes": () => (/* binding */ queryEventTypes),
1759
+ /* harmony export */ "queryEvents": () => (/* binding */ queryEvents),
1760
+ /* harmony export */ "queryGroups": () => (/* binding */ queryGroups),
1761
+ /* harmony export */ "queryMembers": () => (/* binding */ queryMembers),
1762
+ /* harmony export */ "queryOrganizations": () => (/* binding */ queryOrganizations),
1763
+ /* harmony export */ "queryPromocodes": () => (/* binding */ queryPromocodes),
1764
+ /* harmony export */ "queryRegistrationCompanies": () => (/* binding */ queryRegistrationCompanies),
1765
+ /* harmony export */ "querySpeakers": () => (/* binding */ querySpeakers),
1766
+ /* harmony export */ "querySponsoredProjects": () => (/* binding */ querySponsoredProjects),
1767
+ /* harmony export */ "querySponsors": () => (/* binding */ querySponsors),
1768
+ /* harmony export */ "querySummits": () => (/* binding */ querySummits),
1769
+ /* harmony export */ "queryTags": () => (/* binding */ queryTags),
1770
+ /* harmony export */ "queryTicketTypes": () => (/* binding */ queryTicketTypes),
1771
+ /* harmony export */ "queryTrackGroups": () => (/* binding */ queryTrackGroups),
1772
+ /* harmony export */ "queryTracks": () => (/* binding */ queryTracks)
1773
+ /* harmony export */ });
1774
+ /* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./actions */ "./src/utils/actions.js");
1775
+ /* harmony import */ var _components_security_methods__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/security/methods */ "./src/components/security/methods.js");
1776
+ /* harmony import */ var _methods__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./methods */ "./src/utils/methods.js");
1777
+ /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash */ "lodash");
1778
+ /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_3__);
1779
+ /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! urijs */ "urijs");
1780
+ /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(urijs__WEBPACK_IMPORTED_MODULE_4__);
1781
+ /**
1782
+ * Copyright 2018 OpenStack Foundation
1783
+ * Licensed under the Apache License, Version 2.0 (the "License");
1784
+ * you may not use this file except in compliance with the License.
1785
+ * You may obtain a copy of the License at
1786
+ * http://www.apache.org/licenses/LICENSE-2.0
1787
+ * Unless required by applicable law or agreed to in writing, software
1788
+ * distributed under the License is distributed on an "AS IS" BASIS,
1789
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1790
+ * See the License for the specific language governing permissions and
1791
+ * limitations under the License.
1792
+ **/
1793
+
1794
+
1795
+
1796
+
1797
+ const RECEIVE_COUNTRIES = 'RECEIVE_COUNTRIES';
1798
+ const callDelay = 500; //miliseconds
1799
+
1800
+
1801
+ const queryMembers = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (input, callback) => {
1802
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1803
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1804
+ let filters = encodeURIComponent(`full_name=@${input},first_name=@${input},last_name=@${input},email=@${input}`);
1805
+ let expand = `tickets,rsvp,schedule_summit_events,all_affiliations`;
1806
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/members?filter=${filters}&expand=${expand}&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1807
+ let options = [...json.data];
1808
+ callback(options);
1809
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1810
+ }, callDelay);
1811
+ const querySummits = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (input, callback) => {
1812
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1813
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1814
+ let filters = encodeURIComponent(`name=@${input}`);
1815
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/summits/all?filter=${filters}&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1816
+ let options = [...json.data];
1817
+ callback(options);
1818
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1819
+ }, callDelay);
1820
+ const querySpeakers = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback) => {
1821
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1822
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1823
+ let filters = encodeURIComponent(`full_name=@${input},first_name=@${input},last_name=@${input},email=@${input}`);
1824
+ let apiUrl = `/api/v1`;
1825
+
1826
+ if (summitId) {
1827
+ apiUrl += `/summits/${summitId}`;
1828
+ }
1829
+
1830
+ apiUrl += `/speakers?filter=${filters}&access_token=${accessToken}&expand=member,registration_request`;
1831
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(apiUrl)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1832
+ let options = [...json.data];
1833
+ callback(options);
1834
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1835
+ }, callDelay);
1836
+ const queryTags = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback) => {
1837
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1838
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1839
+ let apiUrl = `/api/v1`;
1840
+ let filter = encodeURIComponent(`tag=@${input}`);
1841
+
1842
+ if (summitId) {
1843
+ apiUrl += `/summits/${summitId}/track-tag-groups/all/allowed-tags?filter=${filter}&expand=tag,track_tag_group`;
1844
+ } else {
1845
+ apiUrl += `/tags?filter=${filter}`;
1846
+ }
1847
+
1848
+ apiUrl += `&order=tag&page=1&per_page=50&access_token=${accessToken}`;
1849
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(apiUrl)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1850
+ let options = [...json.data];
1851
+
1852
+ if (summitId) {
1853
+ options = options.map(t => t.tag);
1854
+ }
1855
+
1856
+ callback(options);
1857
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1858
+ }, callDelay);
1859
+ const queryTracks = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback) => {
1860
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1861
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1862
+ let filter = encodeURIComponent(`name=@${input}`);
1863
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/summits/${summitId}/tracks?filter=${filter}&order=name&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1864
+ let options = [...json.data];
1865
+ callback(options);
1866
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1867
+ }, callDelay);
1868
+ const queryTrackGroups = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback) => {
1869
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1870
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1871
+ let filter = input ? encodeURIComponent(`filter=name=@${input}`) : '';
1872
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/summits/${summitId}/track-groups?order=name&access_token=${accessToken}&${filter}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1873
+ let options = [...json.data];
1874
+ callback(options);
1875
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1876
+ }, callDelay);
1877
+ const queryEvents = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, onlyPublished = false, callback) => {
1878
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1879
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1880
+ let baseUrl = `/api/v1/summits/${summitId}/events` + (onlyPublished ? '/published' : '');
1881
+ let filter = encodeURIComponent(`title=@${input}`);
1882
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`${baseUrl}?filter=${filter}&order=title&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1883
+ let options = [...json.data];
1884
+ callback(options);
1885
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1886
+ }, callDelay);
1887
+ const queryEventTypes = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback, eventTypeClassName = null) => {
1888
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1889
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1890
+ let url = `/api/v1/summits/${summitId}/event-types?order=name&access_token=${accessToken}`;
1891
+
1892
+ if (input) {
1893
+ const filter = encodeURIComponent(`name=@${input}`);
1894
+ url += `&filter[]=${filter}`;
1895
+ }
1896
+
1897
+ if (eventTypeClassName) {
1898
+ const filter = encodeURIComponent(`class_name==${eventTypeClassName}`);
1899
+ url += `&filter[]=${filter}`;
1900
+ }
1901
+
1902
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(url)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1903
+ let options = [...json.data];
1904
+ callback(options);
1905
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1906
+ }, callDelay);
1907
+ const queryGroups = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (input, callback) => {
1908
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1909
+ let filters = encodeURIComponent(`title=@${input},code=@${input}`);
1910
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/groups?filter=${filters}&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1911
+ let options = [...json.data];
1912
+ callback(options);
1913
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1914
+ }, callDelay);
1915
+ const queryCompanies = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (input, callback) => {
1916
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1917
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1918
+ let filters = encodeURIComponent(`name=@${input}`);
1919
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/companies?filter=${filters}&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1920
+ let options = [...json.data];
1921
+ callback(options);
1922
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1923
+ }, callDelay);
1924
+ const queryRegistrationCompanies = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback) => {
1925
+ let accessToken;
1926
+
1927
+ try {
1928
+ accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1929
+ } catch (e) {
1930
+ callback(e);
1931
+ return;
1932
+ }
1933
+
1934
+ let apiUrl = urijs__WEBPACK_IMPORTED_MODULE_4___default()(`/api/v1/summits/${summitId}/registration-companies`);
1935
+ apiUrl.addQuery('access_token', accessToken);
1936
+ apiUrl.addQuery('order', 'name');
1937
+
1938
+ if (input) {
1939
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1940
+ apiUrl.addQuery('filter[]', `name@@${input}`);
1941
+ }
1942
+
1943
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(apiUrl.toString())).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1944
+ let options = [...json.data];
1945
+ callback(options);
1946
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1947
+ }, callDelay);
1948
+ const querySponsors = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback) => {
1949
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1950
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1951
+ let filters = encodeURIComponent(`company_name=@${input}`);
1952
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/summits/${summitId}/sponsors?filter=${filters}&expand=company,sponsorship&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1953
+ let options = [...json.data];
1954
+ callback(options);
1955
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1956
+ }, callDelay);
1957
+ const queryAccessLevels = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback) => {
1958
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1959
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1960
+ let filters = encodeURIComponent(`name=@${input}`);
1961
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/summits/${summitId}/access-level-types?filter=${filters}&&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1962
+ let options = [...json.data];
1963
+ callback(options);
1964
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1965
+ }, callDelay);
1966
+ const queryOrganizations = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (input, callback) => {
1967
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1968
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1969
+ let filters = encodeURIComponent(`name=@${input}`);
1970
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/organizations?filter=${filters}&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1971
+ let options = [...json.data];
1972
+ callback(options);
1973
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1974
+ }, callDelay);
1975
+ const getLanguageList = (callback, signal) => {
1976
+ return fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/public/v1/languages`), {
1977
+ signal
1978
+ }).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(response => {
1979
+ callback(response.data);
1980
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1981
+ };
1982
+ const getCountryList = (callback, signal) => {
1983
+ return fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/public/v1/countries`), {
1984
+ signal
1985
+ }).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(response => {
1986
+ callback(response.data);
1987
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1988
+ };
1989
+ var geocoder;
1990
+ const geoCodeAddress = address => {
1991
+ if (!geocoder) geocoder = new google.maps.Geocoder(); // return a Promise
1992
+
1993
+ return new Promise(function (resolve, reject) {
1994
+ geocoder.geocode({
1995
+ 'address': address
1996
+ }, function (results, status) {
1997
+ if (status == google.maps.GeocoderStatus.OK) {
1998
+ // resolve results upon a successful status
1999
+ resolve(results);
2000
+ } else {
2001
+ // reject status upon un-successful status
2002
+ reject(status);
2003
+ }
2004
+ });
2005
+ });
2006
+ };
2007
+ const geoCodeLatLng = (lat, lng) => {
2008
+ if (!geocoder) geocoder = new google.maps.Geocoder();
2009
+ var latlng = {
2010
+ lat: parseFloat(lat),
2011
+ lng: parseFloat(lng)
2012
+ }; // return a Promise
2013
+
2014
+ return new Promise(function (resolve, reject) {
2015
+ geocoder.geocode({
2016
+ 'location': latlng
2017
+ }, function (results, status) {
2018
+ if (status == google.maps.GeocoderStatus.OK) {
2019
+ // resolve results upon a successful status
2020
+ resolve(results);
2021
+ } else {
2022
+ // reject status upon un-successful status
2023
+ reject(status);
2024
+ }
2025
+ });
2026
+ });
2027
+ };
2028
+ const queryTicketTypes = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, filters = {}, callback, version = 'v1') => {
2029
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
2030
+ let apiUrl = urijs__WEBPACK_IMPORTED_MODULE_4___default()(`/api/${version}/summits/${summitId}/ticket-types`);
2031
+ apiUrl.addQuery('access_token', accessToken);
2032
+ apiUrl.addQuery('order', 'name');
2033
+
2034
+ if (filters.hasOwnProperty('name')) {
2035
+ const name = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(filters.name);
2036
+ apiUrl.addQuery('filter[]', `name@@${name}`);
2037
+ }
2038
+
2039
+ if (filters.hasOwnProperty('audience')) {
2040
+ const audience = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(filters.audience);
2041
+ apiUrl.addQuery('filter[]', `audience==${audience}`);
2042
+ }
2043
+
2044
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(apiUrl.toString())).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
2045
+ let options = [...json.data];
2046
+ callback(options);
2047
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
2048
+ }, callDelay);
2049
+ const querySponsoredProjects = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (input, callback) => {
2050
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
2051
+ const apiUrl = urijs__WEBPACK_IMPORTED_MODULE_4___default()(`/api/v1/sponsored-projects`);
2052
+ apiUrl.addQuery('access_token', accessToken);
2053
+
2054
+ if (input) {
2055
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
2056
+ apiUrl.addQuery('filter[]', `name=@${input}`);
2057
+ }
2058
+
2059
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(apiUrl.toString())).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
2060
+ let options = [...json.data];
2061
+ callback(options);
2062
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
2063
+ }, callDelay);
2064
+ const queryPromocodes = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback) => {
2065
+ const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
2066
+ input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
2067
+ let filters = encodeURIComponent(`code=@${input}`);
2068
+ fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/summits/${summitId}/promo-codes?filter=${filters}&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
2069
+ let options = [...json.data];
2070
+ callback(options);
2071
+ }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
2072
+ }, callDelay);
2073
+
2074
+ /***/ }),
2075
+
2076
+ /***/ "@babel/runtime/helpers/defineProperty":
2077
+ /*!********************************************************!*\
2078
+ !*** external "@babel/runtime/helpers/defineProperty" ***!
2079
+ \********************************************************/
2080
+ /***/ ((module) => {
2081
+
2082
+ module.exports = require("@babel/runtime/helpers/defineProperty");
2083
+
2084
+ /***/ }),
2085
+
2086
+ /***/ "@babel/runtime/helpers/extends":
2087
+ /*!*************************************************!*\
2088
+ !*** external "@babel/runtime/helpers/extends" ***!
2089
+ \*************************************************/
2090
+ /***/ ((module) => {
2091
+
2092
+ module.exports = require("@babel/runtime/helpers/extends");
2093
+
2094
+ /***/ }),
2095
+
2096
+ /***/ "@babel/runtime/helpers/objectWithoutProperties":
2097
+ /*!*****************************************************************!*\
2098
+ !*** external "@babel/runtime/helpers/objectWithoutProperties" ***!
2099
+ \*****************************************************************/
2100
+ /***/ ((module) => {
2101
+
2102
+ module.exports = require("@babel/runtime/helpers/objectWithoutProperties");
2103
+
2104
+ /***/ }),
2105
+
2106
+ /***/ "browser-tabs-lock":
2107
+ /*!************************************!*\
2108
+ !*** external "browser-tabs-lock" ***!
2109
+ \************************************/
2110
+ /***/ ((module) => {
2111
+
2112
+ module.exports = require("browser-tabs-lock");
2113
+
2114
+ /***/ }),
2115
+
2116
+ /***/ "crypto-js/enc-base64url":
2117
+ /*!******************************************!*\
2118
+ !*** external "crypto-js/enc-base64url" ***!
2119
+ \******************************************/
2120
+ /***/ ((module) => {
2121
+
2122
+ module.exports = require("crypto-js/enc-base64url");
2123
+
2124
+ /***/ }),
2125
+
2126
+ /***/ "crypto-js/enc-hex":
2127
+ /*!************************************!*\
2128
+ !*** external "crypto-js/enc-hex" ***!
2129
+ \************************************/
2130
+ /***/ ((module) => {
2131
+
2132
+ module.exports = require("crypto-js/enc-hex");
2133
+
2134
+ /***/ }),
2135
+
2136
+ /***/ "crypto-js/sha256":
2137
+ /*!***********************************!*\
2138
+ !*** external "crypto-js/sha256" ***!
2139
+ \***********************************/
2140
+ /***/ ((module) => {
2141
+
2142
+ module.exports = require("crypto-js/sha256");
2143
+
2144
+ /***/ }),
2145
+
2146
+ /***/ "i18n-react/dist/i18n-react":
2147
+ /*!*********************************************!*\
2148
+ !*** external "i18n-react/dist/i18n-react" ***!
2149
+ \*********************************************/
2150
+ /***/ ((module) => {
2151
+
2152
+ module.exports = require("i18n-react/dist/i18n-react");
2153
+
2154
+ /***/ }),
2155
+
2156
+ /***/ "idtoken-verifier":
2157
+ /*!***********************************!*\
2158
+ !*** external "idtoken-verifier" ***!
2159
+ \***********************************/
2160
+ /***/ ((module) => {
2161
+
2162
+ module.exports = require("idtoken-verifier");
2163
+
2164
+ /***/ }),
2165
+
2166
+ /***/ "lodash":
2167
+ /*!*************************!*\
2168
+ !*** external "lodash" ***!
2169
+ \*************************/
2170
+ /***/ ((module) => {
2171
+
2172
+ module.exports = require("lodash");
2173
+
2174
+ /***/ }),
2175
+
2176
+ /***/ "moment-timezone":
2177
+ /*!**********************************!*\
2178
+ !*** external "moment-timezone" ***!
2179
+ \**********************************/
2180
+ /***/ ((module) => {
2181
+
2182
+ module.exports = require("moment-timezone");
2183
+
2184
+ /***/ }),
2185
+
2186
+ /***/ "react":
2187
+ /*!************************!*\
2188
+ !*** external "react" ***!
2189
+ \************************/
2190
+ /***/ ((module) => {
2191
+
2192
+ module.exports = require("react");
2193
+
2194
+ /***/ }),
2195
+
2196
+ /***/ "react-select":
2197
+ /*!*******************************!*\
2198
+ !*** external "react-select" ***!
2199
+ \*******************************/
2200
+ /***/ ((module) => {
2201
+
2202
+ module.exports = require("react-select");
2203
+
2204
+ /***/ }),
2205
+
2206
+ /***/ "superagent/lib/client":
2207
+ /*!****************************************!*\
2208
+ !*** external "superagent/lib/client" ***!
2209
+ \****************************************/
2210
+ /***/ ((module) => {
2211
+
2212
+ module.exports = require("superagent/lib/client");
2213
+
2214
+ /***/ }),
2215
+
2216
+ /***/ "sweetalert2":
2217
+ /*!******************************!*\
2218
+ !*** external "sweetalert2" ***!
2219
+ \******************************/
2220
+ /***/ ((module) => {
2221
+
2222
+ module.exports = require("sweetalert2");
2223
+
2224
+ /***/ }),
2225
+
2226
+ /***/ "urijs":
2227
+ /*!************************!*\
2228
+ !*** external "urijs" ***!
2229
+ \************************/
2230
+ /***/ ((module) => {
2231
+
2232
+ module.exports = require("urijs");
2233
+
2234
+ /***/ })
2235
+
2236
+ /******/ });
2237
+ /************************************************************************/
2238
+ /******/ // The module cache
2239
+ /******/ var __webpack_module_cache__ = {};
2240
+ /******/
2241
+ /******/ // The require function
2242
+ /******/ function __webpack_require__(moduleId) {
2243
+ /******/ // Check if module is in cache
2244
+ /******/ var cachedModule = __webpack_module_cache__[moduleId];
2245
+ /******/ if (cachedModule !== undefined) {
2246
+ /******/ return cachedModule.exports;
2247
+ /******/ }
2248
+ /******/ // Create a new module (and put it into the cache)
2249
+ /******/ var module = __webpack_module_cache__[moduleId] = {
2250
+ /******/ // no module.id needed
2251
+ /******/ // no module.loaded needed
2252
+ /******/ exports: {}
2253
+ /******/ };
2254
+ /******/
2255
+ /******/ // Execute the module function
2256
+ /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
2257
+ /******/
2258
+ /******/ // Return the exports of the module
2259
+ /******/ return module.exports;
2260
+ /******/ }
2261
+ /******/
2262
+ /************************************************************************/
2263
+ /******/ /* webpack/runtime/compat get default export */
2264
+ /******/ (() => {
2265
+ /******/ // getDefaultExport function for compatibility with non-harmony modules
2266
+ /******/ __webpack_require__.n = (module) => {
2267
+ /******/ var getter = module && module.__esModule ?
2268
+ /******/ () => (module['default']) :
2269
+ /******/ () => (module);
2270
+ /******/ __webpack_require__.d(getter, { a: getter });
2271
+ /******/ return getter;
2272
+ /******/ };
2273
+ /******/ })();
2274
+ /******/
2275
+ /******/ /* webpack/runtime/define property getters */
2276
+ /******/ (() => {
2277
+ /******/ // define getter functions for harmony exports
2278
+ /******/ __webpack_require__.d = (exports, definition) => {
2279
+ /******/ for(var key in definition) {
2280
+ /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
2281
+ /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
2282
+ /******/ }
2283
+ /******/ }
2284
+ /******/ };
2285
+ /******/ })();
2286
+ /******/
2287
+ /******/ /* webpack/runtime/hasOwnProperty shorthand */
2288
+ /******/ (() => {
2289
+ /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
2290
+ /******/ })();
2291
+ /******/
2292
+ /******/ /* webpack/runtime/make namespace object */
2293
+ /******/ (() => {
2294
+ /******/ // define __esModule on exports
2295
+ /******/ __webpack_require__.r = (exports) => {
2296
+ /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
2297
+ /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2298
+ /******/ }
2299
+ /******/ Object.defineProperty(exports, '__esModule', { value: true });
2300
+ /******/ };
2301
+ /******/ })();
2302
+ /******/
2303
+ /************************************************************************/
2304
+ var __webpack_exports__ = {};
2305
+ // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
2306
+ (() => {
2307
+ /*!***************************************************!*\
2308
+ !*** ./src/components/inputs/country-dropdown.js ***!
2309
+ \***************************************************/
2310
+ __webpack_require__.r(__webpack_exports__);
2311
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2312
+ /* harmony export */ "default": () => (/* binding */ CountryDropdown)
2313
+ /* harmony export */ });
2314
+ /* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "@babel/runtime/helpers/extends");
2315
+ /* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__);
2316
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react");
2317
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
2318
+ /* harmony import */ var _dropdown__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dropdown */ "./src/components/inputs/dropdown.js");
2319
+ /* harmony import */ var _utils_query_actions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/query-actions */ "./src/utils/query-actions.js");
2320
+
2321
+
2322
+ /**
2323
+ * Copyright 2017 OpenStack Foundation
2324
+ * Licensed under the Apache License, Version 2.0 (the "License");
2325
+ * you may not use this file except in compliance with the License.
2326
+ * You may obtain a copy of the License at
2327
+ * http://www.apache.org/licenses/LICENSE-2.0
2328
+ * Unless required by applicable law or agreed to in writing, software
2329
+ * distributed under the License is distributed on an "AS IS" BASIS,
2330
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2331
+ * See the License for the specific language governing permissions and
2332
+ * limitations under the License.
2333
+ **/
2334
+
2335
+
2336
+
2337
+ class CountryDropdown extends (react__WEBPACK_IMPORTED_MODULE_1___default().Component) {
2338
+ constructor(props) {
2339
+ super(props);
2340
+ this.state = {
2341
+ options: []
2342
+ };
2343
+ this.handleChange = this.handleChange.bind(this);
2344
+ this.setOptions = this.setOptions.bind(this);
2345
+ this.abortController = new AbortController();
2346
+ }
2347
+
2348
+ componentDidMount() {
2349
+ let {
2350
+ options
2351
+ } = this.state;
2352
+
2353
+ if (options.length == 0) {
2354
+ (0,_utils_query_actions__WEBPACK_IMPORTED_MODULE_3__.getCountryList)(this.setOptions, this.abortController.signal);
2355
+ }
2356
+ }
2357
+
2358
+ componentWillUnmount() {
2359
+ this.abortController.abort();
2360
+ }
2361
+
2362
+ handleChange(value) {
2363
+ let ev = {
2364
+ target: {
2365
+ id: this.props.id,
2366
+ value: value,
2367
+ type: 'countryddl'
2368
+ }
2369
+ };
2370
+ this.props.onChange(ev);
2371
+ }
2372
+
2373
+ setOptions(response) {
2374
+ let countryList = response.map(c => ({
2375
+ label: c.name,
2376
+ value: c.iso_code
2377
+ }));
2378
+ this.setState({
2379
+ options: countryList
2380
+ });
2381
+ }
2382
+
2383
+ render() {
2384
+ let {
2385
+ options
2386
+ } = this.state;
2387
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_dropdown__WEBPACK_IMPORTED_MODULE_2__["default"], _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default()({
2388
+ options: options
2389
+ }, this.props));
2390
+ }
2391
+
2392
+ }
2393
+ })();
2394
+
2395
+ /******/ return __webpack_exports__;
2396
+ /******/ })()
2397
+ ;
2398
+ });
2399
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50cy9pbnB1dHMvY291bnRyeS1kcm9wZG93bi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVlLE1BQU1FLFFBQU4sU0FBdUJGLHdEQUF2QixDQUF1QztFQUVsREksV0FBVyxDQUFDQyxLQUFELEVBQVE7SUFDZixNQUFNQSxLQUFOO0lBRUEsS0FBS0MsWUFBTCxHQUFvQixLQUFLQSxZQUFMLENBQWtCQyxJQUFsQixDQUF1QixJQUF2QixDQUFwQjtFQUNIOztFQUVERCxZQUFZLENBQUNFLFNBQUQsRUFBWTtJQUVwQixJQUFJQyxLQUFLLEdBQUcsSUFBWjs7SUFDQSxJQUFJLEtBQUtKLEtBQUwsQ0FBV0ssT0FBZixFQUF3QjtNQUNwQkQsS0FBSyxHQUFHRCxTQUFTLEdBQUdBLFNBQVMsQ0FBQ0csR0FBVixDQUFjQyxHQUFHLElBQUlBLEdBQUcsQ0FBQ0gsS0FBekIsQ0FBSCxHQUFxQyxJQUF0RDtJQUNILENBRkQsTUFFTztNQUNIQSxLQUFLLEdBQUdELFNBQVMsR0FBR0EsU0FBUyxDQUFDQyxLQUFiLEdBQXFCLElBQXRDO0lBQ0g7O0lBRUQsSUFBSUksRUFBRSxHQUFHO01BQUNDLE1BQU0sRUFBRTtRQUNWQyxFQUFFLEVBQUUsS0FBS1YsS0FBTCxDQUFXVSxFQURMO1FBRVZOLEtBQUssRUFBRUEsS0FGRztRQUdWTyxJQUFJLEVBQUU7TUFISTtJQUFULENBQVQ7SUFNQSxLQUFLWCxLQUFMLENBQVdZLFFBQVgsQ0FBb0JKLEVBQXBCO0VBQ0g7O0VBRURLLE1BQU0sR0FBRztJQUVMLGtCQUFxRyxLQUFLYixLQUExRztJQUFBLElBQUk7TUFBQ1ksUUFBRDtNQUFXUixLQUFYO01B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LEtBQUtDLFFBQUwsQ0FBYztNQUFDNWIsT0FBTyxFQUFFd2I7SUFBVixDQUFkO0VBQ0g7O0VBRUR0YyxNQUFNLEdBQUc7SUFFTCxJQUFJO01BQUNjO0lBQUQsSUFBWSxLQUFLdUksS0FBckI7SUFFQSxvQkFDSSwyREFBQyxpREFBRDtNQUFVLE9BQU8sRUFBRXZJO0lBQW5CLEdBQWdDLEtBQUszQixLQUFyQyxFQURKO0VBSUg7O0FBbER3RCxDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vLi9zcmMvY29tcG9uZW50cy9pbnB1dHMvZHJvcGRvd24uanMiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uLy4vc3JjL2NvbXBvbmVudHMvc2VjdXJpdHkvYWN0aW9ucy5qcyIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vLi9zcmMvY29tcG9uZW50cy9zZWN1cml0eS9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uLy4vc3JjL2NvbXBvbmVudHMvc2VjdXJpdHkvbWV0aG9kcy5qcyIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vLi9zcmMvdXRpbHMvYWN0aW9ucy5qcyIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vLi9zcmMvdXRpbHMvY3J5cHRvLmpzIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi8uL3NyYy91dGlscy9tZXRob2RzLmpzIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi8uL3NyYy91dGlscy9xdWVyeS1hY3Rpb25zLmpzIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi9leHRlcm5hbCBjb21tb25qcyBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIiIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vZXh0ZXJuYWwgY29tbW9uanMgXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIiIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vZXh0ZXJuYWwgY29tbW9uanMgXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCIiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL2V4dGVybmFsIGNvbW1vbmpzIFwiYnJvd3Nlci10YWJzLWxvY2tcIiIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vZXh0ZXJuYWwgY29tbW9uanMgXCJjcnlwdG8tanMvZW5jLWJhc2U2NHVybFwiIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi9leHRlcm5hbCBjb21tb25qcyBcImNyeXB0by1qcy9lbmMtaGV4XCIiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL2V4dGVybmFsIGNvbW1vbmpzIFwiY3J5cHRvLWpzL3NoYTI1NlwiIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi9leHRlcm5hbCBjb21tb25qcyBcImkxOG4tcmVhY3QvZGlzdC9pMThuLXJlYWN0XCIiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL2V4dGVybmFsIGNvbW1vbmpzIFwiaWR0b2tlbi12ZXJpZmllclwiIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi9leHRlcm5hbCBjb21tb25qcyBcImxvZGFzaFwiIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi9leHRlcm5hbCBjb21tb25qcyBcIm1vbWVudC10aW1lem9uZVwiIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi9leHRlcm5hbCBjb21tb25qcyBcInJlYWN0XCIiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL2V4dGVybmFsIGNvbW1vbmpzIFwicmVhY3Qtc2VsZWN0XCIiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL2V4dGVybmFsIGNvbW1vbmpzIFwic3VwZXJhZ2VudC9saWIvY2xpZW50XCIiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL2V4dGVybmFsIGNvbW1vbmpzIFwic3dlZXRhbGVydDJcIiIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vZXh0ZXJuYWwgY29tbW9uanMgXCJ1cmlqc1wiIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vLi9zcmMvY29tcG9uZW50cy9pbnB1dHMvY291bnRyeS1kcm9wZG93bi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcIm9wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvblwiLCBbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJvcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb25cIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wib3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgKCkgPT4ge1xucmV0dXJuICIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTcgT3BlblN0YWNrIEZvdW5kYXRpb25cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKi9cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTZWxlY3QgZnJvbSAncmVhY3Qtc2VsZWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHJvcGRvd24gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlID0gdGhpcy5oYW5kbGVDaGFuZ2UuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBoYW5kbGVDaGFuZ2Uoc2VsZWN0aW9uKSB7XG5cbiAgICAgICAgbGV0IHZhbHVlID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuaXNNdWx0aSkge1xuICAgICAgICAgICAgdmFsdWUgPSBzZWxlY3Rpb24gPyBzZWxlY3Rpb24ubWFwKHZhbCA9PiB2YWwudmFsdWUpIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlID0gc2VsZWN0aW9uID8gc2VsZWN0aW9uLnZhbHVlIDogbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBldiA9IHt0YXJnZXQ6IHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5wcm9wcy5pZCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2Ryb3Bkb3duJ1xuICAgICAgICAgICAgfX07XG5cbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZShldik7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuXG4gICAgICAgIGxldCB7b25DaGFuZ2UsIHZhbHVlLCBjbGFzc05hbWUsIGVycm9yLCBjbGVhcmFibGUsIGRpc2FibGVkLCBvdmVycmlkZUNTUywgYXJpYUxhYmVsbGVkQnksIC4uLnJlc3R9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgbGV0IGhhc19lcnJvciA9ICggdGhpcy5wcm9wcy5oYXNPd25Qcm9wZXJ0eSgnZXJyb3InKSAmJiBlcnJvciAhPSAnJyApO1xuICAgICAgICBsZXQgaXNDbGVhcmFibGUgPSAodGhpcy5wcm9wcy5oYXNPd25Qcm9wZXJ0eSgnY2xlYXJhYmxlJykpO1xuICAgICAgICBsZXQgaXNEaXNhYmxlZCA9ICh0aGlzLnByb3BzLmhhc093blByb3BlcnR5KCdkaXNhYmxlZCcpICYmIGRpc2FibGVkID09IHRydWUpO1xuICAgICAgICBsZXQgdGhlVmFsdWUgPSBudWxsO1xuXG4gICAgICAgIGxldCBzZWxlY3RDbGFzc05hbWUgPSBjbGFzc05hbWU7XG5cbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLmhhc093blByb3BlcnR5KCdvdmVycmlkZUNTUycpIHx8IG92ZXJyaWRlQ1NTID09IGZhbHNlKSB7XG4gICAgICAgICAgICBzZWxlY3RDbGFzc05hbWUgPSAnZHJvcGRvd24gJyArIGNsYXNzTmFtZSArICcgJyArIChoYXNfZXJyb3IgPyAnZXJyb3InIDogJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucHJvcHMuaXNNdWx0aSkge1xuICAgICAgICAgICAgdGhlVmFsdWUgPSB0aGlzLnByb3BzLm9wdGlvbnMuZmlsdGVyKG9wID0+IHZhbHVlLmluY2x1ZGVzKG9wLnZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGVWYWx1ZSA9ICh2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCB8fCB2YWx1ZSA9PSBudWxsKSA/IHZhbHVlIDogdGhpcy5wcm9wcy5vcHRpb25zLmZpbmQob3B0ID0+IG9wdC52YWx1ZSA9PSB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWxlY3RTdHlsZXMgPSB7IG1lbnU6IHN0eWxlcyA9PiAoeyAuLi5zdHlsZXMsIHpJbmRleDogOTk5IH0pIH07XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e3NlbGVjdENsYXNzTmFtZX1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoZVZhbHVlfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5oYW5kbGVDaGFuZ2V9XG4gICAgICAgICAgICAgICAgICAgIGlzQ2xlYXJhYmxlPXtpc0NsZWFyYWJsZX1cbiAgICAgICAgICAgICAgICAgICAgaXNEaXNhYmxlZD17aXNEaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgc3R5bGVzPXtzZWxlY3RTdHlsZXN9XG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWxsZWRieT17YXJpYUxhYmVsbGVkQnl9XG4gICAgICAgICAgICAgICAgICAgIHsuLi5yZXN0fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAge2hhc19lcnJvciAmJlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cImVycm9yLWxhYmVsXCI+e2Vycm9yfTwvcD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcblxuICAgIH1cbn1cblxuRHJvcGRvd24uZGVmYXVsdFByb3BzID0ge1xuICAgIGFyaWFMYWJlbGxlZEJ5IDogbnVsbCxcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTggT3BlblN0YWNrIEZvdW5kYXRpb25cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKi9cblxuaW1wb3J0IFQgZnJvbSBcImkxOG4tcmVhY3QvZGlzdC9pMThuLXJlYWN0XCI7XG5pbXBvcnQge2F1dGhFcnJvckhhbmRsZXIsIGNyZWF0ZUFjdGlvbiwgZ2V0UmVxdWVzdCwgc2hvd01lc3NhZ2UsIHN0YXJ0TG9hZGluZywgc3RvcExvYWRpbmd9IGZyb20gXCIuLi8uLi91dGlscy9hY3Rpb25zXCI7XG5pbXBvcnQge2J1aWxkQVBJQmFzZVVybCwgZ2V0QWxsb3dlZFVzZXJHcm91cHN9IGZyb20gJy4uLy4uL3V0aWxzL21ldGhvZHMnO1xuaW1wb3J0IHsgZ2V0QWNjZXNzVG9rZW4sIHN0b3JlQXV0aEluZm8sIGluaXRMb2dPdXR9IGZyb20gJy4vbWV0aG9kcyc7XG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgY29uc3QgU0VUX0xPR0dFRF9VU0VSID0gJ1NFVF9MT0dHRURfVVNFUic7XG5leHBvcnQgY29uc3QgTE9HT1VUX1VTRVIgPSAnTE9HT1VUX1VTRVInO1xuZXhwb3J0IGNvbnN0IFJFUVVFU1RfVVNFUl9JTkZPID0gJ1JFUVVFU1RfVVNFUl9JTkZPJztcbmV4cG9ydCBjb25zdCBSRUNFSVZFX1VTRVJfSU5GTyA9ICdSRUNFSVZFX1VTRVJfSU5GTyc7XG5leHBvcnQgY29uc3QgQ0xFQVJfU0VTU0lPTl9TVEFURSA9ICdDTEVBUl9TRVNTSU9OX1NUQVRFJztcbmV4cG9ydCBjb25zdCBVUERBVEVfU0VTU0lPTl9TVEFURV9TVEFUVVMgPSAnVVBEQVRFX1NFU1NJT05fU1RBVEVfU1RBVFVTJztcbmV4cG9ydCBjb25zdCBTRVNTSU9OX1NUQVRFX1NUQVRVU19VTkNIQU5HRUQgPSAndW5jaGFuZ2VkJztcbmV4cG9ydCBjb25zdCBTRVNTSU9OX1NUQVRFX1NUQVRVU19DSEFOR0VEID0gJ2NoYW5nZWQnO1xuZXhwb3J0IGNvbnN0IFNFU1NJT05fU1RBVEVfU1RBVFVTX0VSUk9SID0gJ2Vycm9yJztcbmV4cG9ydCBjb25zdCBVUERBVEVfVVNFUl9JTkZPID0gJ1VQREFURV9VU0VSX0lORk8nO1xuXG5leHBvcnQgY29uc3Qgb25Vc2VyQXV0aCA9IChhY2Nlc3NUb2tlbiwgaWRUb2tlbiwgc2Vzc2lvblN0YXRlLCBleHBpcmVzSW4gPSAwLCByZWZyZXNoVG9rZW4gPSBudWxsKSA9PiAoZGlzcGF0Y2gpID0+IHtcblxuICAgIHN0b3JlQXV0aEluZm8oYWNjZXNzVG9rZW4sIGV4cGlyZXNJbiwgcmVmcmVzaFRva2VuLCBpZFRva2VuKTtcblxuICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogU0VUX0xPR0dFRF9VU0VSLFxuICAgICAgICBwYXlsb2FkOiB7IHNlc3Npb25TdGF0ZSB9XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBkb0xvZ291dCA9IChiYWNrVXJsKSA9PiAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBMT0dPVVRfVVNFUixcbiAgICAgICAgcGF5bG9hZDoge2JhY2tVcmw6IGJhY2tVcmx9XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VySW5mbyA9IChleHBhbmQgPSAnZ3JvdXBzJywgZmllbGRzPScnLCBiYWNrVXJsID0gbnVsbCwgaGlzdG9yeSA9IG51bGwsIGVycm9ySGFuZGxlciA9IG51bGwgKSA9PlxuICAgIGFzeW5jIChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcblxuICAgIGxldCBBbGxvd2VkVXNlckdyb3VwcyA9IGdldEFsbG93ZWRVc2VyR3JvdXBzKCk7XG4gICAgQWxsb3dlZFVzZXJHcm91cHMgPSBBbGxvd2VkVXNlckdyb3VwcyAhPT0gJycgPyBBbGxvd2VkVXNlckdyb3Vwcy5zcGxpdCgnICcpIDogW107XG4gICAgbGV0IHtsb2dnZWRVc2VyU3RhdGV9ID0gZ2V0U3RhdGUoKTtcbiAgICBsZXQge21lbWJlcn0gPSBsb2dnZWRVc2VyU3RhdGU7XG5cbiAgICBsZXQgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuXG4gICAgaWYgKG1lbWJlciAhPSBudWxsKSB7XG4gICAgICAgIGlmKGhpc3RvcnkgIT0gbnVsbCAmJiBiYWNrVXJsICE9IG51bGwpXG4gICAgICAgICAgICBoaXN0b3J5LnB1c2goYmFja1VybCk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBpZihlcnJvckhhbmRsZXIgPT0gbnVsbClcbiAgICAgICAgZXJyb3JIYW5kbGVyID0gYXV0aEVycm9ySGFuZGxlcjtcblxuICAgIGRpc3BhdGNoKHN0YXJ0TG9hZGluZygpKTtcblxuICAgIGxldCBwYXJhbXMgPSB7XG4gICAgICAgIGFjY2Vzc190b2tlbjogYWNjZXNzVG9rZW4sXG4gICAgICAgIGV4cGFuZCA6IGV4cGFuZCxcbiAgICB9XG5cbiAgICBpZihmaWVsZHMpe1xuICAgICAgICBwYXJhbXNbJ2ZpZWxkcyddID0gZmllbGRzO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRSZXF1ZXN0KFxuICAgICAgICBjcmVhdGVBY3Rpb24oUkVRVUVTVF9VU0VSX0lORk8pLFxuICAgICAgICBjcmVhdGVBY3Rpb24oUkVDRUlWRV9VU0VSX0lORk8pLFxuICAgICAgICBidWlsZEFQSUJhc2VVcmwoYC9hcGkvdjEvbWVtYmVycy9tZWApLFxuICAgICAgICBlcnJvckhhbmRsZXJcbiAgICApKHBhcmFtcykoZGlzcGF0Y2gsIGdldFN0YXRlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRpc3BhdGNoKHN0b3BMb2FkaW5nKCkpO1xuXG4gICAgICAgICAgICBsZXQge21lbWJlcn0gPSBnZXRTdGF0ZSgpLmxvZ2dlZFVzZXJTdGF0ZTtcbiAgICAgICAgICAgIGlmIChtZW1iZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCBlcnJvcl9tZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ0VSUk9SJyxcbiAgICAgICAgICAgICAgICAgICAgaHRtbDogVC50cmFuc2xhdGUoXCJlcnJvcnMudXNlcl9ub3Rfc2V0XCIpLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChzaG93TWVzc2FnZShlcnJvcl9tZXNzYWdlLCBpbml0TG9nT3V0KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIHVzZXIgZ3JvdXBzICggaWYgZGVmaW5lZCApXG4gICAgICAgICAgICBpZiAoQWxsb3dlZFVzZXJHcm91cHMubGVuZ3RoID4gMCkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGFsbG93ZWRHcm91cHMgPSBtZW1iZXIuZ3JvdXBzLmZpbHRlcigoZ3JvdXAsIGlkeCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxsb3dlZFVzZXJHcm91cHMuaW5jbHVkZXMoZ3JvdXAuY29kZSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZEdyb3Vwcy5sZW5ndGggPT09IDApIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3JfbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnRVJST1InLFxuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbDogVC50cmFuc2xhdGUoXCJlcnJvcnMudXNlcl9ub3RfYXV0aHpcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goc2hvd01lc3NhZ2UoZXJyb3JfbWVzc2FnZSwgaW5pdExvZ091dCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZihoaXN0b3J5ICE9IG51bGwgJiYgYmFja1VybCAhPSBudWxsKVxuICAgICAgICAgICAgICAgIGhpc3RvcnkucHVzaChiYWNrVXJsKTtcbiAgICAgICAgfVxuICAgICk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlVXNlckluZm8gPSAodXBkYXRlZE1lbWJlcikgPT4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgIGxldCB7bG9nZ2VkVXNlclN0YXRlfSA9IGdldFN0YXRlKCk7XG4gICAgbGV0IHttZW1iZXJ9ID0gbG9nZ2VkVXNlclN0YXRlO1xuICAgIGlmKG1lbWJlciA9PSBudWxsKXtcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJNZW1iZXIgaXMgbm90IHNldC5cIik7XG4gICAgfVxuICAgIGlmKHVwZGF0ZWRNZW1iZXIuaWQgIT0gbWVtYmVyLmlkKXtcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJNZW1iZXIgaXMgbm90IHRoZSBzYW1lLlwiKTtcbiAgICB9XG4gICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBVUERBVEVfVVNFUl9JTkZPLFxuICAgICAgICBwYXlsb2FkOiB7Li4udXBkYXRlZE1lbWJlcn1cbiAgICB9KTtcblxufVxuXG5leHBvcnQgY29uc3QgdXBkYXRlU2Vzc2lvblN0YXRlU3RhdHVzID0gKG5ld1N0YXR1cykgPT4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogVVBEQVRFX1NFU1NJT05fU1RBVEVfU1RBVFVTLFxuICAgICAgICBwYXlsb2FkOiB7c2Vzc2lvblN0YXRlU3RhdHVzOiBuZXdTdGF0dXN9XG4gICAgfSk7XG59IiwiZXhwb3J0IGNvbnN0IEFVVEhfRVJST1JfTUlTU0lOR19BVVRIX0lORk8gPSAnQVVUSF9FUlJPUl9NSVNTSU5HX0FVVEhfSU5GTyc7XG5leHBvcnQgY29uc3QgQVVUSF9FUlJPUl9NSVNTSU5HX1JFRlJFU0hfVE9LRU4gPSAnQVVUSF9FUlJPUl9NSVNTSU5HX1JFRlJFU0hfVE9LRU4nO1xuZXhwb3J0IGNvbnN0IEFVVEhfRVJST1JfQUNDRVNTX1RPS0VOX0VYUElSRUQgPSAnQVVUSF9FUlJPUl9BQ0NFU1NfVE9LRU5fRVhQSVJFRCc7XG5leHBvcnQgY29uc3QgQVVUSF9FUlJPUl9MT0NLX0FDUVVJUkVfRVJST1IgPSAnQVVUSF9FUlJPUl9MT0NLX0FDUVVJUkVfRVJST1InXG5leHBvcnQgY29uc3QgQVVUSF9FUlJPUl9SRUZSRVNIX1RPS0VOX1JFUVVFU1RfRVJST1IgPSAnQVVUSF9FUlJPUl9SRUZSRVNIX1RPS0VOX1JFUVVFU1RfRVJST1InO1xuZXhwb3J0IGNvbnN0IEFVVEhfRVJST1JfSURfVE9LRU5fSU5WQUxJRCA9ICdBVVRIX0VSUk9SX0lEX1RPS0VOX0lOVkFMSUQnO1xuZXhwb3J0IGNvbnN0IEFVVEhfRVJST1JfTUlTU0lOR19PVFBfUEFSQU0gPSAnQVVUSF9FUlJPUl9NSVNTSU5HX09UUF9QQVJBTSc7XG4iLCJpbXBvcnQge1xuICAgIGJhc2U2NFVSTEVuY29kZSxcbiAgICBnZXRBdXRoQ2FsbGJhY2ssXG4gICAgZ2V0Q3VycmVudExvY2F0aW9uLFxuICAgIGdldEN1cnJlbnRQYXRoTmFtZSxcbiAgICBnZXRGcm9tTG9jYWxTdG9yYWdlLFxuICAgIHJlbW92ZUZyb21Mb2NhbFN0b3JhZ2UsXG4gICAgZ2V0T3JpZ2luLFxuICAgIHB1dE9uTG9jYWxTdG9yYWdlLFxuICAgIHJldHJ5UHJvbWlzZSxcbiAgICBzZXRTZXNzaW9uQ2xlYXJpbmdTdGF0ZSxcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL21ldGhvZHNcIjtcbmltcG9ydCByZXF1ZXN0IGZyb20gJ3N1cGVyYWdlbnQvbGliL2NsaWVudCc7XG5pbXBvcnQgTG9jayBmcm9tICdicm93c2VyLXRhYnMtbG9jayc7XG5cbmxldCBodHRwID0gcmVxdWVzdDtcblxuLyoqXG4gKiBAaWdub3JlXG4gKi9cbmNvbnN0IGxvY2sgPSBuZXcgTG9jaygpO1xuXG5jb25zdCBHRVRfVE9LRU5fU0lMRU5UTFlfTE9DS19LRVkgPSAnb3BlbnN0YWNrdWljb3JlLmxvY2suZ2V0VG9rZW5TaWxlbnRseSc7XG5jb25zdCBOT05DRV9MRU4gPSAxNjtcbmV4cG9ydCBjb25zdCBBQ0NFU1NfVE9LRU5fU0tFV19USU1FID0gMjA7XG5leHBvcnQgY29uc3QgUkVTUE9OU0VfVFlQRV9JTVBMSUNJVCA9IFwidG9rZW4gaWRfdG9rZW5cIjtcbmV4cG9ydCBjb25zdCBSRVNQT05TRV9UWVBFX0NPREUgPSAnY29kZSc7XG5jb25zdCBBVVRIX0lORk8gPSAnYXV0aEluZm8nO1xuY29uc3QgTk9OQ0UgPSAnbm9uY2UnO1xuY29uc3QgUEtDRSA9ICdwa2NlJztcblxuaW1wb3J0IFVSSSBmcm9tIFwidXJpanNcIjtcbmltcG9ydCBJZFRva2VuVmVyaWZpZXIgZnJvbSBcImlkdG9rZW4tdmVyaWZpZXJcIjtcbmltcG9ydCB7U0VUX0xPR0dFRF9VU0VSfSBmcm9tIFwiLi9hY3Rpb25zXCI7XG5pbXBvcnQge2dldFJhbmRvbUJ5dGVzLCBnZXRTSEEyNTZ9IGZyb20gXCIuLi8uLi91dGlscy9jcnlwdG9cIjtcblxuaW1wb3J0IHtcbiAgICBBVVRIX0VSUk9SX0FDQ0VTU19UT0tFTl9FWFBJUkVELFxuICAgIEFVVEhfRVJST1JfTUlTU0lOR19BVVRIX0lORk8sXG4gICAgQVVUSF9FUlJPUl9NSVNTSU5HX1JFRlJFU0hfVE9LRU4sXG4gICAgQVVUSF9FUlJPUl9MT0NLX0FDUVVJUkVfRVJST1IsXG4gICAgQVVUSF9FUlJPUl9SRUZSRVNIX1RPS0VOX1JFUVVFU1RfRVJST1IsIEFVVEhfRVJST1JfSURfVE9LRU5fSU5WQUxJRCwgQVVUSF9FUlJPUl9NSVNTSU5HX09UUF9QQVJBTSxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBiYWNrVXJsXG4gKiBAcGFyYW0gcHJvbXB0XG4gKiBAcGFyYW0gdG9rZW5JZEhpbnRcbiAqIEBwYXJhbSBwcm92aWRlclxuICogQHBhcmFtIGxvZ2luSGludFxuICogQHBhcmFtIG90cExvZ2luSGludFxuICogQHJldHVybnMgeyp9XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRBdXRoVXJsID0gKFxuICAgIGJhY2tVcmwgPSBudWxsLFxuICAgIHByb21wdCA9IG51bGwsXG4gICAgdG9rZW5JZEhpbnQgPSBudWxsLFxuICAgIHByb3ZpZGVyID0gbnVsbCxcbiAgICBsb2dpbkhpbnQgPSBudWxsLFxuICAgIG90cExvZ2luSGludCA9IG51bGwpID0+IHtcblxuICAgIGxldCBvYXV0aDJDbGllbnRJZCA9IGdldE9BdXRoMkNsaWVudElkKCk7XG4gICAgbGV0IHJlZGlyZWN0VXJpID0gZ2V0QXV0aENhbGxiYWNrKCk7XG4gICAgbGV0IGJhc2VVcmwgPSBnZXRPQXV0aDJJRFBCYXNlVXJsKCk7XG4gICAgbGV0IHNjb3BlcyA9IGdldE9BdXRoMlNjb3BlcygpO1xuICAgIGxldCBmbG93ID0gZ2V0T0F1dGgyRmxvdygpO1xuXG4gICAgaWYgKGJhY2tVcmwgIT0gbnVsbClcbiAgICAgICAgcmVkaXJlY3RVcmkgKz0gYD9CYWNrVXJsPSR7ZW5jb2RlVVJJKGJhY2tVcmwpfWA7XG5cbiAgICBsZXQgbm9uY2UgPSBjcmVhdGVOb25jZShOT05DRV9MRU4pO1xuXG4gICAgLy8gc3RvcmUgbm9uY2UgdG8gY2hlY2sgaXQgbGF0ZXJcbiAgICBwdXRPbkxvY2FsU3RvcmFnZShOT05DRSwgbm9uY2UpO1xuICAgIGxldCB1cmwgPSBVUkkoYCR7YmFzZVVybH0vb2F1dGgyL2F1dGhgKTtcblxuICAgIGxldCBxdWVyeSA9IHtcbiAgICAgICAgXCJyZXNwb25zZV90eXBlXCI6IGVuY29kZVVSSShmbG93KSxcbiAgICAgICAgXCJzY29wZVwiOiBlbmNvZGVVUkkoc2NvcGVzKSxcbiAgICAgICAgXCJub25jZVwiOiBub25jZSxcbiAgICAgICAgXCJyZXNwb25zZV9tb2RlXCI6ICdmcmFnbWVudCcsXG4gICAgICAgIFwiY2xpZW50X2lkXCI6IGVuY29kZVVSSShvYXV0aDJDbGllbnRJZCksXG4gICAgICAgIFwicmVkaXJlY3RfdXJpXCI6IGVuY29kZVVSSShyZWRpcmVjdFVyaSlcbiAgICB9O1xuXG4gICAgaWYgKGZsb3cgPT09IFJFU1BPTlNFX1RZUEVfQ09ERSkge1xuICAgICAgICBjb25zdCBwa2NlID0gY3JlYXRlUEtDRUNvZGVzKClcbiAgICAgICAgcHV0T25Mb2NhbFN0b3JhZ2UoUEtDRSwgSlNPTi5zdHJpbmdpZnkocGtjZSkpO1xuICAgICAgICBxdWVyeVsnY29kZV9jaGFsbGVuZ2UnXSA9IHBrY2UuY29kZUNoYWxsZW5nZTtcbiAgICAgICAgcXVlcnlbJ2NvZGVfY2hhbGxlbmdlX21ldGhvZCddID0gJ1MyNTYnO1xuICAgICAgICBxdWVyeVsnYXBwcm92YWxfcHJvbXB0J10gPSAnZm9yY2UnO1xuICAgIH1cblxuICAgIGlmIChwcm9tcHQpIHtcbiAgICAgICAgcXVlcnlbJ3Byb21wdCddID0gcHJvbXB0O1xuICAgIH1cblxuICAgIGlmIChzY29wZXMgJiYgc2NvcGVzLmluY2x1ZGVzKCdvZmZsaW5lX2FjY2VzcycpKSB7XG4gICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBmb3JjZSBwcm9tcHQ9Y29uc2VudCBiYyB3ZSBhcmUgcmVxdWVzdGluZyBhbiBvZmZsaW5lIGFjY2Vzc1xuICAgICAgICAvLyBhbmQgd2UgbmVlZCB0byBsZXQgdGhlIHVzZXIga25vd1xuICAgICAgICBxdWVyeVsncHJvbXB0J10gPSAnY29uc2VudCc7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuSWRIaW50KSB7XG4gICAgICAgIHF1ZXJ5WydpZF90b2tlbl9oaW50J10gPSB0b2tlbklkSGludDtcbiAgICB9XG5cbiAgICBpZiAocHJvdmlkZXIpIHtcbiAgICAgICAgcXVlcnlbJ3Byb3ZpZGVyJ10gPSBwcm92aWRlcjtcbiAgICB9XG5cbiAgICBpZiAob3RwTG9naW5IaW50KSB7XG4gICAgICAgIHF1ZXJ5WydvdHBfbG9naW5faGludCddID0gb3RwTG9naW5IaW50O1xuICAgIH1cblxuICAgIGlmIChsb2dpbkhpbnQpIHtcbiAgICAgICAgcXVlcnlbJ2xvZ2luX2hpbnQnXSA9IGVuY29kZVVSSShsb2dpbkhpbnQpO1xuICAgIH1cblxuICAgIHVybCA9IHVybC5xdWVyeShxdWVyeSk7XG4gICAgLy9jb25zb2xlLmxvZyhgZ2V0QXV0aFVybCAke3VybC50b1N0cmluZygpfWApO1xuICAgIHJldHVybiB1cmw7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2dvdXRVcmwgPSAoaWRUb2tlbikgPT4ge1xuICAgIGxldCBiYXNlVXJsID0gZ2V0T0F1dGgySURQQmFzZVVybCgpO1xuICAgIGxldCBvYXV0aDJDbGllbnRJZCA9IGdldE9BdXRoMkNsaWVudElkKCk7XG4gICAgbGV0IHVybCA9IFVSSShgJHtiYXNlVXJsfS9vYXV0aDIvZW5kLXNlc3Npb25gKTtcbiAgICBsZXQgc3RhdGUgPSBjcmVhdGVOb25jZShOT05DRV9MRU4pO1xuICAgIGxldCBwb3N0TG9nT3V0VXJpID0gZ2V0T3JpZ2luKCkgKyAnL2F1dGgvbG9nb3V0JztcbiAgICAvLyBzdG9yZSBub25jZSB0byBjaGVjayBpdCBsYXRlclxuICAgIHB1dE9uTG9jYWxTdG9yYWdlKCdwb3N0X2xvZ291dF9zdGF0ZScsIHN0YXRlKTtcbiAgICAvKipcbiAgICAgKiBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgc2hvdWxkIGJlIGxpc3RlZCBvbiBvYXV0aDIgY2xpZW50IHNldHRpbmdzXG4gICAgICogb24gSURQXG4gICAgICogXCJTZWN1cml0eSBTZXR0aW5nc1wiIFRhYiAtPiBMb2dvdXQgT3B0aW9ucyAtPiBQb3N0IExvZ291dCBVcmlzXG4gICAgICovXG4gICAgcmV0dXJuIHVybC5xdWVyeSh7XG4gICAgICAgIFwiaWRfdG9rZW5faGludFwiOiBpZFRva2VuLFxuICAgICAgICBcInBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaVwiOiBlbmNvZGVVUkkocG9zdExvZ091dFVyaSksXG4gICAgICAgIFwiY2xpZW50X2lkXCI6IGVuY29kZVVSSShvYXV0aDJDbGllbnRJZCksXG4gICAgICAgIFwic3RhdGVcIjogc3RhdGUsXG4gICAgfSk7XG59XG5cbmNvbnN0IGNyZWF0ZU5vbmNlID0gKGxlbikgPT4ge1xuICAgIGxldCBwb3NzaWJsZSA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlcIjtcbiAgICBsZXQgbm9uY2UgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIG5vbmNlICs9IHBvc3NpYmxlLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBwb3NzaWJsZS5sZW5ndGgpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vbmNlO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gYmFja1VybFxuICogQHBhcmFtIHByb3ZpZGVyXG4gKiBAcGFyYW0gcHJvbXB0XG4gKiBAcGFyYW0gbG9naW5IaW50XG4gKiBAcGFyYW0gb3RwTG9naW5IaW50XG4gKi9cbmV4cG9ydCBjb25zdCBkb0xvZ2luID0gKFxuICAgIGJhY2tVcmwgPSBudWxsLFxuICAgIHByb3ZpZGVyID0gbnVsbCxcbiAgICBwcm9tcHQgPSBudWxsLFxuICAgIGxvZ2luSGludCA9IG51bGwsXG4gICAgb3RwTG9naW5IaW50ID0gbnVsbFxuKSA9PiB7XG4gICAgbGV0IHVybCA9IGdldEF1dGhVcmwoYmFja1VybCwgcHJvbXB0LCBudWxsLCBwcm92aWRlciwgbG9naW5IaW50LCBvdHBMb2dpbkhpbnQpO1xuICAgIGxldCBsb2NhdGlvbiA9IGdldEN1cnJlbnRMb2NhdGlvbigpXG4gICAgbG9jYXRpb24ucmVwbGFjZSh1cmwudG9TdHJpbmcoKSk7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBiYWNrVXJsXG4gKiBAcGFyYW0gbG9naW5IaW50XG4gKiBAcGFyYW0gb3RwTG9naW5IaW50XG4gKi9cbmV4cG9ydCBjb25zdCBkb0xvZ2luQmFzaWNMb2dpbiA9IChiYWNrVXJsID0gbnVsbCwgbG9naW5IaW50ID0gbnVsbCwgb3RwTG9naW5IaW50ID0gbnVsbCkgPT4ge1xuICAgIGRvTG9naW4oYmFja1VybCwgbnVsbCwgbnVsbCwgbG9naW5IaW50LCBvdHBMb2dpbkhpbnQpO1xufVxuXG5jb25zdCBjcmVhdGVQS0NFQ29kZXMgPSAoKSA9PiB7XG4gICAgY29uc3QgY29kZVZlcmlmaWVyID0gYmFzZTY0VVJMRW5jb2RlKGdldFJhbmRvbUJ5dGVzKDY0KSlcbiAgICBjb25zdCBjb2RlQ2hhbGxlbmdlID0gZ2V0U0hBMjU2KGNvZGVWZXJpZmllciwgJ0Jhc2U2NHVybCcpXG4gICAgY29uc3QgY3JlYXRlZEF0ID0gbmV3IERhdGUoKVxuICAgIGNvbnN0IGNvZGVQYWlyID0ge1xuICAgICAgICBjb2RlVmVyaWZpZXIsXG4gICAgICAgIGNvZGVDaGFsbGVuZ2UsXG4gICAgICAgIGNyZWF0ZWRBdFxuICAgIH1cbiAgICByZXR1cm4gY29kZVBhaXJcbn1cblxuZXhwb3J0IGNvbnN0IGVtaXRBY2Nlc3NUb2tlbiA9IGFzeW5jIChjb2RlLCBiYWNrVXJsID0gbnVsbCkgPT4ge1xuXG4gICAgbGV0IGJhc2VVcmwgPSBnZXRPQXV0aDJJRFBCYXNlVXJsKCk7XG4gICAgbGV0IG9hdXRoMkNsaWVudElkID0gZ2V0T0F1dGgyQ2xpZW50SWQoKTtcbiAgICBsZXQgcmVkaXJlY3RVcmkgPSBnZXRBdXRoQ2FsbGJhY2soKTtcbiAgICBsZXQgcGtjZSA9IEpTT04ucGFyc2UoZ2V0RnJvbUxvY2FsU3RvcmFnZShQS0NFLCB0cnVlKSk7XG5cbiAgICBpZiAoYmFja1VybCAhPSBudWxsKVxuICAgICAgICByZWRpcmVjdFVyaSArPSBgP0JhY2tVcmw9JHtlbmNvZGVVUkkoYmFja1VybCl9YDtcblxuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgICdjb2RlJzogY29kZSxcbiAgICAgICAgJ2dyYW50X3R5cGUnOiAnYXV0aG9yaXphdGlvbl9jb2RlJyxcbiAgICAgICAgJ2NvZGVfdmVyaWZpZXInOiBwa2NlLmNvZGVWZXJpZmllcixcbiAgICAgICAgXCJjbGllbnRfaWRcIjogZW5jb2RlVVJJKG9hdXRoMkNsaWVudElkKSxcbiAgICAgICAgXCJyZWRpcmVjdF91cmlcIjogZW5jb2RlVVJJKHJlZGlyZWN0VXJpKVxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgICAvL2NvbnN0IHJlc3BvbnNlID0gYXdhaXQgaHR0cC5wb3N0KGAke2Jhc2VVcmx9L29hdXRoMi90b2tlbmAsIHBheWxvYWQpO1xuICAgICAgICAvL2NvbnN0IHtib2R5OiB7YWNjZXNzX3Rva2VuLCByZWZyZXNoX3Rva2VuLCBpZF90b2tlbiwgZXhwaXJlc19pbn19ID0gcmVzcG9uc2U7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7YmFzZVVybH0vb2F1dGgyL3Rva2VuYCwge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnUmVxdWVzdCBmYWlsZWQ6JywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBsZXQge2FjY2Vzc190b2tlbiwgcmVmcmVzaF90b2tlbiwgaWRfdG9rZW4sIGV4cGlyZXNfaW4sIGVycm9yLCBlcnJvcl9kZXNjcmlwdGlvbn0gPSBqc29uO1xuICAgICAgICByZXR1cm4ge2FjY2Vzc190b2tlbiwgcmVmcmVzaF90b2tlbiwgaWRfdG9rZW4sIGV4cGlyZXNfaW4sIGVycm9yLCBlcnJvcl9kZXNjcmlwdGlvbn1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgY2xlYXJBY2Nlc3NUb2tlbiA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoXG4gICAgICAgIGF3YWl0IHJldHJ5UHJvbWlzZShcbiAgICAgICAgICAgICgpID0+IGxvY2suYWNxdWlyZUxvY2soR0VUX1RPS0VOX1NJTEVOVExZX0xPQ0tfS0VZLCA1MDAwKSxcbiAgICAgICAgICAgIDEwXG4gICAgICAgIClcbiAgICApIHtcbiAgICAgICAgdHJ5IHtcblxuICAgICAgICAgICAgbGV0IGF1dGhJbmZvID0gZ2V0QXV0aEluZm8oKTtcblxuICAgICAgICAgICAgaWYgKCFhdXRoSW5mbykge1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKEFVVEhfRVJST1JfTUlTU0lOR19BVVRIX0lORk8pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQge2FjY2Vzc1Rva2VuLCBleHBpcmVzSW4sIGFjY2Vzc1Rva2VuVXBkYXRlZEF0LCByZWZyZXNoVG9rZW59ID0gYXV0aEluZm87XG5cbiAgICAgICAgICAgIHN0b3JlQXV0aEluZm8obnVsbCwgMCwgcmVmcmVzaFRva2VuKVxuXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBhd2FpdCBsb2NrLnJlbGVhc2VMb2NrKEdFVF9UT0tFTl9TSUxFTlRMWV9MT0NLX0tFWSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRBY2Nlc3NUb2tlbiA9IGFzeW5jICgpID0+IHtcblxuICAgIGlmIChcbiAgICAgICAgYXdhaXQgcmV0cnlQcm9taXNlKFxuICAgICAgICAgICAgKCkgPT4gbG9jay5hY3F1aXJlTG9jayhHRVRfVE9LRU5fU0lMRU5UTFlfTE9DS19LRVksIDUwMDApLFxuICAgICAgICAgICAgMTBcbiAgICAgICAgKVxuICAgICkge1xuICAgICAgICB0cnkge1xuXG4gICAgICAgICAgICBsZXQgYXV0aEluZm8gPSBnZXRBdXRoSW5mbygpO1xuXG4gICAgICAgICAgICBpZiAoIWF1dGhJbmZvKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoQVVUSF9FUlJPUl9NSVNTSU5HX0FVVEhfSU5GTyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB7YWNjZXNzVG9rZW4sIGV4cGlyZXNJbiwgYWNjZXNzVG9rZW5VcGRhdGVkQXQsIHJlZnJlc2hUb2tlbn0gPSBhdXRoSW5mbztcbiAgICAgICAgICAgIGxldCBmbG93ID0gZ2V0T0F1dGgyRmxvdygpO1xuICAgICAgICAgICAgLy8gY2hlY2sgbGlmZSB0aW1lXG4gICAgICAgICAgICBsZXQgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICAgICAgICBsZXQgdGltZUVsYXBzZWRTZWNzID0gKG5vdyAtIGFjY2Vzc1Rva2VuVXBkYXRlZEF0KTtcbiAgICAgICAgICAgIGV4cGlyZXNJbiA9IChleHBpcmVzSW4gLSBBQ0NFU1NfVE9LRU5fU0tFV19USU1FKTtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coYGdldEFjY2Vzc1Rva2VuIG5vdyAke25vd30gYWNjZXNzVG9rZW5VcGRhdGVkQXQgJHthY2Nlc3NUb2tlblVwZGF0ZWRBdH0gdGltZUVsYXBzZWRTZWNzICR7dGltZUVsYXBzZWRTZWNzfSBleHBpcmVzSW4gJHtleHBpcmVzSW59LmApO1xuXG4gICAgICAgICAgICBpZiAodGltZUVsYXBzZWRTZWNzID4gZXhwaXJlc0luIHx8IGFjY2Vzc1Rva2VuID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgZ2V0QWNjZXNzVG9rZW4gYWNjZXNzIHRva2VuIGV4cGlyZWRgKVxuICAgICAgICAgICAgICAgIGlmIChmbG93ID09PSBSRVNQT05TRV9UWVBFX0NPREUgJiYgdXNlT0F1dGgyUmVmcmVzaFRva2VuKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnZ2V0QWNjZXNzVG9rZW4gZ2V0dGluZyBuZXcgYWNjZXNzIHRva2VuLCBhY2Nlc3MgdG9rZW4gZ290IHZvaWQnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyQXV0aEluZm8oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKEFVVEhfRVJST1JfTUlTU0lOR19SRUZSRVNIX1RPS0VOKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCByZWZyZXNoQWNjZXNzVG9rZW4ocmVmcmVzaFRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHthY2Nlc3NfdG9rZW4sIGV4cGlyZXNfaW4sIHJlZnJlc2hfdG9rZW59ID0gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coYGdldEFjY2Vzc1Rva2VuIGFjY2Vzc190b2tlbiAke2FjY2Vzc190b2tlbn0gZXhwaXJlc19pbiAke2V4cGlyZXNfaW59IHJlZnJlc2hfdG9rZW4gJHtyZWZyZXNoX3Rva2VufWApO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlZnJlc2hfdG9rZW4gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoX3Rva2VuID0gbnVsbDsgLy8gbm90IHVzaW5nIHJvdGF0ZSBwb2xpY3lcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdG9yZUF1dGhJbmZvKGFjY2Vzc190b2tlbiwgZXhwaXJlc19pbiwgcmVmcmVzaF90b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coYGdldEFjY2Vzc1Rva2VuIGFjY2Vzc190b2tlbiAke2FjY2Vzc190b2tlbn0gW05FV11gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc190b2tlbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2xlYXJBdXRoSW5mbygpO1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKEFVVEhfRVJST1JfQUNDRVNTX1RPS0VOX0VYUElSRUQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhgZ2V0QWNjZXNzVG9rZW4gYWNjZXNzX3Rva2VuICR7YWNjZXNzVG9rZW59IFtDQUNIRURdYCk7XG4gICAgICAgICAgICByZXR1cm4gYWNjZXNzVG9rZW47XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBhd2FpdCBsb2NrLnJlbGVhc2VMb2NrKEdFVF9UT0tFTl9TSUxFTlRMWV9MT0NLX0tFWSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgRXJyb3IoQVVUSF9FUlJPUl9MT0NLX0FDUVVJUkVfRVJST1IpO1xufVxuXG5leHBvcnQgY29uc3QgcmVmcmVzaEFjY2Vzc1Rva2VuID0gYXN5bmMgKHJlZnJlc2hfdG9rZW4pID0+IHtcblxuICAgIGxldCBiYXNlVXJsID0gZ2V0T0F1dGgySURQQmFzZVVybCgpO1xuICAgIGxldCBvYXV0aDJDbGllbnRJZCA9IGdldE9BdXRoMkNsaWVudElkKCk7XG5cbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAnZ3JhbnRfdHlwZSc6ICdyZWZyZXNoX3Rva2VuJyxcbiAgICAgICAgXCJjbGllbnRfaWRcIjogZW5jb2RlVVJJKG9hdXRoMkNsaWVudElkKSxcbiAgICAgICAgXCJyZWZyZXNoX3Rva2VuXCI6IHJlZnJlc2hfdG9rZW5cbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtiYXNlVXJsfS9vYXV0aDIvdG9rZW5gLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKVxuICAgICAgICB9KS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRMb2NhdGlvbiA9IGdldEN1cnJlbnRQYXRoTmFtZSgpO1xuICAgICAgICAgICAgICAgIHNldFNlc3Npb25DbGVhcmluZ1N0YXRlKHRydWUpO1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGAke0FVVEhfRVJST1JfUkVGUkVTSF9UT0tFTl9SRVFVRVNUX0VSUk9SfTogJHtyZXNwb25zZS5zdGF0dXN9IC0gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYCR7QVVUSF9FUlJPUl9SRUZSRVNIX1RPS0VOX1JFUVVFU1RfRVJST1J9OiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGxldCB7YWNjZXNzX3Rva2VuLCByZWZyZXNoX3Rva2VuLCBleHBpcmVzX2lufSA9IGpzb247XG4gICAgICAgIHJldHVybiB7YWNjZXNzX3Rva2VuLCByZWZyZXNoX3Rva2VuLCBleHBpcmVzX2lufVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3Qgc3RvcmVBdXRoSW5mbyA9IChhY2Nlc3NUb2tlbiwgZXhwaXJlc0luLCByZWZyZXNoVG9rZW4gPSBudWxsLCBpZFRva2VuID0gbnVsbCkgPT4ge1xuXG4gICAgbGV0IGZvcm1lckF1dGhJbmZvID0gZ2V0QXV0aEluZm8oKTtcblxuICAgIGxldCBhdXRoSW5mbyA9IHtcbiAgICAgICAgYWNjZXNzVG9rZW46IGFjY2Vzc1Rva2VuLFxuICAgICAgICBleHBpcmVzSW46IGV4cGlyZXNJbixcbiAgICAgICAgYWNjZXNzVG9rZW5VcGRhdGVkQXQ6IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApLFxuICAgIH07XG5cbiAgICBpZiAocmVmcmVzaFRva2VuID09PSBudWxsICYmIGZvcm1lckF1dGhJbmZvKSB7XG4gICAgICAgIHJlZnJlc2hUb2tlbiA9IGZvcm1lckF1dGhJbmZvLnJlZnJlc2hUb2tlbjtcbiAgICB9XG5cbiAgICBpZiAoaWRUb2tlbiA9PT0gbnVsbCAmJiBmb3JtZXJBdXRoSW5mbykge1xuICAgICAgICBpZFRva2VuID0gZm9ybWVyQXV0aEluZm8uaWRUb2tlbjtcbiAgICB9XG5cbiAgICBpZiAocmVmcmVzaFRva2VuKSB7XG4gICAgICAgIGF1dGhJbmZvWydyZWZyZXNoVG9rZW4nXSA9IHJlZnJlc2hUb2tlbjtcbiAgICB9XG5cbiAgICBpZiAoaWRUb2tlbikge1xuICAgICAgICBhdXRoSW5mb1snaWRUb2tlbiddID0gaWRUb2tlbjtcbiAgICB9XG5cbiAgICBwdXRPbkxvY2FsU3RvcmFnZShBVVRIX0lORk8sIEpTT04uc3RyaW5naWZ5KGF1dGhJbmZvKSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRBdXRoSW5mbyA9ICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgICBsZXQgcmVzID0gZ2V0RnJvbUxvY2FsU3RvcmFnZShBVVRIX0lORk8sIGZhbHNlKVxuICAgICAgICBpZiAoIXJlcykgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlcyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNsZWFyQXV0aEluZm8gPSAoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJlbW92ZUZyb21Mb2NhbFN0b3JhZ2UoQVVUSF9JTkZPKTtcbiAgICAgICAgcmVtb3ZlRnJvbUxvY2FsU3RvcmFnZShOT05DRSk7XG4gICAgICAgIHJlbW92ZUZyb21Mb2NhbFN0b3JhZ2UoUEtDRSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SWRUb2tlbiA9ICgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgYXV0aEluZm8gPSBnZXRBdXRoSW5mbygpO1xuICAgICAgICBpZiAoYXV0aEluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiBhdXRoSW5mby5pZFRva2VuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRPQXV0aDJDbGllbnRJZCA9ICgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5PQVVUSDJfQ0xJRU5UX0lEO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRPQXV0aDJGbG93ID0gKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gd2luZG93Lk9BVVRIMl9GTE9XIHx8IFwidG9rZW4gaWRfdG9rZW5cIjtcbiAgICB9XG4gICAgcmV0dXJuIFwidG9rZW4gaWRfdG9rZW5cIjtcbn1cblxuZXhwb3J0IGNvbnN0IHVzZU9BdXRoMlJlZnJlc2hUb2tlbiA9ICgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCb29sZWFuKHdpbmRvdy5PQVVUSDJfVVNFX1JFRlJFU0hfVE9LRU4gfHwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0T0F1dGgySURQQmFzZVVybCA9ICgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5JRFBfQkFTRV9VUkw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE9BdXRoMlNjb3BlcyA9ICgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5TQ09QRVM7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGluaXRMb2dPdXQgPSAoKSA9PiB7XG4gICAgbGV0IGxvY2F0aW9uID0gZ2V0Q3VycmVudExvY2F0aW9uKCk7XG4gICAgbG9jYXRpb24ucmVwbGFjZShnZXRMb2dvdXRVcmwoZ2V0SWRUb2tlbigpKS50b1N0cmluZygpKTtcbn1cblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlSWRUb2tlbiA9IChpZFRva2VuLCBpc3N1ZXIsIGF1ZGllbmNlKSA9PiB7XG5cbiAgICBsZXQgdmVyaWZpZXIgPSBuZXcgSWRUb2tlblZlcmlmaWVyKHtcbiAgICAgICAgaXNzdWVyOiBpc3N1ZXIsXG4gICAgICAgIGF1ZGllbmNlOiBhdWRpZW5jZVxuICAgIH0pO1xuXG4gICAgbGV0IHN0b3JlZE5vbmNlID0gZ2V0RnJvbUxvY2FsU3RvcmFnZShOT05DRSwgdHJ1ZSk7XG4gICAgbGV0IGp3dCA9IHZlcmlmaWVyLmRlY29kZShpZFRva2VuKTtcbiAgICBsZXQgYWxnID0gand0LmhlYWRlci5hbGc7XG4gICAgbGV0IGtpZCA9IGp3dC5oZWFkZXIua2lkO1xuICAgIGxldCBhdWQgPSBqd3QucGF5bG9hZC5hdWQ7XG4gICAgbGV0IGlzcyA9IGp3dC5wYXlsb2FkLmlzcztcbiAgICBsZXQgZXhwID0gand0LnBheWxvYWQuZXhwO1xuICAgIGxldCBuYmYgPSBqd3QucGF5bG9hZC5uYmY7XG4gICAgbGV0IHRub25jZSA9IGp3dC5wYXlsb2FkLm5vbmNlIHx8IG51bGw7XG5cbiAgICByZXR1cm4gdG5vbmNlID09IHN0b3JlZE5vbmNlICYmIGF1ZCA9PSBhdWRpZW5jZSAmJiBpc3MgPT0gaXNzdWVyO1xufVxuXG5leHBvcnQgY29uc3QgcGFzc3dvcmRsZXNzU3RhcnQgPSAocGFyYW1zKSA9PiB7XG5cbiAgICBsZXQgb2F1dGgyQ2xpZW50SWQgPSBnZXRPQXV0aDJDbGllbnRJZCgpO1xuICAgIGxldCBzY29wZXMgPSBnZXRPQXV0aDJTY29wZXMoKTtcbiAgICBsZXQgbm9uY2UgPSBjcmVhdGVOb25jZShOT05DRV9MRU4pO1xuICAgIC8vIHN0b3JlIG5vbmNlIHRvIGNoZWNrIGl0IGxhdGVyXG4gICAgcHV0T25Mb2NhbFN0b3JhZ2UoTk9OQ0UsIG5vbmNlKTtcbiAgICBsZXQgYmFzZVVybCA9IGdldE9BdXRoMklEUEJhc2VVcmwoKTtcbiAgICBsZXQgdXJsID0gVVJJKGAke2Jhc2VVcmx9L29hdXRoMi9hdXRoYCk7XG5cbiAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgICAgXCJyZXNwb25zZV90eXBlXCI6IFwib3RwXCIsXG4gICAgICAgIFwic2NvcGVcIjogZW5jb2RlVVJJKHNjb3BlcyksXG4gICAgICAgIFwibm9uY2VcIjogbm9uY2UsXG4gICAgICAgIFwiY2xpZW50X2lkXCI6IGVuY29kZVVSSShvYXV0aDJDbGllbnRJZCksXG4gICAgICAgIFwiY29ubmVjdGlvblwiOiBwYXJhbXMuY29ubmVjdGlvbiB8fCBcImVtYWlsXCIsXG4gICAgICAgIFwic2VuZFwiOiBwYXJhbXMuc2VuZCB8fCBcImNvZGVcIixcbiAgICB9O1xuXG4gICAgaWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgnZW1haWwnKSkge1xuICAgICAgICBwYXlsb2FkW1wiZW1haWxcIl0gPSBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLmVtYWlsKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KCdwaG9uZV9udW1iZXInKSkge1xuICAgICAgICBwYXlsb2FkW1wicGhvbmVfbnVtYmVyXCJdID0gZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5waG9uZV9udW1iZXIpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuaGFzT3duUHJvcGVydHkoJ3JlZGlyZWN0X3VyaScpKSB7XG4gICAgICAgIHBheWxvYWRbXCJyZWRpcmVjdF91cmlcIl0gPSBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLnJlZGlyZWN0X3VyaSk7XG4gICAgfVxuXG4gICAgbGV0IHJlcSA9IGh0dHAucG9zdCh1cmwudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4gcmVxLnNlbmQocGF5bG9hZCkudGhlbigocmVzKSA9PiB7XG4gICAgICAgIGxldCBqc29uID0gcmVzLmJvZHk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe3Jlc3BvbnNlOiBqc29ufSk7XG4gICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICB9KTtcblxufVxuXG5leHBvcnQgY29uc3QgcGFzc3dvcmRsZXNzTG9naW4gPSAocGFyYW1zKSA9PiAoZGlzcGF0Y2gpID0+IHtcblxuICAgIGxldCBvYXV0aDJDbGllbnRJZCA9IGdldE9BdXRoMkNsaWVudElkKCk7XG4gICAgbGV0IHNjb3BlcyA9IGdldE9BdXRoMlNjb3BlcygpO1xuICAgIGxldCBiYXNlVXJsID0gZ2V0T0F1dGgySURQQmFzZVVybCgpO1xuICAgIGxldCB1cmwgPSBVUkkoYCR7YmFzZVVybH0vb2F1dGgyL3Rva2VuYCk7XG5cbiAgICBpZiAoIXBhcmFtcy5oYXNPd25Qcm9wZXJ0eShcIm90cFwiKSkge1xuICAgICAgICB0aHJvdyBFcnJvcihBVVRIX0VSUk9SX01JU1NJTkdfT1RQX1BBUkFNKTtcbiAgICB9XG5cbiAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgICAgXCJncmFudF90eXBlXCI6IFwicGFzc3dvcmRsZXNzXCIsXG4gICAgICAgIFwiY29ubmVjdGlvblwiOiBwYXJhbXMuY29ubmVjdGlvbiB8fCBcImVtYWlsXCIsXG4gICAgICAgIFwic2NvcGVcIjogZW5jb2RlVVJJKHNjb3BlcyksXG4gICAgICAgIFwiY2xpZW50X2lkXCI6IGVuY29kZVVSSShvYXV0aDJDbGllbnRJZCksXG4gICAgICAgIFwib3RwXCI6IHBhcmFtcy5vdHBcbiAgICB9O1xuXG4gICAgaWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgnZW1haWwnKSkge1xuICAgICAgICBwYXlsb2FkW1wiZW1haWxcIl0gPSBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLmVtYWlsKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KCdwaG9uZV9udW1iZXInKSkge1xuICAgICAgICBwYXlsb2FkW1wicGhvbmVfbnVtYmVyXCJdID0gZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5waG9uZV9udW1iZXIpO1xuICAgIH1cblxuICAgIGxldCByZXEgPSBodHRwLnBvc3QodXJsLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIHJlcS5zZW5kKHBheWxvYWQpLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gbm93IHdlIGdvdCB0b2tlblxuICAgICAgICAgICAgbGV0IGpzb24gPSByZXMuYm9keTtcbiAgICAgICAgICAgIGxldCB7YWNjZXNzX3Rva2VuLCBleHBpcmVzX2luLCByZWZyZXNoX3Rva2VuLCBpZF90b2tlbn0gPSBqc29uO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlZnJlc2hfdG9rZW4gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVmcmVzaF90b2tlbiA9IG51bGw7IC8vIG5vdCB1c2luZyByb3RhdGUgcG9saWN5XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWRfdG9rZW4gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgaWRfdG9rZW4gPSBudWxsOyAvLyBub3QgdXNpbmcgcm90YXRlIHBvbGljeVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB2ZXJpZnkgaWQgdG9rZW5cblxuICAgICAgICAgICAgaWYgKGlkX3Rva2VuKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZUlkVG9rZW4oaWRfdG9rZW4sIGJhc2VVcmwsIG9hdXRoMkNsaWVudElkKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihBVVRIX0VSUk9SX0lEX1RPS0VOX0lOVkFMSUQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3RvcmVBdXRoSW5mbyhhY2Nlc3NfdG9rZW4sIGV4cGlyZXNfaW4sIHJlZnJlc2hfdG9rZW4sIGlkX3Rva2VuKTtcblxuICAgICAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBTRVRfTE9HR0VEX1VTRVIsXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtzZXNzaW9uU3RhdGU6IG51bGx9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe3Jlc3BvbnNlOiBqc29ufSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGlzSWRUb2tlbkFsaXZlID0gKG5vd0Vwb2NoID0gbnVsbCkgPT4gKCkgPT4ge1xuXG4gICAgaWYgKCFub3dFcG9jaCkge1xuICAgICAgICBub3dFcG9jaCA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgIH1cblxuICAgIGNvbnN0IGlkVG9rZW4gPSBnZXRJZFRva2VuKCk7XG4gICAgaWYgKCFpZFRva2VuKVxuICAgICAgICB0aHJvdyBFcnJvcignSWQgVG9rZW4gbm90IHNldC4nKTtcblxuICAgIGNvbnN0IGlzc3VlciA9IGdldE9BdXRoMklEUEJhc2VVcmwoKTtcbiAgICBjb25zdCBhdWRpZW5jZSA9IGdldE9BdXRoMkNsaWVudElkKCk7XG5cbiAgICBsZXQgdmVyaWZpZXIgPSBuZXcgSWRUb2tlblZlcmlmaWVyKHtcbiAgICAgICAgaXNzdWVyOiBpc3N1ZXIsXG4gICAgICAgIGF1ZGllbmNlOiBhdWRpZW5jZVxuICAgIH0pO1xuXG4gICAgY29uc3Qgand0ID0gdmVyaWZpZXIuZGVjb2RlKGlkVG9rZW4pO1xuICAgIGNvbnN0IGV4cCA9IGp3dC5wYXlsb2FkLmV4cDtcblxuICAgIC8vIGNoZWNrIGxpZmUgdGltZVxuICAgIHJldHVybiBleHAgLSAobm93RXBvY2ggKyBBQ0NFU1NfVE9LRU5fU0tFV19USU1FKSA+IDA7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAyMDE3IE9wZW5TdGFjayBGb3VuZGF0aW9uXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgZmxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqL1xuXG5pbXBvcnQgcmVxdWVzdCBmcm9tICdzdXBlcmFnZW50L2xpYi9jbGllbnQnO1xuaW1wb3J0IFVSSSBmcm9tIFwidXJpanNcIjtcbmxldCBodHRwID0gcmVxdWVzdDtcbmltcG9ydCBTd2FsIGZyb20gJ3N3ZWV0YWxlcnQyJztcbmltcG9ydCBUIGZyb20gXCJpMThuLXJlYWN0L2Rpc3QvaTE4bi1yZWFjdFwiO1xuaW1wb3J0IHsgaXNDbGVhcmluZ1Nlc3Npb25TdGF0ZSwgc2V0U2Vzc2lvbkNsZWFyaW5nU3RhdGUsIGdldEN1cnJlbnRQYXRoTmFtZSB9IGZyb20gJy4vbWV0aG9kcyc7XG5pbXBvcnQgeyBDTEVBUl9TRVNTSU9OX1NUQVRFIH0gZnJvbSAnLi4vY29tcG9uZW50cy9zZWN1cml0eS9hY3Rpb25zJztcbmltcG9ydCB7IGRvTG9naW4sIGluaXRMb2dPdXQgfSBmcm9tICcuLi9jb21wb25lbnRzL3NlY3VyaXR5L21ldGhvZHMnO1xuXG5leHBvcnQgY29uc3QgR0VORVJJQ19FUlJPUiAgPSBcIllpa2VzLiBTb21ldGhpbmcgc2VlbXMgdG8gYmUgYnJva2VuLiBPdXIgd2ViIHRlYW0gaGFzIGJlZW4gbm90aWZpZWQsIGFuZCB3ZSBhcG9sb2dpemUgZm9yIHRoZSBpbmNvbnZlbmllbmNlLlwiO1xuZXhwb3J0IGNvbnN0IFJFU0VUX0xPQURJTkcgID0gJ1JFU0VUX0xPQURJTkcnO1xuZXhwb3J0IGNvbnN0IFNUQVJUX0xPQURJTkcgID0gJ1NUQVJUX0xPQURJTkcnO1xuZXhwb3J0IGNvbnN0IFNUT1BfTE9BRElORyAgID0gJ1NUT1BfTE9BRElORyc7XG5leHBvcnQgY29uc3QgVkFMSURBVEUgICAgICAgPSAnVkFMSURBVEUnO1xuZXhwb3J0IGNvbnN0IENMRUFSX01FU1NBR0UgID0gJ0NMRUFSX01FU1NBR0UnO1xuZXhwb3J0IGNvbnN0IFNIT1dfTUVTU0FHRSAgID0gJ1NIT1dfTUVTU0FHRSc7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVBY3Rpb24gPSB0eXBlID0+IHBheWxvYWQgPT4gKHtcbiAgICB0eXBlLFxuICAgIHBheWxvYWRcbn0pO1xuXG5leHBvcnQgY29uc3QgcmVzZXRMb2FkaW5nID0gY3JlYXRlQWN0aW9uKFJFU0VUX0xPQURJTkcpO1xuZXhwb3J0IGNvbnN0IHN0YXJ0TG9hZGluZyA9IGNyZWF0ZUFjdGlvbihTVEFSVF9MT0FESU5HKTtcbmV4cG9ydCBjb25zdCBzdG9wTG9hZGluZyAgPSBjcmVhdGVBY3Rpb24oU1RPUF9MT0FESU5HKTtcblxuY29uc3QgeGhycyA9IHt9O1xuY29uc3QgZXRhZ0NhY2hlID0ge307XG5cbmNvbnN0IGNhbmNlbCA9IChrZXkpID0+IHtcbiAgICBpZih4aHJzW2tleV0pIHtcbiAgICAgICAgeGhyc1trZXldLmFib3J0KCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBhYm9ydGVkIHJlcXVlc3QgJHtrZXl9YCk7XG4gICAgICAgIGRlbGV0ZSB4aHJzW2tleV07XG4gICAgfVxufVxuXG5jb25zdCBzY2hlZHVsZSA9IChrZXksIHJlcSkgPT4ge1xuICAgIC8vIGNvbnNvbGUubG9nKGBzY2hlZHVsaW5nICR7a2V5fWApO1xuICAgIHhocnNba2V5XSA9IHJlcTtcbn07XG5cbmNvbnN0IGlzT2JqZWN0RW1wdHkgPSAob2JqKSA9PiB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09PSAwICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0IDtcbn1cblxuZXhwb3J0IGNvbnN0IGF1dGhFcnJvckhhbmRsZXIgPSAoZXJyLCByZXMpID0+IChkaXNwYXRjaCwgc3RhdGUpID0+IHtcbiAgICBsZXQgY29kZSA9IGVyci5zdGF0dXM7XG4gICAgbGV0IG1zZyA9ICcnO1xuXG4gICAgZGlzcGF0Y2goc3RvcExvYWRpbmcoKSk7XG5cbiAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgY2FzZSA0MDM6XG4gICAgICAgICAgICBsZXQgZXJyb3JfbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0VSUk9SJyxcbiAgICAgICAgICAgICAgICBodG1sOiBULnRyYW5zbGF0ZShcImVycm9ycy51c2VyX25vdF9hdXRoelwiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBkaXNwYXRjaChzaG93TWVzc2FnZSggZXJyb3JfbWVzc2FnZSwgaW5pdExvZ091dCApKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQwMTpcbiAgICAgICAgICAgIGxldCBjdXJyZW50TG9jYXRpb24gPSBnZXRDdXJyZW50UGF0aE5hbWUoKTtcbiAgICAgICAgICAgIGxldCBjbGVhcmluZ19zZXNzaW9uX3N0YXRlID0gaXNDbGVhcmluZ1Nlc3Npb25TdGF0ZSgpO1xuXG4gICAgICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogQ0xFQVJfU0VTU0lPTl9TVEFURSxcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiB7fVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmKCFjbGVhcmluZ19zZXNzaW9uX3N0YXRlKSB7XG4gICAgICAgICAgICAgICAgc2V0U2Vzc2lvbkNsZWFyaW5nU3RhdGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2F1dGhFcnJvckhhbmRsZXIgNDAxIC0gcmUgbG9naW4nKTtcbiAgICAgICAgICAgICAgICBkb0xvZ2luKGN1cnJlbnRMb2NhdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0MDQ6XG4gICAgICAgICAgICBtc2cgPSBcIlwiO1xuXG4gICAgICAgICAgICBpZiAoZXJyLnJlc3BvbnNlLmJvZHkgJiYgZXJyLnJlc3BvbnNlLmJvZHkubWVzc2FnZSkgbXNnID0gZXJyLnJlc3BvbnNlLmJvZHkubWVzc2FnZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGVyci5yZXNwb25zZS5lcnJvciAmJiBlcnIucmVzcG9uc2UuZXJyb3IubWVzc2FnZSkgbXNnID0gZXJyLnJlc3BvbnNlLmVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICBlbHNlIG1zZyA9IGVyci5tZXNzYWdlO1xuXG4gICAgICAgICAgICBTd2FsLmZpcmUoXCJOb3QgRm91bmRcIiwgbXNnLCBcIndhcm5pbmdcIik7XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQxMjpcbiAgICAgICAgICAgIGZvciAodmFyIFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlcnIucmVzcG9uc2UuYm9keS5lcnJvcnMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbXNnICs9IGtleSArICc6ICc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbXNnICs9IHZhbHVlICsgJzxicj4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgU3dhbC5maXJlKFwiVmFsaWRhdGlvbiBlcnJvclwiLCBtc2csIFwid2FybmluZ1wiKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBWQUxJREFURSxcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiB7ZXJyb3JzOiBlcnIucmVzcG9uc2UuYm9keS5lcnJvcnN9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgU3dhbC5maXJlKFwiRVJST1JcIiwgVC50cmFuc2xhdGUoXCJlcnJvcnMuc2VydmVyX2Vycm9yXCIpLCBcImVycm9yXCIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldFJlcXVlc3QgPShcbiAgICByZXF1ZXN0QWN0aW9uQ3JlYXRvcixcbiAgICByZWNlaXZlQWN0aW9uQ3JlYXRvcixcbiAgICBlbmRwb2ludCxcbiAgICBlcnJvckhhbmRsZXIgPSBkZWZhdWx0RXJyb3JIYW5kbGVyLFxuICAgIHJlcXVlc3RBY3Rpb25QYXlsb2FkID0ge30sXG4gICAgdXNlRXRhZyA9IGZhbHNlXG4pID0+IChwYXJhbXMgPSB7fSkgPT4gKGRpc3BhdGNoLCBzdGF0ZSkgPT4ge1xuXG4gICAgbGV0IHVybCA9IFVSSShlbmRwb2ludCk7XG4gICAgbGV0IGtleSA9IHVybC50b1N0cmluZygpO1xuXG4gICAgaWYoIWlzT2JqZWN0RW1wdHkocGFyYW1zKSkge1xuICAgICAgICAvLyByZW1vdmUgdGhlIGFjY2VzcyB0b2tlblxuICAgICAgICBjb25zdCB7IGFjY2Vzc190b2tlbjogXywgLi4ubmV3UGFyYW1zfSA9IHBhcmFtcztcbiAgICAgICAgLy8gYW5kIGdlbmVyYXRlIG5ldyBrZXlcbiAgICAgICAga2V5ID0gdXJsLnF1ZXJ5KG5ld1BhcmFtcykudG9TdHJpbmcoKTtcbiAgICAgICAgdXJsID0gdXJsLnF1ZXJ5KHBhcmFtcyk7XG4gICAgfVxuXG4gICAgaWYocmVxdWVzdEFjdGlvbkNyZWF0b3IgJiYgdHlwZW9mIHJlcXVlc3RBY3Rpb25DcmVhdG9yID09PSAnZnVuY3Rpb24nKVxuICAgICAgICBkaXNwYXRjaChyZXF1ZXN0QWN0aW9uQ3JlYXRvcihyZXF1ZXN0QWN0aW9uUGF5bG9hZCkpO1xuXG4gICAgY2FuY2VsKGtleSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgcmVxID0gaHR0cC5nZXQodXJsLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZih1c2VFdGFnICYmIGV0YWdDYWNoZS5oYXNPd25Qcm9wZXJ0eShrZXkpKXtcbiAgICAgICAgICAgIGNvbnN0IHsgZXRhZyB9ID0gZXRhZ0NhY2hlW2tleV07XG4gICAgICAgICAgICBpZihldGFnKXtcbiAgICAgICAgICAgICAgICByZXEuc2V0KCdJZi1Ob25lLU1hdGNoJywgZXRhZylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlcS50aW1lb3V0KHtcbiAgICAgICAgICAgIHJlc3BvbnNlOiA2MDAwMCxcbiAgICAgICAgICAgIGRlYWRsaW5lOiA2MDAwMCxcbiAgICAgICAgfSlcbiAgICAgICAgLmVuZChyZXNwb25zZUhhbmRsZXIoZGlzcGF0Y2gsIHN0YXRlLCByZWNlaXZlQWN0aW9uQ3JlYXRvciwgZXJyb3JIYW5kbGVyLCByZXNvbHZlLCByZWplY3QsIGtleSwgdXNlRXRhZykpXG5cbiAgICAgICAgc2NoZWR1bGUoa2V5LCByZXEpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHB1dFJlcXVlc3QgPSAoXG4gICAgcmVxdWVzdEFjdGlvbkNyZWF0b3IsXG4gICAgcmVjZWl2ZUFjdGlvbkNyZWF0b3IsXG4gICAgZW5kcG9pbnQsXG4gICAgcGF5bG9hZCxcbiAgICBlcnJvckhhbmRsZXIgPSBkZWZhdWx0RXJyb3JIYW5kbGVyLFxuICAgIHJlcXVlc3RBY3Rpb25QYXlsb2FkID0ge31cbikgPT4gKHBhcmFtcyA9IHt9KSA9PiAoIGRpc3BhdGNoLCBzdGF0ZSkgPT4ge1xuXG4gICAgbGV0IHVybCA9IFVSSShlbmRwb2ludCk7XG5cbiAgICBpZighaXNPYmplY3RFbXB0eShwYXJhbXMpKVxuICAgICAgICB1cmwgPSB1cmwucXVlcnkocGFyYW1zKTtcblxuICAgIGlmKHJlcXVlc3RBY3Rpb25DcmVhdG9yICYmIHR5cGVvZiByZXF1ZXN0QWN0aW9uQ3JlYXRvciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgZGlzcGF0Y2gocmVxdWVzdEFjdGlvbkNyZWF0b3IocmVxdWVzdEFjdGlvblBheWxvYWQpKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmKHBheWxvYWQgPT0gbnVsbClcbiAgICAgICAgICAgIHBheWxvYWQgPSB7fTtcbiAgICAgICAgaHR0cC5wdXQodXJsLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICAuc2VuZChwYXlsb2FkKVxuICAgICAgICAgICAgLmVuZChyZXNwb25zZUhhbmRsZXIoZGlzcGF0Y2gsIHN0YXRlLCByZWNlaXZlQWN0aW9uQ3JlYXRvciwgZXJyb3JIYW5kbGVyLCByZXNvbHZlLCByZWplY3QpKVxuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZVJlcXVlc3QgPSAoXG4gICAgcmVxdWVzdEFjdGlvbkNyZWF0b3IsXG4gICAgcmVjZWl2ZUFjdGlvbkNyZWF0b3IsXG4gICAgZW5kcG9pbnQsXG4gICAgcGF5bG9hZCxcbiAgICBlcnJvckhhbmRsZXIgID0gZGVmYXVsdEVycm9ySGFuZGxlcixcbiAgICByZXF1ZXN0QWN0aW9uUGF5bG9hZCA9IHt9XG4pID0+IChwYXJhbXMpID0+IChkaXNwYXRjaCwgc3RhdGUpID0+IHtcbiAgICBsZXQgdXJsID0gVVJJKGVuZHBvaW50KTtcblxuICAgIGlmKCFpc09iamVjdEVtcHR5KHBhcmFtcykpXG4gICAgICAgIHVybCA9IHVybC5xdWVyeShwYXJhbXMpO1xuXG4gICAgaWYocmVxdWVzdEFjdGlvbkNyZWF0b3IgJiYgdHlwZW9mIHJlcXVlc3RBY3Rpb25DcmVhdG9yID09PSAnZnVuY3Rpb24nKVxuICAgICAgICBkaXNwYXRjaChyZXF1ZXN0QWN0aW9uQ3JlYXRvcihyZXF1ZXN0QWN0aW9uUGF5bG9hZCkpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaWYocGF5bG9hZCA9PSBudWxsKVxuICAgICAgICAgICAgcGF5bG9hZCA9IHt9O1xuXG4gICAgICAgIGh0dHAuZGVsZXRlKHVybClcbiAgICAgICAgICAgIC5zZW5kKHBheWxvYWQpXG4gICAgICAgICAgICAuZW5kKHJlc3BvbnNlSGFuZGxlcihkaXNwYXRjaCwgc3RhdGUsIHJlY2VpdmVBY3Rpb25DcmVhdG9yLCBlcnJvckhhbmRsZXIsIHJlc29sdmUsIHJlamVjdCkpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHBvc3RSZXF1ZXN0ID0gKFxuICAgICAgICByZXF1ZXN0QWN0aW9uQ3JlYXRvcixcbiAgICAgICAgcmVjZWl2ZUFjdGlvbkNyZWF0b3IsXG4gICAgICAgIGVuZHBvaW50LFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBlcnJvckhhbmRsZXIgPSBkZWZhdWx0RXJyb3JIYW5kbGVyLFxuICAgICAgICByZXF1ZXN0QWN0aW9uUGF5bG9hZCA9IHt9XG4pID0+IChwYXJhbXMgPSB7fSkgPT4gKGRpc3BhdGNoLCBzdGF0ZSkgPT4ge1xuXG4gICAgbGV0IHVybCA9IFVSSShlbmRwb2ludCk7XG5cbiAgICBpZighaXNPYmplY3RFbXB0eShwYXJhbXMpKVxuICAgICAgICB1cmwgPSB1cmwucXVlcnkocGFyYW1zKTtcblxuICAgIGlmKHJlcXVlc3RBY3Rpb25DcmVhdG9yICYmIHR5cGVvZiByZXF1ZXN0QWN0aW9uQ3JlYXRvciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgZGlzcGF0Y2gocmVxdWVzdEFjdGlvbkNyZWF0b3IocmVxdWVzdEFjdGlvblBheWxvYWQpKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgICAgbGV0IHJlcXVlc3QgPSBodHRwLnBvc3QodXJsKTtcblxuICAgICAgICBpZihwYXlsb2FkICE9IG51bGwpXG4gICAgICAgICAgICByZXF1ZXN0LnNlbmQocGF5bG9hZCk7XG4gICAgICAgIGVsc2UgLy8gdG8gYmUgYSBzaW1wbGUgQ09SUyByZXF1ZXN0XG4gICAgICAgICAgICByZXF1ZXN0LnNldCgnQ29udGVudC1UeXBlJywgJ3RleHQvcGxhaW4nKTtcblxuICAgICAgICByZXF1ZXN0LmVuZChyZXNwb25zZUhhbmRsZXIoZGlzcGF0Y2gsIHN0YXRlLCByZWNlaXZlQWN0aW9uQ3JlYXRvciwgZXJyb3JIYW5kbGVyLCByZXNvbHZlLCByZWplY3QpKTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBwb3N0RmlsZSA9IChcbiAgICByZXF1ZXN0QWN0aW9uQ3JlYXRvcixcbiAgICByZWNlaXZlQWN0aW9uQ3JlYXRvcixcbiAgICBlbmRwb2ludCxcbiAgICBmaWxlLFxuICAgIGZpbGVNZXRhZGF0YSA9IHt9LFxuICAgIGVycm9ySGFuZGxlciA9IGRlZmF1bHRFcnJvckhhbmRsZXIsXG4gICAgcmVxdWVzdEFjdGlvblBheWxvYWQgPSB7fVxuKSA9PiAocGFyYW1zID0ge30pID0+IChkaXNwYXRjaCwgc3RhdGUpID0+IHtcblxuICAgIGxldCB1cmwgPSBVUkkoZW5kcG9pbnQpO1xuXG4gICAgaWYoIWlzT2JqZWN0RW1wdHkocGFyYW1zKSlcbiAgICAgICAgdXJsID0gdXJsLnF1ZXJ5KHBhcmFtcyk7XG5cbiAgICBpZihyZXF1ZXN0QWN0aW9uQ3JlYXRvciAmJiB0eXBlb2YgcmVxdWVzdEFjdGlvbkNyZWF0b3IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgIGRpc3BhdGNoKHJlcXVlc3RBY3Rpb25DcmVhdG9yKHJlcXVlc3RBY3Rpb25QYXlsb2FkKSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IHJlcSA9IGh0dHAucG9zdCh1cmwpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRhY2goJ2ZpbGUnLCBmaWxlKTtcblxuICAgICAgICBpZighaXNPYmplY3RFbXB0eShmaWxlTWV0YWRhdGEpKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhmaWxlTWV0YWRhdGEpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGZpbGVNZXRhZGF0YVtrZXldO1xuICAgICAgICAgICAgICAgIHJlcS5maWVsZChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVxLmVuZChyZXNwb25zZUhhbmRsZXIoZGlzcGF0Y2gsIHN0YXRlLCByZWNlaXZlQWN0aW9uQ3JlYXRvciwgZXJyb3JIYW5kbGVyLCByZXNvbHZlLCByZWplY3QpKTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBwdXRGaWxlID0gKFxuICAgIHJlcXVlc3RBY3Rpb25DcmVhdG9yLFxuICAgIHJlY2VpdmVBY3Rpb25DcmVhdG9yLFxuICAgIGVuZHBvaW50LFxuICAgIGZpbGUgPSBudWxsLFxuICAgIGZpbGVNZXRhZGF0YSA9IHt9LFxuICAgIGVycm9ySGFuZGxlciA9IGRlZmF1bHRFcnJvckhhbmRsZXIsXG4gICAgcmVxdWVzdEFjdGlvblBheWxvYWQgPSB7fVxuKSA9PiAocGFyYW1zID0ge30pID0+IChkaXNwYXRjaCwgc3RhdGUpID0+IHtcblxuICAgIGxldCB1cmwgPSBVUkkoZW5kcG9pbnQpO1xuXG4gICAgaWYoIWlzT2JqZWN0RW1wdHkocGFyYW1zKSlcbiAgICAgICAgdXJsID0gdXJsLnF1ZXJ5KHBhcmFtcyk7XG5cbiAgICBpZihyZXF1ZXN0QWN0aW9uQ3JlYXRvciAmJiB0eXBlb2YgcmVxdWVzdEFjdGlvbkNyZWF0b3IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgIGRpc3BhdGNoKHJlcXVlc3RBY3Rpb25DcmVhdG9yKHJlcXVlc3RBY3Rpb25QYXlsb2FkKSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IHJlcSA9IGh0dHAucHV0KHVybCk7XG5cbiAgICAgICAgaWYoZmlsZSAhPSBudWxsKXtcbiAgICAgICAgICAgIHJlcS5hdHRhY2goJ2ZpbGUnLCBmaWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFpc09iamVjdEVtcHR5KGZpbGVNZXRhZGF0YSkpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGZpbGVNZXRhZGF0YSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZmlsZU1ldGFkYXRhW2tleV07XG4gICAgICAgICAgICAgICAgcmVxLmZpZWxkKGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXEuZW5kKHJlc3BvbnNlSGFuZGxlcihkaXNwYXRjaCwgc3RhdGUsIHJlY2VpdmVBY3Rpb25DcmVhdG9yLCBlcnJvckhhbmRsZXIsIHJlc29sdmUsIHJlamVjdCkpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRFcnJvckhhbmRsZXIgPSAoZXJyLCByZXMpID0+IChkaXNwYXRjaCkgPT4ge1xuICAgIGxldCBib2R5ID0gcmVzLmJvZHk7XG4gICAgbGV0IHRleHQgPSAnJztcbiAgICBpZihib2R5IGluc3RhbmNlb2YgT2JqZWN0KXtcbiAgICAgICAgaWYoYm9keS5oYXNPd25Qcm9wZXJ0eSgnbWVzc2FnZScpKVxuICAgICAgICAgICAgdGV4dCA9IGJvZHkubWVzc2FnZTtcbiAgICB9XG4gICAgU3dhbC5maXJlKHJlcy5zdGF0dXNUZXh0LCB0ZXh0LCBcImVycm9yXCIpO1xufVxuXG5jb25zdCBieUxvd2VyQ2FzZSA9IHRvRmluZCA9PiB2YWx1ZSA9PiB0b0xvd2VyQ2FzZSh2YWx1ZSkgPT09IHRvRmluZDtcbmNvbnN0IHRvTG93ZXJDYXNlID0gdmFsdWUgPT4gdmFsdWUudG9Mb3dlckNhc2UoKTtcbmNvbnN0IGdldEtleXMgPSBoZWFkZXJzID0+IE9iamVjdC5rZXlzKGhlYWRlcnMpO1xuXG5leHBvcnQgY29uc3QgZ2V0SGVhZGVyQ2FzZUluc2Vuc2l0aXZlID0gKGhlYWRlck5hbWUsIGhlYWRlcnMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IGtleSA9IGdldEtleXMoaGVhZGVycykuZmluZChieUxvd2VyQ2FzZShoZWFkZXJOYW1lKSk7XG4gICAgcmV0dXJuIGtleSA/IGhlYWRlcnNba2V5XSA6IHVuZGVmaW5lZDtcbn07XG5cbmV4cG9ydCBjb25zdCByZXNwb25zZUhhbmRsZXIgPSAoIGRpc3BhdGNoLCBzdGF0ZSwgcmVjZWl2ZUFjdGlvbkNyZWF0b3IsIGVycm9ySGFuZGxlciwgcmVzb2x2ZSwgcmVqZWN0LCBrZXkgPSBudWxsLCB1c2VFdGFnPSBmYWxzZSApID0+XG5cbiAgICAoZXJyLCByZXMpID0+IHtcblxuICAgIGlmIChlcnIgfHwgIXJlcy5vaykge1xuICAgICAgICBsZXQgY29kZSA9IGVyci5zdGF0dXM7XG5cbiAgICAgICAgaWYoY29kZSA9PT0gMzA0ICYmIGV0YWdDYWNoZS5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHVzZUV0YWcpe1xuICAgICAgICAgICAgY29uc3QgeyBib2R5IH0gPSBldGFnQ2FjaGVba2V5XTtcblxuICAgICAgICAgICAgaWYodHlwZW9mIHJlY2VpdmVBY3Rpb25DcmVhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2gocmVjZWl2ZUFjdGlvbkNyZWF0b3Ioe3Jlc3BvbnNlOiBib2R5fSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHtyZXNwb25zZTogYm9keX0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkaXNwYXRjaChyZWNlaXZlQWN0aW9uQ3JlYXRvcik7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh7cmVzcG9uc2U6IGJvZHl9KTtcbiAgICAgICAgfVxuICAgICAgICBpZihlcnJvckhhbmRsZXIpIHtcbiAgICAgICAgICAgIGVycm9ySGFuZGxlcihlcnIsIHJlcykoZGlzcGF0Y2gsIHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVqZWN0KHsgZXJyLCByZXMsIGRpc3BhdGNoLCBzdGF0ZSB9KVxuICAgIH1cblxuICAgIGxldCBqc29uID0gcmVzLmJvZHk7XG5cbiAgICBpZih1c2VFdGFnKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlRVRBRyA9IGdldEhlYWRlckNhc2VJbnNlbnNpdGl2ZSgnZXRhZycsIHJlcy5oZWFkZXJzKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlRVRBRykge1xuICAgICAgICAgICAgZXRhZ0NhY2hlW2tleV0gPSB7IGV0YWc6IHJlc3BvbnNlRVRBRywgYm9keToganNvbn07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZih0eXBlb2YgcmVjZWl2ZUFjdGlvbkNyZWF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZGlzcGF0Y2gocmVjZWl2ZUFjdGlvbkNyZWF0b3Ioe3Jlc3BvbnNlOiBqc29ufSkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSh7cmVzcG9uc2U6IGpzb259KTtcbiAgICB9XG4gICAgZGlzcGF0Y2gocmVjZWl2ZUFjdGlvbkNyZWF0b3IpO1xuICAgIHJldHVybiByZXNvbHZlKHtyZXNwb25zZToganNvbn0pO1xufVxuXG5cbmV4cG9ydCBjb25zdCBmZXRjaEVycm9ySGFuZGxlciA9IChyZXNwb25zZSkgPT4ge1xuICAgIGxldCBjb2RlID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgIGxldCBtc2cgPSByZXNwb25zZS5zdGF0dXNUZXh0O1xuXG4gICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICAgIGNhc2UgNDAzOlxuICAgICAgICAgICAgU3dhbC5maXJlKFwiRVJST1JcIiwgVC50cmFuc2xhdGUoXCJlcnJvcnMudXNlcl9ub3RfYXV0aHpcIiksIFwid2FybmluZ1wiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQwMTpcbiAgICAgICAgICAgIFN3YWwuZmlyZShcIkVSUk9SXCIsIFQudHJhbnNsYXRlKFwiZXJyb3JzLnNlc3Npb25fZXhwaXJlZFwiKSwgXCJlcnJvclwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQxMjpcbiAgICAgICAgICAgIFN3YWwuZmlyZShcIkVSUk9SXCIsIG1zZywgXCJ3YXJuaW5nXCIpO1xuICAgICAgICBjYXNlIDUwMDpcbiAgICAgICAgICAgIFN3YWwuZmlyZShcIkVSUk9SXCIsIFQudHJhbnNsYXRlKFwiZXJyb3JzLnNlcnZlcl9lcnJvclwiKSwgXCJlcnJvclwiKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBmZXRjaFJlc3BvbnNlSGFuZGxlciA9IChyZXNwb25zZSkgPT4ge1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgcmVzcG9uc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBzaG93TWVzc2FnZSA9IChzZXR0aW5ncywgY2FsbGJhY2sgPSB7fSkgPT4gKGRpc3BhdGNoKSA9PiB7XG4gICAgZGlzcGF0Y2goc3RvcExvYWRpbmcoKSk7XG5cbiAgICBTd2FsLmZpcmUoc2V0dGluZ3MpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbHVlICYmIHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5leHBvcnQgY29uc3Qgc2hvd1N1Y2Nlc3NNZXNzYWdlID0gKGh0bWwpID0+IChkaXNwYXRjaCkgPT4ge1xuICAgIGRpc3BhdGNoKHN0b3BMb2FkaW5nKCkpO1xuICAgIFN3YWwuZmlyZSh7XG4gICAgICAgIHRpdGxlOiBULnRyYW5zbGF0ZShcImdlbmVyYWwuZG9uZVwiKSxcbiAgICAgICAgaHRtbDogaHRtbCxcbiAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnXG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBkb3dubG9hZEZpbGVCeUNvbnRlbnQgPSAoZmlsZW5hbWUsIGNvbnRlbnQsIG1pbWUpID0+IHtcbiAgICBsZXQgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBsaW5rLnRleHRDb250ZW50ID0gJ2Rvd25sb2FkJztcbiAgICBsaW5rLmRvd25sb2FkID0gZmlsZW5hbWU7XG4gICAgbGluay5ocmVmID0gYGRhdGE6JHttaW1lfSwke2VuY29kZVVSSUNvbXBvbmVudChjb250ZW50KX1gXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTsgLy8gUmVxdWlyZWQgZm9yIEZGXG4gICAgbGluay5jbGljaygpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRDU1YgPSAoZW5kcG9pbnQsIHBhcmFtcywgZmlsZW5hbWUsIGhlYWRlciA9IG51bGwpID0+IChkaXNwYXRjaCkgPT4ge1xuXG4gICAgbGV0IHVybCA9IFVSSShlbmRwb2ludCk7XG5cbiAgICBpZighaXNPYmplY3RFbXB0eShwYXJhbXMpKVxuICAgICAgICB1cmwgPSB1cmwucXVlcnkocGFyYW1zKTtcblxuICAgIGRpc3BhdGNoKHN0YXJ0TG9hZGluZygpKTtcblxuICAgIHJldHVybiBmZXRjaCh1cmwudG9TdHJpbmcoKSlcbiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgcmVzcG9uc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKChjc3YpID0+IHtcbiAgICAgICAgICAgIGRpc3BhdGNoKHN0b3BMb2FkaW5nKCkpO1xuXG4gICAgICAgICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgY3N2ID0gaGVhZGVyICsgJ1xcclxccicgKyBjc3Y7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb3dubG9hZEZpbGVCeUNvbnRlbnQoZmlsZW5hbWUsIGNzdiwgJ3RleHQvY3N2O2NoYXJzZXQ9dXRmLTgnKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZldGNoRXJyb3JIYW5kbGVyKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSYXdDU1YgPSAoZW5kcG9pbnQsIHBhcmFtcywgaGVhZGVyID0gbnVsbCkgPT4ge1xuXG4gICAgbGV0IHVybCA9IFVSSShlbmRwb2ludCk7XG5cbiAgICBpZighaXNPYmplY3RFbXB0eShwYXJhbXMpKVxuICAgICAgICB1cmwgPSB1cmwucXVlcnkocGFyYW1zKTtcblxuICAgIHJldHVybiBmZXRjaCh1cmwudG9TdHJpbmcoKSlcbiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgcmVzcG9uc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKChjc3YpID0+IHtcbiAgICAgICAgICAgIGlmIChoZWFkZXIpIHtcbiAgICAgICAgICAgICAgICBjc3YgPSBoZWFkZXIgKyAnXFxyXFxyJyArIGNzdjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjc3Y7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59O1xuXG5leHBvcnQgY29uc3QgZXNjYXBlRmlsdGVyVmFsdWUgPSAodmFsdWUpID0+IHtcbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoLywvZywgXCJcXFxcLFwiKTtcbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoLzsvZywgXCJcXFxcO1wiKTtcbiAgICByZXR1cm4gdmFsdWU7XG59O1xuIiwiLy8gbGltaXQgb2YgQ3J5cHRvLmdldFJhbmRvbVZhbHVlcygpXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQ3J5cHRvL2dldFJhbmRvbVZhbHVlc1xuY29uc3QgTUFYX0JZVEVTID0gNjU1MzZcbi8vIE5vZGUgc3VwcG9ydHMgcmVxdWVzdGluZyB1cCB0byB0aGlzIG51bWJlciBvZiBieXRlc1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvbWFzdGVyL2xpYi9pbnRlcm5hbC9jcnlwdG8vcmFuZG9tLmpzI0w0OFxuY29uc3QgTUFYX1VJTlQzMiA9IDQyOTQ5NjcyOTVcbmNvbnN0IGNyeXB0byA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gKHdpbmRvdy5jcnlwdG8gfHwgd2luZG93Lm1zQ3J5cHRvKSA6IG51bGw7XG5pbXBvcnQgc2hhMjU2IGZyb20gJ2NyeXB0by1qcy9zaGEyNTYnO1xuaW1wb3J0IEJhc2U2NHVybCBmcm9tICdjcnlwdG8tanMvZW5jLWJhc2U2NHVybCdcbmltcG9ydCBIZXggZnJvbSAnY3J5cHRvLWpzL2VuYy1oZXgnXG5leHBvcnQgY29uc3QgZ2V0UmFuZG9tQnl0ZXMgPSAoc2l6ZSkgPT4ge1xuICAgIC8vIHBoYW50b21qcyBuZWVkcyB0byB0aHJvd1xuICAgIGlmIChzaXplID4gTUFYX1VJTlQzMikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3JlcXVlc3RlZCB0b28gbWFueSByYW5kb20gYnl0ZXMnKVxuICAgIGNvbnN0IGJ5dGVzID0gQnVmZmVyLmFsbG9jVW5zYWZlKHNpemUpXG4gICAgaWYoIWNyeXB0bykgcmV0dXJuIGE7XG4gICAgaWYgKHNpemUgPiAwKSB7ICAvLyBnZXRSYW5kb21WYWx1ZXMgZmFpbHMgb24gSUUgaWYgc2l6ZSA9PSAwXG4gICAgICAgIGlmIChzaXplID4gTUFYX0JZVEVTKSB7IC8vIHRoaXMgaXMgdGhlIG1heCBieXRlcyBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzXG4gICAgICAgICAgICAvLyBjYW4gZG8gYXQgb25jZSBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL3dpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzXG4gICAgICAgICAgICBmb3IgKGxldCBnZW5lcmF0ZWQgPSAwOyBnZW5lcmF0ZWQgPCBzaXplOyBnZW5lcmF0ZWQgKz0gTUFYX0JZVEVTKSB7XG4gICAgICAgICAgICAgICAgLy8gYnVmZmVyLnNsaWNlIGF1dG9tYXRpY2FsbHkgY2hlY2tzIGlmIHRoZSBlbmQgaXMgcGFzdCB0aGUgZW5kIG9mXG4gICAgICAgICAgICAgICAgLy8gdGhlIGJ1ZmZlciBzbyB3ZSBkb24ndCBoYXZlIHRvIGhlcmVcbiAgICAgICAgICAgICAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGJ5dGVzLnNsaWNlKGdlbmVyYXRlZCwgZ2VuZXJhdGVkICsgTUFYX0JZVEVTKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYnl0ZXMpXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVzXG59XG5cbmV4cG9ydCBjb25zdCBnZXRTSEEyNTYgPSAobWVzc2FnZSwgZm9ybWF0ID0gJ2hleCcpID0+IHtcblxuICAgIGxldCBmID0gSGV4O1xuICAgIGlmKGZvcm1hdCA9PT0gJ0Jhc2U2NHVybCcpXG4gICAgICAgIGYgPSBCYXNlNjR1cmw7XG5cbiAgICByZXR1cm4gc2hhMjU2KG1lc3NhZ2UpLnRvU3RyaW5nKGYpO1xufSIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTggT3BlblN0YWNrIEZvdW5kYXRpb25cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKi9cblxuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQtdGltZXpvbmUnO1xuaW1wb3J0IFVSSSBmcm9tIFwidXJpanNcIjtcblxuZXhwb3J0IGNvbnN0IGZpbmRFbGVtZW50UG9zID0gKG9iaikgPT4ge1xuICAgIHZhciBjdXJ0b3AgPSAtNzA7XG4gICAgaWYgKG9iai5vZmZzZXRQYXJlbnQpIHtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgY3VydG9wICs9IG9iai5vZmZzZXRUb3A7XG4gICAgICAgIH0gd2hpbGUgKG9iaiA9IG9iai5vZmZzZXRQYXJlbnQpO1xuICAgICAgICByZXR1cm4gW2N1cnRvcF07XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGVwb2NoVG9Nb21lbnQgPSAoYXRpbWUpID0+IHtcbiAgICBpZighYXRpbWUpIHJldHVybiBhdGltZTtcbiAgICBhdGltZSA9IGF0aW1lICogMTAwMDtcbiAgICByZXR1cm4gbW9tZW50KGF0aW1lKTtcbn07XG5cbmV4cG9ydCBjb25zdCBlcG9jaFRvTW9tZW50VGltZVpvbmUgPSAoYXRpbWUsIHRpbWVfem9uZSkgPT4ge1xuICAgIGlmKCFhdGltZSkgcmV0dXJuIGF0aW1lO1xuICAgIGF0aW1lID0gYXRpbWUgKiAxMDAwO1xuICAgIHJldHVybiBtb21lbnQoYXRpbWUpLnR6KHRpbWVfem9uZSk7XG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0RXBvY2ggPSAoYXRpbWUsIGZvcm1hdCA9ICdNL0QvWVlZWSBoOm1tIGEnKSA9PiB7XG4gICAgaWYoIWF0aW1lKSByZXR1cm4gYXRpbWU7XG4gICAgcmV0dXJuIGVwb2NoVG9Nb21lbnQoYXRpbWUpLmZvcm1hdChmb3JtYXQpO1xufTtcblxuZXhwb3J0IGNvbnN0IG9iamVjdFRvUXVlcnlTdHJpbmcgPSAob2JqKSA9PiB7XG4gICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgICBpZiAoc3RyICE9IFwiXCIpIHtcbiAgICAgICAgICAgIHN0ciArPSBcIiZcIjtcbiAgICAgICAgfVxuICAgICAgICBzdHIgKz0ga2V5ICsgXCI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQob2JqW2tleV0pO1xuICAgIH1cblxuICAgIHJldHVybiBzdHI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QmFja1VSTCA9ICgpID0+IHtcbiAgICBsZXQgdXJsICAgICAgPSBVUkkod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgIGxldCBxdWVyeSAgICA9IHVybC5zZWFyY2godHJ1ZSk7XG4gICAgbGV0IGZyYWdtZW50ID0gdXJsLmZyYWdtZW50KCk7XG4gICAgbGV0IGJhY2tVcmwgID0gcXVlcnkuaGFzT3duUHJvcGVydHkoJ0JhY2tVcmwnKSA/IHF1ZXJ5WydCYWNrVXJsJ10gOiBudWxsO1xuICAgIGlmKGZyYWdtZW50ICE9IG51bGwgJiYgZnJhZ21lbnQgIT0gJycpe1xuICAgICAgICBiYWNrVXJsICs9IGAjJHtmcmFnbWVudH1gO1xuICAgIH1cbiAgICByZXR1cm4gYmFja1VybDtcbn07XG5cbmV4cG9ydCBjb25zdCB0b1NsdWcgPSAodGV4dCkgPT57XG4gICAgdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9bXmEtekEtWjAtOV0rL2csJ18nKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEF1dGhDYWxsYmFjayA9ICgpID0+IHtcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0vYXV0aC9jYWxsYmFja2A7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEN1cnJlbnRMb2NhdGlvbiA9ICgpID0+IHtcbiAgICBsZXQgbG9jYXRpb24gPSAnJztcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBsb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbjtcbiAgICAgICAgLy8gY2hlY2sgaWYgd2UgYXJlIG9uIGlmcmFtZVxuICAgICAgICBpZiAod2luZG93LnRvcClcbiAgICAgICAgICAgIGxvY2F0aW9uID0gd2luZG93LnRvcC5sb2NhdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2F0aW9uO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE9yaWdpbiA9ICgpID0+IHtcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudFBhdGhOYW1lID0gKCkgPT4ge1xuICAgIGlmKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudEhyZWYgPSAoKSA9PiB7XG4gICAgaWYodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBbGxvd2VkVXNlckdyb3VwcyA9ICgpID0+IHtcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gd2luZG93LkFMTE9XRURfVVNFUl9HUk9VUFMgfHwgJyc7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkQVBJQmFzZVVybCA9IChyZWxhdGl2ZVVybCkgPT4ge1xuICAgIGlmKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKXtcbiAgICAgICAgcmV0dXJuIGAke3dpbmRvdy5BUElfQkFTRV9VUkx9JHtyZWxhdGl2ZVVybH1gO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbGBgO1xufTtcblxuZXhwb3J0IGNvbnN0IHB1dE9uTG9jYWxTdG9yYWdlID0gKGtleSwgdmFsdWUpID0+IHtcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldEZyb21Mb2NhbFN0b3JhZ2UgPSAoa2V5LCByZW1vdmVJdCkgPT4ge1xuICAgIGlmKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGxldCB2YWwgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICAgICAgaWYocmVtb3ZlSXQpe1xuICAgICAgICAgICAgY29uc29sZS5sb2coYGdldEZyb21Mb2NhbFN0b3JhZ2UgcmVtb3Zpbmcga2V5ICR7a2V5fWApO1xuICAgICAgICAgICAgcmVtb3ZlRnJvbUxvY2FsU3RvcmFnZShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZUZyb21Mb2NhbFN0b3JhZ2UgPSAoa2V5KSA9PiB7XG4gICAgaWYodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgaXNDbGVhcmluZ1Nlc3Npb25TdGF0ZSA9ICgpID0+IHtcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gd2luZG93LmNsZWFyaW5nX3Nlc3Npb25fc3RhdGU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRTZXNzaW9uQ2xlYXJpbmdTdGF0ZSA9ICh2YWwpID0+IHtcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB3aW5kb3cuY2xlYXJpbmdfc2Vzc2lvbl9zdGF0ZSA9IHZhbDtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudFVzZXJMYW5ndWFnZSA9ICgpID0+IHtcbiAgICBsZXQgbGFuZ3VhZ2UgPSAnZW4nO1xuICAgIGlmKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGxhbmd1YWdlID0gKG5hdmlnYXRvci5sYW5ndWFnZXMgJiYgbmF2aWdhdG9yLmxhbmd1YWdlc1swXSkgfHwgbmF2aWdhdG9yLmxhbmd1YWdlIHx8IG5hdmlnYXRvci51c2VyTGFuZ3VhZ2U7XG4gICAgfVxuICAgIHJldHVybiBsYW5ndWFnZTtcbn07XG5cbmV4cG9ydCBjb25zdCBzY3JvbGxUb0Vycm9yID0gKGVycm9ycykgPT4ge1xuICAgIGlmKE9iamVjdC5rZXlzKGVycm9ycykubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBmaXJzdEVycm9yID0gT2JqZWN0LmtleXMoZXJyb3JzKVswXTtcbiAgICAgICAgY29uc3QgZmlyc3ROb2RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZmlyc3RFcnJvcik7XG4gICAgICAgIGlmIChmaXJzdE5vZGUpIHdpbmRvdy5zY3JvbGxUbygwLCBmaW5kRWxlbWVudFBvcyhmaXJzdE5vZGUpKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgaGFzRXJyb3JzID0gKGZpZWxkLCBlcnJvcnMpID0+IHtcbiAgICBpZihmaWVsZCBpbiBlcnJvcnMpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yc1tmaWVsZF07XG4gICAgfVxuICAgIHJldHVybiAnJztcbn07XG5cbmV4cG9ydCBjb25zdCBzaGFsbG93RXF1YWwgPSAob2JqZWN0MSwgb2JqZWN0MikgPT4ge1xuICAgIGNvbnN0IGtleXMxID0gT2JqZWN0LmtleXMob2JqZWN0MSk7XG4gICAgY29uc3Qga2V5czIgPSBPYmplY3Qua2V5cyhvYmplY3QyKTtcblxuICAgIGlmIChrZXlzMS5sZW5ndGggIT09IGtleXMyLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChsZXQga2V5IG9mIGtleXMxKSB7XG4gICAgICAgIGlmIChvYmplY3QxW2tleV0gIT09IG9iamVjdDJba2V5XSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgY29uc3QgYXJyYXlzRXF1YWwgPSAoYTEsIGEyKSA9PlxuICAgIGExLmxlbmd0aCA9PT0gYTIubGVuZ3RoICYmIGExLmV2ZXJ5KChvLCBpZHgpID0+IHNoYWxsb3dFcXVhbChvLCBhMltpZHhdKSk7XG5cbmV4cG9ydCBjb25zdCBpc0VtcHR5ID0gKG9iaikgPT4ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMDtcbn07XG5cblxuZXhwb3J0IGNvbnN0IGJhc2U2NFVSTEVuY29kZSA9IChzdHIpID0+IHtcbiAgICByZXR1cm4gc3RyXG4gICAgICAgIC50b1N0cmluZygnYmFzZTY0JylcbiAgICAgICAgLnJlcGxhY2UoL1xcKy9nLCAnLScpXG4gICAgICAgIC5yZXBsYWNlKC9cXC8vZywgJ18nKVxuICAgICAgICAucmVwbGFjZSgvPS9nLCAnJylcbn1cblxuZXhwb3J0IGNvbnN0IHJldHJ5UHJvbWlzZSA9IGFzeW5jIChcbiAgICBjYixcbiAgICBtYXhOdW1iZXJPZlJldHJpZXMgPSAzXG4pID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1heE51bWJlck9mUmV0cmllczsgaSsrKSB7XG4gICAgICAgIGlmIChhd2FpdCBjYigpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldFRpbWVTZXJ2aWNlVXJsID0gKCkgPT4ge1xuICAgIGlmKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuVElNRUlOVEVSVkFMU0lOQ0UxOTcwX0FQSV9VUkwgfHwgcHJvY2Vzcy5lbnYuVElNRUlOVEVSVkFMU0lOQ0UxOTcwX0FQSV9VUkw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTggT3BlblN0YWNrIEZvdW5kYXRpb25cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKi9cblxuaW1wb3J0IHsgZmV0Y2hFcnJvckhhbmRsZXIsIGZldGNoUmVzcG9uc2VIYW5kbGVyLCBlc2NhcGVGaWx0ZXJWYWx1ZSB9IGZyb20gXCIuL2FjdGlvbnNcIjtcbmltcG9ydCB7IGdldEFjY2Vzc1Rva2VuIH0gZnJvbSAnLi4vY29tcG9uZW50cy9zZWN1cml0eS9tZXRob2RzJztcbmltcG9ydCB7IGJ1aWxkQVBJQmFzZVVybCB9IGZyb20gXCIuL21ldGhvZHNcIjtcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5leHBvcnQgY29uc3QgUkVDRUlWRV9DT1VOVFJJRVMgID0gJ1JFQ0VJVkVfQ09VTlRSSUVTJztcbmNvbnN0IGNhbGxEZWxheSA9IDUwMDsgLy9taWxpc2Vjb25kc1xuaW1wb3J0IFVSSSBmcm9tIFwidXJpanNcIjtcblxuZXhwb3J0IGNvbnN0IHF1ZXJ5TWVtYmVycyA9IF8uZGVib3VuY2UoYXN5bmMgKGlucHV0LCBjYWxsYmFjaykgPT4ge1xuXG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuICAgIGxldCBmaWx0ZXJzID0gZW5jb2RlVVJJQ29tcG9uZW50KGBmdWxsX25hbWU9QCR7aW5wdXR9LGZpcnN0X25hbWU9QCR7aW5wdXR9LGxhc3RfbmFtZT1AJHtpbnB1dH0sZW1haWw9QCR7aW5wdXR9YCk7XG4gICAgbGV0IGV4cGFuZCA9IGB0aWNrZXRzLHJzdnAsc2NoZWR1bGVfc3VtbWl0X2V2ZW50cyxhbGxfYWZmaWxpYXRpb25zYFxuXG4gICAgZmV0Y2goYnVpbGRBUElCYXNlVXJsKGAvYXBpL3YxL21lbWJlcnM/ZmlsdGVyPSR7ZmlsdGVyc30mZXhwYW5kPSR7ZXhwYW5kfSZhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gKSlcbiAgICAgICAgLnRoZW4oZmV0Y2hSZXNwb25zZUhhbmRsZXIpXG4gICAgICAgIC50aGVuKChqc29uKSA9PiB7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IFsuLi5qc29uLmRhdGFdO1xuXG4gICAgICAgICAgICBjYWxsYmFjayhvcHRpb25zKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZldGNoRXJyb3JIYW5kbGVyKTtcbn0sIGNhbGxEZWxheSk7XG5cblxuZXhwb3J0IGNvbnN0IHF1ZXJ5U3VtbWl0cyA9IF8uZGVib3VuY2UoYXN5bmMgKGlucHV0LCBjYWxsYmFjaykgPT4ge1xuXG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuICAgIGxldCBmaWx0ZXJzID0gZW5jb2RlVVJJQ29tcG9uZW50KGBuYW1lPUAke2lucHV0fWApO1xuXG4gICAgZmV0Y2goYnVpbGRBUElCYXNlVXJsKGAvYXBpL3YxL3N1bW1pdHMvYWxsP2ZpbHRlcj0ke2ZpbHRlcnN9JmFjY2Vzc190b2tlbj0ke2FjY2Vzc1Rva2VufWApKVxuICAgICAgICAudGhlbihmZXRjaFJlc3BvbnNlSGFuZGxlcilcbiAgICAgICAgLnRoZW4oKGpzb24pID0+IHtcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gWy4uLmpzb24uZGF0YV07XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG9wdGlvbnMpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZmV0Y2hFcnJvckhhbmRsZXIpO1xufSwgY2FsbERlbGF5KTtcblxuXG5leHBvcnQgY29uc3QgcXVlcnlTcGVha2VycyA9IF8uZGVib3VuY2UoYXN5bmMgKHN1bW1pdElkLCBpbnB1dCwgY2FsbGJhY2spID0+IHtcblxuICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICBpbnB1dCA9IGVzY2FwZUZpbHRlclZhbHVlKGlucHV0KTtcbiAgICBsZXQgZmlsdGVycyA9IGVuY29kZVVSSUNvbXBvbmVudChgZnVsbF9uYW1lPUAke2lucHV0fSxmaXJzdF9uYW1lPUAke2lucHV0fSxsYXN0X25hbWU9QCR7aW5wdXR9LGVtYWlsPUAke2lucHV0fWApO1xuICAgIGxldCBhcGlVcmwgPSBgL2FwaS92MWA7XG5cbiAgICBpZiAoc3VtbWl0SWQpIHtcbiAgICAgICAgYXBpVXJsICs9IGAvc3VtbWl0cy8ke3N1bW1pdElkfWA7XG4gICAgfVxuXG4gICAgYXBpVXJsICs9IGAvc3BlYWtlcnM/ZmlsdGVyPSR7ZmlsdGVyc30mYWNjZXNzX3Rva2VuPSR7YWNjZXNzVG9rZW59JmV4cGFuZD1tZW1iZXIscmVnaXN0cmF0aW9uX3JlcXVlc3RgO1xuXG4gICAgZmV0Y2goYnVpbGRBUElCYXNlVXJsKGFwaVVybCkpXG4gICAgICAgIC50aGVuKGZldGNoUmVzcG9uc2VIYW5kbGVyKVxuICAgICAgICAudGhlbigoanNvbikgPT4ge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBbLi4uanNvbi5kYXRhXTtcblxuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59LCBjYWxsRGVsYXkpO1xuXG5cblxuZXhwb3J0IGNvbnN0IHF1ZXJ5VGFncyA9IF8uZGVib3VuY2UoYXN5bmMgKHN1bW1pdElkLCBpbnB1dCwgY2FsbGJhY2spID0+IHtcblxuICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICBpbnB1dCA9IGVzY2FwZUZpbHRlclZhbHVlKGlucHV0KTtcbiAgICBsZXQgYXBpVXJsID0gYC9hcGkvdjFgO1xuICAgIGxldCBmaWx0ZXIgPSBlbmNvZGVVUklDb21wb25lbnQoYHRhZz1AJHtpbnB1dH1gKTtcblxuICAgIGlmIChzdW1taXRJZCkge1xuICAgICAgICBhcGlVcmwgKz0gYC9zdW1taXRzLyR7c3VtbWl0SWR9L3RyYWNrLXRhZy1ncm91cHMvYWxsL2FsbG93ZWQtdGFncz9maWx0ZXI9JHtmaWx0ZXJ9JmV4cGFuZD10YWcsdHJhY2tfdGFnX2dyb3VwYDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBhcGlVcmwgKz0gYC90YWdzP2ZpbHRlcj0ke2ZpbHRlcn1gO1xuICAgIH1cblxuICAgIGFwaVVybCArPSBgJm9yZGVyPXRhZyZwYWdlPTEmcGVyX3BhZ2U9NTAmYWNjZXNzX3Rva2VuPSR7YWNjZXNzVG9rZW59YDtcblxuICAgIGZldGNoKGJ1aWxkQVBJQmFzZVVybChhcGlVcmwpKVxuICAgICAgICAudGhlbihmZXRjaFJlc3BvbnNlSGFuZGxlcilcbiAgICAgICAgLnRoZW4oKGpzb24pID0+IHtcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gWy4uLmpzb24uZGF0YV07XG5cbiAgICAgICAgICAgIGlmIChzdW1taXRJZCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zLm1hcCh0ID0+IHQudGFnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59LCBjYWxsRGVsYXkpO1xuXG5cblxuZXhwb3J0IGNvbnN0IHF1ZXJ5VHJhY2tzID0gXy5kZWJvdW5jZShhc3luYyAoc3VtbWl0SWQsIGlucHV0LCBjYWxsYmFjaykgPT4ge1xuXG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuICAgIGxldCBmaWx0ZXIgPSBlbmNvZGVVUklDb21wb25lbnQoYG5hbWU9QCR7aW5wdXR9YCk7XG5cbiAgICBmZXRjaChidWlsZEFQSUJhc2VVcmwoYC9hcGkvdjEvc3VtbWl0cy8ke3N1bW1pdElkfS90cmFja3M/ZmlsdGVyPSR7ZmlsdGVyfSZvcmRlcj1uYW1lJmFjY2Vzc190b2tlbj0ke2FjY2Vzc1Rva2VufWApKVxuICAgICAgICAudGhlbihmZXRjaFJlc3BvbnNlSGFuZGxlcilcbiAgICAgICAgLnRoZW4oKGpzb24pID0+IHtcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gWy4uLmpzb24uZGF0YV07XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG9wdGlvbnMpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZmV0Y2hFcnJvckhhbmRsZXIpO1xufSwgY2FsbERlbGF5KTtcblxuXG5cbmV4cG9ydCBjb25zdCBxdWVyeVRyYWNrR3JvdXBzID0gXy5kZWJvdW5jZShhc3luYyAoc3VtbWl0SWQsIGlucHV0LCBjYWxsYmFjaykgPT4ge1xuXG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuICAgIGxldCBmaWx0ZXIgPSBpbnB1dCA/IGVuY29kZVVSSUNvbXBvbmVudChgZmlsdGVyPW5hbWU9QCR7aW5wdXR9YCkgOiAnJztcblxuICAgIGZldGNoKGJ1aWxkQVBJQmFzZVVybChgL2FwaS92MS9zdW1taXRzLyR7c3VtbWl0SWR9L3RyYWNrLWdyb3Vwcz9vcmRlcj1uYW1lJmFjY2Vzc190b2tlbj0ke2FjY2Vzc1Rva2VufSYke2ZpbHRlcn1gKSlcbiAgICAgICAgLnRoZW4oZmV0Y2hSZXNwb25zZUhhbmRsZXIpXG4gICAgICAgIC50aGVuKChqc29uKSA9PiB7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IFsuLi5qc29uLmRhdGFdO1xuXG4gICAgICAgICAgICBjYWxsYmFjayhvcHRpb25zKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZldGNoRXJyb3JIYW5kbGVyKTtcbn0sIGNhbGxEZWxheSk7XG5cblxuXG5leHBvcnQgY29uc3QgcXVlcnlFdmVudHMgPSBfLmRlYm91bmNlKGFzeW5jIChzdW1taXRJZCwgaW5wdXQsIG9ubHlQdWJsaXNoZWQgPSBmYWxzZSwgY2FsbGJhY2spID0+IHtcblxuICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICBpbnB1dCA9IGVzY2FwZUZpbHRlclZhbHVlKGlucHV0KTtcbiAgICBsZXQgYmFzZVVybCA9IGAvYXBpL3YxL3N1bW1pdHMvJHtzdW1taXRJZH0vZXZlbnRzYCArIChvbmx5UHVibGlzaGVkID8gJy9wdWJsaXNoZWQnIDogJycpO1xuICAgIGxldCBmaWx0ZXIgPSBlbmNvZGVVUklDb21wb25lbnQoYHRpdGxlPUAke2lucHV0fWApO1xuXG4gICAgZmV0Y2goYnVpbGRBUElCYXNlVXJsKGAke2Jhc2VVcmx9P2ZpbHRlcj0ke2ZpbHRlcn0mb3JkZXI9dGl0bGUmYWNjZXNzX3Rva2VuPSR7YWNjZXNzVG9rZW59YCkpXG4gICAgICAgIC50aGVuKGZldGNoUmVzcG9uc2VIYW5kbGVyKVxuICAgICAgICAudGhlbigoanNvbikgPT4ge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBbLi4uanNvbi5kYXRhXTtcblxuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59LCBjYWxsRGVsYXkpO1xuXG5leHBvcnQgY29uc3QgcXVlcnlFdmVudFR5cGVzID0gXy5kZWJvdW5jZShhc3luYyAoc3VtbWl0SWQsIGlucHV0LCBjYWxsYmFjaywgZXZlbnRUeXBlQ2xhc3NOYW1lID0gbnVsbCkgPT4ge1xuICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcblxuICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuXG4gICAgbGV0IHVybCA9IGAvYXBpL3YxL3N1bW1pdHMvJHtzdW1taXRJZH0vZXZlbnQtdHlwZXM/b3JkZXI9bmFtZSZhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gO1xuXG4gICAgaWYgKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IGVuY29kZVVSSUNvbXBvbmVudChgbmFtZT1AJHtpbnB1dH1gKTtcbiAgICAgICAgdXJsICs9IGAmZmlsdGVyW109JHtmaWx0ZXJ9YFxuICAgIH1cblxuICAgIGlmIChldmVudFR5cGVDbGFzc05hbWUpIHtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gZW5jb2RlVVJJQ29tcG9uZW50KGBjbGFzc19uYW1lPT0ke2V2ZW50VHlwZUNsYXNzTmFtZX1gKTtcbiAgICAgICAgdXJsICs9IGAmZmlsdGVyW109JHtmaWx0ZXJ9YFxuICAgIH1cblxuICAgIGZldGNoKGJ1aWxkQVBJQmFzZVVybCh1cmwpKVxuICAgICAgICAudGhlbihmZXRjaFJlc3BvbnNlSGFuZGxlcilcbiAgICAgICAgLnRoZW4oKGpzb24pID0+IHtcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gWy4uLmpzb24uZGF0YV07XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG9wdGlvbnMpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZmV0Y2hFcnJvckhhbmRsZXIpO1xufSwgY2FsbERlbGF5KTtcblxuXG5leHBvcnQgY29uc3QgcXVlcnlHcm91cHMgPSBfLmRlYm91bmNlKGFzeW5jIChpbnB1dCwgY2FsbGJhY2spID0+IHtcblxuICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICBsZXQgZmlsdGVycyA9IGVuY29kZVVSSUNvbXBvbmVudChgdGl0bGU9QCR7aW5wdXR9LGNvZGU9QCR7aW5wdXR9YCk7XG5cbiAgICBmZXRjaChidWlsZEFQSUJhc2VVcmwoYC9hcGkvdjEvZ3JvdXBzP2ZpbHRlcj0ke2ZpbHRlcnN9JmFjY2Vzc190b2tlbj0ke2FjY2Vzc1Rva2VufWApKVxuICAgICAgICAudGhlbihmZXRjaFJlc3BvbnNlSGFuZGxlcilcbiAgICAgICAgLnRoZW4oKGpzb24pID0+IHtcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gWy4uLmpzb24uZGF0YV07XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG9wdGlvbnMpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZmV0Y2hFcnJvckhhbmRsZXIpO1xufSwgY2FsbERlbGF5KTtcblxuXG5cbmV4cG9ydCBjb25zdCBxdWVyeUNvbXBhbmllcyA9IF8uZGVib3VuY2UoYXN5bmMgKGlucHV0LCBjYWxsYmFjaykgPT4ge1xuXG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuICAgIGxldCBmaWx0ZXJzID0gZW5jb2RlVVJJQ29tcG9uZW50KGBuYW1lPUAke2lucHV0fWApO1xuXG4gICAgZmV0Y2goYnVpbGRBUElCYXNlVXJsKGAvYXBpL3YxL2NvbXBhbmllcz9maWx0ZXI9JHtmaWx0ZXJzfSZhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gKSlcbiAgICAgICAgLnRoZW4oZmV0Y2hSZXNwb25zZUhhbmRsZXIpXG4gICAgICAgIC50aGVuKChqc29uKSA9PiB7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IFsuLi5qc29uLmRhdGFdO1xuXG4gICAgICAgICAgICBjYWxsYmFjayhvcHRpb25zKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZldGNoRXJyb3JIYW5kbGVyKTtcbn0sIGNhbGxEZWxheSk7XG5cbmV4cG9ydCBjb25zdCBxdWVyeVJlZ2lzdHJhdGlvbkNvbXBhbmllcyA9IF8uZGVib3VuY2UoYXN5bmMgKHN1bW1pdElkLCBpbnB1dCwgY2FsbGJhY2spID0+IHtcblxuICAgIGxldCBhY2Nlc3NUb2tlbjtcblxuICAgIHRyeSB7XG4gICAgICAgIGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhbGxiYWNrKGUpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGFwaVVybCA9IFVSSShgL2FwaS92MS9zdW1taXRzLyR7c3VtbWl0SWR9L3JlZ2lzdHJhdGlvbi1jb21wYW5pZXNgKTtcbiAgICBhcGlVcmwuYWRkUXVlcnkoJ2FjY2Vzc190b2tlbicsIGFjY2Vzc1Rva2VuKTtcbiAgICBhcGlVcmwuYWRkUXVlcnkoJ29yZGVyJywnbmFtZScpXG5cbiAgICBpZihpbnB1dCkge1xuICAgICAgICBpbnB1dCA9IGVzY2FwZUZpbHRlclZhbHVlKGlucHV0KTtcbiAgICAgICAgYXBpVXJsLmFkZFF1ZXJ5KCdmaWx0ZXJbXScsIGBuYW1lQEAke2lucHV0fWApO1xuICAgIH1cblxuICAgIGZldGNoKGJ1aWxkQVBJQmFzZVVybChhcGlVcmwudG9TdHJpbmcoKSkpXG4gICAgICAgIC50aGVuKGZldGNoUmVzcG9uc2VIYW5kbGVyKVxuICAgICAgICAudGhlbigoanNvbikgPT4ge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBbLi4uanNvbi5kYXRhXTtcblxuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59LCBjYWxsRGVsYXkpO1xuXG5cbmV4cG9ydCBjb25zdCBxdWVyeVNwb25zb3JzID0gXy5kZWJvdW5jZShhc3luYyAoc3VtbWl0SWQsIGlucHV0LCBjYWxsYmFjaykgPT4ge1xuXG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuICAgIGxldCBmaWx0ZXJzID0gZW5jb2RlVVJJQ29tcG9uZW50KGBjb21wYW55X25hbWU9QCR7aW5wdXR9YCk7XG5cbiAgICBmZXRjaChidWlsZEFQSUJhc2VVcmwoYC9hcGkvdjEvc3VtbWl0cy8ke3N1bW1pdElkfS9zcG9uc29ycz9maWx0ZXI9JHtmaWx0ZXJzfSZleHBhbmQ9Y29tcGFueSxzcG9uc29yc2hpcCZhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gKSlcbiAgICAgICAgLnRoZW4oZmV0Y2hSZXNwb25zZUhhbmRsZXIpXG4gICAgICAgIC50aGVuKChqc29uKSA9PiB7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IFsuLi5qc29uLmRhdGFdO1xuXG4gICAgICAgICAgICBjYWxsYmFjayhvcHRpb25zKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZldGNoRXJyb3JIYW5kbGVyKTtcbn0sIGNhbGxEZWxheSk7XG5cbmV4cG9ydCBjb25zdCBxdWVyeUFjY2Vzc0xldmVscyA9IF8uZGVib3VuY2UoYXN5bmMgKHN1bW1pdElkLCBpbnB1dCwgY2FsbGJhY2spID0+IHtcblxuICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICBpbnB1dCA9IGVzY2FwZUZpbHRlclZhbHVlKGlucHV0KTtcbiAgICBsZXQgZmlsdGVycyA9IGVuY29kZVVSSUNvbXBvbmVudChgbmFtZT1AJHtpbnB1dH1gKTtcblxuICAgIGZldGNoKGJ1aWxkQVBJQmFzZVVybChgL2FwaS92MS9zdW1taXRzLyR7c3VtbWl0SWR9L2FjY2Vzcy1sZXZlbC10eXBlcz9maWx0ZXI9JHtmaWx0ZXJzfSYmYWNjZXNzX3Rva2VuPSR7YWNjZXNzVG9rZW59YCkpXG4gICAgICAgIC50aGVuKGZldGNoUmVzcG9uc2VIYW5kbGVyKVxuICAgICAgICAudGhlbigoanNvbikgPT4ge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBbLi4uanNvbi5kYXRhXTtcblxuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59LCBjYWxsRGVsYXkpO1xuXG5leHBvcnQgY29uc3QgcXVlcnlPcmdhbml6YXRpb25zID0gXy5kZWJvdW5jZShhc3luYyAoaW5wdXQsIGNhbGxiYWNrKSA9PiB7XG5cbiAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IGF3YWl0IGdldEFjY2Vzc1Rva2VuKCk7XG4gICAgaW5wdXQgPSBlc2NhcGVGaWx0ZXJWYWx1ZShpbnB1dCk7XG4gICAgbGV0IGZpbHRlcnMgPSBlbmNvZGVVUklDb21wb25lbnQoYG5hbWU9QCR7aW5wdXR9YCk7XG5cbiAgICBmZXRjaChidWlsZEFQSUJhc2VVcmwoYC9hcGkvdjEvb3JnYW5pemF0aW9ucz9maWx0ZXI9JHtmaWx0ZXJzfSZhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gKSlcbiAgICAgICAgLnRoZW4oZmV0Y2hSZXNwb25zZUhhbmRsZXIpXG4gICAgICAgIC50aGVuKChqc29uKSA9PiB7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IFsuLi5qc29uLmRhdGFdO1xuXG4gICAgICAgICAgICBjYWxsYmFjayhvcHRpb25zKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZldGNoRXJyb3JIYW5kbGVyKTtcbn0sIGNhbGxEZWxheSk7XG5cblxuZXhwb3J0IGNvbnN0IGdldExhbmd1YWdlTGlzdCA9IChjYWxsYmFjaywgc2lnbmFsKSA9PiB7XG4gICAgcmV0dXJuIGZldGNoKGJ1aWxkQVBJQmFzZVVybChgL2FwaS9wdWJsaWMvdjEvbGFuZ3VhZ2VzYCksIHtzaWduYWx9KVxuICAgICAgICAudGhlbihmZXRjaFJlc3BvbnNlSGFuZGxlcilcbiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayhyZXNwb25zZS5kYXRhKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZldGNoRXJyb3JIYW5kbGVyKTtcbn07XG5cblxuZXhwb3J0IGNvbnN0IGdldENvdW50cnlMaXN0ID0gKGNhbGxiYWNrLCBzaWduYWwpID0+IHtcblxuICAgIHJldHVybiBmZXRjaChidWlsZEFQSUJhc2VVcmwoYC9hcGkvcHVibGljL3YxL2NvdW50cmllc2ApLCB7c2lnbmFsfSlcbiAgICAgICAgLnRoZW4oZmV0Y2hSZXNwb25zZUhhbmRsZXIpXG4gICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2socmVzcG9uc2UuZGF0YSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59O1xuXG52YXIgZ2VvY29kZXI7XG5cbmV4cG9ydCBjb25zdCBnZW9Db2RlQWRkcmVzcyA9IChhZGRyZXNzKSA9PiB7XG5cbiAgICBpZiAoIWdlb2NvZGVyKSBnZW9jb2RlciA9IG5ldyBnb29nbGUubWFwcy5HZW9jb2RlcigpO1xuXG4gICAgLy8gcmV0dXJuIGEgUHJvbWlzZVxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLHJlamVjdCkge1xuICAgICAgICBnZW9jb2Rlci5nZW9jb2RlKCB7ICdhZGRyZXNzJzogYWRkcmVzc30sIGZ1bmN0aW9uKHJlc3VsdHMsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBnb29nbGUubWFwcy5HZW9jb2RlclN0YXR1cy5PSykge1xuICAgICAgICAgICAgICAgIC8vIHJlc29sdmUgcmVzdWx0cyB1cG9uIGEgc3VjY2Vzc2Z1bCBzdGF0dXNcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdHMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyByZWplY3Qgc3RhdHVzIHVwb24gdW4tc3VjY2Vzc2Z1bCBzdGF0dXNcbiAgICAgICAgICAgICAgICByZWplY3Qoc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2VvQ29kZUxhdExuZyA9IChsYXQsIGxuZykgPT4ge1xuXG4gICAgaWYgKCFnZW9jb2RlcikgZ2VvY29kZXIgPSBuZXcgZ29vZ2xlLm1hcHMuR2VvY29kZXIoKTtcblxuICAgIHZhciBsYXRsbmcgPSB7bGF0OiBwYXJzZUZsb2F0KGxhdCksIGxuZzogcGFyc2VGbG9hdChsbmcpfTtcbiAgICAvLyByZXR1cm4gYSBQcm9taXNlXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KSB7XG4gICAgICAgIGdlb2NvZGVyLmdlb2NvZGUoIHsgJ2xvY2F0aW9uJzogbGF0bG5nfSwgZnVuY3Rpb24ocmVzdWx0cywgc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzID09IGdvb2dsZS5tYXBzLkdlb2NvZGVyU3RhdHVzLk9LKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVzb2x2ZSByZXN1bHRzIHVwb24gYSBzdWNjZXNzZnVsIHN0YXR1c1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0cyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHJlamVjdCBzdGF0dXMgdXBvbiB1bi1zdWNjZXNzZnVsIHN0YXR1c1xuICAgICAgICAgICAgICAgIHJlamVjdChzdGF0dXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cblxuZXhwb3J0IGNvbnN0IHF1ZXJ5VGlja2V0VHlwZXMgPSBfLmRlYm91bmNlKGFzeW5jIChzdW1taXRJZCwgZmlsdGVycyA9IHt9LCBjYWxsYmFjaywgdmVyc2lvbiA9ICd2MScpID0+IHtcblxuICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcblxuICAgIGxldCBhcGlVcmwgPSBVUkkoYC9hcGkvJHt2ZXJzaW9ufS9zdW1taXRzLyR7c3VtbWl0SWR9L3RpY2tldC10eXBlc2ApO1xuICAgIGFwaVVybC5hZGRRdWVyeSgnYWNjZXNzX3Rva2VuJywgYWNjZXNzVG9rZW4pO1xuICAgIGFwaVVybC5hZGRRdWVyeSgnb3JkZXInLCduYW1lJylcblxuICAgIGlmKGZpbHRlcnMuaGFzT3duUHJvcGVydHkoJ25hbWUnKSkge1xuICAgICAgICBjb25zdCBuYW1lID0gZXNjYXBlRmlsdGVyVmFsdWUoZmlsdGVycy5uYW1lKTtcbiAgICAgICAgYXBpVXJsLmFkZFF1ZXJ5KCdmaWx0ZXJbXScsIGBuYW1lQEAke25hbWV9YCk7XG4gICAgfVxuXG4gICAgaWYoZmlsdGVycy5oYXNPd25Qcm9wZXJ0eSgnYXVkaWVuY2UnKSl7XG4gICAgICAgIGNvbnN0IGF1ZGllbmNlID0gZXNjYXBlRmlsdGVyVmFsdWUoZmlsdGVycy5hdWRpZW5jZSk7XG4gICAgICAgIGFwaVVybC5hZGRRdWVyeSgnZmlsdGVyW10nLCBgYXVkaWVuY2U9PSR7YXVkaWVuY2V9YCk7XG4gICAgfVxuXG4gICAgZmV0Y2goYnVpbGRBUElCYXNlVXJsKGFwaVVybC50b1N0cmluZygpKSlcbiAgICAgICAgLnRoZW4oZmV0Y2hSZXNwb25zZUhhbmRsZXIpXG4gICAgICAgIC50aGVuKChqc29uKSA9PiB7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IFsuLi5qc29uLmRhdGFdO1xuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59LCBjYWxsRGVsYXkpO1xuXG5cbmV4cG9ydCBjb25zdCBxdWVyeVNwb25zb3JlZFByb2plY3RzID0gXy5kZWJvdW5jZShhc3luYyAoaW5wdXQsIGNhbGxiYWNrKSA9PiB7XG5cbiAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IGF3YWl0IGdldEFjY2Vzc1Rva2VuKCk7XG4gICAgY29uc3QgYXBpVXJsID0gVVJJKGAvYXBpL3YxL3Nwb25zb3JlZC1wcm9qZWN0c2ApO1xuICAgIGFwaVVybC5hZGRRdWVyeSgnYWNjZXNzX3Rva2VuJywgYWNjZXNzVG9rZW4pO1xuICAgIGlmKGlucHV0KSB7XG4gICAgICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuICAgICAgICBhcGlVcmwuYWRkUXVlcnkoJ2ZpbHRlcltdJywgYG5hbWU9QCR7aW5wdXR9YCk7XG4gICAgfVxuXG4gICAgZmV0Y2goYnVpbGRBUElCYXNlVXJsKGFwaVVybC50b1N0cmluZygpKSlcbiAgICAgICAgLnRoZW4oZmV0Y2hSZXNwb25zZUhhbmRsZXIpXG4gICAgICAgIC50aGVuKChqc29uKSA9PiB7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IFsuLi5qc29uLmRhdGFdO1xuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59LCBjYWxsRGVsYXkpO1xuXG5cbmV4cG9ydCBjb25zdCBxdWVyeVByb21vY29kZXMgPSBfLmRlYm91bmNlKGFzeW5jIChzdW1taXRJZCwgaW5wdXQsIGNhbGxiYWNrKSA9PiB7XG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuICAgIGxldCBmaWx0ZXJzID0gZW5jb2RlVVJJQ29tcG9uZW50KGBjb2RlPUAke2lucHV0fWApO1xuXG4gICAgZmV0Y2goYnVpbGRBUElCYXNlVXJsKGAvYXBpL3YxL3N1bW1pdHMvJHtzdW1taXRJZH0vcHJvbW8tY29kZXM/ZmlsdGVyPSR7ZmlsdGVyc30mYWNjZXNzX3Rva2VuPSR7YWNjZXNzVG9rZW59YCkpXG4gICAgICAgIC50aGVuKGZldGNoUmVzcG9uc2VIYW5kbGVyKVxuICAgICAgICAudGhlbigoanNvbikgPT4ge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBbLi4uanNvbi5kYXRhXTtcblxuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59LCBjYWxsRGVsYXkpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJicm93c2VyLXRhYnMtbG9ja1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjcnlwdG8tanMvZW5jLWJhc2U2NHVybFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjcnlwdG8tanMvZW5jLWhleFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjcnlwdG8tanMvc2hhMjU2XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImkxOG4tcmVhY3QvZGlzdC9pMThuLXJlYWN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImlkdG9rZW4tdmVyaWZpZXJcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm1vbWVudC10aW1lem9uZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdC1zZWxlY3RcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwic3VwZXJhZ2VudC9saWIvY2xpZW50XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInN3ZWV0YWxlcnQyXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInVyaWpzXCIpOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE3IE9wZW5TdGFjayBGb3VuZGF0aW9uXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiovXG5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRHJvcGRvd24gZnJvbSAnLi9kcm9wZG93bic7XG5pbXBvcnQge2dldENvdW50cnlMaXN0fSBmcm9tICcuLi8uLi91dGlscy9xdWVyeS1hY3Rpb25zJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ291bnRyeURyb3Bkb3duIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgb3B0aW9uczogW11cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZSA9IHRoaXMuaGFuZGxlQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2V0T3B0aW9ucyA9IHRoaXMuc2V0T3B0aW9ucy5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgICAgIGxldCB7b3B0aW9uc30gPSB0aGlzLnN0YXRlO1xuXG4gICAgICAgIGlmKG9wdGlvbnMubGVuZ3RoID09IDApe1xuICAgICAgICAgICAgZ2V0Q291bnRyeUxpc3QodGhpcy5zZXRPcHRpb25zLCB0aGlzLmFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKXtcbiAgICAgICAgdGhpcy5hYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICB9XG5cbiAgICBoYW5kbGVDaGFuZ2UodmFsdWUpIHtcblxuICAgICAgICBsZXQgZXYgPSB7dGFyZ2V0OiB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMucHJvcHMuaWQsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdjb3VudHJ5ZGRsJ1xuICAgICAgICAgICAgfX07XG5cbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZShldik7XG4gICAgfVxuXG4gICAgc2V0T3B0aW9ucyhyZXNwb25zZSkge1xuICAgICAgICBsZXQgY291bnRyeUxpc3QgPSByZXNwb25zZS5tYXAoYyA9PiAoe2xhYmVsOiBjLm5hbWUsIHZhbHVlOiBjLmlzb19jb2RlfSkpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtvcHRpb25zOiBjb3VudHJ5TGlzdH0pO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcblxuICAgICAgICBsZXQge29wdGlvbnN9ID0gdGhpcy5zdGF0ZTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPERyb3Bkb3duIG9wdGlvbnM9e29wdGlvbnN9IHsuLi50aGlzLnByb3BzfSAvPlxuICAgICAgICApO1xuXG4gICAgfVxufVxuIl0sIm5hbWVzIjpbIlJlYWN0IiwiU2VsZWN0IiwiRHJvcGRvd24iLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiaGFuZGxlQ2hhbmdlIiwiYmluZCIsInNlbGVjdGlvbiIsInZhbHVlIiwiaXNNdWx0aSIsIm1hcCIsInZhbCIsImV2IiwidGFyZ2V0IiwiaWQiLCJ0eXBlIiwib25DaGFuZ2UiLCJyZW5kZXIiLCJjbGFzc05hbWUiLCJlcnJvciIsImNsZWFyYWJsZSIsImRpc2FibGVkIiwib3ZlcnJpZGVDU1MiLCJhcmlhTGFiZWxsZWRCeSIsInJlc3QiLCJoYXNfZXJyb3IiLCJoYXNPd25Qcm9wZXJ0eSIsImlzQ2xlYXJhYmxlIiwiaXNEaXNhYmxlZCIsInRoZVZhbHVlIiwic2VsZWN0Q2xhc3NOYW1lIiwib3B0aW9ucyIsImZpbHRlciIsIm9wIiwiaW5jbHVkZXMiLCJPYmplY3QiLCJmaW5kIiwib3B0Iiwic2VsZWN0U3R5bGVzIiwibWVudSIsInN0eWxlcyIsInpJbmRleCIsImRlZmF1bHRQcm9wcyIsIlQiLCJhdXRoRXJyb3JIYW5kbGVyIiwiY3JlYXRlQWN0aW9uIiwiZ2V0UmVxdWVzdCIsInNob3dNZXNzYWdlIiwic3RhcnRMb2FkaW5nIiwic3RvcExvYWRpbmciLCJidWlsZEFQSUJhc2VVcmwiLCJnZXRBbGxvd2VkVXNlckdyb3VwcyIsImdldEFjY2Vzc1Rva2VuIiwic3RvcmVBdXRoSW5mbyIsImluaXRMb2dPdXQiLCJTRVRfTE9HR0VEX1VTRVIiLCJMT0dPVVRfVVNFUiIsIlJFUVVFU1RfVVNFUl9JTkZPIiwiUkVDRUlWRV9VU0VSX0lORk8iLCJDTEVBUl9TRVNTSU9OX1NUQVRFIiwiVVBEQVRFX1NFU1NJT05fU1RBVEVfU1RBVFVTIiwiU0VTU0lPTl9TVEFURV9TVEFUVVNfVU5DSEFOR0VEIiwiU0VTU0lPTl9TVEFURV9TVEFUVVNfQ0hBTkdFRCIsIlNFU1NJT05fU1RBVEVfU1RBVFVTX0VSUk9SIiwiVVBEQVRFX1VTRVJfSU5GTyIsIm9uVXNlckF1dGgiLCJhY2Nlc3NUb2tlbiIsImlkVG9rZW4iLCJzZXNzaW9uU3RhdGUiLCJleHBpcmVzSW4iLCJyZWZyZXNoVG9rZW4iLCJkaXNwYXRjaCIsInBheWxvYWQiLCJkb0xvZ291dCIsImJhY2tVcmwiLCJnZXRTdGF0ZSIsImdldFVzZXJJbmZvIiwiZXhwYW5kIiwiZmllbGRzIiwiaGlzdG9yeSIsImVycm9ySGFuZGxlciIsIkFsbG93ZWRVc2VyR3JvdXBzIiwic3BsaXQiLCJsb2dnZWRVc2VyU3RhdGUiLCJtZW1iZXIiLCJwdXNoIiwiUHJvbWlzZSIsInJlc29sdmUiLCJwYXJhbXMiLCJhY2Nlc3NfdG9rZW4iLCJ0aGVuIiwiZXJyb3JfbWVzc2FnZSIsInRpdGxlIiwiaHRtbCIsInRyYW5zbGF0ZSIsImxlbmd0aCIsImFsbG93ZWRHcm91cHMiLCJncm91cHMiLCJncm91cCIsImlkeCIsImNvZGUiLCJ1cGRhdGVVc2VySW5mbyIsInVwZGF0ZWRNZW1iZXIiLCJFcnJvciIsInVwZGF0ZVNlc3Npb25TdGF0ZVN0YXR1cyIsIm5ld1N0YXR1cyIsInNlc3Npb25TdGF0ZVN0YXR1cyIsIkFVVEhfRVJST1JfTUlTU0lOR19BVVRIX0lORk8iLCJBVVRIX0VSUk9SX01JU1NJTkdfUkVGUkVTSF9UT0tFTiIsIkFVVEhfRVJST1JfQUNDRVNTX1RPS0VOX0VYUElSRUQiLCJBVVRIX0VSUk9SX0xPQ0tfQUNRVUlSRV9FUlJPUiIsIkFVVEhfRVJST1JfUkVGUkVTSF9UT0tFTl9SRVFVRVNUX0VSUk9SIiwiQVVUSF9FUlJPUl9JRF9UT0tFTl9JTlZBTElEIiwiQVVUSF9FUlJPUl9NSVNTSU5HX09UUF9QQVJBTSIsImJhc2U2NFVSTEVuY29kZSIsImdldEF1dGhDYWxsYmFjayIsImdldEN1cnJlbnRMb2NhdGlvbiIsImdldEN1cnJlbnRQYXRoTmFtZSIsImdldEZyb21Mb2NhbFN0b3JhZ2UiLCJyZW1vdmVGcm9tTG9jYWxTdG9yYWdlIiwiZ2V0T3JpZ2luIiwicHV0T25Mb2NhbFN0b3JhZ2UiLCJyZXRyeVByb21pc2UiLCJzZXRTZXNzaW9uQ2xlYXJpbmdTdGF0ZSIsInJlcXVlc3QiLCJMb2NrIiwiaHR0cCIsImxvY2siLCJHRVRfVE9LRU5fU0lMRU5UTFlfTE9DS19LRVkiLCJOT05DRV9MRU4iLCJBQ0NFU1NfVE9LRU5fU0tFV19USU1FIiwiUkVTUE9OU0VfVFlQRV9JTVBMSUNJVCIsIlJFU1BPTlNFX1RZUEVfQ09ERSIsIkFVVEhfSU5GTyIsIk5PTkNFIiwiUEtDRSIsIlVSSSIsIklkVG9rZW5WZXJpZmllciIsImdldFJhbmRvbUJ5dGVzIiwiZ2V0U0hBMjU2IiwiZ2V0QXV0aFVybCIsInByb21wdCIsInRva2VuSWRIaW50IiwicHJvdmlkZXIiLCJsb2dpbkhpbnQiLCJvdHBMb2dpbkhpbnQiLCJvYXV0aDJDbGllbnRJZCIsImdldE9BdXRoMkNsaWVudElkIiwicmVkaXJlY3RVcmkiLCJiYXNlVXJsIiwiZ2V0T0F1dGgySURQQmFzZVVybCIsInNjb3BlcyIsImdldE9BdXRoMlNjb3BlcyIsImZsb3ciLCJnZXRPQXV0aDJGbG93IiwiZW5jb2RlVVJJIiwibm9uY2UiLCJjcmVhdGVOb25jZSIsInVybCIsInF1ZXJ5IiwicGtjZSIsImNyZWF0ZVBLQ0VDb2RlcyIsIkpTT04iLCJzdHJpbmdpZnkiLCJjb2RlQ2hhbGxlbmdlIiwiZ2V0TG9nb3V0VXJsIiwic3RhdGUiLCJwb3N0TG9nT3V0VXJpIiwibGVuIiwicG9zc2libGUiLCJpIiwiY2hhckF0IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwiZG9Mb2dpbiIsImxvY2F0aW9uIiwicmVwbGFjZSIsInRvU3RyaW5nIiwiZG9Mb2dpbkJhc2ljTG9naW4iLCJjb2RlVmVyaWZpZXIiLCJjcmVhdGVkQXQiLCJEYXRlIiwiY29kZVBhaXIiLCJlbWl0QWNjZXNzVG9rZW4iLCJwYXJzZSIsInJlc3BvbnNlIiwiZmV0Y2giLCJtZXRob2QiLCJoZWFkZXJzIiwiYm9keSIsImNhdGNoIiwiY29uc29sZSIsImxvZyIsIm1lc3NhZ2UiLCJqc29uIiwicmVmcmVzaF90b2tlbiIsImlkX3Rva2VuIiwiZXhwaXJlc19pbiIsImVycm9yX2Rlc2NyaXB0aW9uIiwiZXJyIiwiY2xlYXJBY2Nlc3NUb2tlbiIsImFjcXVpcmVMb2NrIiwiYXV0aEluZm8iLCJnZXRBdXRoSW5mbyIsImFjY2Vzc1Rva2VuVXBkYXRlZEF0IiwicmVsZWFzZUxvY2siLCJub3ciLCJ0aW1lRWxhcHNlZFNlY3MiLCJ1c2VPQXV0aDJSZWZyZXNoVG9rZW4iLCJjbGVhckF1dGhJbmZvIiwicmVmcmVzaEFjY2Vzc1Rva2VuIiwic3RhdHVzIiwiY3VycmVudExvY2F0aW9uIiwic3RhdHVzVGV4dCIsImZvcm1lckF1dGhJbmZvIiwicmVzIiwid2luZG93IiwiZ2V0SWRUb2tlbiIsIk9BVVRIMl9DTElFTlRfSUQiLCJPQVVUSDJfRkxPVyIsIkJvb2xlYW4iLCJPQVVUSDJfVVNFX1JFRlJFU0hfVE9LRU4iLCJJRFBfQkFTRV9VUkwiLCJTQ09QRVMiLCJ2YWxpZGF0ZUlkVG9rZW4iLCJpc3N1ZXIiLCJhdWRpZW5jZSIsInZlcmlmaWVyIiwic3RvcmVkTm9uY2UiLCJqd3QiLCJkZWNvZGUiLCJhbGciLCJoZWFkZXIiLCJraWQiLCJhdWQiLCJpc3MiLCJleHAiLCJuYmYiLCJ0bm9uY2UiLCJwYXNzd29yZGxlc3NTdGFydCIsImNvbm5lY3Rpb24iLCJzZW5kIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZW1haWwiLCJwaG9uZV9udW1iZXIiLCJyZWRpcmVjdF91cmkiLCJyZXEiLCJwb3N0IiwicmVqZWN0IiwicGFzc3dvcmRsZXNzTG9naW4iLCJvdHAiLCJlIiwiaXNJZFRva2VuQWxpdmUiLCJub3dFcG9jaCIsIlN3YWwiLCJpc0NsZWFyaW5nU2Vzc2lvblN0YXRlIiwiR0VORVJJQ19FUlJPUiIsIlJFU0VUX0xPQURJTkciLCJTVEFSVF9MT0FESU5HIiwiU1RPUF9MT0FESU5HIiwiVkFMSURBVEUiLCJDTEVBUl9NRVNTQUdFIiwiU0hPV19NRVNTQUdFIiwicmVzZXRMb2FkaW5nIiwieGhycyIsImV0YWdDYWNoZSIsImNhbmNlbCIsImtleSIsImFib3J0Iiwic2NoZWR1bGUiLCJpc09iamVjdEVtcHR5Iiwib2JqIiwia2V5cyIsIm1zZyIsImNsZWFyaW5nX3Nlc3Npb25fc3RhdGUiLCJmaXJlIiwiZW50cmllcyIsImVycm9ycyIsImlzTmFOIiwicmVxdWVzdEFjdGlvbkNyZWF0b3IiLCJyZWNlaXZlQWN0aW9uQ3JlYXRvciIsImVuZHBvaW50IiwiZGVmYXVsdEVycm9ySGFuZGxlciIsInJlcXVlc3RBY3Rpb25QYXlsb2FkIiwidXNlRXRhZyIsIl8iLCJuZXdQYXJhbXMiLCJnZXQiLCJldGFnIiwic2V0IiwidGltZW91dCIsImRlYWRsaW5lIiwiZW5kIiwicmVzcG9uc2VIYW5kbGVyIiwicHV0UmVxdWVzdCIsInB1dCIsImRlbGV0ZVJlcXVlc3QiLCJkZWxldGUiLCJwb3N0UmVxdWVzdCIsInBvc3RGaWxlIiwiZmlsZSIsImZpbGVNZXRhZGF0YSIsImF0dGFjaCIsImZvckVhY2giLCJmaWVsZCIsInB1dEZpbGUiLCJ0ZXh0IiwiYnlMb3dlckNhc2UiLCJ0b0ZpbmQiLCJ0b0xvd2VyQ2FzZSIsImdldEtleXMiLCJnZXRIZWFkZXJDYXNlSW5zZW5zaXRpdmUiLCJoZWFkZXJOYW1lIiwidW5kZWZpbmVkIiwib2siLCJyZXNwb25zZUVUQUciLCJmZXRjaEVycm9ySGFuZGxlciIsImZldGNoUmVzcG9uc2VIYW5kbGVyIiwic2V0dGluZ3MiLCJjYWxsYmFjayIsInJlc3VsdCIsInNob3dTdWNjZXNzTWVzc2FnZSIsImRvd25sb2FkRmlsZUJ5Q29udGVudCIsImZpbGVuYW1lIiwiY29udGVudCIsIm1pbWUiLCJsaW5rIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwidGV4dENvbnRlbnQiLCJkb3dubG9hZCIsImhyZWYiLCJhcHBlbmRDaGlsZCIsImNsaWNrIiwicmVtb3ZlQ2hpbGQiLCJnZXRDU1YiLCJjc3YiLCJnZXRSYXdDU1YiLCJlc2NhcGVGaWx0ZXJWYWx1ZSIsIk1BWF9CWVRFUyIsIk1BWF9VSU5UMzIiLCJjcnlwdG8iLCJtc0NyeXB0byIsInNoYTI1NiIsIkJhc2U2NHVybCIsIkhleCIsInNpemUiLCJSYW5nZUVycm9yIiwiYnl0ZXMiLCJCdWZmZXIiLCJhbGxvY1Vuc2FmZSIsImEiLCJnZW5lcmF0ZWQiLCJnZXRSYW5kb21WYWx1ZXMiLCJzbGljZSIsImZvcm1hdCIsImYiLCJtb21lbnQiLCJmaW5kRWxlbWVudFBvcyIsImN1cnRvcCIsIm9mZnNldFBhcmVudCIsIm9mZnNldFRvcCIsImVwb2NoVG9Nb21lbnQiLCJhdGltZSIsImVwb2NoVG9Nb21lbnRUaW1lWm9uZSIsInRpbWVfem9uZSIsInR6IiwiZm9ybWF0RXBvY2giLCJvYmplY3RUb1F1ZXJ5U3RyaW5nIiwic3RyIiwiZ2V0QmFja1VSTCIsInNlYXJjaCIsImZyYWdtZW50IiwidG9TbHVnIiwib3JpZ2luIiwidG9wIiwicGF0aG5hbWUiLCJnZXRDdXJyZW50SHJlZiIsIkFMTE9XRURfVVNFUl9HUk9VUFMiLCJyZWxhdGl2ZVVybCIsIkFQSV9CQVNFX1VSTCIsImxvY2FsU3RvcmFnZSIsInNldEl0ZW0iLCJyZW1vdmVJdCIsImdldEl0ZW0iLCJyZW1vdmVJdGVtIiwiZ2V0Q3VycmVudFVzZXJMYW5ndWFnZSIsImxhbmd1YWdlIiwibmF2aWdhdG9yIiwibGFuZ3VhZ2VzIiwidXNlckxhbmd1YWdlIiwic2Nyb2xsVG9FcnJvciIsImZpcnN0RXJyb3IiLCJmaXJzdE5vZGUiLCJnZXRFbGVtZW50QnlJZCIsInNjcm9sbFRvIiwiaGFzRXJyb3JzIiwic2hhbGxvd0VxdWFsIiwib2JqZWN0MSIsIm9iamVjdDIiLCJrZXlzMSIsImtleXMyIiwiYXJyYXlzRXF1YWwiLCJhMSIsImEyIiwiZXZlcnkiLCJvIiwiaXNFbXB0eSIsImNiIiwibWF4TnVtYmVyT2ZSZXRyaWVzIiwiZ2V0VGltZVNlcnZpY2VVcmwiLCJUSU1FSU5URVJWQUxTSU5DRTE5NzBfQVBJX1VSTCIsInByb2Nlc3MiLCJlbnYiLCJSRUNFSVZFX0NPVU5UUklFUyIsImNhbGxEZWxheSIsInF1ZXJ5TWVtYmVycyIsImRlYm91bmNlIiwiaW5wdXQiLCJmaWx0ZXJzIiwiZGF0YSIsInF1ZXJ5U3VtbWl0cyIsInF1ZXJ5U3BlYWtlcnMiLCJzdW1taXRJZCIsImFwaVVybCIsInF1ZXJ5VGFncyIsInQiLCJ0YWciLCJxdWVyeVRyYWNrcyIsInF1ZXJ5VHJhY2tHcm91cHMiLCJxdWVyeUV2ZW50cyIsIm9ubHlQdWJsaXNoZWQiLCJxdWVyeUV2ZW50VHlwZXMiLCJldmVudFR5cGVDbGFzc05hbWUiLCJxdWVyeUdyb3VwcyIsInF1ZXJ5Q29tcGFuaWVzIiwicXVlcnlSZWdpc3RyYXRpb25Db21wYW5pZXMiLCJhZGRRdWVyeSIsInF1ZXJ5U3BvbnNvcnMiLCJxdWVyeUFjY2Vzc0xldmVscyIsInF1ZXJ5T3JnYW5pemF0aW9ucyIsImdldExhbmd1YWdlTGlzdCIsInNpZ25hbCIsImdldENvdW50cnlMaXN0IiwiZ2VvY29kZXIiLCJnZW9Db2RlQWRkcmVzcyIsImFkZHJlc3MiLCJnb29nbGUiLCJtYXBzIiwiR2VvY29kZXIiLCJnZW9jb2RlIiwicmVzdWx0cyIsIkdlb2NvZGVyU3RhdHVzIiwiT0siLCJnZW9Db2RlTGF0TG5nIiwibGF0IiwibG5nIiwibGF0bG5nIiwicGFyc2VGbG9hdCIsInF1ZXJ5VGlja2V0VHlwZXMiLCJ2ZXJzaW9uIiwibmFtZSIsInF1ZXJ5U3BvbnNvcmVkUHJvamVjdHMiLCJxdWVyeVByb21vY29kZXMiLCJDb3VudHJ5RHJvcGRvd24iLCJzZXRPcHRpb25zIiwiYWJvcnRDb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwiY29tcG9uZW50RGlkTW91bnQiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsImNvdW50cnlMaXN0IiwiYyIsImxhYmVsIiwiaXNvX2NvZGUiLCJzZXRTdGF0ZSJdLCJzb3VyY2VSb290IjoiIn0=