@talrace/ngx-noder 0.0.8 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/esm2022/lib/apart-components/add-link-dialog/add-link-dialog.component.mjs +15 -9
  2. package/esm2022/lib/apart-components/editor-toolbar/components/base-toolbar.component.mjs +8 -2
  3. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font/font.component.mjs +2 -2
  4. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font-size/font-size.component.mjs +3 -3
  5. package/esm2022/lib/apart-components/editor-toolbar/shared/toolbar-styles.helper.mjs +1 -8
  6. package/esm2022/lib/editor/components/edges/edge.component.mjs +2 -2
  7. package/esm2022/lib/editor/components/edges/edges.mjs +21 -2
  8. package/esm2022/lib/editor/components/image/input-handler/image-input.handler.mjs +18 -1
  9. package/esm2022/lib/editor/components/shared/services/custom-content.service.mjs +22 -56
  10. package/esm2022/lib/editor/components/table/components/table-cell.component.mjs +6 -6
  11. package/esm2022/lib/editor/components/table/components/table.component.mjs +13 -4
  12. package/esm2022/lib/editor/components/table/models/cell-data.model.mjs +3 -4
  13. package/esm2022/lib/editor/components/table/selection/table-selection.mjs +15 -5
  14. package/esm2022/lib/editor/content/constants/editor.const.mjs +9 -1
  15. package/esm2022/lib/editor/content/display-data/display-data.mjs +839 -0
  16. package/esm2022/lib/editor/content/display-data/general-properties.model.mjs +1 -1
  17. package/esm2022/lib/editor/content/display-data/models/paragraph-info.model.mjs +8 -0
  18. package/esm2022/lib/editor/content/display-data/paragraph.mjs +5 -1
  19. package/esm2022/lib/editor/content/display-data/text-line-info.mjs +2 -1
  20. package/esm2022/lib/editor/content/display-data/toolbar-styles.interface.mjs +1 -1
  21. package/esm2022/lib/editor/content/helpers/content-style.helper.mjs +12 -30
  22. package/esm2022/lib/editor/content/helpers/display-token.helper.mjs +62 -0
  23. package/esm2022/lib/editor/display/layers/cursor.layer.mjs +9 -8
  24. package/esm2022/lib/editor/display/layers/pages.layer.mjs +5 -5
  25. package/esm2022/lib/editor/display/layers/print.text.layer.mjs +2 -2
  26. package/esm2022/lib/editor/display/layers/selection.layer.mjs +15 -9
  27. package/esm2022/lib/editor/display/layers/text.layer.mjs +25 -27
  28. package/esm2022/lib/editor/display/print/print.renderer.mjs +8 -8
  29. package/esm2022/lib/editor/display/renderer.mjs +10 -10
  30. package/esm2022/lib/editor/display/rendering.helper.mjs +2 -4
  31. package/esm2022/lib/editor/display/virtual.renderer.mjs +5 -5
  32. package/esm2022/lib/editor/execution/edit.session.mjs +199 -755
  33. package/esm2022/lib/editor/execution/editor.mjs +116 -75
  34. package/esm2022/lib/editor/execution/helpers/format-style.helper.mjs +1 -33
  35. package/esm2022/lib/editor/execution/helpers/image.helpet.mjs +12 -0
  36. package/esm2022/lib/editor/execution/helpers/paragraph.helper.mjs +11 -3
  37. package/esm2022/lib/editor/execution/regulator.service.mjs +28 -20
  38. package/esm2022/lib/editor/gadgets/numbering/numbering-paragraph-style.model.mjs +13 -0
  39. package/esm2022/lib/editor/gadgets/numbering/numbering.helper.mjs +77 -10
  40. package/esm2022/lib/editor/gadgets/search/search.mjs +6 -6
  41. package/esm2022/lib/editor/interaction/editor.service.mjs +27 -6
  42. package/esm2022/lib/editor/interaction/input.handler.mjs +8 -5
  43. package/esm2022/lib/editor/interaction/mouse.handler.mjs +2 -1
  44. package/esm2022/lib/editor/operations/helpers/format-operations.helper.mjs +32 -2
  45. package/esm2022/lib/editor/operations/helpers/link-operations.helper.mjs +47 -12
  46. package/esm2022/lib/editor/operations/operations-helper.helper.mjs +13 -14
  47. package/esm2022/lib/editor/operations/save-commands.helper.mjs +2 -2
  48. package/esm2022/lib/editor/positioning/content.helper.mjs +15 -15
  49. package/esm2022/lib/editor/positioning/line-width.helper.mjs +5 -5
  50. package/esm2022/lib/editor/positioning/position.helper.mjs +34 -32
  51. package/esm2022/lib/editor/positioning/selection.mjs +42 -32
  52. package/esm2022/lib/editor/revision.helper.mjs +4 -3
  53. package/fesm2022/talrace-ngx-noder.mjs +3765 -3548
  54. package/fesm2022/talrace-ngx-noder.mjs.map +1 -1
  55. package/lib/apart-components/add-link-dialog/add-link-dialog.component.d.ts +0 -1
  56. package/lib/apart-components/editor-toolbar/shared/toolbar-styles.helper.d.ts +0 -2
  57. package/lib/editor/components/image/input-handler/image-input.handler.d.ts +3 -0
  58. package/lib/editor/components/shared/services/custom-content.service.d.ts +3 -5
  59. package/lib/editor/components/table/components/table-cell.component.d.ts +1 -1
  60. package/lib/editor/components/table/components/table.component.d.ts +1 -0
  61. package/lib/editor/components/table/models/cell-data.model.d.ts +1 -1
  62. package/lib/editor/components/table/selection/table-selection.d.ts +2 -0
  63. package/lib/editor/content/constants/editor.const.d.ts +2 -0
  64. package/lib/editor/content/display-data/display-data.d.ts +103 -0
  65. package/lib/editor/content/display-data/general-properties.model.d.ts +5 -0
  66. package/lib/editor/content/display-data/models/paragraph-info.model.d.ts +9 -0
  67. package/lib/editor/content/display-data/paragraph.d.ts +1 -0
  68. package/lib/editor/content/display-data/text-line-info.d.ts +1 -0
  69. package/lib/editor/content/display-data/toolbar-styles.interface.d.ts +1 -1
  70. package/lib/editor/content/helpers/content-style.helper.d.ts +1 -2
  71. package/lib/editor/content/helpers/display-token.helper.d.ts +6 -0
  72. package/lib/editor/display/layers/text.layer.d.ts +1 -2
  73. package/lib/editor/display/print/print.renderer.d.ts +0 -2
  74. package/lib/editor/execution/edit.session.d.ts +11 -59
  75. package/lib/editor/execution/editor.d.ts +9 -6
  76. package/lib/editor/execution/helpers/format-style.helper.d.ts +0 -2
  77. package/lib/editor/execution/helpers/image.helpet.d.ts +4 -0
  78. package/lib/editor/execution/regulator.service.d.ts +1 -1
  79. package/lib/editor/gadgets/numbering/numbering-paragraph-style.model.d.ts +6 -0
  80. package/lib/editor/gadgets/numbering/numbering.helper.d.ts +10 -3
  81. package/lib/editor/interaction/editor.service.d.ts +12 -3
  82. package/lib/editor/operations/helpers/link-operations.helper.d.ts +5 -3
  83. package/lib/editor/positioning/content.helper.d.ts +6 -5
  84. package/lib/editor/positioning/position.helper.d.ts +3 -3
  85. package/lib/editor/positioning/selection.d.ts +3 -0
  86. package/package.json +1 -1
  87. package/src/_ngx-noder.theme.scss +31 -2
  88. package/esm2022/lib/editor/content/display-data/document.mjs +0 -134
  89. package/esm2022/lib/editor/content/display-data/pages.wrap.mjs +0 -226
  90. package/esm2022/lib/editor/execution/helpers/delta.helper.mjs +0 -18
  91. package/lib/editor/content/display-data/document.d.ts +0 -56
  92. package/lib/editor/content/display-data/pages.wrap.d.ts +0 -42
  93. package/lib/editor/execution/helpers/delta.helper.d.ts +0 -6
@@ -1,158 +1,49 @@
1
- import { Alignment } from '../positioning/alignments.const';
2
1
  import { BreakHelper } from '../gadgets/page-break/break.helper';
3
2
  import { BreakTypes } from '../gadgets/page-break/break-types.enum';
4
3
  import { ContentHelper } from '../positioning/content.helper';
5
- import { ContentStyleHelper } from '../content/helpers/content-style.helper';
6
4
  import { CursorParagraph } from '../positioning/cursor-paragraph';
7
5
  import { CUSTOM_ELEMENT_MARKER } from '../components/shared/custom-content-markers.const';
8
6
  import { CustomComponentHelper } from '../components/shared/custom-component.hepler';
9
- import { DEFAULT_BACKGROUND_COLOR, DEFAULT_FONT_COLOR, DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE, DEFAULT_PARAGRAPH_STYLE, HYPERLINK_HEADING_STYLE_ID, NEW_LINE_MARKUP } from '../content/constants/editor.const';
10
- import { DisplayToken } from '../content/display-data/display-token.model';
11
- import { DisplayValue } from '../content/constants/display-values.const';
12
- import { DocxModel } from '../../models/generated/docx.model';
13
- import { Edges } from '../components/edges/edges';
7
+ import { HYPERLINK_FONT_COLOR, HYPERLINK_HEADING_STYLE_ID, NEW_LINE_MARKUP } from '../content/constants/editor.const';
14
8
  import { ElementModel } from '../../models/generated/element.model';
15
- import { EventEmitting } from '../core/event-emitting';
16
- import { FontMetrics } from '../gadgets/font-metrics/font-metrics.helper';
17
9
  import { FormatStyleHelper } from './helpers/format-style.helper';
18
- import { ImageDataModel } from '../../models/generated/image-data.model';
19
- import { IndentModel } from '../content/display-data/indent.model';
20
10
  import { InsertElementModel } from '../../models/generated/insert-element.model';
21
- import { LineInfoModel } from '../content/display-data/line-info.model';
22
11
  import { NoderImageComponent } from '../components/image/components/image.component';
23
12
  import { NoderTabComponent } from '../components/tab/tab.component';
24
13
  import { NoderTableComponent } from '../components/table/components/table.component';
25
14
  import { NumberingHelper } from '../gadgets/numbering/numbering.helper';
26
- import { NumberingMarkerType } from '../gadgets/numbering/numbering-marker-type.enum';
15
+ import { NumberingParagraphStyleModel } from '../gadgets/numbering/numbering-paragraph-style.model';
27
16
  import { OperationsHelper } from '../operations/operations-helper.helper';
28
- import { PagesWrap } from '../content/display-data/pages.wrap';
29
- import { ParagraphHelper } from './helpers/paragraph.helper';
30
17
  import { ParagraphStyleHelper } from './helpers/paragraph-style.helper';
31
18
  import { Range } from '../positioning/range';
32
- import { TabHelper } from '../components/tab/tab.helper';
33
19
  import { TextStyleModel } from '../../models/generated/text-style.model';
34
20
  import { UnicodeHelper } from '../gadgets/unicode/unicode.helper';
35
- export class EditSession extends EventEmitting {
21
+ export class EditSession {
36
22
  get scrollTop() {
37
23
  return this.scrollBar?.scrollTop ?? 0; // only main session is scrollable
38
24
  }
39
- get stylesMap() {
40
- return this._stylesMap;
41
- }
42
- set contentWidth(value) {
43
- if (!value) {
44
- return;
45
- }
46
- this._contentWidth = value;
47
- this.updateWrapData(0, this.document.lines.length - 1);
48
- }
49
- get contentWidth() {
50
- return this._contentWidth;
51
- }
52
- constructor(document, sessionId, customContentService, model, selection, generalProperties, componentService, scrollBar) {
53
- super();
54
- this.document = document;
25
+ constructor(displayData, sessionId, customContentService, model, selection, generalProperties, editorService, customComponents, type, scrollBar) {
26
+ this.displayData = displayData;
55
27
  this.sessionId = sessionId;
56
28
  this.customContentService = customContentService;
57
29
  this.model = model;
58
30
  this.selection = selection;
59
31
  this.generalProperties = generalProperties;
32
+ this.editorService = editorService;
33
+ this.customComponents = customComponents;
34
+ this.type = type;
60
35
  this.scrollBar = scrollBar;
61
36
  this.tokenRe = new RegExp('^[' + UnicodeHelper.wordChars + '\\$_]+', 'g');
62
37
  this.nonTokenRe = new RegExp('^(?:[^' + UnicodeHelper.wordChars + '\\$_]|\\s])+', 'g');
63
- this.wrapData = [[]]; // Wrap indexes for document rows
64
- this.wrapParagraphLine = []; // line numbers that begin the paragraphs
65
- this.wrapParagraphIndex = []; // symbol indexes that begin the paragraphs
66
- this._stylesMap = {
67
- fontFamily: DEFAULT_FONT_FAMILY,
68
- fontSize: DEFAULT_FONT_SIZE,
69
- fontColor: DEFAULT_FONT_COLOR,
70
- alignment: Alignment.left,
71
- backgroundColor: DEFAULT_BACKGROUND_COLOR,
72
- highlightColor: DEFAULT_BACKGROUND_COLOR
73
- };
74
- const edges = model instanceof DocxModel
75
- ? new Edges(componentService, model.headers, model.footers, document.pageMargin, document.pageWidth, sessionId, generalProperties)
76
- : null;
77
- this.customComponents = { images: [], tables: [], tabs: [], customElements: [], edges: edges };
78
- this.setDocument();
79
38
  }
80
39
  destroy() {
81
- this.pagesWrap.destroy();
40
+ this.displayData.destroy();
82
41
  }
83
42
  getRowLength(row) {
84
- if (!this.wrapData[row]) {
43
+ if (!this.displayData.paragraphs[row].nextLineIndexes) {
85
44
  return 1;
86
45
  }
87
- return this.wrapData[row].length + 1;
88
- }
89
- updateWrapParagraphIndex(first) {
90
- const count = this.document.lines.length;
91
- if (first === 0) {
92
- this.wrapParagraphIndex[first] = 0;
93
- first++;
94
- }
95
- for (let i = first; i < count; i++) {
96
- this.wrapParagraphIndex[i] = this.wrapParagraphIndex[i - 1] + this.document.lines[i - 1].length + 1;
97
- }
98
- this.wrapParagraphIndex.splice(count);
99
- }
100
- updateWrapParagraphLine(first) {
101
- const count = this.document.lines.length;
102
- if (first === 0) {
103
- this.wrapParagraphLine[first] = 0;
104
- }
105
- else {
106
- this.wrapParagraphLine[first] = this.wrapParagraphLine[first - 1] + this.wrapData[first - 1].length + 1;
107
- }
108
- for (let i = first + 1; i < count; i++) {
109
- this.wrapParagraphLine[i] = this.wrapParagraphLine[i - 1] + this.wrapData[i - 1].length + 1;
110
- }
111
- this.wrapParagraphLine.splice(count);
112
- }
113
- updateParagraphNumberingData(index) {
114
- if (this.pagesWrap.paragraphs[index].numberingData.numberingId !== this.model.paragraphs[index].paragraphStyle.numberingId) {
115
- this.pagesWrap.paragraphs[index].numberingData = NumberingHelper.createDataModel(this.generalProperties.numberings, this.model.paragraphs, index);
116
- }
117
- if (this.pagesWrap.paragraphs[index].numberingData.numberingId !== null) {
118
- const paragraphFormat = FormatStyleHelper.getFormatAtIndex(this.model.formats, this.model.paragraphs[index].insertIndex);
119
- NumberingHelper.updateMarkerData(this.generalProperties, this.pagesWrap.paragraphs[index], paragraphFormat.textStyle, this.model.paragraphs[index].paragraphStyle);
120
- }
121
- }
122
- updateWrapData(firstParagraph, lastParagraph) {
123
- this.updateWrapParagraphIndex(firstParagraph);
124
- let indexOfParagraphAfterPageBreak = this.pagesWrap.paragraphs[firstParagraph - 1]?.isEndedByPageBreak ? firstParagraph : -1;
125
- let firstUsedTabIndex = this.model.tabs.findIndex(x => x.insertIndex >= this.wrapParagraphIndex[firstParagraph]);
126
- for (let i = firstParagraph; i <= lastParagraph; i++) {
127
- this.pagesWrap.tabTokens = [];
128
- const currentLine = this.document.getLine(this.document.lines, i);
129
- const isNextLineExists = this.document.lines.length > i + 1;
130
- const { splits, rowInfos } = this.getSplits(this.model, currentLine, this.wrapParagraphIndex[i], i, isNextLineExists);
131
- this.wrapData[i] = splits;
132
- if (indexOfParagraphAfterPageBreak === i) {
133
- rowInfos[0].isAfterPageBreak = true;
134
- }
135
- indexOfParagraphAfterPageBreak = rowInfos[rowInfos.length - 1].isEndedByPageBreak ? i + 1 : -1;
136
- this.pagesWrap.set(i, rowInfos, this.generalProperties.numberings, this.model.paragraphs);
137
- this.updateParagraphNumberingData(i);
138
- this.updateWrapParagraphIndex(firstParagraph);
139
- firstUsedTabIndex = this.updateParagraphTabs(firstUsedTabIndex, i, currentLine.length);
140
- }
141
- this.pagesWrap.paragraphs[lastParagraph + 1]?.setIsAfterPageBreak(indexOfParagraphAfterPageBreak > -1);
142
- const count = this.document.lines.length;
143
- this.pagesWrap.paragraphs.splice(count);
144
- this.wrapData.splice(count);
145
- this.updateWrapParagraphLine(firstParagraph);
146
- this.pagesWrap.processParagraphsProperties(firstParagraph, this.wrapParagraphIndex);
147
- }
148
- /**
149
- * Given a string, returns an array of the display characters, including tabs and spaces.
150
- */
151
- getDisplayTokens(model, str, startIndex) {
152
- if (!str.length) {
153
- return this.getEmptyLineTokens(startIndex);
154
- }
155
- return this.getFilledLineTokens(startIndex, str, model);
46
+ return this.displayData.paragraphs[row].nextLineIndexes.length + 1;
156
47
  }
157
48
  getRowCacheIndex(cacheArray, value) {
158
49
  let start = 0;
@@ -192,7 +83,7 @@ export class EditSession extends EventEmitting {
192
83
  * Given a starting row and column, this method returns the `Range` of the first word boundary it finds.
193
84
  */
194
85
  getWordRange(row, column) {
195
- const line = this.document.getLine(this.document.lines, row);
86
+ const line = this.displayData.getParagraphContent(row);
196
87
  let inToken = false;
197
88
  if (column > 0) {
198
89
  inToken = !!line.charAt(column - 1).match(this.tokenRe);
@@ -224,152 +115,160 @@ export class EditSession extends EventEmitting {
224
115
  return new Range(new CursorParagraph(row, start), new CursorParagraph(row, end));
225
116
  }
226
117
  getDisplayLine(row, endColumn, startColumn) {
227
- const line = this.document.getLine(this.document.lines, row);
228
- return line.substring(startColumn || 0, endColumn || line.length);
118
+ const paragraphContent = this.displayData.getParagraphContent(row);
119
+ return paragraphContent.substring(startColumn || 0, endColumn || paragraphContent.length);
229
120
  }
230
121
  removeByDocumentIndexes(startIndex, endIndex) {
231
- const startParagraphPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex);
232
- const endParagraphPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, endIndex);
122
+ const startParagraphPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, startIndex);
123
+ const endParagraphPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, endIndex);
233
124
  this.remove(new Range(startParagraphPosition, endParagraphPosition));
234
125
  }
235
126
  insertTextByDocumentIndex(index, text, style) {
236
- const paragraphPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, index);
127
+ const paragraphPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, index);
237
128
  return this.insertText(paragraphPosition, text, style);
238
129
  }
239
130
  insertElementByDocumentIndex(insertElement) {
240
- const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, insertElement.element.insertIndex);
131
+ const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, insertElement.element.insertIndex);
241
132
  return this.insertElement(elementPosition, insertElement.element);
242
133
  }
243
134
  insertBreakByDocumentIndex(insertElement) {
244
- const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, insertElement.insertIndex);
135
+ const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, insertElement.insertIndex);
245
136
  return this.insertBreak(elementPosition, insertElement.breakType);
246
137
  }
247
138
  insertTabByDocumentIndex(insertElement) {
248
- const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, insertElement.insertIndex);
139
+ const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, insertElement.insertIndex);
249
140
  return this.insertTab(elementPosition);
250
141
  }
251
142
  insertImageByDocumentIndex(insertElement) {
252
- const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, insertElement.insertIndex);
143
+ const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, insertElement.insertIndex);
253
144
  return this.insertImage(elementPosition, insertElement.imageData);
254
145
  }
255
146
  insertTableByDocumentIndex(insertElement) {
256
- const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, insertElement.insertIndex);
147
+ const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, insertElement.insertIndex);
257
148
  return this.insertTable(elementPosition, insertElement);
258
149
  }
150
+ insertLinkByDocumentIndex(insertElement) {
151
+ const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, insertElement.insertIndex);
152
+ return this.insertLink(elementPosition, insertElement.linkDataModel);
153
+ }
259
154
  insertParagraphByDocumentIndex(insertElement) {
260
- const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, insertElement.insertIndex);
155
+ const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, insertElement.insertIndex);
261
156
  return this.insertParagraph(elementPosition, insertElement);
262
157
  }
263
158
  applyTextStyle(startIndex, endIndex, textStyle) {
264
- this.cursorStyle = new TextStyleModel(textStyle);
265
- const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
266
- const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, endIndex).row;
159
+ const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, startIndex).row;
160
+ const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, endIndex).row;
267
161
  OperationsHelper.applyTextStyle(this.model, startIndex, endIndex, textStyle);
268
- this.updateWrapData(startParagraph, endParagraph);
269
- this.setStyle(textStyle);
162
+ this.displayData.updateNextLineIndexes(startParagraph, endParagraph);
163
+ this.setTextStyle(textStyle);
270
164
  }
271
165
  applyParagraphStyle(startIndex, endIndex, paragraphStyle) {
272
- const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
273
- const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, endIndex).row;
166
+ const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, startIndex).row;
167
+ const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, endIndex).row;
274
168
  OperationsHelper.applyParagraphStyle(this.model, startIndex, endIndex, paragraphStyle);
275
- this.updateWrapData(startParagraph, endParagraph);
276
- this.setStyle(paragraphStyle);
169
+ this.displayData.updateNextLineIndexes(startParagraph, endParagraph);
170
+ this.applyToolbarStyles();
277
171
  }
278
172
  applyElementStyle(model) {
279
173
  OperationsHelper.applyElementStyle(this.model, model);
280
174
  const imageComponentRef = this.customComponents.customElements.find(x => x.instance.insertIndex === model.insertIndex);
281
175
  imageComponentRef.instance.initialize();
282
- const paragraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, model.insertIndex).row;
283
- this.updateWrapData(paragraph, paragraph);
176
+ const paragraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, model.insertIndex).row;
177
+ this.displayData.updateNextLineIndexes(paragraph, paragraph);
284
178
  }
285
179
  addNumbering(levels, startIndex, endIndex) {
286
- const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
287
- const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, endIndex).row;
180
+ const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, startIndex).row;
181
+ const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, endIndex).row;
288
182
  OperationsHelper.addNumbering(this.model, this.generalProperties.numberings, startIndex, endIndex, levels);
183
+ this.generalProperties.numberingInfo = {};
184
+ this.displayData.updateNextLineIndexes(startParagraph, endParagraph);
289
185
  for (let i = startParagraph; i <= endParagraph; i++) {
290
- if (this.pagesWrap.paragraphs[i].numberingData.numberingId !== null) {
291
- this.updateNumberingsDataOnChange(endParagraph);
186
+ if (this.displayData.getParagraphSettings(i).numberingData.numberingId !== null) {
187
+ this.displayData.updateNumberingsDataOnChange(endParagraph + 1);
292
188
  break;
293
189
  }
294
190
  }
295
- this.updateWrapData(startParagraph, endParagraph);
296
- this.setNumberingStyle(startIndex, endIndex);
191
+ this.applyToolbarStyles();
297
192
  }
298
193
  removeNumberings(startIndex, endIndex) {
299
- const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
300
- const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, endIndex).row;
194
+ const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, startIndex).row;
195
+ const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, endIndex).row;
301
196
  OperationsHelper.removeNumberings(this.model, this.generalProperties.numberings, startIndex, endIndex);
302
- for (let i = startParagraph; i <= endParagraph; i++) {
303
- if (this.pagesWrap.paragraphs[i].numberingData.numberingId !== null) {
304
- this.updateNumberingsDataOnChange(endParagraph);
305
- break;
306
- }
307
- }
308
- this.updateWrapData(startParagraph, endParagraph);
309
- this.setNumberingStyle(startIndex, endIndex);
197
+ this.displayData.resetAllNumberingInfo(startParagraph);
198
+ this.displayData.updateNextLineIndexes(startParagraph, endParagraph);
199
+ this.displayData.updateNumberingsDataOnChange(endParagraph);
200
+ this.applyToolbarStyles();
310
201
  }
311
202
  restoreNumberings(paragraphs, numberings) {
312
203
  const startIndex = paragraphs[0].insertIndex;
313
204
  const endIndex = paragraphs[paragraphs.length - 1].insertIndex;
314
- const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
315
- const endPosition = ContentHelper.documentIndexToParagraphWithOffset(this.wrapParagraphIndex, this.document.lines, endIndex);
205
+ const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, startIndex).row;
206
+ const endPosition = ContentHelper.documentIndexToParagraphWithOffset(this.displayData.paragraphs, endIndex);
316
207
  OperationsHelper.restoreNumberings(this.model, this.generalProperties.numberings, paragraphs, numberings);
208
+ this.displayData.resetAllNumberingInfo(startParagraph);
209
+ this.displayData.updateNextLineIndexes(startParagraph, endPosition.row);
317
210
  for (const paragraph of paragraphs) {
318
211
  if (paragraph.paragraphStyle.numberingId !== null) {
319
- this.updateNumberingsDataOnChange(endPosition.row);
212
+ this.displayData.updateNumberingsDataOnChange(endPosition.row + 1);
320
213
  break;
321
214
  }
322
215
  }
323
- this.updateWrapData(startParagraph, endPosition.row);
324
216
  this.selection.placeCursor(endPosition);
325
- this.setNumberingStyle(startIndex, endIndex);
217
+ this.applyToolbarStyles();
326
218
  }
327
219
  applyImageStyle(applyImage) {
328
220
  const imageComponentRef = this.customComponents.images.find(x => x.instance.insertIndex === applyImage.insertIndex);
329
221
  imageComponentRef.instance.resize({ width: applyImage.width, height: applyImage.height });
330
222
  OperationsHelper.applyImageStyle(this.model, applyImage);
331
- const start = this.document.indexToPosition(applyImage.insertIndex, 0);
332
- this.updateWrapData(start.row, this.document.lines.length - 1);
223
+ const start = this.displayData.indexToPosition(applyImage.insertIndex, 0);
224
+ this.displayData.updateNextLineIndexes(start.row, this.displayData.paragraphs.length - 1);
333
225
  }
334
226
  restoreTextStyles(formats) {
335
227
  const startIndex = formats[0].startIndex;
336
228
  const endIndex = formats[formats.length - 1].endIndex;
337
- const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
338
- const endPosition = ContentHelper.documentIndexToParagraphWithOffset(this.wrapParagraphIndex, this.document.lines, endIndex);
229
+ const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, startIndex).row;
230
+ const endPosition = ContentHelper.documentIndexToParagraphWithOffset(this.displayData.paragraphs, endIndex);
339
231
  OperationsHelper.restoreTextStyles(this.model, formats);
340
- this.updateWrapData(startParagraph, endPosition.row);
232
+ this.displayData.updateNextLineIndexes(startParagraph, endPosition.row);
341
233
  this.selection.placeCursor(endPosition);
342
- this.processSelectionStyles();
234
+ this.applyToolbarStyles();
343
235
  }
344
236
  restoreParagraphStyles(paragraphs) {
345
237
  const startIndex = paragraphs[0].insertIndex;
346
238
  const endIndex = paragraphs[paragraphs.length - 1].insertIndex;
347
- const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
348
- const endPosition = ContentHelper.documentIndexToParagraphWithOffset(this.wrapParagraphIndex, this.document.lines, endIndex);
239
+ const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, startIndex).row;
240
+ const endPosition = ContentHelper.documentIndexToParagraphWithOffset(this.displayData.paragraphs, endIndex);
349
241
  OperationsHelper.restoreParagraphStyles(this.model, paragraphs);
350
- this.updateWrapData(startParagraph, endPosition.row);
242
+ this.displayData.updateNextLineIndexes(startParagraph, endPosition.row);
351
243
  this.selection.placeCursor(endPosition);
352
- this.processSelectionStyles();
244
+ this.applyToolbarStyles();
353
245
  }
354
246
  setTextStyle(textStyle) {
355
- this.cursorStyle = new TextStyleModel(textStyle);
356
- this.setStyle(textStyle);
247
+ const result = { ...this.editorService.styles };
248
+ for (let key of Object.keys(textStyle)) {
249
+ result[key] = textStyle[key];
250
+ }
251
+ this.editorService.styles = result;
357
252
  }
358
253
  /**
359
254
  * Removes the `range` from the document.
360
255
  * If `range` is empty, this function returns the unmodified value of `range.start`.
361
256
  */
362
257
  remove(range) {
363
- const partIndexes = ContentHelper.getSelectedPartDocumentIndexes(this.wrapParagraphIndex, range);
364
- this.document.removeRange(range);
258
+ const partIndexes = ContentHelper.getSelectedPartDocumentIndexes(this.displayData.paragraphs, range);
259
+ this.displayData.removeRange(range);
365
260
  CustomComponentHelper.applyRemovingComponents(this.customComponents.tables, partIndexes.startIndex, partIndexes.endIndex);
366
261
  CustomComponentHelper.applyRemovingComponents(this.customComponents.images, partIndexes.startIndex, partIndexes.endIndex);
367
262
  CustomComponentHelper.applyRemovingComponents(this.customComponents.customElements, partIndexes.startIndex, partIndexes.endIndex);
368
263
  CustomComponentHelper.applyRemovingComponents(this.customComponents.tabs, partIndexes.startIndex, partIndexes.endIndex);
369
264
  OperationsHelper.delete(this.model, partIndexes.startIndex, partIndexes.endIndex);
370
265
  this.selection.placeCursor(range.start);
371
- this.updateInternalDataOnDeleteText(range.start.row, range.end.row);
372
- this.processSelectionStyles();
266
+ this.displayData.resetAllNumberingInfo(range.start.row);
267
+ this.displayData.updateNextLineIndexes(range.start.row, range.start.row);
268
+ if (range.end.row - range.start.row && this.type !== 'cell') {
269
+ this.displayData.updateNumberingsDataOnChange(range.start.row + 1);
270
+ }
271
+ this.applyToolbarStyles();
373
272
  }
374
273
  replace(model) {
375
274
  this.removeByDocumentIndexes(model.delete.startIndex, model.delete.endIndex + 1);
@@ -395,117 +294,137 @@ export class EditSession extends EventEmitting {
395
294
  else if (model.insertTable) {
396
295
  endPoint = this.insertTableByDocumentIndex(model.insertTable);
397
296
  }
297
+ else if (model.insertLink) {
298
+ endPoint = this.insertLinkByDocumentIndex(model.insertLink);
299
+ }
398
300
  return endPoint;
399
301
  }
400
302
  insertText(position, text, cursorStyle) {
401
- const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
303
+ const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, position);
402
304
  if (cursorStyle) {
403
305
  OperationsHelper.insertStyledText(this.model, text, insertIndex, cursorStyle);
404
306
  }
405
307
  else {
406
308
  OperationsHelper.insertText(this.model, text, insertIndex);
407
309
  }
408
- const endPosition = this.document.insertText(position, text);
409
- this.updateInternalDataOnInsertText(position.row, endPosition.row);
310
+ const endPosition = this.displayData.insertText(position, text);
311
+ this.displayData.resetAllNumberingInfo(position.row);
312
+ this.displayData.updateNextLineIndexes(position.row, endPosition.row);
313
+ if (endPosition.row - position.row && this.type !== 'cell') {
314
+ this.displayData.updateNumberingsDataOnChange(endPosition.row + 1);
315
+ }
410
316
  this.selection.placeCursor(endPosition);
411
317
  return endPosition;
412
318
  }
413
319
  insertElement(position, element) {
414
- const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
320
+ const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, position);
415
321
  const insertElement = new InsertElementModel({ element: new ElementModel({ insertIndex, ...element }) });
416
322
  OperationsHelper.insertElement(this.model, insertElement);
417
323
  const model = this.model.elements.find(x => x.insertIndex === insertIndex);
418
324
  const type = this.customContentService.findComponentType(model.type);
419
325
  this.addComponent(this.customComponents.customElements, model, type);
420
- const endPosition = this.document.insertText(position, CUSTOM_ELEMENT_MARKER);
421
- this.updateWrapData(position.row, endPosition.row);
326
+ const endPosition = this.displayData.insertText(position, CUSTOM_ELEMENT_MARKER);
327
+ this.displayData.updateNextLineIndexes(position.row, endPosition.row);
422
328
  this.selection.placeCursor(endPosition);
423
329
  return endPosition;
424
330
  }
425
331
  insertBreak(position, breakType) {
426
- const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
332
+ const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, position);
427
333
  const isOnNewParagraph = breakType === BreakTypes.Page &&
428
334
  BreakHelper.getBreakType(this.model, CUSTOM_ELEMENT_MARKER, insertIndex - 1) !== BreakTypes.Page;
429
335
  const text = isOnNewParagraph ? `${NEW_LINE_MARKUP}${CUSTOM_ELEMENT_MARKER}` : CUSTOM_ELEMENT_MARKER;
430
336
  OperationsHelper.insertBreak(this.model, text, insertIndex, breakType);
