single-scripture-rcl 3.4.2-beta → 3.4.3-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,27 +1,25 @@
1
1
  import "core-js/modules/es.array.concat.js";
2
2
  import "core-js/modules/es.array.every.js";
3
- import "core-js/modules/es.array.filter.js";
4
3
  import "core-js/modules/es.array.find-index.js";
4
+ import "core-js/modules/es.array.for-each.js";
5
5
  import "core-js/modules/es.array.includes.js";
6
6
  import "core-js/modules/es.array.is-array.js";
7
+ import "core-js/modules/es.array.iterator.js";
7
8
  import "core-js/modules/es.array.join.js";
8
9
  import "core-js/modules/es.array.map.js";
10
+ import "core-js/modules/es.map.js";
9
11
  import "core-js/modules/es.object.keys.js";
12
+ import "core-js/modules/es.object.to-string.js";
10
13
  import "core-js/modules/es.object.values.js";
11
14
  import "core-js/modules/es.parse-int.js";
12
15
  import "core-js/modules/es.regexp.exec.js";
13
16
  import "core-js/modules/es.string.includes.js";
17
+ import "core-js/modules/es.string.iterator.js";
14
18
  import "core-js/modules/es.string.split.js";
19
+ import "core-js/modules/web.dom-collections.for-each.js";
20
+ import "core-js/modules/web.dom-collections.iterator.js";
15
21
  import "regenerator-runtime/runtime.js";
16
22
 
17
- function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
18
-
19
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
20
-
21
- function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
22
-
23
- function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
24
-
25
23
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
26
24
 
27
25
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -30,6 +28,14 @@ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.it
30
28
 
31
29
  function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
32
30
 
31
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
32
+
33
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
34
+
35
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
36
+
37
+ function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
38
+
33
39
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
34
40
 
35
41
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
@@ -50,17 +56,22 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
50
56
 
51
57
  import * as React from 'react';
52
58
  import * as PropTypes from 'prop-types';
53
- import { core } from 'scripture-resources-rcl';
59
+ import { core, SelectionsContextProvider } from 'scripture-resources-rcl';
54
60
  import usfmjs from 'usfm-js';
55
61
  import { useEdit } from 'gitea-react-toolkit';
56
62
  import { IconButton } from '@mui/material';
57
63
  import { RxLink2, RxLinkBreak2 } from 'react-icons/rx';
58
- import { Card, useCardState, useUserBranch, useBranchMerger, useContentUpdateProps, useMasterMergeProps, UpdateBranchButton, ErrorDialog, ERROR_STATE, MANIFEST_NOT_LOADED_ERROR } from 'translation-helps-rcl';
64
+ import { Card, ERROR_STATE, MANIFEST_NOT_LOADED_ERROR, useCardState, useUserBranch } from 'translation-helps-rcl'; // @ts-ignore
65
+
66
+ import { getQuoteMatchesInBookRef } from 'uw-quote-helpers';
59
67
  import { AlignmentHelpers, UsfmFileConversionHelpers } from 'word-aligner-rcl';
60
68
  import * as isEqual from 'deep-equal';
69
+ import { getVerses } from 'bible-reference-range';
61
70
  import { ScripturePane, ScriptureSelector } from '..';
62
71
  import { useScriptureSettings } from '../../hooks/useScriptureSettings';
63
- import { getResourceLink, getResourceMessage, getScriptureVersionSettings, isOriginalBible } from '../../utils/ScriptureSettings';
72
+ import { cleanupVerseObjects, fixOccurrence, getResourceLink, getResourceMessage, getScriptureVersionSettings, isOriginalBible } from '../../utils/ScriptureSettings';
73
+ import { delay } from '../../utils/delay';
74
+ import { areMapsTheSame } from '../../utils/maps';
64
75
  import { Title } from '../ScripturePane/styled';
65
76
  import { NT_ORIG_LANG, ORIGINAL_SOURCE, OT_ORIG_LANG } from '../../utils';
66
77
  import { VerseSelectorPopup } from '../VerseSelectorPopup';
@@ -70,53 +81,102 @@ var style = {
70
81
  marginTop: '16px',
71
82
  width: '500px'
72
83
  };
73
- export default function ScriptureCard(_ref) {
74
- var _scriptureConfig$reso, _scriptureConfig$reso2, _scriptureConfig$reso3, _scriptureConfig$reso4, _authentication$token, _scriptureConfig$reso6, _scriptureConfig$reso7, _scriptureConfig$reso8, _httpConfig, _httpConfig2;
75
-
76
- var id = _ref.id,
77
- isNT = _ref.isNT,
78
- title = _ref.title,
79
- server = _ref.server,
80
- appRef = _ref.appRef,
81
- cardNum = _ref.cardNum,
82
- classes = _ref.classes,
83
- _ref$resource = _ref.resource,
84
- owner = _ref$resource.owner,
85
- languageId = _ref$resource.languageId,
86
- resourceId = _ref$resource.resourceId,
87
- originalLanguageOwner = _ref$resource.originalLanguageOwner,
88
- getLanguage = _ref.getLanguage,
89
- _ref$reference = _ref.reference,
90
- verse = _ref$reference.verse,
91
- chapter = _ref$reference.chapter,
92
- bookId = _ref$reference.projectId,
93
- resourceLink = _ref.resourceLink,
94
- useUserLocalStorage = _ref.useUserLocalStorage,
95
- disableWordPopover = _ref.disableWordPopover,
96
- onResourceError = _ref.onResourceError,
97
- httpConfig = _ref.httpConfig,
98
- greekRepoUrl = _ref.greekRepoUrl,
99
- hebrewRepoUrl = _ref.hebrewRepoUrl,
100
- getLexiconData = _ref.getLexiconData,
101
- fetchGlossesForVerse = _ref.fetchGlossesForVerse,
102
- translate = _ref.translate,
103
- onMinimize = _ref.onMinimize,
104
- loggedInUser = _ref.loggedInUser,
105
- authentication = _ref.authentication,
106
- setSavedChanges = _ref.setSavedChanges,
107
- bookIndex = _ref.bookIndex,
108
- addVerseRange = _ref.addVerseRange,
109
- setWordAlignerStatus = _ref.setWordAlignerStatus,
110
- updateMergeState = _ref.updateMergeState,
111
- setCardsLoadingUpdate = _ref.setCardsLoadingUpdate,
112
- setCardsLoadingMerge = _ref.setCardsLoadingMerge,
113
- setCardsSaving = _ref.setCardsSaving;
84
+ /**
85
+ * create a short comparison verse ref object without all the verseData
86
+ * @param verseRef
87
+ */
88
+
89
+ function compareObject(verseRef) {
90
+ var _verseData$verseObjec;
91
+
92
+ var _ref = verseRef || {},
93
+ chapter = _ref.chapter,
94
+ verse = _ref.verse,
95
+ verseData = _ref.verseData;
96
+
97
+ var verseObjects = (verseData === null || verseData === void 0 ? void 0 : (_verseData$verseObjec = verseData.verseObjects) === null || _verseData$verseObjec === void 0 ? void 0 : _verseData$verseObjec.length) || 0;
98
+ return {
99
+ chapter: chapter,
100
+ verse: verse,
101
+ verseObjects: verseObjects
102
+ };
103
+ }
104
+ /**
105
+ * compare two verse refs to see if they are substantially similar
106
+ * @param versesForRef1
107
+ * @param versesForRef2
108
+ */
109
+
110
+
111
+ function areVersesSame(versesForRef1, versesForRef2) {
112
+ versesForRef1 = versesForRef1 || [];
113
+ versesForRef2 = versesForRef2 || [];
114
+ var areSame = false;
115
+
116
+ if (versesForRef1.length === versesForRef2.length) {
117
+ areSame = true;
118
+
119
+ for (var i = 0, l = versesForRef1.length; i < l; i++) {
120
+ var verse1 = compareObject(versesForRef1[i]);
121
+ var verse2 = compareObject(versesForRef2[i]);
122
+ areSame = isEqual(verse1, verse2);
123
+
124
+ if (!areSame) {
125
+ break;
126
+ }
127
+ }
128
+ }
129
+
130
+ return areSame;
131
+ }
132
+
133
+ export default function ScriptureCard(_ref2) {
134
+ var _scriptureConfig$reso, _scriptureConfig$reso2, _scriptureConfig$reso3, _scriptureConfig$reso4, _scriptureConfig$reso6, _scriptureConfig$reso7, _scriptureConfig$reso8, _httpConfig, _httpConfig2, _versesForRef3, _versesForRef4;
135
+
136
+ var appRef = _ref2.appRef,
137
+ authentication = _ref2.authentication,
138
+ bookIndex = _ref2.bookIndex,
139
+ cardNum = _ref2.cardNum,
140
+ classes = _ref2.classes,
141
+ disableWordPopover = _ref2.disableWordPopover,
142
+ getLanguage = _ref2.getLanguage,
143
+ getLexiconData = _ref2.getLexiconData,
144
+ greekRepoUrl = _ref2.greekRepoUrl,
145
+ hebrewRepoUrl = _ref2.hebrewRepoUrl,
146
+ httpConfig = _ref2.httpConfig,
147
+ id = _ref2.id,
148
+ isNT = _ref2.isNT,
149
+ loggedInUser = _ref2.loggedInUser,
150
+ onMinimize = _ref2.onMinimize,
151
+ onResourceError = _ref2.onResourceError,
152
+ originalScriptureBookObjects = _ref2.originalScriptureBookObjects,
153
+ reference = _ref2.reference,
154
+ _ref2$resource = _ref2.resource,
155
+ owner = _ref2$resource.owner,
156
+ languageId = _ref2$resource.languageId,
157
+ resourceId = _ref2$resource.resourceId,
158
+ originalLanguageOwner = _ref2$resource.originalLanguageOwner,
159
+ resourceLink = _ref2.resourceLink,
160
+ selectedQuote = _ref2.selectedQuote,
161
+ server = _ref2.server,
162
+ setSavedChanges = _ref2.setSavedChanges,
163
+ setWordAlignerStatus = _ref2.setWordAlignerStatus,
164
+ translate = _ref2.translate,
165
+ title = _ref2.title,
166
+ useUserLocalStorage = _ref2.useUserLocalStorage;
167
+ var bookId = reference === null || reference === void 0 ? void 0 : reference.projectId;
114
168
 
115
169
  var _React$useState = React.useState({
170
+ checkForEditBranch: 0,
171
+ currentReference: null,
172
+ editBranchReady: false,
116
173
  haveUnsavedChanges: false,
174
+ lastSelectedQuote: null,
175
+ readyForFetch: false,
117
176
  ref: appRef,
118
177
  saveClicked: false,
119
178
  saveContent: null,
179
+ selections: new Map(),
120
180
  sha: null,
121
181
  startSave: false,
122
182
  urlError: null,
@@ -125,25 +185,33 @@ export default function ScriptureCard(_ref) {
125
185
  versesForRef: null,
126
186
  showAlignmentPopup: false,
127
187
  verseSelectedForAlignment: null,
128
- versesAlignmentStatus: null
188
+ versesAlignmentStatus: null,
189
+ verseObjectsMap: new Map()
129
190
  }),
130
191
  _React$useState2 = _slicedToArray(_React$useState, 2),
131
192
  state = _React$useState2[0],
132
193
  setState_ = _React$useState2[1];
133
194
 
134
- var ref = state.ref,
195
+ var checkForEditBranch = state.checkForEditBranch,
196
+ currentReference = state.currentReference,
197
+ editBranchReady = state.editBranchReady,
198
+ haveUnsavedChanges = state.haveUnsavedChanges,
199
+ lastSelectedQuote = state.lastSelectedQuote,
200
+ readyForFetch = state.readyForFetch,
201
+ ref = state.ref,
135
202
  saveClicked = state.saveClicked,
136
203
  saveContent = state.saveContent,
204
+ selections = state.selections,
137
205
  sha = state.sha,
206
+ showAlignmentPopup = state.showAlignmentPopup,
138
207
  startSave = state.startSave,
139
208
  urlError = state.urlError,
140
209
  usingUserBranch = state.usingUserBranch,
141
210
  unsavedChangesList = state.unsavedChangesList,
142
- haveUnsavedChanges = state.haveUnsavedChanges,
143
- versesForRef = state.versesForRef,
144
- showAlignmentPopup = state.showAlignmentPopup,
211
+ verseObjectsMap = state.verseObjectsMap,
145
212
  verseSelectedForAlignment = state.verseSelectedForAlignment,
146
- versesAlignmentStatus = state.versesAlignmentStatus;
213
+ versesAlignmentStatus = state.versesAlignmentStatus,
214
+ versesForRef = state.versesForRef;
147
215
 
148
216
  var _useUserLocalStorage = useUserLocalStorage(KEY_FONT_SIZE_BASE + cardNum, 100),
149
217
  _useUserLocalStorage2 = _slicedToArray(_useUserLocalStorage, 2),
@@ -162,34 +230,34 @@ export default function ScriptureCard(_ref) {
162
230
  httpConfig = _objectSpread(_objectSpread({}, httpConfig), {}, {
163
231
  cache: {
164
232
  maxAge: 0
165
- }
233
+ },
234
+ noCache: true
166
235
  }); // disable http caching
167
236
  }
168
237
 
169
238
  var _useScriptureSettings = useScriptureSettings({
170
239
  isNT: isNT,
171
240
  title: title,
172
- verse: verse,
173
241
  owner: owner,
174
- bookId: bookId,
242
+ reference: currentReference || reference,
175
243
  appRef: ref,
176
244
  server: server,
177
245
  cardNum: cardNum,
178
- chapter: chapter,
246
+ disableWordPopover: disableWordPopover,
247
+ greekRepoUrl: greekRepoUrl,
248
+ hebrewRepoUrl: hebrewRepoUrl,
249
+ httpConfig: httpConfig,
179
250
  languageId: languageId,
251
+ originalLanguageOwner: originalLanguageOwner,
252
+ readyForFetch: readyForFetch,
180
253
  resourceId: resourceId,
181
254
  resourceLink: resourceLink,
182
- useUserLocalStorage: useUserLocalStorage,
183
- disableWordPopover: disableWordPopover,
184
- originalLanguageOwner: originalLanguageOwner,
185
255
  setUrlError: function setUrlError(error) {
186
256
  return setState({
187
257
  urlError: error
188
258
  });
189
259
  },
190
- httpConfig: httpConfig,
191
- greekRepoUrl: greekRepoUrl,
192
- hebrewRepoUrl: hebrewRepoUrl,
260
+ useUserLocalStorage: useUserLocalStorage,
193
261
  wholeBook: true
194
262
  }),
195
263
  isNewTestament = _useScriptureSettings.isNewTestament,
@@ -203,14 +271,23 @@ export default function ScriptureCard(_ref) {
203
271
  var repo = "".concat(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso = scriptureConfig.resource) === null || _scriptureConfig$reso === void 0 ? void 0 : _scriptureConfig$reso.languageId, "_").concat(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso2 = scriptureConfig.resource) === null || _scriptureConfig$reso2 === void 0 ? void 0 : _scriptureConfig$reso2.projectId);
204
272
  var reference_ = (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.reference) || null;
205
273
  React.useEffect(function () {
206
- var _fetchResp_$data;
274
+ var _fetchResp_$data, _fetchResp_$data2;
207
275
 
208
276
  // get the _sha from last scripture download
209
277
  var _sha = (fetchResp_ === null || fetchResp_ === void 0 ? void 0 : (_fetchResp_$data = fetchResp_.data) === null || _fetchResp_$data === void 0 ? void 0 : _fetchResp_$data.sha) || null;
210
278
 
211
- console.log("for ".concat(JSON.stringify(reference_), " new sha is ").concat(_sha));
279
+ var url = (fetchResp_ === null || fetchResp_ === void 0 ? void 0 : (_fetchResp_$data2 = fetchResp_.data) === null || _fetchResp_$data2 === void 0 ? void 0 : _fetchResp_$data2.download_url) || null;
280
+ var validBranch = true;
212
281
 
213
- if (_sha !== sha) {
282
+ if (_sha) {
283
+ // TRICKY: since this fetch may be delayed - make sure it was for the current branch before using the sha
284
+ var parts = (url || '').split('/');
285
+ var fetchBranch = parts.length > 7 ? parts[7] : '';
286
+ validBranch = fetchBranch === ref;
287
+ }
288
+
289
+ if (validBranch && _sha !== sha) {
290
+ console.log("ScriptureCard: for ".concat(url, " ").concat(JSON.stringify(reference_), " new sha is ").concat(_sha));
214
291
  setState({
215
292
  sha: _sha
216
293
  });
@@ -220,119 +297,83 @@ export default function ScriptureCard(_ref) {
220
297
  var cardResourceId = (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso3 = scriptureConfig.resource) === null || _scriptureConfig$reso3 === void 0 ? void 0 : _scriptureConfig$reso3.projectId) || resourceId; // @ts-ignore
221
298
 
222
299
  var ref_ = (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso4 = scriptureConfig.resource) === null || _scriptureConfig$reso4 === void 0 ? void 0 : _scriptureConfig$reso4.ref) || appRef;
223
- var canUseEditBranch = loggedInUser && authentication && resourceId !== ORIGINAL_SOURCE && (ref_ === 'master' || ref_.substring(0, loggedInUser.length) === loggedInUser); // not tag
300
+ var canUseEditBranch = !!(loggedInUser && authentication && resourceId !== ORIGINAL_SOURCE && ( // TRICKY if not original language and we have login data, then we can use the edit branch
301
+ ref_ === 'master' || ref_.includes(loggedInUser))); // also make sure not a version tag
224
302
 
225
303
  var _useUserBranch = useUserBranch({
226
- owner: owner,
227
- server: server,
228
304
  appRef: appRef,
229
- languageId: languageId,
230
- cardId: id,
231
- loggedInUser: canUseEditBranch ? loggedInUser : null,
232
305
  authentication: canUseEditBranch ? authentication : null,
306
+ bookId: bookId,
307
+ cardId: id,
233
308
  cardResourceId: cardResourceId,
309
+ checkForEditBranch: checkForEditBranch,
310
+ languageId: languageId,
311
+ loggedInUser: canUseEditBranch ? loggedInUser : null,
312
+ owner: owner,
234
313
  onResourceError: onResourceError,
314
+ server: server,
235
315
  useUserLocalStorage: useUserLocalStorage
236
316
  }),
237
317
  _useUserBranch$state = _useUserBranch.state,
238
- workingResourceBranch = _useUserBranch$state.workingResourceBranch,
318
+ branchDetermined = _useUserBranch$state.branchDetermined,
239
319
  userEditBranchName = _useUserBranch$state.userEditBranchName,
240
- usingUserBranch_ = _useUserBranch$state.usingUserBranch,
241
- _useUserBranch$action = _useUserBranch.actions,
242
- startEditBranch = _useUserBranch$action.startEdit,
243
- finishEdit = _useUserBranch$action.finishEdit;
320
+ _usingUserBranch = _useUserBranch$state.usingUserBranch,
321
+ workingResourceBranch = _useUserBranch$state.workingResourceBranch,
322
+ startEditBranch = _useUserBranch.actions.startEdit;
244
323
 
245
- var _useBranchMerger = useBranchMerger({
246
- server: server,
247
- owner: owner,
248
- repo: repo,
249
- userBranch: userEditBranchName,
250
- tokenid: authentication === null || authentication === void 0 ? void 0 : (_authentication$token = authentication.token) === null || _authentication$token === void 0 ? void 0 : _authentication$token.sha1
251
- });
324
+ var workingRef = canUseEditBranch ? workingResourceBranch : appRef;
325
+ var scriptureTitle;
252
326
 
253
- var _useBranchMerger$stat = _useBranchMerger.state,
254
- mergeToMaster = _useBranchMerger$stat.mergeStatus,
255
- mergeFromMaster = _useBranchMerger$stat.updateStatus;
256
- var updateButtonProps = useContentUpdateProps({
257
- isSaving: startSave,
258
- useBranchMerger: _useBranchMerger,
259
- onUpdate: scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.reloadResource
260
- });
261
- var callUpdateUserBranch = updateButtonProps.callUpdateUserBranch,
262
- isErrorDialogOpen = updateButtonProps.isErrorDialogOpen,
263
- onCloseErrorDialog = updateButtonProps.onCloseErrorDialog,
264
- isUpdateLoading = updateButtonProps.isLoading,
265
- dialogMessage = updateButtonProps.dialogMessage,
266
- dialogTitle = updateButtonProps.dialogTitle,
267
- dialogLink = updateButtonProps.dialogLink,
268
- dialogLinkTooltip = updateButtonProps.dialogLinkTooltip;
269
-
270
- var onMerge = function onMerge() {
271
- finishEdit();
327
+ if (!canUseEditBranch && !readyForFetch) {
328
+ // if bible not eligible for user branch, make sure it's ready
272
329
  setState({
273
- ref: appRef
274
- }); // scriptureConfig?.reloadResource()
275
- };
276
-
277
- var _useMasterMergeProps = useMasterMergeProps({
278
- isSaving: startSave,
279
- useBranchMerger: _useBranchMerger,
280
- onMerge: onMerge
281
- }),
282
- isMergeLoading = _useMasterMergeProps.isLoading,
283
- callMergeUserBranch = _useMasterMergeProps.callMergeUserBranch;
330
+ readyForFetch: true
331
+ });
332
+ }
284
333
 
285
334
  React.useEffect(function () {
286
- if (cardResourceId) {
287
- updateMergeState && updateMergeState(cardResourceId, mergeFromMaster, mergeToMaster, callUpdateUserBranch, callMergeUserBranch);
288
- }
289
- }, [cardResourceId, mergeFromMaster, mergeToMaster]);
290
- React.useEffect(function () {
291
- if (isUpdateLoading) {
292
- setCardsLoadingUpdate === null || setCardsLoadingUpdate === void 0 ? void 0 : setCardsLoadingUpdate(function (prevCardsLoading) {
293
- return [].concat(_toConsumableArray(prevCardsLoading), [cardResourceId]);
294
- });
295
- } else {
296
- setCardsLoadingUpdate === null || setCardsLoadingUpdate === void 0 ? void 0 : setCardsLoadingUpdate(function (prevCardsLoading) {
297
- return prevCardsLoading.filter(function (cardId) {
298
- return cardId !== cardResourceId;
299
- });
335
+ console.log("ScriptureCard book changed", {
336
+ bookId: bookId,
337
+ owner: owner,
338
+ languageId: languageId,
339
+ resourceId: resourceId
340
+ });
341
+
342
+ if (canUseEditBranch) {
343
+ // if bible eligible for user branch, refresh it
344
+ setState({
345
+ readyForFetch: false,
346
+ checkForEditBranch: checkForEditBranch + 1
300
347
  });
301
348
  }
302
- }, [isUpdateLoading]);
349
+ }, [bookId, owner, languageId, resourceId]);
303
350
  React.useEffect(function () {
304
- if (isMergeLoading) {
305
- setCardsLoadingMerge === null || setCardsLoadingMerge === void 0 ? void 0 : setCardsLoadingMerge(function (prevCardsLoading) {
306
- return [].concat(_toConsumableArray(prevCardsLoading), [cardResourceId]);
307
- });
308
- } else {
309
- setCardsLoadingMerge === null || setCardsLoadingMerge === void 0 ? void 0 : setCardsLoadingMerge(function (prevCardsLoading) {
310
- return prevCardsLoading.filter(function (cardId) {
311
- return cardId !== cardResourceId;
312
- });
351
+ if (!isEqual(reference, currentReference)) {
352
+ // console.log(`ScriptureCard reference changed`, reference)
353
+ setState({
354
+ currentReference: reference
313
355
  });
314
356
  }
315
- }, [isMergeLoading]);
316
- var workingRef = canUseEditBranch ? workingResourceBranch : appRef;
317
- var scriptureTitle;
357
+ }, [reference]);
318
358
  React.useEffect(function () {
319
- // select correct working ref - could be master, user branch, or release
320
- if (usingUserBranch_ !== usingUserBranch) {
359
+ // waiting for branch fetch to complete
360
+ console.log("ScriptureCard branchDetermined is ".concat(branchDetermined, " and workingRef is ").concat(workingRef, " and readyForFetch is ").concat(readyForFetch));
361
+
362
+ if (!readyForFetch && branchDetermined) {
321
363
  setState({
322
- usingUserBranch: usingUserBranch_
364
+ readyForFetch: true,
365
+ ref: workingRef
323
366
  });
324
367
  }
325
- }, [usingUserBranch_, usingUserBranch]);
368
+ }, [branchDetermined]);
326
369
  React.useEffect(function () {
327
370
  // select correct working ref - could be master, user branch, or release
328
- var workingRef_ = workingRef || appRef;
329
-
330
- if (ref !== workingRef_) {
371
+ if (_usingUserBranch !== usingUserBranch) {
331
372
  setState({
332
- ref: workingRef_
373
+ usingUserBranch: _usingUserBranch
333
374
  });
334
375
  }
335
- }, [workingRef, ref, appRef]);
376
+ }, [_usingUserBranch, usingUserBranch]);
336
377
  React.useEffect(function () {
337
378
  var _scriptureConfig$reso5;
338
379
 
@@ -387,7 +428,7 @@ export default function ScriptureCard(_ref) {
387
428
  });
388
429
  var direction = (language === null || language === void 0 ? void 0 : language.direction) || 'ltr';
389
430
 
390
- var reference = _objectSpread({}, scriptureConfig.reference);
431
+ var _reference = currentReference || reference;
391
432
 
392
433
  var isHebrew = languageId_ === 'hbo';
393
434
  var fontFactor = isHebrew ? 1.4 : 1; // we automatically scale up font size for Hebrew
@@ -429,66 +470,13 @@ export default function ScriptureCard(_ref) {
429
470
  disableWordPopover_ = !usingOriginalBible;
430
471
  }
431
472
 
432
- React.useEffect(function () {
433
- // pre-cache glosses on verse change
434
- var fetchGlossDataForVerse = /*#__PURE__*/function () {
435
- var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
436
- var _verseObjects2;
437
-
438
- var verseObjects, _iterator, _step, _verseRef$verseData, verseRef, _verseObjects;
439
-
440
- return regeneratorRuntime.wrap(function _callee$(_context) {
441
- while (1) {
442
- switch (_context.prev = _context.next) {
443
- case 0:
444
- verseObjects = []; // get verse objects of all the verses
445
-
446
- _iterator = _createForOfIteratorHelper((scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef) || []);
447
-
448
- try {
449
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
450
- verseRef = _step.value;
451
- _verseObjects = verseRef === null || verseRef === void 0 ? void 0 : (_verseRef$verseData = verseRef.verseData) === null || _verseRef$verseData === void 0 ? void 0 : _verseRef$verseData.verseObjects;
452
- verseObjects = verseObjects.concat(_verseObjects);
453
- }
454
- } catch (err) {
455
- _iterator.e(err);
456
- } finally {
457
- _iterator.f();
458
- }
459
-
460
- if (!(!disableWordPopover && (_verseObjects2 = verseObjects) !== null && _verseObjects2 !== void 0 && _verseObjects2.length && fetchGlossesForVerse)) {
461
- _context.next = 6;
462
- break;
463
- }
464
-
465
- _context.next = 6;
466
- return fetchGlossesForVerse(verseObjects, languageId_);
467
-
468
- case 6:
469
- case "end":
470
- return _context.stop();
471
- }
472
- }
473
- }, _callee);
474
- }));
475
-
476
- return function fetchGlossDataForVerse() {
477
- return _ref2.apply(this, arguments);
478
- };
479
- }();
480
-
481
- if (usingOriginalBible) {
482
- fetchGlossDataForVerse();
483
- }
484
- }, [versesForRef, languageId_]);
485
473
  var enableEdit = !usingOriginalBible;
486
474
  var enableAlignment = !usingOriginalBible;
487
475
  var originalRepoUrl = isNewTestament ? greekRepoUrl : hebrewRepoUrl;
488
476
  var scriptureAlignmentEditConfig = {
489
477
  authentication: canUseEditBranch ? authentication : null,
490
478
  bookIndex: bookIndex,
491
- currentVerseRef: reference,
479
+ currentVerseRef: _reference,
492
480
  enableEdit: enableEdit,
493
481
  enableAlignment: enableAlignment,
494
482
  httpConfig: httpConfig,
@@ -582,6 +570,7 @@ export default function ScriptureCard(_ref) {
582
570
  function getBookName() {
583
571
  var _scriptureConfig$refe;
584
572
 
573
+ // @ts-ignore
585
574
  var bookCaps = scriptureConfig !== null && scriptureConfig !== void 0 && (_scriptureConfig$refe = scriptureConfig.reference) !== null && _scriptureConfig$refe !== void 0 && _scriptureConfig$refe.projectId ? scriptureConfig.reference.projectId.toUpperCase() : '';
586
575
  return "".concat(bookIndex, "-").concat(bookCaps, ".usfm");
587
576
  }
@@ -599,7 +588,8 @@ export default function ScriptureCard(_ref) {
599
588
  }, authentication === null || authentication === void 0 ? void 0 : authentication.config), {}, {
600
589
  token: authentication === null || authentication === void 0 ? void 0 : authentication.token,
601
590
  // @ts-ignore
602
- timeout: ((_httpConfig = httpConfig) === null || _httpConfig === void 0 ? void 0 : _httpConfig.serverTimeOut) || ((_httpConfig2 = httpConfig) === null || _httpConfig2 === void 0 ? void 0 : _httpConfig2.timeout) || 5000
591
+ timeout: ((_httpConfig = httpConfig) === null || _httpConfig === void 0 ? void 0 : _httpConfig.serverTimeOut) || ((_httpConfig2 = httpConfig) === null || _httpConfig2 === void 0 ? void 0 : _httpConfig2.timeout) || 10000,
592
+ server: server
603
593
  }),
604
594
  author: loggedInUser,
605
595
  token: authentication === null || authentication === void 0 ? void 0 : authentication.token,
@@ -607,85 +597,73 @@ export default function ScriptureCard(_ref) {
607
597
  filepath: filepath,
608
598
  repo: repo
609
599
  }),
600
+ saveError = _useEdit.error,
601
+ isSaveError = _useEdit.isError,
610
602
  onSaveEdit = _useEdit.onSaveEdit;
611
603
 