431
- const endPosition = this.document.insertText(position, text);
432
- if (isOnNewParagraph) {
433
- this.updateInternalDataOnInsertText(position.row, endPosition.row);
337
+ const endPosition = this.displayData.insertText(position, text);
338
+ this.displayData.updateNextLineIndexes(position.row, endPosition.row);
339
+ if (isOnNewParagraph && endPosition.row - position.row) {
340
+ this.displayData.updateNumberingsDataOnChange(endPosition.row);
434
341
  }
435
- else {
436
- this.updateWrapData(position.row, endPosition.row);
437
- }
438
- const cursorPosition = this.document.getPositionAfterBreak(endPosition, breakType);
342
+ const cursorPosition = this.displayData.getPositionAfterBreak(endPosition, breakType);
439
343
  this.selection.placeCursor(cursorPosition);
440
344
  return endPosition;
441
345
  }
442
346
  insertTab(position) {
443
- const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
347
+ const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, position);
444
348
  OperationsHelper.insertTab(this.model, insertIndex);
445
349
  const model = this.model.tabs.find(x => x.insertIndex === insertIndex);
446
350
  this.addComponent(this.customComponents.tabs, model, NoderTabComponent);
447
- const endPosition = this.document.insertText(position, CUSTOM_ELEMENT_MARKER);
448
- this.updateWrapData(position.row, position.row);
351
+ const endPosition = this.displayData.insertText(position, CUSTOM_ELEMENT_MARKER);
352
+ this.displayData.updateNextLineIndexes(position.row, position.row);
449
353
  this.selection.placeCursor(endPosition);
450
354
  return endPosition;
451
355
  }
452
356
  insertImage(position, imageData) {
453
- const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
454
- const adjustedImage = this.getImageWithAllowedSize(imageData, this.contentWidth);
455
- OperationsHelper.insertImage(this.model, insertIndex, adjustedImage);
357
+ const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, position);
358
+ OperationsHelper.insertImage(this.model, insertIndex, imageData);
456
359
  const model = this.model.images.find(x => x.insertIndex === insertIndex);
457
360
  this.addComponent(this.customComponents.images, model, NoderImageComponent);
458
- const endPosition = this.document.insertText(position, CUSTOM_ELEMENT_MARKER);
459
- this.updateWrapData(position.row, position.row);
361
+ const endPosition = this.displayData.insertText(position, CUSTOM_ELEMENT_MARKER);
362
+ this.displayData.updateNextLineIndexes(position.row, position.row);
460
363
  this.selection.placeCursor(endPosition);
461
364
  return endPosition;
462
365
  }
463
366
  insertLink(position, linkData) {
464
- const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
465
- const linkStyle = new TextStyleModel({ headingStyleId: HYPERLINK_HEADING_STYLE_ID, underline: true });
367
+ const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, position);
368
+ const linkStyle = new TextStyleModel({
369
+ headingStyleId: HYPERLINK_HEADING_STYLE_ID,
370
+ underline: true,
371
+ fontColor: HYPERLINK_FONT_COLOR
372
+ });
466
373
  OperationsHelper.insertLink(this.model, linkData.text, linkData.link, insertIndex, linkStyle);
467
- const endPosition = this.document.insertText(position, linkData.text);
468
- this.updateWrapData(position.row, position.row);
374
+ const endPosition = this.displayData.insertText(position, linkData.text);
375
+ this.displayData.updateNextLineIndexes(position.row, position.row);
469
376
  this.selection.placeCursor(endPosition);
470
377
  return endPosition;
471
378
  }
472
379
  insertTable(position, tableModel) {
473
- const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
474
- OperationsHelper.insertTable(this.model, insertIndex, tableModel, this.pagesWrap.contentWidth);
380
+ const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, position);
381
+ OperationsHelper.insertTable(this.model, insertIndex, tableModel, this.displayData.contentWidth);
475
382
  const model = this.model.tables.find(x => x.insertIndex === tableModel.insertTableIndex);
476
383
  this.addComponent(this.customComponents.tables, model, NoderTableComponent);
477
- const endPosition = this.document.insertText(position, tableModel.content);
478
- this.updateInternalDataOnInsertText(position.row, endPosition.row);
384
+ const endPosition = this.displayData.insertText(position, tableModel.content);
385
+ this.displayData.updateNextLineIndexes(position.row, endPosition.row);
386
+ if (endPosition.row - position.row) {
387
+ this.displayData.updateNumberingsDataOnChange(endPosition.row);
388
+ }
479
389
  this.selection.placeCursor(endPosition);
480
390
  return endPosition;
481
391
  }
482
392
  insertParagraph(position, paragraphModel) {
483
- const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
484
- const text = OperationsHelper.insertParagraph(this.model, insertIndex, paragraphModel, this.pagesWrap.contentWidth);
485
- const endPosition = this.document.insertText(position, text);
486
- this.updateInternalDataOnInsertText(position.row, endPosition.row);
393
+ const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, position);
394
+ const text = OperationsHelper.insertParagraph(this.model, insertIndex, paragraphModel, this.displayData.contentWidth);
395
+ const endPosition = this.displayData.insertText(position, text);
396
+ this.displayData.updateNextLineIndexes(position.row, endPosition.row);
397
+ if (endPosition.row - position.row) {
398
+ this.displayData.updateNumberingsDataOnChange(endPosition.row);
399
+ }
487
400
  let endPoint;
488
401
  if (paragraphModel.insertText) {
489
- const paragraphPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, paragraphModel.insertText.insertIndex);
490
- endPoint = this.document.insertText(paragraphPosition, text);
491
- this.updateInternalDataOnInsertText(paragraphPosition.row, endPoint.row);
402
+ const paragraphPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, paragraphModel.insertText.insertIndex);
403
+ endPoint = this.displayData.insertText(paragraphPosition, text);
404
+ this.displayData.updateNextLineIndexes(paragraphPosition.row, endPoint.row);
405
+ if (endPoint.row - paragraphPosition.row) {
406
+ this.displayData.updateNumberingsDataOnChange(endPoint.row);
407
+ }
492
408
  this.selection.placeCursor(endPoint);
493
409
  }
494
410
  else if (paragraphModel.insertImage) {
495
- const paragraphPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, paragraphModel.insertImage.insertIndex);
496
- const imageInsertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
411
+ const paragraphPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, paragraphModel.insertImage.insertIndex);
412
+ const imageInsertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, position);
497
413
  const model = this.model.images.find(x => x.insertIndex === imageInsertIndex);
498
414
  this.addComponent(this.customComponents.images, model, NoderImageComponent);
499
- endPoint = this.document.insertText(paragraphPosition, CUSTOM_ELEMENT_MARKER);
500
- this.updateWrapData(paragraphPosition.row, paragraphPosition.row);
415
+ endPoint = this.displayData.insertText(paragraphPosition, CUSTOM_ELEMENT_MARKER);
416
+ this.displayData.updateNextLineIndexes(paragraphPosition.row, paragraphPosition.row);
501
417
  this.selection.placeCursor(endPoint);
502
418
  }
503
419
  else if (paragraphModel.insertTable) {
504
- const paragraphPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, paragraphModel.insertTable.insertIndex);
420
+ const paragraphPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, paragraphModel.insertTable.insertIndex);
505
421
  const model = this.model.tables.find(x => x.insertIndex === paragraphModel.insertTable.insertTableIndex);
506
422
  this.addComponent(this.customComponents.tables, model, NoderTableComponent);
507
- endPoint = this.document.insertText(paragraphPosition, paragraphModel.insertTable.content);
508
- this.updateInternalDataOnInsertText(paragraphPosition.row, endPoint.row);
423
+ endPoint = this.displayData.insertText(paragraphPosition, paragraphModel.insertTable.content);
424
+ this.displayData.updateNextLineIndexes(paragraphPosition.row, endPoint.row);
425
+ if (endPoint.row - paragraphPosition.row) {
426
+ this.displayData.updateNumberingsDataOnChange(endPoint.row);
427
+ }
509
428
  this.selection.placeCursor(endPoint);
510
429
  }
511
430
  return endPoint;
@@ -515,7 +434,7 @@ export class EditSession extends EventEmitting {
515
434
  content: model,
516
435
  sessionId: this.sessionId,
517
436
  generalProperties: this.generalProperties,
518
- contentWidth: this.contentWidth
437
+ contentWidth: this.displayData.contentWidth
519
438
  });
520
439
  const newElementPosition = customElements.findIndex(x => x.instance.insertIndex > model.insertIndex);
521
440
  if (newElementPosition >= 0) {
@@ -525,50 +444,38 @@ export class EditSession extends EventEmitting {
525
444
  customElements.push(customElement);
526
445
  }
527
446
  }
528
- setStyle(style) {
529
- for (const key of Object.keys(style)) {
530
- this._stylesMap[key] = style[key];
531
- }
532
- this.signal('setStyles', this._stylesMap);
533
- }
534
- setStyles(styles) {
535
- for (let key of Object.keys(styles)) {
536
- if (styles[key].length === 0) {
537
- this._stylesMap[key] = ContentStyleHelper.getDefaultStyleValueByKey(key);
538
- continue;
539
- }
540
- else if (styles[key].length > 1 && !styles[key].every(x => x === styles[key][0])) {
541
- this._stylesMap[key] = typeof styles[key][0] === 'boolean' && key !== 'isBulletMarker' ? false : null;
542
- continue;
447
+ applyToolbarStyles() {
448
+ // undefined - value wasn't set
449
+ // null - collision (different values at the same time)
450
+ // value - value was set without collisions
451
+ let startIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, this.selection.range.start);
452
+ let endIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, this.selection.range.end);
453
+ if (startIndex !== endIndex) {
454
+ endIndex--;
455
+ }
456
+ else if (this.selection.cursor.column > 0) {
457
+ startIndex--;
458
+ endIndex--;
459
+ }
460
+ const textStyles = FormatStyleHelper.getFormatsAtRange(this.model.formats, startIndex, endIndex).map(format => format.textStyle);
461
+ const paragraphStyles = ParagraphStyleHelper.getParagraphsAtRange(this.model.paragraphs, startIndex, endIndex).map(x => x.paragraphStyle.numberingId
462
+ ? NumberingHelper.getStyles(x.paragraphStyle, this.generalProperties.numberings)
463
+ : new NumberingParagraphStyleModel(x.paragraphStyle));
464
+ const result = {};
465
+ for (let style of [...textStyles, ...paragraphStyles]) {
466
+ for (let key of Object.keys(style)) {
467
+ if (result[key] === undefined) {
468
+ result[key] = style[key];
469
+ }
470
+ else if (result[key] !== style[key]) {
471
+ result[key] = null;
472
+ }
543
473
  }
544
- this._stylesMap[key] = styles[key][0];
545
474
  }
546
- this.signal('setStyles', this._stylesMap);
547
- }
548
- setNumberingStyle(startIndex, endIndex) {
549
- const styles = {
550
- alignment: [this._stylesMap.alignment],
551
- backgroundColor: [this._stylesMap.backgroundColor],
552
- highlightColor: [this._stylesMap.highlightColor],
553
- fontColor: [this._stylesMap.fontColor],
554
- fontFamily: [this._stylesMap.fontFamily],
555
- fontSize: [this._stylesMap.fontSize],
556
- italic: [this._stylesMap.italic],
557
- bold: [this._stylesMap.bold],
558
- strikethrough: [this._stylesMap.strikethrough],
559
- underline: [this._stylesMap.underline],
560
- spaceBefore: [this._stylesMap.spaceBefore],
561
- spaceAfter: [this._stylesMap.spaceAfter],
562
- indentLeft: [this._stylesMap.indentLeft],
563
- indentRight: [this._stylesMap.indentRight],
564
- isBulletMarker: [],
565
- numberingLevelsStyles: []
566
- };
567
- this.updateNumberingStyles(styles, startIndex, endIndex);
568
- this.setStyles(styles);
475
+ this.editorService.styles = result;
569
476
  }
570
477
  restore(model) {
571
- const paragraphPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, model.startIndex);
478
+ const paragraphPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, model.startIndex);
572
479
  if (model.startIndex !== model.endIndex) {
573
480
  this.removeByDocumentIndexes(model.startIndex, model.endIndex);
574
481
  }
@@ -578,10 +485,14 @@ export class EditSession extends EventEmitting {
578
485
  this.restoreComponents(this.model.images, this.customComponents.images, NoderImageComponent, model.startIndex, restoreEndIndex);
579
486
  this.restoreComponents(this.model.tabs, this.customComponents.tabs, NoderTabComponent, model.startIndex, restoreEndIndex);
580
487
  this.restoreElementComponents(this.model.elements, model.startIndex, restoreEndIndex);
581
- const endPoint = this.document.insertText(paragraphPosition, model.text);
582
- this.updateInternalDataOnInsertText(paragraphPosition.row, endPoint.row);
488
+ const endPoint = this.displayData.insertText(paragraphPosition, model.text);
489
+ this.displayData.resetAllNumberingInfo(paragraphPosition.row);
490
+ this.displayData.updateNextLineIndexes(paragraphPosition.row, endPoint.row);
491
+ if (endPoint.row - paragraphPosition.row && this.type !== 'cell') {
492
+ this.displayData.updateNumberingsDataOnChange(endPoint.row + 1);
493
+ }
583
494
  this.selection.placeCursor(endPoint);
584
- this.processSelectionStyles();
495
+ this.applyToolbarStyles();
585
496
  }
586
497
  restoreComponents(models, components, componentType, restoreIndex, restoreEndIndex) {
587
498
  for (const model of models) {
@@ -606,66 +517,39 @@ export class EditSession extends EventEmitting {
606
517
  this.addComponent(this.customComponents.customElements, model, type);
607
518
  }
608
519
  }
609
- processSelectionStyles() {
610
- const { startIndex, endIndex } = this.getRangeIndexes(this.selection.range);
611
- const styles = {
612
- alignment: [],
613
- backgroundColor: [],
614
- highlightColor: [],
615
- fontColor: [],
616
- fontFamily: [],
617
- fontSize: [],
618
- italic: [],
619
- bold: [],
620
- strikethrough: [],
621
- underline: [],
622
- spaceBefore: [],
623
- spaceAfter: [],
624
- indentLeft: [],
625
- indentRight: [],
626
- isBulletMarker: [],
627
- numberingLevelsStyles: []
628
- };
629
- this.updateParagraphStyles(styles, startIndex, endIndex);
630
- this.updateNumberingStyles(styles, startIndex, endIndex);
631
- const format = this.updateTextStyles(styles, startIndex, endIndex);
632
- this.setStyles(styles);
633
- if (format) {
634
- this.cursorStyle = Object.assign({}, format.textStyle, this.cursorStyle);
635
- this.setStyle(this.cursorStyle);
636
- }
637
- else {
638
- this.cursorStyle = null;
639
- }
640
- }
641
520
  getLinkModel(cursor) {
642
- const { startIndex, endIndex } = this.getRangeIndexes(new Range(cursor, cursor));
643
- return this.model.links.find(x => x.insertIndex <= startIndex + 1 && x.endIndex > endIndex);
521
+ const index = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, cursor);
522
+ return this.model.links.find(x => x.insertIndex <= index && x.endIndex > index);
644
523
  }
645
524
  insertTableRows(insertIndex, rowsCount, targetIndex, inheritIndex) {
525
+ const table = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
526
+ this.displayData.resetNumberingInfoByTableCell(table);
646
527
  OperationsHelper.insertTableRows(this.model, insertIndex, rowsCount, targetIndex, inheritIndex);
647
- const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
648
- tableComponent.instance.updateTable();
528
+ table.instance.updateTable();
649
529
  }
650
530
  insertTableColumns(insertIndex, columnsCount, targetIndex, inheritIndex) {
651
- OperationsHelper.insertTableColumns(this.model, insertIndex, columnsCount, targetIndex, inheritIndex, this.pagesWrap.contentWidth);
652
- const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
653
- tableComponent.instance.updateTable();
531
+ const table = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
532
+ this.displayData.resetNumberingInfoByTableCell(table);
533
+ OperationsHelper.insertTableColumns(this.model, insertIndex, columnsCount, targetIndex, inheritIndex, this.displayData.contentWidth);
534
+ table.instance.updateTable();
654
535
  }
655
536
  removeTableRows(insertIndex, startIndex, endIndex) {
537
+ const table = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
538
+ this.displayData.resetNumberingInfoByTableCell(table);
656
539
  OperationsHelper.removeTableRows(this.model, insertIndex, startIndex, endIndex);
657
- const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
658
- tableComponent.instance.updateTable();
540
+ table.instance.updateTable();
659
541
  }
660
542
  removeTableColumns(insertIndex, startIndex, endIndex) {
661
- OperationsHelper.removeTableColumns(this.model, insertIndex, startIndex, endIndex, this.pagesWrap.contentWidth);
662
- const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
663
- tableComponent.instance.updateTable();
543
+ const table = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
544
+ this.displayData.resetNumberingInfoByTableCell(table);
545
+ OperationsHelper.removeTableColumns(this.model, insertIndex, startIndex, endIndex, this.displayData.contentWidth);
546
+ table.instance.updateTable();
664
547
  }
665
548
  resizeTableColumns(resizeTableColumns) {
549
+ const table = this.customComponents.tables.find(x => x.instance.insertIndex === resizeTableColumns.insertIndex);
550
+ this.displayData.resetNumberingInfoByTableCell(table);
666
551
  OperationsHelper.resizeTableColumns(this.model, resizeTableColumns);
667
- const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === resizeTableColumns.insertIndex);
668
- tableComponent.instance.updateTable();
552
+ table.instance.updateTable();
669
553
  }
670
554
  restoreTable(insertIndex, table) {
671
555
  const oldTable = JSON.parse(JSON.stringify(table));
@@ -673,445 +557,5 @@ export class EditSession extends EventEmitting {
673
557
  const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
674
558
  tableComponent.instance.updateTable();
675
559
  }
676
- updateParagraphTabs(tabIndex, paragraphIndex, length) {
677
- const paragraphLastIndex = this.wrapParagraphIndex[paragraphIndex] + length;
678
- if (tabIndex === -1 ||
679
- tabIndex >= this.customComponents.tabs.length ||
680
- this.customComponents.tabs[tabIndex].instance.insertIndex > paragraphLastIndex) {
681
- return tabIndex;
682
- }
683
- const startIndex = tabIndex;
684
- while (this.customComponents.tabs[tabIndex] && this.customComponents.tabs[tabIndex].instance.insertIndex <= paragraphLastIndex) {
685
- this.customComponents.tabs[tabIndex].instance.width = this.pagesWrap.tabTokens[tabIndex - startIndex].width;
686
- this.customComponents.tabs[tabIndex].instance.height = this.pagesWrap.tabTokens[tabIndex - startIndex].font;
687
- tabIndex++;
688
- }
689
- return tabIndex;
690
- }
691
- getRangeIndexes(range) {
692
- let partIndexes = ContentHelper.getSelectedPartDocumentIndexes(this.wrapParagraphIndex, range);
693
- const prevNewLineSymbol = this.document.isNewLineSymbol(partIndexes.endIndex - 1);
694
- if (!prevNewLineSymbol) {
695
- if (partIndexes.endIndex > partIndexes.startIndex) {
696
- partIndexes.endIndex--;
697
- }
698
- else if (partIndexes.startIndex === partIndexes.endIndex && partIndexes.startIndex > 0) {
699
- partIndexes.startIndex--;
700
- partIndexes.endIndex--;
701
- }
702
- }
703
- return partIndexes;
704
- }
705
- updateInternalDataOnInsertText(startRow, endRow) {
706
- const length = endRow - startRow;
707
- const newParagraphs = Array(length);
708
- const newWrapData = Array(length);
709
- for (let i = 0; i < length; i++) {
710
- newWrapData[i] = [];
711
- }
712
- this.wrapData.splice(startRow, 0, ...newWrapData);
713
- this.pagesWrap.paragraphs.splice(startRow, 0, ...newParagraphs);
714
- if (length) {
715
- this.updateNumberingsDataOnChange(endRow);
716
- }
717
- this.updateWrapData(startRow, endRow);
718
- }
719
- updateInternalDataOnDeleteText(startRow, endRow) {
720
- const length = endRow - startRow;
721
- this.wrapData.splice(startRow, length);
722
- this.pagesWrap.remove(startRow, length);
723
- if (length) {
724
- this.updateNumberingsDataOnChange(startRow);
725
- }
726
- this.updateWrapData(startRow, startRow);
727
- }
728
- updateNumberingsDataOnChange(index) {
729
- for (let i = index; i < this.pagesWrap.paragraphs.length; i++) {
730
- if (this.model.paragraphs[i].paragraphStyle.numberingId !== null) {
731
- this.pagesWrap.paragraphs[i].numberingData = NumberingHelper.createDataModel(this.generalProperties.numberings, this.model.paragraphs, i);
732
- const paragraphFormat = FormatStyleHelper.getFormatAtIndex(this.model.formats, this.model.paragraphs[i].insertIndex);
733
- NumberingHelper.updateMarkerData(this.generalProperties, this.pagesWrap.paragraphs[i], paragraphFormat.textStyle, this.model.paragraphs[i].paragraphStyle);
734
- }
735
- }
736
- }
737
- /**
738
- * Computes wrap index based on max row width
739
- */
740
- computeWrapIndex(displayTokens) {
741
- if (!displayTokens[0]) {
742
- return 0;
743
- }
744
- if (displayTokens[0].isTable || (displayTokens[0].breaksLine && displayTokens.length === 1)) {
745
- return 1;
746
- }
747
- const indent = displayTokens[0].indentLeft +
748
- displayTokens[0].indentRight +
749
- displayTokens[0].indentFirstLine -
750
- displayTokens[0].indentHanging || 0;
751
- const maxRowWidth = (this.pagesWrap.contentWidth || this.contentWidth) - indent;
752
- let sum = 0;
753
- for (let i = 0; i < displayTokens.length; i++) {
754
- if (displayTokens[i].isTab) {
755
- displayTokens[i].width = TabHelper.calculateTabWidth(sum, this.generalProperties.defaultTabWidth);
756
- }
757
- sum += displayTokens[i].width;
758
- if ((i > 0 && (sum >= maxRowWidth || displayTokens[i - 1].breaksLine)) || displayTokens[i].isTable) {
759
- return i;
760
- }
761
- if (displayTokens[i].isLineBreak || (i === displayTokens.length - 1 && displayTokens[i].isPageBreak)) {
762
- return i + 1;
763
- }
764
- }
765
- return 0;
766
- }
767
- computeWrapSplit(tokens, wrapLimit) {
768
- if (!tokens.length || tokens.length <= wrapLimit) {
769
- return null;
770
- }
771
- // If there is a space or tab at this split position, then making
772
- // a split is simple.
773
- if (wrapLimit === 0 ||
774
- tokens[wrapLimit].displayValue === DisplayValue.customContent ||
775
- (this.isWhiteSpace(tokens[wrapLimit - 1]) && this.isWhiteSpace(tokens[wrapLimit]))) {
776
- return wrapLimit;
777
- }
778
- return this.calculateSplit(wrapLimit, tokens);
779
- }
780
- getSplits(model, line, startIndex, paragraphIndex, isNextLineExists) {
781
- const strTokens = this.getDisplayTokens(model, line, startIndex);
782
- if (!strTokens.length) {
783
- const defaultRowInfo = new LineInfoModel({
784
- height: (this.stylesMap.fontSize * 4) / 3,
785
- width: 0,
786
- align: DEFAULT_PARAGRAPH_STYLE.alignment,
787
- indent: new IndentModel(DEFAULT_PARAGRAPH_STYLE.indentFirstLine, DEFAULT_PARAGRAPH_STYLE.indentHanging, DEFAULT_PARAGRAPH_STYLE.indentLeft, DEFAULT_PARAGRAPH_STYLE.indentRight),
788
- offsetAfter: DEFAULT_PARAGRAPH_STYLE.spaceAfter,
789
- offsetBefore: DEFAULT_PARAGRAPH_STYLE.spaceBefore,
790
- lineSpacing: DEFAULT_PARAGRAPH_STYLE.lineSpacing,
791
- isAfterPageBreak: false,
792
- isEndedByPageBreak: false,
793
- backgroundColor: DEFAULT_PARAGRAPH_STYLE.backgroundColor
794
- });
795
- return { splits: [], rowInfos: [defaultRowInfo] };
796
- }
797
- const splits = [];
798
- const rowInfos = [];
799
- let prevToken;
800
- let index = -1;
801
- let initial = line;
802
- while (index) {
803
- initial = initial.slice(index > 0 ? index : 0);
804
- const tokens = strTokens.slice(line.length - initial.length);
805
- if (!tokens.length) {
806
- tokens.push(...this.getEmptyLineTokens(startIndex + index));
807
- }
808
- let wrapLimit = this.computeWrapIndex(tokens);
809
- if (tokens[tokens.length - 1].isPageBreak && wrapLimit === tokens.length && isNextLineExists) {
810
- wrapLimit = 0;
811
- }
812
- const wrapSplit = tokens[wrapLimit - 1]?.breaksLine || tokens[wrapLimit - 1]?.isTable ? wrapLimit : this.computeWrapSplit(tokens, wrapLimit);
813
- const wrapTokens = tokens.slice(0, wrapSplit || undefined);
814
- if (wrapTokens.length) {
815
- prevToken = wrapTokens[wrapTokens.length - 1];
816
- }
817
- const isAfterPageBreak = !rowInfos.length ? false : rowInfos[rowInfos.length - 1].isEndedByPageBreak;
818
- const lineInfo = this.getLineInfoFromToken(prevToken, wrapTokens[0], wrapTokens, isAfterPageBreak);
819
- lineInfo.backgroundColor = model.paragraphs[paragraphIndex].paragraphStyle.backgroundColor;
820
- rowInfos.push(lineInfo);
821
- if (!wrapLimit) {
822
- break;
823
- }
824
- index = wrapSplit;
825
- const splitsLength = splits.length;
826
- const splitIndex = splitsLength ? index + splits[splitsLength - 1] : index;
827
- splits.push(splitIndex);
828
- }
829
- this.pagesWrap.tabTokens.push(...strTokens.filter(x => x.isTab));
830
- ParagraphHelper.applyParagraphIndentsToLines(rowInfos, paragraphIndex, model.paragraphs);
831
- return { splits, rowInfos };
832
- }
833
- setDocument() {
834
- const pageMargin = this.document.pageMargin;
835
- this.pagesWrap = new PagesWrap(this.document.pagesSpace, pageMargin, this.document.pageWidth, this.document.pageHeight, this.customComponents);
836
- }
837
- getEmptyLineTokens(startIndex) {
838
- const storedFormat = FormatStyleHelper.getFormatAtIndex(this.model.formats, startIndex);
839
- if (!storedFormat) {
840
- return [];
841
- }
842
- const lineInfo = this.getLineInfoByBreakModifier(startIndex);
843
- const size = FontMetrics.measureCharSize('EMPTY_LINE', ContentStyleHelper.getFontStylesString(storedFormat.textStyle));
844
- size.width = 3;
845
- return [
846
- new DisplayToken({
847
- ...size,
848
- displayValue: DisplayValue.emptyLine,
849
- align: lineInfo.align,
850
- indentFirstLine: lineInfo.indent.firstLine,
851
- indentHanging: lineInfo.indent.hanging,
852
- indentLeft: lineInfo.indent.left,
853
- indentRight: lineInfo.indent.right,
854
- indentBefore: lineInfo.offsetBefore,
855
- indentAfter: lineInfo.offsetAfter,
856
- isPageBreak: false,
857
- isLineBreak: false,
858
- isTab: false,
859
- lineSpacing: lineInfo.lineSpacing
860
- })
861
- ];
862
- }
863
- getFilledLineTokens(startIndex, line, model) {
864
- const lineInfo = this.getLineInfoByBreakModifier(startIndex + line.length);
865
- const tokens = [];
866
- let characters = [];
867
- let format = FormatStyleHelper.getFormatAtIndex(model.formats, startIndex);
868
- let prevFormat = null;
869
- let prevCharCode = null;
870
- let prevFontString = null;
871
- let prevChar = null;
872
- let fontString = ContentStyleHelper.getFontStylesString(format?.textStyle);
873
- let symbolChange = false;
874
- for (let i = 0; i < line.length; i++) {
875
- const char = line[i];
876
- const size = FontMetrics.measureCharSize(char, fontString);
877
- const customComponent = this.customContentService.getOrGenerateComponent(this.model, this.customComponents, this.sessionId, this.generalProperties, this.contentWidth, startIndex, char);
878
- const breakType = BreakHelper.getBreakType(model, char, startIndex);
879
- if (customComponent && !breakType) {
880
- this.customContentService.addToCustomComponents(this.customComponents, customComponent, char, startIndex);
881
- const token = this.customContentService.getTokenFromComponent(customComponent, lineInfo, DisplayValue.customContent, i === 0, size);
882
- tokens.push(token);
883
- prevCharCode = -1;
884
- prevChar = '';
885
- characters = [];
886
- }
887
- else {
888
- const charCode = char.charCodeAt(0);
889
- const displayValue = this.getDisplayValue(charCode);
890
- const isFirstCharacter = i === 0;
891
- const token = new DisplayToken({
892
- ...size,
893
- displayValue,
894
- align: lineInfo.align,
895
- indentFirstLine: isFirstCharacter ? lineInfo.indent.firstLine : DEFAULT_PARAGRAPH_STYLE.indentFirstLine,
896
- indentHanging: isFirstCharacter ? lineInfo.indent.hanging : DEFAULT_PARAGRAPH_STYLE.indentHanging,
897
- indentLeft: lineInfo.indent.left,
898
- indentRight: lineInfo.indent.right,
899
- indentBefore: lineInfo.offsetBefore,
900
- indentAfter: lineInfo.offsetAfter,
901
- lineSpacing: lineInfo.lineSpacing,
902
- isPageBreak: breakType === BreakTypes.Page,
903
- isLineBreak: breakType === BreakTypes.TextWrapping,
904
- isTab: false
905
- });
906
- tokens.push(token);
907
- if (charCode !== prevCharCode ||
908
- !prevFormat ||
909
- !ContentStyleHelper.areSameTextStyles(format?.textStyle, prevFormat?.textStyle)) {
910
- symbolChange = true;
911
- }
912
- else if (i === line.length - 1) {
913
- characters.push(token);
914
- symbolChange = true;
915
- }
916
- else {
917
- characters.push(token);
918
- }
919
- if (characters.length > 1 && symbolChange) {
920
- this.processCharSizes(prevChar, prevFontString, characters);
921
- characters = [token];
922
- symbolChange = false;
923
- }
924
- else if (symbolChange) {
925
- characters = [token];
926
- }
927
- prevCharCode = charCode;
928
- prevChar = char;
929
- }
930
- prevFormat = format;
931
- prevFontString = fontString;
932
- startIndex++;
933
- if (startIndex > format?.endIndex) {
934
- format = FormatStyleHelper.getFormatAtIndex(model.formats, startIndex);
935
- fontString = ContentStyleHelper.getFontStylesString(format?.textStyle);
936
- }
937
- }
938
- return tokens;
939
- }
940
- processCharSizes(prevChar, prevFontString, characters) {
941
- const newSize = FontMetrics.measureCharSize(prevChar, prevFontString);
942
- for (let item of characters) {
943
- Object.assign(item, newSize);
944
- }
945
- }
946
- calculateSplit(index, tokens) {
947
- for (let i = index; i >= 0; i--) {
948
- if (this.isWhiteSpace(tokens[i]) || tokens[i].displayValue === DisplayValue.customContent) {
949
- return i + 1;
950
- }
951
- }
952
- return index;
953
- }
954
- isWhiteSpace(token) {
955
- return [DisplayValue.space, DisplayValue.emptyLine].includes(token.displayValue);
956
- }
957
- getLineInfoFromToken(prevToken, firstWrapToken, wrapTokens, isAfterPageBreak) {
958
- const info = new LineInfoModel({
959
- width: 0,
960
- height: 0,
961
- align: prevToken.align,
962
- indent: new IndentModel(prevToken.indentFirstLine, prevToken.indentHanging, prevToken.indentLeft, prevToken.indentRight),
963
- offsetBefore: prevToken.indentBefore,
964
- offsetAfter: prevToken.indentAfter,
965
- lineSpacing: prevToken.lineSpacing,
966
- isAfterPageBreak,
967
- isEndedByPageBreak: prevToken.isPageBreak
968
- });
969
- if (firstWrapToken) {
970
- info.align = firstWrapToken.align;
971
- info.indent.firstLine = firstWrapToken.indentFirstLine;
972
- info.indent.hanging = firstWrapToken.indentHanging;
973
- info.indent.left = firstWrapToken.indentLeft;
974
- info.indent.right = firstWrapToken.indentRight;
975
- info.offsetBefore = firstWrapToken.indentBefore;
976
- info.offsetAfter = firstWrapToken.indentAfter;
977
- info.lineSpacing = firstWrapToken.lineSpacing;
978
- info.hasTable = firstWrapToken.isTable;
979
- }
980
- let fontSize = 0;
981
- let ascent = 0;
982
- let descent = 0;
983
- const tokens = isAfterPageBreak && !wrapTokens.length ? [prevToken] : wrapTokens;
984
- for (const wrapToken of tokens) {
985
- if (info.height < wrapToken.height) {
986
- info.height = wrapToken.height;
987
- }
988
- if (fontSize < wrapToken.font && wrapToken.displayValue !== DisplayValue.customContent) {
989
- fontSize = wrapToken.font;
990
- ascent = wrapToken.ascent;
991
- descent = wrapToken.descent;
992
- }
993
- info.width += wrapToken.width;
994
- }
995
- info.height = info.height || 18;
996
- if (info.lineSpacing > 1) {
997
- info.offsetAfter = (ascent + descent) * (info.lineSpacing - 1);
998
- }
999
- else if (ascent + descent === info.height) {
1000
- info.height = info.height * info.lineSpacing;
1001
- }
1002
- return info;
1003
- }
1004
- getDisplayValue(charCode) {
1005
- if (charCode === 32) {
1006
- return DisplayValue.space;
1007
- }
1008
- if ((charCode > 39 && charCode < 48) || (charCode > 57 && charCode < 64)) {
1009
- return DisplayValue.punctuation;
1010
- }
1011
- return DisplayValue.char;
1012
- }
1013
- getLineInfoByBreakModifier(index) {
1014
- const paragraph = ParagraphStyleHelper.getParagraphAtIndex(this.model.paragraphs, index);
1015
- if (!paragraph) {
1016
- return new LineInfoModel({
1017
- align: DEFAULT_PARAGRAPH_STYLE.alignment,
1018
- indent: new IndentModel(DEFAULT_PARAGRAPH_STYLE.indentFirstLine, DEFAULT_PARAGRAPH_STYLE.indentHanging, DEFAULT_PARAGRAPH_STYLE.indentLeft, DEFAULT_PARAGRAPH_STYLE.indentRight),
1019
- offsetBefore: DEFAULT_PARAGRAPH_STYLE.spaceBefore,
1020
- offsetAfter: DEFAULT_PARAGRAPH_STYLE.spaceAfter,
1021
- lineSpacing: DEFAULT_PARAGRAPH_STYLE.lineSpacing
1022
- });
1023
- }
1024
- const indentLeft = this.getParagraphIndentLeft(paragraph);
1025
- const indentHanging = paragraph.paragraphStyle.numberingId === null ? paragraph.paragraphStyle.indentHanging : 0;
1026
- return new LineInfoModel({
1027
- align: paragraph.paragraphStyle.alignment ?? DEFAULT_PARAGRAPH_STYLE.alignment,
1028
- indent: new IndentModel(paragraph.paragraphStyle.indentFirstLine ?? DEFAULT_PARAGRAPH_STYLE.indentFirstLine, indentHanging ?? DEFAULT_PARAGRAPH_STYLE.indentHanging, indentLeft ?? DEFAULT_PARAGRAPH_STYLE.indentLeft, paragraph.paragraphStyle.indentRight ?? DEFAULT_PARAGRAPH_STYLE.indentRight),
1029
- offsetBefore: DEFAULT_PARAGRAPH_STYLE.spaceBefore,
1030
- offsetAfter: DEFAULT_PARAGRAPH_STYLE.spaceAfter,
1031
- lineSpacing: paragraph.paragraphStyle.lineSpacing ?? DEFAULT_PARAGRAPH_STYLE.lineSpacing
1032
- });
1033
- }
1034
- getParagraphIndentLeft(paragraph) {
1035
- let paragraphIndent = paragraph.paragraphStyle.indentLeft;
1036
- const numberingId = paragraph.paragraphStyle.numberingId;
1037
- if (numberingId !== null) {
1038
- const level = paragraph.paragraphStyle.numberingLevel;
1039
- const paragraphIndex = this.model.paragraphs.indexOf(paragraph);
1040
- const levelModel = NumberingHelper.find(this.generalProperties.numberings, numberingId, level);
1041
- const paragraphFormat = FormatStyleHelper.getFormatAtIndex(this.model.formats, paragraph.insertIndex);
1042
- const markerTextStyle = ContentStyleHelper.combineTextStyles(levelModel.markerStyle, paragraphFormat.textStyle);
1043
- let markerWidth = this.pagesWrap.paragraphs[paragraphIndex]?.numberingData?.width;
1044
- if (!this.pagesWrap.paragraphs[paragraphIndex]?.numberingData.markerTextStyle ||
1045
- !ContentStyleHelper.areSameTextStyles(markerTextStyle, this.pagesWrap.paragraphs[paragraphIndex].numberingData.markerTextStyle) ||
1046
- this.pagesWrap.paragraphs[paragraphIndex].numberingData.numberingId !== numberingId) {
1047
- const marker = NumberingHelper.getMarker(levelModel, numberingId, this.model.paragraphs, paragraphIndex);
1048
- const markerSizes = NumberingHelper.getMarkerSizes(marker, markerTextStyle);
1049
- markerWidth = markerSizes.width;
1050
- }
1051
- const hangingIndent = paragraph.paragraphStyle.indentHanging
1052
- ? paragraph.paragraphStyle.indentHanging
1053
- : levelModel.indentHanging;
1054
- paragraphIndent = levelModel.indentLeft;
1055
- if (markerWidth >= hangingIndent) {
1056
- const markerOverflow = markerWidth - hangingIndent;
1057
- const additionalMarkerIndent = TabHelper.calculateTabWidth(levelModel.indentLeft + markerOverflow, this.generalProperties.defaultTabWidth);
1058
- paragraphIndent += markerOverflow + additionalMarkerIndent;
1059
- }
1060
- }
1061
- return paragraphIndent;
1062
- }
1063
- updateTextStyles(styles, startIndex, endIndex) {
1064
- let textStyles = FormatStyleHelper.getFormatsAtRange(this.model.formats, startIndex, endIndex).map(format => format.textStyle);
1065
- let prevFormat;
1066
- if (!textStyles.length) {
1067
- prevFormat = FormatStyleHelper.getPrevFormatAtIndex(this.model.formats, startIndex);
1068
- if (prevFormat) {
1069
- textStyles = [prevFormat.textStyle];
1070
- }
1071
- }
1072
- for (const textStyle of textStyles) {
1073
- for (const key of Object.keys(textStyle)) {
1074
- if (styles[key]) {
1075
- styles[key].push(textStyle[key]);
1076
- }
1077
- }
1078
- }
1079
- return prevFormat;
1080
- }
1081
- updateParagraphStyles(styles, startIndex, endIndex) {
1082
- const paragraphStyles = ParagraphStyleHelper.getParagraphsAtRange(this.model.paragraphs, startIndex, endIndex).map(paragraph => paragraph.paragraphStyle);
1083
- for (const paragraphStyle of paragraphStyles) {
1084
- for (const key of Object.keys(paragraphStyle)) {
1085
- if (styles[key]) {
1086
- styles[key].push(paragraphStyle[key]);
1087
- }
1088
- }
1089
- }
1090
- }
1091
- updateNumberingStyles(styles, startIndex, endIndex) {
1092
- const paragraphStyles = ParagraphStyleHelper.getParagraphsAtRange(this.model.paragraphs, startIndex, endIndex).map(paragraph => paragraph.paragraphStyle);
1093
- for (const paragraphStyle of paragraphStyles) {
1094
- if (paragraphStyle.numberingId !== null) {
1095
- const numberingLevels = this.generalProperties.numberings.find(x => x.numberingId === paragraphStyle.numberingId).levels;
1096
- const levelsMarkerStyles = numberingLevels.reduce((prev, next) => `${prev}${next.marker}${next.markerType}`, '');
1097
- const level = numberingLevels.find(x => x.level === paragraphStyle.numberingLevel);
1098
- const isBulletMarker = level.markerType === NumberingMarkerType.Bullet;
1099
- styles['isBulletMarker'].push(isBulletMarker);
1100
- styles['numberingLevelsStyles'].push(levelsMarkerStyles);
1101
- }
1102
- else {
1103
- styles['isBulletMarker'].push(null);
1104
- styles['numberingLevelsStyles'].push('');
1105
- }
1106
- }
1107
- }
1108
- getImageWithAllowedSize(imageData, maxWidth) {
1109
- if (imageData.width <= maxWidth) {
1110
- return imageData;
1111
- }
1112
- const aspectRatio = imageData.width / imageData.height;
1113
- const height = maxWidth / aspectRatio;
1114
- return new ImageDataModel({ width: Math.round(maxWidth), height: Math.round(height), content: imageData.content });
1115
- }
1116
560
  }