604
+ React.useEffect(function () {
605
+ // when we get a save saveError
606
+ if (saveError && isSaveError) {
607
+ console.log("save error", saveError); // onResourceError && onResourceError(null, false, null, `Error saving ${languageId_}_${resourceId} ${saveError}`, true)
608
+ }
609
+ }, [saveError, isSaveError]);
612
610
  React.useEffect(function () {
613
611
  // when startSave goes true, save edits to user branch and then clear startSave
614
612
  var _saveEdit = /*#__PURE__*/function () {
615
- var _ref4 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
616
- var branch;
617
- return regeneratorRuntime.wrap(function _callee2$(_context2) {
613
+ var _ref4 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
614
+ return regeneratorRuntime.wrap(function _callee$(_context) {
618
615
  while (1) {
619
- switch (_context2.prev = _context2.next) {
616
+ switch (_context.prev = _context.next) {
620
617
  case 0:
621
618
  // begin uploading new USFM
622
- branch = workingResourceBranch !== 'master' ? workingResourceBranch : undefined;
623
-
624
- if (branch) {
625
- _context2.next = 5;
626
- break;
627
- }
628
-
629
- _context2.next = 4;
630
- return startEditBranch();
631
-
632
- case 4:
633
- branch = _context2.sent;
634
-
635
- case 5:
636
- _context2.next = 7;
637
- return onSaveEdit(branch).then(function (success) {
619
+ console.info("saveChangesToCloud() - Using sha: ".concat(sha));
620
+ _context.next = 3;
621
+ return onSaveEdit(userEditBranchName).then(function (success) {
638
622
  // push changed to server
639
623
  if (success) {
640
624
  console.log("saveChangesToCloud() - save scripture edits success");
641
- setCardsSaving(function (prevCardsSaving) {
642
- return prevCardsSaving.filter(function (cardId) {
643
- return cardId !== cardResourceId;
644
- });
645
- });
646
- setState({
647
- startSave: false
648
- });
649
625
  var unsavedCardIndices = Object.keys(unsavedChangesList);
650
626
 
651
627
  if (unsavedCardIndices !== null && unsavedCardIndices !== void 0 && unsavedCardIndices.length) {
652
- var _iterator2 = _createForOfIteratorHelper(unsavedCardIndices),
653
- _step2;
628
+ var _iterator = _createForOfIteratorHelper(unsavedCardIndices),
629
+ _step;
654
630
 
655
631
  try {
656
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
657
- var cardIndex = _step2.value;
632
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
633
+ var cardIndex = _step.value;
658
634
  var clearChanges = unsavedChangesList[cardIndex].clearChanges;
659
635
  clearChanges && clearChanges();
660
636
  }
661
637
  } catch (err) {
662
- _iterator2.e(err);
638
+ _iterator.e(err);
663
639
  } finally {
664
- _iterator2.f();
640
+ _iterator.f();
665
641
  }
666
642
  }
667
643
 
668
644
  console.info('saveChangesToCloud() - Reloading resource');
669
- scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.reloadResource();
645
+ setState({
646
+ startSave: false,
647
+ readyForFetch: true,
648
+ ref: userEditBranchName
649
+ });
650
+ delay(500).then(function () {
651
+ scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.reloadResource(sha);
652
+ });
670
653
  } else {
671
654
  console.error('saveChangesToCloud() - saving changed scripture failed');
672
- setCardsSaving(function (prevCardsSaving) {
673
- return prevCardsSaving.filter(function (cardId) {
674
- return cardId !== cardResourceId;
675
- });
676
- });
677
655
  setState({
678
656
  startSave: false
679
657
  });
680
658
  }
681
659
  });
682
660
 
683
- case 7:
661
+ case 3:
684
662
  case "end":
685
- return _context2.stop();
663
+ return _context.stop();
686
664
  }
687
665
  }
688
- }, _callee2);
666
+ }, _callee);
689
667
  }));
690
668
 
691
669
  return function _saveEdit() {
@@ -694,14 +672,14 @@ export default function ScriptureCard(_ref) {
694
672
  }();
695
673
 
696
674
  if (startSave) {
697
- console.log("saveChangesToCloud - calling _saveEdit()");
698
- setCardsSaving(function (prevCardsSaving) {
699
- return [].concat(_toConsumableArray(prevCardsSaving), [cardResourceId]);
700
- });
701
-
702
- _saveEdit();
675
+ if (!editBranchReady) {// console.log(`saveChangesToCloud - edit branch not yet created`)
676
+ } else if (!sha) {// console.log(`saveChangesToCloud - save sha not yet ready`)
677
+ } else {
678
+ // console.log(`saveChangesToCloud - calling _saveEdit()`)
679
+ _saveEdit();
680
+ }
703
681
  }
704
- }, [startSave]);
682
+ }, [startSave, editBranchReady, sha]);
705
683
  /**
706
684
  * convert updatedVerseObjects to USFM and merge into the bibleUsfm
707
685
  * @param {string} bibleUsfm - USFM of bible
@@ -736,159 +714,361 @@ export default function ScriptureCard(_ref) {
736
714
  }
737
715
 
738
716
  React.useEffect(function () {
739
- // for each unsaved change, call into versePane to get latest changes for verse to save
740
- if (saveClicked) {
741
- var unsavedCardIndices = Object.keys(unsavedChangesList);
742
-
743
- if (unsavedCardIndices !== null && unsavedCardIndices !== void 0 && unsavedCardIndices.length) {
744
- var bibleUsfm = core.getResponseData(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.fetchResponse);
745
- var mergeFail = false;
746
- var _cardNum = 0;
747
-
748
- var _iterator3 = _createForOfIteratorHelper(unsavedCardIndices),
749
- _step3;
750
-
751
- try {
752
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
753
- var _cardIndex = _step3.value;
754
- _cardNum = parseInt(_cardIndex);
755
- var _unsavedChangesList$_2 = unsavedChangesList[_cardNum],
756
- _getChanges2 = _unsavedChangesList$_2.getChanges,
757
- _state2 = _unsavedChangesList$_2.state;
758
-
759
- if (_getChanges2) {
760
- var _newUsfm = void 0;
761
-
762
- var _getChanges3 = _getChanges2(_state2),
763
- _ref6 = _getChanges3.ref,
764
- _updatedVerseObjects = _getChanges3.updatedVerseObjects;
765
-
766
- if (_updatedVerseObjects && bibleUsfm) {
767
- // just replace verse
768
- _newUsfm = mergeVerseObjectsIntoBibleUsfm(bibleUsfm, _ref6, _updatedVerseObjects, _cardNum);
769
- }
717
+ // for each unsaved change, call into scripturePane to get latest changes for verse to save
718
+ function getReadyForSave() {
719
+ return _getReadyForSave.apply(this, arguments);
720
+ }
721
+
722
+ function _getReadyForSave() {
723
+ _getReadyForSave = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
724
+ var createEditBranch, branch, unsavedCardIndices, bibleUsfm, mergeFail, _cardNum, _iterator2, _step2, _cardIndex, _unsavedChangesList$_2, _getChanges2, _state2, _newUsfm, _getChanges3, _ref6, _updatedVerseObjects, newBookJson, _iterator3, _step3, cardIndex, _cardNum2, _unsavedChangesList$_, getChanges, _state, newUsfm, _getChanges, newVerseText, _ref5, updatedVerseObjects, targetVerseObjects_, _AlignmentHelpers$upd, targetVerseObjects;
725
+
726
+ return regeneratorRuntime.wrap(function _callee2$(_context2) {
727
+ while (1) {
728
+ switch (_context2.prev = _context2.next) {
729
+ case 0:
730
+ if (!saveClicked) {
731
+ _context2.next = 46;
732
+ break;
733
+ }
734
+
735
+ createEditBranch = !_usingUserBranch;
736
+
737
+ if (!createEditBranch) {
738
+ // if already using the user branch
739
+ if (workingResourceBranch !== userEditBranchName) {
740
+ console.warn("saveChangesToCloud - state conflict - should be in user branch ".concat(userEditBranchName, ", but actually using ").concat(workingResourceBranch));
741
+ createEditBranch = true;
742
+ } else {
743
+ console.log("saveChangesToCloud - already using edit branch: ".concat(workingResourceBranch));
744
+ setState({
745
+ editBranchReady: true
746
+ });
747
+ }
748
+ }
749
+
750
+ if (!createEditBranch) {
751
+ _context2.next = 10;
752
+ break;
753
+ }
754
+
755
+ // if not yet using the user branch, create it
756
+ console.log("saveChangesToCloud - creating edit branch");
757
+ setState({
758
+ editBranchReady: false,
759
+ readyForFetch: false,
760
+ sha: null
761
+ }); // we will need a new sha for book/branch
762
+
763
+ _context2.next = 8;
764
+ return startEditBranch();
765
+
766
+ case 8:
767
+ branch = _context2.sent;
768
+
769
+ if (branch) {
770
+ console.log("saveChangesToCloud - edit branch created");
771
+ setState({
772
+ editBranchReady: true,
773
+ readyForFetch: true,
774
+ ref: branch
775
+ });
776
+ } else {
777
+ console.log("saveChangesToCloud - failed to create edit branch");
778
+ }
779
+
780
+ case 10:
781
+ console.log("saveChangesToCloud - getting verse changes");
782
+ unsavedCardIndices = Object.keys(unsavedChangesList);
783
+
784
+ if (!(unsavedCardIndices !== null && unsavedCardIndices !== void 0 && unsavedCardIndices.length)) {
785
+ _context2.next = 46;
786
+ break;
787
+ }
788
+
789
+ bibleUsfm = core.getResponseData(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.fetchResponse);
790
+ mergeFail = false;
791
+ _cardNum = 0;
792
+ _iterator2 = _createForOfIteratorHelper(unsavedCardIndices);
793
+ _context2.prev = 17;
794
+
795
+ _iterator2.s();
796
+
797
+ case 19:
798
+ if ((_step2 = _iterator2.n()).done) {
799
+ _context2.next = 35;
800
+ break;
801
+ }
802
+
803
+ _cardIndex = _step2.value;
804
+ _cardNum = parseInt(_cardIndex);
805
+ _unsavedChangesList$_2 = unsavedChangesList[_cardNum], _getChanges2 = _unsavedChangesList$_2.getChanges, _state2 = _unsavedChangesList$_2.state;
806
+
807
+ if (!_getChanges2) {
808
+ _context2.next = 33;
809
+ break;
810
+ }
811
+
812
+ _newUsfm = void 0;
813
+ _getChanges3 = _getChanges2(_state2), _ref6 = _getChanges3.ref, _updatedVerseObjects = _getChanges3.updatedVerseObjects;
814
+
815
+ if (_updatedVerseObjects && bibleUsfm) {
816
+ // just replace verse
817
+ _newUsfm = mergeVerseObjectsIntoBibleUsfm(bibleUsfm, _ref6, _updatedVerseObjects, _cardNum);
818
+ }
819
+
820
+ if (!_newUsfm) {
821
+ _context2.next = 31;
822
+ break;
823
+ }
770
824
 
771
- if (_newUsfm) {
772
825
  bibleUsfm = _newUsfm;
773
- } else {
826
+ _context2.next = 33;
827
+ break;
828
+
829
+ case 31:
774
830
  mergeFail = true;
831
+ return _context2.abrupt("break", 35);
832
+
833
+ case 33:
834
+ _context2.next = 19;
775
835
  break;
776
- }
777
- }
778
- }
779
- } catch (err) {
780
- _iterator3.e(err);
781
- } finally {
782
- _iterator3.f();
783
- }
784
836
 
785
- if (mergeFail) {
786
- // if we failed to merge, fallback to brute force verse objects to USFM
787
- console.log("saveChangesToCloud(".concat(_cardNum, ") - verse not found, falling back to inserting verse object"));
788
- var newBookJson;
837
+ case 35:
838
+ _context2.next = 40;
839
+ break;
789
840
 
790
- var _iterator4 = _createForOfIteratorHelper(unsavedCardIndices),
791
- _step4;
841
+ case 37:
842
+ _context2.prev = 37;
843
+ _context2.t0 = _context2["catch"](17);
792
844
 
793
- try {
794
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
795
- var cardIndex = _step4.value;
845
+ _iterator2.e(_context2.t0);
796
846
 
797
- var _cardNum2 = parseInt(cardIndex);
847
+ case 40:
848
+ _context2.prev = 40;
798
849
 
799
- var _unsavedChangesList$_ = unsavedChangesList[_cardNum2],
800
- getChanges = _unsavedChangesList$_.getChanges,
801
- _state = _unsavedChangesList$_.state;
850
+ _iterator2.f();
802
851
 
803
- if (getChanges) {
804
- var newUsfm = void 0;
852
+ return _context2.finish(40);
805
853
 
806
- var _getChanges = getChanges(_state),
807
- newVerseText = _getChanges.newVerseText,
808
- _ref5 = _getChanges.ref,
809
- updatedVerseObjects = _getChanges.updatedVerseObjects;
854
+ case 43:
855
+ if (mergeFail) {
856
+ // if we failed to merge, fallback to brute force verse objects to USFM
857
+ console.log("saveChangesToCloud(".concat(_cardNum, ") - verse not found, falling back to inserting verse object"));
858
+ _iterator3 = _createForOfIteratorHelper(unsavedCardIndices);
810
859
 
811
- if (updatedVerseObjects && !newUsfm) {
812
- var targetVerseObjects_ = null;
860
+ try {
861
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
862
+ cardIndex = _step3.value;
863
+ _cardNum2 = parseInt(cardIndex);
864
+ _unsavedChangesList$_ = unsavedChangesList[_cardNum2], getChanges = _unsavedChangesList$_.getChanges, _state = _unsavedChangesList$_.state;
813
865
 
814
- if (_ref5) {
815
- if (newVerseText) {
816
- var _AlignmentHelpers$upd = AlignmentHelpers.updateAlignmentsToTargetVerse(updatedVerseObjects, newVerseText),
817
- targetVerseObjects = _AlignmentHelpers$upd.targetVerseObjects;
866
+ if (getChanges) {
867
+ newUsfm = void 0;
868
+ _getChanges = getChanges(_state), newVerseText = _getChanges.newVerseText, _ref5 = _getChanges.ref, updatedVerseObjects = _getChanges.updatedVerseObjects;
818
869
 
819
- targetVerseObjects_ = targetVerseObjects;
820
- } else {
821
- targetVerseObjects_ = updatedVerseObjects;
822
- }
870
+ if (updatedVerseObjects && !newUsfm) {
871
+ targetVerseObjects_ = null;
872
+
873
+ if (_ref5) {
874
+ if (newVerseText) {
875
+ _AlignmentHelpers$upd = AlignmentHelpers.updateAlignmentsToTargetVerse(updatedVerseObjects, newVerseText), targetVerseObjects = _AlignmentHelpers$upd.targetVerseObjects;
876
+ targetVerseObjects_ = targetVerseObjects;
877
+ } else {
878
+ targetVerseObjects_ = updatedVerseObjects;
879
+ }
823
880
 
824
- newBookJson = targetVerseObjects_ && (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.updateVerse(_ref5.chapter, _ref5.verse, {
825
- verseObjects: targetVerseObjects_
826
- }));
881
+ newBookJson = targetVerseObjects_ && (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.updateVerse(_ref5.chapter, _ref5.verse, {
882
+ verseObjects: targetVerseObjects_
883
+ }));
884
+ }
885
+ }
886
+ }
887
+ }
888
+ } catch (err) {
889
+ _iterator3.e(err);
890
+ } finally {
891
+ _iterator3.f();
827
892
  }
893
+
894
+ bibleUsfm = usfmjs.toUSFM(newBookJson, {
895
+ forcedNewLines: true
896
+ });
828
897
  }
898
+
899
+ console.log("saveChangesToCloud() - saving new USFM: ".concat(bibleUsfm.substring(0, 100), "..."));
900
+ setState({
901
+ saveContent: bibleUsfm,
902
+ startSave: true,
903
+ saveClicked: false
904
+ });
905
+
906
+ case 46:
907
+ case "end":
908
+ return _context2.stop();
909
+ }
910
+ }
911
+ }, _callee2, null, [[17, 37, 40, 43]]);
912
+ }));
913
+ return _getReadyForSave.apply(this, arguments);
914
+ }
915
+
916
+ getReadyForSave();
917
+ }, [saveClicked]); // @ts-ignore
918
+
919
+ var _ref7 = _reference || {},
920
+ chapter = _ref7.chapter;
921
+
922
+ React.useEffect(function () {
923
+ var _versesForRef = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef;
924
+
925
+ var newSelections = new Map();
926
+ var updateSelections = false;
927
+ var _map = newSelections;
928
+ var originalBookId = originalScriptureBookObjects === null || originalScriptureBookObjects === void 0 ? void 0 : originalScriptureBookObjects.bookId;
929
+ var bookVerseObject = originalScriptureBookObjects === null || originalScriptureBookObjects === void 0 ? void 0 : originalScriptureBookObjects.chapters;
930
+ var newSelectedQuote = null; // if we have everything we need to calculate selections
931
+
932
+ if (_versesForRef !== null && _versesForRef !== void 0 && _versesForRef.length && bookVerseObject && bookId === originalBookId && bookVerseObject[chapter] && // we need to have data for chapter
933
+ selectedQuote !== null && selectedQuote !== void 0 && selectedQuote.quote) {
934
+ // if quote is different than last
935
+ if (!isEqual(lastSelectedQuote, selectedQuote) || !isEqual(versesForRef, _versesForRef)) {
936
+ var _selectedQuote$refere3;
937
+
938
+ var originalVerses = {};
939
+ var substitute = {}; // keep track of verse substitutions
940
+
941
+ var startVerse = _versesForRef[0].verse;
942
+
943
+ if (typeof startVerse === 'string') {
944
+ startVerse = parseInt(startVerse);
945
+ }
946
+
947
+ var lastVerse = startVerse;
948
+
949
+ for (var i = 0, l = _versesForRef.length; i < l; i++) {
950
+ var verseRef = _versesForRef[i];
951
+ var _chapter2 = verseRef.chapter,
952
+ verse = verseRef.verse; // TRICKY - we remap verses in reference range to a linear series of verses so verse spans don't choke getQuoteMatchesInBookRef
953
+
954
+ var _verse = startVerse + i;
955
+
956
+ lastVerse = _verse;
957
+ substitute["".concat(_chapter2, ":").concat(_verse)] = "".concat(_chapter2, ":").concat(verse);
958
+
959
+ if (!originalVerses[_chapter2]) {
960
+ originalVerses[_chapter2] = {};
961
+ }
962
+
963
+ var verseObjects = [];
964
+
965
+ if (typeof verse === 'string' && verse.includes('-')) {
966
+ var verses = getVerses(bookVerseObject, "".concat(_chapter2, ":").concat(verse));
967
+
968
+ var _iterator4 = _createForOfIteratorHelper(verses),
969
+ _step4;
970
+
971
+ try {
972
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
973
+ var verseItem = _step4.value;
974
+ var vo = verseItem.verseData.verseObjects;
975
+ verseObjects = verseObjects.concat(vo);
829
976
  }
977
+ } catch (err) {
978
+ _iterator4.e(err);
979
+ } finally {
980
+ _iterator4.f();
830
981
  }
831
- } catch (err) {
832
- _iterator4.e(err);
833
- } finally {
834
- _iterator4.f();
982
+ } else {
983
+ var _bookVerseObject$_cha;
984
+
985
+ verseObjects = (_bookVerseObject$_cha = bookVerseObject[_chapter2][verse]) === null || _bookVerseObject$_cha === void 0 ? void 0 : _bookVerseObject$_cha.verseObjects;
835
986
  }
836
987
 
837
- bibleUsfm = usfmjs.toUSFM(newBookJson, {
838
- forcedNewLines: true
839
- });
988
+ if (verseObjects) {
989
+ verseObjects = cleanupVerseObjects(verseObjects);
990
+ originalVerses[_chapter2][_verse] = {
991
+ verseObjects: verseObjects
992
+ };
993
+
994
+ _map.set("".concat(_chapter2, ":").concat(verse), verseObjects);
995
+ }
996
+ } // create new reference range for new linear verse range
997
+
998
+
999
+ var _selectedQuote$refere = selectedQuote === null || selectedQuote === void 0 ? void 0 : (_selectedQuote$refere3 = selectedQuote.reference) === null || _selectedQuote$refere3 === void 0 ? void 0 : _selectedQuote$refere3.split(':'),
1000
+ _selectedQuote$refere2 = _slicedToArray(_selectedQuote$refere, 1),
1001
+ _chapter = _selectedQuote$refere2[0];
1002
+
1003
+ var subRef = "".concat(_chapter, ":").concat(startVerse);
1004
+
1005
+ if (lastVerse != startVerse) {
1006
+ subRef += "-".concat(lastVerse);
840
1007
  }
841
1008
 
842
- console.log("saveChangesToCloud() - saving new USFM: ".concat(bibleUsfm.substring(0, 100), "..."));
843
- setCardsSaving(function (prevCardsSaving) {
844
- return [].concat(_toConsumableArray(prevCardsSaving), [cardResourceId]);
845
- });
846
- setState({
847
- saveContent: bibleUsfm,
848
- startSave: true,
849
- saveClicked: false
1009
+ var quoteMatches = getQuoteMatchesInBookRef({
1010
+ bookObject: originalVerses,
1011
+ ref: subRef,
1012
+ quote: selectedQuote === null || selectedQuote === void 0 ? void 0 : selectedQuote.quote,
1013
+ occurrence: selectedQuote === null || selectedQuote === void 0 ? void 0 : selectedQuote.occurrence
850
1014
  });
1015
+
1016
+ var _selections = new Map();
1017
+
1018
+ if (quoteMatches !== null && quoteMatches !== void 0 && quoteMatches.size) {
1019
+ quoteMatches.forEach(function (words, key) {
1020
+ var _key = substitute[key];
1021
+
1022
+ _selections.set(_key, words.map(function (word) {
1023
+ return _objectSpread(_objectSpread({}, word), {}, {
1024
+ text: core.normalizeString(word.text)
1025
+ });
1026
+ }));
1027
+ });
1028
+ }
1029
+
1030
+ newSelections = _selections;
1031
+ newSelectedQuote = selectedQuote;
1032
+ updateSelections = true;
851
1033
  }
852
1034
  }
853
- }, [saveClicked]);
854
- React.useEffect(function () {
855
- if (!isEqual(versesForRef, scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef)) {
856
- var _versesForRef = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef;
857
1035
 
858
- setState({
859
- versesForRef: _versesForRef
860
- });
1036
+ var newState = {}; // update states that have changed
861
1037
 
862
- var _iterator5 = _createForOfIteratorHelper(_versesForRef || []),
863
- _step5;
1038
+ if (!areMapsTheSame(verseObjectsMap, _map)) {
1039
+ newState.verseObjectsMap = _map;
1040
+ }
864
1041
 
865
- try {
866
- for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
867
- var verseRef = _step5.value;
868
- // check for verse range
869
- var _verse = verseRef.verse;
1042
+ var booksNotSame = (reference === null || reference === void 0 ? void 0 : reference.projectId) !== (currentReference === null || currentReference === void 0 ? void 0 : currentReference.projectId);
870
1043
 
871
- if (addVerseRange && typeof _verse === 'string') {
872
- // @ts-ignore
873
- if (_verse.includes('-')) {
874
- var _scriptureConfig$refe2;
1044
+ if (booksNotSame || !areVersesSame(versesForRef, _versesForRef)) {
1045
+ newState.versesForRef = _versesForRef;
1046
+ newState.lastSelectedQuote = newSelectedQuote;
1047
+ newState.selections = newSelections;
1048
+ }
875
1049
 
876
- addVerseRange("".concat(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$refe2 = scriptureConfig.reference) === null || _scriptureConfig$refe2 === void 0 ? void 0 : _scriptureConfig$refe2.chapter, ":").concat(_verse));
877
- }
878
- }
879
- }
880
- } catch (err) {
881
- _iterator5.e(err);
882
- } finally {
883
- _iterator5.f();
1050
+ if (newSelectedQuote) {
1051
+ newState.lastSelectedQuote = newSelectedQuote;
1052
+ }
1053
+
1054
+ if (updateSelections) {
1055
+ if (!areMapsTheSame(selections || new Map(), newSelections)) {
1056
+ newState.selections = newSelections;
884
1057
  }
885
1058
  }
886
- }, [scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef]);
1059
+
1060
+ if (Object.keys(newState).length) {
1061
+ setState(newState);
1062
+ }
1063
+ }, [owner, resourceId, bookId, languageId_, scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef, originalScriptureBookObjects, selectedQuote]);
887
1064
  React.useEffect(function () {
1065
+ // clear settings on verse change
888
1066
  setState({
889
- versesAlignmentStatus: null
1067
+ versesAlignmentStatus: null,
1068
+ unsavedChangesList: {},
1069
+ haveUnsavedChanges: false
890
1070
  });
891
- }, [verse]);
1071
+ }, [_reference]);
892
1072
 
893
1073
  var updateVersesAlignmentStatus = function updateVersesAlignmentStatus(reference, aligned) {
894
1074
  setState_(function (prevState) {
@@ -898,41 +1078,75 @@ export default function ScriptureCard(_ref) {
898
1078
  });
899
1079
  };
900
1080
 
901
- var renderedScripturePanes = versesForRef === null || versesForRef === void 0 ? void 0 : versesForRef.map(function (_currentVerseData, index) {
1081
+ var _versesForRef = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef;
1082
+
1083
+ React.useEffect(function () {
1084
+ var _versesForRef2;
1085
+
1086
+ if ((_versesForRef2 = _versesForRef) !== null && _versesForRef2 !== void 0 && _versesForRef2.length) {
1087
+ var _ref8 = scriptureConfig || {},
1088
+ _reference2 = _ref8.reference,
1089
+ _resourceLink2 = _ref8.resourceLink;
1090
+
1091
+ console.log("ScriptureCard._versesForRef changed", {
1092
+ reference: _reference2,
1093
+ resourceLink: _resourceLink2
1094
+ });
1095
+ }
1096
+ }, [_versesForRef]);
1097
+
1098
+ if (!((_versesForRef3 = _versesForRef) !== null && _versesForRef3 !== void 0 && _versesForRef3.length)) {
1099
+ // if empty of references, create single empty reference
1100
+ _versesForRef = [_objectSpread({}, reference)];
1101
+ }
1102
+
1103
+ var renderedScripturePanes = (_versesForRef4 = _versesForRef) === null || _versesForRef4 === void 0 ? void 0 : _versesForRef4.map(function (_currentVerseData, index) {
902
1104
  var _currentVerseData$ver;
903
1105
 
904
- var initialVerseObjects = (_currentVerseData === null || _currentVerseData === void 0 ? void 0 : (_currentVerseData$ver = _currentVerseData.verseData) === null || _currentVerseData$ver === void 0 ? void 0 : _currentVerseData$ver.verseObjects) || null; // @ts-ignore
1106
+ var initialVerseObjects = (_currentVerseData === null || _currentVerseData === void 0 ? void 0 : (_currentVerseData$ver = _currentVerseData.verseData) === null || _currentVerseData$ver === void 0 ? void 0 : _currentVerseData$ver.verseObjects) || []; // @ts-ignore
905
1107
 
906
- var _ref7 = _currentVerseData || {},
907
- chapter = _ref7.chapter,
908
- verse = _ref7.verse;
1108
+ var _ref9 = _currentVerseData || {},
1109
+ chapter = _ref9.chapter,
1110
+ verse = _ref9.verse;
909
1111
 
910
- var _reference = _objectSpread(_objectSpread({}, reference), {}, {
1112
+ var projectId = (currentReference === null || currentReference === void 0 ? void 0 : currentReference.projectId) || (reference === null || reference === void 0 ? void 0 : reference.projectId);
1113
+
1114
+ var _reference = _objectSpread(_objectSpread({}, _versesForRef), {}, {
911
1115
  chapter: chapter,
912
- verse: verse
1116
+ verse: verse,
1117
+ projectId: projectId
913
1118
  });
914
1119
 
915
1120
  var _scriptureAlignmentEditConfig = _objectSpread(_objectSpread({}, scriptureAlignmentEditConfig), {}, {
916
1121
  currentIndex: index,
917
1122
  initialVerseObjects: initialVerseObjects,
918
- reference: _reference
1123
+ reference: _reference,
1124
+ isNewTestament: isNewTestament
919
1125
  });
920
1126
 
921
1127
  var isVerseSelectedForAlignment = false;
922
1128
 
923
1129
  if (verseSelectedForAlignment) {
924
- isVerseSelectedForAlignment = verseSelectedForAlignment.chapter === chapter && verseSelectedForAlignment.verse === verse;
1130
+ isVerseSelectedForAlignment = verseSelectedForAlignment.chapter == chapter && verseSelectedForAlignment.verse == verse;
925
1131
  }
926
1132
 
927
1133
  return /*#__PURE__*/React.createElement(ScripturePane, _extends({}, scriptureConfig, {
928
1134
  contentStyle: contentStyle,
929
1135
  currentIndex: index,
1136
+ determiningBranch: !readyForFetch,
930
1137
  direction: direction,
931
1138
  disableWordPopover: disableWordPopover_,
932
1139
  fontSize: fontSize,
933
1140
  getLexiconData: getLexiconData,
934
1141
  isNT: isNT_,
1142
+ isVerseSelectedForAlignment: isVerseSelectedForAlignment,
935
1143
  key: index,
1144
+ onAlignmentFinish: function onAlignmentFinish() {
1145
+ return setState({
1146
+ verseSelectedForAlignment: null
1147
+ });
1148
+ },
1149
+ originalScriptureBookObjects: originalScriptureBookObjects,
936
1150
  refStyle: refStyle,
937
1151
  reference: _reference,
938
1152
  saving: startSave // @ts-ignore
@@ -941,12 +1155,6 @@ export default function ScriptureCard(_ref) {
941
1155
  setWordAlignerStatus: setWordAlignerStatus,
942
1156
  server: server,
943
1157
  translate: translate,
944
- isVerseSelectedForAlignment: isVerseSelectedForAlignment,
945
- onAlignmentFinish: function onAlignmentFinish() {
946
- return setState({
947
- verseSelectedForAlignment: null
948
- });
949
- },
950
1158
  updateVersesAlignmentStatus: updateVersesAlignmentStatus
951
1159
  }));
952
1160
  });
@@ -963,8 +1171,8 @@ export default function ScriptureCard(_ref) {
963
1171
  }
964
1172
  };
965
1173
 
966
- var onRenderToolbar = function onRenderToolbar(_ref8) {
967
- var items = _ref8.items;
1174
+ var onRenderToolbar = function onRenderToolbar(_ref10) {
1175
+ var items = _ref10.items;
968
1176
 
969
1177
  var newItems = _toConsumableArray(items);
970
1178
 
@@ -1006,21 +1214,17 @@ export default function ScriptureCard(_ref) {
1006
1214
  }, alignIcon));
1007
1215
  }
1008
1216
 
1009
- newItems.push( /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(UpdateBranchButton, _extends({}, updateButtonProps, {
1010
- isLoading: isUpdateLoading || startSave
1011
- })), /*#__PURE__*/React.createElement(ErrorDialog, {
1012
- title: dialogTitle,
1013
- content: dialogMessage,
1014
- open: isErrorDialogOpen,
1015
- onClose: onCloseErrorDialog,
1016
- isLoading: isUpdateLoading || startSave,
1017
- link: dialogLink,
1018
- linkTooltip: dialogLinkTooltip
1019
- })));
1020
1217
  return newItems;
1021
1218
  };
1022
1219
 
1023
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Card, {
1220
+ return /*#__PURE__*/React.createElement(SelectionsContextProvider, {
1221
+ selections: selections,
1222
+ onSelections: function onSelections(newSelections) {// console.log('onSelections', newSelections)
1223
+ },
1224
+ quote: selectedQuote === null || selectedQuote === void 0 ? void 0 : selectedQuote.quote,
1225
+ occurrence: fixOccurrence(selectedQuote === null || selectedQuote === void 0 ? void 0 : selectedQuote.occurrence),
1226
+ verseObjectsMap: verseObjectsMap
1227
+ }, /*#__PURE__*/React.createElement(Card, {
1024
1228
  id: "scripture_card_".concat(cardNum),
1025
1229
  title: scriptureLabel,
1026
1230
  settingsTitle: scriptureTitle + ' Settings',
@@ -1039,7 +1243,7 @@ export default function ScriptureCard(_ref) {
1039
1243
  hideMarkdownToggle: true,
1040
1244
  onMenuClose: onMenuClose,
1041
1245
  onMinimize: onMinimize ? function () {
1042
- return onMinimize(id);
1246
+ return onMinimize(id, scriptureTitle);
1043
1247
  } : null,
1044
1248
  editable: enableEdit || enableAlignment,
1045
1249
  saved: startSave || !haveUnsavedChanges,
@@ -1070,63 +1274,50 @@ export default function ScriptureCard(_ref) {
1070
1274
  }));
1071
1275
  }
1072
1276
  ScriptureCard.propTypes = {
1073
- /** html identifier to use for card */
1074
- id: PropTypes.string,
1075
-
1076
- /** method to determine if NT or OT */
1077
- isNT: PropTypes.func.isRequired,
1277
+ /** repo branch or tag such as master */
1278
+ appRef: PropTypes.string.isRequired,
1078
1279
 
1079
- /** title for scripture card */
1080
- title: PropTypes.string.isRequired,
1280
+ /** authentication info */
1281
+ authentication: PropTypes.object,
1081
1282
 
1082
- /** get language details */
1083
- getLanguage: PropTypes.func.isRequired,
1283
+ /** index for current book (e.g. '01' for 'gen')*/
1284
+ bookIndex: PropTypes.string,
1084
1285
 
1085
1286
  /** scripture card number (0 to 2 for example) */
1086
1287
  cardNum: PropTypes.number.isRequired,
1087
1288
 
1088
- /** resource object */
1089
- resource: PropTypes.shape({
1090
- /** resource language to use */
1091
- languageId: PropTypes.string.isRequired,
1092
-
1093
- /** repo owner such as unfoldingWord */
1094
- owner: PropTypes.string.isRequired,
1289
+ /** CSS classes */
1290
+ classes: PropTypes.object,
1095
1291
 
1096
- /** resourceId to use (e.g. ugnt) */
1097
- resourceId: PropTypes.string.isRequired,
1292
+ /** if true then word data hover is shown */
1293
+ disableWordPopover: PropTypes.bool,
1098
1294
 
1099
- /** repo owner for original languages such as unfoldingWord */
1100
- originalLanguageOwner: PropTypes.string.isRequired
1101
- }),
1102
- reference: PropTypes.shape({
1103
- /** projectId (bookID) to use */
1104
- projectId: PropTypes.string.isRequired,
1295
+ /** get language details */
1296
+ getLanguage: PropTypes.func.isRequired,
1105
1297
 
1106
- /** current chapter number */
1107
- chapter: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,
1298
+ /** function to get latest lexicon data */
1299
+ getLexiconData: PropTypes.func,
1108
1300
 
1109
- /** current verse number */
1110
- verse: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired
1111
- }),
1301
+ /** optional url for greek repo */
1302
+ greekRepoUrl: PropTypes.string,
1112
1303
 
1113
- /** server (e.g. 'https://git.door43.org') */
1114
- server: PropTypes.string.isRequired,
1304
+ /** optional url for hebrew repo */
1305
+ hebrewRepoUrl: PropTypes.string,
1115
1306
 
1116
- /** repo branch or tag such as master */
1117
- appRef: PropTypes.string.isRequired,
1307
+ /** optional http timeout in milliseconds for fetching resources, default is 0 (very long wait) */
1308
+ httpConfig: PropTypes.object,
1118
1309
 
1119
- /** if true then word data hover is shown */
1120
- disableWordPopover: PropTypes.bool,
1310
+ /** html identifier to use for card */
1311
+ id: PropTypes.string,
1121
1312
 
1122
- /** CSS classes */
1123
- classes: PropTypes.object,
1313
+ /** method to determine if NT or OT */
1314
+ isNT: PropTypes.func.isRequired,
1124
1315
 
1125
- /** resourceLink */
1126
- resourceLink: PropTypes.any,
1316
+ /** user-name */
1317
+ loggedInUser: PropTypes.string,
1127
1318
 
1128
- /** use method for using local storage specific for user */
1129
- useUserLocalStorage: PropTypes.func.isRequired,
1319
+ /** function to minimize the card (optional) */
1320
+ onMinimize: PropTypes.func,
1130
1321
 
1131
1322
  /** optional callback if error loading resource, parameter returned are:
1132
1323
  * ({string} errorMessage, {boolean} isAccessError, {object} resourceStatus)
@@ -1134,52 +1325,56 @@ ScriptureCard.propTypes = {
1134
1325
  * - resourceStatus - is object containing details about problems fetching resource */
1135
1326
  onResourceError: PropTypes.func,
1136
1327
 
1137
- /** optional http timeout in milliseconds for fetching resources, default is 0 (very long wait) */
1138
- httpConfig: PropTypes.object,
1328
+ /** the original scripture bookObjects for current book */
1329
+ originalScriptureBookObjects: PropTypes.object,
1330
+ reference: PropTypes.shape({
1331
+ /** projectId (bookID) to use */
1332
+ projectId: PropTypes.string.isRequired,
1139
1333
 
1140
- /** optional url for greek repo */
1141
- greekRepoUrl: PropTypes.string,
1334
+ /** current chapter number */
1335
+ chapter: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,
1142
1336
 
1143
- /** optional url for hebrew repo */
1144
- hebrewRepoUrl: PropTypes.string,
1337
+ /** current verse number */
1338
+ verse: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired
1339
+ }),
1145
1340
 
1146
- /** function to get latest lexicon data */
1147
- getLexiconData: PropTypes.func,
1341
+ /** resource object */
1342
+ resource: PropTypes.shape({
1343
+ /** resource language to use */
1344
+ languageId: PropTypes.string.isRequired,
1148
1345
 
1149
- /** function to pre-load lexicon data for verse */
1150
- fetchGlossesForVerse: PropTypes.func,
1346
+ /** repo owner such as unfoldingWord */
1347
+ owner: PropTypes.string.isRequired,
1151
1348
 
1152
- /** optional function for localization */
1153
- translate: PropTypes.func,
1349
+ /** resourceId to use (e.g. ugnt) */
1350
+ resourceId: PropTypes.string.isRequired,
1154
1351
 
1155
- /** function to minimize the card (optional) */
1156
- onMinimize: PropTypes.func,
1352
+ /** repo owner for original languages such as unfoldingWord */
1353
+ originalLanguageOwner: PropTypes.string.isRequired
1354
+ }),
1157
1355
 
1158
- /** user-name */
1159
- loggedInUser: PropTypes.string,
1356
+ /** resourceLink */
1357
+ resourceLink: PropTypes.any,
1160
1358
 
1161
- /** authentication info */
1162
- authentication: PropTypes.object,
1359
+ /**This is currently selected quote */
1360
+ selectedQuote: PropTypes.object,
1361
+
1362
+ /** server (e.g. 'https://git.door43.org') */
1363
+ server: PropTypes.string.isRequired,
1163
1364
 
1164
1365
  /** function to set state in app that there are unsaved changes */
1165
1366
  setSavedChanges: PropTypes.func,
1166
1367
 
1167
- /** index for current book (e.g. '01' for 'gen')*/
1168
- bookIndex: PropTypes.string,
1169
-
1170
- /** callback to indicate that we are using a verse range here */
1171
- addVerseRange: PropTypes.func,
1172
-
1173
1368
  /** callback to update word aligner state */
1174
1369
  setWordAlignerStatus: PropTypes.func,
1175
1370
 
1176
- /** callback to update the card's merge state in app */
1177
- updateMergeState: PropTypes.func,
1371
+ /** title for scripture card */
1372
+ title: PropTypes.string.isRequired,
1178
1373
 
1179
- /** callback to update loading state */
1180
- setAreResourcesLoading: PropTypes.func,
1374
+ /** optional function for localization */
1375
+ translate: PropTypes.func,
1181
1376
 
1182
- /** callback to update saving state*/
1183
- setAreResourcesSaving: PropTypes.func
1377
+ /** use method for using local storage specific for user */
1378
+ useUserLocalStorage: PropTypes.func.isRequired
1184
1379
  };
1185
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL1NjcmlwdHVyZUNhcmQvU2NyaXB0dXJlQ2FyZC50c3giXSwibmFtZXMiOlsiUmVhY3QiLCJQcm9wVHlwZXMiLCJjb3JlIiwidXNmbWpzIiwidXNlRWRpdCIsIkljb25CdXR0b24iLCJSeExpbmsyIiwiUnhMaW5rQnJlYWsyIiwiQ2FyZCIsInVzZUNhcmRTdGF0ZSIsInVzZVVzZXJCcmFuY2giLCJ1c2VCcmFuY2hNZXJnZXIiLCJ1c2VDb250ZW50VXBkYXRlUHJvcHMiLCJ1c2VNYXN0ZXJNZXJnZVByb3BzIiwiVXBkYXRlQnJhbmNoQnV0dG9uIiwiRXJyb3JEaWFsb2ciLCJFUlJPUl9TVEFURSIsIk1BTklGRVNUX05PVF9MT0FERURfRVJST1IiLCJBbGlnbm1lbnRIZWxwZXJzIiwiVXNmbUZpbGVDb252ZXJzaW9uSGVscGVycyIsImlzRXF1YWwiLCJTY3JpcHR1cmVQYW5lIiwiU2NyaXB0dXJlU2VsZWN0b3IiLCJ1c2VTY3JpcHR1cmVTZXR0aW5ncyIsImdldFJlc291cmNlTGluayIsImdldFJlc291cmNlTWVzc2FnZSIsImdldFNjcmlwdHVyZVZlcnNpb25TZXR0aW5ncyIsImlzT3JpZ2luYWxCaWJsZSIsIlRpdGxlIiwiTlRfT1JJR19MQU5HIiwiT1JJR0lOQUxfU09VUkNFIiwiT1RfT1JJR19MQU5HIiwiVmVyc2VTZWxlY3RvclBvcHVwIiwiS0VZX0ZPTlRfU0laRV9CQVNFIiwibGFiZWwiLCJzdHlsZSIsIm1hcmdpblRvcCIsIndpZHRoIiwiU2NyaXB0dXJlQ2FyZCIsImlkIiwiaXNOVCIsInRpdGxlIiwic2VydmVyIiwiYXBwUmVmIiwiY2FyZE51bSIsImNsYXNzZXMiLCJyZXNvdXJjZSIsIm93bmVyIiwibGFuZ3VhZ2VJZCIsInJlc291cmNlSWQiLCJvcmlnaW5hbExhbmd1YWdlT3duZXIiLCJnZXRMYW5ndWFnZSIsInJlZmVyZW5jZSIsInZlcnNlIiwiY2hhcHRlciIsImJvb2tJZCIsInByb2plY3RJZCIsInJlc291cmNlTGluayIsInVzZVVzZXJMb2NhbFN0b3JhZ2UiLCJkaXNhYmxlV29yZFBvcG92ZXIiLCJvblJlc291cmNlRXJyb3IiLCJodHRwQ29uZmlnIiwiZ3JlZWtSZXBvVXJsIiwiaGVicmV3UmVwb1VybCIsImdldExleGljb25EYXRhIiwiZmV0Y2hHbG9zc2VzRm9yVmVyc2UiLCJ0cmFuc2xhdGUiLCJvbk1pbmltaXplIiwibG9nZ2VkSW5Vc2VyIiwiYXV0aGVudGljYXRpb24iLCJzZXRTYXZlZENoYW5nZXMiLCJib29rSW5kZXgiLCJhZGRWZXJzZVJhbmdlIiwic2V0V29yZEFsaWduZXJTdGF0dXMiLCJ1cGRhdGVNZXJnZVN0YXRlIiwic2V0Q2FyZHNMb2FkaW5nVXBkYXRlIiwic2V0Q2FyZHNMb2FkaW5nTWVyZ2UiLCJzZXRDYXJkc1NhdmluZyIsInVzZVN0YXRlIiwiaGF2ZVVuc2F2ZWRDaGFuZ2VzIiwicmVmIiwic2F2ZUNsaWNrZWQiLCJzYXZlQ29udGVudCIsInNoYSIsInN0YXJ0U2F2ZSIsInVybEVycm9yIiwidXNpbmdVc2VyQnJhbmNoIiwidW5zYXZlZENoYW5nZXNMaXN0IiwidmVyc2VzRm9yUmVmIiwic2hvd0FsaWdubWVudFBvcHVwIiwidmVyc2VTZWxlY3RlZEZvckFsaWdubWVudCIsInZlcnNlc0FsaWdubWVudFN0YXR1cyIsInN0YXRlIiwic2V0U3RhdGVfIiwiZm9udFNpemUiLCJzZXRGb250U2l6ZSIsImlzTlRfIiwic2V0U3RhdGUiLCJuZXdTdGF0ZSIsInByZXZTdGF0ZSIsImNhY2hlIiwibWF4QWdlIiwic2V0VXJsRXJyb3IiLCJlcnJvciIsIndob2xlQm9vayIsImlzTmV3VGVzdGFtZW50Iiwic2NyaXB0dXJlQ29uZmlnIiwic2V0U2NyaXB0dXJlIiwic2NyaXB0dXJlU2V0dGluZ3MiLCJzY3JpcHR1cmVWZXJzaW9uSGlzdCIsImZldGNoUmVzcF8iLCJmZXRjaFJlc3BvbnNlIiwicmVwbyIsInJlZmVyZW5jZV8iLCJ1c2VFZmZlY3QiLCJfc2hhIiwiZGF0YSIsImNvbnNvbGUiLCJsb2ciLCJKU09OIiwic3RyaW5naWZ5IiwiY2FyZFJlc291cmNlSWQiLCJyZWZfIiwiY2FuVXNlRWRpdEJyYW5jaCIsInN1YnN0cmluZyIsImxlbmd0aCIsImNhcmRJZCIsIndvcmtpbmdSZXNvdXJjZUJyYW5jaCIsInVzZXJFZGl0QnJhbmNoTmFtZSIsInVzaW5nVXNlckJyYW5jaF8iLCJhY3Rpb25zIiwic3RhcnRFZGl0QnJhbmNoIiwic3RhcnRFZGl0IiwiZmluaXNoRWRpdCIsIl91c2VCcmFuY2hNZXJnZXIiLCJ1c2VyQnJhbmNoIiwidG9rZW5pZCIsInRva2VuIiwic2hhMSIsIm1lcmdlVG9NYXN0ZXIiLCJtZXJnZVN0YXR1cyIsIm1lcmdlRnJvbU1hc3RlciIsInVwZGF0ZVN0YXR1cyIsInVwZGF0ZUJ1dHRvblByb3BzIiwiaXNTYXZpbmciLCJvblVwZGF0ZSIsInJlbG9hZFJlc291cmNlIiwiY2FsbFVwZGF0ZVVzZXJCcmFuY2giLCJpc0Vycm9yRGlhbG9nT3BlbiIsIm9uQ2xvc2VFcnJvckRpYWxvZyIsImlzVXBkYXRlTG9hZGluZyIsImlzTG9hZGluZyIsImRpYWxvZ01lc3NhZ2UiLCJkaWFsb2dUaXRsZSIsImRpYWxvZ0xpbmsiLCJkaWFsb2dMaW5rVG9vbHRpcCIsIm9uTWVyZ2UiLCJpc01lcmdlTG9hZGluZyIsImNhbGxNZXJnZVVzZXJCcmFuY2giLCJwcmV2Q2FyZHNMb2FkaW5nIiwiZmlsdGVyIiwid29ya2luZ1JlZiIsInNjcmlwdHVyZVRpdGxlIiwid29ya2luZ1JlZl8iLCJyZXNvdXJjZVN0YXR1cyIsIm1lc3NhZ2UiLCJpc0FjY2Vzc0Vycm9yIiwidmVyc2lvbiIsInVwZGF0ZVRpdGxlIiwiZ2V0U2NyaXB0dXJlU2VsZWN0b3IiLCJzY3JpcHR1cmVTZWxlY3Rpb25Db25maWciLCJvbk1lbnVDbG9zZSIsImxhbmd1YWdlSWRfIiwibGFuZ3VhZ2UiLCJkaXJlY3Rpb24iLCJpc0hlYnJldyIsImZvbnRGYWN0b3IiLCJzY2FsZWRGb250U2l6ZSIsIml0ZW1zIiwiaGVhZGVycyIsImZpbHRlcnMiLCJpdGVtSW5kZXgiLCJtYXJrZG93blZpZXciLCJzZXRGaWx0ZXJzIiwic2V0SXRlbUluZGV4Iiwic2V0TWFya2Rvd25WaWV3IiwicmVmU3R5bGUiLCJ1c2VNZW1vIiwiZm9udEZhbWlseSIsIk1hdGgiLCJyb3VuZCIsImNvbnRlbnRTdHlsZSIsInNjcmlwdHVyZUxhYmVsIiwiZGlzYWJsZVdvcmRQb3BvdmVyXyIsInVzaW5nT3JpZ2luYWxCaWJsZSIsInVuZGVmaW5lZCIsImZldGNoR2xvc3NEYXRhRm9yVmVyc2UiLCJ2ZXJzZU9iamVjdHMiLCJ2ZXJzZVJlZiIsIl92ZXJzZU9iamVjdHMiLCJ2ZXJzZURhdGEiLCJjb25jYXQiLCJlbmFibGVFZGl0IiwiZW5hYmxlQWxpZ25tZW50Iiwib3JpZ2luYWxSZXBvVXJsIiwic2NyaXB0dXJlQWxpZ25tZW50RWRpdENvbmZpZyIsImN1cnJlbnRWZXJzZVJlZiIsIl9zZXRTYXZlZENoYW5nZXMiLCJzb3VyY2VMYW5ndWFnZSIsInRhcmdldExhbmd1YWdlIiwiY3VycmVudEluZGV4Iiwic2F2ZWQiLCJnZXRDaGFuZ2VzIiwiY2xlYXJDaGFuZ2VzIiwiX3Vuc2F2ZWRDaGFuZ2VzTGlzdCIsImhhc093blByb3BlcnR5IiwiX2hhdmVVbnNhdmVkQ2hhbmdlcyIsIk9iamVjdCIsImtleXMiLCJmaW5kUmVmSW5BcnJheSIsImZpbmRJdGVtIiwiY2h1bmtzIiwicmVmTGVuIiwiaW5kZXgiLCJmaW5kSW5kZXgiLCJjaHVuayIsImlkeCIsIm5leHRDaGFyIiwiZ2V0Qm9va05hbWUiLCJib29rQ2FwcyIsInRvVXBwZXJDYXNlIiwiZmlsZXBhdGgiLCJjb250ZW50IiwiY29uZmlnIiwidGltZW91dCIsInNlcnZlclRpbWVPdXQiLCJhdXRob3IiLCJicmFuY2giLCJvblNhdmVFZGl0IiwiX3NhdmVFZGl0IiwidGhlbiIsInN1Y2Nlc3MiLCJwcmV2Q2FyZHNTYXZpbmciLCJ1bnNhdmVkQ2FyZEluZGljZXMiLCJjYXJkSW5kZXgiLCJpbmZvIiwibWVyZ2VWZXJzZU9iamVjdHNJbnRvQmlibGVVc2ZtIiwiYmlibGVVc2ZtIiwidXBkYXRlZFZlcnNlT2JqZWN0cyIsIm5ld1VzZm0iLCJjaGFwdGVyQ2h1bmtzIiwic3BsaXQiLCJjaGFwdGVySW5kZXgiLCJjdXJyZW50Q2hhcHRlciIsInZlcnNlQ2h1bmtzIiwidmVyc2VJbmRleCIsIm5ld1ZlcnNlVXNmbSIsImNvbnZlcnRWZXJzZURhdGFUb1VTRk0iLCJvbGRWZXJzZSIsInZlcnNlTnVtTGVuIiwibmV3Q2hhcHRlciIsImpvaW4iLCJnZXRSZXNwb25zZURhdGEiLCJtZXJnZUZhaWwiLCJwYXJzZUludCIsIm5ld0Jvb2tKc29uIiwibmV3VmVyc2VUZXh0IiwidGFyZ2V0VmVyc2VPYmplY3RzXyIsInVwZGF0ZUFsaWdubWVudHNUb1RhcmdldFZlcnNlIiwidGFyZ2V0VmVyc2VPYmplY3RzIiwidXBkYXRlVmVyc2UiLCJ0b1VTRk0iLCJmb3JjZWROZXdMaW5lcyIsIl92ZXJzZSIsImluY2x1ZGVzIiwidXBkYXRlVmVyc2VzQWxpZ25tZW50U3RhdHVzIiwiYWxpZ25lZCIsInJlbmRlcmVkU2NyaXB0dXJlUGFuZXMiLCJtYXAiLCJfY3VycmVudFZlcnNlRGF0YSIsImluaXRpYWxWZXJzZU9iamVjdHMiLCJfcmVmZXJlbmNlIiwiX3NjcmlwdHVyZUFsaWdubWVudEVkaXRDb25maWciLCJpc1ZlcnNlU2VsZWN0ZWRGb3JBbGlnbm1lbnQiLCJoYW5kbGVBbGlnbkJ1dHRvbkNsaWNrIiwib25SZW5kZXJUb29sYmFyIiwibmV3SXRlbXMiLCJhbGxWZXJzZXNBbGlnbmVkIiwidmFsdWVzIiwiZXZlcnkiLCJhbGlnblN0YXR1cyIsImFsaWduSWNvbiIsImFsaWduQnV0dG9uVGV4dCIsInB1c2giLCJjdXJzb3IiLCJwcm9wVHlwZXMiLCJzdHJpbmciLCJmdW5jIiwiaXNSZXF1aXJlZCIsIm51bWJlciIsInNoYXBlIiwib25lT2ZUeXBlIiwiYm9vbCIsIm9iamVjdCIsImFueSIsInNldEFyZVJlc291cmNlc0xvYWRpbmci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QjtBQUNBNU8sRUFBQUEsVUFBVSxFQUFFNUQsU0FBUyxDQUFDOFMsTUFoREU7O0FBaUR4QjtBQUNBalAsRUFBQUEsWUFBWSxFQUFFN0QsU0FBUyxDQUFDdVMsTUFsREE7O0FBbUR4QjtBQUNBek8sRUFBQUEsYUFBYSxFQUFFOUQsU0FBUyxDQUFDdVMsTUFwREQ7O0FBcUR4QjtBQUNBeE8sRUFBQUEsY0FBYyxFQUFFL0QsU0FBUyxDQUFDd1MsSUF0REY7O0FBdUR4QjtBQUNBeE8sRUFBQUEsb0JBQW9CLEVBQUVoRSxTQUFTLENBQUN3UyxJQXhEUjs7QUF5RHhCO0FBQ0F2TyxFQUFBQSxTQUFTLEVBQUVqRSxTQUFTLENBQUN3UyxJQTFERzs7QUEyRHhCO0FBQ0F0TyxFQUFBQSxVQUFVLEVBQUVsRSxTQUFTLENBQUN3UyxJQTVERTs7QUE2RHhCO0FBQ0FyTyxFQUFBQSxZQUFZLEVBQUVuRSxTQUFTLENBQUN1UyxNQTlEQTs7QUErRHhCO0FBQ0FuTyxFQUFBQSxjQUFjLEVBQUVwRSxTQUFTLENBQUM4UyxNQWhFRjs7QUFpRXhCO0FBQ0F6TyxFQUFBQSxlQUFlLEVBQUVyRSxTQUFTLENBQUN3UyxJQWxFSDs7QUFtRXhCO0FBQ0FsTyxFQUFBQSxTQUFTLEVBQUV0RSxTQUFTLENBQUN1UyxNQXBFRzs7QUFxRXhCO0FBQ0FoTyxFQUFBQSxhQUFhLEVBQUV2RSxTQUFTLENBQUN3UyxJQXRFRDs7QUF1RXhCO0FBQ0FoTyxFQUFBQSxvQkFBb0IsRUFBRXhFLFNBQVMsQ0FBQ3dTLElBeEVSOztBQXlFeEI7QUFDQS9OLEVBQUFBLGdCQUFnQixFQUFFekUsU0FBUyxDQUFDd1MsSUExRUo7O0FBMkV4QjtBQUNBUSxFQUFBQSxzQkFBc0IsRUFBRWhULFNBQVMsQ0FBQ3dTLElBNUVWOztBQTZFeEI7QUFDQVMsRUFBQUEscUJBQXFCLEVBQUVqVCxTQUFTLENBQUN3UztBQTlFVCxDQUExQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnXG5pbXBvcnQgeyBjb3JlIH0gZnJvbSAnc2NyaXB0dXJlLXJlc291cmNlcy1yY2wnXG5pbXBvcnQgdXNmbWpzIGZyb20gJ3VzZm0tanMnXG5pbXBvcnQgeyB1c2VFZGl0IH0gZnJvbSAnZ2l0ZWEtcmVhY3QtdG9vbGtpdCdcbmltcG9ydCB7IEljb25CdXR0b24gfSBmcm9tICdAbXVpL21hdGVyaWFsJ1xuaW1wb3J0IHsgUnhMaW5rMiwgUnhMaW5rQnJlYWsyIH0gZnJvbSAncmVhY3QtaWNvbnMvcngnXG5pbXBvcnQge1xuICBDYXJkLFxuICB1c2VDYXJkU3RhdGUsXG4gIHVzZVVzZXJCcmFuY2gsXG4gIHVzZUJyYW5jaE1lcmdlcixcbiAgdXNlQ29udGVudFVwZGF0ZVByb3BzLFxuICB1c2VNYXN0ZXJNZXJnZVByb3BzLFxuICBVcGRhdGVCcmFuY2hCdXR0b24sXG4gIEVycm9yRGlhbG9nLFxuICBFUlJPUl9TVEFURSxcbiAgTUFOSUZFU1RfTk9UX0xPQURFRF9FUlJPUixcbn0gZnJvbSAndHJhbnNsYXRpb24taGVscHMtcmNsJ1xuaW1wb3J0IHsgQWxpZ25tZW50SGVscGVycywgVXNmbUZpbGVDb252ZXJzaW9uSGVscGVycyB9IGZyb20gJ3dvcmQtYWxpZ25lci1yY2wnXG5pbXBvcnQgKiBhcyBpc0VxdWFsIGZyb20gJ2RlZXAtZXF1YWwnXG5pbXBvcnQgeyBTY3JpcHR1cmVQYW5lLCBTY3JpcHR1cmVTZWxlY3RvciB9IGZyb20gJy4uJ1xuaW1wb3J0IHsgdXNlU2NyaXB0dXJlU2V0dGluZ3MgfSBmcm9tICcuLi8uLi9ob29rcy91c2VTY3JpcHR1cmVTZXR0aW5ncydcbmltcG9ydCB7XG4gIGdldFJlc291cmNlTGluayxcbiAgZ2V0UmVzb3VyY2VNZXNzYWdlLFxuICBnZXRTY3JpcHR1cmVWZXJzaW9uU2V0dGluZ3MsXG4gIGlzT3JpZ2luYWxCaWJsZSxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvU2NyaXB0dXJlU2V0dGluZ3MnXG5pbXBvcnQgeyBUaXRsZSB9IGZyb20gJy4uL1NjcmlwdHVyZVBhbmUvc3R5bGVkJ1xuaW1wb3J0IHtcbiAgTlRfT1JJR19MQU5HLFxuICBPUklHSU5BTF9TT1VSQ0UsXG4gIE9UX09SSUdfTEFORyxcbn0gZnJvbSAnLi4vLi4vdXRpbHMnXG5pbXBvcnQgeyBWZXJzZVNlbGVjdG9yUG9wdXAgfSBmcm9tICcuLi9WZXJzZVNlbGVjdG9yUG9wdXAnXG5cbmNvbnN0IEtFWV9GT05UX1NJWkVfQkFTRSA9ICdzY3JpcHR1cmVQYW5lRm9udFNpemVfJ1xuY29uc3QgbGFiZWwgPSAnVmVyc2lvbidcbmNvbnN0IHN0eWxlID0geyBtYXJnaW5Ub3A6ICcxNnB4Jywgd2lkdGg6ICc1MDBweCcgfVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBTY3JpcHR1cmVDYXJkKHtcbiAgaWQsXG4gIGlzTlQsXG4gIHRpdGxlLFxuICBzZXJ2ZXIsXG4gIGFwcFJlZixcbiAgY2FyZE51bSxcbiAgY2xhc3NlcyxcbiAgcmVzb3VyY2U6IHtcbiAgICBvd25lcixcbiAgICBsYW5ndWFnZUlkLFxuICAgIHJlc291cmNlSWQsXG4gICAgb3JpZ2luYWxMYW5ndWFnZU93bmVyLFxuICB9LFxuICBnZXRMYW5ndWFnZSxcbiAgcmVmZXJlbmNlOiB7XG4gICAgdmVyc2UsXG4gICAgY2hhcHRlcixcbiAgICBwcm9qZWN0SWQ6IGJvb2tJZCxcbiAgfSxcbiAgcmVzb3VyY2VMaW5rLFxuICB1c2VVc2VyTG9jYWxTdG9yYWdlLFxuICBkaXNhYmxlV29yZFBvcG92ZXIsXG4gIG9uUmVzb3VyY2VFcnJvcixcbiAgaHR0cENvbmZpZyxcbiAgZ3JlZWtSZXBvVXJsLFxuICBoZWJyZXdSZXBvVXJsLFxuICBnZXRMZXhpY29uRGF0YSxcbiAgZmV0Y2hHbG9zc2VzRm9yVmVyc2UsXG4gIHRyYW5zbGF0ZSxcbiAgb25NaW5pbWl6ZSxcbiAgbG9nZ2VkSW5Vc2VyLFxuICBhdXRoZW50aWNhdGlvbixcbiAgc2V0U2F2ZWRDaGFuZ2VzLFxuICBib29rSW5kZXgsXG4gIGFkZFZlcnNlUmFuZ2UsXG4gIHNldFdvcmRBbGlnbmVyU3RhdHVzLFxuICB1cGRhdGVNZXJnZVN0YXRlLFxuICBzZXRDYXJkc0xvYWRpbmdVcGRhdGUsXG4gIHNldENhcmRzTG9hZGluZ01lcmdlLFxuICBzZXRDYXJkc1NhdmluZ1xufSkge1xuICBjb25zdCBbc3RhdGUsIHNldFN0YXRlX10gPSBSZWFjdC51c2VTdGF0ZSh7XG4gICAgaGF2ZVVuc2F2ZWRDaGFuZ2VzOiBmYWxzZSxcbiAgICByZWY6IGFwcFJlZixcbiAgICBzYXZlQ2xpY2tlZDogZmFsc2UsXG4gICAgc2F2ZUNvbnRlbnQ6IG51bGwsXG4gICAgc2hhOiBudWxsLFxuICAgIHN0YXJ0U2F2ZTogZmFsc2UsXG4gICAgdXJsRXJyb3I6IG51bGwsXG4gICAgdXNpbmdVc2VyQnJhbmNoOiBmYWxzZSxcbiAgICB1bnNhdmVkQ2hhbmdlc0xpc3Q6IHt9LFxuICAgIHZlcnNlc0ZvclJlZjogbnVsbCxcbiAgICBzaG93QWxpZ25tZW50UG9wdXA6IGZhbHNlLFxuICAgIHZlcnNlU2VsZWN0ZWRGb3JBbGlnbm1lbnQ6IG51bGwsXG4gICAgdmVyc2VzQWxpZ25tZW50U3RhdHVzOiBudWxsLFxuICB9KVxuICBjb25zdCB7XG4gICAgcmVmLFxuICAgIHNhdmVDbGlja2VkLFxuICAgIHNhdmVDb250ZW50LFxuICAgIHNoYSxcbiAgICBzdGFydFNhdmUsXG4gICAgdXJsRXJyb3IsXG4gICAgdXNpbmdVc2VyQnJhbmNoLFxuICAgIHVuc2F2ZWRDaGFuZ2VzTGlzdCxcbiAgICBoYXZlVW5zYXZlZENoYW5nZXMsXG4gICAgdmVyc2VzRm9yUmVmLFxuICAgIHNob3dBbGlnbm1lbnRQb3B1cCxcbiAgICB2ZXJzZVNlbGVjdGVkRm9yQWxpZ25tZW50LFxuICAgIHZlcnNlc0FsaWdubWVudFN0YXR1cyxcbiAgfSA9IHN0YXRlXG5cbiAgY29uc3QgW2ZvbnRTaXplLCBzZXRGb250U2l6ZV0gPSB1c2VVc2VyTG9jYWxTdG9yYWdlKEtFWV9GT05UX1NJWkVfQkFTRSArIGNhcmROdW0sIDEwMClcbiAgY29uc3QgaXNOVF8gPSBpc05UKGJvb2tJZClcblxuICBmdW5jdGlvbiBzZXRTdGF0ZShuZXdTdGF0ZSkge1xuICAgIHNldFN0YXRlXyhwcmV2U3RhdGUgPT4gKHsgLi4ucHJldlN0YXRlLCAuLi5uZXdTdGF0ZSB9KSlcbiAgfVxuXG4gIGlmICh1c2luZ1VzZXJCcmFuY2gpIHtcbiAgICBodHRwQ29uZmlnID0geyAuLi5odHRwQ29uZmlnLCBjYWNoZTogeyBtYXhBZ2U6IDAgfSB9IC8vIGRpc2FibGUgaHR0cCBjYWNoaW5nXG4gIH1cblxuICBjb25zdCB7XG4gICAgaXNOZXdUZXN0YW1lbnQsXG4gICAgc2NyaXB0dXJlQ29uZmlnLFxuICAgIHNldFNjcmlwdHVyZSxcbiAgICBzY3JpcHR1cmVTZXR0aW5ncyxcbiAgICBzY3JpcHR1cmVWZXJzaW9uSGlzdCxcbiAgfSA9IHVzZVNjcmlwdHVyZVNldHRpbmdzKHtcbiAgICBpc05ULFxuICAgIHRpdGxlLFxuICAgIHZlcnNlLFxuICAgIG93bmVyLFxuICAgIGJvb2tJZCxcbiAgICBhcHBSZWY6IHJlZixcbiAgICBzZXJ2ZXIsXG4gICAgY2FyZE51bSxcbiAgICBjaGFwdGVyLFxuICAgIGxhbmd1YWdlSWQsXG4gICAgcmVzb3VyY2VJZCxcbiAgICByZXNvdXJjZUxpbmssXG4gICAgdXNlVXNlckxvY2FsU3RvcmFnZSxcbiAgICBkaXNhYmxlV29yZFBvcG92ZXIsXG4gICAgb3JpZ2luYWxMYW5ndWFnZU93bmVyLFxuICAgIHNldFVybEVycm9yOiAoZXJyb3IpID0+IHNldFN0YXRlKHsgdXJsRXJyb3I6IGVycm9yIH0pLFxuICAgIGh0dHBDb25maWcsXG4gICAgZ3JlZWtSZXBvVXJsLFxuICAgIGhlYnJld1JlcG9VcmwsXG4gICAgd2hvbGVCb29rOiB0cnVlLFxuICB9KVxuXG4gIGNvbnN0IGZldGNoUmVzcF8gPSBzY3JpcHR1cmVDb25maWc/LmZldGNoUmVzcG9uc2VcbiAgLy8gQHRzLWlnbm9yZVxuICBjb25zdCByZXBvID0gYCR7c2NyaXB0dXJlQ29uZmlnPy5yZXNvdXJjZT8ubGFuZ3VhZ2VJZH1fJHtzY3JpcHR1cmVDb25maWc/LnJlc291cmNlPy5wcm9qZWN0SWR9YFxuICBjb25zdCByZWZlcmVuY2VfID0gc2NyaXB0dXJlQ29uZmlnPy5yZWZlcmVuY2UgfHwgbnVsbFxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7IC8vIGdldCB0aGUgX3NoYSBmcm9tIGxhc3Qgc2NyaXB0dXJlIGRvd25sb2FkXG4gICAgY29uc3QgX3NoYSA9IGZldGNoUmVzcF8/LmRhdGE/LnNoYSB8fCBudWxsXG4gICAgY29uc29sZS5sb2coYGZvciAke0pTT04uc3RyaW5naWZ5KHJlZmVyZW5jZV8pfSBuZXcgc2hhIGlzICR7X3NoYX1gKVxuXG4gICAgaWYgKF9zaGEgIT09IHNoYSkge1xuICAgICAgc2V0U3RhdGUoeyBzaGE6IF9zaGEgfSlcbiAgICB9XG4gIH0sIFtmZXRjaFJlc3BfXSlcblxuICAvLyBAdHMtaWdub3JlXG4gIGNvbnN0IGNhcmRSZXNvdXJjZUlkID0gc2NyaXB0dXJlQ29uZmlnPy5yZXNvdXJjZT8ucHJvamVjdElkIHx8IHJlc291cmNlSWRcbiAgLy8gQHRzLWlnbm9yZVxuICBsZXQgcmVmXyA9IHNjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2U/LnJlZiB8fCBhcHBSZWZcbiAgY29uc3QgY2FuVXNlRWRpdEJyYW5jaCA9IGxvZ2dlZEluVXNlciAmJiBhdXRoZW50aWNhdGlvbiAmJlxuICAgIChyZXNvdXJjZUlkICE9PSBPUklHSU5BTF9TT1VSQ0UpICYmXG4gICAgKChyZWZfID09PSAnbWFzdGVyJykgfHwgKHJlZl8uc3Vic3RyaW5nKDAsIGxvZ2dlZEluVXNlci5sZW5ndGgpID09PSBsb2dnZWRJblVzZXIpICkgLy8gbm90IHRhZ1xuXG4gIGNvbnN0IHtcbiAgICBzdGF0ZToge1xuICAgICAgd29ya2luZ1Jlc291cmNlQnJhbmNoLFxuICAgICAgdXNlckVkaXRCcmFuY2hOYW1lLFxuICAgICAgdXNpbmdVc2VyQnJhbmNoOiB1c2luZ1VzZXJCcmFuY2hfLFxuICAgIH0sXG4gICAgYWN0aW9uczoge1xuICAgICAgc3RhcnRFZGl0OiBzdGFydEVkaXRCcmFuY2gsXG4gICAgICBmaW5pc2hFZGl0LFxuICAgIH0sXG4gIH0gPSB1c2VVc2VyQnJhbmNoKHtcbiAgICBvd25lcixcbiAgICBzZXJ2ZXIsXG4gICAgYXBwUmVmLFxuICAgIGxhbmd1YWdlSWQsXG4gICAgY2FyZElkOiBpZCxcbiAgICBsb2dnZWRJblVzZXI6IGNhblVzZUVkaXRCcmFuY2ggPyBsb2dnZWRJblVzZXIgOiBudWxsLFxuICAgIGF1dGhlbnRpY2F0aW9uOiBjYW5Vc2VFZGl0QnJhbmNoID8gYXV0aGVudGljYXRpb24gOiBudWxsLFxuICAgIGNhcmRSZXNvdXJjZUlkLFxuICAgIG9uUmVzb3VyY2VFcnJvcixcbiAgICB1c2VVc2VyTG9jYWxTdG9yYWdlLFxuICB9KVxuXG4gIGNvbnN0IF91c2VCcmFuY2hNZXJnZXIgPSB1c2VCcmFuY2hNZXJnZXIoeyBzZXJ2ZXIsIG93bmVyLCByZXBvLCB1c2VyQnJhbmNoOiB1c2VyRWRpdEJyYW5jaE5hbWUsIHRva2VuaWQ6IGF1dGhlbnRpY2F0aW9uPy50b2tlbj8uc2hhMSB9KTtcbiAgY29uc3Qge1xuICAgIHN0YXRlOiB7XG4gICAgICBtZXJnZVN0YXR1czogbWVyZ2VUb01hc3RlcixcbiAgICAgIHVwZGF0ZVN0YXR1czogbWVyZ2VGcm9tTWFzdGVyLFxuICAgIH0sXG4gIH0gPSBfdXNlQnJhbmNoTWVyZ2VyO1xuXG4gIGNvbnN0IHVwZGF0ZUJ1dHRvblByb3BzID0gdXNlQ29udGVudFVwZGF0ZVByb3BzKHtcbiAgICBpc1NhdmluZzogc3RhcnRTYXZlLFxuICAgIHVzZUJyYW5jaE1lcmdlcjogX3VzZUJyYW5jaE1lcmdlcixcbiAgICBvblVwZGF0ZTogc2NyaXB0dXJlQ29uZmlnPy5yZWxvYWRSZXNvdXJjZVxuICB9KTtcbiAgY29uc3Qge1xuICAgIGNhbGxVcGRhdGVVc2VyQnJhbmNoLFxuICAgIGlzRXJyb3JEaWFsb2dPcGVuLFxuICAgIG9uQ2xvc2VFcnJvckRpYWxvZyxcbiAgICBpc0xvYWRpbmc6IGlzVXBkYXRlTG9hZGluZyxcbiAgICBkaWFsb2dNZXNzYWdlLFxuICAgIGRpYWxvZ1RpdGxlLFxuICAgIGRpYWxvZ0xpbmssXG4gICAgZGlhbG9nTGlua1Rvb2x0aXBcbiAgfSA9IHVwZGF0ZUJ1dHRvblByb3BzO1xuXG4gIGNvbnN0IG9uTWVyZ2UgPSAoKSA9PiB7XG4gICAgZmluaXNoRWRpdCgpXG4gICAgc2V0U3RhdGUoeyByZWY6IGFwcFJlZiB9KVxuICAgIC8vIHNjcmlwdHVyZUNvbmZpZz8ucmVsb2FkUmVzb3VyY2UoKVxuICB9XG5cbiAgY29uc3QgeyBpc0xvYWRpbmc6IGlzTWVyZ2VMb2FkaW5nLCBjYWxsTWVyZ2VVc2VyQnJhbmNoIH0gPSB1c2VNYXN0ZXJNZXJnZVByb3BzKHtcbiAgICBpc1NhdmluZzogc3RhcnRTYXZlLFxuICAgIHVzZUJyYW5jaE1lcmdlcjogX3VzZUJyYW5jaE1lcmdlcixcbiAgICBvbk1lcmdlLFxuICB9KVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGNhcmRSZXNvdXJjZUlkKSB7XG4gICAgICB1cGRhdGVNZXJnZVN0YXRlICYmIHVwZGF0ZU1lcmdlU3RhdGUoXG4gICAgICAgIGNhcmRSZXNvdXJjZUlkLFxuICAgICAgICBtZXJnZUZyb21NYXN0ZXIsXG4gICAgICAgIG1lcmdlVG9NYXN0ZXIsXG4gICAgICAgIGNhbGxVcGRhdGVVc2VyQnJhbmNoLFxuICAgICAgICBjYWxsTWVyZ2VVc2VyQnJhbmNoLFxuICAgICAgKVxuICAgIH1cbiAgfSxbY2FyZFJlc291cmNlSWQsIG1lcmdlRnJvbU1hc3RlciwgbWVyZ2VUb01hc3Rlcl0pXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaXNVcGRhdGVMb2FkaW5nKSB7XG4gICAgICBzZXRDYXJkc0xvYWRpbmdVcGRhdGU/LihwcmV2Q2FyZHNMb2FkaW5nID0+IFsuLi5wcmV2Q2FyZHNMb2FkaW5nLCBjYXJkUmVzb3VyY2VJZF0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHNldENhcmRzTG9hZGluZ1VwZGF0ZT8uKHByZXZDYXJkc0xvYWRpbmcgPT4gcHJldkNhcmRzTG9hZGluZy5maWx0ZXIoY2FyZElkID0+IGNhcmRJZCAhPT0gY2FyZFJlc291cmNlSWQpKVxuICAgIH1cbiAgfSwgW2lzVXBkYXRlTG9hZGluZ10pXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaXNNZXJnZUxvYWRpbmcpIHtcbiAgICAgIHNldENhcmRzTG9hZGluZ01lcmdlPy4ocHJldkNhcmRzTG9hZGluZyA9PiBbLi4ucHJldkNhcmRzTG9hZGluZywgY2FyZFJlc291cmNlSWRdKVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXRDYXJkc0xvYWRpbmdNZXJnZT8uKHByZXZDYXJkc0xvYWRpbmcgPT4gcHJldkNhcmRzTG9hZGluZy5maWx0ZXIoY2FyZElkID0+IGNhcmRJZCAhPT0gY2FyZFJlc291cmNlSWQpKVxuICAgIH1cbiAgfSwgW2lzTWVyZ2VMb2FkaW5nXSlcblxuICBjb25zdCB3b3JraW5nUmVmID0gY2FuVXNlRWRpdEJyYW5jaCA/IHdvcmtpbmdSZXNvdXJjZUJyYW5jaCA6IGFwcFJlZlxuICBsZXQgc2NyaXB0dXJlVGl0bGVcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4geyAvLyBzZWxlY3QgY29ycmVjdCB3b3JraW5nIHJlZiAtIGNvdWxkIGJlIG1hc3RlciwgdXNlciBicmFuY2gsIG9yIHJlbGVhc2VcbiAgICBpZiAodXNpbmdVc2VyQnJhbmNoXyAhPT0gdXNpbmdVc2VyQnJhbmNoKSB7XG4gICAgICBzZXRTdGF0ZSh7IHVzaW5nVXNlckJyYW5jaDogdXNpbmdVc2VyQnJhbmNoXyB9KVxuICAgIH1cbiAgfSwgW3VzaW5nVXNlckJyYW5jaF8sIHVzaW5nVXNlckJyYW5jaF0pXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHsgLy8gc2VsZWN0IGNvcnJlY3Qgd29ya2luZyByZWYgLSBjb3VsZCBiZSBtYXN0ZXIsIHVzZXIgYnJhbmNoLCBvciByZWxlYXNlXG4gICAgbGV0IHdvcmtpbmdSZWZfID0gd29ya2luZ1JlZiB8fCBhcHBSZWZcblxuICAgIGlmIChyZWYgIT09IHdvcmtpbmdSZWZfKSB7XG4gICAgICBzZXRTdGF0ZSh7IHJlZjogd29ya2luZ1JlZl8gfSlcbiAgICB9XG4gIH0sIFt3b3JraW5nUmVmLCByZWYsIGFwcFJlZl0pXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHsgLy8gdXBkYXRlIGRpc3BsYXkgc3RhdHVzIGlmIGVycm9yXG4gICAgY29uc3QgZXJyb3IgPSBzY3JpcHR1cmVDb25maWc/LnJlc291cmNlU3RhdHVzPy5bRVJST1JfU1RBVEVdXG5cbiAgICBpZiAoZXJyb3IpIHsgLy8gaWYgZXJyb3Igd2FzIGZvdW5kIGRvIGNhbGxiYWNrXG4gICAgICBjb25zdCByZXNvdXJjZVN0YXR1cyA9IHNjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2VTdGF0dXNcbiAgICAgIGNvbnN0IHJlc291cmNlTGluayA9IGdldFJlc291cmNlTGluayhzY3JpcHR1cmVDb25maWcpXG4gICAgICBjb25zdCBtZXNzYWdlID0gZ2V0UmVzb3VyY2VNZXNzYWdlKHJlc291cmNlU3RhdHVzLCBzZXJ2ZXIsIHJlc291cmNlTGluaywgaXNOVF8pXG4gICAgICBjb25zdCBpc0FjY2Vzc0Vycm9yID0gcmVzb3VyY2VTdGF0dXNbTUFOSUZFU1RfTk9UX0xPQURFRF9FUlJPUl1cbiAgICAgIG9uUmVzb3VyY2VFcnJvciAmJiBvblJlc291cmNlRXJyb3IobWVzc2FnZSwgaXNBY2Nlc3NFcnJvciwgcmVzb3VyY2VTdGF0dXMpXG4gICAgfVxuICB9LCBbc2NyaXB0dXJlQ29uZmlnPy5yZXNvdXJjZVN0YXR1cz8uW0VSUk9SX1NUQVRFXV0pXG5cbiAgaWYgKHNjcmlwdHVyZUNvbmZpZy50aXRsZSAmJiBzY3JpcHR1cmVDb25maWcudmVyc2lvbikge1xuICAgIHNjcmlwdHVyZVRpdGxlID0gYCR7c2NyaXB0dXJlQ29uZmlnLnRpdGxlfSB2JHtzY3JpcHR1cmVDb25maWcudmVyc2lvbn1gXG4gICAgc2NyaXB0dXJlVmVyc2lvbkhpc3QudXBkYXRlVGl0bGUoc2NyaXB0dXJlQ29uZmlnLnJlc291cmNlTGluaywgc2NyaXB0dXJlVGl0bGUpXG4gIH0gZWxzZSB7XG4gICAgc2NyaXB0dXJlVGl0bGUgPSBgVGl0bGUgbWlzc2luZyBmcm9tIHByb2plY3QgbWFuaWZlc3RgXG4gIH1cblxuICAvKiogRHluYW1pY2FsbHkgY3JlYXRlcyB0aGUgc2NyaXB0dXJlIHNlbGVjdGlvbiBkcm9wZG93biB0byBiZSBpbnNlcnRlZCBpbnRvIGNhcmQgc2V0dGluZ3MgKi9cbiAgZnVuY3Rpb24gZ2V0U2NyaXB0dXJlU2VsZWN0b3IoKSB7XG4gICAgY29uc3Qgc2NyaXB0dXJlU2VsZWN0aW9uQ29uZmlnID0gZ2V0U2NyaXB0dXJlVmVyc2lvblNldHRpbmdzKHtcbiAgICAgIGxhYmVsLFxuICAgICAgcmVzb3VyY2VMaW5rOiBzY3JpcHR1cmVDb25maWcucmVzb3VyY2VMaW5rLFxuICAgICAgc2V0U2NyaXB0dXJlLFxuICAgICAgc2NyaXB0dXJlVmVyc2lvbkhpc3QsXG4gICAgfSlcblxuICAgIHJldHVybiA8U2NyaXB0dXJlU2VsZWN0b3Igey4uLnNjcmlwdHVyZVNlbGVjdGlvbkNvbmZpZ30gc3R5bGU9e3N0eWxlfSBlcnJvck1lc3NhZ2U9e3VybEVycm9yfSAvPlxuICB9XG5cbiAgZnVuY3Rpb24gb25NZW51Q2xvc2UoKSB7XG4gICAgLy8gY29uc29sZS5sb2coYG9uTWVudUNsb3NlKClgKVxuICAgIHNldFN0YXRlKHsgdXJsRXJyb3I6IG51bGwgfSlcbiAgfVxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgY29uc3QgbGFuZ3VhZ2VJZF8gPSBzY3JpcHR1cmVDb25maWc/LnJlc291cmNlPy5sYW5ndWFnZUlkXG4gIGNvbnN0IGxhbmd1YWdlID0gZ2V0TGFuZ3VhZ2UoeyBsYW5ndWFnZUlkOiBsYW5ndWFnZUlkXyB9KVxuICBjb25zdCBkaXJlY3Rpb24gPSAobGFuZ3VhZ2U/LmRpcmVjdGlvbikgfHwgJ2x0cidcbiAgY29uc3QgcmVmZXJlbmNlID0geyAuLi5zY3JpcHR1cmVDb25maWcucmVmZXJlbmNlIH1cblxuICBjb25zdCBpc0hlYnJldyA9IChsYW5ndWFnZUlkXyA9PT0gJ2hibycpXG4gIGNvbnN0IGZvbnRGYWN0b3IgPSBpc0hlYnJldyA/IDEuNCA6IDEgLy8gd2UgYXV0b21hdGljYWxseSBzY2FsZSB1cCBmb250IHNpemUgZm9yIEhlYnJld1xuICBjb25zdCBzY2FsZWRGb250U2l6ZSA9IGZvbnRTaXplICogZm9udEZhY3RvclxuXG4gIGNvbnN0IGl0ZW1zID0gbnVsbFxuICBjb25zdCB7XG4gICAgc3RhdGU6IHtcbiAgICAgIGhlYWRlcnMsIGZpbHRlcnMsIGl0ZW1JbmRleCwgbWFya2Rvd25WaWV3LFxuICAgIH0sXG4gICAgYWN0aW9uczoge1xuICAgICAgc2V0RmlsdGVycywgc2V0SXRlbUluZGV4LCBzZXRNYXJrZG93blZpZXcsXG4gICAgfSxcbiAgfSA9IHVzZUNhcmRTdGF0ZSh7IGl0ZW1zIH0pXG5cbiAgY29uc3QgcmVmU3R5bGUgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgZm9udEZhbWlseTogJ05vdG8gU2FucycsXG4gICAgZm9udFNpemU6IGAke01hdGgucm91bmQoc2NhbGVkRm9udFNpemUgKiAwLjkpfSVgLFxuICB9KSwgW3NjYWxlZEZvbnRTaXplXSlcblxuICBjb25zdCBjb250ZW50U3R5bGUgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgZm9udEZhbWlseTogJ05vdG8gU2FucycsXG4gICAgZm9udFNpemU6IGAke3NjYWxlZEZvbnRTaXplfSVgLFxuICB9KSwgW3NjYWxlZEZvbnRTaXplXSlcblxuICBjb25zdCBzY3JpcHR1cmVMYWJlbCA9IDxUaXRsZT57c2NyaXB0dXJlVGl0bGV9PC9UaXRsZT5cbiAgbGV0IGRpc2FibGVXb3JkUG9wb3Zlcl8gPSBkaXNhYmxlV29yZFBvcG92ZXJcbiAgY29uc3QgdXNpbmdPcmlnaW5hbEJpYmxlID0gaXNPcmlnaW5hbEJpYmxlKHNjcmlwdHVyZUNvbmZpZ1sncmVzb3VyY2UnXT8ucHJvamVjdElkKVxuXG4gIGlmIChkaXNhYmxlV29yZFBvcG92ZXIgPT09IHVuZGVmaW5lZCkgeyAvLyBpZiBub3Qgc3BlY2lmaWVkLCB0aGVuIGRldGVybWluZSBpZiBvcmlnaW5hbCBsYW5ndWFnZSByZXNvdXJjZVxuICAgIGRpc2FibGVXb3JkUG9wb3Zlcl8gPSAhdXNpbmdPcmlnaW5hbEJpYmxlXG4gIH1cblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4geyAvLyBwcmUtY2FjaGUgZ2xvc3NlcyBvbiB2ZXJzZSBjaGFuZ2VcbiAgICBjb25zdCBmZXRjaEdsb3NzRGF0YUZvclZlcnNlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHZlcnNlT2JqZWN0cyA9IFtdXG5cbiAgICAgIC8vIGdldCB2ZXJzZSBvYmplY3RzIG9mIGFsbCB0aGUgdmVyc2VzXG4gICAgICBmb3IgKGNvbnN0IHZlcnNlUmVmIG9mIHNjcmlwdHVyZUNvbmZpZz8udmVyc2VzRm9yUmVmIHx8IFtdKSB7XG4gICAgICAgIGNvbnN0IF92ZXJzZU9iamVjdHMgPSB2ZXJzZVJlZj8udmVyc2VEYXRhPy52ZXJzZU9iamVjdHNcbiAgICAgICAgdmVyc2VPYmplY3RzID0gdmVyc2VPYmplY3RzLmNvbmNhdChfdmVyc2VPYmplY3RzKVxuICAgICAgfVxuXG4gICAgICBpZiAoIWRpc2FibGVXb3JkUG9wb3ZlciAmJiB2ZXJzZU9iamVjdHM/Lmxlbmd0aCAmJiBmZXRjaEdsb3NzZXNGb3JWZXJzZSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICBhd2FpdCBmZXRjaEdsb3NzZXNGb3JWZXJzZSh2ZXJzZU9iamVjdHMsIGxhbmd1YWdlSWRfKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1c2luZ09yaWdpbmFsQmlibGUpIHtcbiAgICAgIGZldGNoR2xvc3NEYXRhRm9yVmVyc2UoKVxuICAgIH1cbiAgfSwgWyB2ZXJzZXNGb3JSZWYsIGxhbmd1YWdlSWRfIF0pXG5cbiAgY29uc3QgZW5hYmxlRWRpdCA9ICF1c2luZ09yaWdpbmFsQmlibGVcbiAgY29uc3QgZW5hYmxlQWxpZ25tZW50ID0gIXVzaW5nT3JpZ2luYWxCaWJsZVxuICBjb25zdCBvcmlnaW5hbFJlcG9VcmwgPSBpc05ld1Rlc3RhbWVudCA/IGdyZWVrUmVwb1VybCA6IGhlYnJld1JlcG9VcmxcbiAgY29uc3Qgc2NyaXB0dXJlQWxpZ25tZW50RWRpdENvbmZpZyA9IHtcbiAgICBhdXRoZW50aWNhdGlvbjogY2FuVXNlRWRpdEJyYW5jaCA/IGF1dGhlbnRpY2F0aW9uIDogbnVsbCxcbiAgICBib29rSW5kZXgsXG4gICAgY3VycmVudFZlcnNlUmVmOiByZWZlcmVuY2UsXG4gICAgZW5hYmxlRWRpdCxcbiAgICBlbmFibGVBbGlnbm1lbnQsXG4gICAgaHR0cENvbmZpZyxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaXNOZXdUZXN0YW1lbnQsXG4gICAgbG9nZ2VkSW5Vc2VyOiBjYW5Vc2VFZGl0QnJhbmNoID8gbG9nZ2VkSW5Vc2VyIDogbnVsbCxcbiAgICBvcmlnaW5hbExhbmd1YWdlT3duZXIsXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9yaWdpbmFsUmVwb1VybCxcbiAgICBzY3JpcHR1cmVDb25maWcsXG4gICAgc2NyaXB0dXJlU2V0dGluZ3MsXG4gICAgc3RhcnRFZGl0QnJhbmNoLFxuICAgIHNldFNhdmVkQ2hhbmdlczogX3NldFNhdmVkQ2hhbmdlcyxcbiAgICBzb3VyY2VMYW5ndWFnZTogaXNOVF8gPyBOVF9PUklHX0xBTkcgOiBPVF9PUklHX0xBTkcsXG4gICAgdGFyZ2V0TGFuZ3VhZ2U6IGxhbmd1YWdlLFxuICAgIHRpdGxlOiBzY3JpcHR1cmVUaXRsZSxcbiAgICB3b3JraW5nUmVzb3VyY2VCcmFuY2g6IHJlZixcbiAgfVxuXG4gIC8qKlxuICAgKiB0aGlzIGdldHMgY2FsbGVkIHdoZW5ldmVyIGEgc2NyaXB0dXJlIHBhbmUgaGFzIGEgY2hhbmdlIGluIHNhdmUgc3RhdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGN1cnJlbnRJbmRleFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNhdmVkXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGdldENoYW5nZXMgLSB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciB1c2VyIGNsaWNrcyBzYXZlIGJ1dHRvblxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjbGVhckNoYW5nZXMgLSB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBzYXZlIGhhcyBjb21wbGV0ZWRcbiAgICogQHBhcmFtIHtvYmplY3R9IHN0YXRlIC0gY3VycmVudCBzdGF0ZSBvZiB3b3JkIGFsaWdubWVudC9lZGl0XG4gICAqL1xuICBmdW5jdGlvbiBfc2V0U2F2ZWRDaGFuZ2VzKGN1cnJlbnRJbmRleCwgc2F2ZWQsIHsgZ2V0Q2hhbmdlcyA9IG51bGwsIGNsZWFyQ2hhbmdlcyA9IG51bGwsIHN0YXRlID0gbnVsbCB9KSB7XG4gICAgY29uc3QgX3Vuc2F2ZWRDaGFuZ2VzTGlzdCA9IHsgLi4udW5zYXZlZENoYW5nZXNMaXN0IH1cblxuICAgIGlmIChzYXZlZCkge1xuICAgICAgaWYgKF91bnNhdmVkQ2hhbmdlc0xpc3QuaGFzT3duUHJvcGVydHkoY3VycmVudEluZGV4KSkge1xuICAgICAgICBkZWxldGUgX3Vuc2F2ZWRDaGFuZ2VzTGlzdFtjdXJyZW50SW5kZXhdXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIF91bnNhdmVkQ2hhbmdlc0xpc3RbY3VycmVudEluZGV4XSA9IHsgZ2V0Q2hhbmdlcywgY2xlYXJDaGFuZ2VzLCBzdGF0ZSB9IC8vIHVwZGF0ZSB3aXRoIGxhdGVzdFxuICAgIH1cblxuICAgIGNvbnN0IF9oYXZlVW5zYXZlZENoYW5nZXMgPSAhIU9iamVjdC5rZXlzKF91bnNhdmVkQ2hhbmdlc0xpc3QpLmxlbmd0aFxuXG4gICAgaWYgKGhhdmVVbnNhdmVkQ2hhbmdlcyAhPSBfaGF2ZVVuc2F2ZWRDaGFuZ2VzKSB7XG4gICAgICBzZXRTYXZlZENoYW5nZXMgJiYgc2V0U2F2ZWRDaGFuZ2VzKHJlc291cmNlSWQsICFfaGF2ZVVuc2F2ZWRDaGFuZ2VzKVxuICAgICAgc2V0U3RhdGUoeyBoYXZlVW5zYXZlZENoYW5nZXM6IF9oYXZlVW5zYXZlZENoYW5nZXMgfSlcbiAgICB9XG5cbiAgICBpZiAoIWlzRXF1YWwoX3Vuc2F2ZWRDaGFuZ2VzTGlzdCwgdW5zYXZlZENoYW5nZXNMaXN0KSkge1xuICAgICAgc2V0U3RhdGUoeyB1bnNhdmVkQ2hhbmdlc0xpc3Q6IF91bnNhdmVkQ2hhbmdlc0xpc3QgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogc2VhcmNoIGNoYXB0ZXIgb3IgdmVyc2UgY2h1bmsgdG8gbGluZSB0aGF0IHN0YXJ0cyB3aXRoIGZpbmRJdGVtXG4gICAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gZmluZEl0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gY2h1bmtzXG4gICAqL1xuICBmdW5jdGlvbiBmaW5kUmVmSW5BcnJheShmaW5kSXRlbSwgY2h1bmtzKSB7XG4gICAgY29uc3QgcmVmXyA9IGZpbmRJdGVtICsgJydcbiAgICBjb25zdCByZWZMZW4gPSByZWZfLmxlbmd0aFxuICAgIGNvbnN0IGluZGV4ID0gY2h1bmtzLmZpbmRJbmRleCgoY2h1bmssIGlkeCkgPT4ge1xuICAgICAgaWYgKGlkeCA+IDApIHtcbiAgICAgICAgaWYgKGNodW5rLnN1YnN0cmluZygwLCByZWZMZW4pID09PSByZWZfKSB7XG4gICAgICAgICAgY29uc3QgbmV4dENoYXIgPSBjaHVua1tyZWZMZW5dXG5cbiAgICAgICAgICBpZiAoKG5leHRDaGFyID4gJzknKSB8fCAobmV4dENoYXIgPCAnMCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSlcbiAgICByZXR1cm4gaW5kZXhcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEJvb2tOYW1lKCkge1xuICAgIGNvbnN0IGJvb2tDYXBzID0gc2NyaXB0dXJlQ29uZmlnPy5yZWZlcmVuY2U/LnByb2plY3RJZCA/IHNjcmlwdHVyZUNvbmZpZy5yZWZlcmVuY2UucHJvamVjdElkLnRvVXBwZXJDYXNlKCkgOiAnJ1xuICAgIHJldHVybiBgJHtib29rSW5kZXh9LSR7Ym9va0NhcHN9LnVzZm1gXG4gIH1cblxuICBjb25zdCBmaWxlcGF0aCA9IGdldEJvb2tOYW1lKClcblxuICAvLyBrZWVwIHRyYWNrIG9mIHZlcnNlIGVkaXQgc3RhdGVcbiAgY29uc3QgeyBvblNhdmVFZGl0IH0gPSB1c2VFZGl0KHtcbiAgICBzaGEsXG4gICAgb3duZXIsXG4gICAgY29udGVudDogc2F2ZUNvbnRlbnQsXG4gICAgY29uZmlnOiB7XG4gICAgICBjYWNoZTogeyBtYXhBZ2U6IDAgfSxcbiAgICAgIC4uLmF1dGhlbnRpY2F0aW9uPy5jb25maWcsXG4gICAgICB0b2tlbjogYXV0aGVudGljYXRpb24/LnRva2VuLFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGltZW91dDogaHR0cENvbmZpZz8uc2VydmVyVGltZU91dCB8fCBodHRwQ29uZmlnPy50aW1lb3V0IHx8IDUwMDAsXG4gICAgfSxcbiAgICBhdXRob3I6IGxvZ2dlZEluVXNlcixcbiAgICB0b2tlbjogYXV0aGVudGljYXRpb24/LnRva2VuLFxuICAgIGJyYW5jaDogd29ya2luZ1Jlc291cmNlQnJhbmNoLFxuICAgIGZpbGVwYXRoLFxuICAgIHJlcG8sXG4gIH0pXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHsgLy8gd2hlbiBzdGFydFNhdmUgZ29lcyB0cnVlLCBzYXZlIGVkaXRzIHRvIHVzZXIgYnJhbmNoIGFuZCB0aGVuIGNsZWFyIHN0YXJ0U2F2ZVxuICAgIGNvbnN0IF9zYXZlRWRpdCA9IGFzeW5jICgpID0+IHsgLy8gYmVnaW4gdXBsb2FkaW5nIG5ldyBVU0ZNXG4gICAgICBsZXQgYnJhbmNoID0gKHdvcmtpbmdSZXNvdXJjZUJyYW5jaCAhPT0gJ21hc3RlcicpID8gd29ya2luZ1Jlc291cmNlQnJhbmNoIDogdW5kZWZpbmVkXG5cbiAgICAgIGlmICghYnJhbmNoKSB7XG4gICAgICAgIGJyYW5jaCA9IGF3YWl0IHN0YXJ0RWRpdEJyYW5jaCgpIC8vIG1ha2Ugc3VyZSB1c2VyIGJyYW5jaCBleGlzdHMgYW5kIGdldCBuYW1lXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG9uU2F2ZUVkaXQoYnJhbmNoKS50aGVuKChzdWNjZXNzKSA9PiB7IC8vIHB1c2ggY2hhbmdlZCB0byBzZXJ2ZXJcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgc2F2ZUNoYW5nZXNUb0Nsb3VkKCkgLSBzYXZlIHNjcmlwdHVyZSBlZGl0cyBzdWNjZXNzYClcbiAgICAgICAgICBzZXRDYXJkc1NhdmluZyhwcmV2Q2FyZHNTYXZpbmcgPT4gcHJldkNhcmRzU2F2aW5nLmZpbHRlcihjYXJkSWQgPT4gY2FyZElkICE9PSBjYXJkUmVzb3VyY2VJZCkpXG4gICAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgICAgc3RhcnRTYXZlOiBmYWxzZSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgY29uc3QgdW5zYXZlZENhcmRJbmRpY2VzID0gT2JqZWN0LmtleXModW5zYXZlZENoYW5nZXNMaXN0KVxuXG4gICAgICAgICAgaWYgKHVuc2F2ZWRDYXJkSW5kaWNlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNhcmRJbmRleCBvZiB1bnNhdmVkQ2FyZEluZGljZXMpIHtcbiAgICAgICAgICAgICAgY29uc3QgeyBjbGVhckNoYW5nZXMgfSA9IHVuc2F2ZWRDaGFuZ2VzTGlzdFtjYXJkSW5kZXhdXG4gICAgICAgICAgICAgIGNsZWFyQ2hhbmdlcyAmJiBjbGVhckNoYW5nZXMoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnNvbGUuaW5mbygnc2F2ZUNoYW5nZXNUb0Nsb3VkKCkgLSBSZWxvYWRpbmcgcmVzb3VyY2UnKVxuICAgICAgICAgIHNjcmlwdHVyZUNvbmZpZz8ucmVsb2FkUmVzb3VyY2UoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3NhdmVDaGFuZ2VzVG9DbG91ZCgpIC0gc2F2aW5nIGNoYW5nZWQgc2NyaXB0dXJlIGZhaWxlZCcpXG4gICAgICAgICAgc2V0Q2FyZHNTYXZpbmcocHJldkNhcmRzU2F2aW5nID0+IHByZXZDYXJkc1NhdmluZy5maWx0ZXIoY2FyZElkID0+IGNhcmRJZCAhPT0gY2FyZFJlc291cmNlSWQpKVxuICAgICAgICAgIHNldFN0YXRlKHsgc3RhcnRTYXZlOiBmYWxzZSB9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChzdGFydFNhdmUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBzYXZlQ2hhbmdlc1RvQ2xvdWQgLSBjYWxsaW5nIF9zYXZlRWRpdCgpYClcbiAgICAgIHNldENhcmRzU2F2aW5nKHByZXZDYXJkc1NhdmluZyA9PiBbLi4ucHJldkNhcmRzU2F2aW5nLCBjYXJkUmVzb3VyY2VJZF0pXG4gICAgICBfc2F2ZUVkaXQoKVxuICAgIH1cbiAgfSwgW3N0YXJ0U2F2ZV0pXG5cbiAgLyoqXG4gICAqIGNvbnZlcnQgdXBkYXRlZFZlcnNlT2JqZWN0cyB0byBVU0ZNIGFuZCBtZXJnZSBpbnRvIHRoZSBiaWJsZVVzZm1cbiAgICogQHBhcmFtIHtzdHJpbmd9IGJpYmxlVXNmbSAtIFVTRk0gb2YgYmlibGVcbiAgICogQHBhcmFtIHtvYmplY3R9IHJlZiAtIHJlZmVyZW5jZSBvZiB2ZXJzZSB0byBtZXJnZSBpblxuICAgKiBAcGFyYW0ge29iamVjdFtdfSB1cGRhdGVkVmVyc2VPYmplY3RzIC0gbmV3IHZlcnNlIGluIHZlcnNlT2JqZWN0IGZvcm1hdFxuICAgKiBAcGFyYW0ge251bWJlcn0gY2FyZE51bVxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VWZXJzZU9iamVjdHNJbnRvQmlibGVVc2ZtKGJpYmxlVXNmbSwgcmVmLCB1cGRhdGVkVmVyc2VPYmplY3RzLCBjYXJkTnVtOiBudW1iZXIpIHtcbiAgICBsZXQgbmV3VXNmbVxuICAgIGNvbnN0IGNoYXB0ZXJDaHVua3MgPSBiaWJsZVVzZm0/LnNwbGl0KCdcXFxcYyAnKVxuICAgIGNvbnN0IGNoYXB0ZXJJbmRleCA9IGZpbmRSZWZJbkFycmF5KHJlZj8uY2hhcHRlciwgY2hhcHRlckNodW5rcylcblxuICAgIGlmIChjaGFwdGVySW5kZXggPj0gMCkge1xuICAgICAgY29uc3QgY3VycmVudENoYXB0ZXIgPSBjaGFwdGVyQ2h1bmtzW2NoYXB0ZXJJbmRleF1cbiAgICAgIGNvbnN0IHZlcnNlQ2h1bmtzID0gY3VycmVudENoYXB0ZXIuc3BsaXQoJ1xcXFx2ICcpXG4gICAgICBjb25zdCB2ZXJzZUluZGV4ID0gZmluZFJlZkluQXJyYXkocmVmPy52ZXJzZSwgdmVyc2VDaHVua3MpXG5cbiAgICAgIGlmICh2ZXJzZUluZGV4ID49IDApIHtcbiAgICAgICAgY29uc3QgbmV3VmVyc2VVc2ZtID0gVXNmbUZpbGVDb252ZXJzaW9uSGVscGVycy5jb252ZXJ0VmVyc2VEYXRhVG9VU0ZNKHVwZGF0ZWRWZXJzZU9iamVjdHMpXG4gICAgICAgIGNvbnNvbGUubG9nKGBzYXZlQ2hhbmdlc1RvQ2xvdWQoJHtjYXJkTnVtfSkgLSBuZXcgVVNGTSBmb3IgY2FyZDp9IC0gJHtuZXdWZXJzZVVzZm0uc3Vic3RyaW5nKDAsIDEwMCl9YClcbiAgICAgICAgY29uc3Qgb2xkVmVyc2UgPSB2ZXJzZUNodW5rc1t2ZXJzZUluZGV4XVxuICAgICAgICBjb25zdCB2ZXJzZU51bUxlbiA9IChyZWY/LnZlcnNlICsgJycpLmxlbmd0aFxuICAgICAgICB2ZXJzZUNodW5rc1t2ZXJzZUluZGV4XSA9IG9sZFZlcnNlLnN1YnN0cmluZygwLCB2ZXJzZU51bUxlbiArIDEpICsgbmV3VmVyc2VVc2ZtXG4gICAgICAgIGNvbnN0IG5ld0NoYXB0ZXIgPSB2ZXJzZUNodW5rcy5qb2luKCdcXFxcdiAnKVxuICAgICAgICBjaGFwdGVyQ2h1bmtzW2NoYXB0ZXJJbmRleF0gPSBuZXdDaGFwdGVyXG4gICAgICAgIG5ld1VzZm0gPSBjaGFwdGVyQ2h1bmtzLmpvaW4oJ1xcXFxjICcpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXdVc2ZtXG4gIH1cblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4geyAvLyBmb3IgZWFjaCB1bnNhdmVkIGNoYW5nZSwgY2FsbCBpbnRvIHZlcnNlUGFuZSB0byBnZXQgbGF0ZXN0IGNoYW5nZXMgZm9yIHZlcnNlIHRvIHNhdmVcbiAgICBpZiAoc2F2ZUNsaWNrZWQpIHtcbiAgICAgIGNvbnN0IHVuc2F2ZWRDYXJkSW5kaWNlcyA9IE9iamVjdC5rZXlzKHVuc2F2ZWRDaGFuZ2VzTGlzdClcblxuICAgICAgaWYgKHVuc2F2ZWRDYXJkSW5kaWNlcz8ubGVuZ3RoKSB7XG4gICAgICAgIGxldCBiaWJsZVVzZm0gPSBjb3JlLmdldFJlc3BvbnNlRGF0YShzY3JpcHR1cmVDb25maWc/LmZldGNoUmVzcG9uc2UpXG4gICAgICAgIGxldCBtZXJnZUZhaWwgPSBmYWxzZVxuICAgICAgICBsZXQgY2FyZE51bSA9IDBcblxuICAgICAgICBmb3IgKGNvbnN0IGNhcmRJbmRleCBvZiB1bnNhdmVkQ2FyZEluZGljZXMpIHtcbiAgICAgICAgICBjYXJkTnVtID0gcGFyc2VJbnQoY2FyZEluZGV4KVxuICAgICAgICAgIGNvbnN0IHsgZ2V0Q2hhbmdlcywgc3RhdGUgfSA9IHVuc2F2ZWRDaGFuZ2VzTGlzdFtjYXJkTnVtXVxuXG4gICAgICAgICAgaWYgKGdldENoYW5nZXMpIHtcbiAgICAgICAgICAgIGxldCBuZXdVc2ZtXG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIHJlZixcbiAgICAgICAgICAgICAgdXBkYXRlZFZlcnNlT2JqZWN0cyxcbiAgICAgICAgICAgIH0gPSBnZXRDaGFuZ2VzKHN0YXRlKVxuXG4gICAgICAgICAgICBpZiAodXBkYXRlZFZlcnNlT2JqZWN0cyAmJiBiaWJsZVVzZm0pIHsgLy8ganVzdCByZXBsYWNlIHZlcnNlXG4gICAgICAgICAgICAgIG5ld1VzZm0gPSBtZXJnZVZlcnNlT2JqZWN0c0ludG9CaWJsZVVzZm0oYmlibGVVc2ZtLCByZWYsIHVwZGF0ZWRWZXJzZU9iamVjdHMsIGNhcmROdW0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChuZXdVc2ZtKSB7XG4gICAgICAgICAgICAgIGJpYmxlVXNmbSA9IG5ld1VzZm1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG1lcmdlRmFpbCA9IHRydWVcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVyZ2VGYWlsKSB7IC8vIGlmIHdlIGZhaWxlZCB0byBtZXJnZSwgZmFsbGJhY2sgdG8gYnJ1dGUgZm9yY2UgdmVyc2Ugb2JqZWN0cyB0byBVU0ZNXG4gICAgICAgICAgY29uc29sZS5sb2coYHNhdmVDaGFuZ2VzVG9DbG91ZCgke2NhcmROdW19KSAtIHZlcnNlIG5vdCBmb3VuZCwgZmFsbGluZyBiYWNrIHRvIGluc2VydGluZyB2ZXJzZSBvYmplY3RgKVxuICAgICAgICAgIGxldCBuZXdCb29rSnNvblxuXG4gICAgICAgICAgZm9yIChjb25zdCBjYXJkSW5kZXggb2YgdW5zYXZlZENhcmRJbmRpY2VzKSB7XG4gICAgICAgICAgICBjb25zdCBjYXJkTnVtID0gcGFyc2VJbnQoY2FyZEluZGV4KVxuICAgICAgICAgICAgY29uc3QgeyBnZXRDaGFuZ2VzLCBzdGF0ZSB9ID0gdW5zYXZlZENoYW5nZXNMaXN0W2NhcmROdW1dXG5cbiAgICAgICAgICAgIGlmIChnZXRDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgIGxldCBuZXdVc2ZtXG4gICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBuZXdWZXJzZVRleHQsXG4gICAgICAgICAgICAgICAgcmVmLFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRWZXJzZU9iamVjdHMsXG4gICAgICAgICAgICAgIH0gPSBnZXRDaGFuZ2VzKHN0YXRlKVxuXG4gICAgICAgICAgICAgIGlmICh1cGRhdGVkVmVyc2VPYmplY3RzICYmICFuZXdVc2ZtKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldFZlcnNlT2JqZWN0c18gPSBudWxsXG5cbiAgICAgICAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICBpZiAobmV3VmVyc2VUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgdGFyZ2V0VmVyc2VPYmplY3RzIH0gPSBBbGlnbm1lbnRIZWxwZXJzLnVwZGF0ZUFsaWdubWVudHNUb1RhcmdldFZlcnNlKHVwZGF0ZWRWZXJzZU9iamVjdHMsIG5ld1ZlcnNlVGV4dClcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VmVyc2VPYmplY3RzXyA9IHRhcmdldFZlcnNlT2JqZWN0c1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VmVyc2VPYmplY3RzXyA9IHVwZGF0ZWRWZXJzZU9iamVjdHNcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIG5ld0Jvb2tKc29uID0gdGFyZ2V0VmVyc2VPYmplY3RzXyAmJiBzY3JpcHR1cmVDb25maWc/LnVwZGF0ZVZlcnNlKHJlZi5jaGFwdGVyLCByZWYudmVyc2UsIHsgdmVyc2VPYmplY3RzOiB0YXJnZXRWZXJzZU9iamVjdHNfIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYmlibGVVc2ZtID0gdXNmbWpzLnRvVVNGTShuZXdCb29rSnNvbiwgeyBmb3JjZWROZXdMaW5lczogdHJ1ZSB9KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coYHNhdmVDaGFuZ2VzVG9DbG91ZCgpIC0gc2F2aW5nIG5ldyBVU0ZNOiAke2JpYmxlVXNmbS5zdWJzdHJpbmcoMCwgMTAwKX0uLi5gKVxuICAgICAgICBzZXRDYXJkc1NhdmluZyhwcmV2Q2FyZHNTYXZpbmcgPT4gWy4uLnByZXZDYXJkc1NhdmluZywgY2FyZFJlc291cmNlSWRdKVxuICAgICAgICBzZXRTdGF0ZSh7IHNhdmVDb250ZW50OiBiaWJsZVVzZm0sIHN0YXJ0U2F2ZTogdHJ1ZSwgc2F2ZUNsaWNrZWQ6IGZhbHNlIH0pXG4gICAgICB9XG4gICAgfVxuICB9LCBbc2F2ZUNsaWNrZWRdKVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFpc0VxdWFsKHZlcnNlc0ZvclJlZiwgc2NyaXB0dXJlQ29uZmlnPy52ZXJzZXNGb3JSZWYpKSB7XG4gICAgICBjb25zdCB2ZXJzZXNGb3JSZWYgPSBzY3JpcHR1cmVDb25maWc/LnZlcnNlc0ZvclJlZlxuICAgICAgc2V0U3RhdGUoeyB2ZXJzZXNGb3JSZWYgfSlcblxuICAgICAgZm9yIChjb25zdCB2ZXJzZVJlZiBvZiB2ZXJzZXNGb3JSZWYgfHwgW10pIHtcbiAgICAgICAgLy8gY2hlY2sgZm9yIHZlcnNlIHJhbmdlXG4gICAgICAgIGNvbnN0IF92ZXJzZSA9IHZlcnNlUmVmLnZlcnNlXG5cbiAgICAgICAgaWYgKGFkZFZlcnNlUmFuZ2UgJiYgKHR5cGVvZiBfdmVyc2UgPT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBpZiAoX3ZlcnNlLmluY2x1ZGVzKCctJykpIHtcbiAgICAgICAgICAgIGFkZFZlcnNlUmFuZ2UoYCR7c2NyaXB0dXJlQ29uZmlnPy5yZWZlcmVuY2U/LmNoYXB0ZXJ9OiR7X3ZlcnNlfWApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCBbc2NyaXB0dXJlQ29uZmlnPy52ZXJzZXNGb3JSZWZdKVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0U3RhdGUoeyB2ZXJzZXNBbGlnbm1lbnRTdGF0dXM6IG51bGwgfSlcbiAgfSwgW3ZlcnNlXSlcblxuICBjb25zdCB1cGRhdGVWZXJzZXNBbGlnbm1lbnRTdGF0dXMgPSAocmVmZXJlbmNlLCBhbGlnbmVkKSA9PiB7XG4gICAgc2V0U3RhdGVfKHByZXZTdGF0ZSA9PiAoe1xuICAgICAgLi4ucHJldlN0YXRlLFxuICAgICAgdmVyc2VzQWxpZ25tZW50U3RhdHVzOiB7Li4ucHJldlN0YXRlLnZlcnNlc0FsaWdubWVudFN0YXR1cywgW2Ake3JlZmVyZW5jZS5jaGFwdGVyfToke3JlZmVyZW5jZS52ZXJzZX1gXTogYWxpZ25lZH0sXG4gICAgfSkpXG4gIH1cblxuICBjb25zdCByZW5kZXJlZFNjcmlwdHVyZVBhbmVzID0gdmVyc2VzRm9yUmVmPy5tYXAoKF9jdXJyZW50VmVyc2VEYXRhLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGluaXRpYWxWZXJzZU9iamVjdHMgPSBfY3VycmVudFZlcnNlRGF0YT8udmVyc2VEYXRhPy52ZXJzZU9iamVjdHMgfHwgbnVsbFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCB7IGNoYXB0ZXIsIHZlcnNlIH0gPSBfY3VycmVudFZlcnNlRGF0YSB8fCB7fVxuICAgIGNvbnN0IF9yZWZlcmVuY2UgPSB7XG4gICAgICAuLi5yZWZlcmVuY2UsXG4gICAgICBjaGFwdGVyLFxuICAgICAgdmVyc2UsXG4gICAgfVxuICAgIGNvbnN0IF9zY3JpcHR1cmVBbGlnbm1lbnRFZGl0Q29uZmlnID0ge1xuICAgICAgLi4uc2NyaXB0dXJlQWxpZ25tZW50RWRpdENvbmZpZyxcbiAgICAgIGN1cnJlbnRJbmRleDogaW5kZXgsXG4gICAgICBpbml0aWFsVmVyc2VPYmplY3RzLFxuICAgICAgcmVmZXJlbmNlOiBfcmVmZXJlbmNlLFxuICAgIH1cblxuICAgIGxldCBpc1ZlcnNlU2VsZWN0ZWRGb3JBbGlnbm1lbnQgPSBmYWxzZVxuICAgIGlmICh2ZXJzZVNlbGVjdGVkRm9yQWxpZ25tZW50KSB7XG4gICAgICBpc1ZlcnNlU2VsZWN0ZWRGb3JBbGlnbm1lbnQgPSB2ZXJzZVNlbGVjdGVkRm9yQWxpZ25tZW50LmNoYXB0ZXIgPT09IGNoYXB0ZXIgJiYgdmVyc2VTZWxlY3RlZEZvckFsaWdubWVudC52ZXJzZSA9PT0gdmVyc2VcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFNjcmlwdHVyZVBhbmVcbiAgICAgICAgey4uLnNjcmlwdHVyZUNvbmZpZ31cbiAgICAgICAgY29udGVudFN0eWxlPXtjb250ZW50U3R5bGV9XG4gICAgICAgIGN1cnJlbnRJbmRleD17aW5kZXh9XG4gICAgICAgIGRpcmVjdGlvbj17ZGlyZWN0aW9ufVxuICAgICAgICBkaXNhYmxlV29yZFBvcG92ZXI9e2Rpc2FibGVXb3JkUG9wb3Zlcl99XG4gICAgICAgIGZvbnRTaXplPXtmb250U2l6ZX1cbiAgICAgICAgZ2V0TGV4aWNvbkRhdGE9e2dldExleGljb25EYXRhfVxuICAgICAgICBpc05UPXtpc05UX31cbiAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgcmVmU3R5bGU9e3JlZlN0eWxlfVxuICAgICAgICByZWZlcmVuY2U9e19yZWZlcmVuY2V9XG4gICAgICAgIHNhdmluZz17c3RhcnRTYXZlfVxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHNjcmlwdHVyZUFsaWdubWVudEVkaXRDb25maWc9e19zY3JpcHR1cmVBbGlnbm1lbnRFZGl0Q29uZmlnfVxuICAgICAgICBzZXRXb3JkQWxpZ25lclN0YXR1cz17c2V0V29yZEFsaWduZXJTdGF0dXN9XG4gICAgICAgIHNlcnZlcj17c2VydmVyfVxuICAgICAgICB0cmFuc2xhdGU9e3RyYW5zbGF0ZX1cbiAgICAgICAgaXNWZXJzZVNlbGVjdGVkRm9yQWxpZ25tZW50PXtpc1ZlcnNlU2VsZWN0ZWRGb3JBbGlnbm1lbnR9XG4gICAgICAgIG9uQWxpZ25tZW50RmluaXNoPXsoKSA9PiBzZXRTdGF0ZSh7IHZlcnNlU2VsZWN0ZWRGb3JBbGlnbm1lbnQ6IG51bGwgfSl9XG4gICAgICAgIHVwZGF0ZVZlcnNlc0FsaWdubWVudFN0YXR1cz17dXBkYXRlVmVyc2VzQWxpZ25tZW50U3RhdHVzfVxuICAgICAgLz5cbiAgICApXG4gIH0pXG5cbiAgY29uc3QgaGFuZGxlQWxpZ25CdXR0b25DbGljayA9ICgpID0+IHtcbiAgICBpZiAodmVyc2VzRm9yUmVmPy5sZW5ndGggPiAxKSB7XG4gICAgICBzZXRTdGF0ZSh7IHNob3dBbGlnbm1lbnRQb3B1cDogdHJ1ZSB9KVxuICAgIH0gZWxzZSBpZiAodmVyc2VzRm9yUmVmPy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHNldFN0YXRlKHsgdmVyc2VTZWxlY3RlZEZvckFsaWdubWVudDogdmVyc2VzRm9yUmVmWzBdIH0pXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgb25SZW5kZXJUb29sYmFyID0gKHsgaXRlbXMgfSkgPT4ge1xuICAgIGNvbnN0IG5ld0l0ZW1zID0gWy4uLml0ZW1zXVxuXG4gICAgbGV0IGFsbFZlcnNlc0FsaWduZWQgPSBmYWxzZVxuICAgIC8vIENoZWNrIGlmIGFsbCB2YWx1ZXMgaW4gdmVyc2VzQWxpZ25tZW50U3RhdHVzIGFyZSB0cnVlXG4gICAgaWYgKHZlcnNlc0FsaWdubWVudFN0YXR1cykge1xuICAgICAgYWxsVmVyc2VzQWxpZ25lZCA9IE9iamVjdC52YWx1ZXModmVyc2VzQWxpZ25tZW50U3RhdHVzKS5ldmVyeShhbGlnblN0YXR1cyA9PiBhbGlnblN0YXR1cyA9PT0gdHJ1ZSlcbiAgICB9XG4gICAgbGV0IGFsaWduSWNvbiA9IG51bGxcbiAgICBsZXQgYWxpZ25CdXR0b25UZXh0ID0gJydcbiAgICBpZiAoYWxsVmVyc2VzQWxpZ25lZCkge1xuICAgICAgYWxpZ25JY29uID0gPFJ4TGluazIgaWQ9e2B2YWxpZF9pY29uXyR7cmVzb3VyY2VJZH1gfSBjb2xvcj0nI0JCQicgLz5cbiAgICAgIGFsaWduQnV0dG9uVGV4dCA9ICdBbGlnbm1lbnQgaXMgVmFsaWQnXG4gICAgfSBlbHNlIHtcbiAgICAgIGFsaWduSWNvbiA9IDxSeExpbmtCcmVhazIgaWQ9e2BpbnZhbGlkX2FsaWdubWVudF9pY29uXyR7cmVzb3VyY2VJZH1gfSBjb2xvcj0nIzAwMCcgLz5cbiAgICAgIGFsaWduQnV0dG9uVGV4dCA9ICdBbGlnbm1lbnQgaXMgSW52YWxpZCdcbiAgICB9XG5cbiAgICBpZiAoc2V0V29yZEFsaWduZXJTdGF0dXMgJiYgcmVzb3VyY2VJZCAhPT0gJ09SSUdJTkFMX1NPVVJDRScpIHtcbiAgICAgIG5ld0l0ZW1zLnB1c2goXG4gICAgICAgIDxJY29uQnV0dG9uXG4gICAgICAgICAgaWQ9e2BhbGlnbm1lbnRfaWNvbl8ke3Jlc291cmNlSWR9YH1cbiAgICAgICAgICBrZXk9J2NoZWNraW5nLWJ1dHRvbidcbiAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVBbGlnbkJ1dHRvbkNsaWNrfVxuICAgICAgICAgIHRpdGxlPXthbGlnbkJ1dHRvblRleHR9XG4gICAgICAgICAgYXJpYS1sYWJlbD17YWxpZ25CdXR0b25UZXh0fVxuICAgICAgICAgIHN0eWxlPXt7IGN1cnNvcjogJ3BvaW50ZXInIH19XG4gICAgICAgID5cbiAgICAgICAgICB7YWxpZ25JY29ufVxuICAgICAgICA8L0ljb25CdXR0b24+XG4gICAgICApXG4gICAgfVxuXG4gICAgbmV3SXRlbXMucHVzaChcbiAgICAgIDw+XG4gICAgICAgIDxVcGRhdGVCcmFuY2hCdXR0b24gey4uLnVwZGF0ZUJ1dHRvblByb3BzfSBpc0xvYWRpbmc9e2lzVXBkYXRlTG9hZGluZyB8fCBzdGFydFNhdmV9Lz5cbiAgICAgICAgPEVycm9yRGlhbG9nIHRpdGxlPXtkaWFsb2dUaXRsZX0gY29udGVudD17ZGlhbG9nTWVzc2FnZX0gb3Blbj17aXNFcnJvckRpYWxvZ09wZW59IG9uQ2xvc2U9e29uQ2xvc2VFcnJvckRpYWxvZ30gaXNMb2FkaW5nPXsgaXNVcGRhdGVMb2FkaW5nIHx8IHN0YXJ0U2F2ZSB9IGxpbms9e2RpYWxvZ0xpbmt9IGxpbmtUb29sdGlwPXtkaWFsb2dMaW5rVG9vbHRpcH0gLz5cbiAgICAgIDwvPlxuICAgIClcblxuICAgIHJldHVybiBuZXdJdGVtcztcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxDYXJkXG4gICAgICAgIGlkPXtgc2NyaXB0dXJlX2NhcmRfJHtjYXJkTnVtfWB9XG4gICAgICAgIHRpdGxlPXtzY3JpcHR1cmVMYWJlbH1cbiAgICAgICAgc2V0dGluZ3NUaXRsZT17c2NyaXB0dXJlVGl0bGUgKyAnIFNldHRpbmdzJ31cbiAgICAgICAgaXRlbXM9e2l0ZW1zfVxuICAgICAgICBjbGFzc2VzPXtjbGFzc2VzfVxuICAgICAgICBoZWFkZXJzPXtoZWFkZXJzfVxuICAgICAgICBmaWx0ZXJzPXtmaWx0ZXJzfVxuICAgICAgICBmb250U2l6ZT17Zm9udFNpemV9XG4gICAgICAgIGl0ZW1JbmRleD17aXRlbUluZGV4fVxuICAgICAgICBzZXRGaWx0ZXJzPXtzZXRGaWx0ZXJzfVxuICAgICAgICBzZXRGb250U2l6ZT17c2V0Rm9udFNpemV9XG4gICAgICAgIHNldEl0ZW1JbmRleD17c2V0SXRlbUluZGV4fVxuICAgICAgICBtYXJrZG93blZpZXc9e21hcmtkb3duVmlld31cbiAgICAgICAgc2V0TWFya2Rvd25WaWV3PXtzZXRNYXJrZG93blZpZXd9XG4gICAgICAgIGdldEN1c3RvbUNvbXBvbmVudD17Z2V0U2NyaXB0dXJlU2VsZWN0b3J9XG4gICAgICAgIGhpZGVNYXJrZG93blRvZ2dsZVxuICAgICAgICBvbk1lbnVDbG9zZT17b25NZW51Q2xvc2V9XG4gICAgICAgIG9uTWluaW1pemU9e29uTWluaW1pemUgPyAoKSA9PiBvbk1pbmltaXplKGlkKSA6IG51bGx9XG4gICAgICAgIGVkaXRhYmxlPXtlbmFibGVFZGl0IHx8IGVuYWJsZUFsaWdubWVudH1cbiAgICAgICAgc2F2ZWQ9e3N0YXJ0U2F2ZSB8fCAhaGF2ZVVuc2F2ZWRDaGFuZ2VzfVxuICAgICAgICBvblNhdmVFZGl0PXsoKSA9PiBzZXRTdGF0ZSh7IHNhdmVDbGlja2VkOiB0cnVlIH0pfVxuICAgICAgICBvblJlbmRlclRvb2xiYXI9e29uUmVuZGVyVG9vbGJhcn1cbiAgICAgID5cbiAgICAgICAgPGRpdiBpZD1cInNjcmlwdHVyZS1wYW5lLWxpc3RcIj5cbiAgICAgICAgICB7cmVuZGVyZWRTY3JpcHR1cmVQYW5lc31cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L0NhcmQ+XG4gICAgICA8VmVyc2VTZWxlY3RvclBvcHVwXG4gICAgICAgIHJlc291cmNlSWQ9e3Jlc291cmNlSWR9XG4gICAgICAgIG9wZW49e3Nob3dBbGlnbm1lbnRQb3B1cH1cbiAgICAgICAgb25DbG9zZT17KCkgPT4gc2V0U3RhdGUoeyBzaG93QWxpZ25tZW50UG9wdXA6IGZhbHNlIH0pfVxuICAgICAgICB2ZXJzZXNGb3JSZWY9e3ZlcnNlc0ZvclJlZn1cbiAgICAgICAgdmVyc2VzQWxpZ25tZW50U3RhdHVzPXt2ZXJzZXNBbGlnbm1lbnRTdGF0dXN9XG4gICAgICAgIG9uVmVyc2VTZWxlY3Q9eyh2ZXJzZSkgPT4gc2V0U3RhdGUoe1xuICAgICAgICAgIHZlcnNlU2VsZWN0ZWRGb3JBbGlnbm1lbnQ6IHZlcnNlLFxuICAgICAgICAgIHNob3dBbGlnbm1lbnRQb3B1cDogZmFsc2VcbiAgICAgICAgfSl9XG4gICAgICAvPlxuICAgIDwvPlxuICApXG59XG5cblNjcmlwdHVyZUNhcmQucHJvcFR5cGVzID0ge1xuICAvKiogaHRtbCBpZGVudGlmaWVyIHRvIHVzZSBmb3IgY2FyZCAqL1xuICBpZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqIG1ldGhvZCB0byBkZXRlcm1pbmUgaWYgTlQgb3IgT1QgKi9cbiAgaXNOVDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgLyoqIHRpdGxlIGZvciBzY3JpcHR1cmUgY2FyZCAqL1xuICB0aXRsZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAvKiogZ2V0IGxhbmd1YWdlIGRldGFpbHMgKi9cbiAgZ2V0TGFuZ3VhZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIC8qKiBzY3JpcHR1cmUgY2FyZCBudW1iZXIgKDAgdG8gMiBmb3IgZXhhbXBsZSkgKi9cbiAgY2FyZE51bTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICAvKiogcmVzb3VyY2Ugb2JqZWN0ICovXG4gIHJlc291cmNlOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIC8qKiByZXNvdXJjZSBsYW5ndWFnZSB0byB1c2UgKi9cbiAgICBsYW5ndWFnZUlkOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgLyoqIHJlcG8gb3duZXIgc3VjaCBhcyB1bmZvbGRpbmdXb3JkICovXG4gICAgb3duZXI6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICAvKiogcmVzb3VyY2VJZCB0byB1c2UgKGUuZy4gdWdudCkgKi9cbiAgICByZXNvdXJjZUlkOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgLyoqIHJlcG8gb3duZXIgZm9yIG9yaWdpbmFsIGxhbmd1YWdlcyBzdWNoIGFzIHVuZm9sZGluZ1dvcmQgKi9cbiAgICBvcmlnaW5hbExhbmd1YWdlT3duZXI6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgfSksXG4gIHJlZmVyZW5jZTogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAvKiogcHJvamVjdElkIChib29rSUQpIHRvIHVzZSAqL1xuICAgIHByb2plY3RJZDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIC8qKiBjdXJyZW50IGNoYXB0ZXIgbnVtYmVyICovXG4gICAgY2hhcHRlcjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLmlzUmVxdWlyZWQsXG4gICAgLyoqIGN1cnJlbnQgdmVyc2UgbnVtYmVyICovXG4gICAgdmVyc2U6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKS5pc1JlcXVpcmVkLFxuICB9KSxcbiAgLyoqIHNlcnZlciAoZS5nLiAnaHR0cHM6Ly9naXQuZG9vcjQzLm9yZycpICovXG4gIHNlcnZlcjogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAvKiogcmVwbyBicmFuY2ggb3IgdGFnIHN1Y2ggYXMgbWFzdGVyICovXG4gIGFwcFJlZjogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAvKiogaWYgdHJ1ZSB0aGVuIHdvcmQgZGF0YSBob3ZlciBpcyBzaG93biAqL1xuICBkaXNhYmxlV29yZFBvcG92ZXI6IFByb3BUeXBlcy5ib29sLFxuICAvKiogQ1NTIGNsYXNzZXMgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcbiAgLyoqIHJlc291cmNlTGluayAqL1xuICByZXNvdXJjZUxpbms6IFByb3BUeXBlcy5hbnksXG4gIC8qKiB1c2UgbWV0aG9kIGZvciB1c2luZyBsb2NhbCBzdG9yYWdlIHNwZWNpZmljIGZvciB1c2VyICovXG4gIHVzZVVzZXJMb2NhbFN0b3JhZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIC8qKiBvcHRpb25hbCBjYWxsYmFjayBpZiBlcnJvciBsb2FkaW5nIHJlc291cmNlLCBwYXJhbWV0ZXIgcmV0dXJuZWQgYXJlOlxuICAgKiAgICAoe3N0cmluZ30gZXJyb3JNZXNzYWdlLCB7Ym9vbGVhbn0gaXNBY2Nlc3NFcnJvciwge29iamVjdH0gcmVzb3VyY2VTdGF0dXMpXG4gICAqICAgICAgLSBpc0FjY2Vzc0Vycm9yIC0gaXMgdHJ1ZSBpZiB0aGlzIHdhcyBhbiBlcnJvciB0cnlpbmcgdG8gYWNjZXNzIGZpbGVcbiAgICogICAgICAtIHJlc291cmNlU3RhdHVzIC0gaXMgb2JqZWN0IGNvbnRhaW5pbmcgZGV0YWlscyBhYm91dCBwcm9ibGVtcyBmZXRjaGluZyByZXNvdXJjZSAqL1xuICBvblJlc291cmNlRXJyb3I6IFByb3BUeXBlcy5mdW5jLFxuICAvKiogb3B0aW9uYWwgaHR0cCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgZmV0Y2hpbmcgcmVzb3VyY2VzLCBkZWZhdWx0IGlzIDAgKHZlcnkgbG9uZyB3YWl0KSAqL1xuICBodHRwQ29uZmlnOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKiogb3B0aW9uYWwgdXJsIGZvciBncmVlayByZXBvICovXG4gIGdyZWVrUmVwb1VybDogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqIG9wdGlvbmFsIHVybCBmb3IgaGVicmV3IHJlcG8gKi9cbiAgaGVicmV3UmVwb1VybDogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqIGZ1bmN0aW9uIHRvIGdldCBsYXRlc3QgbGV4aWNvbiBkYXRhICovXG4gIGdldExleGljb25EYXRhOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqIGZ1bmN0aW9uIHRvIHByZS1sb2FkIGxleGljb24gZGF0YSBmb3IgdmVyc2UgKi9cbiAgZmV0Y2hHbG9zc2VzRm9yVmVyc2U6IFByb3BUeXBlcy5mdW5jLFxuICAvKiogb3B0aW9uYWwgZnVuY3Rpb24gZm9yIGxvY2FsaXphdGlvbiAqL1xuICB0cmFuc2xhdGU6IFByb3BUeXBlcy5mdW5jLFxuICAvKiogZnVuY3Rpb24gdG8gbWluaW1pemUgdGhlIGNhcmQgKG9wdGlvbmFsKSAqL1xuICBvbk1pbmltaXplOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqIHVzZXItbmFtZSAqL1xuICBsb2dnZWRJblVzZXI6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKiBhdXRoZW50aWNhdGlvbiBpbmZvICovXG4gIGF1dGhlbnRpY2F0aW9uOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKiogZnVuY3Rpb24gdG8gc2V0IHN0YXRlIGluIGFwcCB0aGF0IHRoZXJlIGFyZSB1bnNhdmVkIGNoYW5nZXMgKi9cbiAgc2V0U2F2ZWRDaGFuZ2VzOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqIGluZGV4IGZvciBjdXJyZW50IGJvb2sgKGUuZy4gJzAxJyBmb3IgJ2dlbicpKi9cbiAgYm9va0luZGV4OiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKiogY2FsbGJhY2sgdG8gaW5kaWNhdGUgdGhhdCB3ZSBhcmUgdXNpbmcgYSB2ZXJzZSByYW5nZSBoZXJlICovXG4gIGFkZFZlcnNlUmFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICAvKiogY2FsbGJhY2sgdG8gdXBkYXRlIHdvcmQgYWxpZ25lciBzdGF0ZSAqL1xuICBzZXRXb3JkQWxpZ25lclN0YXR1czogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKiBjYWxsYmFjayB0byB1cGRhdGUgdGhlIGNhcmQncyBtZXJnZSBzdGF0ZSBpbiBhcHAgKi9cbiAgdXBkYXRlTWVyZ2VTdGF0ZTogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKiBjYWxsYmFjayB0byB1cGRhdGUgbG9hZGluZyBzdGF0ZSAqL1xuICBzZXRBcmVSZXNvdXJjZXNMb2FkaW5nOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqIGNhbGxiYWNrIHRvIHVwZGF0ZSBzYXZpbmcgc3RhdGUqL1xuICBzZXRBcmVSZXNvdXJjZXNTYXZpbmc6IFByb3BUeXBlcy5mdW5jLFxufVxuIl19
1380
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL1NjcmlwdHVyZUNhcmQvU2NyaXB0dXJlQ2FyZC50c3giXSwibmFtZXMiOlsiUmVhY3QiLCJQcm9wVHlwZXMiLCJjb3JlIiwiU2VsZWN0aW9uc0NvbnRleHRQcm92aWRlciIsInVzZm1qcyIsInVzZUVkaXQiLCJJY29uQnV0dG9uIiwiUnhMaW5rMiIsIlJ4TGlua0JyZWFrMiIsIkNhcmQiLCJFUlJPUl9TVEFURSIsIk1BTklGRVNUX05PVF9MT0FERURfRVJST1IiLCJ1c2VDYXJkU3RhdGUiLCJ1c2VVc2VyQnJhbmNoIiwiZ2V0UXVvdGVNYXRjaGVzSW5Cb29rUmVmIiwiQWxpZ25tZW50SGVscGVycyIsIlVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMiLCJpc0VxdWFsIiwiZ2V0VmVyc2VzIiwiU2NyaXB0dXJlUGFuZSIsIlNjcmlwdHVyZVNlbGVjdG9yIiwidXNlU2NyaXB0dXJlU2V0dGluZ3MiLCJjbGVhbnVwVmVyc2VPYmplY3RzIiwiZml4T2NjdXJyZW5jZSIsImdldFJlc291cmNlTGluayIsImdldFJlc291cmNlTWVzc2FnZSIsImdldFNjcmlwdHVyZVZlcnNpb25TZXR0aW5ncyIsImlzT3JpZ2luYWxCaWJsZSIsImRlbGF5IiwiYXJlTWFwc1RoZVNhbWUiLCJUaXRsZSIsIk5UX09SSUdfTEFORyIsIk9SSUdJTkFMX1NPVVJDRSIsIk9UX09SSUdfTEFORyIsIlZlcnNlU2VsZWN0b3JQb3B1cCIsIktFWV9GT05UX1NJWkVfQkFTRSIsImxhYmVsIiwic3R5bGUiLCJtYXJnaW5Ub3AiLCJ3aWR0aCIsImNvbXBhcmVPYmplY3QiLCJ2ZXJzZVJlZiIsImNoYXB0ZXIiLCJ2ZXJzZSIsInZlcnNlRGF0YSIsInZlcnNlT2JqZWN0cyIsImxlbmd0aCIsImFyZVZlcnNlc1NhbWUiLCJ2ZXJzZXNGb3JSZWYxIiwidmVyc2VzRm9yUmVmMiIsImFyZVNhbWUiLCJpIiwibCIsInZlcnNlMSIsInZlcnNlMiIsIlNjcmlwdHVyZUNhcmQiLCJhcHBSZWYiLCJhdXRoZW50aWNhdGlvbiIsImJvb2tJbmRleCIsImNhcmROdW0iLCJjbGFzc2VzIiwiZGlzYWJsZVdvcmRQb3BvdmVyIiwiZ2V0TGFuZ3VhZ2UiLCJnZXRMZXhpY29uRGF0YSIsImdyZWVrUmVwb1VybCIsImhlYnJld1JlcG9VcmwiLCJodHRwQ29uZmlnIiwiaWQiLCJpc05UIiwibG9nZ2VkSW5Vc2VyIiwib25NaW5pbWl6ZSIsIm9uUmVzb3VyY2VFcnJvciIsIm9yaWdpbmFsU2NyaXB0dXJlQm9va09iamVjdHMiLCJyZWZlcmVuY2UiLCJyZXNvdXJjZSIsIm93bmVyIiwibGFuZ3VhZ2VJZCIsInJlc291cmNlSWQiLCJvcmlnaW5hbExhbmd1YWdlT3duZXIiLCJyZXNvdXJjZUxpbmsiLCJzZWxlY3RlZFF1b3RlIiwic2VydmVyIiwic2V0U2F2ZWRDaGFuZ2VzIiwic2V0V29yZEFsaWduZXJTdGF0dXMiLCJ0cmFuc2xhdGUiLCJ0aXRsZSIsInVzZVVzZXJMb2NhbFN0b3JhZ2UiLCJib29rSWQiLCJwcm9qZWN0SWQiLCJ1c2VTdGF0ZSIsImNoZWNrRm9yRWRpdEJyYW5jaCIsImN1cnJlbnRSZWZlcmVuY2UiLCJlZGl0QnJhbmNoUmVhZHkiLCJoYXZlVW5zYXZlZENoYW5nZXMiLCJsYXN0U2VsZWN0ZWRRdW90ZSIsInJlYWR5Rm9yRmV0Y2giLCJyZWYiLCJzYXZlQ2xpY2tlZCIsInNhdmVDb250ZW50Iiwic2VsZWN0aW9ucyIsIk1hcCIsInNoYSIsInN0YXJ0U2F2ZSIsInVybEVycm9yIiwidXNpbmdVc2VyQnJhbmNoIiwidW5zYXZlZENoYW5nZXNMaXN0IiwidmVyc2VzRm9yUmVmIiwic2hvd0FsaWdubWVudFBvcHVwIiwidmVyc2VTZWxlY3RlZEZvckFsaWdubWVudCIsInZlcnNlc0FsaWdubWVudFN0YXR1cyIsInZlcnNlT2JqZWN0c01hcCIsInN0YXRlIiwic2V0U3RhdGVfIiwiZm9udFNpemUiLCJzZXRGb250U2l6ZSIsImlzTlRfIiwic2V0U3RhdGUiLCJuZXdTdGF0ZSIsInByZXZTdGF0ZSIsImNhY2hlIiwibWF4QWdlIiwibm9DYWNoZSIsInNldFVybEVycm9yIiwiZXJyb3IiLCJ3aG9sZUJvb2siLCJpc05ld1Rlc3RhbWVudCIsInNjcmlwdHVyZUNvbmZpZyIsInNldFNjcmlwdHVyZSIsInNjcmlwdHVyZVNldHRpbmdzIiwic2NyaXB0dXJlVmVyc2lvbkhpc3QiLCJmZXRjaFJlc3BfIiwiZmV0Y2hSZXNwb25zZSIsInJlcG8iLCJyZWZlcmVuY2VfIiwidXNlRWZmZWN0IiwiX3NoYSIsImRhdGEiLCJ1cmwiLCJkb3dubG9hZF91cmwiLCJ2YWxpZEJyYW5jaCIsInBhcnRzIiwic3BsaXQiLCJmZXRjaEJyYW5jaCIsImNvbnNvbGUiLCJsb2ciLCJKU09OIiwic3RyaW5naWZ5IiwiY2FyZFJlc291cmNlSWQiLCJyZWZfIiwiY2FuVXNlRWRpdEJyYW5jaCIsImluY2x1ZGVzIiwiY2FyZElkIiwiYnJhbmNoRGV0ZXJtaW5lZCIsInVzZXJFZGl0QnJhbmNoTmFtZSIsIl91c2luZ1VzZXJCcmFuY2giLCJ3b3JraW5nUmVzb3VyY2VCcmFuY2giLCJzdGFydEVkaXRCcmFuY2giLCJhY3Rpb25zIiwic3RhcnRFZGl0Iiwid29ya2luZ1JlZiIsInNjcmlwdHVyZVRpdGxlIiwicmVzb3VyY2VTdGF0dXMiLCJtZXNzYWdlIiwiaXNBY2Nlc3NFcnJvciIsInZlcnNpb24iLCJ1cGRhdGVUaXRsZSIsImdldFNjcmlwdHVyZVNlbGVjdG9yIiwic2NyaXB0dXJlU2VsZWN0aW9uQ29uZmlnIiwib25NZW51Q2xvc2UiLCJsYW5ndWFnZUlkXyIsImxhbmd1YWdlIiwiZGlyZWN0aW9uIiwiX3JlZmVyZW5jZSIsImlzSGVicmV3IiwiZm9udEZhY3RvciIsInNjYWxlZEZvbnRTaXplIiwiaXRlbXMiLCJoZWFkZXJzIiwiZmlsdGVycyIsIml0ZW1JbmRleCIsIm1hcmtkb3duVmlldyIsInNldEZpbHRlcnMiLCJzZXRJdGVtSW5kZXgiLCJzZXRNYXJrZG93blZpZXciLCJyZWZTdHlsZSIsInVzZU1lbW8iLCJmb250RmFtaWx5IiwiTWF0aCIsInJvdW5kIiwiY29udGVudFN0eWxlIiwic2NyaXB0dXJlTGFiZWwiLCJkaXNhYmxlV29yZFBvcG92ZXJfIiwidXNpbmdPcmlnaW5hbEJpYmxlIiwidW5kZWZpbmVkIiwiZW5hYmxlRWRpdCIsImVuYWJsZUFsaWdubWVudCIsIm9yaWdpbmFsUmVwb1VybCIsInNjcmlwdHVyZUFsaWdubWVudEVkaXRDb25maWciLCJjdXJyZW50VmVyc2VSZWYiLCJfc2V0U2F2ZWRDaGFuZ2VzIiwic291cmNlTGFuZ3VhZ2UiLCJ0YXJnZXRMYW5ndWFnZSIsImN1cnJlbnRJbmRleCIsInNhdmVkIiwiZ2V0Q2hhbmdlcyIsImNsZWFyQ2hhbmdlcyIsIl91bnNhdmVkQ2hhbmdlc0xpc3QiLCJoYXNPd25Qcm9wZXJ0eSIsIl9oYXZlVW5zYXZlZENoYW5nZXMiLCJPYmplY3QiLCJrZXlzIiwiZmluZFJlZkluQXJyYXkiLCJmaW5kSXRlbSIsImNodW5rcyIsInJlZkxlbiIsImluZGV4IiwiZmluZEluZGV4IiwiY2h1bmsiLCJpZHgiLCJzdWJzdHJpbmciLCJuZXh0Q2hhciIsImdldEJvb2tOYW1lIiwiYm9va0NhcHMiLCJ0b1VwcGVyQ2FzZSIsImZpbGVwYXRoIiwiY29udGVudCIsImNvbmZpZyIsInRva2VuIiwidGltZW91dCIsInNlcnZlclRpbWVPdXQiLCJhdXRob3IiLCJicmFuY2giLCJzYXZlRXJyb3IiLCJpc1NhdmVFcnJvciIsImlzRXJyb3IiLCJvblNhdmVFZGl0IiwiX3NhdmVFZGl0IiwiaW5mbyIsInRoZW4iLCJzdWNjZXNzIiwidW5zYXZlZENhcmRJbmRpY2VzIiwiY2FyZEluZGV4IiwicmVsb2FkUmVzb3VyY2UiLCJtZXJnZVZlcnNlT2JqZWN0c0ludG9CaWJsZVVzZm0iLCJiaWJsZVVzZm0iLCJ1cGRhdGVkVmVyc2VPYmplY3RzIiwibmV3VXNmbSIsImNoYXB0ZXJDaHVua3MiLCJjaGFwdGVySW5kZXgiLCJjdXJyZW50Q2hhcHRlciIsInZlcnNlQ2h1bmtzIiwidmVyc2VJbmRleCIsIm5ld1ZlcnNlVXNmbSIsImNvbnZlcnRWZXJzZURhdGFUb1VTRk0iLCJvbGRWZXJzZSIsInZlcnNlTnVtTGVuIiwibmV3Q2hhcHRlciIsImpvaW4iLCJnZXRSZWFkeUZvclNhdmUiLCJjcmVhdGVFZGl0QnJhbmNoIiwid2FybiIsImdldFJlc3BvbnNlRGF0YSIsIm1lcmdlRmFpbCIsInBhcnNlSW50IiwibmV3VmVyc2VUZXh0IiwidGFyZ2V0VmVyc2VPYmplY3RzXyIsInVwZGF0ZUFsaWdubWVudHNUb1RhcmdldFZlcnNlIiwidGFyZ2V0VmVyc2VPYmplY3RzIiwibmV3Qm9va0pzb24iLCJ1cGRhdGVWZXJzZSIsInRvVVNGTSIsImZvcmNlZE5ld0xpbmVzIiwiX3ZlcnNlc0ZvclJlZiIsIm5ld1NlbGVjdGlvbnMiLCJ1cGRhdGVTZWxlY3Rpb25zIiwiX21hcCIsIm9yaWdpbmFsQm9va0lkIiwiYm9va1ZlcnNlT2JqZWN0IiwiY2hhcHRlcnMiLCJuZXdTZWxlY3RlZFF1b3RlIiwicXVvdGUiLCJvcmlnaW5hbFZlcnNlcyIsInN1YnN0aXR1dGUiLCJzdGFydFZlcnNlIiwibGFzdFZlcnNlIiwiX3ZlcnNlIiwidmVyc2VzIiwidmVyc2VJdGVtIiwidm8iLCJjb25jYXQiLCJzZXQiLCJzdWJSZWYiLCJxdW90ZU1hdGNoZXMiLCJib29rT2JqZWN0Iiwib2NjdXJyZW5jZSIsInNpemUiLCJmb3JFYWNoIiwid29yZHMiLCJrZXkiLCJfa2V5IiwibWFwIiwid29yZCIsInRleHQiLCJub3JtYWxpemVTdHJpbmciLCJib29rc05vdFNhbWUiLCJ1cGRhdGVWZXJzZXNBbGlnbm1lbnRTdGF0dXMiLCJhbGlnbmVkIiwicmVuZGVyZWRTY3JpcHR1cmVQYW5lcyIsIl9jdXJyZW50VmVyc2VEYXRhIiwiaW5pdGlhbFZlcnNlT2JqZWN0cyIsIl9zY3JpcHR1cmVBbGlnbm1lbnRFZGl0Q29uZmlnIiwiaXNWZXJzZVNlbGVjdGVkRm9yQWxpZ25tZW50IiwiaGFuZGxlQWxpZ25CdXR0b25DbGljayIsIm9uUmVuZGVyVG9vbGJhciIsIm5ld0l0ZW1zIiwiYWxsVmVyc2VzQWxpZ25lZCIsInZhbHVlcyIsImV2ZXJ5IiwiYWxpZ25TdGF0dXMiLCJhbGlnbkljb24iLCJhbGlnbkJ1dHRvblRleHQiLCJwdXNoIiwiY3Vyc29yIiwicHJvcFR5cGVzIiwic3RyaW5nIiwiaXNSZXF1aXJlZCIsIm9iamVjdCIsIm51bWJlciIsImJvb2wiLCJmdW5jIiwic2hhcGUiLCJvbmVPZlR5cGUiLCJhbnkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLQSxLQUFaLE1BQXVCLE9BQXZCO0FBQ0EsT0FBTyxLQUFLQyxTQUFaLE1BQTJCLFlBQTNCO0FBQ0EsU0FBU0MsSUFBVCxFQUFlQyx5QkFBZixRQUFnRCx5QkFBaEQ7QUFDQSxPQUFPQyxNQUFQLE1BQW1CLFNBQW5CO0FBQ0EsU0FBU0MsT0FBVCxRQUF3QixxQkFBeEI7QUFDQSxTQUFTQyxVQUFULFFBQTJCLGVBQTNCO0FBQ0EsU0FBU0MsT0FBVCxFQUFrQkMsWUFBbEIsUUFBc0MsZ0JBQXRDO0FBQ0EsU0FDRUMsSUFERixFQUVFQyxXQUZGLEVBR0VDLHlCQUhGLEVBSUVDLFlBSkYsRUFLRUMsYUFMRixRQU1PLHVCQU5QLEMsQ0FPQTs7QUFDQSxTQUFTQyx3QkFBVCxRQUF5QyxrQkFBekM7QUFDQSxTQUFTQyxnQkFBVCxFQUEyQkMseUJBQTNCLFFBQTRELGtCQUE1RDtBQUNBLE9BQU8sS0FBS0MsT0FBWixNQUF5QixZQUF6QjtBQUNBLFNBQVNDLFNBQVQsUUFBMEIsdUJBQTFCO0FBQ0EsU0FBU0MsYUFBVCxFQUF3QkMsaUJBQXhCLFFBQWlELElBQWpEO0FBQ0EsU0FBU0Msb0JBQVQsUUFBcUMsa0NBQXJDO0FBQ0EsU0FDRUMsbUJBREYsRUFFRUMsYUFGRixFQUdFQyxlQUhGLEVBSUVDLGtCQUpGLEVBS0VDLDJCQUxGLEVBTUVDLGVBTkYsUUFPTywrQkFQUDtBQVFBLFNBQVNDLEtBQVQs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Q0F0UCxFQUFBQSxZQUFZLEVBQUU5RSxTQUFTLENBQUMyVSxHQTFEQTs7QUEyRHhCO0FBQ0E1UCxFQUFBQSxhQUFhLEVBQUUvRSxTQUFTLENBQUNxVSxNQTVERDs7QUE2RHhCO0FBQ0FyUCxFQUFBQSxNQUFNLEVBQUVoRixTQUFTLENBQUNtVSxNQUFWLENBQWlCQyxVQTlERDs7QUErRHhCO0FBQ0FuUCxFQUFBQSxlQUFlLEVBQUVqRixTQUFTLENBQUN3VSxJQWhFSDs7QUFpRXhCO0FBQ0F0UCxFQUFBQSxvQkFBb0IsRUFBRWxGLFNBQVMsQ0FBQ3dVLElBbEVSOztBQW1FeEI7QUFDQXBQLEVBQUFBLEtBQUssRUFBRXBGLFNBQVMsQ0FBQ21VLE1BQVYsQ0FBaUJDLFVBcEVBOztBQXFFeEI7QUFDQWpQLEVBQUFBLFNBQVMsRUFBRW5GLFNBQVMsQ0FBQ3dVLElBdEVHOztBQXVFeEI7QUFDQW5QLEVBQUFBLG1CQUFtQixFQUFFckYsU0FBUyxDQUFDd1UsSUFBVixDQUFlSjtBQXhFWixDQUExQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnXG5pbXBvcnQgeyBjb3JlLCBTZWxlY3Rpb25zQ29udGV4dFByb3ZpZGVyIH0gZnJvbSAnc2NyaXB0dXJlLXJlc291cmNlcy1yY2wnXG5pbXBvcnQgdXNmbWpzIGZyb20gJ3VzZm0tanMnXG5pbXBvcnQgeyB1c2VFZGl0IH0gZnJvbSAnZ2l0ZWEtcmVhY3QtdG9vbGtpdCdcbmltcG9ydCB7IEljb25CdXR0b24gfSBmcm9tICdAbXVpL21hdGVyaWFsJ1xuaW1wb3J0IHsgUnhMaW5rMiwgUnhMaW5rQnJlYWsyIH0gZnJvbSAncmVhY3QtaWNvbnMvcngnXG5pbXBvcnQge1xuICBDYXJkLFxuICBFUlJPUl9TVEFURSxcbiAgTUFOSUZFU1RfTk9UX0xPQURFRF9FUlJPUixcbiAgdXNlQ2FyZFN0YXRlLFxuICB1c2VVc2VyQnJhbmNoLFxufSBmcm9tICd0cmFuc2xhdGlvbi1oZWxwcy1yY2wnXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBnZXRRdW90ZU1hdGNoZXNJbkJvb2tSZWYgfSBmcm9tICd1dy1xdW90ZS1oZWxwZXJzJ1xuaW1wb3J0IHsgQWxpZ25tZW50SGVscGVycywgVXNmbUZpbGVDb252ZXJzaW9uSGVscGVycyB9IGZyb20gJ3dvcmQtYWxpZ25lci1yY2wnXG5pbXBvcnQgKiBhcyBpc0VxdWFsIGZyb20gJ2RlZXAtZXF1YWwnXG5pbXBvcnQgeyBnZXRWZXJzZXMgfSBmcm9tICdiaWJsZS1yZWZlcmVuY2UtcmFuZ2UnXG5pbXBvcnQgeyBTY3JpcHR1cmVQYW5lLCBTY3JpcHR1cmVTZWxlY3RvciB9IGZyb20gJy4uJ1xuaW1wb3J0IHsgdXNlU2NyaXB0dXJlU2V0dGluZ3MgfSBmcm9tICcuLi8uLi9ob29rcy91c2VTY3JpcHR1cmVTZXR0aW5ncydcbmltcG9ydCB7XG4gIGNsZWFudXBWZXJzZU9iamVjdHMsXG4gIGZpeE9jY3VycmVuY2UsXG4gIGdldFJlc291cmNlTGluayxcbiAgZ2V0UmVzb3VyY2VNZXNzYWdlLFxuICBnZXRTY3JpcHR1cmVWZXJzaW9uU2V0dGluZ3MsXG4gIGlzT3JpZ2luYWxCaWJsZSxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvU2NyaXB0dXJlU2V0dGluZ3MnXG5pbXBvcnQgeyBkZWxheSB9IGZyb20gJy4uLy4uL3V0aWxzL2RlbGF5J1xuaW1wb3J0IHsgYXJlTWFwc1RoZVNhbWUgfSBmcm9tICcuLi8uLi91dGlscy9tYXBzJ1xuaW1wb3J0IHsgVGl0bGUgfSBmcm9tICcuLi9TY3JpcHR1cmVQYW5lL3N0eWxlZCdcbmltcG9ydCB7XG4gIE5UX09SSUdfTEFORyxcbiAgT1JJR0lOQUxfU09VUkNFLFxuICBPVF9PUklHX0xBTkcsXG59IGZyb20gJy4uLy4uL3V0aWxzJ1xuaW1wb3J0IHsgVmVyc2VTZWxlY3RvclBvcHVwIH0gZnJvbSAnLi4vVmVyc2VTZWxlY3RvclBvcHVwJ1xuXG5jb25zdCBLRVlfRk9OVF9TSVpFX0JBU0UgPSAnc2NyaXB0dXJlUGFuZUZvbnRTaXplXydcbmNvbnN0IGxhYmVsID0gJ1ZlcnNpb24nXG5jb25zdCBzdHlsZSA9IHsgbWFyZ2luVG9wOiAnMTZweCcsIHdpZHRoOiAnNTAwcHgnIH1cblxuLyoqXG4gKiBjcmVhdGUgYSBzaG9ydCBjb21wYXJpc29uIHZlcnNlIHJlZiBvYmplY3Qgd2l0aG91dCBhbGwgdGhlIHZlcnNlRGF0YVxuICogQHBhcmFtIHZlcnNlUmVmXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVPYmplY3QodmVyc2VSZWYpIHtcbiAgY29uc3Qge1xuICAgIGNoYXB0ZXIsXG4gICAgdmVyc2UsXG4gICAgdmVyc2VEYXRhLFxuICB9ID0gdmVyc2VSZWYgfHwge31cbiAgY29uc3QgdmVyc2VPYmplY3RzID0gdmVyc2VEYXRhPy52ZXJzZU9iamVjdHM/Lmxlbmd0aCB8fCAwXG4gIHJldHVybiB7XG4gICAgY2hhcHRlcixcbiAgICB2ZXJzZSxcbiAgICB2ZXJzZU9iamVjdHMsXG4gIH1cbn1cblxuLyoqXG4gKiBjb21wYXJlIHR3byB2ZXJzZSByZWZzIHRvIHNlZSBpZiB0aGV5IGFyZSBzdWJzdGFudGlhbGx5IHNpbWlsYXJcbiAqIEBwYXJhbSB2ZXJzZXNGb3JSZWYxXG4gKiBAcGFyYW0gdmVyc2VzRm9yUmVmMlxuICovXG5mdW5jdGlvbiBhcmVWZXJzZXNTYW1lKHZlcnNlc0ZvclJlZjE6IGFueVtdLCB2ZXJzZXNGb3JSZWYyOiBhbnlbXSkge1xuICB2ZXJzZXNGb3JSZWYxID0gdmVyc2VzRm9yUmVmMSB8fCBbXVxuICB2ZXJzZXNGb3JSZWYyID0gdmVyc2VzRm9yUmVmMiB8fCBbXVxuICBsZXQgYXJlU2FtZSA9IGZhbHNlXG5cbiAgaWYgKHZlcnNlc0ZvclJlZjEubGVuZ3RoID09PSB2ZXJzZXNGb3JSZWYyLmxlbmd0aCkge1xuICAgIGFyZVNhbWUgPSB0cnVlXG5cbiAgICBmb3IgKGxldCBpID0gMCwgbD0gdmVyc2VzRm9yUmVmMS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNvbnN0IHZlcnNlMSA9IGNvbXBhcmVPYmplY3QodmVyc2VzRm9yUmVmMVtpXSlcbiAgICAgIGNvbnN0IHZlcnNlMiA9IGNvbXBhcmVPYmplY3QodmVyc2VzRm9yUmVmMltpXSlcbiAgICAgIGFyZVNhbWUgPSBpc0VxdWFsKHZlcnNlMSwgdmVyc2UyKVxuXG4gICAgICBpZiAoIWFyZVNhbWUpIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXJlU2FtZVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBTY3JpcHR1cmVDYXJkKHtcbiAgYXBwUmVmLFxuICBhdXRoZW50aWNhdGlvbixcbiAgYm9va0luZGV4LFxuICBjYXJkTnVtLFxuICBjbGFzc2VzLFxuICBkaXNhYmxlV29yZFBvcG92ZXIsXG4gIGdldExhbmd1YWdlLFxuICBnZXRMZXhpY29uRGF0YSxcbiAgZ3JlZWtSZXBvVXJsLFxuICBoZWJyZXdSZXBvVXJsLFxuICBodHRwQ29uZmlnLFxuICBpZCxcbiAgaXNOVCxcbiAgbG9nZ2VkSW5Vc2VyLFxuICBvbk1pbmltaXplLFxuICBvblJlc291cmNlRXJyb3IsXG4gIG9yaWdpbmFsU2NyaXB0dXJlQm9va09iamVjdHMsXG4gIHJlZmVyZW5jZSxcbiAgcmVzb3VyY2U6IHtcbiAgICBvd25lcixcbiAgICBsYW5ndWFnZUlkLFxuICAgIHJlc291cmNlSWQsXG4gICAgb3JpZ2luYWxMYW5ndWFnZU93bmVyLFxuICB9LFxuICByZXNvdXJjZUxpbmssXG4gIHNlbGVjdGVkUXVvdGUsXG4gIHNlcnZlcixcbiAgc2V0U2F2ZWRDaGFuZ2VzLFxuICBzZXRXb3JkQWxpZ25lclN0YXR1cyxcbiAgdHJhbnNsYXRlLFxuICB0aXRsZSxcbiAgdXNlVXNlckxvY2FsU3RvcmFnZSxcbn0pIHtcbiAgY29uc3QgYm9va0lkID0gcmVmZXJlbmNlPy5wcm9qZWN0SWRcbiAgY29uc3QgW3N0YXRlLCBzZXRTdGF0ZV9dID0gUmVhY3QudXNlU3RhdGUoe1xuICAgIGNoZWNrRm9yRWRpdEJyYW5jaDogMCxcbiAgICBjdXJyZW50UmVmZXJlbmNlOiBudWxsLFxuICAgIGVkaXRCcmFuY2hSZWFkeTogZmFsc2UsXG4gICAgaGF2ZVVuc2F2ZWRDaGFuZ2VzOiBmYWxzZSxcbiAgICBsYXN0U2VsZWN0ZWRRdW90ZTogbnVsbCxcbiAgICByZWFkeUZvckZldGNoOiBmYWxzZSxcbiAgICByZWY6IGFwcFJlZixcbiAgICBzYXZlQ2xpY2tlZDogZmFsc2UsXG4gICAgc2F2ZUNvbnRlbnQ6IG51bGwsXG4gICAgc2VsZWN0aW9uczogbmV3IE1hcCgpLFxuICAgIHNoYTogbnVsbCxcbiAgICBzdGFydFNhdmU6IGZhbHNlLFxuICAgIHVybEVycm9yOiBudWxsLFxuICAgIHVzaW5nVXNlckJyYW5jaDogZmFsc2UsXG4gICAgdW5zYXZlZENoYW5nZXNMaXN0OiB7fSxcbiAgICB2ZXJzZXNGb3JSZWY6IG51bGwsXG4gICAgc2hvd0FsaWdubWVudFBvcHVwOiBmYWxzZSxcbiAgICB2ZXJzZVNlbGVjdGVkRm9yQWxpZ25tZW50OiBudWxsLFxuICAgIHZlcnNlc0FsaWdubWVudFN0YXR1czogbnVsbCxcbiAgICB2ZXJzZU9iamVjdHNNYXA6IG5ldyBNYXAoKSxcbiAgfSlcbiAgY29uc3Qge1xuICAgIGNoZWNrRm9yRWRpdEJyYW5jaCxcbiAgICBjdXJyZW50UmVmZXJlbmNlLFxuICAgIGVkaXRCcmFuY2hSZWFkeSxcbiAgICBoYXZlVW5zYXZlZENoYW5nZXMsXG4gICAgbGFzdFNlbGVjdGVkUXVvdGUsXG4gICAgcmVhZHlGb3JGZXRjaCxcbiAgICByZWYsXG4gICAgc2F2ZUNsaWNrZWQsXG4gICAgc2F2ZUNvbnRlbnQsXG4gICAgc2VsZWN0aW9ucyxcbiAgICBzaGEsXG4gICAgc2hvd0FsaWdubWVudFBvcHVwLFxuICAgIHN0YXJ0U2F2ZSxcbiAgICB1cmxFcnJvcixcbiAgICB1c2luZ1VzZXJCcmFuY2gsXG4gICAgdW5zYXZlZENoYW5nZXNMaXN0LFxuICAgIHZlcnNlT2JqZWN0c01hcCxcbiAgICB2ZXJzZVNlbGVjdGVkRm9yQWxpZ25tZW50LFxuICAgIHZlcnNlc0FsaWdubWVudFN0YXR1cyxcbiAgICB2ZXJzZXNGb3JSZWYsXG4gIH0gPSBzdGF0ZVxuXG4gIGNvbnN0IFtmb250U2l6ZSwgc2V0Rm9udFNpemVdID0gdXNlVXNlckxvY2FsU3RvcmFnZShLRVlfRk9OVF9TSVpFX0JBU0UgKyBjYXJkTnVtLCAxMDApXG4gIGNvbnN0IGlzTlRfID0gaXNOVChib29rSWQpXG5cbiAgZnVuY3Rpb24gc2V0U3RhdGUobmV3U3RhdGUpIHtcbiAgICBzZXRTdGF0ZV8ocHJldlN0YXRlID0+ICh7IC4uLnByZXZTdGF0ZSwgLi4ubmV3U3RhdGUgfSkpXG4gIH1cblxuICBpZiAodXNpbmdVc2VyQnJhbmNoKSB7XG4gICAgaHR0cENvbmZpZyA9IHtcbiAgICAgIC4uLmh0dHBDb25maWcsXG4gICAgICBjYWNoZTogeyBtYXhBZ2U6IDAgfSxcbiAgICAgIG5vQ2FjaGU6IHRydWUsXG4gICAgfSAvLyBkaXNhYmxlIGh0dHAgY2FjaGluZ1xuICB9XG5cbiAgY29uc3Qge1xuICAgIGlzTmV3VGVzdGFtZW50LFxuICAgIHNjcmlwdHVyZUNvbmZpZyxcbiAgICBzZXRTY3JpcHR1cmUsXG4gICAgc2NyaXB0dXJlU2V0dGluZ3MsXG4gICAgc2NyaXB0dXJlVmVyc2lvbkhpc3QsXG4gIH0gPSB1c2VTY3JpcHR1cmVTZXR0aW5ncyh7XG4gICAgaXNOVCxcbiAgICB0aXRsZSxcbiAgICBvd25lcixcbiAgICByZWZlcmVuY2U6IGN1cnJlbnRSZWZlcmVuY2UgfHwgcmVmZXJlbmNlLFxuICAgIGFwcFJlZjogcmVmLFxuICAgIHNlcnZlcixcbiAgICBjYXJkTnVtLFxuICAgIGRpc2FibGVXb3JkUG9wb3ZlcixcbiAgICBncmVla1JlcG9VcmwsXG4gICAgaGVicmV3UmVwb1VybCxcbiAgICBodHRwQ29uZmlnLFxuICAgIGxhbmd1YWdlSWQsXG4gICAgb3JpZ2luYWxMYW5ndWFnZU93bmVyLFxuICAgIHJlYWR5Rm9yRmV0Y2gsXG4gICAgcmVzb3VyY2VJZCxcbiAgICByZXNvdXJjZUxpbmssXG4gICAgc2V0VXJsRXJyb3I6IChlcnJvcikgPT4gc2V0U3RhdGUoeyB1cmxFcnJvcjogZXJyb3IgfSksXG4gICAgdXNlVXNlckxvY2FsU3RvcmFnZSxcbiAgICB3aG9sZUJvb2s6IHRydWUsXG4gIH0pXG5cbiAgY29uc3QgZmV0Y2hSZXNwXyA9IHNjcmlwdHVyZUNvbmZpZz8uZmV0Y2hSZXNwb25zZVxuICAvLyBAdHMtaWdub3JlXG4gIGNvbnN0IHJlcG8gPSBgJHtzY3JpcHR1cmVDb25maWc/LnJlc291cmNlPy5sYW5ndWFnZUlkfV8ke3NjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2U/LnByb2plY3RJZH1gXG4gIGNvbnN0IHJlZmVyZW5jZV8gPSBzY3JpcHR1cmVDb25maWc/LnJlZmVyZW5jZSB8fCBudWxsXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHsgLy8gZ2V0IHRoZSBfc2hhIGZyb20gbGFzdCBzY3JpcHR1cmUgZG93bmxvYWRcbiAgICBjb25zdCBfc2hhID0gZmV0Y2hSZXNwXz8uZGF0YT8uc2hhIHx8IG51bGxcbiAgICBjb25zdCB1cmwgPSBmZXRjaFJlc3BfPy5kYXRhPy5kb3dubG9hZF91cmwgfHwgbnVsbFxuICAgIGxldCB2YWxpZEJyYW5jaCA9IHRydWVcblxuICAgIGlmIChfc2hhKSB7IC8vIFRSSUNLWTogc2luY2UgdGhpcyBmZXRjaCBtYXkgYmUgZGVsYXllZCAtIG1ha2Ugc3VyZSBpdCB3YXMgZm9yIHRoZSBjdXJyZW50IGJyYW5jaCBiZWZvcmUgdXNpbmcgdGhlIHNoYVxuICAgICAgY29uc3QgcGFydHMgPSAodXJsIHx8ICcnKS5zcGxpdCgnLycpXG4gICAgICBjb25zdCBmZXRjaEJyYW5jaCA9IHBhcnRzLmxlbmd0aCA+IDcgPyBwYXJ0c1s3XSA6ICcnXG4gICAgICB2YWxpZEJyYW5jaCA9IGZldGNoQnJhbmNoID09PSByZWZcbiAgICB9XG5cbiAgICBpZiAodmFsaWRCcmFuY2ggJiYgX3NoYSAhPT0gc2hhKSB7XG4gICAgICBjb25zb2xlLmxvZyhgU2NyaXB0dXJlQ2FyZDogZm9yICR7dXJsfSAke0pTT04uc3RyaW5naWZ5KHJlZmVyZW5jZV8pfSBuZXcgc2hhIGlzICR7X3NoYX1gKVxuICAgICAgc2V0U3RhdGUoeyBzaGE6IF9zaGEgfSlcbiAgICB9XG4gIH0sIFtmZXRjaFJlc3BfXSlcblxuICAvLyBAdHMtaWdub3JlXG4gIGNvbnN0IGNhcmRSZXNvdXJjZUlkID0gc2NyaXB0dXJlQ29uZmlnPy5yZXNvdXJjZT8ucHJvamVjdElkIHx8IHJlc291cmNlSWRcbiAgLy8gQHRzLWlnbm9yZVxuICBsZXQgcmVmXyA9IHNjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2U/LnJlZiB8fCBhcHBSZWZcbiAgY29uc3QgY2FuVXNlRWRpdEJyYW5jaCA9ICEhKGxvZ2dlZEluVXNlciAmJiBhdXRoZW50aWNhdGlvbiAmJiAocmVzb3VyY2VJZCAhPT0gT1JJR0lOQUxfU09VUkNFKSAmJiAvLyBUUklDS1kgaWYgbm90IG9yaWdpbmFsIGxhbmd1YWdlIGFuZCB3ZSBoYXZlIGxvZ2luIGRhdGEsIHRoZW4gd2UgY2FuIHVzZSB0aGUgZWRpdCBicmFuY2hcbiAgICAoKHJlZl8gPT09ICdtYXN0ZXInKSB8fCAocmVmXy5pbmNsdWRlcyhsb2dnZWRJblVzZXIpKSkpIC8vIGFsc28gbWFrZSBzdXJlIG5vdCBhIHZlcnNpb24gdGFnXG5cbiAgY29uc3Qge1xuICAgIHN0YXRlOiB7XG4gICAgICBicmFuY2hEZXRlcm1pbmVkLFxuICAgICAgdXNlckVkaXRCcmFuY2hOYW1lLFxuICAgICAgdXNpbmdVc2VyQnJhbmNoOiBfdXNpbmdVc2VyQnJhbmNoLFxuICAgICAgd29ya2luZ1Jlc291cmNlQnJhbmNoLFxuICAgIH0sXG4gICAgYWN0aW9uczogeyBzdGFydEVkaXQ6IHN0YXJ0RWRpdEJyYW5jaCB9LFxuICB9ID0gdXNlVXNlckJyYW5jaCh7XG4gICAgYXBwUmVmLFxuICAgIGF1dGhlbnRpY2F0aW9uOiBjYW5Vc2VFZGl0QnJhbmNoID8gYXV0aGVudGljYXRpb24gOiBudWxsLFxuICAgIGJvb2tJZCxcbiAgICBjYXJkSWQ6IGlkLFxuICAgIGNhcmRSZXNvdXJjZUlkLFxuICAgIGNoZWNrRm9yRWRpdEJyYW5jaCxcbiAgICBsYW5ndWFnZUlkLFxuICAgIGxvZ2dlZEluVXNlcjogY2FuVXNlRWRpdEJyYW5jaCA/IGxvZ2dlZEluVXNlciA6IG51bGwsXG4gICAgb3duZXIsXG4gICAgb25SZXNvdXJjZUVycm9yLFxuICAgIHNlcnZlcixcbiAgICB1c2VVc2VyTG9jYWxTdG9yYWdlLFxuICB9KVxuXG4gIGNvbnN0IHdvcmtpbmdSZWYgPSBjYW5Vc2VFZGl0QnJhbmNoID8gd29ya2luZ1Jlc291cmNlQnJhbmNoIDogYXBwUmVmXG4gIGxldCBzY3JpcHR1cmVUaXRsZVxuXG4gIGlmICghY2FuVXNlRWRpdEJyYW5jaCAmJiAhcmVhZHlGb3JGZXRjaCkgeyAvLyBpZiBiaWJsZSBub3QgZWxpZ2libGUgZm9yIHVzZXIgYnJhbmNoLCBtYWtlIHN1cmUgaXQncyByZWFkeVxuICAgIHNldFN0YXRlKHsgcmVhZHlGb3JGZXRjaDogdHJ1ZSB9KVxuICB9XG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zb2xlLmxvZyhgU2NyaXB0dXJlQ2FyZCBib29rIGNoYW5nZWRgLCB7IGJvb2tJZCwgb3duZXIsIGxhbmd1YWdlSWQsIHJlc291cmNlSWQgfSlcblxuICAgIGlmIChjYW5Vc2VFZGl0QnJhbmNoKSB7IC8vIGlmIGJpYmxlIGVsaWdpYmxlIGZvciB1c2VyIGJyYW5jaCwgcmVmcmVzaCBpdFxuICAgICAgc2V0U3RhdGUoeyByZWFkeUZvckZldGNoOiBmYWxzZSwgY2hlY2tGb3JFZGl0QnJhbmNoOiBjaGVja0ZvckVkaXRCcmFuY2ggKyAxIH0pXG4gICAgfVxuICB9LCBbYm9va0lkLCBvd25lciwgbGFuZ3VhZ2VJZCwgcmVzb3VyY2VJZF0pXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWlzRXF1YWwocmVmZXJlbmNlLCBjdXJyZW50UmVmZXJlbmNlKSkge1xuICAgICAgLy8gY29uc29sZS5sb2coYFNjcmlwdHVyZUNhcmQgcmVmZXJlbmNlIGNoYW5nZWRgLCByZWZlcmVuY2UpXG4gICAgICBzZXRTdGF0ZSh7IGN1cnJlbnRSZWZlcmVuY2U6IHJlZmVyZW5jZSB9KVxuICAgIH1cbiAgfSwgW3JlZmVyZW5jZV0pXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHsgLy8gd2FpdGluZyBmb3IgYnJhbmNoIGZldGNoIHRvIGNvbXBsZXRlXG4gICAgY29uc29sZS5sb2coYFNjcmlwdHVyZUNhcmQgYnJhbmNoRGV0ZXJtaW5lZCBpcyAke2JyYW5jaERldGVybWluZWR9IGFuZCB3b3JraW5nUmVmIGlzICR7d29ya2luZ1JlZn0gYW5kIHJlYWR5Rm9yRmV0Y2ggaXMgJHtyZWFkeUZvckZldGNofWApXG5cbiAgICBpZiAoIXJlYWR5Rm9yRmV0Y2ggJiYgYnJhbmNoRGV0ZXJtaW5lZCApIHtcbiAgICAgIHNldFN0YXRlKHsgcmVhZHlGb3JGZXRjaDogdHJ1ZSwgcmVmOiB3b3JraW5nUmVmIH0pXG4gICAgfVxuICB9LCBbYnJhbmNoRGV0ZXJtaW5lZF0pXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHsgLy8gc2VsZWN0IGNvcnJlY3Qgd29ya2luZyByZWYgLSBjb3VsZCBiZSBtYXN0ZXIsIHVzZXIgYnJhbmNoLCBvciByZWxlYXNlXG4gICAgaWYgKF91c2luZ1VzZXJCcmFuY2ggIT09IHVzaW5nVXNlckJyYW5jaCkge1xuICAgICAgc2V0U3RhdGUoeyB1c2luZ1VzZXJCcmFuY2g6IF91c2luZ1VzZXJCcmFuY2ggfSlcbiAgICB9XG4gIH0sIFtfdXNpbmdVc2VyQnJhbmNoLCB1c2luZ1VzZXJCcmFuY2hdKVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7IC8vIHVwZGF0ZSBkaXNwbGF5IHN0YXR1cyBpZiBlcnJvclxuICAgIGNvbnN0IGVycm9yID0gc2NyaXB0dXJlQ29uZmlnPy5yZXNvdXJjZVN0YXR1cz8uW0VSUk9SX1NUQVRFXVxuXG4gICAgaWYgKGVycm9yKSB7IC8vIGlmIGVycm9yIHdhcyBmb3VuZCBkbyBjYWxsYmFja1xuICAgICAgY29uc3QgcmVzb3VyY2VTdGF0dXMgPSBzY3JpcHR1cmVDb25maWc/LnJlc291cmNlU3RhdHVzXG4gICAgICBjb25zdCByZXNvdXJjZUxpbmsgPSBnZXRSZXNvdXJjZUxpbmsoc2NyaXB0dXJlQ29uZmlnKVxuICAgICAgY29uc3QgbWVzc2FnZSA9IGdldFJlc291cmNlTWVzc2FnZShyZXNvdXJjZVN0YXR1cywgc2VydmVyLCByZXNvdXJjZUxpbmssIGlzTlRfKVxuICAgICAgY29uc3QgaXNBY2Nlc3NFcnJvciA9IHJlc291cmNlU3RhdHVzW01BTklGRVNUX05PVF9MT0FERURfRVJST1JdXG4gICAgICBvblJlc291cmNlRXJyb3IgJiYgb25SZXNvdXJjZUVycm9yKG1lc3NhZ2UsIGlzQWNjZXNzRXJyb3IsIHJlc291cmNlU3RhdHVzKVxuICAgIH1cbiAgfSwgW3NjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2VTdGF0dXM/LltFUlJPUl9TVEFURV1dKVxuXG4gIGlmIChzY3JpcHR1cmVDb25maWcudGl0bGUgJiYgc2NyaXB0dXJlQ29uZmlnLnZlcnNpb24pIHtcbiAgICBzY3JpcHR1cmVUaXRsZSA9IGAke3NjcmlwdHVyZUNvbmZpZy50aXRsZX0gdiR7c2NyaXB0dXJlQ29uZmlnLnZlcnNpb259YFxuICAgIHNjcmlwdHVyZVZlcnNpb25IaXN0LnVwZGF0ZVRpdGxlKHNjcmlwdHVyZUNvbmZpZy5yZXNvdXJjZUxpbmssIHNjcmlwdHVyZVRpdGxlKVxuICB9IGVsc2Uge1xuICAgIHNjcmlwdHVyZVRpdGxlID0gYFRpdGxlIG1pc3NpbmcgZnJvbSBwcm9qZWN0IG1hbmlmZXN0YFxuICB9XG5cbiAgLyoqIER5bmFtaWNhbGx5IGNyZWF0ZXMgdGhlIHNjcmlwdHVyZSBzZWxlY3Rpb24gZHJvcGRvd24gdG8gYmUgaW5zZXJ0ZWQgaW50byBjYXJkIHNldHRpbmdzICovXG4gIGZ1bmN0aW9uIGdldFNjcmlwdHVyZVNlbGVjdG9yKCkge1xuICAgIGNvbnN0IHNjcmlwdHVyZVNlbGVjdGlvbkNvbmZpZyA9IGdldFNjcmlwdHVyZVZlcnNpb25TZXR0aW5ncyh7XG4gICAgICBsYWJlbCxcbiAgICAgIHJlc291cmNlTGluazogc2NyaXB0dXJlQ29uZmlnLnJlc291cmNlTGluayxcbiAgICAgIHNldFNjcmlwdHVyZSxcbiAgICAgIHNjcmlwdHVyZVZlcnNpb25IaXN0LFxuICAgIH0pXG5cbiAgICByZXR1cm4gPFNjcmlwdHVyZVNlbGVjdG9yIHsuLi5zY3JpcHR1cmVTZWxlY3Rpb25Db25maWd9IHN0eWxlPXtzdHlsZX0gZXJyb3JNZXNzYWdlPXt1cmxFcnJvcn0gLz5cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uTWVudUNsb3NlKCkge1xuICAgIC8vIGNvbnNvbGUubG9nKGBvbk1lbnVDbG9zZSgpYClcbiAgICBzZXRTdGF0ZSh7IHVybEVycm9yOiBudWxsIH0pXG4gIH1cblxuICAvLyBAdHMtaWdub3JlXG4gIGNvbnN0IGxhbmd1YWdlSWRfID0gc2NyaXB0dXJlQ29uZmlnPy5yZXNvdXJjZT8ubGFuZ3VhZ2VJZFxuICBjb25zdCBsYW5ndWFnZSA9IGdldExhbmd1YWdlKHsgbGFuZ3VhZ2VJZDogbGFuZ3VhZ2VJZF8gfSlcbiAgY29uc3QgZGlyZWN0aW9uID0gKGxhbmd1YWdlPy5kaXJlY3Rpb24pIHx8ICdsdHInXG4gIGNvbnN0IF9yZWZlcmVuY2UgPSBjdXJyZW50UmVmZXJlbmNlIHx8IHJlZmVyZW5jZVxuXG4gIGNvbnN0IGlzSGVicmV3ID0gKGxhbmd1YWdlSWRfID09PSAnaGJvJylcbiAgY29uc3QgZm9udEZhY3RvciA9IGlzSGVicmV3ID8gMS40IDogMSAvLyB3ZSBhdXRvbWF0aWNhbGx5IHNjYWxlIHVwIGZvbnQgc2l6ZSBmb3IgSGVicmV3XG4gIGNvbnN0IHNjYWxlZEZvbnRTaXplID0gZm9udFNpemUgKiBmb250RmFjdG9yXG5cbiAgY29uc3QgaXRlbXMgPSBudWxsXG4gIGNvbnN0IHtcbiAgICBzdGF0ZToge1xuICAgICAgaGVhZGVycywgZmlsdGVycywgaXRlbUluZGV4LCBtYXJrZG93blZpZXcsXG4gICAgfSxcbiAgICBhY3Rpb25zOiB7XG4gICAgICBzZXRGaWx0ZXJzLCBzZXRJdGVtSW5kZXgsIHNldE1hcmtkb3duVmlldyxcbiAgICB9LFxuICB9ID0gdXNlQ2FyZFN0YXRlKHsgaXRlbXMgfSlcblxuICBjb25zdCByZWZTdHlsZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICBmb250RmFtaWx5OiAnTm90byBTYW5zJyxcbiAgICBmb250U2l6ZTogYCR7TWF0aC5yb3VuZChzY2FsZWRGb250U2l6ZSAqIDAuOSl9JWAsXG4gIH0pLCBbc2NhbGVkRm9udFNpemVdKVxuXG4gIGNvbnN0IGNvbnRlbnRTdHlsZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICBmb250RmFtaWx5OiAnTm90byBTYW5zJyxcbiAgICBmb250U2l6ZTogYCR7c2NhbGVkRm9udFNpemV9JWAsXG4gIH0pLCBbc2NhbGVkRm9udFNpemVdKVxuXG4gIGNvbnN0IHNjcmlwdHVyZUxhYmVsID0gPFRpdGxlPntzY3JpcHR1cmVUaXRsZX08L1RpdGxlPlxuICBsZXQgZGlzYWJsZVdvcmRQb3BvdmVyXyA9IGRpc2FibGVXb3JkUG9wb3ZlclxuICBjb25zdCB1c2luZ09yaWdpbmFsQmlibGUgPSBpc09yaWdpbmFsQmlibGUoc2NyaXB0dXJlQ29uZmlnWydyZXNvdXJjZSddPy5wcm9qZWN0SWQpXG5cbiAgaWYgKGRpc2FibGVXb3JkUG9wb3ZlciA9PT0gdW5kZWZpbmVkKSB7IC8vIGlmIG5vdCBzcGVjaWZpZWQsIHRoZW4gZGV0ZXJtaW5lIGlmIG9yaWdpbmFsIGxhbmd1YWdlIHJlc291cmNlXG4gICAgZGlzYWJsZVdvcmRQb3BvdmVyXyA9ICF1c2luZ09yaWdpbmFsQmlibGVcbiAgfVxuXG4gIGNvbnN0IGVuYWJsZUVkaXQgPSAhdXNpbmdPcmlnaW5hbEJpYmxlXG4gIGNvbnN0IGVuYWJsZUFsaWdubWVudCA9ICF1c2luZ09yaWdpbmFsQmlibGVcbiAgY29uc3Qgb3JpZ2luYWxSZXBvVXJsID0gaXNOZXdUZXN0YW1lbnQgPyBncmVla1JlcG9VcmwgOiBoZWJyZXdSZXBvVXJsXG4gIGNvbnN0IHNjcmlwdHVyZUFsaWdubWVudEVkaXRDb25maWcgPSB7XG4gICAgYXV0aGVudGljYXRpb246IGNhblVzZUVkaXRCcmFuY2ggPyBhdXRoZW50aWNhdGlvbiA6IG51bGwsXG4gICAgYm9va0luZGV4LFxuICAgIGN1cnJlbnRWZXJzZVJlZjogX3JlZmVyZW5jZSxcbiAgICBlbmFibGVFZGl0LFxuICAgIGVuYWJsZUFsaWdubWVudCxcbiAgICBodHRwQ29uZmlnLFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpc05ld1Rlc3RhbWVudCxcbiAgICBsb2dnZWRJblVzZXI6IGNhblVzZUVkaXRCcmFuY2ggPyBsb2dnZWRJblVzZXIgOiBudWxsLFxuICAgIG9yaWdpbmFsTGFuZ3VhZ2VPd25lcixcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3JpZ2luYWxSZXBvVXJsLFxuICAgIHNjcmlwdHVyZUNvbmZpZyxcbiAgICBzY3JpcHR1cmVTZXR0aW5ncyxcbiAgICBzdGFydEVkaXRCcmFuY2gsXG4gICAgc2V0U2F2ZWRDaGFuZ2VzOiBfc2V0U2F2ZWRDaGFuZ2VzLFxuICAgIHNvdXJjZUxhbmd1YWdlOiBpc05UXyA/IE5UX09SSUdfTEFORyA6IE9UX09SSUdfTEFORyxcbiAgICB0YXJnZXRMYW5ndWFnZTogbGFuZ3VhZ2UsXG4gICAgdGl0bGU6IHNjcmlwdHVyZVRpdGxlLFxuICAgIHdvcmtpbmdSZXNvdXJjZUJyYW5jaDogcmVmLFxuICB9XG5cbiAgLyoqXG4gICAqIHRoaXMgZ2V0cyBjYWxsZWQgd2hlbmV2ZXIgYSBzY3JpcHR1cmUgcGFuZSBoYXMgYSBjaGFuZ2UgaW4gc2F2ZSBzdGF0ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gY3VycmVudEluZGV4XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2F2ZWRcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gZ2V0Q2hhbmdlcyAtIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIHVzZXIgY2xpY2tzIHNhdmUgYnV0dG9uXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNsZWFyQ2hhbmdlcyAtIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIHNhdmUgaGFzIGNvbXBsZXRlZFxuICAgKiBAcGFyYW0ge29iamVjdH0gc3RhdGUgLSBjdXJyZW50IHN0YXRlIG9mIHdvcmQgYWxpZ25tZW50L2VkaXRcbiAgICovXG4gIGZ1bmN0aW9uIF9zZXRTYXZlZENoYW5nZXMoY3VycmVudEluZGV4LCBzYXZlZCwgeyBnZXRDaGFuZ2VzID0gbnVsbCwgY2xlYXJDaGFuZ2VzID0gbnVsbCwgc3RhdGUgPSBudWxsIH0pIHtcbiAgICBjb25zdCBfdW5zYXZlZENoYW5nZXNMaXN0ID0geyAuLi51bnNhdmVkQ2hhbmdlc0xpc3QgfVxuXG4gICAgaWYgKHNhdmVkKSB7XG4gICAgICBpZiAoX3Vuc2F2ZWRDaGFuZ2VzTGlzdC5oYXNPd25Qcm9wZXJ0eShjdXJyZW50SW5kZXgpKSB7XG4gICAgICAgIGRlbGV0ZSBfdW5zYXZlZENoYW5nZXNMaXN0W2N1cnJlbnRJbmRleF1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgX3Vuc2F2ZWRDaGFuZ2VzTGlzdFtjdXJyZW50SW5kZXhdID0geyBnZXRDaGFuZ2VzLCBjbGVhckNoYW5nZXMsIHN0YXRlIH0gLy8gdXBkYXRlIHdpdGggbGF0ZXN0XG4gICAgfVxuXG4gICAgY29uc3QgX2hhdmVVbnNhdmVkQ2hhbmdlcyA9ICEhT2JqZWN0LmtleXMoX3Vuc2F2ZWRDaGFuZ2VzTGlzdCkubGVuZ3RoXG5cbiAgICBpZiAoaGF2ZVVuc2F2ZWRDaGFuZ2VzICE9IF9oYXZlVW5zYXZlZENoYW5nZXMpIHtcbiAgICAgIHNldFNhdmVkQ2hhbmdlcyAmJiBzZXRTYXZlZENoYW5nZXMocmVzb3VyY2VJZCwgIV9oYXZlVW5zYXZlZENoYW5nZXMpXG4gICAgICBzZXRTdGF0ZSh7IGhhdmVVbnNhdmVkQ2hhbmdlczogX2hhdmVVbnNhdmVkQ2hhbmdlcyB9KVxuICAgIH1cblxuICAgIGlmICghaXNFcXVhbChfdW5zYXZlZENoYW5nZXNMaXN0LCB1bnNhdmVkQ2hhbmdlc0xpc3QpKSB7XG4gICAgICBzZXRTdGF0ZSh7IHVuc2F2ZWRDaGFuZ2VzTGlzdDogX3Vuc2F2ZWRDaGFuZ2VzTGlzdCB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBzZWFyY2ggY2hhcHRlciBvciB2ZXJzZSBjaHVuayB0byBsaW5lIHRoYXQgc3RhcnRzIHdpdGggZmluZEl0ZW1cbiAgICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBmaW5kSXRlbVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBjaHVua3NcbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRSZWZJbkFycmF5KGZpbmRJdGVtLCBjaHVua3MpIHtcbiAgICBjb25zdCByZWZfID0gZmluZEl0ZW0gKyAnJ1xuICAgIGNvbnN0IHJlZkxlbiA9IHJlZl8ubGVuZ3RoXG4gICAgY29uc3QgaW5kZXggPSBjaHVua3MuZmluZEluZGV4KChjaHVuaywgaWR4KSA9PiB7XG4gICAgICBpZiAoaWR4ID4gMCkge1xuICAgICAgICBpZiAoY2h1bmsuc3Vic3RyaW5nKDAsIHJlZkxlbikgPT09IHJlZl8pIHtcbiAgICAgICAgICBjb25zdCBuZXh0Q2hhciA9IGNodW5rW3JlZkxlbl1cblxuICAgICAgICAgIGlmICgobmV4dENoYXIgPiAnOScpIHx8IChuZXh0Q2hhciA8ICcwJykpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9KVxuICAgIHJldHVybiBpbmRleFxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Qm9va05hbWUoKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGJvb2tDYXBzID0gc2NyaXB0dXJlQ29uZmlnPy5yZWZlcmVuY2U/LnByb2plY3RJZCA/IHNjcmlwdHVyZUNvbmZpZy5yZWZlcmVuY2UucHJvamVjdElkLnRvVXBwZXJDYXNlKCkgOiAnJ1xuICAgIHJldHVybiBgJHtib29rSW5kZXh9LSR7Ym9va0NhcHN9LnVzZm1gXG4gIH1cblxuICBjb25zdCBmaWxlcGF0aCA9IGdldEJvb2tOYW1lKClcblxuICAvLyBrZWVwIHRyYWNrIG9mIHZlcnNlIGVkaXQgc3RhdGVcbiAgY29uc3Qge1xuICAgIGVycm9yOiBzYXZlRXJyb3IsXG4gICAgaXNFcnJvcjogaXNTYXZlRXJyb3IsXG4gICAgb25TYXZlRWRpdCxcbiAgfSA9IHVzZUVkaXQoe1xuICAgIHNoYSxcbiAgICBvd25lcixcbiAgICBjb250ZW50OiBzYXZlQ29udGVudCxcbiAgICBjb25maWc6IHtcbiAgICAgIGNhY2hlOiB7IG1heEFnZTogMCB9LFxuICAgICAgLi4uYXV0aGVudGljYXRpb24/LmNvbmZpZyxcbiAgICAgIHRva2VuOiBhdXRoZW50aWNhdGlvbj8udG9rZW4sXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aW1lb3V0OiBodHRwQ29uZmlnPy5zZXJ2ZXJUaW1lT3V0IHx8IGh0dHBDb25maWc/LnRpbWVvdXQgfHwgMTAwMDAsXG4gICAgICBzZXJ2ZXIsXG4gICAgfSxcbiAgICBhdXRob3I6IGxvZ2dlZEluVXNlcixcbiAgICB0b2tlbjogYXV0aGVudGljYXRpb24/LnRva2VuLFxuICAgIGJyYW5jaDogd29ya2luZ1Jlc291cmNlQnJhbmNoLFxuICAgIGZpbGVwYXRoLFxuICAgIHJlcG8sXG4gIH0pXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHsgLy8gd2hlbiB3ZSBnZXQgYSBzYXZlIHNhdmVFcnJvclxuICAgIGlmIChzYXZlRXJyb3IgJiYgaXNTYXZlRXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBzYXZlIGVycm9yYCwgc2F2ZUVycm9yKVxuICAgICAgLy8gb25SZXNvdXJjZUVycm9yICYmIG9uUmVzb3VyY2VFcnJvcihudWxsLCBmYWxzZSwgbnVsbCwgYEVycm9yIHNhdmluZyAke2xhbmd1YWdlSWRffV8ke3Jlc291cmNlSWR9ICR7c2F2ZUVycm9yfWAsIHRydWUpXG4gICAgfVxuICB9LCBbc2F2ZUVycm9yLCBpc1NhdmVFcnJvcl0pXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHsgLy8gd2hlbiBzdGFydFNhdmUgZ29lcyB0cnVlLCBzYXZlIGVkaXRzIHRvIHVzZXIgYnJhbmNoIGFuZCB0aGVuIGNsZWFyIHN0YXJ0U2F2ZVxuICAgIGNvbnN0IF9zYXZlRWRpdCA9IGFzeW5jICgpID0+IHsgLy8gYmVnaW4gdXBsb2FkaW5nIG5ldyBVU0ZNXG4gICAgICBjb25zb2xlLmluZm8oYHNhdmVDaGFuZ2VzVG9DbG91ZCgpIC0gVXNpbmcgc2hhOiAke3NoYX1gKVxuICAgICAgYXdhaXQgb25TYXZlRWRpdCh1c2VyRWRpdEJyYW5jaE5hbWUpLnRoZW4oKHN1Y2Nlc3MpID0+IHsgLy8gcHVzaCBjaGFuZ2VkIHRvIHNlcnZlclxuICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBzYXZlQ2hhbmdlc1RvQ2xvdWQoKSAtIHNhdmUgc2NyaXB0dXJlIGVkaXRzIHN1Y2Nlc3NgKVxuICAgICAgICAgIGNvbnN0IHVuc2F2ZWRDYXJkSW5kaWNlcyA9IE9iamVjdC5rZXlzKHVuc2F2ZWRDaGFuZ2VzTGlzdClcblxuICAgICAgICAgIGlmICh1bnNhdmVkQ2FyZEluZGljZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjYXJkSW5kZXggb2YgdW5zYXZlZENhcmRJbmRpY2VzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgY2xlYXJDaGFuZ2VzIH0gPSB1bnNhdmVkQ2hhbmdlc0xpc3RbY2FyZEluZGV4XVxuICAgICAgICAgICAgICBjbGVhckNoYW5nZXMgJiYgY2xlYXJDaGFuZ2VzKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zb2xlLmluZm8oJ3NhdmVDaGFuZ2VzVG9DbG91ZCgpIC0gUmVsb2FkaW5nIHJlc291cmNlJylcbiAgICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgICBzdGFydFNhdmU6IGZhbHNlLFxuICAgICAgICAgICAgcmVhZHlGb3JGZXRjaDogdHJ1ZSxcbiAgICAgICAgICAgIHJlZjogdXNlckVkaXRCcmFuY2hOYW1lLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgZGVsYXkoNTAwKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHNjcmlwdHVyZUNvbmZpZz8ucmVsb2FkUmVzb3VyY2Uoc2hhKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignc2F2ZUNoYW5nZXNUb0Nsb3VkKCkgLSBzYXZpbmcgY2hhbmdlZCBzY3JpcHR1cmUgZmFpbGVkJylcbiAgICAgICAgICBzZXRTdGF0ZSh7IHN0YXJ0U2F2ZTogZmFsc2UgfSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoc3RhcnRTYXZlKSB7XG4gICAgICBpZiAoIWVkaXRCcmFuY2hSZWFkeSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgc2F2ZUNoYW5nZXNUb0Nsb3VkIC0gZWRpdCBicmFuY2ggbm90IHlldCBjcmVhdGVkYClcbiAgICAgIH0gZWxzZSBpZiAoIXNoYSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgc2F2ZUNoYW5nZXNUb0Nsb3VkIC0gc2F2ZSBzaGEgbm90IHlldCByZWFkeWApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgc2F2ZUNoYW5nZXNUb0Nsb3VkIC0gY2FsbGluZyBfc2F2ZUVkaXQoKWApXG4gICAgICAgIF9zYXZlRWRpdCgpXG4gICAgICB9XG4gICAgfVxuICB9LCBbc3RhcnRTYXZlLCBlZGl0QnJhbmNoUmVhZHksIHNoYV0pXG5cbiAgLyoqXG4gICAqIGNvbnZlcnQgdXBkYXRlZFZlcnNlT2JqZWN0cyB0byBVU0ZNIGFuZCBtZXJnZSBpbnRvIHRoZSBiaWJsZVVzZm1cbiAgICogQHBhcmFtIHtzdHJpbmd9IGJpYmxlVXNmbSAtIFVTRk0gb2YgYmlibGVcbiAgICogQHBhcmFtIHtvYmplY3R9IHJlZiAtIHJlZmVyZW5jZSBvZiB2ZXJzZSB0byBtZXJnZSBpblxuICAgKiBAcGFyYW0ge29iamVjdFtdfSB1cGRhdGVkVmVyc2VPYmplY3RzIC0gbmV3IHZlcnNlIGluIHZlcnNlT2JqZWN0IGZvcm1hdFxuICAgKiBAcGFyYW0ge251bWJlcn0gY2FyZE51bVxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VWZXJzZU9iamVjdHNJbnRvQmlibGVVc2ZtKGJpYmxlVXNmbSwgcmVmLCB1cGRhdGVkVmVyc2VPYmplY3RzLCBjYXJkTnVtOiBudW1iZXIpIHtcbiAgICBsZXQgbmV3VXNmbVxuICAgIGNvbnN0IGNoYXB0ZXJDaHVua3MgPSBiaWJsZVVzZm0/LnNwbGl0KCdcXFxcYyAnKVxuICAgIGNvbnN0IGNoYXB0ZXJJbmRleCA9IGZpbmRSZWZJbkFycmF5KHJlZj8uY2hhcHRlciwgY2hhcHRlckNodW5rcylcblxuICAgIGlmIChjaGFwdGVySW5kZXggPj0gMCkge1xuICAgICAgY29uc3QgY3VycmVudENoYXB0ZXIgPSBjaGFwdGVyQ2h1bmtzW2NoYXB0ZXJJbmRleF1cbiAgICAgIGNvbnN0IHZlcnNlQ2h1bmtzID0gY3VycmVudENoYXB0ZXIuc3BsaXQoJ1xcXFx2ICcpXG4gICAgICBjb25zdCB2ZXJzZUluZGV4ID0gZmluZFJlZkluQXJyYXkocmVmPy52ZXJzZSwgdmVyc2VDaHVua3MpXG5cbiAgICAgIGlmICh2ZXJzZUluZGV4ID49IDApIHtcbiAgICAgICAgY29uc3QgbmV3VmVyc2VVc2ZtID0gVXNmbUZpbGVDb252ZXJzaW9uSGVscGVycy5jb252ZXJ0VmVyc2VEYXRhVG9VU0ZNKHVwZGF0ZWRWZXJzZU9iamVjdHMpXG4gICAgICAgIGNvbnNvbGUubG9nKGBzYXZlQ2hhbmdlc1RvQ2xvdWQoJHtjYXJkTnVtfSkgLSBuZXcgVVNGTSBmb3IgY2FyZDp9IC0gJHtuZXdWZXJzZVVzZm0uc3Vic3RyaW5nKDAsIDEwMCl9YClcbiAgICAgICAgY29uc3Qgb2xkVmVyc2UgPSB2ZXJzZUNodW5rc1t2ZXJzZUluZGV4XVxuICAgICAgICBjb25zdCB2ZXJzZU51bUxlbiA9IChyZWY/LnZlcnNlICsgJycpLmxlbmd0aFxuICAgICAgICB2ZXJzZUNodW5rc1t2ZXJzZUluZGV4XSA9IG9sZFZlcnNlLnN1YnN0cmluZygwLCB2ZXJzZU51bUxlbiArIDEpICsgbmV3VmVyc2VVc2ZtXG4gICAgICAgIGNvbnN0IG5ld0NoYXB0ZXIgPSB2ZXJzZUNodW5rcy5qb2luKCdcXFxcdiAnKVxuICAgICAgICBjaGFwdGVyQ2h1bmtzW2NoYXB0ZXJJbmRleF0gPSBuZXdDaGFwdGVyXG4gICAgICAgIG5ld1VzZm0gPSBjaGFwdGVyQ2h1bmtzLmpvaW4oJ1xcXFxjICcpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXdVc2ZtXG4gIH1cblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4geyAvLyBmb3IgZWFjaCB1bnNhdmVkIGNoYW5nZSwgY2FsbCBpbnRvIHNjcmlwdHVyZVBhbmUgdG8gZ2V0IGxhdGVzdCBjaGFuZ2VzIGZvciB2ZXJzZSB0byBzYXZlXG4gICAgYXN5bmMgZnVuY3Rpb24gZ2V0UmVhZHlGb3JTYXZlKCkge1xuICAgICAgaWYgKHNhdmVDbGlja2VkKSB7XG4gICAgICAgIGxldCBjcmVhdGVFZGl0QnJhbmNoID0gIV91c2luZ1VzZXJCcmFuY2hcblxuICAgICAgICBpZiAoIWNyZWF0ZUVkaXRCcmFuY2gpIHsgLy8gaWYgYWxyZWFkeSB1c2luZyB0aGUgdXNlciBicmFuY2hcbiAgICAgICAgICBpZiAod29ya2luZ1Jlc291cmNlQnJhbmNoICE9PSB1c2VyRWRpdEJyYW5jaE5hbWUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybihgc2F2ZUNoYW5nZXNUb0Nsb3VkIC0gc3RhdGUgY29uZmxpY3QgLSBzaG91bGQgYmUgaW4gdXNlciBicmFuY2ggJHt1c2VyRWRpdEJyYW5jaE5hbWV9LCBidXQgYWN0dWFsbHkgdXNpbmcgJHt3b3JraW5nUmVzb3VyY2VCcmFuY2h9YClcbiAgICAgICAgICAgIGNyZWF0ZUVkaXRCcmFuY2ggPSB0cnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBzYXZlQ2hhbmdlc1RvQ2xvdWQgLSBhbHJlYWR5IHVzaW5nIGVkaXQgYnJhbmNoOiAke3dvcmtpbmdSZXNvdXJjZUJyYW5jaH1gKVxuICAgICAgICAgICAgc2V0U3RhdGUoeyBlZGl0QnJhbmNoUmVhZHk6IHRydWUgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3JlYXRlRWRpdEJyYW5jaCkgeyAvLyBpZiBub3QgeWV0IHVzaW5nIHRoZSB1c2VyIGJyYW5jaCwgY3JlYXRlIGl0XG4gICAgICAgICAgY29uc29sZS5sb2coYHNhdmVDaGFuZ2VzVG9DbG91ZCAtIGNyZWF0aW5nIGVkaXQgYnJhbmNoYClcbiAgICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgICBlZGl0QnJhbmNoUmVhZHk6IGZhbHNlLFxuICAgICAgICAgICAgcmVhZHlGb3JGZXRjaDogZmFsc2UsXG4gICAgICAgICAgICBzaGE6IG51bGwsXG4gICAgICAgICAgfSkgLy8gd2Ugd2lsbCBuZWVkIGEgbmV3IHNoYSBmb3IgYm9vay9icmFuY2hcblxuICAgICAgICAgIGNvbnN0IGJyYW5jaCA9IGF3YWl0IHN0YXJ0RWRpdEJyYW5jaCgpXG5cbiAgICAgICAgICBpZiAoYnJhbmNoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgc2F2ZUNoYW5nZXNUb0Nsb3VkIC0gZWRpdCBicmFuY2ggY3JlYXRlZGApXG4gICAgICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIGVkaXRCcmFuY2hSZWFkeTogdHJ1ZSxcbiAgICAgICAgICAgICAgcmVhZHlGb3JGZXRjaDogdHJ1ZSxcbiAgICAgICAgICAgICAgcmVmOiBicmFuY2gsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgc2F2ZUNoYW5nZXNUb0Nsb3VkIC0gZmFpbGVkIHRvIGNyZWF0ZSBlZGl0IGJyYW5jaGApXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coYHNhdmVDaGFuZ2VzVG9DbG91ZCAtIGdldHRpbmcgdmVyc2UgY2hhbmdlc2ApXG4gICAgICAgIGNvbnN0IHVuc2F2ZWRDYXJkSW5kaWNlcyA9IE9iamVjdC5rZXlzKHVuc2F2ZWRDaGFuZ2VzTGlzdClcblxuICAgICAgICBpZiAodW5zYXZlZENhcmRJbmRpY2VzPy5sZW5ndGgpIHtcbiAgICAgICAgICBsZXQgYmlibGVVc2ZtID0gY29yZS5nZXRSZXNwb25zZURhdGEoc2NyaXB0dXJlQ29uZmlnPy5mZXRjaFJlc3BvbnNlKVxuICAgICAgICAgIGxldCBtZXJnZUZhaWwgPSBmYWxzZVxuICAgICAgICAgIGxldCBjYXJkTnVtID0gMFxuXG4gICAgICAgICAgZm9yIChjb25zdCBjYXJkSW5kZXggb2YgdW5zYXZlZENhcmRJbmRpY2VzKSB7XG4gICAgICAgICAgICBjYXJkTnVtID0gcGFyc2VJbnQoY2FyZEluZGV4KVxuICAgICAgICAgICAgY29uc3QgeyBnZXRDaGFuZ2VzLCBzdGF0ZSB9ID0gdW5zYXZlZENoYW5nZXNMaXN0W2NhcmROdW1dXG5cbiAgICAgICAgICAgIGlmIChnZXRDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgIGxldCBuZXdVc2ZtXG4gICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICByZWYsXG4gICAgICAgICAgICAgICAgdXBkYXRlZFZlcnNlT2JqZWN0cyxcbiAgICAgICAgICAgICAgfSA9IGdldENoYW5nZXMoc3RhdGUpXG5cbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZWRWZXJzZU9iamVjdHMgJiYgYmlibGVVc2ZtKSB7IC8vIGp1c3QgcmVwbGFjZSB2ZXJzZVxuICAgICAgICAgICAgICAgIG5ld1VzZm0gPSBtZXJnZVZlcnNlT2JqZWN0c0ludG9CaWJsZVVzZm0oYmlibGVVc2ZtLCByZWYsIHVwZGF0ZWRWZXJzZU9iamVjdHMsIGNhcmROdW0pXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAobmV3VXNmbSkge1xuICAgICAgICAgICAgICAgIGJpYmxlVXNmbSA9IG5ld1VzZm1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtZXJnZUZhaWwgPSB0cnVlXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChtZXJnZUZhaWwpIHsgLy8gaWYgd2UgZmFpbGVkIHRvIG1lcmdlLCBmYWxsYmFjayB0byBicnV0ZSBmb3JjZSB2ZXJzZSBvYmplY3RzIHRvIFVTRk1cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBzYXZlQ2hhbmdlc1RvQ2xvdWQoJHtjYXJkTnVtfSkgLSB2ZXJzZSBub3QgZm91bmQsIGZhbGxpbmcgYmFjayB0byBpbnNlcnRpbmcgdmVyc2Ugb2JqZWN0YClcbiAgICAgICAgICAgIGxldCBuZXdCb29rSnNvblxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNhcmRJbmRleCBvZiB1bnNhdmVkQ2FyZEluZGljZXMpIHtcbiAgICAgICAgICAgICAgY29uc3QgY2FyZE51bSA9IHBhcnNlSW50KGNhcmRJbmRleClcbiAgICAgICAgICAgICAgY29uc3QgeyBnZXRDaGFuZ2VzLCBzdGF0ZSB9ID0gdW5zYXZlZENoYW5nZXNMaXN0W2NhcmROdW1dXG5cbiAgICAgICAgICAgICAgaWYgKGdldENoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3VXNmbVxuICAgICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgIG5ld1ZlcnNlVGV4dCxcbiAgICAgICAgICAgICAgICAgIHJlZixcbiAgICAgICAgICAgICAgICAgIHVwZGF0ZWRWZXJzZU9iamVjdHMsXG4gICAgICAgICAgICAgICAgfSA9IGdldENoYW5nZXMoc3RhdGUpXG5cbiAgICAgICAgICAgICAgICBpZiAodXBkYXRlZFZlcnNlT2JqZWN0cyAmJiAhbmV3VXNmbSkge1xuICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldFZlcnNlT2JqZWN0c18gPSBudWxsXG5cbiAgICAgICAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZlcnNlVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgdGFyZ2V0VmVyc2VPYmplY3RzIH0gPSBBbGlnbm1lbnRIZWxwZXJzLnVwZGF0ZUFsaWdubWVudHNUb1RhcmdldFZlcnNlKHVwZGF0ZWRWZXJzZU9iamVjdHMsIG5ld1ZlcnNlVGV4dClcbiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRWZXJzZU9iamVjdHNfID0gdGFyZ2V0VmVyc2VPYmplY3RzXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VmVyc2VPYmplY3RzXyA9IHVwZGF0ZWRWZXJzZU9iamVjdHNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBuZXdCb29rSnNvbiA9IHRhcmdldFZlcnNlT2JqZWN0c18gJiYgc2NyaXB0dXJlQ29uZmlnPy51cGRhdGVWZXJzZShyZWYuY2hhcHRlciwgcmVmLnZlcnNlLCB7dmVyc2VPYmplY3RzOiB0YXJnZXRWZXJzZU9iamVjdHNffSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYmlibGVVc2ZtID0gdXNmbWpzLnRvVVNGTShuZXdCb29rSnNvbiwge2ZvcmNlZE5ld0xpbmVzOiB0cnVlfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zb2xlLmxvZyhgc2F2ZUNoYW5nZXNUb0Nsb3VkKCkgLSBzYXZpbmcgbmV3IFVTRk06ICR7YmlibGVVc2ZtLnN1YnN0cmluZygwLCAxMDApfS4uLmApXG4gICAgICAgICAgc2V0U3RhdGUoe3NhdmVDb250ZW50OiBiaWJsZVVzZm0sIHN0YXJ0U2F2ZTogdHJ1ZSwgc2F2ZUNsaWNrZWQ6IGZhbHNlfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGdldFJlYWR5Rm9yU2F2ZSgpXG4gIH0sIFtzYXZlQ2xpY2tlZF0pXG5cbiAgLy8gQHRzLWlnbm9yZVxuICBjb25zdCB7IGNoYXB0ZXIgfSA9IF9yZWZlcmVuY2UgfHwge31cblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IF92ZXJzZXNGb3JSZWYgPSBzY3JpcHR1cmVDb25maWc/LnZlcnNlc0ZvclJlZlxuICAgIGxldCBuZXdTZWxlY3Rpb25zID0gbmV3IE1hcCgpXG4gICAgbGV0IHVwZGF0ZVNlbGVjdGlvbnMgPSBmYWxzZVxuICAgIGNvbnN0IF9tYXAgPSBuZXdTZWxlY3Rpb25zXG4gICAgY29uc3Qgb3JpZ2luYWxCb29rSWQgPSBvcmlnaW5hbFNjcmlwdHVyZUJvb2tPYmplY3RzPy5ib29rSWRcbiAgICBjb25zdCBib29rVmVyc2VPYmplY3QgPSBvcmlnaW5hbFNjcmlwdHVyZUJvb2tPYmplY3RzPy5jaGFwdGVyc1xuICAgIGxldCBuZXdTZWxlY3RlZFF1b3RlID0gbnVsbFxuXG4gICAgLy8gaWYgd2UgaGF2ZSBldmVyeXRoaW5nIHdlIG5lZWQgdG8gY2FsY3VsYXRlIHNlbGVjdGlvbnNcbiAgICBpZiAoX3ZlcnNlc0ZvclJlZj8ubGVuZ3RoICYmXG4gICAgICBib29rVmVyc2VPYmplY3QgJiZcbiAgICAgIChib29rSWQgPT09IG9yaWdpbmFsQm9va0lkKSAmJlxuICAgICAgYm9va1ZlcnNlT2JqZWN0W2NoYXB0ZXJdICYmIC8vIHdlIG5lZWQgdG8gaGF2ZSBkYXRhIGZvciBjaGFwdGVyXG4gICAgICBzZWxlY3RlZFF1b3RlPy5xdW90ZVxuICAgICkge1xuICAgICAgLy8gaWYgcXVvdGUgaXMgZGlmZmVyZW50IHRoYW4gbGFzdFxuICAgICAgaWYgKCFpc0VxdWFsKGxhc3RTZWxlY3RlZFF1b3RlLCBzZWxlY3RlZFF1b3RlKSB8fFxuICAgICAgICAhaXNFcXVhbCh2ZXJzZXNGb3JSZWYsIF92ZXJzZXNGb3JSZWYpKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVmVyc2VzID0ge31cbiAgICAgICAgY29uc3Qgc3Vic3RpdHV0ZSA9IHt9IC8vIGtlZXAgdHJhY2sgb2YgdmVyc2Ugc3Vic3RpdHV0aW9uc1xuICAgICAgICBsZXQgc3RhcnRWZXJzZSA9IF92ZXJzZXNGb3JSZWZbMF0udmVyc2VcblxuICAgICAgICBpZiAodHlwZW9mIHN0YXJ0VmVyc2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgc3RhcnRWZXJzZSA9IHBhcnNlSW50KHN0YXJ0VmVyc2UpXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGFzdFZlcnNlID0gc3RhcnRWZXJzZVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gX3ZlcnNlc0ZvclJlZi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB2ZXJzZVJlZiA9IF92ZXJzZXNGb3JSZWZbaV1cbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjaGFwdGVyLFxuICAgICAgICAgICAgdmVyc2UsXG4gICAgICAgICAgfSA9IHZlcnNlUmVmXG4gICAgICAgICAgLy8gVFJJQ0tZIC0gd2UgcmVtYXAgdmVyc2VzIGluIHJlZmVyZW5jZSByYW5nZSB0byBhIGxpbmVhciBzZXJpZXMgb2YgdmVyc2VzIHNvIHZlcnNlIHNwYW5zIGRvbid0IGNob2tlIGdldFF1b3RlTWF0Y2hlc0luQm9va1JlZlxuICAgICAgICAgIGxldCBfdmVyc2UgPSBzdGFydFZlcnNlICsgaVxuICAgICAgICAgIGxhc3RWZXJzZSA9IF92ZXJzZVxuICAgICAgICAgIHN1YnN0aXR1dGVbYCR7Y2hhcHRlcn06JHtfdmVyc2V9YF0gPSBgJHtjaGFwdGVyfToke3ZlcnNlfWBcblxuICAgICAgICAgIGlmICghb3JpZ2luYWxWZXJzZXNbY2hhcHRlcl0pIHtcbiAgICAgICAgICAgIG9yaWdpbmFsVmVyc2VzW2NoYXB0ZXJdID0ge31cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgdmVyc2VPYmplY3RzID0gW11cblxuICAgICAgICAgIGlmICgodHlwZW9mIHZlcnNlID09PSAnc3RyaW5nJykgJiYgKHZlcnNlLmluY2x1ZGVzKCctJykpKSB7XG4gICAgICAgICAgICBjb25zdCB2ZXJzZXMgPSBnZXRWZXJzZXMoYm9va1ZlcnNlT2JqZWN0LCBgJHtjaGFwdGVyfToke3ZlcnNlfWApXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgdmVyc2VJdGVtIG9mIHZlcnNlcykge1xuICAgICAgICAgICAgICBjb25zdCB2byA9IHZlcnNlSXRlbS52ZXJzZURhdGEudmVyc2VPYmplY3RzXG4gICAgICAgICAgICAgIHZlcnNlT2JqZWN0cyA9IHZlcnNlT2JqZWN0cy5jb25jYXQodm8pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZlcnNlT2JqZWN0cyA9IGJvb2tWZXJzZU9iamVjdFtjaGFwdGVyXVt2ZXJzZV0/LnZlcnNlT2JqZWN0c1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2ZXJzZU9iamVjdHMpIHtcbiAgICAgICAgICAgIHZlcnNlT2JqZWN0cyA9IGNsZWFudXBWZXJzZU9iamVjdHModmVyc2VPYmplY3RzKVxuICAgICAgICAgICAgb3JpZ2luYWxWZXJzZXNbY2hhcHRlcl1bX3ZlcnNlXSA9IHsgdmVyc2VPYmplY3RzIH1cbiAgICAgICAgICAgIF9tYXAuc2V0KGAke2NoYXB0ZXJ9OiR7dmVyc2V9YCwgdmVyc2VPYmplY3RzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNyZWF0ZSBuZXcgcmVmZXJlbmNlIHJhbmdlIGZvciBuZXcgbGluZWFyIHZlcnNlIHJhbmdlXG4gICAgICAgIGNvbnN0IFtjaGFwdGVyXSA9IHNlbGVjdGVkUXVvdGU/LnJlZmVyZW5jZT8uc3BsaXQoJzonKVxuICAgICAgICBsZXQgc3ViUmVmID0gYCR7Y2hhcHRlcn06JHtzdGFydFZlcnNlfWBcblxuICAgICAgICBpZiAobGFzdFZlcnNlICE9IHN0YXJ0VmVyc2UpIHtcbiAgICAgICAgICBzdWJSZWYgKz0gYC0ke2xhc3RWZXJzZX1gXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdW90ZU1hdGNoZXMgPSBnZXRRdW90ZU1hdGNoZXNJbkJvb2tSZWYoe1xuICAgICAgICAgIGJvb2tPYmplY3Q6IG9yaWdpbmFsVmVyc2VzLFxuICAgICAgICAgIHJlZjogc3ViUmVmLFxuICAgICAgICAgIHF1b3RlOiBzZWxlY3RlZFF1b3RlPy5xdW90ZSxcbiAgICAgICAgICBvY2N1cnJlbmNlOiBzZWxlY3RlZFF1b3RlPy5vY2N1cnJlbmNlLFxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbnMgPSBuZXcgTWFwKClcblxuICAgICAgICBpZiAocXVvdGVNYXRjaGVzPy5zaXplKSB7XG4gICAgICAgICAgcXVvdGVNYXRjaGVzLmZvckVhY2goKHdvcmRzLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IF9rZXkgPSBzdWJzdGl0dXRlW2tleV1cblxuICAgICAgICAgICAgc2VsZWN0aW9ucy5zZXQoX2tleSwgd29yZHMubWFwKHdvcmQgPT4gKFxuICAgICAgICAgICAgICB7IC4uLndvcmQsIHRleHQ6IGNvcmUubm9ybWFsaXplU3RyaW5nKHdvcmQudGV4dCkgfVxuICAgICAgICAgICAgKSkpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBuZXdTZWxlY3Rpb25zID0gc2VsZWN0aW9uc1xuICAgICAgICBuZXdTZWxlY3RlZFF1b3RlID0gc2VsZWN0ZWRRdW90ZVxuICAgICAgICB1cGRhdGVTZWxlY3Rpb25zID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG5ld1N0YXRlOiBhbnkgPSB7fVxuXG4gICAgLy8gdXBkYXRlIHN0YXRlcyB0aGF0IGhhdmUgY2hhbmdlZFxuICAgIGlmICghYXJlTWFwc1RoZVNhbWUodmVyc2VPYmplY3RzTWFwLCBfbWFwKSkge1xuICAgICAgbmV3U3RhdGUudmVyc2VPYmplY3RzTWFwID0gX21hcFxuICAgIH1cblxuICAgIGNvbnN0IGJvb2tzTm90U2FtZSA9IHJlZmVyZW5jZT8ucHJvamVjdElkICE9PSBjdXJyZW50UmVmZXJlbmNlPy5wcm9qZWN0SWRcblxuICAgIGlmIChib29rc05vdFNhbWUgfHwgIWFyZVZlcnNlc1NhbWUodmVyc2VzRm9yUmVmLCBfdmVyc2VzRm9yUmVmKSkge1xuICAgICAgbmV3U3RhdGUudmVyc2VzRm9yUmVmID0gX3ZlcnNlc0ZvclJlZlxuICAgICAgbmV3U3RhdGUubGFzdFNlbGVjdGVkUXVvdGUgPSBuZXdTZWxlY3RlZFF1b3RlXG4gICAgICBuZXdTdGF0ZS5zZWxlY3Rpb25zID0gbmV3U2VsZWN0aW9uc1xuICAgIH1cblxuICAgIGlmIChuZXdTZWxlY3RlZFF1b3RlKSB7XG4gICAgICBuZXdTdGF0ZS5sYXN0U2VsZWN0ZWRRdW90ZSA9IG5ld1NlbGVjdGVkUXVvdGVcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlU2VsZWN0aW9ucykge1xuICAgICAgaWYgKCFhcmVNYXBzVGhlU2FtZShzZWxlY3Rpb25zIHx8IChuZXcgTWFwKCkpLCBuZXdTZWxlY3Rpb25zKSkge1xuICAgICAgICBuZXdTdGF0ZS5zZWxlY3Rpb25zID0gbmV3U2VsZWN0aW9uc1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyhuZXdTdGF0ZSkubGVuZ3RoKSB7XG4gICAgICBzZXRTdGF0ZShuZXdTdGF0ZSlcbiAgICB9XG4gIH0sIFtvd25lciwgcmVzb3VyY2VJZCwgYm9va0lkLCBsYW5ndWFnZUlkXywgc2NyaXB0dXJlQ29uZmlnPy52ZXJzZXNGb3JSZWYsIG9yaWdpbmFsU2NyaXB0dXJlQm9va09iamVjdHMsIHNlbGVjdGVkUXVvdGVdKVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7IC8vIGNsZWFyIHNldHRpbmdzIG9uIHZlcnNlIGNoYW5nZVxuICAgIHNldFN0YXRlKHtcbiAgICAgIHZlcnNlc0FsaWdubWVudFN0YXR1czogbnVsbCxcbiAgICAgIHVuc2F2ZWRDaGFuZ2VzTGlzdDoge30sXG4gICAgICBoYXZlVW5zYXZlZENoYW5nZXM6IGZhbHNlLFxuICAgIH0pXG4gIH0sIFtfcmVmZXJlbmNlXSlcblxuICBjb25zdCB1cGRhdGVWZXJzZXNBbGlnbm1lbnRTdGF0dXMgPSAocmVmZXJlbmNlLCBhbGlnbmVkKSA9PiB7XG4gICAgc2V0U3RhdGVfKHByZXZTdGF0ZSA9PiAoe1xuICAgICAgLi4ucHJldlN0YXRlLFxuICAgICAgdmVyc2VzQWxpZ25tZW50U3RhdHVzOiB7IC4uLnByZXZTdGF0ZS52ZXJzZXNBbGlnbm1lbnRTdGF0dXMsIFtgJHtyZWZlcmVuY2UuY2hhcHRlcn06JHtyZWZlcmVuY2UudmVyc2V9YF06IGFsaWduZWQgfSxcbiAgICB9KSlcbiAgfVxuXG4gIGxldCBfdmVyc2VzRm9yUmVmID0gc2NyaXB0dXJlQ29uZmlnPy52ZXJzZXNGb3JSZWZcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChfdmVyc2VzRm9yUmVmPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHsgcmVmZXJlbmNlLCByZXNvdXJjZUxpbmsgfSA9IHNjcmlwdHVyZUNvbmZpZyB8fCB7fVxuICAgICAgY29uc29sZS5sb2coYFNjcmlwdHVyZUNhcmQuX3ZlcnNlc0ZvclJlZiBjaGFuZ2VkYCwgeyByZWZlcmVuY2UsIHJlc291cmNlTGluayB9KVxuICAgIH1cbiAgfSwgW192ZXJzZXNGb3JSZWZdKVxuXG4gIGlmICghX3ZlcnNlc0ZvclJlZj8ubGVuZ3RoKSB7IC8vIGlmIGVtcHR5IG9mIHJlZmVyZW5jZXMsIGNyZWF0ZSBzaW5nbGUgZW1wdHkgcmVmZXJlbmNlXG4gICAgX3ZlcnNlc0ZvclJlZiA9IFt7IC4uLnJlZmVyZW5jZSB9XVxuICB9XG5cbiAgY29uc3QgcmVuZGVyZWRTY3JpcHR1cmVQYW5lcyA9IF92ZXJzZXNGb3JSZWY/Lm1hcCgoX2N1cnJlbnRWZXJzZURhdGEsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgaW5pdGlhbFZlcnNlT2JqZWN0cyA9IF9jdXJyZW50VmVyc2VEYXRhPy52ZXJzZURhdGE/LnZlcnNlT2JqZWN0cyB8fCBbXVxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCB7IGNoYXB0ZXIsIHZlcnNlIH0gPSBfY3VycmVudFZlcnNlRGF0YSB8fCB7fVxuICAgIGNvbnN0IHByb2plY3RJZCA9IGN1cnJlbnRSZWZlcmVuY2U/LnByb2plY3RJZCB8fCByZWZlcmVuY2U/LnByb2plY3RJZFxuICAgIGNvbnN0IF9yZWZlcmVuY2UgPSB7XG4gICAgICAuLi5fdmVyc2VzRm9yUmVmLFxuICAgICAgY2hhcHRlcixcbiAgICAgIHZlcnNlLFxuICAgICAgcHJvamVjdElkLFxuICAgIH1cbiAgICBjb25zdCBfc2NyaXB0dXJlQWxpZ25tZW50RWRpdENvbmZpZyA9IHtcbiAgICAgIC4uLnNjcmlwdHVyZUFsaWdubWVudEVkaXRDb25maWcsXG4gICAgICBjdXJyZW50SW5kZXg6IGluZGV4LFxuICAgICAgaW5pdGlhbFZlcnNlT2JqZWN0cyxcbiAgICAgIHJlZmVyZW5jZTogX3JlZmVyZW5jZSxcbiAgICAgIGlzTmV3VGVzdGFtZW50LFxuICAgIH1cblxuICAgIGxldCBpc1ZlcnNlU2VsZWN0ZWRGb3JBbGlnbm1lbnQgPSBmYWxzZVxuXG4gICAgaWYgKHZlcnNlU2VsZWN0ZWRGb3JBbGlnbm1lbnQpIHtcbiAgICAgIGlzVmVyc2VTZWxlY3RlZEZvckFsaWdubWVudCA9IHZlcnNlU2VsZWN0ZWRGb3JBbGlnbm1lbnQuY2hhcHRlciA9PSBjaGFwdGVyICYmIHZlcnNlU2VsZWN0ZWRGb3JBbGlnbm1lbnQudmVyc2UgPT0gdmVyc2VcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFNjcmlwdHVyZVBhbmVcbiAgICAgICAgey4uLnNjcmlwdHVyZUNvbmZpZ31cbiAgICAgICAgY29udGVudFN0eWxlPXtjb250ZW50U3R5bGV9XG4gICAgICAgIGN1cnJlbnRJbmRleD17aW5kZXh9XG4gICAgICAgIGRldGVybWluaW5nQnJhbmNoPXshcmVhZHlGb3JGZXRjaH1cbiAgICAgICAgZGlyZWN0aW9uPXtkaXJlY3Rpb259XG4gICAgICAgIGRpc2FibGVXb3JkUG9wb3Zlcj17ZGlzYWJsZVdvcmRQb3BvdmVyX31cbiAgICAgICAgZm9udFNpemU9e2ZvbnRTaXplfVxuICAgICAgICBnZXRMZXhpY29uRGF0YT17Z2V0TGV4aWNvbkRhdGF9XG4gICAgICAgIGlzTlQ9e2lzTlRffVxuICAgICAgICBpc1ZlcnNlU2VsZWN0ZWRGb3JBbGlnbm1lbnQ9e2lzVmVyc2VTZWxlY3RlZEZvckFsaWdubWVudH1cbiAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgb25BbGlnbm1lbnRGaW5pc2g9eygpID0+IHNldFN0YXRlKHsgdmVyc2VTZWxlY3RlZEZvckFsaWdubWVudDogbnVsbCB9KX1cbiAgICAgICAgb3JpZ2luYWxTY3JpcHR1cmVCb29rT2JqZWN0cz17b3JpZ2luYWxTY3JpcHR1cmVCb29rT2JqZWN0c31cbiAgICAgICAgcmVmU3R5bGU9e3JlZlN0eWxlfVxuICAgICAgICByZWZlcmVuY2U9e19yZWZlcmVuY2V9XG4gICAgICAgIHNhdmluZz17c3RhcnRTYXZlfVxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHNjcmlwdHVyZUFsaWdubWVudEVkaXRDb25maWc9e19zY3JpcHR1cmVBbGlnbm1lbnRFZGl0Q29uZmlnfVxuICAgICAgICBzZXRXb3JkQWxpZ25lclN0YXR1cz17c2V0V29yZEFsaWduZXJTdGF0dXN9XG4gICAgICAgIHNlcnZlcj17c2VydmVyfVxuICAgICAgICB0cmFuc2xhdGU9e3RyYW5zbGF0ZX1cbiAgICAgICAgdXBkYXRlVmVyc2VzQWxpZ25tZW50U3RhdHVzPXt1cGRhdGVWZXJzZXNBbGlnbm1lbnRTdGF0dXN9XG4gICAgICAvPlxuICAgIClcbiAgfSlcblxuICBjb25zdCBoYW5kbGVBbGlnbkJ1dHRvbkNsaWNrID0gKCkgPT4ge1xuICAgIGlmICh2ZXJzZXNGb3JSZWY/Lmxlbmd0aCA+IDEpIHtcbiAgICAgIHNldFN0YXRlKHsgc2hvd0FsaWdubWVudFBvcHVwOiB0cnVlIH0pXG4gICAgfSBlbHNlIGlmICh2ZXJzZXNGb3JSZWY/Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgc2V0U3RhdGUoeyB2ZXJzZVNlbGVjdGVkRm9yQWxpZ25tZW50OiB2ZXJzZXNGb3JSZWZbMF0gfSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBvblJlbmRlclRvb2xiYXIgPSAoeyBpdGVtcyB9KSA9PiB7XG4gICAgY29uc3QgbmV3SXRlbXMgPSBbLi4uaXRlbXNdXG5cbiAgICBsZXQgYWxsVmVyc2VzQWxpZ25lZCA9IGZhbHNlXG5cbiAgICAvLyBDaGVjayBpZiBhbGwgdmFsdWVzIGluIHZlcnNlc0FsaWdubWVudFN0YXR1cyBhcmUgdHJ1ZVxuICAgIGlmICh2ZXJzZXNBbGlnbm1lbnRTdGF0dXMpIHtcbiAgICAgIGFsbFZlcnNlc0FsaWduZWQgPSBPYmplY3QudmFsdWVzKHZlcnNlc0FsaWdubWVudFN0YXR1cykuZXZlcnkoYWxpZ25TdGF0dXMgPT4gYWxpZ25TdGF0dXMgPT09IHRydWUpXG4gICAgfVxuXG4gICAgbGV0IGFsaWduSWNvbiA9IG51bGxcbiAgICBsZXQgYWxpZ25CdXR0b25UZXh0ID0gJydcblxuICAgIGlmIChhbGxWZXJzZXNBbGlnbmVkKSB7XG4gICAgICBhbGlnbkljb24gPSA8UnhMaW5rMiBpZD17YHZhbGlkX2ljb25fJHtyZXNvdXJjZUlkfWB9IGNvbG9yPScjQkJCJy8+XG4gICAgICBhbGlnbkJ1dHRvblRleHQgPSAnQWxpZ25tZW50IGlzIFZhbGlkJ1xuICAgIH0gZWxzZSB7XG4gICAgICBhbGlnbkljb24gPSA8UnhMaW5rQnJlYWsyIGlkPXtgaW52YWxpZF9hbGlnbm1lbnRfaWNvbl8ke3Jlc291cmNlSWR9YH0gY29sb3I9JyMwMDAnLz5cbiAgICAgIGFsaWduQnV0dG9uVGV4dCA9ICdBbGlnbm1lbnQgaXMgSW52YWxpZCdcbiAgICB9XG5cbiAgICBpZiAoc2V0V29yZEFsaWduZXJTdGF0dXMgJiYgcmVzb3VyY2VJZCAhPT0gJ09SSUdJTkFMX1NPVVJDRScpIHtcbiAgICAgIG5ld0l0ZW1zLnB1c2goXG4gICAgICAgIDxJY29uQnV0dG9uXG4gICAgICAgICAgaWQ9e2BhbGlnbm1lbnRfaWNvbl8ke3Jlc291cmNlSWR9YH1cbiAgICAgICAgICBrZXk9J2NoZWNraW5nLWJ1dHRvbidcbiAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVBbGlnbkJ1dHRvbkNsaWNrfVxuICAgICAgICAgIHRpdGxlPXthbGlnbkJ1dHRvblRleHR9XG4gICAgICAgICAgYXJpYS1sYWJlbD17YWxpZ25CdXR0b25UZXh0fVxuICAgICAgICAgIHN0eWxlPXt7IGN1cnNvcjogJ3BvaW50ZXInIH19XG4gICAgICAgID5cbiAgICAgICAgICB7YWxpZ25JY29ufVxuICAgICAgICA8L0ljb25CdXR0b24+XG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0l0ZW1zXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxTZWxlY3Rpb25zQ29udGV4dFByb3ZpZGVyXG4gICAgICBzZWxlY3Rpb25zPXtzZWxlY3Rpb25zfVxuICAgICAgb25TZWxlY3Rpb25zPXtuZXdTZWxlY3Rpb25zID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ29uU2VsZWN0aW9ucycsIG5ld1NlbGVjdGlvbnMpXG4gICAgICB9fVxuICAgICAgcXVvdGU9e3NlbGVjdGVkUXVvdGU/LnF1b3RlfVxuICAgICAgb2NjdXJyZW5jZT17Zml4T2NjdXJyZW5jZShzZWxlY3RlZFF1b3RlPy5vY2N1cnJlbmNlKX1cbiAgICAgIHZlcnNlT2JqZWN0c01hcD17dmVyc2VPYmplY3RzTWFwfVxuICAgID5cbiAgICAgIDxDYXJkXG4gICAgICAgIGlkPXtgc2NyaXB0dXJlX2NhcmRfJHtjYXJkTnVtfWB9XG4gICAgICAgIHRpdGxlPXtzY3JpcHR1cmVMYWJlbH1cbiAgICAgICAgc2V0dGluZ3NUaXRsZT17c2NyaXB0dXJlVGl0bGUgKyAnIFNldHRpbmdzJ31cbiAgICAgICAgaXRlbXM9e2l0ZW1zfVxuICAgICAgICBjbGFzc2VzPXtjbGFzc2VzfVxuICAgICAgICBoZWFkZXJzPXtoZWFkZXJzfVxuICAgICAgICBmaWx0ZXJzPXtmaWx0ZXJzfVxuICAgICAgICBmb250U2l6ZT17Zm9udFNpemV9XG4gICAgICAgIGl0ZW1JbmRleD17aXRlbUluZGV4fVxuICAgICAgICBzZXRGaWx0ZXJzPXtzZXRGaWx0ZXJzfVxuICAgICAgICBzZXRGb250U2l6ZT17c2V0Rm9udFNpemV9XG4gICAgICAgIHNldEl0ZW1JbmRleD17c2V0SXRlbUluZGV4fVxuICAgICAgICBtYXJrZG93blZpZXc9e21hcmtkb3duVmlld31cbiAgICAgICAgc2V0TWFya2Rvd25WaWV3PXtzZXRNYXJrZG93blZpZXd9XG4gICAgICAgIGdldEN1c3RvbUNvbXBvbmVudD17Z2V0U2NyaXB0dXJlU2VsZWN0b3J9XG4gICAgICAgIGhpZGVNYXJrZG93blRvZ2dsZVxuICAgICAgICBvbk1lbnVDbG9zZT17b25NZW51Q2xvc2V9XG4gICAgICAgIG9uTWluaW1pemU9e29uTWluaW1pemUgPyAoKSA9PiBvbk1pbmltaXplKGlkLCBzY3JpcHR1cmVUaXRsZSkgOiBudWxsfVxuICAgICAgICBlZGl0YWJsZT17ZW5hYmxlRWRpdCB8fCBlbmFibGVBbGlnbm1lbnR9XG4gICAgICAgIHNhdmVkPXtzdGFydFNhdmUgfHwgIWhhdmVVbnNhdmVkQ2hhbmdlc31cbiAgICAgICAgb25TYXZlRWRpdD17KCkgPT4gc2V0U3RhdGUoeyBzYXZlQ2xpY2tlZDogdHJ1ZSB9KX1cbiAgICAgICAgb25SZW5kZXJUb29sYmFyPXtvblJlbmRlclRvb2xiYXJ9XG4gICAgICA+XG4gICAgICAgIDxkaXYgaWQ9XCJzY3JpcHR1cmUtcGFuZS1saXN0XCI+XG4gICAgICAgICAge3JlbmRlcmVkU2NyaXB0dXJlUGFuZXN9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9DYXJkPlxuICAgICAgPFZlcnNlU2VsZWN0b3JQb3B1cFxuICAgICAgICByZXNvdXJjZUlkPXtyZXNvdXJjZUlkfVxuICAgICAgICBvcGVuPXtzaG93QWxpZ25tZW50UG9wdXB9XG4gICAgICAgIG9uQ2xvc2U9eygpID0+IHNldFN0YXRlKHsgc2hvd0FsaWdubWVudFBvcHVwOiBmYWxzZSB9KX1cbiAgICAgICAgdmVyc2VzRm9yUmVmPXt2ZXJzZXNGb3JSZWZ9XG4gICAgICAgIHZlcnNlc0FsaWdubWVudFN0YXR1cz17dmVyc2VzQWxpZ25tZW50U3RhdHVzfVxuICAgICAgICBvblZlcnNlU2VsZWN0PXsodmVyc2UpID0+IHNldFN0YXRlKHtcbiAgICAgICAgICB2ZXJzZVNlbGVjdGVkRm9yQWxpZ25tZW50OiB2ZXJzZSxcbiAgICAgICAgICBzaG93QWxpZ25tZW50UG9wdXA6IGZhbHNlXG4gICAgICAgIH0pfVxuICAgICAgLz5cbiAgICA8L1NlbGVjdGlvbnNDb250ZXh0UHJvdmlkZXI+XG4gIClcbn1cblxuU2NyaXB0dXJlQ2FyZC5wcm9wVHlwZXMgPSB7XG4gIC8qKiByZXBvIGJyYW5jaCBvciB0YWcgc3VjaCBhcyBtYXN0ZXIgKi9cbiAgYXBwUmVmOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIC8qKiBhdXRoZW50aWNhdGlvbiBpbmZvICovXG4gIGF1dGhlbnRpY2F0aW9uOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKiogaW5kZXggZm9yIGN1cnJlbnQgYm9vayAoZS5nLiAnMDEnIGZvciAnZ2VuJykqL1xuICBib29rSW5kZXg6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKiBzY3JpcHR1cmUgY2FyZCBudW1iZXIgKDAgdG8gMiBmb3IgZXhhbXBsZSkgKi9cbiAgY2FyZE51bTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICAvKiogQ1NTIGNsYXNzZXMgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcbiAgLyoqIGlmIHRydWUgdGhlbiB3b3JkIGRhdGEgaG92ZXIgaXMgc2hvd24gKi9cbiAgZGlzYWJsZVdvcmRQb3BvdmVyOiBQcm9wVHlwZXMuYm9vbCxcbiAgLyoqIGdldCBsYW5ndWFnZSBkZXRhaWxzICovXG4gIGdldExhbmd1YWdlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAvKiogZnVuY3Rpb24gdG8gZ2V0IGxhdGVzdCBsZXhpY29uIGRhdGEgKi9cbiAgZ2V0TGV4aWNvbkRhdGE6IFByb3BUeXBlcy5mdW5jLFxuICAvKiogb3B0aW9uYWwgdXJsIGZvciBncmVlayByZXBvICovXG4gIGdyZWVrUmVwb1VybDogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqIG9wdGlvbmFsIHVybCBmb3IgaGVicmV3IHJlcG8gKi9cbiAgaGVicmV3UmVwb1VybDogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqIG9wdGlvbmFsIGh0dHAgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIGZldGNoaW5nIHJlc291cmNlcywgZGVmYXVsdCBpcyAwICh2ZXJ5IGxvbmcgd2FpdCkgKi9cbiAgaHR0cENvbmZpZzogUHJvcFR5cGVzLm9iamVjdCxcbiAgLyoqIGh0bWwgaWRlbnRpZmllciB0byB1c2UgZm9yIGNhcmQgKi9cbiAgaWQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKiBtZXRob2QgdG8gZGV0ZXJtaW5lIGlmIE5UIG9yIE9UICovXG4gIGlzTlQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIC8qKiB1c2VyLW5hbWUgKi9cbiAgbG9nZ2VkSW5Vc2VyOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKiogZnVuY3Rpb24gdG8gbWluaW1pemUgdGhlIGNhcmQgKG9wdGlvbmFsKSAqL1xuICBvbk1pbmltaXplOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqIG9wdGlvbmFsIGNhbGxiYWNrIGlmIGVycm9yIGxvYWRpbmcgcmVzb3VyY2UsIHBhcmFtZXRlciByZXR1cm5lZCBhcmU6XG4gICAqICAgICh7c3RyaW5nfSBlcnJvck1lc3NhZ2UsIHtib29sZWFufSBpc0FjY2Vzc0Vycm9yLCB7b2JqZWN0fSByZXNvdXJjZVN0YXR1cylcbiAgICogICAgICAtIGlzQWNjZXNzRXJyb3IgLSBpcyB0cnVlIGlmIHRoaXMgd2FzIGFuIGVycm9yIHRyeWluZyB0byBhY2Nlc3MgZmlsZVxuICAgKiAgICAgIC0gcmVzb3VyY2VTdGF0dXMgLSBpcyBvYmplY3QgY29udGFpbmluZyBkZXRhaWxzIGFib3V0IHByb2JsZW1zIGZldGNoaW5nIHJlc291cmNlICovXG4gIG9uUmVzb3VyY2VFcnJvcjogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKiB0aGUgb3JpZ2luYWwgc2NyaXB0dXJlIGJvb2tPYmplY3RzIGZvciBjdXJyZW50IGJvb2sgKi9cbiAgb3JpZ2luYWxTY3JpcHR1cmVCb29rT2JqZWN0czogUHJvcFR5cGVzLm9iamVjdCxcbiAgcmVmZXJlbmNlOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIC8qKiBwcm9qZWN0SWQgKGJvb2tJRCkgdG8gdXNlICovXG4gICAgcHJvamVjdElkOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgLyoqIGN1cnJlbnQgY2hhcHRlciBudW1iZXIgKi9cbiAgICBjaGFwdGVyOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSkuaXNSZXF1aXJlZCxcbiAgICAvKiogY3VycmVudCB2ZXJzZSBudW1iZXIgKi9cbiAgICB2ZXJzZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLmlzUmVxdWlyZWQsXG4gIH0pLFxuICAvKiogcmVzb3VyY2Ugb2JqZWN0ICovXG4gIHJlc291cmNlOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIC8qKiByZXNvdXJjZSBsYW5ndWFnZSB0byB1c2UgKi9cbiAgICBsYW5ndWFnZUlkOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgLyoqIHJlcG8gb3duZXIgc3VjaCBhcyB1bmZvbGRpbmdXb3JkICovXG4gICAgb3duZXI6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICAvKiogcmVzb3VyY2VJZCB0byB1c2UgKGUuZy4gdWdudCkgKi9cbiAgICByZXNvdXJjZUlkOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgLyoqIHJlcG8gb3duZXIgZm9yIG9yaWdpbmFsIGxhbmd1YWdlcyBzdWNoIGFzIHVuZm9sZGluZ1dvcmQgKi9cbiAgICBvcmlnaW5hbExhbmd1YWdlT3duZXI6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgfSksXG4gIC8qKiByZXNvdXJjZUxpbmsgKi9cbiAgcmVzb3VyY2VMaW5rOiBQcm9wVHlwZXMuYW55LFxuICAvKipUaGlzIGlzIGN1cnJlbnRseSBzZWxlY3RlZCBxdW90ZSAqL1xuICBzZWxlY3RlZFF1b3RlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKiogc2VydmVyIChlLmcuICdodHRwczovL2dpdC5kb29yNDMub3JnJykgKi9cbiAgc2VydmVyOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIC8qKiBmdW5jdGlvbiB0byBzZXQgc3RhdGUgaW4gYXBwIHRoYXQgdGhlcmUgYXJlIHVuc2F2ZWQgY2hhbmdlcyAqL1xuICBzZXRTYXZlZENoYW5nZXM6IFByb3BUeXBlcy5mdW5jLFxuICAvKiogY2FsbGJhY2sgdG8gdXBkYXRlIHdvcmQgYWxpZ25lciBzdGF0ZSAqL1xuICBzZXRXb3JkQWxpZ25lclN0YXR1czogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKiB0aXRsZSBmb3Igc2NyaXB0dXJlIGNhcmQgKi9cbiAgdGl0bGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgLyoqIG9wdGlvbmFsIGZ1bmN0aW9uIGZvciBsb2NhbGl6YXRpb24gKi9cbiAgdHJhbnNsYXRlOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqIHVzZSBtZXRob2QgZm9yIHVzaW5nIGxvY2FsIHN0b3JhZ2Ugc3BlY2lmaWMgZm9yIHVzZXIgKi9cbiAgdXNlVXNlckxvY2FsU3RvcmFnZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbn1cbiJdfQ==