1117
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdC5zZXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW5vZGVyL3NyYy9saWIvZWRpdG9yL2V4ZWN1dGlvbi9lZGl0LnNlc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSTVELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUMxRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUdyRixPQUFPLEVBQ0gsd0JBQXdCLEVBQ3hCLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLHVCQUF1QixFQUN2QiwwQkFBMEIsRUFDMUIsZUFBZSxFQUNsQixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFFekUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzlELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FB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Z0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUM1QztTQUNKO0lBQ0wsQ0FBQztJQUVPLHVCQUF1QixDQUFDLFNBQXlCLEVBQUUsUUFBZ0I7UUFDdkUsSUFBSSxTQUFTLENBQUMsS0FBSyxJQUFJLFFBQVEsRUFBRTtZQUM3QixPQUFPLFNBQVMsQ0FBQztTQUNwQjtRQUVELE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUN2RCxNQUFNLE1BQU0sR0FBRyxRQUFRLEdBQUcsV0FBVyxDQUFDO1FBQ3RDLE9BQU8sSUFBSSxjQUFjLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDdkgsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50UmVmLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFsaWdubWVudCB9IGZyb20gJy4uL3Bvc2l0aW9uaW5nL2FsaWdubWVudHMuY29uc3QnO1xuaW1wb3J0IHsgQXBwbHlFbGVtZW50U3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvYXBwbHktZWxlbWVudC1zdHlsZS5tb2RlbCc7XG5pbXBvcnQgeyBBcHBseUltYWdlU3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvYXBwbHktaW1hZ2Utc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgQmFzZU5vZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9zaGFyZWQvYWJzdHJhY3QvYmFzZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnJlYWtIZWxwZXIgfSBmcm9tICcuLi9nYWRnZXRzL3BhZ2UtYnJlYWsvYnJlYWsuaGVscGVyJztcbmltcG9ydCB7IEJyZWFrVHlwZXMgfSBmcm9tICcuLi9nYWRnZXRzL3BhZ2UtYnJlYWsvYnJlYWstdHlwZXMuZW51bSc7XG5pbXBvcnQgeyBDb21wb25lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vY29tcG9uZW50cy9zaGFyZWQvc2VydmljZXMvY29tcG9uZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29udGVudEhlbHBlciB9IGZyb20gJy4uL3Bvc2l0aW9uaW5nL2NvbnRlbnQuaGVscGVyJztcbmltcG9ydCB7IENvbnRlbnRzSW50ZXJmYWNlIH0gZnJvbSAnLi4vY29udGVudC9jb250ZW50cy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29udGVudFN0eWxlSGVscGVyIH0gZnJvbSAnLi4vY29udGVudC9oZWxwZXJzL2NvbnRlbnQtc3R5bGUuaGVscGVyJztcbmltcG9ydCB7IEN1cnNvclBhcmFncmFwaCB9IGZyb20gJy4uL3Bvc2l0aW9uaW5nL2N1cnNvci1wYXJhZ3JhcGgnO1xuaW1wb3J0IHsgQ1VTVE9NX0VMRU1FTlRfTUFSS0VSIH0gZnJvbSAnLi4vY29tcG9uZW50cy9zaGFyZWQvY3VzdG9tLWNvbnRlbnQtbWFya2Vycy5jb25zdCc7XG5pbXBvcnQgeyBDdXN0b21Db21wb25lbnRIZWxwZXIgfSBmcm9tICcuLi9jb21wb25lbnRzL3NoYXJlZC9jdXN0b20tY29tcG9uZW50LmhlcGxlcic7XG5pbXBvcnQgeyBDdXN0b21Db250ZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9zaGFyZWQvY3VzdG9tLWNvbnRlbnQnO1xuaW1wb3J0IHsgQ3VzdG9tQ29udGVudFNlcnZpY2UgfSBmcm9tICcuLi9jb21wb25lbnRzL3NoYXJlZC9zZXJ2aWNlcy9jdXN0b20tY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gICAgREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SLFxuICAgIERFRkFVTFRfRk9OVF9DT0xPUixcbiAgICBERUZBVUxUX0ZPTlRfRkFNSUxZLFxuICAgIERFRkFVTFRfRk9OVF9TSVpFLFxuICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLFxuICAgIEhZUEVSTElOS19IRUFESU5HX1NUWUxFX0lELFxuICAgIE5FV19MSU5FX01BUktVUFxufSBmcm9tICcuLi9jb250ZW50L2NvbnN0YW50cy9lZGl0b3IuY29uc3QnO1xuaW1wb3J0IHsgRGlzcGxheVRva2VuIH0gZnJvbSAnLi4vY29udGVudC9kaXNwbGF5LWRhdGEvZGlzcGxheS10b2tlbi5tb2RlbCc7XG5pbXBvcnQgeyBEaXNwbGF5VmFsdWUgfSBmcm9tICcuLi9jb250ZW50L2NvbnN0YW50cy9kaXNwbGF5LXZhbHVlcy5jb25zdCc7XG5pbXBvcnQgeyBEb2N1bWVudCB9IGZyb20gJy4uL2NvbnRlbnQvZGlzcGxheS1kYXRhL2RvY3VtZW50JztcbmltcG9ydCB7IERvY3hNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvZG9jeC5tb2RlbCc7XG5pbXBvcnQgeyBFZGdlcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvZWRnZXMvZWRnZXMnO1xuaW1wb3J0IHsgRWxlbWVudERhdGFNb2RlbCB9IGZyb20gJy4uL2NvbXBvbmVudHMvZXh0ZXJuYWwtZWxlbWVudC9tb2RlbHMvZWxlbWVudC1kYXRhLm1vZGVsJztcbmltcG9ydCB7IEVsZW1lbnRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvZWxlbWVudC5tb2RlbCc7XG5pbXBvcnQgeyBFdmVudEVtaXR0aW5nIH0gZnJvbSAnLi4vY29yZS9ldmVudC1lbWl0dGluZyc7XG5pbXBvcnQgeyBGb250TWV0cmljcyB9IGZyb20gJy4uL2dhZGdldHMvZm9udC1tZXRyaWNzL2ZvbnQtbWV0cmljcy5oZWxwZXInO1xuaW1wb3J0IHsgRm9ybWF0TW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2Zvcm1hdC5tb2RlbCc7XG5pbXBvcnQgeyBGb3JtYXRTdHlsZUhlbHBlciB9IGZyb20gJy4vaGVscGVycy9mb3JtYXQtc3R5bGUuaGVscGVyJztcbmltcG9ydCB7IEdlbmVyYWxQcm9wZXJ0aWVzTW9kZWwgfSBmcm9tICcuLi9jb250ZW50L2Rpc3BsYXktZGF0YS9nZW5lcmFsLXByb3BlcnRpZXMubW9kZWwnO1xuaW1wb3J0IHsgSUN1c3RvbUNvbXBvbmVudHMgfSBmcm9tICcuLi9jb21wb25lbnRzL3NoYXJlZC9jdXN0b20tY29tcG9uZW50cy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSW1hZ2VEYXRhTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2ltYWdlLWRhdGEubW9kZWwnO1xuaW1wb3J0IHsgSW5kZW50TW9kZWwgfSBmcm9tICcuLi9jb250ZW50L2Rpc3BsYXktZGF0YS9pbmRlbnQubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0QnJlYWtNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LWJyZWFrLm1vZGVsJztcbmltcG9ydCB7IEluc2VydEVsZW1lbnRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LWVsZW1lbnQubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0SW1hZ2VNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LWltYWdlLm1vZGVsJztcbmltcG9ydCB7IEluc2VydFBhcmFncmFwaE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbnNlcnQtcGFyYWdyYXBoLm1vZGVsJztcbmltcG9ydCB7IEluc2VydFRhYmxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2luc2VydC10YWJsZS5tb2RlbCc7XG5pbXBvcnQgeyBJbnNlcnRUYWJNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LXRhYi5tb2RlbCc7XG5pbXBvcnQgeyBJVG9vbGJhclN0eWxlcyB9IGZyb20gJy4uL2NvbnRlbnQvZGlzcGxheS1kYXRhL3Rvb2xiYXItc3R5bGVzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBMaW5lSW5mb01vZGVsIH0gZnJvbSAnLi4vY29udGVudC9kaXNwbGF5LWRhdGEvbGluZS1pbmZvLm1vZGVsJztcbmltcG9ydCB7IExpbmtEYXRhTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2xpbmstZGF0YS5tb2RlbCc7XG5pbXBvcnQgeyBMaW5rTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2xpbmsubW9kZWwnO1xuaW1wb3J0IHsgTm9kZXJJbWFnZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvaW1hZ2UvY29tcG9uZW50cy9pbWFnZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTm9kZXJUYWJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3RhYi90YWIuY29tcG9uZW50JztcbmltcG9ydCB7IE5vZGVyVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3RhYmxlL2NvbXBvbmVudHMvdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IE51bWJlcmluZ0hlbHBlciB9IGZyb20gJy4uL2dhZGdldHMvbnVtYmVyaW5nL251bWJlcmluZy5oZWxwZXInO1xuaW1wb3J0IHsgTnVtYmVyaW5nTGV2ZWxNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvbnVtYmVyaW5nLWxldmVsLm1vZGVsJztcbmltcG9ydCB7IE51bWJlcmluZ01hcmtlclR5cGUgfSBmcm9tICcuLi9nYWRnZXRzL251bWJlcmluZy9udW1iZXJpbmctbWFya2VyLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBOdW1iZXJpbmdNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvbnVtYmVyaW5nLm1vZGVsJztcbmltcG9ydCB7IE9wZXJhdGlvbnNIZWxwZXIgfSBmcm9tICcuLi9vcGVyYXRpb25zL29wZXJhdGlvbnMtaGVscGVyLmhlbHBlcic7XG5pbXBvcnQgeyBQYWdlc1dyYXAgfSBmcm9tICcuLi9jb250ZW50L2Rpc3BsYXktZGF0YS9wYWdlcy53cmFwJztcbmltcG9ydCB7IFBhcmFncmFwaCB9IGZyb20gJy4uL2NvbnRlbnQvZGlzcGxheS1kYXRhL3BhcmFncmFwaCc7XG5pbXBvcnQgeyBQYXJhZ3JhcGhIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvcGFyYWdyYXBoLmhlbHBlcic7XG5pbXBvcnQgeyBQYXJhZ3JhcGhNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcGFyYWdyYXBoLm1vZGVsJztcbmltcG9ydCB7IFBhcmFncmFwaFN0eWxlSGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL3BhcmFncmFwaC1zdHlsZS5oZWxwZXInO1xuaW1wb3J0IHsgUGFyYWdyYXBoU3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcGFyYWdyYXBoLXN0eWxlLm1vZGVsJztcbmltcG9ydCB7IFJhbmdlIH0gZnJvbSAnLi4vcG9zaXRpb25pbmcvcmFuZ2UnO1xuaW1wb3J0IHsgUmVwbGFjZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yZXBsYWNlLm1vZGVsJztcbmltcG9ydCB7IFJlc2l6ZVRhYmxlQ29sdW1uc01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yZXNpemUtdGFibGUtY29sdW1ucy5tb2RlbCc7XG5pbXBvcnQgeyBSZXN0b3JlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3Jlc3RvcmUubW9kZWwnO1xuaW1wb3J0IHsgU2Nyb2xsQmFyIH0gZnJvbSAnLi4vZ2FkZ2V0cy9zY3JvbGxiYXInO1xuaW1wb3J0IHsgU2VsZWN0aW9uIH0gZnJvbSAnLi4vcG9zaXRpb25pbmcvc2VsZWN0aW9uJztcbmltcG9ydCB7IFRhYkhlbHBlciB9IGZyb20gJy4uL2NvbXBvbmVudHMvdGFiL3RhYi5oZWxwZXInO1xuaW1wb3J0IHsgVGFibGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvdGFibGUubW9kZWwnO1xuaW1wb3J0IHsgVGV4dFN0eWxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3RleHQtc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgVW5pY29kZUhlbHBlciB9IGZyb20gJy4uL2dhZGdldHMvdW5pY29kZS91bmljb2RlLmhlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBFZGl0U2Vzc2lvbiBleHRlbmRzIEV2ZW50RW1pdHRpbmcge1xuICAgIHJlYWRvbmx5IGN1c3RvbUNvbXBvbmVudHM6IElDdXN0b21Db21wb25lbnRzO1xuXG4gICAgdG9rZW5SZSA9IG5ldyBSZWdFeHAoJ15bJyArIFVuaWNvZGVIZWxwZXIud29yZENoYXJzICsgJ1xcXFwkX10rJywgJ2cnKTtcblxuICAgIG5vblRva2VuUmUgPSBuZXcgUmVnRXhwKCdeKD86W14nICsgVW5pY29kZUhlbHBlci53b3JkQ2hhcnMgKyAnXFxcXCRfXXxcXFxcc10pKycsICdnJyk7XG5cbiAgICBwYWdlc1dyYXA6IFBhZ2VzV3JhcDtcblxuICAgIHdyYXBEYXRhOiBudW1iZXJbXVtdID0gW1tdXTsgLy8gV3JhcCBpbmRleGVzIGZvciBkb2N1bWVudCByb3dzXG5cbiAgICB3cmFwUGFyYWdyYXBoTGluZTogbnVtYmVyW10gPSBbXTsgLy8gbGluZSBudW1iZXJzIHRoYXQgYmVnaW4gdGhlIHBhcmFncmFwaHNcblxuICAgIHdyYXBQYXJhZ3JhcGhJbmRleDogbnVtYmVyW10gPSBbXTsgLy8gc3ltYm9sIGluZGV4ZXMgdGhhdCBiZWdpbiB0aGUgcGFyYWdyYXBoc1xuXG4gICAgZ2V0IHNjcm9sbFRvcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsQmFyPy5zY3JvbGxUb3AgPz8gMDsgLy8gb25seSBtYWluIHNlc3Npb24gaXMgc2Nyb2xsYWJsZVxuICAgIH1cblxuICAgIGdldCBzdHlsZXNNYXAoKTogSVRvb2xiYXJTdHlsZXMge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3R5bGVzTWFwO1xuICAgIH1cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zdHlsZXNNYXA6IElUb29sYmFyU3R5bGVzID0ge1xuICAgICAgICBmb250RmFtaWx5OiBERUZBVUxUX0ZPTlRfRkFNSUxZLFxuICAgICAgICBmb250U2l6ZTogREVGQVVMVF9GT05UX1NJWkUsXG4gICAgICAgIGZvbnRDb2xvcjogREVGQVVMVF9GT05UX0NPTE9SLFxuICAgICAgICBhbGlnbm1lbnQ6IEFsaWdubWVudC5sZWZ0LFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IERFRkFVTFRfQkFDS0dST1VORF9DT0xPUixcbiAgICAgICAgaGlnaGxpZ2h0Q29sb3I6IERFRkFVTFRfQkFDS0dST1VORF9DT0xPUlxuICAgIH07XG5cbiAgICBzZXQgY29udGVudFdpZHRoKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY29udGVudFdpZHRoID0gdmFsdWU7XG4gICAgICAgIHRoaXMudXBkYXRlV3JhcERhdGEoMCwgdGhpcy5kb2N1bWVudC5saW5lcy5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgZ2V0IGNvbnRlbnRXaWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudFdpZHRoO1xuICAgIH1cbiAgICBwcml2YXRlIF9jb250ZW50V2lkdGg6IG51bWJlcjtcblxuICAgIGN1cnNvclN0eWxlOiBUZXh0U3R5bGVNb2RlbDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgICAgICBwdWJsaWMgc2Vzc2lvbklkOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyBjdXN0b21Db250ZW50U2VydmljZTogQ3VzdG9tQ29udGVudFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBtb2RlbDogQ29udGVudHNJbnRlcmZhY2UsXG4gICAgICAgIHB1YmxpYyBzZWxlY3Rpb246IFNlbGVjdGlvbixcbiAgICAgICAgcHVibGljIGdlbmVyYWxQcm9wZXJ0aWVzOiBHZW5lcmFsUHJvcGVydGllc01vZGVsLFxuICAgICAgICBjb21wb25lbnRTZXJ2aWNlOiBDb21wb25lbnRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHNjcm9sbEJhcj86IFNjcm9sbEJhclxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBjb25zdCBlZGdlcyA9XG4gICAgICAgICAgICBtb2RlbCBpbnN0YW5jZW9mIERvY3hNb2RlbFxuICAgICAgICAgICAgICAgID8gbmV3IEVkZ2VzKFxuICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgbW9kZWwuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5mb290ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnBhZ2VNYXJnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucGFnZVdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICBnZW5lcmFsUHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgdGhpcy5jdXN0b21Db21wb25lbnRzID0geyBpbWFnZXM6IFtdLCB0YWJsZXM6IFtdLCB0YWJzOiBbXSwgY3VzdG9tRWxlbWVudHM6IFtdLCBlZGdlczogZWRnZXMgfTtcbiAgICAgICAgdGhpcy5zZXREb2N1bWVudCgpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGFnZXNXcmFwLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBnZXRSb3dMZW5ndGgocm93OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBpZiAoIXRoaXMud3JhcERhdGFbcm93XSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy53cmFwRGF0YVtyb3ddLmxlbmd0aCArIDE7XG4gICAgfVxuXG4gICAgdXBkYXRlV3JhcFBhcmFncmFwaEluZGV4KGZpcnN0OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLmRvY3VtZW50LmxpbmVzLmxlbmd0aDtcbiAgICAgICAgaWYgKGZpcnN0ID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLndyYXBQYXJhZ3JhcGhJbmRleFtmaXJzdF0gPSAwO1xuICAgICAgICAgICAgZmlyc3QrKztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gZmlyc3Q7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLndyYXBQYXJhZ3JhcGhJbmRleFtpXSA9IHRoaXMud3JhcFBhcmFncmFwaEluZGV4W2kgLSAxXSArIHRoaXMuZG9jdW1lbnQubGluZXNbaSAtIDFdLmxlbmd0aCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy53cmFwUGFyYWdyYXBoSW5kZXguc3BsaWNlKGNvdW50KTtcbiAgICB9XG5cbiAgICB1cGRhdGVXcmFwUGFyYWdyYXBoTGluZShmaXJzdDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5kb2N1bWVudC5saW5lcy5sZW5ndGg7XG4gICAgICAgIGlmIChmaXJzdCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy53cmFwUGFyYWdyYXBoTGluZVtmaXJzdF0gPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy53cmFwUGFyYWdyYXBoTGluZVtmaXJzdF0gPSB0aGlzLndyYXBQYXJhZ3JhcGhMaW5lW2ZpcnN0IC0gMV0gKyB0aGlzLndyYXBEYXRhW2ZpcnN0IC0gMV0ubGVuZ3RoICsgMTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gZmlyc3QgKyAxOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAgdGhpcy53cmFwUGFyYWdyYXBoTGluZVtpXSA9IHRoaXMud3JhcFBhcmFncmFwaExpbmVbaSAtIDFdICsgdGhpcy53cmFwRGF0YVtpIC0gMV0ubGVuZ3RoICsgMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndyYXBQYXJhZ3JhcGhMaW5lLnNwbGljZShjb3VudCk7XG4gICAgfVxuXG4gICAgdXBkYXRlUGFyYWdyYXBoTnVtYmVyaW5nRGF0YShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2VzV3JhcC5wYXJhZ3JhcGhzW2luZGV4XS5udW1iZXJpbmdEYXRhLm51bWJlcmluZ0lkICE9PSB0aGlzLm1vZGVsLnBhcmFncmFwaHNbaW5kZXhdLnBhcmFncmFwaFN0eWxlLm51bWJlcmluZ0lkKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2VzV3JhcC5wYXJhZ3JhcGhzW2luZGV4XS5udW1iZXJpbmdEYXRhID0gTnVtYmVyaW5nSGVscGVyLmNyZWF0ZURhdGFNb2RlbChcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLm51bWJlcmluZ3MsXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5wYXJhZ3JhcGhzLFxuICAgICAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGFnZXNXcmFwLnBhcmFncmFwaHNbaW5kZXhdLm51bWJlcmluZ0RhdGEubnVtYmVyaW5nSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFncmFwaEZvcm1hdCA9IEZvcm1hdFN0eWxlSGVscGVyLmdldEZvcm1hdEF0SW5kZXgodGhpcy5tb2RlbC5mb3JtYXRzLCB0aGlzLm1vZGVsLnBhcmFncmFwaHNbaW5kZXhdLmluc2VydEluZGV4KTtcbiAgICAgICAgICAgIE51bWJlcmluZ0hlbHBlci51cGRhdGVNYXJrZXJEYXRhKFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlc1dyYXAucGFyYWdyYXBoc1tpbmRleF0sXG4gICAgICAgICAgICAgICAgcGFyYWdyYXBoRm9ybWF0LnRleHRTdHlsZSxcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnBhcmFncmFwaHNbaW5kZXhdLnBhcmFncmFwaFN0eWxlXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlV3JhcERhdGEoZmlyc3RQYXJhZ3JhcGg6IG51bWJlciwgbGFzdFBhcmFncmFwaDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlV3JhcFBhcmFncmFwaEluZGV4KGZpcnN0UGFyYWdyYXBoKTtcbiAgICAgICAgbGV0IGluZGV4T2ZQYXJhZ3JhcGhBZnRlclBhZ2VCcmVhayA9IHRoaXMucGFnZXNXcmFwLnBhcmFncmFwaHNbZmlyc3RQYXJhZ3JhcGggLSAxXT8uaXNFbmRlZEJ5UGFnZUJyZWFrID8gZmlyc3RQYXJhZ3JhcGggOiAtMTtcbiAgICAgICAgbGV0IGZpcnN0VXNlZFRhYkluZGV4ID0gdGhpcy5tb2RlbC50YWJzLmZpbmRJbmRleCh4ID0+IHguaW5zZXJ0SW5kZXggPj0gdGhpcy53cmFwUGFyYWdyYXBoSW5kZXhbZmlyc3RQYXJhZ3JhcGhdKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGZpcnN0UGFyYWdyYXBoOyBpIDw9IGxhc3RQYXJhZ3JhcGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5wYWdlc1dyYXAudGFiVG9rZW5zID0gW107XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50TGluZSA9IHRoaXMuZG9jdW1lbnQuZ2V0TGluZSh0aGlzLmRvY3VtZW50LmxpbmVzLCBpKTtcbiAgICAgICAgICAgIGNvbnN0IGlzTmV4dExpbmVFeGlzdHMgPSB0aGlzLmRvY3VtZW50LmxpbmVzLmxlbmd0aCA+IGkgKyAxO1xuICAgICAgICAgICAgY29uc3QgeyBzcGxpdHMsIHJvd0luZm9zIH0gPSB0aGlzLmdldFNwbGl0cyh0aGlzLm1vZGVsLCBjdXJyZW50TGluZSwgdGhpcy53cmFwUGFyYWdyYXBoSW5kZXhbaV0sIGksIGlzTmV4dExpbmVFeGlzdHMpO1xuICAgICAgICAgICAgdGhpcy53cmFwRGF0YVtpXSA9IHNwbGl0cztcbiAgICAgICAgICAgIGlmIChpbmRleE9mUGFyYWdyYXBoQWZ0ZXJQYWdlQnJlYWsgPT09IGkpIHtcbiAgICAgICAgICAgICAgICByb3dJbmZvc1swXS5pc0FmdGVyUGFnZUJyZWFrID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluZGV4T2ZQYXJhZ3JhcGhBZnRlclBhZ2VCcmVhayA9IHJvd0luZm9zW3Jvd0luZm9zLmxlbmd0aCAtIDFdLmlzRW5kZWRCeVBhZ2VCcmVhayA/IGkgKyAxIDogLTE7XG4gICAgICAgICAgICB0aGlzLnBhZ2VzV3JhcC5zZXQoaSwgcm93SW5mb3MsIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMubnVtYmVyaW5ncywgdGhpcy5tb2RlbC5wYXJhZ3JhcGhzKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUGFyYWdyYXBoTnVtYmVyaW5nRGF0YShpKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlV3JhcFBhcmFncmFwaEluZGV4KGZpcnN0UGFyYWdyYXBoKTtcbiAgICAgICAgICAgIGZpcnN0VXNlZFRhYkluZGV4ID0gdGhpcy51cGRhdGVQYXJhZ3JhcGhUYWJzKGZpcnN0VXNlZFRhYkluZGV4LCBpLCBjdXJyZW50TGluZS5sZW5ndGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wYWdlc1dyYXAucGFyYWdyYXBoc1tsYXN0UGFyYWdyYXBoICsgMV0/LnNldElzQWZ0ZXJQYWdlQnJlYWsoaW5kZXhPZlBhcmFncmFwaEFmdGVyUGFnZUJyZWFrID4gLTEpO1xuICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMuZG9jdW1lbnQubGluZXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnBhZ2VzV3JhcC5wYXJhZ3JhcGhzLnNwbGljZShjb3VudCk7XG4gICAgICAgIHRoaXMud3JhcERhdGEuc3BsaWNlKGNvdW50KTtcbiAgICAgICAgdGhpcy51cGRhdGVXcmFwUGFyYWdyYXBoTGluZShmaXJzdFBhcmFncmFwaCk7XG4gICAgICAgIHRoaXMucGFnZXNXcmFwLnByb2Nlc3NQYXJhZ3JhcGhzUHJvcGVydGllcyhmaXJzdFBhcmFncmFwaCwgdGhpcy53cmFwUGFyYWdyYXBoSW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgc3RyaW5nLCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBkaXNwbGF5IGNoYXJhY3RlcnMsIGluY2x1ZGluZyB0YWJzIGFuZCBzcGFjZXMuXG4gICAgICovXG4gICAgZ2V0RGlzcGxheVRva2Vucyhtb2RlbDogQ29udGVudHNJbnRlcmZhY2UsIHN0cjogc3RyaW5nLCBzdGFydEluZGV4OiBudW1iZXIpOiBEaXNwbGF5VG9rZW5bXSB7XG4gICAgICAgIGlmICghc3RyLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RW1wdHlMaW5lVG9rZW5zKHN0YXJ0SW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmlsbGVkTGluZVRva2VucyhzdGFydEluZGV4LCBzdHIsIG1vZGVsKTtcbiAgICB9XG5cbiAgICBnZXRSb3dDYWNoZUluZGV4KGNhY2hlQXJyYXk6IG51bWJlcltdLCB2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gMDtcbiAgICAgICAgbGV0IGVuZCA9IGNhY2hlQXJyYXkubGVuZ3RoIC0gMTtcbiAgICAgICAgd2hpbGUgKHN0YXJ0IDw9IGVuZCkge1xuICAgICAgICAgICAgY29uc3QgbWlkID0gKHN0YXJ0ICsgZW5kKSA+PiAxO1xuICAgICAgICAgICAgY29uc3QgY2VudGVyID0gY2FjaGVBcnJheVttaWRdO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUgPiBjZW50ZXIpIHtcbiAgICAgICAgICAgICAgICBzdGFydCA9IG1pZCArIDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIDwgY2VudGVyKSB7XG4gICAgICAgICAgICAgICAgZW5kID0gbWlkIC0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdGFydCAtIDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgd2lkdGggb2YgdGhlIHN0cmluZyBgc3RyYCBvbiB0aGUgc2NyZWVuIHdoaWxlIGFzc3VtaW5nIHRoYXQgdGhlIHN0cmluZyBzdGFydHMgYXQgdGhlIGZpcnN0IGNvbHVtbiBvbiB0aGUgc2NyZWVuLlxuICAgICAqIFRoZSBmaXJzdCBwb3NpdGlvbiBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGZvciBgc3RyYCBvbiBzY3JlZW4uXG4gICAgICogVGhlIHNlY29uZCB2YWx1ZSBjb250YWlucyB0aGUgcG9zaXRpb24gb2YgdGhlIGRvY3VtZW50IGNvbHVtbiB0aGF0IHRoaXMgZnVuY3Rpb24gcmVhZCB1bnRpbC5cbiAgICAgKi9cbiAgICBnZXRTdHJpbmdTY3JlZW5XaWR0aChzdHI6IHN0cmluZywgbWF4U2NyZWVuQ29sdW1uPzogbnVtYmVyKTogbnVtYmVyW10ge1xuICAgICAgICBsZXQgc2NyZWVuQ29sdW1uID0gMDtcbiAgICAgICAgbGV0IGNvbHVtbjogbnVtYmVyO1xuICAgICAgICBmb3IgKGNvbHVtbiA9IDA7IGNvbHVtbiA8IHN0ci5sZW5ndGg7IGNvbHVtbisrKSB7XG4gICAgICAgICAgICBzY3JlZW5Db2x1bW4gKz0gMTtcblxuICAgICAgICAgICAgaWYgKHNjcmVlbkNvbHVtbiA+IG1heFNjcmVlbkNvbHVtbikge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtzY3JlZW5Db2x1bW4sIGNvbHVtbl07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBzdGFydGluZyByb3cgYW5kIGNvbHVtbiwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgYFJhbmdlYCBvZiB0aGUgZmlyc3Qgd29yZCBib3VuZGFyeSBpdCBmaW5kcy5cbiAgICAgKi9cbiAgICBnZXRXb3JkUmFuZ2Uocm93OiBudW1iZXIsIGNvbHVtbjogbnVtYmVyKTogUmFuZ2Uge1xuICAgICAgICBjb25zdCBsaW5lID0gdGhpcy5kb2N1bWVudC5nZXRMaW5lKHRoaXMuZG9jdW1lbnQubGluZXMsIHJvdyk7XG4gICAgICAgIGxldCBpblRva2VuID0gZmFsc2U7XG4gICAgICAgIGlmIChjb2x1bW4gPiAwKSB7XG4gICAgICAgICAgICBpblRva2VuID0gISFsaW5lLmNoYXJBdChjb2x1bW4gLSAxKS5tYXRjaCh0aGlzLnRva2VuUmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpblRva2VuKSB7XG4gICAgICAgICAgICBpblRva2VuID0gISFsaW5lLmNoYXJBdChjb2x1bW4pLm1hdGNoKHRoaXMudG9rZW5SZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVnZXhwOiBSZWdFeHA7XG4gICAgICAgIGlmIChpblRva2VuKSB7XG4gICAgICAgICAgICByZWdleHAgPSB0aGlzLnRva2VuUmU7XG4gICAgICAgIH0gZWxzZSBpZiAoL15cXHMrJC8udGVzdChsaW5lLnNsaWNlKGNvbHVtbiAtIDEsIGNvbHVtbiArIDEpKSkge1xuICAgICAgICAgICAgcmVnZXhwID0gL1xccy87XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWdleHAgPSB0aGlzLm5vblRva2VuUmU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3RhcnQgPSBjb2x1bW47XG4gICAgICAgIGlmIChzdGFydCA+IDApIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBzdGFydC0tO1xuICAgICAgICAgICAgfSB3aGlsZSAoc3RhcnQgPj0gMCAmJiBsaW5lLmNoYXJBdChzdGFydCkubWF0Y2gocmVnZXhwKSk7XG5cbiAgICAgICAgICAgIHN0YXJ0Kys7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZW5kID0gY29sdW1uO1xuICAgICAgICB3aGlsZSAoZW5kIDwgbGluZS5sZW5ndGggJiYgbGluZS5jaGFyQXQoZW5kKS5tYXRjaChyZWdleHApKSB7XG4gICAgICAgICAgICBlbmQrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUmFuZ2UobmV3IEN1cnNvclBhcmFncmFwaChyb3csIHN0YXJ0KSwgbmV3IEN1cnNvclBhcmFncmFwaChyb3csIGVuZCkpO1xuICAgIH1cblxuICAgIGdldERpc3BsYXlMaW5lKHJvdzogbnVtYmVyLCBlbmRDb2x1bW46IG51bWJlciwgc3RhcnRDb2x1bW4/OiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBsaW5lID0gdGhpcy5kb2N1bWVudC5nZXRMaW5lKHRoaXMuZG9jdW1lbnQubGluZXMsIHJvdyk7XG5cbiAgICAgICAgcmV0dXJuIGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q29sdW1uIHx8IDAsIGVuZENvbHVtbiB8fCBsaW5lLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlQnlEb2N1bWVudEluZGV4ZXMoc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyYWdyYXBoUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBzdGFydEluZGV4KTtcbiAgICAgICAgY29uc3QgZW5kUGFyYWdyYXBoUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIHRoaXMucmVtb3ZlKG5ldyBSYW5nZShzdGFydFBhcmFncmFwaFBvc2l0aW9uLCBlbmRQYXJhZ3JhcGhQb3NpdGlvbikpO1xuICAgIH1cblxuICAgIGluc2VydFRleHRCeURvY3VtZW50SW5kZXgoaW5kZXg6IG51bWJlciwgdGV4dDogc3RyaW5nLCBzdHlsZT86IFRleHRTdHlsZU1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBpbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluc2VydFRleHQocGFyYWdyYXBoUG9zaXRpb24sIHRleHQsIHN0eWxlKTtcbiAgICB9XG5cbiAgICBpbnNlcnRFbGVtZW50QnlEb2N1bWVudEluZGV4KGluc2VydEVsZW1lbnQ6IEluc2VydEVsZW1lbnRNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIGluc2VydEVsZW1lbnQuZWxlbWVudC5pbnNlcnRJbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluc2VydEVsZW1lbnQoZWxlbWVudFBvc2l0aW9uLCBpbnNlcnRFbGVtZW50LmVsZW1lbnQpO1xuICAgIH1cblxuICAgIGluc2VydEJyZWFrQnlEb2N1bWVudEluZGV4KGluc2VydEVsZW1lbnQ6IEluc2VydEJyZWFrTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBlbGVtZW50UG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBpbnNlcnRFbGVtZW50Lmluc2VydEluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0QnJlYWsoZWxlbWVudFBvc2l0aW9uLCBpbnNlcnRFbGVtZW50LmJyZWFrVHlwZSBhcyBCcmVha1R5cGVzKTtcbiAgICB9XG5cbiAgICBpbnNlcnRUYWJCeURvY3VtZW50SW5kZXgoaW5zZXJ0RWxlbWVudDogSW5zZXJ0VGFiTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBlbGVtZW50UG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBpbnNlcnRFbGVtZW50Lmluc2VydEluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0VGFiKGVsZW1lbnRQb3NpdGlvbik7XG4gICAgfVxuXG4gICAgaW5zZXJ0SW1hZ2VCeURvY3VtZW50SW5kZXgoaW5zZXJ0RWxlbWVudDogSW5zZXJ0SW1hZ2VNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIGluc2VydEVsZW1lbnQuaW5zZXJ0SW5kZXgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRJbWFnZShlbGVtZW50UG9zaXRpb24sIGluc2VydEVsZW1lbnQuaW1hZ2VEYXRhKTtcbiAgICB9XG5cbiAgICBpbnNlcnRUYWJsZUJ5RG9jdW1lbnRJbmRleChpbnNlcnRFbGVtZW50OiBJbnNlcnRUYWJsZU1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgaW5zZXJ0RWxlbWVudC5pbnNlcnRJbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluc2VydFRhYmxlKGVsZW1lbnRQb3NpdGlvbiwgaW5zZXJ0RWxlbWVudCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0UGFyYWdyYXBoQnlEb2N1bWVudEluZGV4KGluc2VydEVsZW1lbnQ6IEluc2VydFBhcmFncmFwaE1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgaW5zZXJ0RWxlbWVudC5pbnNlcnRJbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluc2VydFBhcmFncmFwaChlbGVtZW50UG9zaXRpb24sIGluc2VydEVsZW1lbnQpO1xuICAgIH1cblxuICAgIGFwcGx5VGV4dFN0eWxlKHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlciwgdGV4dFN0eWxlOiBUZXh0U3R5bGVNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmN1cnNvclN0eWxlID0gbmV3IFRleHRTdHlsZU1vZGVsKHRleHRTdHlsZSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgc3RhcnRJbmRleCkucm93O1xuICAgICAgICBjb25zdCBlbmRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBlbmRJbmRleCkucm93O1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmFwcGx5VGV4dFN0eWxlKHRoaXMubW9kZWwsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0ZXh0U3R5bGUpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHN0YXJ0UGFyYWdyYXBoLCBlbmRQYXJhZ3JhcGgpO1xuICAgICAgICB0aGlzLnNldFN0eWxlKHRleHRTdHlsZSk7XG4gICAgfVxuXG4gICAgYXBwbHlQYXJhZ3JhcGhTdHlsZShzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIsIHBhcmFncmFwaFN0eWxlOiBQYXJhZ3JhcGhTdHlsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgc3RhcnRJbmRleCkucm93O1xuICAgICAgICBjb25zdCBlbmRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBlbmRJbmRleCkucm93O1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmFwcGx5UGFyYWdyYXBoU3R5bGUodGhpcy5tb2RlbCwgc3RhcnRJbmRleCwgZW5kSW5kZXgsIHBhcmFncmFwaFN0eWxlKTtcbiAgICAgICAgdGhpcy51cGRhdGVXcmFwRGF0YShzdGFydFBhcmFncmFwaCwgZW5kUGFyYWdyYXBoKTtcbiAgICAgICAgdGhpcy5zZXRTdHlsZShwYXJhZ3JhcGhTdHlsZSk7XG4gICAgfVxuXG4gICAgYXBwbHlFbGVtZW50U3R5bGUobW9kZWw6IEFwcGx5RWxlbWVudFN0eWxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5hcHBseUVsZW1lbnRTdHlsZSh0aGlzLm1vZGVsLCBtb2RlbCk7XG4gICAgICAgIGNvbnN0IGltYWdlQ29tcG9uZW50UmVmID0gdGhpcy5jdXN0b21Db21wb25lbnRzLmN1c3RvbUVsZW1lbnRzLmZpbmQoeCA9PiB4Lmluc3RhbmNlLmluc2VydEluZGV4ID09PSBtb2RlbC5pbnNlcnRJbmRleCk7XG4gICAgICAgIGltYWdlQ29tcG9uZW50UmVmLmluc3RhbmNlLmluaXRpYWxpemUoKTtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgbW9kZWwuaW5zZXJ0SW5kZXgpLnJvdztcbiAgICAgICAgdGhpcy51cGRhdGVXcmFwRGF0YShwYXJhZ3JhcGgsIHBhcmFncmFwaCk7XG4gICAgfVxuXG4gICAgYWRkTnVtYmVyaW5nKGxldmVsczogTnVtYmVyaW5nTGV2ZWxNb2RlbFtdLCBzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBzdGFydEluZGV4KS5yb3c7XG4gICAgICAgIGNvbnN0IGVuZFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIGVuZEluZGV4KS5yb3c7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuYWRkTnVtYmVyaW5nKHRoaXMubW9kZWwsIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMubnVtYmVyaW5ncywgc3RhcnRJbmRleCwgZW5kSW5kZXgsIGxldmVscyk7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydFBhcmFncmFwaDsgaSA8PSBlbmRQYXJhZ3JhcGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFnZXNXcmFwLnBhcmFncmFwaHNbaV0ubnVtYmVyaW5nRGF0YS5udW1iZXJpbmdJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShlbmRQYXJhZ3JhcGgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVXcmFwRGF0YShzdGFydFBhcmFncmFwaCwgZW5kUGFyYWdyYXBoKTtcbiAgICAgICAgdGhpcy5zZXROdW1iZXJpbmdTdHlsZShzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlTnVtYmVyaW5ncyhzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBzdGFydEluZGV4KS5yb3c7XG4gICAgICAgIGNvbnN0IGVuZFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIGVuZEluZGV4KS5yb3c7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIucmVtb3ZlTnVtYmVyaW5ncyh0aGlzLm1vZGVsLCB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLm51bWJlcmluZ3MsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0UGFyYWdyYXBoOyBpIDw9IGVuZFBhcmFncmFwaDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYWdlc1dyYXAucGFyYWdyYXBoc1tpXS5udW1iZXJpbmdEYXRhLm51bWJlcmluZ0lkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFBhcmFncmFwaCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHN0YXJ0UGFyYWdyYXBoLCBlbmRQYXJhZ3JhcGgpO1xuICAgICAgICB0aGlzLnNldE51bWJlcmluZ1N0eWxlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICB9XG5cbiAgICByZXN0b3JlTnVtYmVyaW5ncyhwYXJhZ3JhcGhzOiBQYXJhZ3JhcGhNb2RlbFtdLCBudW1iZXJpbmdzOiBOdW1iZXJpbmdNb2RlbFtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBwYXJhZ3JhcGhzWzBdLmluc2VydEluZGV4O1xuICAgICAgICBjb25zdCBlbmRJbmRleCA9IHBhcmFncmFwaHNbcGFyYWdyYXBocy5sZW5ndGggLSAxXS5pbnNlcnRJbmRleDtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBzdGFydEluZGV4KS5yb3c7XG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhXaXRoT2Zmc2V0KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCB0aGlzLmRvY3VtZW50LmxpbmVzLCBlbmRJbmRleCk7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIucmVzdG9yZU51bWJlcmluZ3ModGhpcy5tb2RlbCwgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdzLCBwYXJhZ3JhcGhzLCBudW1iZXJpbmdzKTtcbiAgICAgICAgZm9yIChjb25zdCBwYXJhZ3JhcGggb2YgcGFyYWdyYXBocykge1xuICAgICAgICAgICAgaWYgKHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5udW1iZXJpbmdJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVXcmFwRGF0YShzdGFydFBhcmFncmFwaCwgZW5kUG9zaXRpb24ucm93KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9zaXRpb24pO1xuICAgICAgICB0aGlzLnNldE51bWJlcmluZ1N0eWxlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICB9XG5cbiAgICBhcHBseUltYWdlU3R5bGUoYXBwbHlJbWFnZTogQXBwbHlJbWFnZVN0eWxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW1hZ2VDb21wb25lbnRSZWYgPSB0aGlzLmN1c3RvbUNvbXBvbmVudHMuaW1hZ2VzLmZpbmQoeCA9PiB4Lmluc3RhbmNlLmluc2VydEluZGV4ID09PSBhcHBseUltYWdlLmluc2VydEluZGV4KTtcbiAgICAgICAgaW1hZ2VDb21wb25lbnRSZWYuaW5zdGFuY2UucmVzaXplKHsgd2lkdGg6IGFwcGx5SW1hZ2Uud2lkdGgsIGhlaWdodDogYXBwbHlJbWFnZS5oZWlnaHQgfSk7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuYXBwbHlJbWFnZVN0eWxlKHRoaXMubW9kZWwsIGFwcGx5SW1hZ2UpO1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuZG9jdW1lbnQuaW5kZXhUb1Bvc2l0aW9uKGFwcGx5SW1hZ2UuaW5zZXJ0SW5kZXgsIDApO1xuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHN0YXJ0LnJvdywgdGhpcy5kb2N1bWVudC5saW5lcy5sZW5ndGggLSAxKTtcbiAgICB9XG5cbiAgICByZXN0b3JlVGV4dFN0eWxlcyhmb3JtYXRzOiBGb3JtYXRNb2RlbFtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBmb3JtYXRzWzBdLnN0YXJ0SW5kZXg7XG4gICAgICAgIGNvbnN0IGVuZEluZGV4ID0gZm9ybWF0c1tmb3JtYXRzLmxlbmd0aCAtIDFdLmVuZEluZGV4O1xuICAgICAgICBjb25zdCBzdGFydFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHN0YXJ0SW5kZXgpLnJvdztcbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaFdpdGhPZmZzZXQodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHRoaXMuZG9jdW1lbnQubGluZXMsIGVuZEluZGV4KTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZXN0b3JlVGV4dFN0eWxlcyh0aGlzLm1vZGVsLCBmb3JtYXRzKTtcbiAgICAgICAgdGhpcy51cGRhdGVXcmFwRGF0YShzdGFydFBhcmFncmFwaCwgZW5kUG9zaXRpb24ucm93KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9zaXRpb24pO1xuICAgICAgICB0aGlzLnByb2Nlc3NTZWxlY3Rpb25TdHlsZXMoKTtcbiAgICB9XG5cbiAgICByZXN0b3JlUGFyYWdyYXBoU3R5bGVzKHBhcmFncmFwaHM6IFBhcmFncmFwaE1vZGVsW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IHBhcmFncmFwaHNbMF0uaW5zZXJ0SW5kZXg7XG4gICAgICAgIGNvbnN0IGVuZEluZGV4ID0gcGFyYWdyYXBoc1twYXJhZ3JhcGhzLmxlbmd0aCAtIDFdLmluc2VydEluZGV4O1xuICAgICAgICBjb25zdCBzdGFydFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHN0YXJ0SW5kZXgpLnJvdztcbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaFdpdGhPZmZzZXQodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHRoaXMuZG9jdW1lbnQubGluZXMsIGVuZEluZGV4KTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZXN0b3JlUGFyYWdyYXBoU3R5bGVzKHRoaXMubW9kZWwsIHBhcmFncmFwaHMpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHN0YXJ0UGFyYWdyYXBoLCBlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG4gICAgICAgIHRoaXMucHJvY2Vzc1NlbGVjdGlvblN0eWxlcygpO1xuICAgIH1cblxuICAgIHNldFRleHRTdHlsZSh0ZXh0U3R5bGU6IFRleHRTdHlsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3Vyc29yU3R5bGUgPSBuZXcgVGV4dFN0eWxlTW9kZWwodGV4dFN0eWxlKTtcbiAgICAgICAgdGhpcy5zZXRTdHlsZSh0ZXh0U3R5bGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGByYW5nZWAgZnJvbSB0aGUgZG9jdW1lbnQuXG4gICAgICogSWYgYHJhbmdlYCBpcyBlbXB0eSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB1bm1vZGlmaWVkIHZhbHVlIG9mIGByYW5nZS5zdGFydGAuXG4gICAgICovXG4gICAgcmVtb3ZlKHJhbmdlOiBSYW5nZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJ0SW5kZXhlcyA9IENvbnRlbnRIZWxwZXIuZ2V0U2VsZWN0ZWRQYXJ0RG9jdW1lbnRJbmRleGVzKHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCByYW5nZSk7XG5cbiAgICAgICAgdGhpcy5kb2N1bWVudC5yZW1vdmVSYW5nZShyYW5nZSk7XG5cbiAgICAgICAgQ3VzdG9tQ29tcG9uZW50SGVscGVyLmFwcGx5UmVtb3ZpbmdDb21wb25lbnRzKHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMsIHBhcnRJbmRleGVzLnN0YXJ0SW5kZXgsIHBhcnRJbmRleGVzLmVuZEluZGV4KTtcbiAgICAgICAgQ3VzdG9tQ29tcG9uZW50SGVscGVyLmFwcGx5UmVtb3ZpbmdDb21wb25lbnRzKHRoaXMuY3VzdG9tQ29tcG9uZW50cy5pbWFnZXMsIHBhcnRJbmRleGVzLnN0YXJ0SW5kZXgsIHBhcnRJbmRleGVzLmVuZEluZGV4KTtcbiAgICAgICAgQ3VzdG9tQ29tcG9uZW50SGVscGVyLmFwcGx5UmVtb3ZpbmdDb21wb25lbnRzKHRoaXMuY3VzdG9tQ29tcG9uZW50cy5jdXN0b21FbGVtZW50cywgcGFydEluZGV4ZXMuc3RhcnRJbmRleCwgcGFydEluZGV4ZXMuZW5kSW5kZXgpO1xuICAgICAgICBDdXN0b21Db21wb25lbnRIZWxwZXIuYXBwbHlSZW1vdmluZ0NvbXBvbmVudHModGhpcy5jdXN0b21Db21wb25lbnRzLnRhYnMsIHBhcnRJbmRleGVzLnN0YXJ0SW5kZXgsIHBhcnRJbmRleGVzLmVuZEluZGV4KTtcblxuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmRlbGV0ZSh0aGlzLm1vZGVsLCBwYXJ0SW5kZXhlcy5zdGFydEluZGV4LCBwYXJ0SW5kZXhlcy5lbmRJbmRleCk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IocmFuZ2Uuc3RhcnQpO1xuICAgICAgICB0aGlzLnVwZGF0ZUludGVybmFsRGF0YU9uRGVsZXRlVGV4dChyYW5nZS5zdGFydC5yb3csIHJhbmdlLmVuZC5yb3cpO1xuXG4gICAgICAgIHRoaXMucHJvY2Vzc1NlbGVjdGlvblN0eWxlcygpO1xuICAgIH1cblxuICAgIHJlcGxhY2UobW9kZWw6IFJlcGxhY2VNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIHRoaXMucmVtb3ZlQnlEb2N1bWVudEluZGV4ZXMobW9kZWwuZGVsZXRlLnN0YXJ0SW5kZXgsIG1vZGVsLmRlbGV0ZS5lbmRJbmRleCArIDEpO1xuICAgICAgICBsZXQgZW5kUG9pbnQ6IEN1cnNvclBhcmFncmFwaDtcbiAgICAgICAgaWYgKG1vZGVsLmluc2VydFRleHQpIHtcbiAgICAgICAgICAgIGVuZFBvaW50ID0gdGhpcy5pbnNlcnRUZXh0QnlEb2N1bWVudEluZGV4KG1vZGVsLmluc2VydFRleHQuaW5zZXJ0SW5kZXgsIG1vZGVsLmluc2VydFRleHQudGV4dCk7XG4gICAgICAgIH0gZWxzZSBpZiAobW9kZWwuaW5zZXJ0UGFyYWdyYXBoKSB7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0UGFyYWdyYXBoQnlEb2N1bWVudEluZGV4KG1vZGVsLmluc2VydFBhcmFncmFwaCk7XG4gICAgICAgIH0gZWxzZSBpZiAobW9kZWwuaW5zZXJ0RWxlbWVudCkge1xuICAgICAgICAgICAgZW5kUG9pbnQgPSB0aGlzLmluc2VydEVsZW1lbnRCeURvY3VtZW50SW5kZXgobW9kZWwuaW5zZXJ0RWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAobW9kZWwuaW5zZXJ0QnJlYWspIHtcbiAgICAgICAgICAgIGVuZFBvaW50ID0gdGhpcy5pbnNlcnRCcmVha0J5RG9jdW1lbnRJbmRleChtb2RlbC5pbnNlcnRCcmVhayk7XG4gICAgICAgIH0gZWxzZSBpZiAobW9kZWwuaW5zZXJ0VGFiKSB7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0VGFiQnlEb2N1bWVudEluZGV4KG1vZGVsLmluc2VydFRhYik7XG4gICAgICAgIH0gZWxzZSBpZiAobW9kZWwuaW5zZXJ0SW1hZ2UpIHtcbiAgICAgICAgICAgIGVuZFBvaW50ID0gdGhpcy5pbnNlcnRJbWFnZUJ5RG9jdW1lbnRJbmRleChtb2RlbC5pbnNlcnRJbWFnZSk7XG4gICAgICAgIH0gZWxzZSBpZiAobW9kZWwuaW5zZXJ0VGFibGUpIHtcbiAgICAgICAgICAgIGVuZFBvaW50ID0gdGhpcy5pbnNlcnRUYWJsZUJ5RG9jdW1lbnRJbmRleChtb2RlbC5pbnNlcnRUYWJsZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZW5kUG9pbnQ7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGV4dChwb3NpdGlvbjogQ3Vyc29yUGFyYWdyYXBoLCB0ZXh0OiBzdHJpbmcsIGN1cnNvclN0eWxlPzogVGV4dFN0eWxlTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHBvc2l0aW9uKTtcbiAgICAgICAgaWYgKGN1cnNvclN0eWxlKSB7XG4gICAgICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydFN0eWxlZFRleHQodGhpcy5tb2RlbCwgdGV4dCwgaW5zZXJ0SW5kZXgsIGN1cnNvclN0eWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuaW5zZXJ0VGV4dCh0aGlzLm1vZGVsLCB0ZXh0LCBpbnNlcnRJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSB0aGlzLmRvY3VtZW50Lmluc2VydFRleHQocG9zaXRpb24sIHRleHQpO1xuICAgICAgICB0aGlzLnVwZGF0ZUludGVybmFsRGF0YU9uSW5zZXJ0VGV4dChwb3NpdGlvbi5yb3csIGVuZFBvc2l0aW9uLnJvdyk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIGVuZFBvc2l0aW9uO1xuICAgIH1cblxuICAgIGluc2VydEVsZW1lbnQocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCwgZWxlbWVudDogRWxlbWVudERhdGFNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgcG9zaXRpb24pO1xuICAgICAgICBjb25zdCBpbnNlcnRFbGVtZW50ID0gbmV3IEluc2VydEVsZW1lbnRNb2RlbCh7IGVsZW1lbnQ6IG5ldyBFbGVtZW50TW9kZWwoeyBpbnNlcnRJbmRleCwgLi4uZWxlbWVudCB9KSB9KTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRFbGVtZW50KHRoaXMubW9kZWwsIGluc2VydEVsZW1lbnQpO1xuXG4gICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbC5lbGVtZW50cy5maW5kKHggPT4geC5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy5jdXN0b21Db250ZW50U2VydmljZS5maW5kQ29tcG9uZW50VHlwZShtb2RlbC50eXBlKTtcbiAgICAgICAgdGhpcy5hZGRDb21wb25lbnQodGhpcy5jdXN0b21Db21wb25lbnRzLmN1c3RvbUVsZW1lbnRzLCBtb2RlbCwgdHlwZSk7XG5cbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSB0aGlzLmRvY3VtZW50Lmluc2VydFRleHQocG9zaXRpb24sIENVU1RPTV9FTEVNRU5UX01BUktFUik7XG4gICAgICAgIHRoaXMudXBkYXRlV3JhcERhdGEocG9zaXRpb24ucm93LCBlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG4gICAgICAgIHJldHVybiBlbmRQb3NpdGlvbjtcbiAgICB9XG5cbiAgICBpbnNlcnRCcmVhayhwb3NpdGlvbjogQ3Vyc29yUGFyYWdyYXBoLCBicmVha1R5cGU6IEJyZWFrVHlwZXMpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgaXNPbk5ld1BhcmFncmFwaCA9XG4gICAgICAgICAgICBicmVha1R5cGUgPT09IEJyZWFrVHlwZXMuUGFnZSAmJlxuICAgICAgICAgICAgQnJlYWtIZWxwZXIuZ2V0QnJlYWtUeXBlKHRoaXMubW9kZWwsIENVU1RPTV9FTEVNRU5UX01BUktFUiwgaW5zZXJ0SW5kZXggLSAxKSAhPT0gQnJlYWtUeXBlcy5QYWdlO1xuICAgICAgICBjb25zdCB0ZXh0ID0gaXNPbk5ld1BhcmFncmFwaCA/IGAke05FV19MSU5FX01BUktVUH0ke0NVU1RPTV9FTEVNRU5UX01BUktFUn1gIDogQ1VTVE9NX0VMRU1FTlRfTUFSS0VSO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydEJyZWFrKHRoaXMubW9kZWwsIHRleHQsIGluc2VydEluZGV4LCBicmVha1R5cGUpO1xuXG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gdGhpcy5kb2N1bWVudC5pbnNlcnRUZXh0KHBvc2l0aW9uLCB0ZXh0KTtcbiAgICAgICAgaWYgKGlzT25OZXdQYXJhZ3JhcGgpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW50ZXJuYWxEYXRhT25JbnNlcnRUZXh0KHBvc2l0aW9uLnJvdywgZW5kUG9zaXRpb24ucm93KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlV3JhcERhdGEocG9zaXRpb24ucm93LCBlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSB0aGlzLmRvY3VtZW50LmdldFBvc2l0aW9uQWZ0ZXJCcmVhayhlbmRQb3NpdGlvbiwgYnJlYWtUeXBlKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoY3Vyc29yUG9zaXRpb24pO1xuXG4gICAgICAgIHJldHVybiBlbmRQb3NpdGlvbjtcbiAgICB9XG5cbiAgICBpbnNlcnRUYWIocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgcG9zaXRpb24pO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydFRhYih0aGlzLm1vZGVsLCBpbnNlcnRJbmRleCk7XG5cbiAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsLnRhYnMuZmluZCh4ID0+IHguaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5hZGRDb21wb25lbnQodGhpcy5jdXN0b21Db21wb25lbnRzLnRhYnMsIG1vZGVsLCBOb2RlclRhYkNvbXBvbmVudCk7XG5cbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSB0aGlzLmRvY3VtZW50Lmluc2VydFRleHQocG9zaXRpb24sIENVU1RPTV9FTEVNRU5UX01BUktFUik7XG4gICAgICAgIHRoaXMudXBkYXRlV3JhcERhdGEocG9zaXRpb24ucm93LCBwb3NpdGlvbi5yb3cpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG4gICAgICAgIHJldHVybiBlbmRQb3NpdGlvbjtcbiAgICB9XG5cbiAgICBpbnNlcnRJbWFnZShwb3NpdGlvbjogQ3Vyc29yUGFyYWdyYXBoLCBpbWFnZURhdGE6IEltYWdlRGF0YU1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFBvc2l0aW9uVG9Eb2N1bWVudEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBwb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IGFkanVzdGVkSW1hZ2UgPSB0aGlzLmdldEltYWdlV2l0aEFsbG93ZWRTaXplKGltYWdlRGF0YSwgdGhpcy5jb250ZW50V2lkdGgpO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydEltYWdlKHRoaXMubW9kZWwsIGluc2VydEluZGV4LCBhZGp1c3RlZEltYWdlKTtcblxuICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWwuaW1hZ2VzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KHRoaXMuY3VzdG9tQ29tcG9uZW50cy5pbWFnZXMsIG1vZGVsLCBOb2RlckltYWdlQ29tcG9uZW50KTtcblxuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IHRoaXMuZG9jdW1lbnQuaW5zZXJ0VGV4dChwb3NpdGlvbiwgQ1VTVE9NX0VMRU1FTlRfTUFSS0VSKTtcbiAgICAgICAgdGhpcy51cGRhdGVXcmFwRGF0YShwb3NpdGlvbi5yb3csIHBvc2l0aW9uLnJvdyk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvc2l0aW9uKTtcblxuICAgICAgICByZXR1cm4gZW5kUG9zaXRpb247XG4gICAgfVxuXG4gICAgaW5zZXJ0TGluayhwb3NpdGlvbjogQ3Vyc29yUGFyYWdyYXBoLCBsaW5rRGF0YTogTGlua0RhdGFNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgcG9zaXRpb24pO1xuICAgICAgICBjb25zdCBsaW5rU3R5bGUgPSBuZXcgVGV4dFN0eWxlTW9kZWwoeyBoZWFkaW5nU3R5bGVJZDogSFlQRVJMSU5LX0hFQURJTkdfU1RZTEVfSUQsIHVuZGVybGluZTogdHJ1ZSB9KTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRMaW5rKHRoaXMubW9kZWwsIGxpbmtEYXRhLnRleHQsIGxpbmtEYXRhLmxpbmssIGluc2VydEluZGV4LCBsaW5rU3R5bGUpO1xuXG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gdGhpcy5kb2N1bWVudC5pbnNlcnRUZXh0KHBvc2l0aW9uLCBsaW5rRGF0YS50ZXh0KTtcbiAgICAgICAgdGhpcy51cGRhdGVXcmFwRGF0YShwb3NpdGlvbi5yb3csIHBvc2l0aW9uLnJvdyk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIGVuZFBvc2l0aW9uO1xuICAgIH1cblxuICAgIGluc2VydFRhYmxlKHBvc2l0aW9uOiBDdXJzb3JQYXJhZ3JhcGgsIHRhYmxlTW9kZWw6IEluc2VydFRhYmxlTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHBvc2l0aW9uKTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRUYWJsZSh0aGlzLm1vZGVsLCBpbnNlcnRJbmRleCwgdGFibGVNb2RlbCwgdGhpcy5wYWdlc1dyYXAuY29udGVudFdpZHRoKTtcbiAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsLnRhYmxlcy5maW5kKHggPT4geC5pbnNlcnRJbmRleCA9PT0gdGFibGVNb2RlbC5pbnNlcnRUYWJsZUluZGV4KTtcbiAgICAgICAgdGhpcy5hZGRDb21wb25lbnQodGhpcy5jdXN0b21Db21wb25lbnRzLnRhYmxlcywgbW9kZWwsIE5vZGVyVGFibGVDb21wb25lbnQpO1xuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IHRoaXMuZG9jdW1lbnQuaW5zZXJ0VGV4dChwb3NpdGlvbiwgdGFibGVNb2RlbC5jb250ZW50KTtcbiAgICAgICAgdGhpcy51cGRhdGVJbnRlcm5hbERhdGFPbkluc2VydFRleHQocG9zaXRpb24ucm93LCBlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG4gICAgICAgIHJldHVybiBlbmRQb3NpdGlvbjtcbiAgICB9XG5cbiAgICBpbnNlcnRQYXJhZ3JhcGgocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCwgcGFyYWdyYXBoTW9kZWw6IEluc2VydFBhcmFncmFwaE1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFBvc2l0aW9uVG9Eb2N1bWVudEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBwb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHRleHQgPSBPcGVyYXRpb25zSGVscGVyLmluc2VydFBhcmFncmFwaCh0aGlzLm1vZGVsLCBpbnNlcnRJbmRleCwgcGFyYWdyYXBoTW9kZWwsIHRoaXMucGFnZXNXcmFwLmNvbnRlbnRXaWR0aCk7XG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gdGhpcy5kb2N1bWVudC5pbnNlcnRUZXh0KHBvc2l0aW9uLCB0ZXh0KTtcbiAgICAgICAgdGhpcy51cGRhdGVJbnRlcm5hbERhdGFPbkluc2VydFRleHQocG9zaXRpb24ucm93LCBlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICBsZXQgZW5kUG9pbnQ6IEN1cnNvclBhcmFncmFwaDtcbiAgICAgICAgaWYgKHBhcmFncmFwaE1vZGVsLmluc2VydFRleHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFncmFwaFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleChcbiAgICAgICAgICAgICAgICB0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCxcbiAgICAgICAgICAgICAgICBwYXJhZ3JhcGhNb2RlbC5pbnNlcnRUZXh0Lmluc2VydEluZGV4XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZW5kUG9pbnQgPSB0aGlzLmRvY3VtZW50Lmluc2VydFRleHQocGFyYWdyYXBoUG9zaXRpb24sIHRleHQpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVJbnRlcm5hbERhdGFPbkluc2VydFRleHQocGFyYWdyYXBoUG9zaXRpb24ucm93LCBlbmRQb2ludC5yb3cpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9pbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcmFncmFwaE1vZGVsLmluc2VydEltYWdlKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGhQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgoXG4gICAgICAgICAgICAgICAgdGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsXG4gICAgICAgICAgICAgICAgcGFyYWdyYXBoTW9kZWwuaW5zZXJ0SW1hZ2UuaW5zZXJ0SW5kZXhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBpbWFnZUluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsLmltYWdlcy5maW5kKHggPT4geC5pbnNlcnRJbmRleCA9PT0gaW1hZ2VJbnNlcnRJbmRleCk7XG4gICAgICAgICAgICB0aGlzLmFkZENvbXBvbmVudCh0aGlzLmN1c3RvbUNvbXBvbmVudHMuaW1hZ2VzLCBtb2RlbCwgTm9kZXJJbWFnZUNvbXBvbmVudCk7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuZG9jdW1lbnQuaW5zZXJ0VGV4dChwYXJhZ3JhcGhQb3NpdGlvbiwgQ1VTVE9NX0VMRU1FTlRfTUFSS0VSKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlV3JhcERhdGEocGFyYWdyYXBoUG9zaXRpb24ucm93LCBwYXJhZ3JhcGhQb3NpdGlvbi5yb3cpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9pbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcmFncmFwaE1vZGVsLmluc2VydFRhYmxlKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGhQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgoXG4gICAgICAgICAgICAgICAgdGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsXG4gICAgICAgICAgICAgICAgcGFyYWdyYXBoTW9kZWwuaW5zZXJ0VGFibGUuaW5zZXJ0SW5kZXhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWwudGFibGVzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSBwYXJhZ3JhcGhNb2RlbC5pbnNlcnRUYWJsZS5pbnNlcnRUYWJsZUluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMsIG1vZGVsLCBOb2RlclRhYmxlQ29tcG9uZW50KTtcbiAgICAgICAgICAgIGVuZFBvaW50ID0gdGhpcy5kb2N1bWVudC5pbnNlcnRUZXh0KHBhcmFncmFwaFBvc2l0aW9uLCBwYXJhZ3JhcGhNb2RlbC5pbnNlcnRUYWJsZS5jb250ZW50KTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW50ZXJuYWxEYXRhT25JbnNlcnRUZXh0KHBhcmFncmFwaFBvc2l0aW9uLnJvdywgZW5kUG9pbnQucm93KTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvaW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW5kUG9pbnQ7XG4gICAgfVxuXG4gICAgYWRkQ29tcG9uZW50PFQgZXh0ZW5kcyBCYXNlTm9kZXJDb21wb25lbnQ+KGN1c3RvbUVsZW1lbnRzOiBDb21wb25lbnRSZWY8VD5bXSwgbW9kZWw6IEN1c3RvbUNvbnRlbnQsIGNvbXBvbmVudFR5cGU6IFR5cGU8VD4pIHtcbiAgICAgICAgY29uc3QgY3VzdG9tRWxlbWVudCA9IHRoaXMuY3VzdG9tQ29udGVudFNlcnZpY2UuY29tcG9uZW50U2VydmljZS5nZW5lcmF0ZUNvbXBvbmVudChjb21wb25lbnRUeXBlLCB7XG4gICAgICAgICAgICBjb250ZW50OiBtb2RlbCxcbiAgICAgICAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICAgICAgICBnZW5lcmFsUHJvcGVydGllczogdGhpcy5nZW5lcmFsUHJvcGVydGllcyxcbiAgICAgICAgICAgIGNvbnRlbnRXaWR0aDogdGhpcy5jb250ZW50V2lkdGhcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5ld0VsZW1lbnRQb3NpdGlvbiA9IGN1c3RvbUVsZW1lbnRzLmZpbmRJbmRleCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPiBtb2RlbC5pbnNlcnRJbmRleCk7XG4gICAgICAgIGlmIChuZXdFbGVtZW50UG9zaXRpb24gPj0gMCkge1xuICAgICAgICAgICAgY3VzdG9tRWxlbWVudHMuc3BsaWNlKG5ld0VsZW1lbnRQb3NpdGlvbiwgMCwgY3VzdG9tRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXN0b21FbGVtZW50cy5wdXNoKGN1c3RvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0U3R5bGUoc3R5bGU6IFRleHRTdHlsZU1vZGVsIHwgUGFyYWdyYXBoU3R5bGVNb2RlbCk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzdHlsZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0eWxlc01hcFtrZXldID0gc3R5bGVba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2lnbmFsKCdzZXRTdHlsZXMnLCB0aGlzLl9zdHlsZXNNYXApO1xuICAgIH1cblxuICAgIHNldFN0eWxlcyhzdHlsZXM6IHsgW2tleTogc3RyaW5nXTogYW55W10gfSk6IHZvaWQge1xuICAgICAgICBmb3IgKGxldCBrZXkgb2YgT2JqZWN0LmtleXMoc3R5bGVzKSkge1xuICAgICAgICAgICAgaWYgKHN0eWxlc1trZXldLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0eWxlc01hcFtrZXldID0gQ29udGVudFN0eWxlSGVscGVyLmdldERlZmF1bHRTdHlsZVZhbHVlQnlLZXkoa2V5KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3R5bGVzW2tleV0ubGVuZ3RoID4gMSAmJiAhc3R5bGVzW2tleV0uZXZlcnkoeCA9PiB4ID09PSBzdHlsZXNba2V5XVswXSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdHlsZXNNYXBba2V5XSA9IHR5cGVvZiBzdHlsZXNba2V5XVswXSA9PT0gJ2Jvb2xlYW4nICYmIGtleSAhPT0gJ2lzQnVsbGV0TWFya2VyJyA/IGZhbHNlIDogbnVsbDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fc3R5bGVzTWFwW2tleV0gPSBzdHlsZXNba2V5XVswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2lnbmFsKCdzZXRTdHlsZXMnLCB0aGlzLl9zdHlsZXNNYXApO1xuICAgIH1cblxuICAgIHNldE51bWJlcmluZ1N0eWxlKHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBzdHlsZXMgPSB7XG4gICAgICAgICAgICBhbGlnbm1lbnQ6IFt0aGlzLl9zdHlsZXNNYXAuYWxpZ25tZW50XSxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogW3RoaXMuX3N0eWxlc01hcC5iYWNrZ3JvdW5kQ29sb3JdLFxuICAgICAgICAgICAgaGlnaGxpZ2h0Q29sb3I6IFt0aGlzLl9zdHlsZXNNYXAuaGlnaGxpZ2h0Q29sb3JdLFxuICAgICAgICAgICAgZm9udENvbG9yOiBbdGhpcy5fc3R5bGVzTWFwLmZvbnRDb2xvcl0sXG4gICAgICAgICAgICBmb250RmFtaWx5OiBbdGhpcy5fc3R5bGVzTWFwLmZvbnRGYW1pbHldLFxuICAgICAgICAgICAgZm9udFNpemU6IFt0aGlzLl9zdHlsZXNNYXAuZm9udFNpemVdLFxuICAgICAgICAgICAgaXRhbGljOiBbdGhpcy5fc3R5bGVzTWFwLml0YWxpY10sXG4gICAgICAgICAgICBib2xkOiBbdGhpcy5fc3R5bGVzTWFwLmJvbGRdLFxuICAgICAgICAgICAgc3RyaWtldGhyb3VnaDogW3RoaXMuX3N0eWxlc01hcC5zdHJpa2V0aHJvdWdoXSxcbiAgICAgICAgICAgIHVuZGVybGluZTogW3RoaXMuX3N0eWxlc01hcC51bmRlcmxpbmVdLFxuICAgICAgICAgICAgc3BhY2VCZWZvcmU6IFt0aGlzLl9zdHlsZXNNYXAuc3BhY2VCZWZvcmVdLFxuICAgICAgICAgICAgc3BhY2VBZnRlcjogW3RoaXMuX3N0eWxlc01hcC5zcGFjZUFmdGVyXSxcbiAgICAgICAgICAgIGluZGVudExlZnQ6IFt0aGlzLl9zdHlsZXNNYXAuaW5kZW50TGVmdF0sXG4gICAgICAgICAgICBpbmRlbnRSaWdodDogW3RoaXMuX3N0eWxlc01hcC5pbmRlbnRSaWdodF0sXG4gICAgICAgICAgICBpc0J1bGxldE1hcmtlcjogW10sXG4gICAgICAgICAgICBudW1iZXJpbmdMZXZlbHNTdHlsZXM6IFtdXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudXBkYXRlTnVtYmVyaW5nU3R5bGVzKHN0eWxlcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICB0aGlzLnNldFN0eWxlcyhzdHlsZXMpO1xuICAgIH1cblxuICAgIHJlc3RvcmUobW9kZWw6IFJlc3RvcmVNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGhQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIG1vZGVsLnN0YXJ0SW5kZXgpO1xuICAgICAgICBpZiAobW9kZWwuc3RhcnRJbmRleCAhPT0gbW9kZWwuZW5kSW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQnlEb2N1bWVudEluZGV4ZXMobW9kZWwuc3RhcnRJbmRleCwgbW9kZWwuZW5kSW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZXN0b3JlKHRoaXMubW9kZWwsIG1vZGVsKTtcblxuICAgICAgICBjb25zdCByZXN0b3JlRW5kSW5kZXggPSBtb2RlbC5zdGFydEluZGV4ICsgbW9kZWwudGV4dC5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzdG9yZUNvbXBvbmVudHModGhpcy5tb2RlbC50YWJsZXMsIHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMsIE5vZGVyVGFibGVDb21wb25lbnQsIG1vZGVsLnN0YXJ0SW5kZXgsIHJlc3RvcmVFbmRJbmRleCk7XG4gICAgICAgIHRoaXMucmVzdG9yZUNvbXBvbmVudHModGhpcy5tb2RlbC5pbWFnZXMsIHRoaXMuY3VzdG9tQ29tcG9uZW50cy5pbWFnZXMsIE5vZGVySW1hZ2VDb21wb25lbnQsIG1vZGVsLnN0YXJ0SW5kZXgsIHJlc3RvcmVFbmRJbmRleCk7XG4gICAgICAgIHRoaXMucmVzdG9yZUNvbXBvbmVudHModGhpcy5tb2RlbC50YWJzLCB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFicywgTm9kZXJUYWJDb21wb25lbnQsIG1vZGVsLnN0YXJ0SW5kZXgsIHJlc3RvcmVFbmRJbmRleCk7XG4gICAgICAgIHRoaXMucmVzdG9yZUVsZW1lbnRDb21wb25lbnRzKHRoaXMubW9kZWwuZWxlbWVudHMsIG1vZGVsLnN0YXJ0SW5kZXgsIHJlc3RvcmVFbmRJbmRleCk7XG5cbiAgICAgICAgY29uc3QgZW5kUG9pbnQgPSB0aGlzLmRvY3VtZW50Lmluc2VydFRleHQocGFyYWdyYXBoUG9zaXRpb24sIG1vZGVsLnRleHQpO1xuICAgICAgICB0aGlzLnVwZGF0ZUludGVybmFsRGF0YU9uSW5zZXJ0VGV4dChwYXJhZ3JhcGhQb3NpdGlvbi5yb3csIGVuZFBvaW50LnJvdyk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvaW50KTtcbiAgICAgICAgdGhpcy5wcm9jZXNzU2VsZWN0aW9uU3R5bGVzKCk7XG4gICAgfVxuXG4gICAgcmVzdG9yZUNvbXBvbmVudHM8VCBleHRlbmRzIEJhc2VOb2RlckNvbXBvbmVudD4oXG4gICAgICAgIG1vZGVsczogQ3VzdG9tQ29udGVudFtdLFxuICAgICAgICBjb21wb25lbnRzOiBDb21wb25lbnRSZWY8QmFzZU5vZGVyQ29tcG9uZW50PltdLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBUeXBlPFQ+LFxuICAgICAgICByZXN0b3JlSW5kZXg6IG51bWJlcixcbiAgICAgICAgcmVzdG9yZUVuZEluZGV4OiBudW1iZXJcbiAgICApOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBtb2RlbCBvZiBtb2RlbHMpIHtcbiAgICAgICAgICAgIGlmIChtb2RlbC5pbnNlcnRJbmRleCA8IHJlc3RvcmVJbmRleCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5pbnNlcnRJbmRleCA+PSByZXN0b3JlRW5kSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KGNvbXBvbmVudHMsIG1vZGVsLCBjb21wb25lbnRUeXBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc3RvcmVFbGVtZW50Q29tcG9uZW50cyhlbGVtZW50czogRWxlbWVudE1vZGVsW10sIHJlc3RvcmVJbmRleDogbnVtYmVyLCByZXN0b3JlRW5kSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIGVsZW1lbnRzKSB7XG4gICAgICAgICAgICBpZiAobW9kZWwuaW5zZXJ0SW5kZXggPCByZXN0b3JlSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZWwuaW5zZXJ0SW5kZXggPj0gcmVzdG9yZUVuZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gdGhpcy5jdXN0b21Db250ZW50U2VydmljZS5maW5kQ29tcG9uZW50VHlwZShtb2RlbC50eXBlKTtcbiAgICAgICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KHRoaXMuY3VzdG9tQ29tcG9uZW50cy5jdXN0b21FbGVtZW50cywgbW9kZWwsIHR5cGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvY2Vzc1NlbGVjdGlvblN0eWxlcygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBzdGFydEluZGV4LCBlbmRJbmRleCB9ID0gdGhpcy5nZXRSYW5nZUluZGV4ZXModGhpcy5zZWxlY3Rpb24ucmFuZ2UpO1xuXG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IHtcbiAgICAgICAgICAgIGFsaWdubWVudDogW10sXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFtdLFxuICAgICAgICAgICAgaGlnaGxpZ2h0Q29sb3I6IFtdLFxuICAgICAgICAgICAgZm9udENvbG9yOiBbXSxcbiAgICAgICAgICAgIGZvbnRGYW1pbHk6IFtdLFxuICAgICAgICAgICAgZm9udFNpemU6IFtdLFxuICAgICAgICAgICAgaXRhbGljOiBbXSxcbiAgICAgICAgICAgIGJvbGQ6IFtdLFxuICAgICAgICAgICAgc3RyaWtldGhyb3VnaDogW10sXG4gICAgICAgICAgICB1bmRlcmxpbmU6IFtdLFxuICAgICAgICAgICAgc3BhY2VCZWZvcmU6IFtdLFxuICAgICAgICAgICAgc3BhY2VBZnRlcjogW10sXG4gICAgICAgICAgICBpbmRlbnRMZWZ0OiBbXSxcbiAgICAgICAgICAgIGluZGVudFJpZ2h0OiBbXSxcbiAgICAgICAgICAgIGlzQnVsbGV0TWFya2VyOiBbXSxcbiAgICAgICAgICAgIG51bWJlcmluZ0xldmVsc1N0eWxlczogW11cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy51cGRhdGVQYXJhZ3JhcGhTdHlsZXMoc3R5bGVzLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIHRoaXMudXBkYXRlTnVtYmVyaW5nU3R5bGVzKHN0eWxlcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICBjb25zdCBmb3JtYXQgPSB0aGlzLnVwZGF0ZVRleHRTdHlsZXMoc3R5bGVzLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIHRoaXMuc2V0U3R5bGVzKHN0eWxlcyk7XG5cbiAgICAgICAgaWYgKGZvcm1hdCkge1xuICAgICAgICAgICAgdGhpcy5jdXJzb3JTdHlsZSA9IE9iamVjdC5hc3NpZ24oe30sIGZvcm1hdC50ZXh0U3R5bGUsIHRoaXMuY3Vyc29yU3R5bGUpO1xuICAgICAgICAgICAgdGhpcy5zZXRTdHlsZSh0aGlzLmN1cnNvclN0eWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3Vyc29yU3R5bGUgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0TGlua01vZGVsKGN1cnNvcjogQ3Vyc29yUGFyYWdyYXBoKTogTGlua01vZGVsIHtcbiAgICAgICAgY29uc3QgeyBzdGFydEluZGV4LCBlbmRJbmRleCB9ID0gdGhpcy5nZXRSYW5nZUluZGV4ZXMobmV3IFJhbmdlKGN1cnNvciwgY3Vyc29yKSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsLmxpbmtzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4IDw9IHN0YXJ0SW5kZXggKyAxICYmIHguZW5kSW5kZXggPiBlbmRJbmRleCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGVSb3dzKGluc2VydEluZGV4OiBudW1iZXIsIHJvd3NDb3VudDogbnVtYmVyLCB0YXJnZXRJbmRleDogbnVtYmVyLCBpbmhlcml0SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydFRhYmxlUm93cyh0aGlzLm1vZGVsLCBpbnNlcnRJbmRleCwgcm93c0NvdW50LCB0YXJnZXRJbmRleCwgaW5oZXJpdEluZGV4KTtcbiAgICAgICAgY29uc3QgdGFibGVDb21wb25lbnQgPSB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLmZpbmQoeCA9PiB4Lmluc3RhbmNlLmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRhYmxlQ29tcG9uZW50Lmluc3RhbmNlLnVwZGF0ZVRhYmxlKCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGVDb2x1bW5zKGluc2VydEluZGV4OiBudW1iZXIsIGNvbHVtbnNDb3VudDogbnVtYmVyLCB0YXJnZXRJbmRleDogbnVtYmVyLCBpbmhlcml0SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydFRhYmxlQ29sdW1ucyh0aGlzLm1vZGVsLCBpbnNlcnRJbmRleCwgY29sdW1uc0NvdW50LCB0YXJnZXRJbmRleCwgaW5oZXJpdEluZGV4LCB0aGlzLnBhZ2VzV3JhcC5jb250ZW50V2lkdGgpO1xuICAgICAgICBjb25zdCB0YWJsZUNvbXBvbmVudCA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGFibGVDb21wb25lbnQuaW5zdGFuY2UudXBkYXRlVGFibGUoKTtcbiAgICB9XG5cbiAgICByZW1vdmVUYWJsZVJvd3MoaW5zZXJ0SW5kZXg6IG51bWJlciwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIucmVtb3ZlVGFibGVSb3dzKHRoaXMubW9kZWwsIGluc2VydEluZGV4LCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIGNvbnN0IHRhYmxlQ29tcG9uZW50ID0gdGhpcy5jdXN0b21Db21wb25lbnRzLnRhYmxlcy5maW5kKHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0YWJsZUNvbXBvbmVudC5pbnN0YW5jZS51cGRhdGVUYWJsZSgpO1xuICAgIH1cblxuICAgIHJlbW92ZVRhYmxlQ29sdW1ucyhpbnNlcnRJbmRleDogbnVtYmVyLCBzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZW1vdmVUYWJsZUNvbHVtbnModGhpcy5tb2RlbCwgaW5zZXJ0SW5kZXgsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0aGlzLnBhZ2VzV3JhcC5jb250ZW50V2lkdGgpO1xuICAgICAgICBjb25zdCB0YWJsZUNvbXBvbmVudCA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGFibGVDb21wb25lbnQuaW5zdGFuY2UudXBkYXRlVGFibGUoKTtcbiAgICB9XG5cbiAgICByZXNpemVUYWJsZUNvbHVtbnMocmVzaXplVGFibGVDb2x1bW5zOiBSZXNpemVUYWJsZUNvbHVtbnNNb2RlbCk6IHZvaWQge1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLnJlc2l6ZVRhYmxlQ29sdW1ucyh0aGlzLm1vZGVsLCByZXNpemVUYWJsZUNvbHVtbnMpO1xuICAgICAgICBjb25zdCB0YWJsZUNvbXBvbmVudCA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IHJlc2l6ZVRhYmxlQ29sdW1ucy5pbnNlcnRJbmRleCk7XG4gICAgICAgIHRhYmxlQ29tcG9uZW50Lmluc3RhbmNlLnVwZGF0ZVRhYmxlKCk7XG4gICAgfVxuXG4gICAgcmVzdG9yZVRhYmxlKGluc2VydEluZGV4OiBudW1iZXIsIHRhYmxlOiBUYWJsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9sZFRhYmxlID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0YWJsZSkpIGFzIFRhYmxlTW9kZWw7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIucmVzdG9yZVRhYmxlKHRoaXMubW9kZWwsIGluc2VydEluZGV4LCBvbGRUYWJsZSk7XG4gICAgICAgIGNvbnN0IHRhYmxlQ29tcG9uZW50ID0gdGhpcy5jdXN0b21Db21wb25lbnRzLnRhYmxlcy5maW5kKHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0YWJsZUNvbXBvbmVudC5pbnN0YW5jZS51cGRhdGVUYWJsZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlUGFyYWdyYXBoVGFicyh0YWJJbmRleDogbnVtYmVyLCBwYXJhZ3JhcGhJbmRleDogbnVtYmVyLCBsZW5ndGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaExhc3RJbmRleCA9IHRoaXMud3JhcFBhcmFncmFwaEluZGV4W3BhcmFncmFwaEluZGV4XSArIGxlbmd0aDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGFiSW5kZXggPT09IC0xIHx8XG4gICAgICAgICAgICB0YWJJbmRleCA+PSB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFicy5sZW5ndGggfHxcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzW3RhYkluZGV4XS5pbnN0YW5jZS5pbnNlcnRJbmRleCA+IHBhcmFncmFwaExhc3RJbmRleFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0YWJJbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0YWJJbmRleDtcbiAgICAgICAgd2hpbGUgKHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzW3RhYkluZGV4XSAmJiB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFic1t0YWJJbmRleF0uaW5zdGFuY2UuaW5zZXJ0SW5kZXggPD0gcGFyYWdyYXBoTGFzdEluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFic1t0YWJJbmRleF0uaW5zdGFuY2Uud2lkdGggPSB0aGlzLnBhZ2VzV3JhcC50YWJUb2tlbnNbdGFiSW5kZXggLSBzdGFydEluZGV4XS53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzW3RhYkluZGV4XS5pbnN0YW5jZS5oZWlnaHQgPSB0aGlzLnBhZ2VzV3JhcC50YWJUb2tlbnNbdGFiSW5kZXggLSBzdGFydEluZGV4XS5mb250O1xuICAgICAgICAgICAgdGFiSW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YWJJbmRleDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFJhbmdlSW5kZXhlcyhyYW5nZTogUmFuZ2UpOiB7IHN0YXJ0SW5kZXg6IG51bWJlcjsgZW5kSW5kZXg6IG51bWJlciB9IHtcbiAgICAgICAgbGV0IHBhcnRJbmRleGVzID0gQ29udGVudEhlbHBlci5nZXRTZWxlY3RlZFBhcnREb2N1bWVudEluZGV4ZXModGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHJhbmdlKTtcbiAgICAgICAgY29uc3QgcHJldk5ld0xpbmVTeW1ib2wgPSB0aGlzLmRvY3VtZW50LmlzTmV3TGluZVN5bWJvbChwYXJ0SW5kZXhlcy5lbmRJbmRleCAtIDEpO1xuICAgICAgICBpZiAoIXByZXZOZXdMaW5lU3ltYm9sKSB7XG4gICAgICAgICAgICBpZiAocGFydEluZGV4ZXMuZW5kSW5kZXggPiBwYXJ0SW5kZXhlcy5zdGFydEluZGV4KSB7XG4gICAgICAgICAgICAgICAgcGFydEluZGV4ZXMuZW5kSW5kZXgtLTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydEluZGV4ZXMuc3RhcnRJbmRleCA9PT0gcGFydEluZGV4ZXMuZW5kSW5kZXggJiYgcGFydEluZGV4ZXMuc3RhcnRJbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgICBwYXJ0SW5kZXhlcy5zdGFydEluZGV4LS07XG4gICAgICAgICAgICAgICAgcGFydEluZGV4ZXMuZW5kSW5kZXgtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXJ0SW5kZXhlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUludGVybmFsRGF0YU9uSW5zZXJ0VGV4dChzdGFydFJvdzogbnVtYmVyLCBlbmRSb3c6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBsZW5ndGggPSBlbmRSb3cgLSBzdGFydFJvdztcbiAgICAgICAgY29uc3QgbmV3UGFyYWdyYXBoczogUGFyYWdyYXBoW10gPSBBcnJheShsZW5ndGgpO1xuICAgICAgICBjb25zdCBuZXdXcmFwRGF0YTogbnVtYmVyW11bXSA9IEFycmF5KGxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG5ld1dyYXBEYXRhW2ldID0gW107XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndyYXBEYXRhLnNwbGljZShzdGFydFJvdywgMCwgLi4ubmV3V3JhcERhdGEpO1xuICAgICAgICB0aGlzLnBhZ2VzV3JhcC5wYXJhZ3JhcGhzLnNwbGljZShzdGFydFJvdywgMCwgLi4ubmV3UGFyYWdyYXBocyk7XG4gICAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShlbmRSb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVXcmFwRGF0YShzdGFydFJvdywgZW5kUm93KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUludGVybmFsRGF0YU9uRGVsZXRlVGV4dChzdGFydFJvdzogbnVtYmVyLCBlbmRSb3c6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBsZW5ndGggPSBlbmRSb3cgLSBzdGFydFJvdztcblxuICAgICAgICB0aGlzLndyYXBEYXRhLnNwbGljZShzdGFydFJvdywgbGVuZ3RoKTtcbiAgICAgICAgdGhpcy5wYWdlc1dyYXAucmVtb3ZlKHN0YXJ0Um93LCBsZW5ndGgpO1xuICAgICAgICBpZiAobGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU51bWJlcmluZ3NEYXRhT25DaGFuZ2Uoc3RhcnRSb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVXcmFwRGF0YShzdGFydFJvdywgc3RhcnRSb3cpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGZvciAobGV0IGkgPSBpbmRleDsgaSA8IHRoaXMucGFnZXNXcmFwLnBhcmFncmFwaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLnBhcmFncmFwaHNbaV0ucGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VzV3JhcC5wYXJhZ3JhcGhzW2ldLm51bWJlcmluZ0RhdGEgPSBOdW1iZXJpbmdIZWxwZXIuY3JlYXRlRGF0YU1vZGVsKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLm51bWJlcmluZ3MsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwucGFyYWdyYXBocyxcbiAgICAgICAgICAgICAgICAgICAgaVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYWdyYXBoRm9ybWF0ID0gRm9ybWF0U3R5bGVIZWxwZXIuZ2V0Rm9ybWF0QXRJbmRleCh0aGlzLm1vZGVsLmZvcm1hdHMsIHRoaXMubW9kZWwucGFyYWdyYXBoc1tpXS5pbnNlcnRJbmRleCk7XG4gICAgICAgICAgICAgICAgTnVtYmVyaW5nSGVscGVyLnVwZGF0ZU1hcmtlckRhdGEoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZXNXcmFwLnBhcmFncmFwaHNbaV0sXG4gICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaEZvcm1hdC50ZXh0U3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwucGFyYWdyYXBoc1tpXS5wYXJhZ3JhcGhTdHlsZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB3cmFwIGluZGV4IGJhc2VkIG9uIG1heCByb3cgd2lkdGhcbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbXB1dGVXcmFwSW5kZXgoZGlzcGxheVRva2VuczogRGlzcGxheVRva2VuW10pOiBudW1iZXIge1xuICAgICAgICBpZiAoIWRpc3BsYXlUb2tlbnNbMF0pIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpc3BsYXlUb2tlbnNbMF0uaXNUYWJsZSB8fCAoZGlzcGxheVRva2Vuc1swXS5icmVha3NMaW5lICYmIGRpc3BsYXlUb2tlbnMubGVuZ3RoID09PSAxKSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRlbnQgPVxuICAgICAgICAgICAgZGlzcGxheVRva2Vuc1swXS5pbmRlbnRMZWZ0ICtcbiAgICAgICAgICAgICAgICBkaXNwbGF5VG9rZW5zWzBdLmluZGVudFJpZ2h0ICtcbiAgICAgICAgICAgICAgICBkaXNwbGF5VG9rZW5zWzBdLmluZGVudEZpcnN0TGluZSAtXG4gICAgICAgICAgICAgICAgZGlzcGxheVRva2Vuc1swXS5pbmRlbnRIYW5naW5nIHx8IDA7XG4gICAgICAgIGNvbnN0IG1heFJvd1dpZHRoID0gKHRoaXMucGFnZXNXcmFwLmNvbnRlbnRXaWR0aCB8fCB0aGlzLmNvbnRlbnRXaWR0aCkgLSBpbmRlbnQ7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3BsYXlUb2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChkaXNwbGF5VG9rZW5zW2ldLmlzVGFiKSB7XG4gICAgICAgICAgICAgICAgZGlzcGxheVRva2Vuc1tpXS53aWR0aCA9IFRhYkhlbHBlci5jYWxjdWxhdGVUYWJXaWR0aChzdW0sIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMuZGVmYXVsdFRhYldpZHRoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3VtICs9IGRpc3BsYXlUb2tlbnNbaV0ud2lkdGg7XG4gICAgICAgICAgICBpZiAoKGkgPiAwICYmIChzdW0gPj0gbWF4Um93V2lkdGggfHwgZGlzcGxheVRva2Vuc1tpIC0gMV0uYnJlYWtzTGluZSkpIHx8IGRpc3BsYXlUb2tlbnNbaV0uaXNUYWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGlzcGxheVRva2Vuc1tpXS5pc0xpbmVCcmVhayB8fCAoaSA9PT0gZGlzcGxheVRva2Vucy5sZW5ndGggLSAxICYmIGRpc3BsYXlUb2tlbnNbaV0uaXNQYWdlQnJlYWspKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb21wdXRlV3JhcFNwbGl0KHRva2VuczogRGlzcGxheVRva2VuW10sIHdyYXBMaW1pdDogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIGlmICghdG9rZW5zLmxlbmd0aCB8fCB0b2tlbnMubGVuZ3RoIDw9IHdyYXBMaW1pdCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHNwYWNlIG9yIHRhYiBhdCB0aGlzIHNwbGl0IHBvc2l0aW9uLCB0aGVuIG1ha2luZ1xuICAgICAgICAvLyBhIHNwbGl0IGlzIHNpbXBsZS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgd3JhcExpbWl0ID09PSAwIHx8XG4gICAgICAgICAgICB0b2tlbnNbd3JhcExpbWl0XS5kaXNwbGF5VmFsdWUgPT09IERpc3BsYXlWYWx1ZS5jdXN0b21Db250ZW50IHx8XG4gICAgICAgICAgICAodGhpcy5pc1doaXRlU3BhY2UodG9rZW5zW3dyYXBMaW1pdCAtIDFdKSAmJiB0aGlzLmlzV2hpdGVTcGFjZSh0b2tlbnNbd3JhcExpbWl0XSkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHdyYXBMaW1pdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZVNwbGl0KHdyYXBMaW1pdCwgdG9rZW5zKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNwbGl0cyhcbiAgICAgICAgbW9kZWw6IENvbnRlbnRzSW50ZXJmYWNlLFxuICAgICAgICBsaW5lOiBzdHJpbmcsXG4gICAgICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgICAgICAgcGFyYWdyYXBoSW5kZXg6IG51bWJlcixcbiAgICAgICAgaXNOZXh0TGluZUV4aXN0czogYm9vbGVhblxuICAgICk6IHsgc3BsaXRzOiBudW1iZXJbXTsgcm93SW5mb3M6IExpbmVJbmZvTW9kZWxbXSB9IHtcbiAgICAgICAgY29uc3Qgc3RyVG9rZW5zID0gdGhpcy5nZXREaXNwbGF5VG9rZW5zKG1vZGVsLCBsaW5lLCBzdGFydEluZGV4KTtcbiAgICAgICAgaWYgKCFzdHJUb2tlbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0Um93SW5mbyA9IG5ldyBMaW5lSW5mb01vZGVsKHtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICh0aGlzLnN0eWxlc01hcC5mb250U2l6ZSAqIDQpIC8gMyxcbiAgICAgICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgICAgICBhbGlnbjogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuYWxpZ25tZW50LFxuICAgICAgICAgICAgICAgIGluZGVudDogbmV3IEluZGVudE1vZGVsKFxuICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRGaXJzdExpbmUsXG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudEhhbmdpbmcsXG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudExlZnQsXG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudFJpZ2h0XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBvZmZzZXRBZnRlcjogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuc3BhY2VBZnRlcixcbiAgICAgICAgICAgICAgICBvZmZzZXRCZWZvcmU6IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLnNwYWNlQmVmb3JlLFxuICAgICAgICAgICAgICAgIGxpbmVTcGFjaW5nOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5saW5lU3BhY2luZyxcbiAgICAgICAgICAgICAgICBpc0FmdGVyUGFnZUJyZWFrOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0VuZGVkQnlQYWdlQnJlYWs6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuYmFja2dyb3VuZENvbG9yXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHsgc3BsaXRzOiBbXSwgcm93SW5mb3M6IFtkZWZhdWx0Um93SW5mb10gfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwbGl0czogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgY29uc3Qgcm93SW5mb3M6IExpbmVJbmZvTW9kZWxbXSA9IFtdO1xuXG4gICAgICAgIGxldCBwcmV2VG9rZW46IERpc3BsYXlUb2tlbjtcbiAgICAgICAgbGV0IGluZGV4ID0gLTE7XG4gICAgICAgIGxldCBpbml0aWFsID0gbGluZTtcbiAgICAgICAgd2hpbGUgKGluZGV4KSB7XG4gICAgICAgICAgICBpbml0aWFsID0gaW5pdGlhbC5zbGljZShpbmRleCA+IDAgPyBpbmRleCA6IDApO1xuICAgICAgICAgICAgY29uc3QgdG9rZW5zID0gc3RyVG9rZW5zLnNsaWNlKGxpbmUubGVuZ3RoIC0gaW5pdGlhbC5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKCF0b2tlbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2goLi4udGhpcy5nZXRFbXB0eUxpbmVUb2tlbnMoc3RhcnRJbmRleCArIGluZGV4KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB3cmFwTGltaXQgPSB0aGlzLmNvbXB1dGVXcmFwSW5kZXgodG9rZW5zKTtcbiAgICAgICAgICAgIGlmICh0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdLmlzUGFnZUJyZWFrICYmIHdyYXBMaW1pdCA9PT0gdG9rZW5zLmxlbmd0aCAmJiBpc05leHRMaW5lRXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgd3JhcExpbWl0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHdyYXBTcGxpdCA9XG4gICAgICAgICAgICAgICAgdG9rZW5zW3dyYXBMaW1pdCAtIDFdPy5icmVha3NMaW5lIHx8IHRva2Vuc1t3cmFwTGltaXQgLSAxXT8uaXNUYWJsZSA/IHdyYXBMaW1pdCA6IHRoaXMuY29tcHV0ZVdyYXBTcGxpdCh0b2tlbnMsIHdyYXBMaW1pdCk7XG4gICAgICAgICAgICBjb25zdCB3cmFwVG9rZW5zID0gdG9rZW5zLnNsaWNlKDAsIHdyYXBTcGxpdCB8fCB1bmRlZmluZWQpO1xuXG4gICAgICAgICAgICBpZiAod3JhcFRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBwcmV2VG9rZW4gPSB3cmFwVG9rZW5zW3dyYXBUb2tlbnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGlzQWZ0ZXJQYWdlQnJlYWsgPSAhcm93SW5mb3MubGVuZ3RoID8gZmFsc2UgOiByb3dJbmZvc1tyb3dJbmZvcy5sZW5ndGggLSAxXS5pc0VuZGVkQnlQYWdlQnJlYWs7XG4gICAgICAgICAgICBjb25zdCBsaW5lSW5mbyA9IHRoaXMuZ2V0TGluZUluZm9Gcm9tVG9rZW4ocHJldlRva2VuLCB3cmFwVG9rZW5zWzBdLCB3cmFwVG9rZW5zLCBpc0FmdGVyUGFnZUJyZWFrKTtcbiAgICAgICAgICAgIGxpbmVJbmZvLmJhY2tncm91bmRDb2xvciA9IG1vZGVsLnBhcmFncmFwaHNbcGFyYWdyYXBoSW5kZXhdLnBhcmFncmFwaFN0eWxlLmJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgICAgIHJvd0luZm9zLnB1c2gobGluZUluZm8pO1xuXG4gICAgICAgICAgICBpZiAoIXdyYXBMaW1pdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbmRleCA9IHdyYXBTcGxpdDtcbiAgICAgICAgICAgIGNvbnN0IHNwbGl0c0xlbmd0aCA9IHNwbGl0cy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBzcGxpdEluZGV4ID0gc3BsaXRzTGVuZ3RoID8gaW5kZXggKyBzcGxpdHNbc3BsaXRzTGVuZ3RoIC0gMV0gOiBpbmRleDtcbiAgICAgICAgICAgIHNwbGl0cy5wdXNoKHNwbGl0SW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wYWdlc1dyYXAudGFiVG9rZW5zLnB1c2goLi4uc3RyVG9rZW5zLmZpbHRlcih4ID0+IHguaXNUYWIpKTtcblxuICAgICAgICBQYXJhZ3JhcGhIZWxwZXIuYXBwbHlQYXJhZ3JhcGhJbmRlbnRzVG9MaW5lcyhyb3dJbmZvcywgcGFyYWdyYXBoSW5kZXgsIG1vZGVsLnBhcmFncmFwaHMpO1xuICAgICAgICByZXR1cm4geyBzcGxpdHMsIHJvd0luZm9zIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXREb2N1bWVudCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFnZU1hcmdpbiA9IHRoaXMuZG9jdW1lbnQucGFnZU1hcmdpbjtcblxuICAgICAgICB0aGlzLnBhZ2VzV3JhcCA9IG5ldyBQYWdlc1dyYXAoXG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50LnBhZ2VzU3BhY2UsXG4gICAgICAgICAgICBwYWdlTWFyZ2luLFxuICAgICAgICAgICAgdGhpcy5kb2N1bWVudC5wYWdlV2lkdGgsXG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50LnBhZ2VIZWlnaHQsXG4gICAgICAgICAgICB0aGlzLmN1c3RvbUNvbXBvbmVudHNcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEVtcHR5TGluZVRva2VucyhzdGFydEluZGV4OiBudW1iZXIpOiBEaXNwbGF5VG9rZW5bXSB7XG4gICAgICAgIGNvbnN0IHN0b3JlZEZvcm1hdCA9IEZvcm1hdFN0eWxlSGVscGVyLmdldEZvcm1hdEF0SW5kZXgodGhpcy5tb2RlbC5mb3JtYXRzLCBzdGFydEluZGV4KTtcbiAgICAgICAgaWYgKCFzdG9yZWRGb3JtYXQpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpbmVJbmZvID0gdGhpcy5nZXRMaW5lSW5mb0J5QnJlYWtNb2RpZmllcihzdGFydEluZGV4KTtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IEZvbnRNZXRyaWNzLm1lYXN1cmVDaGFyU2l6ZSgnRU1QVFlfTElORScsIENvbnRlbnRTdHlsZUhlbHBlci5nZXRGb250U3R5bGVzU3RyaW5nKHN0b3JlZEZvcm1hdC50ZXh0U3R5bGUpKTtcbiAgICAgICAgc2l6ZS53aWR0aCA9IDM7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBuZXcgRGlzcGxheVRva2VuKHtcbiAgICAgICAgICAgICAgICAuLi5zaXplLFxuICAgICAgICAgICAgICAgIGRpc3BsYXlWYWx1ZTogRGlzcGxheVZhbHVlLmVtcHR5TGluZSxcbiAgICAgICAgICAgICAgICBhbGlnbjogbGluZUluZm8uYWxpZ24sXG4gICAgICAgICAgICAgICAgaW5kZW50Rmlyc3RMaW5lOiBsaW5lSW5mby5pbmRlbnQuZmlyc3RMaW5lLFxuICAgICAgICAgICAgICAgIGluZGVudEhhbmdpbmc6IGxpbmVJbmZvLmluZGVudC5oYW5naW5nLFxuICAgICAgICAgICAgICAgIGluZGVudExlZnQ6IGxpbmVJbmZvLmluZGVudC5sZWZ0LFxuICAgICAgICAgICAgICAgIGluZGVudFJpZ2h0OiBsaW5lSW5mby5pbmRlbnQucmlnaHQsXG4gICAgICAgICAgICAgICAgaW5kZW50QmVmb3JlOiBsaW5lSW5mby5vZmZzZXRCZWZvcmUsXG4gICAgICAgICAgICAgICAgaW5kZW50QWZ0ZXI6IGxpbmVJbmZvLm9mZnNldEFmdGVyLFxuICAgICAgICAgICAgICAgIGlzUGFnZUJyZWFrOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0xpbmVCcmVhazogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNUYWI6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxpbmVTcGFjaW5nOiBsaW5lSW5mby5saW5lU3BhY2luZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZpbGxlZExpbmVUb2tlbnMoc3RhcnRJbmRleDogbnVtYmVyLCBsaW5lOiBzdHJpbmcsIG1vZGVsOiBDb250ZW50c0ludGVyZmFjZSk6IERpc3BsYXlUb2tlbltdIHtcbiAgICAgICAgY29uc3QgbGluZUluZm8gPSB0aGlzLmdldExpbmVJbmZvQnlCcmVha01vZGlmaWVyKHN0YXJ0SW5kZXggKyBsaW5lLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHRva2VuczogRGlzcGxheVRva2VuW10gPSBbXTtcbiAgICAgICAgbGV0IGNoYXJhY3RlcnM6IERpc3BsYXlUb2tlbltdID0gW107XG4gICAgICAgIGxldCBmb3JtYXQgPSBGb3JtYXRTdHlsZUhlbHBlci5nZXRGb3JtYXRBdEluZGV4KG1vZGVsLmZvcm1hdHMsIHN0YXJ0SW5kZXgpO1xuICAgICAgICBsZXQgcHJldkZvcm1hdDogRm9ybWF0TW9kZWwgPSBudWxsO1xuICAgICAgICBsZXQgcHJldkNoYXJDb2RlOiBudW1iZXIgPSBudWxsO1xuICAgICAgICBsZXQgcHJldkZvbnRTdHJpbmc6IHN0cmluZyA9IG51bGw7XG4gICAgICAgIGxldCBwcmV2Q2hhcjogc3RyaW5nID0gbnVsbDtcbiAgICAgICAgbGV0IGZvbnRTdHJpbmcgPSBDb250ZW50U3R5bGVIZWxwZXIuZ2V0Rm9udFN0eWxlc1N0cmluZyhmb3JtYXQ/LnRleHRTdHlsZSk7XG4gICAgICAgIGxldCBzeW1ib2xDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjaGFyID0gbGluZVtpXTtcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSBGb250TWV0cmljcy5tZWFzdXJlQ2hhclNpemUoY2hhciwgZm9udFN0cmluZyk7XG4gICAgICAgICAgICBjb25zdCBjdXN0b21Db21wb25lbnQgPSB0aGlzLmN1c3RvbUNvbnRlbnRTZXJ2aWNlLmdldE9yR2VuZXJhdGVDb21wb25lbnQoXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbCxcbiAgICAgICAgICAgICAgICB0aGlzLmN1c3RvbUNvbXBvbmVudHMsXG4gICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmFsUHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRXaWR0aCxcbiAgICAgICAgICAgICAgICBzdGFydEluZGV4LFxuICAgICAgICAgICAgICAgIGNoYXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBicmVha1R5cGUgPSBCcmVha0hlbHBlci5nZXRCcmVha1R5cGUobW9kZWwsIGNoYXIsIHN0YXJ0SW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAoY3VzdG9tQ29tcG9uZW50ICYmICFicmVha1R5cGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1c3RvbUNvbnRlbnRTZXJ2aWNlLmFkZFRvQ3VzdG9tQ29tcG9uZW50cyh0aGlzLmN1c3RvbUNvbXBvbmVudHMsIGN1c3RvbUNvbXBvbmVudCwgY2hhciwgc3RhcnRJbmRleCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmN1c3RvbUNvbnRlbnRTZXJ2aWNlLmdldFRva2VuRnJvbUNvbXBvbmVudChcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICBsaW5lSW5mbyxcbiAgICAgICAgICAgICAgICAgICAgRGlzcGxheVZhbHVlLmN1c3RvbUNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgIGkgPT09IDAsXG4gICAgICAgICAgICAgICAgICAgIHNpemVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcblxuICAgICAgICAgICAgICAgIHByZXZDaGFyQ29kZSA9IC0xO1xuICAgICAgICAgICAgICAgIHByZXZDaGFyID0gJyc7XG4gICAgICAgICAgICAgICAgY2hhcmFjdGVycyA9IFtdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFyQ29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSB0aGlzLmdldERpc3BsYXlWYWx1ZShjaGFyQ29kZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNGaXJzdENoYXJhY3RlciA9IGkgPT09IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9rZW4gPSBuZXcgRGlzcGxheVRva2VuKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBhbGlnbjogbGluZUluZm8uYWxpZ24sXG4gICAgICAgICAgICAgICAgICAgIGluZGVudEZpcnN0TGluZTogaXNGaXJzdENoYXJhY3RlciA/IGxpbmVJbmZvLmluZGVudC5maXJzdExpbmUgOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRGaXJzdExpbmUsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudEhhbmdpbmc6IGlzRmlyc3RDaGFyYWN0ZXIgPyBsaW5lSW5mby5pbmRlbnQuaGFuZ2luZyA6IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudEhhbmdpbmcsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudExlZnQ6IGxpbmVJbmZvLmluZGVudC5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnRSaWdodDogbGluZUluZm8uaW5kZW50LnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnRCZWZvcmU6IGxpbmVJbmZvLm9mZnNldEJlZm9yZSxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50QWZ0ZXI6IGxpbmVJbmZvLm9mZnNldEFmdGVyLFxuICAgICAgICAgICAgICAgICAgICBsaW5lU3BhY2luZzogbGluZUluZm8ubGluZVNwYWNpbmcsXG4gICAgICAgICAgICAgICAgICAgIGlzUGFnZUJyZWFrOiBicmVha1R5cGUgPT09IEJyZWFrVHlwZXMuUGFnZSxcbiAgICAgICAgICAgICAgICAgICAgaXNMaW5lQnJlYWs6IGJyZWFrVHlwZSA9PT0gQnJlYWtUeXBlcy5UZXh0V3JhcHBpbmcsXG4gICAgICAgICAgICAgICAgICAgIGlzVGFiOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBjaGFyQ29kZSAhPT0gcHJldkNoYXJDb2RlIHx8XG4gICAgICAgICAgICAgICAgICAgICFwcmV2Rm9ybWF0IHx8XG4gICAgICAgICAgICAgICAgICAgICFDb250ZW50U3R5bGVIZWxwZXIuYXJlU2FtZVRleHRTdHlsZXMoZm9ybWF0Py50ZXh0U3R5bGUsIHByZXZGb3JtYXQ/LnRleHRTdHlsZSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgc3ltYm9sQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IGxpbmUubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICBzeW1ib2xDaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNoYXJhY3RlcnMubGVuZ3RoID4gMSAmJiBzeW1ib2xDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ2hhclNpemVzKHByZXZDaGFyLCBwcmV2Rm9udFN0cmluZywgY2hhcmFjdGVycyk7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMgPSBbdG9rZW5dO1xuICAgICAgICAgICAgICAgICAgICBzeW1ib2xDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN5bWJvbENoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzID0gW3Rva2VuXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwcmV2Q2hhckNvZGUgPSBjaGFyQ29kZTtcbiAgICAgICAgICAgICAgICBwcmV2Q2hhciA9IGNoYXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHByZXZGb3JtYXQgPSBmb3JtYXQ7XG4gICAgICAgICAgICBwcmV2Rm9udFN0cmluZyA9IGZvbnRTdHJpbmc7XG4gICAgICAgICAgICBzdGFydEluZGV4Kys7XG5cbiAgICAgICAgICAgIGlmIChzdGFydEluZGV4ID4gZm9ybWF0Py5lbmRJbmRleCkge1xuICAgICAgICAgICAgICAgIGZvcm1hdCA9IEZvcm1hdFN0eWxlSGVscGVyLmdldEZvcm1hdEF0SW5kZXgobW9kZWwuZm9ybWF0cywgc3RhcnRJbmRleCk7XG4gICAgICAgICAgICAgICAgZm9udFN0cmluZyA9IENvbnRlbnRTdHlsZUhlbHBlci5nZXRGb250U3R5bGVzU3RyaW5nKGZvcm1hdD8udGV4dFN0eWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0b2tlbnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzQ2hhclNpemVzKHByZXZDaGFyOiBzdHJpbmcsIHByZXZGb250U3RyaW5nOiBzdHJpbmcsIGNoYXJhY3RlcnM6IERpc3BsYXlUb2tlbltdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5ld1NpemUgPSBGb250TWV0cmljcy5tZWFzdXJlQ2hhclNpemUocHJldkNoYXIsIHByZXZGb250U3RyaW5nKTtcbiAgICAgICAgZm9yIChsZXQgaXRlbSBvZiBjaGFyYWN0ZXJzKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGl0ZW0sIG5ld1NpemUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVTcGxpdChpbmRleDogbnVtYmVyLCB0b2tlbnM6IERpc3BsYXlUb2tlbltdKTogbnVtYmVyIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGluZGV4OyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNXaGl0ZVNwYWNlKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmRpc3BsYXlWYWx1ZSA9PT0gRGlzcGxheVZhbHVlLmN1c3RvbUNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaSArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNXaGl0ZVNwYWNlKHRva2VuOiBEaXNwbGF5VG9rZW4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFtEaXNwbGF5VmFsdWUuc3BhY2UsIERpc3BsYXlWYWx1ZS5lbXB0eUxpbmVdLmluY2x1ZGVzKHRva2VuLmRpc3BsYXlWYWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRMaW5lSW5mb0Zyb21Ub2tlbihcbiAgICAgICAgcHJldlRva2VuOiBEaXNwbGF5VG9rZW4sXG4gICAgICAgIGZpcnN0V3JhcFRva2VuOiBEaXNwbGF5VG9rZW4sXG4gICAgICAgIHdyYXBUb2tlbnM6IERpc3BsYXlUb2tlbltdLFxuICAgICAgICBpc0FmdGVyUGFnZUJyZWFrOiBib29sZWFuXG4gICAgKTogTGluZUluZm9Nb2RlbCB7XG4gICAgICAgIGNvbnN0IGluZm8gPSBuZXcgTGluZUluZm9Nb2RlbCh7XG4gICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgICAgIGFsaWduOiBwcmV2VG9rZW4uYWxpZ24sXG4gICAgICAgICAgICBpbmRlbnQ6IG5ldyBJbmRlbnRNb2RlbChwcmV2VG9rZW4uaW5kZW50Rmlyc3RMaW5lLCBwcmV2VG9rZW4uaW5kZW50SGFuZ2luZywgcHJldlRva2VuLmluZGVudExlZnQsIHByZXZUb2tlbi5pbmRlbnRSaWdodCksXG4gICAgICAgICAgICBvZmZzZXRCZWZvcmU6IHByZXZUb2tlbi5pbmRlbnRCZWZvcmUsXG4gICAgICAgICAgICBvZmZzZXRBZnRlcjogcHJldlRva2VuLmluZGVudEFmdGVyLFxuICAgICAgICAgICAgbGluZVNwYWNpbmc6IHByZXZUb2tlbi5saW5lU3BhY2luZyxcbiAgICAgICAgICAgIGlzQWZ0ZXJQYWdlQnJlYWssXG4gICAgICAgICAgICBpc0VuZGVkQnlQYWdlQnJlYWs6IHByZXZUb2tlbi5pc1BhZ2VCcmVha1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoZmlyc3RXcmFwVG9rZW4pIHtcbiAgICAgICAgICAgIGluZm8uYWxpZ24gPSBmaXJzdFdyYXBUb2tlbi5hbGlnbjtcbiAgICAgICAgICAgIGluZm8uaW5kZW50LmZpcnN0TGluZSA9IGZpcnN0V3JhcFRva2VuLmluZGVudEZpcnN0TGluZTtcbiAgICAgICAgICAgIGluZm8uaW5kZW50LmhhbmdpbmcgPSBmaXJzdFdyYXBUb2tlbi5pbmRlbnRIYW5naW5nO1xuICAgICAgICAgICAgaW5mby5pbmRlbnQubGVmdCA9IGZpcnN0V3JhcFRva2VuLmluZGVudExlZnQ7XG4gICAgICAgICAgICBpbmZvLmluZGVudC5yaWdodCA9IGZpcnN0V3JhcFRva2VuLmluZGVudFJpZ2h0O1xuICAgICAgICAgICAgaW5mby5vZmZzZXRCZWZvcmUgPSBmaXJzdFdyYXBUb2tlbi5pbmRlbnRCZWZvcmU7XG4gICAgICAgICAgICBpbmZvLm9mZnNldEFmdGVyID0gZmlyc3RXcmFwVG9rZW4uaW5kZW50QWZ0ZXI7XG4gICAgICAgICAgICBpbmZvLmxpbmVTcGFjaW5nID0gZmlyc3RXcmFwVG9rZW4ubGluZVNwYWNpbmc7XG4gICAgICAgICAgICBpbmZvLmhhc1RhYmxlID0gZmlyc3RXcmFwVG9rZW4uaXNUYWJsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmb250U2l6ZSA9IDA7XG4gICAgICAgIGxldCBhc2NlbnQgPSAwO1xuICAgICAgICBsZXQgZGVzY2VudCA9IDA7XG4gICAgICAgIGNvbnN0IHRva2VucyA9IGlzQWZ0ZXJQYWdlQnJlYWsgJiYgIXdyYXBUb2tlbnMubGVuZ3RoID8gW3ByZXZUb2tlbl0gOiB3cmFwVG9rZW5zO1xuICAgICAgICBmb3IgKGNvbnN0IHdyYXBUb2tlbiBvZiB0b2tlbnMpIHtcbiAgICAgICAgICAgIGlmIChpbmZvLmhlaWdodCA8IHdyYXBUb2tlbi5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBpbmZvLmhlaWdodCA9IHdyYXBUb2tlbi5oZWlnaHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmb250U2l6ZSA8IHdyYXBUb2tlbi5mb250ICYmIHdyYXBUb2tlbi5kaXNwbGF5VmFsdWUgIT09IERpc3BsYXlWYWx1ZS5jdXN0b21Db250ZW50KSB7XG4gICAgICAgICAgICAgICAgZm9udFNpemUgPSB3cmFwVG9rZW4uZm9udDtcbiAgICAgICAgICAgICAgICBhc2NlbnQgPSB3cmFwVG9rZW4uYXNjZW50O1xuICAgICAgICAgICAgICAgIGRlc2NlbnQgPSB3cmFwVG9rZW4uZGVzY2VudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5mby53aWR0aCArPSB3cmFwVG9rZW4ud2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBpbmZvLmhlaWdodCA9IGluZm8uaGVpZ2h0IHx8IDE4O1xuICAgICAgICBpZiAoaW5mby5saW5lU3BhY2luZyA+IDEpIHtcbiAgICAgICAgICAgIGluZm8ub2Zmc2V0QWZ0ZXIgPSAoYXNjZW50ICsgZGVzY2VudCkgKiAoaW5mby5saW5lU3BhY2luZyAtIDEpO1xuICAgICAgICB9IGVsc2UgaWYgKGFzY2VudCArIGRlc2NlbnQgPT09IGluZm8uaGVpZ2h0KSB7XG4gICAgICAgICAgICBpbmZvLmhlaWdodCA9IGluZm8uaGVpZ2h0ICogaW5mby5saW5lU3BhY2luZztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGlzcGxheVZhbHVlKGNoYXJDb2RlOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBpZiAoY2hhckNvZGUgPT09IDMyKSB7XG4gICAgICAgICAgICByZXR1cm4gRGlzcGxheVZhbHVlLnNwYWNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChjaGFyQ29kZSA+IDM5ICYmIGNoYXJDb2RlIDwgNDgpIHx8IChjaGFyQ29kZSA+IDU3ICYmIGNoYXJDb2RlIDwgNjQpKSB7XG4gICAgICAgICAgICByZXR1cm4gRGlzcGxheVZhbHVlLnB1bmN0dWF0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIERpc3BsYXlWYWx1ZS5jaGFyO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TGluZUluZm9CeUJyZWFrTW9kaWZpZXIoaW5kZXg6IG51bWJlcik6IExpbmVJbmZvTW9kZWwge1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGggPSBQYXJhZ3JhcGhTdHlsZUhlbHBlci5nZXRQYXJhZ3JhcGhBdEluZGV4KHRoaXMubW9kZWwucGFyYWdyYXBocywgaW5kZXgpO1xuICAgICAgICBpZiAoIXBhcmFncmFwaCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBMaW5lSW5mb01vZGVsKHtcbiAgICAgICAgICAgICAgICBhbGlnbjogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuYWxpZ25tZW50LFxuICAgICAgICAgICAgICAgIGluZGVudDogbmV3IEluZGVudE1vZGVsKFxuICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRGaXJzdExpbmUsXG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudEhhbmdpbmcsXG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudExlZnQsXG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudFJpZ2h0XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBvZmZzZXRCZWZvcmU6IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLnNwYWNlQmVmb3JlLFxuICAgICAgICAgICAgICAgIG9mZnNldEFmdGVyOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5zcGFjZUFmdGVyLFxuICAgICAgICAgICAgICAgIGxpbmVTcGFjaW5nOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5saW5lU3BhY2luZ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRlbnRMZWZ0ID0gdGhpcy5nZXRQYXJhZ3JhcGhJbmRlbnRMZWZ0KHBhcmFncmFwaCk7XG4gICAgICAgIGNvbnN0IGluZGVudEhhbmdpbmcgPSBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWQgPT09IG51bGwgPyBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUuaW5kZW50SGFuZ2luZyA6IDA7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBMaW5lSW5mb01vZGVsKHtcbiAgICAgICAgICAgIGFsaWduOiBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUuYWxpZ25tZW50ID8/IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmFsaWdubWVudCxcbiAgICAgICAgICAgIGluZGVudDogbmV3IEluZGVudE1vZGVsKFxuICAgICAgICAgICAgICAgIHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5pbmRlbnRGaXJzdExpbmUgPz8gREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuaW5kZW50Rmlyc3RMaW5lLFxuICAgICAgICAgICAgICAgIGluZGVudEhhbmdpbmcgPz8gREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuaW5kZW50SGFuZ2luZyxcbiAgICAgICAgICAgICAgICBpbmRlbnRMZWZ0ID8/IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudExlZnQsXG4gICAgICAgICAgICAgICAgcGFyYWdyYXBoLnBhcmFncmFwaFN0eWxlLmluZGVudFJpZ2h0ID8/IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudFJpZ2h0XG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgb2Zmc2V0QmVmb3JlOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5zcGFjZUJlZm9yZSxcbiAgICAgICAgICAgIG9mZnNldEFmdGVyOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5zcGFjZUFmdGVyLFxuICAgICAgICAgICAgbGluZVNwYWNpbmc6IHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5saW5lU3BhY2luZyA/PyBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5saW5lU3BhY2luZ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFBhcmFncmFwaEluZGVudExlZnQocGFyYWdyYXBoOiBQYXJhZ3JhcGhNb2RlbCk6IG51bWJlciB7XG4gICAgICAgIGxldCBwYXJhZ3JhcGhJbmRlbnQgPSBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUuaW5kZW50TGVmdDtcbiAgICAgICAgY29uc3QgbnVtYmVyaW5nSWQgPSBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWQ7XG4gICAgICAgIGlmIChudW1iZXJpbmdJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgbGV2ZWwgPSBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nTGV2ZWw7XG4gICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGhJbmRleCA9IHRoaXMubW9kZWwucGFyYWdyYXBocy5pbmRleE9mKHBhcmFncmFwaCk7XG4gICAgICAgICAgICBjb25zdCBsZXZlbE1vZGVsID0gTnVtYmVyaW5nSGVscGVyLmZpbmQodGhpcy5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdzLCBudW1iZXJpbmdJZCwgbGV2ZWwpO1xuICAgICAgICAgICAgY29uc3QgcGFyYWdyYXBoRm9ybWF0ID0gRm9ybWF0U3R5bGVIZWxwZXIuZ2V0Rm9ybWF0QXRJbmRleCh0aGlzLm1vZGVsLmZvcm1hdHMsIHBhcmFncmFwaC5pbnNlcnRJbmRleCk7XG4gICAgICAgICAgICBjb25zdCBtYXJrZXJUZXh0U3R5bGUgPSBDb250ZW50U3R5bGVIZWxwZXIuY29tYmluZVRleHRTdHlsZXMobGV2ZWxNb2RlbC5tYXJrZXJTdHlsZSwgcGFyYWdyYXBoRm9ybWF0LnRleHRTdHlsZSk7XG4gICAgICAgICAgICBsZXQgbWFya2VyV2lkdGggPSB0aGlzLnBhZ2VzV3JhcC5wYXJhZ3JhcGhzW3BhcmFncmFwaEluZGV4XT8ubnVtYmVyaW5nRGF0YT8ud2lkdGg7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIXRoaXMucGFnZXNXcmFwLnBhcmFncmFwaHNbcGFyYWdyYXBoSW5kZXhdPy5udW1iZXJpbmdEYXRhLm1hcmtlclRleHRTdHlsZSB8fFxuICAgICAgICAgICAgICAgICFDb250ZW50U3R5bGVIZWxwZXIuYXJlU2FtZVRleHRTdHlsZXMoXG4gICAgICAgICAgICAgICAgICAgIG1hcmtlclRleHRTdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlc1dyYXAucGFyYWdyYXBoc1twYXJhZ3JhcGhJbmRleF0ubnVtYmVyaW5nRGF0YS5tYXJrZXJUZXh0U3R5bGVcbiAgICAgICAgICAgICAgICApIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlc1dyYXAucGFyYWdyYXBoc1twYXJhZ3JhcGhJbmRleF0ubnVtYmVyaW5nRGF0YS5udW1iZXJpbmdJZCAhPT0gbnVtYmVyaW5nSWRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IE51bWJlcmluZ0hlbHBlci5nZXRNYXJrZXIobGV2ZWxNb2RlbCwgbnVtYmVyaW5nSWQsIHRoaXMubW9kZWwucGFyYWdyYXBocywgcGFyYWdyYXBoSW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlclNpemVzID0gTnVtYmVyaW5nSGVscGVyLmdldE1hcmtlclNpemVzKG1hcmtlciwgbWFya2VyVGV4dFN0eWxlKTtcbiAgICAgICAgICAgICAgICBtYXJrZXJXaWR0aCA9IG1hcmtlclNpemVzLndpZHRoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBoYW5naW5nSW5kZW50ID0gcGFyYWdyYXBoLnBhcmFncmFwaFN0eWxlLmluZGVudEhhbmdpbmdcbiAgICAgICAgICAgICAgICA/IHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5pbmRlbnRIYW5naW5nXG4gICAgICAgICAgICAgICAgOiBsZXZlbE1vZGVsLmluZGVudEhhbmdpbmc7XG4gICAgICAgICAgICBwYXJhZ3JhcGhJbmRlbnQgPSBsZXZlbE1vZGVsLmluZGVudExlZnQ7XG4gICAgICAgICAgICBpZiAobWFya2VyV2lkdGggPj0gaGFuZ2luZ0luZGVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlck92ZXJmbG93ID0gbWFya2VyV2lkdGggLSBoYW5naW5nSW5kZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxNYXJrZXJJbmRlbnQgPSBUYWJIZWxwZXIuY2FsY3VsYXRlVGFiV2lkdGgoXG4gICAgICAgICAgICAgICAgICAgIGxldmVsTW9kZWwuaW5kZW50TGVmdCArIG1hcmtlck92ZXJmbG93LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLmRlZmF1bHRUYWJXaWR0aFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcGFyYWdyYXBoSW5kZW50ICs9IG1hcmtlck92ZXJmbG93ICsgYWRkaXRpb25hbE1hcmtlckluZGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXJhZ3JhcGhJbmRlbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVUZXh0U3R5bGVzKHN0eWxlczogeyBba2V5OiBzdHJpbmddOiBhbnlbXSB9LCBzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiBGb3JtYXRNb2RlbCB7XG4gICAgICAgIGxldCB0ZXh0U3R5bGVzID0gRm9ybWF0U3R5bGVIZWxwZXIuZ2V0Rm9ybWF0c0F0UmFuZ2UodGhpcy5tb2RlbC5mb3JtYXRzLCBzdGFydEluZGV4LCBlbmRJbmRleCkubWFwKGZvcm1hdCA9PiBmb3JtYXQudGV4dFN0eWxlKTtcbiAgICAgICAgbGV0IHByZXZGb3JtYXQ6IEZvcm1hdE1vZGVsO1xuICAgICAgICBpZiAoIXRleHRTdHlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBwcmV2Rm9ybWF0ID0gRm9ybWF0U3R5bGVIZWxwZXIuZ2V0UHJldkZvcm1hdEF0SW5kZXgodGhpcy5tb2RlbC5mb3JtYXRzLCBzdGFydEluZGV4KTtcblxuICAgICAgICAgICAgaWYgKHByZXZGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICB0ZXh0U3R5bGVzID0gW3ByZXZGb3JtYXQudGV4dFN0eWxlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgdGV4dFN0eWxlIG9mIHRleHRTdHlsZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRleHRTdHlsZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGVzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVzW2tleV0ucHVzaCh0ZXh0U3R5bGVba2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByZXZGb3JtYXQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVQYXJhZ3JhcGhTdHlsZXMoc3R5bGVzOiB7IFtrZXk6IHN0cmluZ106IGFueVtdIH0sIHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGhTdHlsZXMgPSBQYXJhZ3JhcGhTdHlsZUhlbHBlci5nZXRQYXJhZ3JhcGhzQXRSYW5nZSh0aGlzLm1vZGVsLnBhcmFncmFwaHMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KS5tYXAoXG4gICAgICAgICAgICBwYXJhZ3JhcGggPT4gcGFyYWdyYXBoLnBhcmFncmFwaFN0eWxlXG4gICAgICAgICk7XG4gICAgICAgIGZvciAoY29uc3QgcGFyYWdyYXBoU3R5bGUgb2YgcGFyYWdyYXBoU3R5bGVzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhwYXJhZ3JhcGhTdHlsZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGVzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVzW2tleV0ucHVzaChwYXJhZ3JhcGhTdHlsZVtrZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZU51bWJlcmluZ1N0eWxlcyhzdHlsZXM6IHsgW2tleTogc3RyaW5nXTogYW55W10gfSwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaFN0eWxlcyA9IFBhcmFncmFwaFN0eWxlSGVscGVyLmdldFBhcmFncmFwaHNBdFJhbmdlKHRoaXMubW9kZWwucGFyYWdyYXBocywgc3RhcnRJbmRleCwgZW5kSW5kZXgpLm1hcChcbiAgICAgICAgICAgIHBhcmFncmFwaCA9PiBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGVcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChjb25zdCBwYXJhZ3JhcGhTdHlsZSBvZiBwYXJhZ3JhcGhTdHlsZXMpIHtcbiAgICAgICAgICAgIGlmIChwYXJhZ3JhcGhTdHlsZS5udW1iZXJpbmdJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlcmluZ0xldmVscyA9IHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMubnVtYmVyaW5ncy5maW5kKHggPT4geC5udW1iZXJpbmdJZCA9PT0gcGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWQpLmxldmVscztcbiAgICAgICAgICAgICAgICBjb25zdCBsZXZlbHNNYXJrZXJTdHlsZXMgPSBudW1iZXJpbmdMZXZlbHMucmVkdWNlKChwcmV2LCBuZXh0KSA9PiBgJHtwcmV2fSR7bmV4dC5tYXJrZXJ9JHtuZXh0Lm1hcmtlclR5cGV9YCwgJycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxldmVsID0gbnVtYmVyaW5nTGV2ZWxzLmZpbmQoeCA9PiB4LmxldmVsID09PSBwYXJhZ3JhcGhTdHlsZS5udW1iZXJpbmdMZXZlbCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNCdWxsZXRNYXJrZXIgPSBsZXZlbC5tYXJrZXJUeXBlID09PSBOdW1iZXJpbmdNYXJrZXJUeXBlLkJ1bGxldDtcbiAgICAgICAgICAgICAgICBzdHlsZXNbJ2lzQnVsbGV0TWFya2VyJ10ucHVzaChpc0J1bGxldE1hcmtlcik7XG4gICAgICAgICAgICAgICAgc3R5bGVzWydudW1iZXJpbmdMZXZlbHNTdHlsZXMnXS5wdXNoKGxldmVsc01hcmtlclN0eWxlcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0eWxlc1snaXNCdWxsZXRNYXJrZXInXS5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgIHN0eWxlc1snbnVtYmVyaW5nTGV2ZWxzU3R5bGVzJ10ucHVzaCgnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEltYWdlV2l0aEFsbG93ZWRTaXplKGltYWdlRGF0YTogSW1hZ2VEYXRhTW9kZWwsIG1heFdpZHRoOiBudW1iZXIpOiBJbWFnZURhdGFNb2RlbCB7XG4gICAgICAgIGlmIChpbWFnZURhdGEud2lkdGggPD0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBpbWFnZURhdGE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhc3BlY3RSYXRpbyA9IGltYWdlRGF0YS53aWR0aCAvIGltYWdlRGF0YS5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IG1heFdpZHRoIC8gYXNwZWN0UmF0aW87XG4gICAgICAgIHJldHVybiBuZXcgSW1hZ2VEYXRhTW9kZWwoeyB3aWR0aDogTWF0aC5yb3VuZChtYXhXaWR0aCksIGhlaWdodDogTWF0aC5yb3VuZChoZWlnaHQpLCBjb250ZW50OiBpbWFnZURhdGEuY29udGVudCB9KTtcbiAgICB9XG59XG4iXX0=
561
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdC5zZXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW5vZGVyL3NyYy9saWIvZWRpdG9yL2V4ZWN1dGlvbi9lZGl0LnNlc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQzFGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBR3JGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSwwQkFBMEIsRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUl0SCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFcEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFLbEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFTakYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDckYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDckYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBR3hFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FB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QUNsSCxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxrQkFBMkM7UUFDMUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsS0FBSyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNoSCxJQUFJLENBQUMsV0FBVyxDQUFDLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RELGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUNwRSxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxZQUFZLENBQUMsV0FBbUIsRUFBRSxLQUFpQjtRQUMvQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQWUsQ0FBQztRQUNqRSxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDakUsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsS0FBSyxXQUFXLENBQUMsQ0FBQztRQUN0RyxjQUFjLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzFDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudFJlZiwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBBcHBseUVsZW1lbnRTdHlsZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9hcHBseS1lbGVtZW50LXN0eWxlLm1vZGVsJztcbmltcG9ydCB7IEFwcGx5SW1hZ2VTdHlsZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9hcHBseS1pbWFnZS1zdHlsZS5tb2RlbCc7XG5pbXBvcnQgeyBCYXNlTm9kZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3NoYXJlZC9hYnN0cmFjdC9iYXNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCcmVha0hlbHBlciB9IGZyb20gJy4uL2dhZGdldHMvcGFnZS1icmVhay9icmVhay5oZWxwZXInO1xuaW1wb3J0IHsgQnJlYWtUeXBlcyB9IGZyb20gJy4uL2dhZGdldHMvcGFnZS1icmVhay9icmVhay10eXBlcy5lbnVtJztcbmltcG9ydCB7IENvbnRlbnRIZWxwZXIgfSBmcm9tICcuLi9wb3NpdGlvbmluZy9jb250ZW50LmhlbHBlcic7XG5pbXBvcnQgeyBDb250ZW50c0ludGVyZmFjZSB9IGZyb20gJy4uL2NvbnRlbnQvY29udGVudHMuaW50ZXJmYWNlJztcbmltcG9ydCB7IEN1cnNvclBhcmFncmFwaCB9IGZyb20gJy4uL3Bvc2l0aW9uaW5nL2N1cnNvci1wYXJhZ3JhcGgnO1xuaW1wb3J0IHsgQ1VTVE9NX0VMRU1FTlRfTUFSS0VSIH0gZnJvbSAnLi4vY29tcG9uZW50cy9zaGFyZWQvY3VzdG9tLWNvbnRlbnQtbWFya2Vycy5jb25zdCc7XG5pbXBvcnQgeyBDdXN0b21Db21wb25lbnRIZWxwZXIgfSBmcm9tICcuLi9jb21wb25lbnRzL3NoYXJlZC9jdXN0b20tY29tcG9uZW50LmhlcGxlcic7XG5pbXBvcnQgeyBDdXN0b21Db250ZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9zaGFyZWQvY3VzdG9tLWNvbnRlbnQnO1xuaW1wb3J0IHsgQ3VzdG9tQ29udGVudFNlcnZpY2UgfSBmcm9tICcuLi9jb21wb25lbnRzL3NoYXJlZC9zZXJ2aWNlcy9jdXN0b20tY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEhZUEVSTElOS19GT05UX0NPTE9SLCBIWVBFUkxJTktfSEVBRElOR19TVFlMRV9JRCwgTkVXX0xJTkVfTUFSS1VQIH0gZnJvbSAnLi4vY29udGVudC9jb25zdGFudHMvZWRpdG9yLmNvbnN0JztcbmltcG9ydCB7IERpc3BsYXlEYXRhIH0gZnJvbSAnLi4vY29udGVudC9kaXNwbGF5LWRhdGEvZGlzcGxheS1kYXRhJztcbmltcG9ydCB7IEVkaXRvclNlcnZpY2UgfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9lZGl0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBFbGVtZW50RGF0YU1vZGVsIH0gZnJvbSAnLi4vY29tcG9uZW50cy9leHRlcm5hbC1lbGVtZW50L21vZGVscy9lbGVtZW50LWRhdGEubW9kZWwnO1xuaW1wb3J0IHsgRWxlbWVudE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9lbGVtZW50Lm1vZGVsJztcbmltcG9ydCB7IEZvcm1hdE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9mb3JtYXQubW9kZWwnO1xuaW1wb3J0IHsgRm9ybWF0U3R5bGVIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvZm9ybWF0LXN0eWxlLmhlbHBlcic7XG5pbXBvcnQgeyBHZW5lcmFsUHJvcGVydGllc01vZGVsIH0gZnJvbSAnLi4vY29udGVudC9kaXNwbGF5LWRhdGEvZ2VuZXJhbC1wcm9wZXJ0aWVzLm1vZGVsJztcbmltcG9ydCB7IElDdXN0b21Db21wb25lbnRzIH0gZnJvbSAnLi4vY29tcG9uZW50cy9zaGFyZWQvY3VzdG9tLWNvbXBvbmVudHMuaW50ZXJmYWNlJztcbmltcG9ydCB7IEltYWdlRGF0YU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbWFnZS1kYXRhLm1vZGVsJztcbmltcG9ydCB7IEluc2VydEJyZWFrTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2luc2VydC1icmVhay5tb2RlbCc7XG5pbXBvcnQgeyBJbnNlcnRFbGVtZW50TW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2luc2VydC1lbGVtZW50Lm1vZGVsJztcbmltcG9ydCB7IEluc2VydEltYWdlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2luc2VydC1pbWFnZS5tb2RlbCc7XG5pbXBvcnQgeyBJbnNlcnRMaW5rTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2luc2VydC1saW5rLm1vZGVsJztcbmltcG9ydCB7IEluc2VydFBhcmFncmFwaE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbnNlcnQtcGFyYWdyYXBoLm1vZGVsJztcbmltcG9ydCB7IEluc2VydFRhYmxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2luc2VydC10YWJsZS5tb2RlbCc7XG5pbXBvcnQgeyBJbnNlcnRUYWJNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LXRhYi5tb2RlbCc7XG5pbXBvcnQgeyBJVG9vbGJhclN0eWxlcyB9IGZyb20gJy4uL2NvbnRlbnQvZGlzcGxheS1kYXRhL3Rvb2xiYXItc3R5bGVzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBMaW5rRGF0YU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9saW5rLWRhdGEubW9kZWwnO1xuaW1wb3J0IHsgTGlua01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9saW5rLm1vZGVsJztcbmltcG9ydCB7IE5vZGVySW1hZ2VDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2ltYWdlL2NvbXBvbmVudHMvaW1hZ2UuY29tcG9uZW50JztcbmltcG9ydCB7IE5vZGVyVGFiQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy90YWIvdGFiLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOb2RlclRhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy90YWJsZS9jb21wb25lbnRzL3RhYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOdW1iZXJpbmdIZWxwZXIgfSBmcm9tICcuLi9nYWRnZXRzL251bWJlcmluZy9udW1iZXJpbmcuaGVscGVyJztcbmltcG9ydCB7IE51bWJlcmluZ0xldmVsTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL251bWJlcmluZy1sZXZlbC5tb2RlbCc7XG5pbXBvcnQgeyBOdW1iZXJpbmdNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvbnVtYmVyaW5nLm1vZGVsJztcbmltcG9ydCB7IE51bWJlcmluZ1BhcmFncmFwaFN0eWxlTW9kZWwgfSBmcm9tICcuLi9nYWRnZXRzL251bWJlcmluZy9udW1iZXJpbmctcGFyYWdyYXBoLXN0eWxlLm1vZGVsJztcbmltcG9ydCB7IE9wZXJhdGlvbnNIZWxwZXIgfSBmcm9tICcuLi9vcGVyYXRpb25zL29wZXJhdGlvbnMtaGVscGVyLmhlbHBlcic7XG5pbXBvcnQgeyBQYXJhZ3JhcGhNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcGFyYWdyYXBoLm1vZGVsJztcbmltcG9ydCB7IFBhcmFncmFwaFN0eWxlSGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL3BhcmFncmFwaC1zdHlsZS5oZWxwZXInO1xuaW1wb3J0IHsgUGFyYWdyYXBoU3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcGFyYWdyYXBoLXN0eWxlLm1vZGVsJztcbmltcG9ydCB7IFJhbmdlIH0gZnJvbSAnLi4vcG9zaXRpb25pbmcvcmFuZ2UnO1xuaW1wb3J0IHsgUmVwbGFjZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yZXBsYWNlLm1vZGVsJztcbmltcG9ydCB7IFJlc2l6ZVRhYmxlQ29sdW1uc01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yZXNpemUtdGFibGUtY29sdW1ucy5tb2RlbCc7XG5pbXBvcnQgeyBSZXN0b3JlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3Jlc3RvcmUubW9kZWwnO1xuaW1wb3J0IHsgU2Nyb2xsQmFyIH0gZnJvbSAnLi4vZ2FkZ2V0cy9zY3JvbGxiYXInO1xuaW1wb3J0IHsgU2VsZWN0aW9uIH0gZnJvbSAnLi4vcG9zaXRpb25pbmcvc2VsZWN0aW9uJztcbmltcG9ydCB7IFRhYmxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3RhYmxlLm1vZGVsJztcbmltcG9ydCB7IFRleHRTdHlsZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC90ZXh0LXN0eWxlLm1vZGVsJztcbmltcG9ydCB7IFVuaWNvZGVIZWxwZXIgfSBmcm9tICcuLi9nYWRnZXRzL3VuaWNvZGUvdW5pY29kZS5oZWxwZXInO1xuXG5leHBvcnQgY2xhc3MgRWRpdFNlc3Npb24ge1xuICAgIHRva2VuUmUgPSBuZXcgUmVnRXhwKCdeWycgKyBVbmljb2RlSGVscGVyLndvcmRDaGFycyArICdcXFxcJF9dKycsICdnJyk7XG5cbiAgICBub25Ub2tlblJlID0gbmV3IFJlZ0V4cCgnXig/OlteJyArIFVuaWNvZGVIZWxwZXIud29yZENoYXJzICsgJ1xcXFwkX118XFxcXHNdKSsnLCAnZycpO1xuXG4gICAgZ2V0IHNjcm9sbFRvcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsQmFyPy5zY3JvbGxUb3AgPz8gMDsgLy8gb25seSBtYWluIHNlc3Npb24gaXMgc2Nyb2xsYWJsZVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZGlzcGxheURhdGE6IERpc3BsYXlEYXRhLFxuICAgICAgICBwdWJsaWMgc2Vzc2lvbklkOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyBjdXN0b21Db250ZW50U2VydmljZTogQ3VzdG9tQ29udGVudFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBtb2RlbDogQ29udGVudHNJbnRlcmZhY2UsXG4gICAgICAgIHB1YmxpYyBzZWxlY3Rpb246IFNlbGVjdGlvbixcbiAgICAgICAgcHVibGljIGdlbmVyYWxQcm9wZXJ0aWVzOiBHZW5lcmFsUHJvcGVydGllc01vZGVsLFxuICAgICAgICBwdWJsaWMgZWRpdG9yU2VydmljZTogRWRpdG9yU2VydmljZSxcbiAgICAgICAgcHVibGljIGN1c3RvbUNvbXBvbmVudHM6IElDdXN0b21Db21wb25lbnRzLFxuICAgICAgICBwcml2YXRlIHR5cGU6ICdjZWxsJyB8ICdlZGdlJyB8ICdtYWluJyxcbiAgICAgICAgcHJpdmF0ZSBzY3JvbGxCYXI/OiBTY3JvbGxCYXJcbiAgICApIHt9XG5cbiAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBnZXRSb3dMZW5ndGgocm93OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBpZiAoIXRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBoc1tyb3ddLm5leHRMaW5lSW5kZXhlcykge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzW3Jvd10ubmV4dExpbmVJbmRleGVzLmxlbmd0aCArIDE7XG4gICAgfVxuXG4gICAgZ2V0Um93Q2FjaGVJbmRleChjYWNoZUFycmF5OiBudW1iZXJbXSwgdmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCBzdGFydCA9IDA7XG4gICAgICAgIGxldCBlbmQgPSBjYWNoZUFycmF5Lmxlbmd0aCAtIDE7XG4gICAgICAgIHdoaWxlIChzdGFydCA8PSBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pZCA9IChzdGFydCArIGVuZCkgPj4gMTtcbiAgICAgICAgICAgIGNvbnN0IGNlbnRlciA9IGNhY2hlQXJyYXlbbWlkXTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlID4gY2VudGVyKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBtaWQgKyAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA8IGNlbnRlcikge1xuICAgICAgICAgICAgICAgIGVuZCA9IG1pZCAtIDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3RhcnQgLSAxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgdGhlIHdpZHRoIG9mIHRoZSBzdHJpbmcgYHN0cmAgb24gdGhlIHNjcmVlbiB3aGlsZSBhc3N1bWluZyB0aGF0IHRoZSBzdHJpbmcgc3RhcnRzIGF0IHRoZSBmaXJzdCBjb2x1bW4gb24gdGhlIHNjcmVlbi5cbiAgICAgKiBUaGUgZmlyc3QgcG9zaXRpb24gaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBmb3IgYHN0cmAgb24gc2NyZWVuLlxuICAgICAqIFRoZSBzZWNvbmQgdmFsdWUgY29udGFpbnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBkb2N1bWVudCBjb2x1bW4gdGhhdCB0aGlzIGZ1bmN0aW9uIHJlYWQgdW50aWwuXG4gICAgICovXG4gICAgZ2V0U3RyaW5nU2NyZWVuV2lkdGgoc3RyOiBzdHJpbmcsIG1heFNjcmVlbkNvbHVtbj86IG51bWJlcik6IG51bWJlcltdIHtcbiAgICAgICAgbGV0IHNjcmVlbkNvbHVtbiA9IDA7XG4gICAgICAgIGxldCBjb2x1bW46IG51bWJlcjtcbiAgICAgICAgZm9yIChjb2x1bW4gPSAwOyBjb2x1bW4gPCBzdHIubGVuZ3RoOyBjb2x1bW4rKykge1xuICAgICAgICAgICAgc2NyZWVuQ29sdW1uICs9IDE7XG5cbiAgICAgICAgICAgIGlmIChzY3JlZW5Db2x1bW4gPiBtYXhTY3JlZW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbc2NyZWVuQ29sdW1uLCBjb2x1bW5dO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgc3RhcnRpbmcgcm93IGFuZCBjb2x1bW4sIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGBSYW5nZWAgb2YgdGhlIGZpcnN0IHdvcmQgYm91bmRhcnkgaXQgZmluZHMuXG4gICAgICovXG4gICAgZ2V0V29yZFJhbmdlKHJvdzogbnVtYmVyLCBjb2x1bW46IG51bWJlcik6IFJhbmdlIHtcbiAgICAgICAgY29uc3QgbGluZSA9IHRoaXMuZGlzcGxheURhdGEuZ2V0UGFyYWdyYXBoQ29udGVudChyb3cpO1xuICAgICAgICBsZXQgaW5Ub2tlbiA9IGZhbHNlO1xuICAgICAgICBpZiAoY29sdW1uID4gMCkge1xuICAgICAgICAgICAgaW5Ub2tlbiA9ICEhbGluZS5jaGFyQXQoY29sdW1uIC0gMSkubWF0Y2godGhpcy50b2tlblJlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaW5Ub2tlbikge1xuICAgICAgICAgICAgaW5Ub2tlbiA9ICEhbGluZS5jaGFyQXQoY29sdW1uKS5tYXRjaCh0aGlzLnRva2VuUmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlZ2V4cDogUmVnRXhwO1xuICAgICAgICBpZiAoaW5Ub2tlbikge1xuICAgICAgICAgICAgcmVnZXhwID0gdGhpcy50b2tlblJlO1xuICAgICAgICB9IGVsc2UgaWYgKC9eXFxzKyQvLnRlc3QobGluZS5zbGljZShjb2x1bW4gLSAxLCBjb2x1bW4gKyAxKSkpIHtcbiAgICAgICAgICAgIHJlZ2V4cCA9IC9cXHMvO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVnZXhwID0gdGhpcy5ub25Ub2tlblJlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0YXJ0ID0gY29sdW1uO1xuICAgICAgICBpZiAoc3RhcnQgPiAwKSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgc3RhcnQtLTtcbiAgICAgICAgICAgIH0gd2hpbGUgKHN0YXJ0ID49IDAgJiYgbGluZS5jaGFyQXQoc3RhcnQpLm1hdGNoKHJlZ2V4cCkpO1xuXG4gICAgICAgICAgICBzdGFydCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVuZCA9IGNvbHVtbjtcbiAgICAgICAgd2hpbGUgKGVuZCA8IGxpbmUubGVuZ3RoICYmIGxpbmUuY2hhckF0KGVuZCkubWF0Y2gocmVnZXhwKSkge1xuICAgICAgICAgICAgZW5kKys7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFJhbmdlKG5ldyBDdXJzb3JQYXJhZ3JhcGgocm93LCBzdGFydCksIG5ldyBDdXJzb3JQYXJhZ3JhcGgocm93LCBlbmQpKTtcbiAgICB9XG5cbiAgICBnZXREaXNwbGF5TGluZShyb3c6IG51bWJlciwgZW5kQ29sdW1uOiBudW1iZXIsIHN0YXJ0Q29sdW1uPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoQ29udGVudCA9IHRoaXMuZGlzcGxheURhdGEuZ2V0UGFyYWdyYXBoQ29udGVudChyb3cpO1xuXG4gICAgICAgIHJldHVybiBwYXJhZ3JhcGhDb250ZW50LnN1YnN0cmluZyhzdGFydENvbHVtbiB8fCAwLCBlbmRDb2x1bW4gfHwgcGFyYWdyYXBoQ29udGVudC5sZW5ndGgpO1xuICAgIH1cblxuICAgIHJlbW92ZUJ5RG9jdW1lbnRJbmRleGVzKHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGFydFBhcmFncmFwaFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHN0YXJ0SW5kZXgpO1xuICAgICAgICBjb25zdCBlbmRQYXJhZ3JhcGhQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBlbmRJbmRleCk7XG4gICAgICAgIHRoaXMucmVtb3ZlKG5ldyBSYW5nZShzdGFydFBhcmFncmFwaFBvc2l0aW9uLCBlbmRQYXJhZ3JhcGhQb3NpdGlvbikpO1xuICAgIH1cblxuICAgIGluc2VydFRleHRCeURvY3VtZW50SW5kZXgoaW5kZXg6IG51bWJlciwgdGV4dDogc3RyaW5nLCBzdHlsZT86IFRleHRTdHlsZU1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgaW5kZXgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRUZXh0KHBhcmFncmFwaFBvc2l0aW9uLCB0ZXh0LCBzdHlsZSk7XG4gICAgfVxuXG4gICAgaW5zZXJ0RWxlbWVudEJ5RG9jdW1lbnRJbmRleChpbnNlcnRFbGVtZW50OiBJbnNlcnRFbGVtZW50TW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBlbGVtZW50UG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgaW5zZXJ0RWxlbWVudC5lbGVtZW50Lmluc2VydEluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RWxlbWVudChlbGVtZW50UG9zaXRpb24sIGluc2VydEVsZW1lbnQuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0QnJlYWtCeURvY3VtZW50SW5kZXgoaW5zZXJ0RWxlbWVudDogSW5zZXJ0QnJlYWtNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBpbnNlcnRFbGVtZW50Lmluc2VydEluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0QnJlYWsoZWxlbWVudFBvc2l0aW9uLCBpbnNlcnRFbGVtZW50LmJyZWFrVHlwZSBhcyBCcmVha1R5cGVzKTtcbiAgICB9XG5cbiAgICBpbnNlcnRUYWJCeURvY3VtZW50SW5kZXgoaW5zZXJ0RWxlbWVudDogSW5zZXJ0VGFiTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBlbGVtZW50UG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgaW5zZXJ0RWxlbWVudC5pbnNlcnRJbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluc2VydFRhYihlbGVtZW50UG9zaXRpb24pO1xuICAgIH1cblxuICAgIGluc2VydEltYWdlQnlEb2N1bWVudEluZGV4KGluc2VydEVsZW1lbnQ6IEluc2VydEltYWdlTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBlbGVtZW50UG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgaW5zZXJ0RWxlbWVudC5pbnNlcnRJbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluc2VydEltYWdlKGVsZW1lbnRQb3NpdGlvbiwgaW5zZXJ0RWxlbWVudC5pbWFnZURhdGEpO1xuICAgIH1cblxuICAgIGluc2VydFRhYmxlQnlEb2N1bWVudEluZGV4KGluc2VydEVsZW1lbnQ6IEluc2VydFRhYmxlTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBlbGVtZW50UG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgaW5zZXJ0RWxlbWVudC5pbnNlcnRJbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluc2VydFRhYmxlKGVsZW1lbnRQb3NpdGlvbiwgaW5zZXJ0RWxlbWVudCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0TGlua0J5RG9jdW1lbnRJbmRleChpbnNlcnRFbGVtZW50OiBJbnNlcnRMaW5rTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBlbGVtZW50UG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgaW5zZXJ0RWxlbWVudC5pbnNlcnRJbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluc2VydExpbmsoZWxlbWVudFBvc2l0aW9uLCBpbnNlcnRFbGVtZW50LmxpbmtEYXRhTW9kZWwpO1xuICAgIH1cblxuICAgIGluc2VydFBhcmFncmFwaEJ5RG9jdW1lbnRJbmRleChpbnNlcnRFbGVtZW50OiBJbnNlcnRQYXJhZ3JhcGhNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBpbnNlcnRFbGVtZW50Lmluc2VydEluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0UGFyYWdyYXBoKGVsZW1lbnRQb3NpdGlvbiwgaW5zZXJ0RWxlbWVudCk7XG4gICAgfVxuXG4gICAgYXBwbHlUZXh0U3R5bGUoc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyLCB0ZXh0U3R5bGU6IFRleHRTdHlsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHN0YXJ0SW5kZXgpLnJvdztcbiAgICAgICAgY29uc3QgZW5kUGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGVuZEluZGV4KS5yb3c7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuYXBwbHlUZXh0U3R5bGUodGhpcy5tb2RlbCwgc3RhcnRJbmRleCwgZW5kSW5kZXgsIHRleHRTdHlsZSk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHN0YXJ0UGFyYWdyYXBoLCBlbmRQYXJhZ3JhcGgpO1xuICAgICAgICB0aGlzLnNldFRleHRTdHlsZSh0ZXh0U3R5bGUpO1xuICAgIH1cblxuICAgIGFwcGx5UGFyYWdyYXBoU3R5bGUoc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyLCBwYXJhZ3JhcGhTdHlsZTogUGFyYWdyYXBoU3R5bGVNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGFydFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBzdGFydEluZGV4KS5yb3c7XG4gICAgICAgIGNvbnN0IGVuZFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBlbmRJbmRleCkucm93O1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmFwcGx5UGFyYWdyYXBoU3R5bGUodGhpcy5tb2RlbCwgc3RhcnRJbmRleCwgZW5kSW5kZXgsIHBhcmFncmFwaFN0eWxlKTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMoc3RhcnRQYXJhZ3JhcGgsIGVuZFBhcmFncmFwaCk7XG4gICAgICAgIHRoaXMuYXBwbHlUb29sYmFyU3R5bGVzKCk7XG4gICAgfVxuXG4gICAgYXBwbHlFbGVtZW50U3R5bGUobW9kZWw6IEFwcGx5RWxlbWVudFN0eWxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5hcHBseUVsZW1lbnRTdHlsZSh0aGlzLm1vZGVsLCBtb2RlbCk7XG4gICAgICAgIGNvbnN0IGltYWdlQ29tcG9uZW50UmVmID0gdGhpcy5jdXN0b21Db21wb25lbnRzLmN1c3RvbUVsZW1lbnRzLmZpbmQoeCA9PiB4Lmluc3RhbmNlLmluc2VydEluZGV4ID09PSBtb2RlbC5pbnNlcnRJbmRleCk7XG4gICAgICAgIGltYWdlQ29tcG9uZW50UmVmLmluc3RhbmNlLmluaXRpYWxpemUoKTtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIG1vZGVsLmluc2VydEluZGV4KS5yb3c7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHBhcmFncmFwaCwgcGFyYWdyYXBoKTtcbiAgICB9XG5cbiAgICBhZGROdW1iZXJpbmcobGV2ZWxzOiBOdW1iZXJpbmdMZXZlbE1vZGVsW10sIHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGFydFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBzdGFydEluZGV4KS5yb3c7XG4gICAgICAgIGNvbnN0IGVuZFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBlbmRJbmRleCkucm93O1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmFkZE51bWJlcmluZyh0aGlzLm1vZGVsLCB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLm51bWJlcmluZ3MsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBsZXZlbHMpO1xuICAgICAgICB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLm51bWJlcmluZ0luZm8gPSB7fTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMoc3RhcnRQYXJhZ3JhcGgsIGVuZFBhcmFncmFwaCk7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydFBhcmFncmFwaDsgaSA8PSBlbmRQYXJhZ3JhcGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGlzcGxheURhdGEuZ2V0UGFyYWdyYXBoU2V0dGluZ3MoaSkubnVtYmVyaW5nRGF0YS5udW1iZXJpbmdJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShlbmRQYXJhZ3JhcGggKyAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXBwbHlUb29sYmFyU3R5bGVzKCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlTnVtYmVyaW5ncyhzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgc3RhcnRJbmRleCkucm93O1xuICAgICAgICBjb25zdCBlbmRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgZW5kSW5kZXgpLnJvdztcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZW1vdmVOdW1iZXJpbmdzKHRoaXMubW9kZWwsIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMubnVtYmVyaW5ncywgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnJlc2V0QWxsTnVtYmVyaW5nSW5mbyhzdGFydFBhcmFncmFwaCk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHN0YXJ0UGFyYWdyYXBoLCBlbmRQYXJhZ3JhcGgpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU51bWJlcmluZ3NEYXRhT25DaGFuZ2UoZW5kUGFyYWdyYXBoKTtcblxuICAgICAgICB0aGlzLmFwcGx5VG9vbGJhclN0eWxlcygpO1xuICAgIH1cblxuICAgIHJlc3RvcmVOdW1iZXJpbmdzKHBhcmFncmFwaHM6IFBhcmFncmFwaE1vZGVsW10sIG51bWJlcmluZ3M6IE51bWJlcmluZ01vZGVsW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IHBhcmFncmFwaHNbMF0uaW5zZXJ0SW5kZXg7XG4gICAgICAgIGNvbnN0IGVuZEluZGV4ID0gcGFyYWdyYXBoc1twYXJhZ3JhcGhzLmxlbmd0aCAtIDFdLmluc2VydEluZGV4O1xuICAgICAgICBjb25zdCBzdGFydFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBzdGFydEluZGV4KS5yb3c7XG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhXaXRoT2Zmc2V0KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgZW5kSW5kZXgpO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLnJlc3RvcmVOdW1iZXJpbmdzKHRoaXMubW9kZWwsIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMubnVtYmVyaW5ncywgcGFyYWdyYXBocywgbnVtYmVyaW5ncyk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEucmVzZXRBbGxOdW1iZXJpbmdJbmZvKHN0YXJ0UGFyYWdyYXBoKTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMoc3RhcnRQYXJhZ3JhcGgsIGVuZFBvc2l0aW9uLnJvdyk7XG4gICAgICAgIGZvciAoY29uc3QgcGFyYWdyYXBoIG9mIHBhcmFncmFwaHMpIHtcbiAgICAgICAgICAgIGlmIChwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU51bWJlcmluZ3NEYXRhT25DaGFuZ2UoZW5kUG9zaXRpb24ucm93ICsgMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG4gICAgICAgIHRoaXMuYXBwbHlUb29sYmFyU3R5bGVzKCk7XG4gICAgfVxuXG4gICAgYXBwbHlJbWFnZVN0eWxlKGFwcGx5SW1hZ2U6IEFwcGx5SW1hZ2VTdHlsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGltYWdlQ29tcG9uZW50UmVmID0gdGhpcy5jdXN0b21Db21wb25lbnRzLmltYWdlcy5maW5kKHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA9PT0gYXBwbHlJbWFnZS5pbnNlcnRJbmRleCk7XG4gICAgICAgIGltYWdlQ29tcG9uZW50UmVmLmluc3RhbmNlLnJlc2l6ZSh7IHdpZHRoOiBhcHBseUltYWdlLndpZHRoLCBoZWlnaHQ6IGFwcGx5SW1hZ2UuaGVpZ2h0IH0pO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmFwcGx5SW1hZ2VTdHlsZSh0aGlzLm1vZGVsLCBhcHBseUltYWdlKTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLmRpc3BsYXlEYXRhLmluZGV4VG9Qb3NpdGlvbihhcHBseUltYWdlLmluc2VydEluZGV4LCAwKTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMoc3RhcnQucm93LCB0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMubGVuZ3RoIC0gMSk7XG4gICAgfVxuXG4gICAgcmVzdG9yZVRleHRTdHlsZXMoZm9ybWF0czogRm9ybWF0TW9kZWxbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gZm9ybWF0c1swXS5zdGFydEluZGV4O1xuICAgICAgICBjb25zdCBlbmRJbmRleCA9IGZvcm1hdHNbZm9ybWF0cy5sZW5ndGggLSAxXS5lbmRJbmRleDtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgc3RhcnRJbmRleCkucm93O1xuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoV2l0aE9mZnNldCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGVuZEluZGV4KTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZXN0b3JlVGV4dFN0eWxlcyh0aGlzLm1vZGVsLCBmb3JtYXRzKTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMoc3RhcnRQYXJhZ3JhcGgsIGVuZFBvc2l0aW9uLnJvdyk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvc2l0aW9uKTtcbiAgICAgICAgdGhpcy5hcHBseVRvb2xiYXJTdHlsZXMoKTtcbiAgICB9XG5cbiAgICByZXN0b3JlUGFyYWdyYXBoU3R5bGVzKHBhcmFncmFwaHM6IFBhcmFncmFwaE1vZGVsW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IHBhcmFncmFwaHNbMF0uaW5zZXJ0SW5kZXg7XG4gICAgICAgIGNvbnN0IGVuZEluZGV4ID0gcGFyYWdyYXBoc1twYXJhZ3JhcGhzLmxlbmd0aCAtIDFdLmluc2VydEluZGV4O1xuICAgICAgICBjb25zdCBzdGFydFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBzdGFydEluZGV4KS5yb3c7XG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhXaXRoT2Zmc2V0KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgZW5kSW5kZXgpO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLnJlc3RvcmVQYXJhZ3JhcGhTdHlsZXModGhpcy5tb2RlbCwgcGFyYWdyYXBocyk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHN0YXJ0UGFyYWdyYXBoLCBlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG4gICAgICAgIHRoaXMuYXBwbHlUb29sYmFyU3R5bGVzKCk7XG4gICAgfVxuXG4gICAgc2V0VGV4dFN0eWxlKHRleHRTdHlsZTogVGV4dFN0eWxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBJVG9vbGJhclN0eWxlcyA9IHsgLi4udGhpcy5lZGl0b3JTZXJ2aWNlLnN0eWxlcyB9O1xuICAgICAgICBmb3IgKGxldCBrZXkgb2YgT2JqZWN0LmtleXModGV4dFN0eWxlKSkge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB0ZXh0U3R5bGVba2V5XTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2Uuc3R5bGVzID0gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGByYW5nZWAgZnJvbSB0aGUgZG9jdW1lbnQuXG4gICAgICogSWYgYHJhbmdlYCBpcyBlbXB0eSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB1bm1vZGlmaWVkIHZhbHVlIG9mIGByYW5nZS5zdGFydGAuXG4gICAgICovXG4gICAgcmVtb3ZlKHJhbmdlOiBSYW5nZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJ0SW5kZXhlcyA9IENvbnRlbnRIZWxwZXIuZ2V0U2VsZWN0ZWRQYXJ0RG9jdW1lbnRJbmRleGVzKHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgcmFuZ2UpO1xuXG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEucmVtb3ZlUmFuZ2UocmFuZ2UpO1xuXG4gICAgICAgIEN1c3RvbUNvbXBvbmVudEhlbHBlci5hcHBseVJlbW92aW5nQ29tcG9uZW50cyh0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLCBwYXJ0SW5kZXhlcy5zdGFydEluZGV4LCBwYXJ0SW5kZXhlcy5lbmRJbmRleCk7XG4gICAgICAgIEN1c3RvbUNvbXBvbmVudEhlbHBlci5hcHBseVJlbW92aW5nQ29tcG9uZW50cyh0aGlzLmN1c3RvbUNvbXBvbmVudHMuaW1hZ2VzLCBwYXJ0SW5kZXhlcy5zdGFydEluZGV4LCBwYXJ0SW5kZXhlcy5lbmRJbmRleCk7XG4gICAgICAgIEN1c3RvbUNvbXBvbmVudEhlbHBlci5hcHBseVJlbW92aW5nQ29tcG9uZW50cyh0aGlzLmN1c3RvbUNvbXBvbmVudHMuY3VzdG9tRWxlbWVudHMsIHBhcnRJbmRleGVzLnN0YXJ0SW5kZXgsIHBhcnRJbmRleGVzLmVuZEluZGV4KTtcbiAgICAgICAgQ3VzdG9tQ29tcG9uZW50SGVscGVyLmFwcGx5UmVtb3ZpbmdDb21wb25lbnRzKHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzLCBwYXJ0SW5kZXhlcy5zdGFydEluZGV4LCBwYXJ0SW5kZXhlcy5lbmRJbmRleCk7XG5cbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5kZWxldGUodGhpcy5tb2RlbCwgcGFydEluZGV4ZXMuc3RhcnRJbmRleCwgcGFydEluZGV4ZXMuZW5kSW5kZXgpO1xuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKHJhbmdlLnN0YXJ0KTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS5yZXNldEFsbE51bWJlcmluZ0luZm8ocmFuZ2Uuc3RhcnQucm93KTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMocmFuZ2Uuc3RhcnQucm93LCByYW5nZS5zdGFydC5yb3cpO1xuICAgICAgICBpZiAocmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdyAmJiB0aGlzLnR5cGUgIT09ICdjZWxsJykge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKHJhbmdlLnN0YXJ0LnJvdyArIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHBseVRvb2xiYXJTdHlsZXMoKTtcbiAgICB9XG5cbiAgICByZXBsYWNlKG1vZGVsOiBSZXBsYWNlTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICB0aGlzLnJlbW92ZUJ5RG9jdW1lbnRJbmRleGVzKG1vZGVsLmRlbGV0ZS5zdGFydEluZGV4LCBtb2RlbC5kZWxldGUuZW5kSW5kZXggKyAxKTtcbiAgICAgICAgbGV0IGVuZFBvaW50OiBDdXJzb3JQYXJhZ3JhcGg7XG4gICAgICAgIGlmIChtb2RlbC5pbnNlcnRUZXh0KSB7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0VGV4dEJ5RG9jdW1lbnRJbmRleChtb2RlbC5pbnNlcnRUZXh0Lmluc2VydEluZGV4LCBtb2RlbC5pbnNlcnRUZXh0LnRleHQpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydFBhcmFncmFwaCkge1xuICAgICAgICAgICAgZW5kUG9pbnQgPSB0aGlzLmluc2VydFBhcmFncmFwaEJ5RG9jdW1lbnRJbmRleChtb2RlbC5pbnNlcnRQYXJhZ3JhcGgpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVuZFBvaW50ID0gdGhpcy5pbnNlcnRFbGVtZW50QnlEb2N1bWVudEluZGV4KG1vZGVsLmluc2VydEVsZW1lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydEJyZWFrKSB7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0QnJlYWtCeURvY3VtZW50SW5kZXgobW9kZWwuaW5zZXJ0QnJlYWspO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydFRhYikge1xuICAgICAgICAgICAgZW5kUG9pbnQgPSB0aGlzLmluc2VydFRhYkJ5RG9jdW1lbnRJbmRleChtb2RlbC5pbnNlcnRUYWIpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydEltYWdlKSB7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0SW1hZ2VCeURvY3VtZW50SW5kZXgobW9kZWwuaW5zZXJ0SW1hZ2UpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydFRhYmxlKSB7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0VGFibGVCeURvY3VtZW50SW5kZXgobW9kZWwuaW5zZXJ0VGFibGUpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydExpbmspIHtcbiAgICAgICAgICAgIGVuZFBvaW50ID0gdGhpcy5pbnNlcnRMaW5rQnlEb2N1bWVudEluZGV4KG1vZGVsLmluc2VydExpbmspO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVuZFBvaW50O1xuICAgIH1cblxuICAgIGluc2VydFRleHQocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCwgdGV4dDogc3RyaW5nLCBjdXJzb3JTdHlsZT86IFRleHRTdHlsZU1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFBvc2l0aW9uVG9Eb2N1bWVudEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgcG9zaXRpb24pO1xuICAgICAgICBpZiAoY3Vyc29yU3R5bGUpIHtcbiAgICAgICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuaW5zZXJ0U3R5bGVkVGV4dCh0aGlzLm1vZGVsLCB0ZXh0LCBpbnNlcnRJbmRleCwgY3Vyc29yU3R5bGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRUZXh0KHRoaXMubW9kZWwsIHRleHQsIGluc2VydEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IHRoaXMuZGlzcGxheURhdGEuaW5zZXJ0VGV4dChwb3NpdGlvbiwgdGV4dCk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEucmVzZXRBbGxOdW1iZXJpbmdJbmZvKHBvc2l0aW9uLnJvdyk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHBvc2l0aW9uLnJvdywgZW5kUG9zaXRpb24ucm93KTtcbiAgICAgICAgaWYgKGVuZFBvc2l0aW9uLnJvdyAtIHBvc2l0aW9uLnJvdyAmJiB0aGlzLnR5cGUgIT09ICdjZWxsJykge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFBvc2l0aW9uLnJvdyArIDEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIGVuZFBvc2l0aW9uO1xuICAgIH1cblxuICAgIGluc2VydEVsZW1lbnQocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCwgZWxlbWVudDogRWxlbWVudERhdGFNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgaW5zZXJ0RWxlbWVudCA9IG5ldyBJbnNlcnRFbGVtZW50TW9kZWwoeyBlbGVtZW50OiBuZXcgRWxlbWVudE1vZGVsKHsgaW5zZXJ0SW5kZXgsIC4uLmVsZW1lbnQgfSkgfSk7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuaW5zZXJ0RWxlbWVudCh0aGlzLm1vZGVsLCBpbnNlcnRFbGVtZW50KTtcblxuICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWwuZWxlbWVudHMuZmluZCh4ID0+IHguaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuY3VzdG9tQ29udGVudFNlcnZpY2UuZmluZENvbXBvbmVudFR5cGUobW9kZWwudHlwZSk7XG4gICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KHRoaXMuY3VzdG9tQ29tcG9uZW50cy5jdXN0b21FbGVtZW50cywgbW9kZWwsIHR5cGUpO1xuXG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gdGhpcy5kaXNwbGF5RGF0YS5pbnNlcnRUZXh0KHBvc2l0aW9uLCBDVVNUT01fRUxFTUVOVF9NQVJLRVIpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhwb3NpdGlvbi5yb3csIGVuZFBvc2l0aW9uLnJvdyk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIGVuZFBvc2l0aW9uO1xuICAgIH1cblxuICAgIGluc2VydEJyZWFrKHBvc2l0aW9uOiBDdXJzb3JQYXJhZ3JhcGgsIGJyZWFrVHlwZTogQnJlYWtUeXBlcyk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgaXNPbk5ld1BhcmFncmFwaCA9XG4gICAgICAgICAgICBicmVha1R5cGUgPT09IEJyZWFrVHlwZXMuUGFnZSAmJlxuICAgICAgICAgICAgQnJlYWtIZWxwZXIuZ2V0QnJlYWtUeXBlKHRoaXMubW9kZWwsIENVU1RPTV9FTEVNRU5UX01BUktFUiwgaW5zZXJ0SW5kZXggLSAxKSAhPT0gQnJlYWtUeXBlcy5QYWdlO1xuICAgICAgICBjb25zdCB0ZXh0ID0gaXNPbk5ld1BhcmFncmFwaCA/IGAke05FV19MSU5FX01BUktVUH0ke0NVU1RPTV9FTEVNRU5UX01BUktFUn1gIDogQ1VTVE9NX0VMRU1FTlRfTUFSS0VSO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydEJyZWFrKHRoaXMubW9kZWwsIHRleHQsIGluc2VydEluZGV4LCBicmVha1R5cGUpO1xuXG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gdGhpcy5kaXNwbGF5RGF0YS5pbnNlcnRUZXh0KHBvc2l0aW9uLCB0ZXh0KTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMocG9zaXRpb24ucm93LCBlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICBpZiAoaXNPbk5ld1BhcmFncmFwaCAmJiBlbmRQb3NpdGlvbi5yb3cgLSBwb3NpdGlvbi5yb3cpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSB0aGlzLmRpc3BsYXlEYXRhLmdldFBvc2l0aW9uQWZ0ZXJCcmVhayhlbmRQb3NpdGlvbiwgYnJlYWtUeXBlKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoY3Vyc29yUG9zaXRpb24pO1xuXG4gICAgICAgIHJldHVybiBlbmRQb3NpdGlvbjtcbiAgICB9XG5cbiAgICBpbnNlcnRUYWIocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHBvc2l0aW9uKTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRUYWIodGhpcy5tb2RlbCwgaW5zZXJ0SW5kZXgpO1xuXG4gICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbC50YWJzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzLCBtb2RlbCwgTm9kZXJUYWJDb21wb25lbnQpO1xuXG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gdGhpcy5kaXNwbGF5RGF0YS5pbnNlcnRUZXh0KHBvc2l0aW9uLCBDVVNUT01fRUxFTUVOVF9NQVJLRVIpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhwb3NpdGlvbi5yb3csIHBvc2l0aW9uLnJvdyk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9zaXRpb24pO1xuICAgICAgICByZXR1cm4gZW5kUG9zaXRpb247XG4gICAgfVxuXG4gICAgaW5zZXJ0SW1hZ2UocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCwgaW1hZ2VEYXRhOiBJbWFnZURhdGFNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHBvc2l0aW9uKTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRJbWFnZSh0aGlzLm1vZGVsLCBpbnNlcnRJbmRleCwgaW1hZ2VEYXRhKTtcblxuICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWwuaW1hZ2VzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KHRoaXMuY3VzdG9tQ29tcG9uZW50cy5pbWFnZXMsIG1vZGVsLCBOb2RlckltYWdlQ29tcG9uZW50KTtcblxuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IHRoaXMuZGlzcGxheURhdGEuaW5zZXJ0VGV4dChwb3NpdGlvbiwgQ1VTVE9NX0VMRU1FTlRfTUFSS0VSKTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMocG9zaXRpb24ucm93LCBwb3NpdGlvbi5yb3cpO1xuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvc2l0aW9uKTtcblxuICAgICAgICByZXR1cm4gZW5kUG9zaXRpb247XG4gICAgfVxuXG4gICAgaW5zZXJ0TGluayhwb3NpdGlvbjogQ3Vyc29yUGFyYWdyYXBoLCBsaW5rRGF0YTogTGlua0RhdGFNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgbGlua1N0eWxlID0gbmV3IFRleHRTdHlsZU1vZGVsKHtcbiAgICAgICAgICAgIGhlYWRpbmdTdHlsZUlkOiBIWVBFUkxJTktfSEVBRElOR19TVFlMRV9JRCxcbiAgICAgICAgICAgIHVuZGVybGluZTogdHJ1ZSxcbiAgICAgICAgICAgIGZvbnRDb2xvcjogSFlQRVJMSU5LX0ZPTlRfQ09MT1JcbiAgICAgICAgfSk7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuaW5zZXJ0TGluayh0aGlzLm1vZGVsLCBsaW5rRGF0YS50ZXh0LCBsaW5rRGF0YS5saW5rLCBpbnNlcnRJbmRleCwgbGlua1N0eWxlKTtcblxuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IHRoaXMuZGlzcGxheURhdGEuaW5zZXJ0VGV4dChwb3NpdGlvbiwgbGlua0RhdGEudGV4dCk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHBvc2l0aW9uLnJvdywgcG9zaXRpb24ucm93KTtcblxuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG4gICAgICAgIHJldHVybiBlbmRQb3NpdGlvbjtcbiAgICB9XG5cbiAgICBpbnNlcnRUYWJsZShwb3NpdGlvbjogQ3Vyc29yUGFyYWdyYXBoLCB0YWJsZU1vZGVsOiBJbnNlcnRUYWJsZU1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFBvc2l0aW9uVG9Eb2N1bWVudEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgcG9zaXRpb24pO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydFRhYmxlKHRoaXMubW9kZWwsIGluc2VydEluZGV4LCB0YWJsZU1vZGVsLCB0aGlzLmRpc3BsYXlEYXRhLmNvbnRlbnRXaWR0aCk7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbC50YWJsZXMuZmluZCh4ID0+IHguaW5zZXJ0SW5kZXggPT09IHRhYmxlTW9kZWwuaW5zZXJ0VGFibGVJbmRleCk7XG4gICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMsIG1vZGVsLCBOb2RlclRhYmxlQ29tcG9uZW50KTtcbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSB0aGlzLmRpc3BsYXlEYXRhLmluc2VydFRleHQocG9zaXRpb24sIHRhYmxlTW9kZWwuY29udGVudCk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHBvc2l0aW9uLnJvdywgZW5kUG9zaXRpb24ucm93KTtcbiAgICAgICAgaWYgKGVuZFBvc2l0aW9uLnJvdyAtIHBvc2l0aW9uLnJvdykge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFBvc2l0aW9uLnJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9zaXRpb24pO1xuICAgICAgICByZXR1cm4gZW5kUG9zaXRpb247XG4gICAgfVxuXG4gICAgaW5zZXJ0UGFyYWdyYXBoKHBvc2l0aW9uOiBDdXJzb3JQYXJhZ3JhcGgsIHBhcmFncmFwaE1vZGVsOiBJbnNlcnRQYXJhZ3JhcGhNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgdGV4dCA9IE9wZXJhdGlvbnNIZWxwZXIuaW5zZXJ0UGFyYWdyYXBoKHRoaXMubW9kZWwsIGluc2VydEluZGV4LCBwYXJhZ3JhcGhNb2RlbCwgdGhpcy5kaXNwbGF5RGF0YS5jb250ZW50V2lkdGgpO1xuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IHRoaXMuZGlzcGxheURhdGEuaW5zZXJ0VGV4dChwb3NpdGlvbiwgdGV4dCk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHBvc2l0aW9uLnJvdywgZW5kUG9zaXRpb24ucm93KTtcbiAgICAgICAgaWYgKGVuZFBvc2l0aW9uLnJvdyAtIHBvc2l0aW9uLnJvdykge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFBvc2l0aW9uLnJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGVuZFBvaW50OiBDdXJzb3JQYXJhZ3JhcGg7XG4gICAgICAgIGlmIChwYXJhZ3JhcGhNb2RlbC5pbnNlcnRUZXh0KSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGhQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgoXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLFxuICAgICAgICAgICAgICAgIHBhcmFncmFwaE1vZGVsLmluc2VydFRleHQuaW5zZXJ0SW5kZXhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuZGlzcGxheURhdGEuaW5zZXJ0VGV4dChwYXJhZ3JhcGhQb3NpdGlvbiwgdGV4dCk7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhwYXJhZ3JhcGhQb3NpdGlvbi5yb3csIGVuZFBvaW50LnJvdyk7XG4gICAgICAgICAgICBpZiAoZW5kUG9pbnQucm93IC0gcGFyYWdyYXBoUG9zaXRpb24ucm93KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFBvaW50LnJvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb2ludCk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFyYWdyYXBoTW9kZWwuaW5zZXJ0SW1hZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFncmFwaFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleChcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsXG4gICAgICAgICAgICAgICAgcGFyYWdyYXBoTW9kZWwuaW5zZXJ0SW1hZ2UuaW5zZXJ0SW5kZXhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBpbWFnZUluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbC5pbWFnZXMuZmluZCh4ID0+IHguaW5zZXJ0SW5kZXggPT09IGltYWdlSW5zZXJ0SW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5hZGRDb21wb25lbnQodGhpcy5jdXN0b21Db21wb25lbnRzLmltYWdlcywgbW9kZWwsIE5vZGVySW1hZ2VDb21wb25lbnQpO1xuICAgICAgICAgICAgZW5kUG9pbnQgPSB0aGlzLmRpc3BsYXlEYXRhLmluc2VydFRleHQocGFyYWdyYXBoUG9zaXRpb24sIENVU1RPTV9FTEVNRU5UX01BUktFUik7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhwYXJhZ3JhcGhQb3NpdGlvbi5yb3csIHBhcmFncmFwaFBvc2l0aW9uLnJvdyk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb2ludCk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFyYWdyYXBoTW9kZWwuaW5zZXJ0VGFibGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFncmFwaFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleChcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsXG4gICAgICAgICAgICAgICAgcGFyYWdyYXBoTW9kZWwuaW5zZXJ0VGFibGUuaW5zZXJ0SW5kZXhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWwudGFibGVzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSBwYXJhZ3JhcGhNb2RlbC5pbnNlcnRUYWJsZS5pbnNlcnRUYWJsZUluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMsIG1vZGVsLCBOb2RlclRhYmxlQ29tcG9uZW50KTtcbiAgICAgICAgICAgIGVuZFBvaW50ID0gdGhpcy5kaXNwbGF5RGF0YS5pbnNlcnRUZXh0KHBhcmFncmFwaFBvc2l0aW9uLCBwYXJhZ3JhcGhNb2RlbC5pbnNlcnRUYWJsZS5jb250ZW50KTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHBhcmFncmFwaFBvc2l0aW9uLnJvdywgZW5kUG9pbnQucm93KTtcbiAgICAgICAgICAgIGlmIChlbmRQb2ludC5yb3cgLSBwYXJhZ3JhcGhQb3NpdGlvbi5yb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU51bWJlcmluZ3NEYXRhT25DaGFuZ2UoZW5kUG9pbnQucm93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvaW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW5kUG9pbnQ7XG4gICAgfVxuXG4gICAgYWRkQ29tcG9uZW50PFQgZXh0ZW5kcyBCYXNlTm9kZXJDb21wb25lbnQ+KGN1c3RvbUVsZW1lbnRzOiBDb21wb25lbnRSZWY8VD5bXSwgbW9kZWw6IEN1c3RvbUNvbnRlbnQsIGNvbXBvbmVudFR5cGU6IFR5cGU8VD4pIHtcbiAgICAgICAgY29uc3QgY3VzdG9tRWxlbWVudCA9IHRoaXMuY3VzdG9tQ29udGVudFNlcnZpY2UuY29tcG9uZW50U2VydmljZS5nZW5lcmF0ZUNvbXBvbmVudChjb21wb25lbnRUeXBlLCB7XG4gICAgICAgICAgICBjb250ZW50OiBtb2RlbCxcbiAgICAgICAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICAgICAgICBnZW5lcmFsUHJvcGVydGllczogdGhpcy5nZW5lcmFsUHJvcGVydGllcyxcbiAgICAgICAgICAgIGNvbnRlbnRXaWR0aDogdGhpcy5kaXNwbGF5RGF0YS5jb250ZW50V2lkdGhcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5ld0VsZW1lbnRQb3NpdGlvbiA9IGN1c3RvbUVsZW1lbnRzLmZpbmRJbmRleCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPiBtb2RlbC5pbnNlcnRJbmRleCk7XG4gICAgICAgIGlmIChuZXdFbGVtZW50UG9zaXRpb24gPj0gMCkge1xuICAgICAgICAgICAgY3VzdG9tRWxlbWVudHMuc3BsaWNlKG5ld0VsZW1lbnRQb3NpdGlvbiwgMCwgY3VzdG9tRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXN0b21FbGVtZW50cy5wdXNoKGN1c3RvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXBwbHlUb29sYmFyU3R5bGVzKCk6IHZvaWQge1xuICAgICAgICAvLyB1bmRlZmluZWQgLSB2YWx1ZSB3YXNuJ3Qgc2V0XG4gICAgICAgIC8vIG51bGwgLSBjb2xsaXNpb24gKGRpZmZlcmVudCB2YWx1ZXMgYXQgdGhlIHNhbWUgdGltZSlcbiAgICAgICAgLy8gdmFsdWUgLSB2YWx1ZSB3YXMgc2V0IHdpdGhvdXQgY29sbGlzaW9uc1xuICAgICAgICBsZXQgc3RhcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCB0aGlzLnNlbGVjdGlvbi5yYW5nZS5zdGFydCk7XG4gICAgICAgIGxldCBlbmRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCB0aGlzLnNlbGVjdGlvbi5yYW5nZS5lbmQpO1xuICAgICAgICBpZiAoc3RhcnRJbmRleCAhPT0gZW5kSW5kZXgpIHtcbiAgICAgICAgICAgIGVuZEluZGV4LS07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb24uY3Vyc29yLmNvbHVtbiA+IDApIHtcbiAgICAgICAgICAgIHN0YXJ0SW5kZXgtLTtcbiAgICAgICAgICAgIGVuZEluZGV4LS07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGV4dFN0eWxlcyA9IEZvcm1hdFN0eWxlSGVscGVyLmdldEZvcm1hdHNBdFJhbmdlKHRoaXMubW9kZWwuZm9ybWF0cywgc3RhcnRJbmRleCwgZW5kSW5kZXgpLm1hcChmb3JtYXQgPT4gZm9ybWF0LnRleHRTdHlsZSk7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaFN0eWxlcyA9IFBhcmFncmFwaFN0eWxlSGVscGVyLmdldFBhcmFncmFwaHNBdFJhbmdlKHRoaXMubW9kZWwucGFyYWdyYXBocywgc3RhcnRJbmRleCwgZW5kSW5kZXgpLm1hcCh4ID0+XG4gICAgICAgICAgICB4LnBhcmFncmFwaFN0eWxlLm51bWJlcmluZ0lkXG4gICAgICAgICAgICAgICAgPyBOdW1iZXJpbmdIZWxwZXIuZ2V0U3R5bGVzKHgucGFyYWdyYXBoU3R5bGUsIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMubnVtYmVyaW5ncylcbiAgICAgICAgICAgICAgICA6IG5ldyBOdW1iZXJpbmdQYXJhZ3JhcGhTdHlsZU1vZGVsKHgucGFyYWdyYXBoU3R5bGUpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogSVRvb2xiYXJTdHlsZXMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgc3R5bGUgb2YgWy4uLnRleHRTdHlsZXMsIC4uLnBhcmFncmFwaFN0eWxlc10pIHtcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyhzdHlsZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0W2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHN0eWxlW2tleV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHRba2V5XSAhPT0gc3R5bGVba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5zdHlsZXMgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmVzdG9yZShtb2RlbDogUmVzdG9yZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIG1vZGVsLnN0YXJ0SW5kZXgpO1xuICAgICAgICBpZiAobW9kZWwuc3RhcnRJbmRleCAhPT0gbW9kZWwuZW5kSW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQnlEb2N1bWVudEluZGV4ZXMobW9kZWwuc3RhcnRJbmRleCwgbW9kZWwuZW5kSW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZXN0b3JlKHRoaXMubW9kZWwsIG1vZGVsKTtcblxuICAgICAgICBjb25zdCByZXN0b3JlRW5kSW5kZXggPSBtb2RlbC5zdGFydEluZGV4ICsgbW9kZWwudGV4dC5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzdG9yZUNvbXBvbmVudHModGhpcy5tb2RlbC50YWJsZXMsIHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMsIE5vZGVyVGFibGVDb21wb25lbnQsIG1vZGVsLnN0YXJ0SW5kZXgsIHJlc3RvcmVFbmRJbmRleCk7XG4gICAgICAgIHRoaXMucmVzdG9yZUNvbXBvbmVudHModGhpcy5tb2RlbC5pbWFnZXMsIHRoaXMuY3VzdG9tQ29tcG9uZW50cy5pbWFnZXMsIE5vZGVySW1hZ2VDb21wb25lbnQsIG1vZGVsLnN0YXJ0SW5kZXgsIHJlc3RvcmVFbmRJbmRleCk7XG4gICAgICAgIHRoaXMucmVzdG9yZUNvbXBvbmVudHModGhpcy5tb2RlbC50YWJzLCB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFicywgTm9kZXJUYWJDb21wb25lbnQsIG1vZGVsLnN0YXJ0SW5kZXgsIHJlc3RvcmVFbmRJbmRleCk7XG4gICAgICAgIHRoaXMucmVzdG9yZUVsZW1lbnRDb21wb25lbnRzKHRoaXMubW9kZWwuZWxlbWVudHMsIG1vZGVsLnN0YXJ0SW5kZXgsIHJlc3RvcmVFbmRJbmRleCk7XG5cbiAgICAgICAgY29uc3QgZW5kUG9pbnQgPSB0aGlzLmRpc3BsYXlEYXRhLmluc2VydFRleHQocGFyYWdyYXBoUG9zaXRpb24sIG1vZGVsLnRleHQpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnJlc2V0QWxsTnVtYmVyaW5nSW5mbyhwYXJhZ3JhcGhQb3NpdGlvbi5yb3cpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhwYXJhZ3JhcGhQb3NpdGlvbi5yb3csIGVuZFBvaW50LnJvdyk7XG4gICAgICAgIGlmIChlbmRQb2ludC5yb3cgLSBwYXJhZ3JhcGhQb3NpdGlvbi5yb3cgJiYgdGhpcy50eXBlICE9PSAnY2VsbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShlbmRQb2ludC5yb3cgKyAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvaW50KTtcbiAgICAgICAgdGhpcy5hcHBseVRvb2xiYXJTdHlsZXMoKTtcbiAgICB9XG5cbiAgICByZXN0b3JlQ29tcG9uZW50czxUIGV4dGVuZHMgQmFzZU5vZGVyQ29tcG9uZW50PihcbiAgICAgICAgbW9kZWxzOiBDdXN0b21Db250ZW50W10sXG4gICAgICAgIGNvbXBvbmVudHM6IENvbXBvbmVudFJlZjxCYXNlTm9kZXJDb21wb25lbnQ+W10sXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IFR5cGU8VD4sXG4gICAgICAgIHJlc3RvcmVJbmRleDogbnVtYmVyLFxuICAgICAgICByZXN0b3JlRW5kSW5kZXg6IG51bWJlclxuICAgICk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIG1vZGVscykge1xuICAgICAgICAgICAgaWYgKG1vZGVsLmluc2VydEluZGV4IDwgcmVzdG9yZUluZGV4KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydEluZGV4ID49IHJlc3RvcmVFbmRJbmRleCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hZGRDb21wb25lbnQoY29tcG9uZW50cywgbW9kZWwsIGNvbXBvbmVudFR5cGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzdG9yZUVsZW1lbnRDb21wb25lbnRzKGVsZW1lbnRzOiBFbGVtZW50TW9kZWxbXSwgcmVzdG9yZUluZGV4OiBudW1iZXIsIHJlc3RvcmVFbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgbW9kZWwgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICAgIGlmIChtb2RlbC5pbnNlcnRJbmRleCA8IHJlc3RvcmVJbmRleCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5pbnNlcnRJbmRleCA+PSByZXN0b3JlRW5kSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLmN1c3RvbUNvbnRlbnRTZXJ2aWNlLmZpbmRDb21wb25lbnRUeXBlKG1vZGVsLnR5cGUpO1xuICAgICAgICAgICAgdGhpcy5hZGRDb21wb25lbnQodGhpcy5jdXN0b21Db21wb25lbnRzLmN1c3RvbUVsZW1lbnRzLCBtb2RlbCwgdHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRMaW5rTW9kZWwoY3Vyc29yOiBDdXJzb3JQYXJhZ3JhcGgpOiBMaW5rTW9kZWwge1xuICAgICAgICBjb25zdCBpbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBjdXJzb3IpO1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5saW5rcy5maW5kKHggPT4geC5pbnNlcnRJbmRleCA8PSBpbmRleCAmJiB4LmVuZEluZGV4ID4gaW5kZXgpO1xuICAgIH1cblxuICAgIGluc2VydFRhYmxlUm93cyhpbnNlcnRJbmRleDogbnVtYmVyLCByb3dzQ291bnQ6IG51bWJlciwgdGFyZ2V0SW5kZXg6IG51bWJlciwgaW5oZXJpdEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLmZpbmQoeCA9PiB4Lmluc3RhbmNlLmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEucmVzZXROdW1iZXJpbmdJbmZvQnlUYWJsZUNlbGwodGFibGUpO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydFRhYmxlUm93cyh0aGlzLm1vZGVsLCBpbnNlcnRJbmRleCwgcm93c0NvdW50LCB0YXJnZXRJbmRleCwgaW5oZXJpdEluZGV4KTtcbiAgICAgICAgdGFibGUuaW5zdGFuY2UudXBkYXRlVGFibGUoKTtcbiAgICB9XG5cbiAgICBpbnNlcnRUYWJsZUNvbHVtbnMoaW5zZXJ0SW5kZXg6IG51bWJlciwgY29sdW1uc0NvdW50OiBudW1iZXIsIHRhcmdldEluZGV4OiBudW1iZXIsIGluaGVyaXRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5jdXN0b21Db21wb25lbnRzLnRhYmxlcy5maW5kKHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnJlc2V0TnVtYmVyaW5nSW5mb0J5VGFibGVDZWxsKHRhYmxlKTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRUYWJsZUNvbHVtbnMoXG4gICAgICAgICAgICB0aGlzLm1vZGVsLFxuICAgICAgICAgICAgaW5zZXJ0SW5kZXgsXG4gICAgICAgICAgICBjb2x1bW5zQ291bnQsXG4gICAgICAgICAgICB0YXJnZXRJbmRleCxcbiAgICAgICAgICAgIGluaGVyaXRJbmRleCxcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheURhdGEuY29udGVudFdpZHRoXG4gICAgICAgICk7XG4gICAgICAgIHRhYmxlLmluc3RhbmNlLnVwZGF0ZVRhYmxlKCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlVGFibGVSb3dzKGluc2VydEluZGV4OiBudW1iZXIsIHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS5yZXNldE51bWJlcmluZ0luZm9CeVRhYmxlQ2VsbCh0YWJsZSk7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIucmVtb3ZlVGFibGVSb3dzKHRoaXMubW9kZWwsIGluc2VydEluZGV4LCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIHRhYmxlLmluc3RhbmNlLnVwZGF0ZVRhYmxlKCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlVGFibGVDb2x1bW5zKGluc2VydEluZGV4OiBudW1iZXIsIHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS5yZXNldE51bWJlcmluZ0luZm9CeVRhYmxlQ2VsbCh0YWJsZSk7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIucmVtb3ZlVGFibGVDb2x1bW5zKHRoaXMubW9kZWwsIGluc2VydEluZGV4LCBzdGFydEluZGV4LCBlbmRJbmRleCwgdGhpcy5kaXNwbGF5RGF0YS5jb250ZW50V2lkdGgpO1xuICAgICAgICB0YWJsZS5pbnN0YW5jZS51cGRhdGVUYWJsZSgpO1xuICAgIH1cblxuICAgIHJlc2l6ZVRhYmxlQ29sdW1ucyhyZXNpemVUYWJsZUNvbHVtbnM6IFJlc2l6ZVRhYmxlQ29sdW1uc01vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5jdXN0b21Db21wb25lbnRzLnRhYmxlcy5maW5kKHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA9PT0gcmVzaXplVGFibGVDb2x1bW5zLmluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS5yZXNldE51bWJlcmluZ0luZm9CeVRhYmxlQ2VsbCh0YWJsZSk7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIucmVzaXplVGFibGVDb2x1bW5zKHRoaXMubW9kZWwsIHJlc2l6ZVRhYmxlQ29sdW1ucyk7XG4gICAgICAgIHRhYmxlLmluc3RhbmNlLnVwZGF0ZVRhYmxlKCk7XG4gICAgfVxuXG4gICAgcmVzdG9yZVRhYmxlKGluc2VydEluZGV4OiBudW1iZXIsIHRhYmxlOiBUYWJsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9sZFRhYmxlID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0YWJsZSkpIGFzIFRhYmxlTW9kZWw7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIucmVzdG9yZVRhYmxlKHRoaXMubW9kZWwsIGluc2VydEluZGV4LCBvbGRUYWJsZSk7XG4gICAgICAgIGNvbnN0IHRhYmxlQ29tcG9uZW50ID0gdGhpcy5jdXN0b21Db21wb25lbnRzLnRhYmxlcy5maW5kKHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0YWJsZUNvbXBvbmVudC5pbnN0YW5jZS51cGRhdGVUYWJsZSgpO1xuICAgIH1cbn1cbiJdfQ==