@magic-xpa/gui 4.800.0 → 4.801.0-dev000.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/{esm2015/index.js → esm2020/index.mjs} +0 -0
  2. package/{esm2015/magic-xpa-gui.js → esm2020/magic-xpa-gui.mjs} +0 -0
  3. package/esm2020/src/Commands.mjs +186 -0
  4. package/esm2020/src/Events.mjs +420 -0
  5. package/esm2020/src/EventsProcessor.mjs +67 -0
  6. package/esm2020/src/FocusManager.mjs +34 -0
  7. package/{esm2015/src/GuiConstants.js → esm2020/src/GuiConstants.mjs} +0 -0
  8. package/{esm2015/src/GuiEnums.js → esm2020/src/GuiEnums.mjs} +0 -0
  9. package/{esm2015/src/GuiEnvironment.js → esm2020/src/GuiEnvironment.mjs} +0 -0
  10. package/{esm2015/src/IFlowMonitorQueue.js → esm2020/src/IFlowMonitorQueue.mjs} +2 -1
  11. package/esm2020/src/Manager.mjs +192 -0
  12. package/{esm2015/src/UIBridge.js → esm2020/src/UIBridge.mjs} +0 -0
  13. package/{esm2015/src/env/IEnvironment.js → esm2020/src/env/IEnvironment.mjs} +1 -0
  14. package/{esm2015/src/gui/ControlBase.js → esm2020/src/gui/ControlBase.mjs} +0 -0
  15. package/{esm2015/src/gui/GuiMgControl.js → esm2020/src/gui/GuiMgControl.mjs} +0 -0
  16. package/{esm2015/src/gui/GuiMgForm.js → esm2020/src/gui/GuiMgForm.mjs} +0 -0
  17. package/{esm2015/src/gui/KeyboardItem.js → esm2020/src/gui/KeyboardItem.mjs} +0 -0
  18. package/{esm2015/src/gui/LastFocusedVal.js → esm2020/src/gui/LastFocusedVal.mjs} +0 -0
  19. package/{esm2015/src/gui/MgValue.js → esm2020/src/gui/MgValue.mjs} +0 -0
  20. package/{esm2015/src/gui/PropParentInterface.js → esm2020/src/gui/PropParentInterface.mjs} +1 -0
  21. package/{esm2015/src/gui/low/DialogHandler.js → esm2020/src/gui/low/DialogHandler.mjs} +0 -0
  22. package/{esm2015/src/gui/low/GuiCommand.js → esm2020/src/gui/low/GuiCommand.mjs} +0 -0
  23. package/{esm2015/src/gui/low/GuiCommandQueue.js → esm2020/src/gui/low/GuiCommandQueue.mjs} +0 -0
  24. package/esm2020/src/gui/low/GuiInteractive.mjs +545 -0
  25. package/{esm2015/src/gui/low/Style.js → esm2020/src/gui/low/Style.mjs} +0 -0
  26. package/{esm2015/src/management/RuntimeContextBase.js → esm2020/src/management/RuntimeContextBase.mjs} +0 -0
  27. package/{esm2015/src/management/data/BlobType.js → esm2020/src/management/data/BlobType.mjs} +0 -0
  28. package/esm2020/src/management/data/DcValues.mjs +214 -0
  29. package/esm2020/src/management/data/DcValuesBuilderBase.mjs +97 -0
  30. package/{esm2015/src/management/data/FieldDef.js → esm2020/src/management/data/FieldDef.mjs} +0 -0
  31. package/{esm2015/src/management/data/FieldsTable.js → esm2020/src/management/data/FieldsTable.mjs} +0 -0
  32. package/esm2020/src/management/data/GuiDataViewBase.mjs +90 -0
  33. package/esm2020/src/management/data/GuiFieldBase.mjs +82 -0
  34. package/{esm2015/src/management/data/IRecord.js → esm2020/src/management/data/IRecord.mjs} +1 -0
  35. package/{esm2015/src/management/data/IReferencedObject.js → esm2020/src/management/data/IReferencedObject.mjs} +1 -0
  36. package/{esm2015/src/management/data/NUM_TYPE.js → esm2020/src/management/data/NUM_TYPE.mjs} +0 -0
  37. package/esm2020/src/management/data/ObjectReferenceBase.mjs +48 -0
  38. package/{esm2015/src/management/data/ObjectReferencesCollection.js → esm2020/src/management/data/ObjectReferencesCollection.mjs} +0 -0
  39. package/esm2020/src/management/data/RecordUtils.mjs +361 -0
  40. package/{esm2015/src/management/data/VectorType.js → esm2020/src/management/data/VectorType.mjs} +0 -0
  41. package/{esm2015/src/management/data/VectorTypeBase.js → esm2020/src/management/data/VectorTypeBase.mjs} +0 -0
  42. package/{esm2015/src/management/events/IActionManager.js → esm2020/src/management/events/IActionManager.mjs} +1 -0
  43. package/esm2020/src/management/events/IGuiEventsManager.mjs +2 -0
  44. package/{esm2015/src/management/exp/ExpressionInterface.js → esm2020/src/management/exp/ExpressionInterface.mjs} +0 -0
  45. package/esm2020/src/management/exp/GuiExpressionEvaluator.mjs +333 -0
  46. package/{esm2015/src/management/gui/ControlTable.js → esm2020/src/management/gui/ControlTable.mjs} +0 -0
  47. package/esm2020/src/management/gui/DisplayConvertor.mjs +1706 -0
  48. package/esm2020/src/management/gui/FieldValidator.mjs +1507 -0
  49. package/esm2020/src/management/gui/GuiControlPropertyAdapter.mjs +22 -0
  50. package/{esm2015/src/management/gui/GuiFormPropertyAdapter.js → esm2020/src/management/gui/GuiFormPropertyAdapter.mjs} +0 -0
  51. package/{esm2015/src/management/gui/HebrewDate.js → esm2020/src/management/gui/HebrewDate.mjs} +0 -0
  52. package/{esm2015/src/management/gui/Helps.js → esm2020/src/management/gui/Helps.mjs} +0 -0
  53. package/esm2020/src/management/gui/MgControlBase.mjs +1873 -0
  54. package/esm2020/src/management/gui/MgFormBase.mjs +748 -0
  55. package/{esm2015/src/management/gui/PIC.js → esm2020/src/management/gui/PIC.mjs} +0 -0
  56. package/esm2020/src/management/gui/PropDefaults.mjs +230 -0
  57. package/{esm2015/src/management/gui/PropInterface.js → esm2020/src/management/gui/PropInterface.mjs} +0 -0
  58. package/esm2020/src/management/gui/PropTable.mjs +221 -0
  59. package/esm2020/src/management/gui/Property.mjs +1382 -0
  60. package/{esm2015/src/management/gui/ValidationDetails.js → esm2020/src/management/gui/ValidationDetails.mjs} +0 -0
  61. package/{esm2015/src/management/gui/ValidationDetailsBase.js → esm2020/src/management/gui/ValidationDetailsBase.mjs} +0 -0
  62. package/{esm2015/src/management/gui/WrongFormatException.js → esm2020/src/management/gui/WrongFormatException.mjs} +0 -0
  63. package/{esm2015/src/management/tasks/GuiDataCollection.js → esm2020/src/management/tasks/GuiDataCollection.mjs} +0 -0
  64. package/esm2020/src/management/tasks/GuiTaskBase.mjs +502 -0
  65. package/{esm2015/src/management/tasks/IMGDataTable.js → esm2020/src/management/tasks/IMGDataTable.mjs} +1 -0
  66. package/{esm2015/src/management/tasks/ITask.js → esm2020/src/management/tasks/ITask.mjs} +1 -0
  67. package/esm2020/src/management/tasks/MgTimer.mjs +21 -0
  68. package/{esm2015/src/management/tasks/TaskDefinitionId.js → esm2020/src/management/tasks/TaskDefinitionId.mjs} +0 -0
  69. package/esm2020/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +41 -0
  70. package/{esm2015/src/util/AuthenticationDialogHandler.js → esm2020/src/util/AuthenticationDialogHandler.mjs} +0 -0
  71. package/{esm2015/src/util/MemoryUtil.js → esm2020/src/util/MemoryUtil.mjs} +0 -0
  72. package/{esm2015/src/util/ObjectReference.js → esm2020/src/util/ObjectReference.mjs} +0 -0
  73. package/esm2020/src/util/ProcessLauncher.mjs +32 -0
  74. package/esm2020/src/util/UsernamePasswordCredentials.mjs +52 -0
  75. package/fesm2015/{magic-xpa-gui.js → magic-xpa-gui.mjs} +133 -175
  76. package/fesm2015/magic-xpa-gui.mjs.map +1 -0
  77. package/fesm2020/magic-xpa-gui.mjs +17805 -0
  78. package/fesm2020/magic-xpa-gui.mjs.map +1 -0
  79. package/package.json +27 -14
  80. package/src/Events.d.ts +2 -2
  81. package/src/EventsProcessor.d.ts +1 -1
  82. package/src/IFlowMonitorQueue.d.ts +1 -1
  83. package/src/Manager.d.ts +2 -3
  84. package/src/management/data/DcValues.d.ts +1 -1
  85. package/src/management/data/DcValuesBuilderBase.d.ts +1 -1
  86. package/src/management/data/RecordUtils.d.ts +0 -3
  87. package/src/management/events/IGuiEventsManager.d.ts +5 -5
  88. package/src/management/exp/GuiExpressionEvaluator.d.ts +2 -2
  89. package/src/management/gui/DisplayConvertor.d.ts +6 -6
  90. package/src/management/gui/GuiControlPropertyAdapter.d.ts +6 -6
  91. package/src/management/gui/MgControlBase.d.ts +2 -4
  92. package/src/management/gui/MgFormBase.d.ts +1 -1
  93. package/src/management/gui/PropTable.d.ts +1 -1
  94. package/src/management/gui/Property.d.ts +2 -2
  95. package/src/management/tasks/GuiTaskBase.d.ts +3 -3
  96. package/src/util/ProcessLauncher.d.ts +1 -3
  97. package/bundles/magic-xpa-gui.umd.js +0 -19431
  98. package/bundles/magic-xpa-gui.umd.js.map +0 -1
  99. package/bundles/magic-xpa-gui.umd.min.js +0 -16
  100. package/bundles/magic-xpa-gui.umd.min.js.map +0 -1
  101. package/esm2015/src/Commands.js +0 -189
  102. package/esm2015/src/Events.js +0 -420
  103. package/esm2015/src/EventsProcessor.js +0 -68
  104. package/esm2015/src/FocusManager.js +0 -41
  105. package/esm2015/src/Manager.js +0 -197
  106. package/esm2015/src/gui/low/GuiInteractive.js +0 -545
  107. package/esm2015/src/management/data/DcValues.js +0 -214
  108. package/esm2015/src/management/data/DcValuesBuilderBase.js +0 -97
  109. package/esm2015/src/management/data/GuiDataViewBase.js +0 -90
  110. package/esm2015/src/management/data/GuiFieldBase.js +0 -85
  111. package/esm2015/src/management/data/ObjectReferenceBase.js +0 -48
  112. package/esm2015/src/management/data/RecordUtils.js +0 -447
  113. package/esm2015/src/management/events/IGuiEventsManager.js +0 -1
  114. package/esm2015/src/management/exp/GuiExpressionEvaluator.js +0 -333
  115. package/esm2015/src/management/gui/DisplayConvertor.js +0 -1706
  116. package/esm2015/src/management/gui/FieldValidator.js +0 -1507
  117. package/esm2015/src/management/gui/GuiControlPropertyAdapter.js +0 -4
  118. package/esm2015/src/management/gui/MgControlBase.js +0 -1981
  119. package/esm2015/src/management/gui/MgFormBase.js +0 -763
  120. package/esm2015/src/management/gui/PropDefaults.js +0 -230
  121. package/esm2015/src/management/gui/PropTable.js +0 -224
  122. package/esm2015/src/management/gui/Property.js +0 -1402
  123. package/esm2015/src/management/tasks/GuiTaskBase.js +0 -506
  124. package/esm2015/src/management/tasks/MgTimer.js +0 -21
  125. package/esm2015/src/management/tasks/TaskDefinitionIdTableSaxHandler.js +0 -41
  126. package/esm2015/src/util/ProcessLauncher.js +0 -32
  127. package/esm2015/src/util/UsernamePasswordCredentials.js +0 -52
  128. package/fesm2015/magic-xpa-gui.js.map +0 -1
@@ -1,1507 +0,0 @@
1
- import { DateTime, Exception, NChar, NNumber, NString, NumberFormatInfo, StringBuilder } from '@magic-xpa/mscorelib';
2
- import { DisplayConvertor } from './DisplayConvertor';
3
- import { DateUtil, HTML_2_STR, MgControlType, MsgInterface, PICInterface, StorageAttribute, StrUtil, UtilDateJpn, UtilStrByteMode } from '@magic-xpa/utils';
4
- import { Events } from '../../Events';
5
- import { WrongFormatException } from './WrongFormatException';
6
- import { DateElement } from '../../GuiEnums';
7
- import { NUM_TYPE } from '../data/NUM_TYPE';
8
- import { HebrewDate } from './HebrewDate';
9
- import { BlobType } from '../data/BlobType';
10
- import { GuiEnvironment } from '../../GuiEnvironment';
11
- import { PropInterface } from "./PropInterface";
12
- export class FieldValidator {
13
- constructor() {
14
- this._newvalue = null;
15
- this._oldvalue = null;
16
- this._pictureReal = null;
17
- this._pictureEnable = null;
18
- this._valDet = null;
19
- this._isPm = false;
20
- this._picture = null;
21
- this.hebrew = false;
22
- this._decimal = null;
23
- this._environment = null;
24
- this._environment = GuiEnvironment.Environment;
25
- this._decimal = (this._environment.GetDecimal() || "");
26
- }
27
- checkVal(valDet) {
28
- this._newvalue = (this._oldvalue = (this._pictureReal = (this._pictureEnable = null)));
29
- this.init(valDet);
30
- valDet.setValidationFailed(false);
31
- let ctrl = valDet.getControl();
32
- let modInQueuy = ctrl.isRepeatable() ? false : ctrl.GetComputedBooleanProperty(PropInterface.PROP_TYPE_MODIFY_IN_QUERY, false, ctrl.getDisplayLine(false));
33
- let useNative = ctrl.isModifiable();
34
- if (ctrl.getForm().getTask().getMode() === 'E' && !modInQueuy) {
35
- valDet.setValue(this._oldvalue);
36
- return valDet;
37
- }
38
- if (ctrl.Type === MgControlType.CTRL_TYPE_RADIO || ctrl.Type === MgControlType.CTRL_TYPE_CHECKBOX || ctrl.Type === MgControlType.CTRL_TYPE_TAB || ctrl.isSelectionCtrl()) {
39
- try {
40
- if (ctrl.Type === MgControlType.CTRL_TYPE_CHECKBOX) {
41
- valDet.setNull(ctrl.isNullValue(this._newvalue));
42
- }
43
- if (this._newvalue !== null && ctrl.isSelectionCtrl()) {
44
- let idx = NNumber.Parse(this._newvalue);
45
- if (ctrl.isChoiceNull(idx)) {
46
- valDet.setNull(true);
47
- }
48
- }
49
- }
50
- catch (ex_111) {
51
- if (ex_111 instanceof Exception) {
52
- }
53
- else
54
- throw ex_111;
55
- }
56
- valDet.setValue(this._newvalue);
57
- return valDet;
58
- }
59
- if (ctrl.DataType !== StorageAttribute.ALPHA && ctrl.DataType !== StorageAttribute.UNICODE && ctrl.DataType !== StorageAttribute.BLOB) {
60
- if ((typeof this._newvalue === 'string' && this._newvalue.trim().length === 0) || (ctrl.DataType === StorageAttribute.DATE && (ctrl.isDateZero(this._newvalue) || this.isNullDisplayVal()))) {
61
- let field = ctrl.getField();
62
- let defaultValue = field.getDefaultValue();
63
- let text = null;
64
- if (field.isNullDefault()) {
65
- valDet.setNull(true);
66
- text = field.getNullDisplay();
67
- if (NString.IsNullOrEmpty(text) && ctrl.DataType === StorageAttribute.DATE) {
68
- text = DisplayConvertor.Instance.mg2disp(defaultValue, valDet.getRange(), valDet.getPIC(), useNative, field.getTask().getCompIdx(), false);
69
- }
70
- }
71
- if (text === null) {
72
- text = DisplayConvertor.Instance.mg2disp(defaultValue, valDet.getRange(), valDet.getPIC(), useNative, field.getTask().getCompIdx(), false);
73
- }
74
- if ((!field.isNullDefault() && (this._valDet.getContinuousRangeValues() !== null || this._valDet.getDiscreteRangeValues() !== null)))
75
- this._newvalue = text;
76
- else {
77
- valDet.setValue(text);
78
- return valDet;
79
- }
80
- }
81
- }
82
- if ((typeof this._newvalue === 'string' && !(StrUtil.rtrim(this._newvalue) === StrUtil.rtrim(this._oldvalue))) || ctrl.ModifiedByUser) {
83
- try {
84
- switch (valDet.getType()) {
85
- case StorageAttribute.ALPHA:
86
- case StorageAttribute.UNICODE:
87
- valDet.setValue(this.checkAlphaField());
88
- break;
89
- case StorageAttribute.NUMERIC:
90
- this._pictureReal = valDet.getPictureReal();
91
- this._pictureEnable = valDet.getPictureEnable();
92
- this.checkNumericPicture();
93
- valDet.setValue(this.checkNumericField());
94
- break;
95
- case StorageAttribute.BOOLEAN:
96
- valDet.setValue(this.checkLogicalField());
97
- break;
98
- case StorageAttribute.DATE:
99
- valDet.setValue(this.checkDateField());
100
- break;
101
- case StorageAttribute.TIME:
102
- valDet.setValue(this.checkTimeField());
103
- break;
104
- case StorageAttribute.BLOB:
105
- case StorageAttribute.BLOB_VECTOR:
106
- valDet.setValue(this._newvalue);
107
- break;
108
- case StorageAttribute.NONE:
109
- default:
110
- Events.WriteExceptionToLog("FieldValidator.checkVal: Type of the field " + valDet.getType());
111
- break;
112
- }
113
- }
114
- catch (goBack) {
115
- if (goBack instanceof WrongFormatException) {
116
- valDet.setValue(this._oldvalue);
117
- this.setValidationFailed(true);
118
- if (goBack.getType() !== MsgInterface.STR_RNG_TXT) {
119
- this.printMessage(goBack.getType(), false);
120
- this.setValidationFailed(true);
121
- }
122
- else
123
- this.printMessage(MsgInterface.STR_RNG_TXT, true);
124
- }
125
- }
126
- }
127
- return valDet;
128
- }
129
- checkAlphaField() {
130
- let control = this._valDet.getControl();
131
- let IsAttrAlpha = this._valDet.getType() === StorageAttribute.ALPHA;
132
- if (this._newvalue.length === 0 && this._valDet.getContinuousRangeValues() === null && this._valDet.getDiscreteRangeValues() === null) {
133
- this.setValidationFailed(false);
134
- return this._newvalue;
135
- }
136
- if (IsAttrAlpha && UtilStrByteMode.isLocaleDefLangDBCS()) {
137
- let picLenB = UtilStrByteMode.lenB(this._picture);
138
- if (UtilStrByteMode.lenB(this._newvalue) > picLenB) {
139
- this._newvalue = UtilStrByteMode.leftB(this._newvalue, picLenB);
140
- }
141
- }
142
- else {
143
- if (this._newvalue.length > this._picture.length) {
144
- this._newvalue = this._newvalue.substr(0, this._picture.length);
145
- }
146
- }
147
- let stringBuilder = new StringBuilder();
148
- let currPicture;
149
- let i = currPicture = 0;
150
- for (currPicture = i = 0; i < this._newvalue.length && currPicture < this._picture.length;) {
151
- if (!DisplayConvertor.isAlphaPositionalDirective(this._picture.charAt(currPicture)) && this._newvalue.charAt(i) === this._picture.charAt(currPicture)) {
152
- stringBuilder.Append(this._picture.charAt(currPicture));
153
- i = i + 1;
154
- currPicture = currPicture + 1;
155
- }
156
- else {
157
- if (!DisplayConvertor.isAlphaPositionalDirective(this._picture.charAt(currPicture)) && this._newvalue.charAt(i) !== this._picture.charAt(currPicture)) {
158
- stringBuilder.Append(this._picture.charAt(currPicture));
159
- currPicture = currPicture + 1;
160
- }
161
- else {
162
- if (DisplayConvertor.isAlphaPositionalDirective(this._picture.charAt(currPicture)) && this.isPossibleAlphaLetter(i, currPicture)) {
163
- if (UtilStrByteMode.isLocaleDefLangDBCS()) {
164
- let strVal = this._newvalue.substr(i, 1);
165
- if (UtilStrByteMode.lenB(strVal) === 2) {
166
- if (IsAttrAlpha) {
167
- if (currPicture + 1 < this._picture.length) {
168
- if (DisplayConvertor.isAlphaPositionalDirective(this._picture.charAt(currPicture + 1)) && this.isPossibleAlphaLetter(i, currPicture + 1)) {
169
- stringBuilder.Append(this._newvalue.charAt(i));
170
- i = i + 1;
171
- currPicture = currPicture + 2;
172
- }
173
- else {
174
- stringBuilder.Append(' ');
175
- currPicture = currPicture + 1;
176
- }
177
- }
178
- else {
179
- stringBuilder.Append(' ');
180
- currPicture = currPicture + 1;
181
- }
182
- }
183
- else {
184
- stringBuilder.Append(this._newvalue.charAt(i));
185
- i = i + 1;
186
- currPicture = currPicture + 1;
187
- }
188
- }
189
- else {
190
- stringBuilder.Append(this._newvalue.charAt(i));
191
- i = i + 1;
192
- currPicture = currPicture + 1;
193
- }
194
- }
195
- else {
196
- stringBuilder.Append(this._newvalue.charAt(i));
197
- i = i + 1;
198
- currPicture = currPicture + 1;
199
- }
200
- }
201
- else {
202
- stringBuilder.Append(' ');
203
- currPicture = currPicture + 1;
204
- if (this._valDet.getControl() !== null) {
205
- let type = control.Type;
206
- if (type !== MgControlType.CTRL_TYPE_BUTTON) {
207
- this.printMessage(MsgInterface.STR_ERR_NUM, false);
208
- }
209
- }
210
- }
211
- }
212
- }
213
- }
214
- this._newvalue = stringBuilder.ToString();
215
- if (this._valDet.getContinuousRangeValues() !== null || this._valDet.getDiscreteRangeValues() !== null) {
216
- this._newvalue = this.fillAlphaByRange(this._valDet.getContinuousRangeValues(), this._valDet.getDiscreteRangeValues());
217
- }
218
- return this._newvalue;
219
- }
220
- isPossibleAlphaLetter(indexInput, indexPicture) {
221
- let result;
222
- switch (this._picture.charCodeAt(indexPicture)) {
223
- case PICInterface.PIC_X:
224
- case PICInterface.PIC_J:
225
- case PICInterface.PIC_G:
226
- case PICInterface.PIC_S:
227
- case PICInterface.PIC_T:
228
- return true;
229
- case PICInterface.PIC_U:
230
- let upper = this._newvalue[indexInput].toUpperCase();
231
- if (upper !== this._newvalue[indexInput])
232
- this.changeStringInside("" + upper, indexInput);
233
- return true;
234
- case PICInterface.PIC_L:
235
- let lower = this._newvalue[indexInput].toLowerCase();
236
- if (lower !== this._newvalue[indexInput])
237
- this.changeStringInside("" + lower, indexInput);
238
- return true;
239
- case PICInterface.PIC_N:
240
- let number1 = this._newvalue[indexInput];
241
- if (UtilStrByteMode.isDigit(number1) || NChar.IsWhiteSpace(number1) || UtilStrByteMode.asNumeric(number1))
242
- return true;
243
- else {
244
- Events.WriteErrorToLog("Bad Alpha value. Should be number only on place Num. " + indexInput);
245
- return false;
246
- }
247
- default:
248
- Events.WriteErrorToLog("FieldValidator.isPossibleAlphaLetter: illegal Char Directive: " + this._picture.indexOf(String.fromCharCode(indexPicture)) + " for " + this._newvalue[indexInput]);
249
- return false;
250
- }
251
- }
252
- fillAllAlpha() {
253
- let stringBuilder = new StringBuilder(this._picture.length);
254
- stringBuilder.Append(this._newvalue);
255
- if (UtilStrByteMode.isLocaleDefLangDBCS() && this._valDet.getType() === StorageAttribute.ALPHA) {
256
- let intNewvalueLenB = UtilStrByteMode.lenB(this._newvalue);
257
- let strBuiedPicture = UtilStrByteMode.leftB(this._picture, intNewvalueLenB);
258
- for (let i = strBuiedPicture.length; i < this._picture.length; i = i + 1) {
259
- if (DisplayConvertor.isAlphaPositionalDirective(this._picture.charAt(i))) {
260
- stringBuilder.Append(' ');
261
- }
262
- else {
263
- stringBuilder.Append(this._picture.charAt(i));
264
- }
265
- }
266
- }
267
- else {
268
- for (let i = this._newvalue.length - 1; i < this._picture.length && i >= 0; i++) {
269
- if (DisplayConvertor.isAlphaPositionalDirective(this._picture.charAt(i))) {
270
- stringBuilder.Append(' ');
271
- }
272
- else {
273
- stringBuilder.Append(this._picture.charAt(i));
274
- }
275
- i = i + 1;
276
- }
277
- }
278
- return stringBuilder.ToString();
279
- }
280
- fillAlphaByRange(ContinuousRangeValues, DiscreteRangeValues) {
281
- let tmpBuffer = DisplayConvertor.Instance.fillAlphaByDiscreteRangeValues(DiscreteRangeValues, this._newvalue);
282
- if (tmpBuffer !== null) {
283
- return tmpBuffer;
284
- }
285
- tmpBuffer = DisplayConvertor.Instance.fillAlphaByContinuousRangeValues(ContinuousRangeValues, this._newvalue);
286
- if (tmpBuffer !== null)
287
- return tmpBuffer;
288
- if (DiscreteRangeValues !== null)
289
- return this.CompleteAlphaByRange(DiscreteRangeValues);
290
- this.printMessage(MsgInterface.STR_RNG_TXT, true);
291
- return this._oldvalue;
292
- }
293
- CompleteAlphaByRange(DiscreteRangeValues) {
294
- let tmpNewValue = DisplayConvertor.Instance.completeAlphaByRange(DiscreteRangeValues, this._newvalue);
295
- if (tmpNewValue !== null) {
296
- return tmpNewValue;
297
- }
298
- this.printMessage(MsgInterface.STR_RNG_TXT, true);
299
- return this._oldvalue;
300
- }
301
- checkLogicalField() {
302
- if (this._newvalue.length === 0 && this._valDet.getContinuousRangeValues() === null && this._valDet.getDiscreteRangeValues() === null) {
303
- throw new WrongFormatException(MsgInterface.STR_RNG_TXT);
304
- }
305
- if (this._valDet.getContinuousRangeValues() !== null || this._valDet.getDiscreteRangeValues() !== null) {
306
- this._newvalue = this.fillAlphaByRange(this._valDet.getContinuousRangeValues(), this._valDet.getDiscreteRangeValues());
307
- }
308
- this.setValidationFailed(false);
309
- return this._newvalue;
310
- }
311
- checkNumericField() {
312
- let evaluated;
313
- if (typeof this._newvalue === 'string') {
314
- if (this._newvalue.length === 0) {
315
- this._newvalue = "0";
316
- }
317
- let delimeterRealIndex = this._newvalue.indexOf(this._decimal);
318
- let delimeterPictIndex = this._pictureReal.indexOf(this._decimal);
319
- evaluated = "";
320
- let evaluatedLeft;
321
- let evaluatedRight;
322
- this.setValidationFailed(false);
323
- if (!this.checkNumericInDecFormat())
324
- throw new WrongFormatException(MsgInterface.EDT_ERR_STR_1);
325
- if (delimeterPictIndex !== -1 && delimeterRealIndex !== -1) {
326
- evaluatedLeft = this.checkNumericLeft(delimeterPictIndex, delimeterRealIndex);
327
- evaluatedRight = this.checkNumericRight(delimeterPictIndex, delimeterRealIndex);
328
- evaluated = evaluatedLeft + this._decimal + evaluatedRight;
329
- }
330
- else {
331
- if (delimeterPictIndex !== -1 && delimeterRealIndex === -1) {
332
- evaluatedLeft = this.checkNumericLeft(delimeterPictIndex, Math.min(delimeterPictIndex, this._newvalue.length));
333
- evaluatedRight = this.checkNumericRight(delimeterPictIndex, delimeterPictIndex - 1);
334
- evaluated = evaluatedLeft + this._decimal + evaluatedRight;
335
- }
336
- else {
337
- if (delimeterPictIndex === -1 && delimeterRealIndex === -1) {
338
- evaluated = this.checkNumericRight(-1, -1);
339
- evaluatedLeft = evaluated;
340
- }
341
- else {
342
- if (delimeterRealIndex > 0) {
343
- this._newvalue = this._newvalue.substr(0, delimeterRealIndex);
344
- }
345
- else {
346
- this._newvalue = "0";
347
- }
348
- evaluated = this.checkNumericRight(-1, -1);
349
- evaluatedLeft = evaluated;
350
- }
351
- }
352
- }
353
- if ((evaluatedRight.length === 0 && evaluatedLeft.length === 0) || (evaluated.length === 0 && this._newvalue.length > 0)) {
354
- let ctrl;
355
- ctrl = this._valDet.getControl();
356
- let field = ctrl.getField();
357
- let defValue = field.getDefaultValue();
358
- let dispDefValue = null;
359
- if (field.isNullDefault()) {
360
- this._valDet.setNull(true);
361
- dispDefValue = field.getNullDisplay();
362
- }
363
- if (dispDefValue == null)
364
- dispDefValue = DisplayConvertor.Instance.mg2disp(defValue, this._valDet.getRange(), this._valDet.getPIC(), true, field.getTask().getCompIdx(), false);
365
- }
366
- let wholeDigitdiff = this.digitsBeforeDelimeter(evaluated, 0, this._decimal) - this._valDet.getPIC().getWholes();
367
- if (wholeDigitdiff > 0) {
368
- let padCharOnly = false;
369
- if (this._valDet.getIsPadFill()) {
370
- padCharOnly = true;
371
- for (let i = 0; i < wholeDigitdiff && padCharOnly; i++)
372
- if (evaluated[i] !== this._valDet.getPadFillChar())
373
- padCharOnly = false;
374
- }
375
- if (!padCharOnly)
376
- throw new WrongFormatException(MsgInterface.EDT_ERR_STR_1);
377
- }
378
- if (this._valDet.getIsNegative() && (this._newvalue.trim().startsWith("-") || (this._valDet.getNegativeSignPref().length !== 0 && this._newvalue.trim().startsWith(this._valDet.getNegativeSignPref())))) {
379
- evaluated = "-" + evaluated;
380
- }
381
- evaluated = DisplayConvertor.Instance.disp2mg(this._newvalue, "", this._valDet.getPIC(), this._valDet.getControl().getForm().getTask().getCompIdx(), BlobType.CONTENT_TYPE_UNKNOWN);
382
- evaluated = DisplayConvertor.Instance.mg2disp(evaluated, "", this._valDet.getPIC(), true, this._valDet.getControl().getForm().getTask().getCompIdx(), true);
383
- let tempDispVal = StrUtil.ltrim(evaluated);
384
- if (tempDispVal.length === 0 && this._valDet.getPIC().zeroFill() && this._valDet.getPIC().getZeroPad() === ' ')
385
- evaluated = "0";
386
- }
387
- else {
388
- evaluated = DisplayConvertor.Instance.disp2mg(this._newvalue, "", this._valDet.getPIC(), this._valDet.getControl().getForm().getTask().getCompIdx(), BlobType.CONTENT_TYPE_UNKNOWN);
389
- evaluated = DisplayConvertor.Instance.mg2disp(evaluated, "", this._valDet.getPIC(), true, this._valDet.getControl().getForm().getTask().getCompIdx(), true);
390
- }
391
- if (this._valDet.getContinuousRangeValues() != null || this._valDet.getDiscreteRangeValues() != null) {
392
- this._newvalue = evaluated;
393
- evaluated = this.fillNumericByRange();
394
- }
395
- return evaluated;
396
- }
397
- checkNumericLeft(delimeterPictIndex, delimeterRealIndex) {
398
- let buffer = new StringBuilder();
399
- let RealIndex = delimeterRealIndex - 1;
400
- let PictIndex;
401
- let isFound;
402
- for (PictIndex = delimeterPictIndex - 1; PictIndex >= 0 && RealIndex >= 0; PictIndex--) {
403
- if (this._pictureEnable[PictIndex] === '1') {
404
- let tmpstorage = RealIndex;
405
- isFound = false;
406
- for (; RealIndex >= 0; RealIndex--) {
407
- if (this._pictureReal[PictIndex] === this._newvalue[RealIndex]) {
408
- isFound = true;
409
- RealIndex--;
410
- break;
411
- }
412
- }
413
- if (!isFound)
414
- RealIndex = tmpstorage;
415
- buffer.Append(this._pictureReal[PictIndex]);
416
- }
417
- else {
418
- for (; RealIndex >= 0; RealIndex--) {
419
- if (UtilStrByteMode.isDigit(this._newvalue[RealIndex])) {
420
- buffer.Append(this._newvalue[RealIndex]);
421
- RealIndex--;
422
- break;
423
- }
424
- }
425
- }
426
- }
427
- if (RealIndex < 0 && PictIndex >= 0)
428
- for (; PictIndex >= 0; PictIndex--) {
429
- if (this._pictureEnable[PictIndex] === '1')
430
- buffer.Append(this._pictureReal[PictIndex]);
431
- else {
432
- if (this._valDet.getIsPadFill())
433
- buffer.Append(this._valDet.getPadFillChar());
434
- }
435
- }
436
- return StrUtil.ReverseString(buffer).ToString();
437
- }
438
- checkNumericRight(delimeterPictIndex, delimeterRealIndex) {
439
- let buffer = new StringBuilder();
440
- let RealIndex = delimeterRealIndex + 1;
441
- let PictIndex;
442
- let pic = this._valDet.getPIC();
443
- for (PictIndex = delimeterPictIndex + 1; PictIndex < this._pictureEnable.length && RealIndex < this._newvalue.length; PictIndex++) {
444
- if (this._pictureEnable[PictIndex] === '1') {
445
- if (RealIndex < PictIndex)
446
- RealIndex = PictIndex;
447
- buffer.Append(this._pictureReal[PictIndex]);
448
- }
449
- else {
450
- for (; RealIndex < this._newvalue.length; RealIndex++) {
451
- if (UtilStrByteMode.isDigit(this._newvalue[RealIndex]) && !pic.picIsMask(RealIndex)) {
452
- buffer.Append(this._newvalue[RealIndex]);
453
- RealIndex++;
454
- break;
455
- }
456
- }
457
- }
458
- }
459
- if (buffer.Length > 0) {
460
- if (RealIndex >= this._newvalue.length && PictIndex < this._pictureReal.length)
461
- for (; PictIndex < this._pictureReal.length; PictIndex++) {
462
- if (this._pictureEnable[PictIndex] === '1')
463
- buffer.Append(this._pictureReal[PictIndex]);
464
- }
465
- }
466
- return buffer.ToString();
467
- }
468
- checkNumericPicture() {
469
- let indexOfDec;
470
- let lastDec;
471
- let maxLength;
472
- let currIndx;
473
- let POINT_DEC = ".";
474
- let pic = this._valDet.getPIC();
475
- if (this._pictureReal == null || this._pictureEnable == null || pic.getAttr() !== StorageAttribute.NUMERIC || !pic.withDecimal())
476
- return;
477
- lastDec = this._pictureReal.lastIndexOf(POINT_DEC);
478
- maxLength = this._pictureEnable.length;
479
- currIndx = 0;
480
- while (currIndx < lastDec) {
481
- indexOfDec = this._pictureEnable.indexOf("1", currIndx);
482
- if (indexOfDec === -1)
483
- return;
484
- else {
485
- if (indexOfDec === this._pictureReal.indexOf(POINT_DEC, currIndx)) {
486
- let first;
487
- let second;
488
- first = second = "";
489
- if (indexOfDec === 0) {
490
- if (indexOfDec + 1 < maxLength)
491
- second = this._pictureReal.substr(indexOfDec + 1);
492
- }
493
- else if (indexOfDec === maxLength) {
494
- first = this._pictureReal.substr(0, indexOfDec);
495
- }
496
- else {
497
- first = this._pictureReal.substr(0, indexOfDec);
498
- second = this._pictureReal.substr(indexOfDec + 1);
499
- }
500
- this._pictureReal = first + this._decimal + second;
501
- break;
502
- }
503
- else {
504
- currIndx = ++indexOfDec;
505
- }
506
- }
507
- }
508
- }
509
- fillNumericByRange() {
510
- let controlPic = this._valDet.getControl().getPIC();
511
- let continuousRangeValues = this._valDet.getContinuousRangeValues();
512
- let discreteRangeValues = this._valDet.getDiscreteRangeValues();
513
- this.setValidationFailed(false);
514
- let checkedStr = this.setNumericValueWithoutPicture(this._newvalue.toString());
515
- if (checkedStr.length === 0) {
516
- this.printMessage(MsgInterface.STR_RNG_TXT, true);
517
- return this._oldvalue;
518
- }
519
- let checkedNum = new NUM_TYPE(this._newvalue.toString(), this._valDet.getControl().getPIC(), 0);
520
- if (discreteRangeValues !== null) {
521
- for (let i = 0; i < discreteRangeValues.length; i = i + 1) {
522
- let rangeItemValue1 = new NUM_TYPE(discreteRangeValues.get_Item(i), controlPic, 0);
523
- try {
524
- if (NUM_TYPE.num_cmp(checkedNum, rangeItemValue1) === 0) {
525
- return this._newvalue;
526
- }
527
- }
528
- catch (ex_CC) {
529
- }
530
- }
531
- }
532
- if (continuousRangeValues !== null) {
533
- for (let i = 0; i < continuousRangeValues.length; i = i + 1) {
534
- let rangeItemValue1 = new NUM_TYPE();
535
- let rangeItemValue2 = new NUM_TYPE();
536
- rangeItemValue1.num_4_a_std(continuousRangeValues.get_Item(i++));
537
- rangeItemValue2.num_4_a_std(continuousRangeValues.get_Item(i));
538
- try {
539
- if (NUM_TYPE.num_cmp(checkedNum, rangeItemValue1) !== -1 && NUM_TYPE.num_cmp(rangeItemValue2, checkedNum) !== -1) {
540
- return this._newvalue;
541
- }
542
- }
543
- catch (ex_15B) {
544
- }
545
- }
546
- }
547
- throw new WrongFormatException();
548
- }
549
- getDoubleVal(val) {
550
- let dotFound = false;
551
- let minusFound = false;
552
- let digitFound = false;
553
- let endOfNum = false;
554
- let i = 0;
555
- for (i = 0; i < val.length && !endOfNum; i++) {
556
- let c = val[i];
557
- if (c >= '0' && c <= '9')
558
- digitFound = true;
559
- else {
560
- switch (c) {
561
- case '-':
562
- if (digitFound || dotFound || minusFound)
563
- endOfNum = true;
564
- minusFound = true;
565
- break;
566
- case '.':
567
- if (dotFound || minusFound && !digitFound)
568
- endOfNum = true;
569
- dotFound = true;
570
- break;
571
- case ' ':
572
- if (digitFound || dotFound || minusFound)
573
- endOfNum = true;
574
- break;
575
- default:
576
- endOfNum = true;
577
- break;
578
- }
579
- }
580
- }
581
- if (endOfNum) {
582
- i = i - 1;
583
- }
584
- if (i > 0) {
585
- return NNumber.Parse(val.substr(0, i));
586
- }
587
- return -Infinity;
588
- }
589
- setNumericValueWithoutPicture(val) {
590
- let checkedStr = new StringBuilder(val.length);
591
- let isFirstDecimal = false;
592
- let currChar;
593
- for (let i = 0; i < this._pictureReal.length && i < val.length; i++) {
594
- currChar = val[i];
595
- if (UtilStrByteMode.isDigit(currChar))
596
- checkedStr.Append(currChar);
597
- else if (currChar === this._environment.GetDecimal() && !isFirstDecimal) {
598
- checkedStr.Append(NString.ToCharArray(NumberFormatInfo.NumberDecimalSeparator).toString());
599
- isFirstDecimal = true;
600
- }
601
- else if (currChar === '-' && this._valDet.getIsNegative())
602
- checkedStr.Append(NString.ToCharArray(NumberFormatInfo.NegativeSign).toString());
603
- }
604
- if (checkedStr.ToString().length === 0) {
605
- this.printMessage(MsgInterface.STR_ERR_NUM, false);
606
- this.setValidationFailed(true);
607
- }
608
- return checkedStr.ToString();
609
- }
610
- checkNumericInDecFormat() {
611
- let pic = this._valDet.getPIC();
612
- let i;
613
- let Dec;
614
- let Whole;
615
- let DecPos;
616
- let decimalChar = this._environment.GetDecimal();
617
- Dec = 0;
618
- Whole = 0;
619
- DecPos = -1;
620
- for (i = 0; i < this._newvalue.length; i++)
621
- if (pic.isNumeric(i))
622
- if (UtilStrByteMode.isDigit(this._newvalue[i]))
623
- if (DecPos >= 0)
624
- Dec++;
625
- else
626
- Whole++;
627
- else if (this._newvalue[i] === decimalChar)
628
- DecPos = i;
629
- if (pic.getWholes() < Whole || pic.getDec() < Dec)
630
- return false;
631
- else
632
- return true;
633
- }
634
- checkDateField() {
635
- let newDate = (this._newvalue == null ? null : new Date(this._newvalue));
636
- this.setValidationFailed(false);
637
- if (this._valDet.getControl().isDateZero(this._newvalue)) {
638
- let defaultMgValue = this._valDet.getControl().getField().getDefaultValue();
639
- newDate = DisplayConvertor.Instance.mg2disp(defaultMgValue, "", this._valDet.getPIC(), true, this._valDet.getControl().getForm().getTask().getCompIdx(), false);
640
- }
641
- else {
642
- if (this._valDet.getContinuousRangeValues() != null || this._valDet.getDiscreteRangeValues() != null)
643
- newDate = this.fillDateByRange(this._valDet.getContinuousRangeValues(), this._valDet.getDiscreteRangeValues(), this._newvalue);
644
- }
645
- return newDate;
646
- }
647
- add2Date(currValue, buffer, type) {
648
- let start = currValue;
649
- let currAdd = new StringBuilder(this._newvalue.length);
650
- let letters = 0;
651
- switch (type) {
652
- case PICInterface.PIC_DD:
653
- case PICInterface.PIC_DDDD:
654
- case PICInterface.PIC_MMD:
655
- case PICInterface.PIC_YY:
656
- letters = 2;
657
- break;
658
- case PICInterface.PIC_DDD:
659
- letters = 3;
660
- break;
661
- case PICInterface.PIC_YYYY:
662
- letters = 4;
663
- break;
664
- case PICInterface.PIC_W:
665
- letters = 1;
666
- break;
667
- case PICInterface.PIC_YJ:
668
- letters = 2;
669
- type = PICInterface.PIC_YY;
670
- break;
671
- }
672
- while (start < this._newvalue.length && !UtilStrByteMode.isDigit(this._newvalue.charAt(start)))
673
- start++;
674
- if (start === this._newvalue.length && (this._newvalue.length === 0 || this._newvalue === "0")) {
675
- for (let nul = 0; nul < letters; nul = nul + 1) {
676
- buffer.Append('0');
677
- }
678
- return currValue;
679
- }
680
- else if (start === this._newvalue.length) {
681
- this._newvalue = this._newvalue + "0";
682
- }
683
- let i;
684
- for (i = start; i < start + letters && i < this._newvalue.length; i++) {
685
- if (UtilStrByteMode.isDigit(this._newvalue.charAt(i)))
686
- currAdd.Append(this._newvalue.charAt(i));
687
- else
688
- break;
689
- }
690
- if (currAdd.Length === 0) {
691
- currAdd.Append('0');
692
- }
693
- let add = NNumber.Parse(currAdd.ToString());
694
- if ((add < 1 && type !== PICInterface.PIC_YYYY && type !== PICInterface.PIC_YY) ||
695
- (add > 31 && (type === PICInterface.PIC_DD || type === PICInterface.PIC_DDDD)) ||
696
- (add > 12 && type === PICInterface.PIC_MMD) || (add > 7 && type === PICInterface.PIC_W)) {
697
- throw new WrongFormatException(MsgInterface.STR_ERR_DATE);
698
- }
699
- if (type === PICInterface.PIC_YYYY && this._environment.GetCentury(this._valDet.getControl().getForm().getTask().getCompIdx()) > 999 && currAdd.Length < 3)
700
- currAdd = this.checkCentury(add);
701
- for (let j = 0; j < letters - currAdd.Length; j = j + 1) {
702
- buffer.Append('0');
703
- }
704
- buffer.Append(currAdd.ToString());
705
- return i;
706
- }
707
- addM2Date(currValue, letters, buffer, type) {
708
- let array;
709
- let result;
710
- if (type === PICInterface.PIC_MMM || type === PICInterface.PIC_MMD) {
711
- if (this.hebrew) {
712
- array = HebrewDate.GetLocalMonths();
713
- }
714
- else {
715
- let messageString = Events.GetMessageString(MsgInterface.MONTHS_PTR);
716
- array = DateUtil.getLocalMonths(messageString);
717
- }
718
- }
719
- else {
720
- if (type === PICInterface.PIC_WWW || type === PICInterface.PIC_W) {
721
- if (this.hebrew) {
722
- array = HebrewDate.GetLocalDows();
723
- }
724
- else {
725
- let dayStr = Events.GetMessageString(MsgInterface.DAYS_PTR);
726
- array = DateUtil.getLocalDays(dayStr);
727
- }
728
- }
729
- else {
730
- if (type === PICInterface.PIC_BB) {
731
- array = UtilDateJpn.getArrayDow();
732
- }
733
- else {
734
- if (type === PICInterface.PIC_JY1 || type === PICInterface.PIC_JY2 || type === PICInterface.PIC_JY4) {
735
- if (this._newvalue.length < currValue + letters) {
736
- throw new WrongFormatException(MsgInterface.STR_ERR_DATE);
737
- }
738
- let text = this._newvalue.substr(currValue, letters);
739
- buffer.Append(text);
740
- return currValue + text.length;
741
- }
742
- else {
743
- return currValue + letters;
744
- }
745
- }
746
- }
747
- }
748
- if (this._newvalue.length < currValue) {
749
- currValue = this._newvalue.length;
750
- }
751
- let max = this.getMonthOrWeek(this._newvalue.substr(currValue), letters, type);
752
- if (array[max].trim().length >= letters) {
753
- buffer.Append(array[max].trim().substr(0, letters));
754
- }
755
- else {
756
- buffer.Append(array[max].trim());
757
- for (let i = letters - array[max].trim().length; i > 0; i = i - 1) {
758
- buffer.Append(' ');
759
- }
760
- }
761
- return currValue + letters;
762
- }
763
- getEndOfNumericBlock(currValue) {
764
- while (currValue < this._newvalue.length && !UtilStrByteMode.isDigit(this._newvalue.charAt(currValue))) {
765
- currValue = currValue + 1;
766
- }
767
- return currValue;
768
- }
769
- addDateSuffix(last) {
770
- let thenumber = NNumber.Parse(last);
771
- if (thenumber === 1 || thenumber === 21 || thenumber === 31)
772
- return "st";
773
- else if (thenumber === 2 || thenumber === 22)
774
- return "nd";
775
- else if (thenumber === 3 || thenumber === 23)
776
- return "rd";
777
- return "th";
778
- }
779
- getSizeOfBlock(start, type) {
780
- let letters = start + 1;
781
- while (letters < this._picture.length && this._picture.charCodeAt(letters) === type)
782
- letters++;
783
- return letters - start;
784
- }
785
- getMonthOrWeek(month_str, letters, type) {
786
- let array;
787
- if (type === PICInterface.PIC_MMM || type === PICInterface.PIC_MMD) {
788
- if (this.hebrew)
789
- array = HebrewDate.GetLocalMonths();
790
- else {
791
- let monthStr = Events.GetMessageString(MsgInterface.MONTHS_PTR);
792
- array = DateUtil.getLocalMonths(monthStr.toString());
793
- }
794
- }
795
- else if (type === PICInterface.PIC_WWW || type === PICInterface.PIC_W) {
796
- if (this.hebrew)
797
- array = HebrewDate.GetLocalDows();
798
- else {
799
- let dayStr = Events.GetMessageString(MsgInterface.DAYS_PTR);
800
- array = DateUtil.getLocalDays(dayStr.toString());
801
- }
802
- }
803
- else if (type === PICInterface.PIC_BB) {
804
- array = UtilDateJpn.getArrayDow();
805
- }
806
- else {
807
- return 1;
808
- }
809
- if (letters > month_str.length)
810
- letters = month_str.length;
811
- if (this.hebrew) {
812
- let hstr = NString.TrimStart(month_str).substr(0, letters).trim();
813
- for (let i = 1; i < array.length; i++) {
814
- if (array[i].trim() === hstr) {
815
- if (i === 14)
816
- i = 6;
817
- return i;
818
- }
819
- }
820
- return 0;
821
- }
822
- try {
823
- let str = month_str.substr(0, letters).trim();
824
- let numBuffer = new StringBuilder(str.length);
825
- for (let i = 0; i < str.length; i++) {
826
- if (UtilStrByteMode.isDigit(str[i]))
827
- numBuffer.Append(str[i]);
828
- else
829
- break;
830
- }
831
- let theNumber = NNumber.Parse(numBuffer.ToString());
832
- if (theNumber < 1)
833
- return 1;
834
- if (type === PICInterface.PIC_MMM || type === PICInterface.PIC_MMD) {
835
- if (theNumber > 12)
836
- return 12;
837
- }
838
- else if (type === PICInterface.PIC_WWW || type === PICInterface.PIC_W || type === PICInterface.PIC_BB) {
839
- if (theNumber > 7)
840
- return 7;
841
- }
842
- return theNumber;
843
- }
844
- catch (ex_21A) {
845
- }
846
- let found = new Array(array.length);
847
- let from;
848
- let max = -1;
849
- for (let tmp = 1; tmp < array.length; tmp++) {
850
- found[tmp] = 0;
851
- from = 0;
852
- for (let i = 0; i < array[tmp].length && from < month_str.length && i < letters; i++, from++) {
853
- if (array[tmp].toLowerCase()[i] === month_str.toLowerCase()[from])
854
- found[tmp]++;
855
- else
856
- break;
857
- }
858
- if (from === letters || from === array[tmp].length) {
859
- max = tmp;
860
- break;
861
- }
862
- }
863
- if (max === -1)
864
- max = this.findMax(found);
865
- return max;
866
- }
867
- isNumberAllowedInDate() {
868
- for (let i = 0; i < this._picture.length; i++) {
869
- if (this.isDatePositionalNumericDirective(this._picture[i]))
870
- return true;
871
- }
872
- return false;
873
- }
874
- isAllNumbers0() {
875
- let currChr;
876
- for (let i = 0; i < this._newvalue.length; i++) {
877
- currChr = this._newvalue[i];
878
- if (UtilStrByteMode.isDigit(currChr) && currChr !== '0')
879
- return false;
880
- }
881
- return true;
882
- }
883
- checkCentury(yearIn) {
884
- let outVal;
885
- let start_century = this._environment.GetCentury(this._valDet.getControl().getForm().getTask().getCompIdx());
886
- let century = Math.floor(start_century / 100);
887
- let years = start_century % 100;
888
- if (yearIn >= years && yearIn !== 0)
889
- outVal = (century * 100 + yearIn);
890
- else
891
- outVal = ((++century) * 100 + yearIn);
892
- return new StringBuilder(outVal.toString());
893
- }
894
- isDateLegal4Range(ContinuousRange, DiscreteRange, currDate) {
895
- let pic = this._valDet.getPIC();
896
- let i;
897
- let downDate;
898
- let topDate;
899
- if (ContinuousRange != null) {
900
- for (i = 0; i < ContinuousRange.length - 1; i++) {
901
- downDate = DisplayConvertor.Instance.a_2_date_pic(ContinuousRange.get_Item(i), pic, pic.getMask(), this._valDet.getControl().getForm().getTask().getCompIdx());
902
- topDate = DisplayConvertor.Instance.a_2_date_pic(ContinuousRange.get_Item(++i), pic, pic.getMask(), this._valDet.getControl().getForm().getTask().getCompIdx());
903
- if (currDate >= downDate && currDate <= topDate)
904
- return true;
905
- }
906
- }
907
- if (DiscreteRange != null) {
908
- for (i = 0; i < DiscreteRange.length; i++) {
909
- if (currDate === DisplayConvertor.Instance.a_2_date_pic(DiscreteRange.get_Item(i), pic, pic.getMask(), this._valDet.getControl().getForm().getTask().getCompIdx()))
910
- return true;
911
- }
912
- }
913
- throw new WrongFormatException();
914
- }
915
- fillDateByRange(ContinuousRange, DiscreteRange, buffer) {
916
- let pic = this._valDet.getPIC();
917
- let i;
918
- let downDate;
919
- let topDate;
920
- let currDate = DisplayConvertor.Instance.fromNativeDateToMgDateNumber(buffer, pic, this._valDet.getControl().getForm().getTask().getCompIdx());
921
- this.setValidationFailed(false);
922
- if (ContinuousRange != null) {
923
- for (i = 0; i < ContinuousRange.length - 1; i++) {
924
- downDate = DisplayConvertor.Instance.a_2_date_pic(ContinuousRange.get_Item(i), pic, pic.getMask(), this._valDet.getControl().getForm().getTask().getCompIdx());
925
- topDate = DisplayConvertor.Instance.a_2_date_pic(ContinuousRange.get_Item(++i), pic, pic.getMask(), this._valDet.getControl().getForm().getTask().getCompIdx());
926
- if (currDate >= downDate && currDate <= topDate)
927
- return new Date(buffer);
928
- }
929
- }
930
- if (DiscreteRange != null) {
931
- for (i = 0; i < DiscreteRange.length; i++) {
932
- if (currDate === DisplayConvertor.Instance.a_2_date_pic(DiscreteRange.get_Item(i), pic, pic.getMask(), this._valDet.getControl().getForm().getTask().getCompIdx())) {
933
- return new Date(buffer);
934
- }
935
- }
936
- }
937
- throw new WrongFormatException();
938
- }
939
- checkDay(date, isDoy) {
940
- let day = this.getDateElement(date, DateElement.DAY);
941
- if (day < 29 && !isDoy)
942
- return new StringBuilder(date);
943
- let year = this.getDateElement(date, DateElement.YEAR);
944
- if (!isDoy) {
945
- if (year.toString().length < 3)
946
- year = NNumber.Parse(this.checkCentury(year).ToString());
947
- if (this._environment.GetDateMode(this._valDet.getControl().getForm().getTask().getCompIdx()) === 'B')
948
- year -= PICInterface.DATE_BUDDHIST_GAP;
949
- let month = this.getDateElement(date, DateElement.MONTH);
950
- let dayMax = this.getMaxDayInMonth(year, month);
951
- if (day > dayMax) {
952
- throw new WrongFormatException(MsgInterface.STR_ERR_DATE);
953
- }
954
- }
955
- else {
956
- let monthReal = this.getMonthByDay(year, day);
957
- if (monthReal < 1 || monthReal > 12)
958
- throw new WrongFormatException(MsgInterface.STR_ERR_DATE);
959
- }
960
- return new StringBuilder(date);
961
- }
962
- checkWeek(date) {
963
- let dow = this.getDateElement(date, DateElement.DOW);
964
- let breakParams = DisplayConvertor.Instance.getNewDateBreakParams();
965
- let dateMagic = DisplayConvertor.Instance.a_2_date(date, this._picture, this._valDet.getControl().getForm().getTask().getCompIdx());
966
- DisplayConvertor.Instance.date_break_datemode(breakParams, dateMagic, true, this._valDet.getControl().getForm().getTask().getCompIdx());
967
- let dowReal = breakParams.dow;
968
- if (dowReal !== dowReal)
969
- date = this.changeDow(date, dowReal);
970
- return new StringBuilder(date);
971
- }
972
- checkJpnEraYear(strDate) {
973
- let breakParams = DisplayConvertor.Instance.getNewDateBreakParams();
974
- let dateMagic = DisplayConvertor.Instance.a_2_date(strDate, this._picture, this._valDet.getControl().getForm().getTask().getCompIdx());
975
- DisplayConvertor.Instance.date_break_datemode(breakParams, dateMagic, true, this._valDet.getControl().getForm().getTask().getCompIdx());
976
- let intYearAD = breakParams.year;
977
- let intDoy = breakParams.doy;
978
- let strEraAlpha;
979
- let strEraKanji;
980
- strEraAlpha = UtilDateJpn.getInstance().date_jpn_yr_2_a(intYearAD, intDoy, false);
981
- strEraKanji = UtilDateJpn.getInstance().date_jpn_yr_2_a(intYearAD, intDoy, true);
982
- let strYearJpnEra = new StringBuilder();
983
- let num = UtilDateJpn.getInstance().date_jpn_year_ofs(intYearAD, intDoy);
984
- if (num <= 0) {
985
- throw new WrongFormatException(MsgInterface.STR_ERR_DATE);
986
- }
987
- if (num <= 9) {
988
- strYearJpnEra.Append("0");
989
- }
990
- strYearJpnEra.Append(num.toString());
991
- let intPicIdxOfs = 0;
992
- for (let intCnt = 0; intCnt + intPicIdxOfs < this._picture.length; intCnt++) {
993
- switch (this._picture.charCodeAt(intCnt + intPicIdxOfs)) {
994
- case (PICInterface.PIC_JY1):
995
- strDate = UtilStrByteMode.repC(strDate, strEraAlpha, intCnt + 1, 1);
996
- break;
997
- case (PICInterface.PIC_JY2):
998
- strDate = UtilStrByteMode.repC(strDate, strEraKanji, intCnt + 1, 1);
999
- intPicIdxOfs++;
1000
- break;
1001
- case (PICInterface.PIC_JY4):
1002
- strDate = UtilStrByteMode.repC(strDate, strEraKanji, intCnt + 1, 2);
1003
- intCnt++;
1004
- intPicIdxOfs += 2;
1005
- break;
1006
- case (PICInterface.PIC_YJ):
1007
- strDate = UtilStrByteMode.repC(strDate, strYearJpnEra.toString(), intCnt + 1, 2);
1008
- intCnt++;
1009
- break;
1010
- default:
1011
- if (intCnt < strDate.length) {
1012
- if (UtilStrByteMode.isHalfWidth(strDate[intCnt]) === false && UtilStrByteMode.isHalfWidth(this._picture[intCnt + intPicIdxOfs]) === true)
1013
- intPicIdxOfs++;
1014
- }
1015
- break;
1016
- }
1017
- }
1018
- return new StringBuilder(strDate);
1019
- }
1020
- getMaxDayInMonth(year, month) {
1021
- let array = [
1022
- 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
1023
- ];
1024
- let leapyear = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
1025
- if (leapyear && month === 2)
1026
- return array[month] + 1;
1027
- return array[month];
1028
- }
1029
- getMonthByDay(year, day) {
1030
- let i;
1031
- let LeapYear;
1032
- LeapYear = (year % 4 === 0) && ((year % 100 !== 0) || (year % 400 === 0));
1033
- for (i = 0; i < PICInterface.date_day_tab.length; i++) {
1034
- if (!LeapYear) {
1035
- if (PICInterface.date_day_tab[i] >= day)
1036
- return i;
1037
- }
1038
- else {
1039
- if (i < 3) {
1040
- if (PICInterface.date_day_tab[i] >= day)
1041
- return i;
1042
- }
1043
- else {
1044
- if (PICInterface.date_day_tab[i] + 1 >= day)
1045
- return i;
1046
- }
1047
- }
1048
- }
1049
- return i;
1050
- }
1051
- getDateElement(date, element) {
1052
- let buffer = null;
1053
- let letters = 0;
1054
- let exitLoop = false;
1055
- let picWeekType = PICInterface.PIC_WWW;
1056
- let isJpnEraYear = false;
1057
- let era_year = 0;
1058
- let intPicIdxOfs = 0;
1059
- let minLen = 0;
1060
- if (UtilStrByteMode.isLocaleDefLangJPN())
1061
- minLen = UtilStrByteMode.getMinLenPicture(date, this._picture);
1062
- else
1063
- minLen = Math.min(date.length, this._picture.length);
1064
- for (let i = 0; i + intPicIdxOfs < minLen && !exitLoop; i++) {
1065
- if (this.isDataPositionalDirective(this._picture[i + intPicIdxOfs])) {
1066
- switch (this._picture.charCodeAt(i + intPicIdxOfs)) {
1067
- case PICInterface.PIC_DD:
1068
- if (element === DateElement.DAY) {
1069
- buffer = date.substr(i, 2);
1070
- exitLoop = true;
1071
- break;
1072
- }
1073
- i++;
1074
- break;
1075
- case PICInterface.PIC_DDD:
1076
- if (element === DateElement.DAY) {
1077
- buffer = date.substr(i, 3);
1078
- exitLoop = true;
1079
- break;
1080
- }
1081
- i += 2;
1082
- break;
1083
- case PICInterface.PIC_DDDD:
1084
- if (element === DateElement.DAY) {
1085
- buffer = date.substr(i, 2);
1086
- exitLoop = true;
1087
- }
1088
- i += 3;
1089
- break;
1090
- case PICInterface.PIC_MMD:
1091
- if (element === DateElement.MONTH) {
1092
- buffer = date.substr(i, 2);
1093
- exitLoop = true;
1094
- }
1095
- i++;
1096
- break;
1097
- case PICInterface.PIC_MMM:
1098
- letters = this.getSizeOfBlock(i + intPicIdxOfs, PICInterface.PIC_MMM);
1099
- if (element === DateElement.MONTH) {
1100
- buffer = date.substr(i, letters);
1101
- exitLoop = true;
1102
- break;
1103
- }
1104
- i += letters - 1;
1105
- letters = 0;
1106
- break;
1107
- case PICInterface.PIC_YY:
1108
- if (element === DateElement.YEAR) {
1109
- buffer = date.substr(i, 2);
1110
- exitLoop = true;
1111
- }
1112
- i++;
1113
- break;
1114
- case PICInterface.PIC_YYYY:
1115
- if (element === DateElement.YEAR) {
1116
- buffer = date.substr(i, 4);
1117
- exitLoop = true;
1118
- }
1119
- i += 3;
1120
- break;
1121
- case PICInterface.PIC_W:
1122
- if (element === DateElement.DOW) {
1123
- buffer = date.substr(i, 1);
1124
- exitLoop = true;
1125
- }
1126
- break;
1127
- case PICInterface.PIC_WWW:
1128
- letters = this.getSizeOfBlock(i + intPicIdxOfs, PICInterface.PIC_WWW);
1129
- if (element === DateElement.DOW) {
1130
- buffer = date.substr(i, letters);
1131
- exitLoop = true;
1132
- break;
1133
- }
1134
- i += letters - 1;
1135
- letters = 0;
1136
- break;
1137
- case PICInterface.PIC_HYYYYY:
1138
- case PICInterface.PIC_HL:
1139
- case PICInterface.PIC_HDD:
1140
- break;
1141
- case PICInterface.PIC_BB:
1142
- letters = this.getSizeOfBlock(i + intPicIdxOfs, PICInterface.PIC_BB);
1143
- if (i + Math.floor(letters / 2) < date.length) {
1144
- buffer = date.substr(i, Math.floor(letters / 2));
1145
- intPicIdxOfs += letters - buffer.length;
1146
- }
1147
- if (element === DateElement.DOW) {
1148
- exitLoop = true;
1149
- picWeekType = PICInterface.PIC_BB;
1150
- }
1151
- else {
1152
- buffer = null;
1153
- }
1154
- i += letters - 1;
1155
- break;
1156
- case PICInterface.PIC_JY1:
1157
- isJpnEraYear = true;
1158
- break;
1159
- case PICInterface.PIC_JY2:
1160
- isJpnEraYear = true;
1161
- intPicIdxOfs++;
1162
- break;
1163
- case PICInterface.PIC_JY4:
1164
- isJpnEraYear = true;
1165
- intPicIdxOfs += 2;
1166
- i++;
1167
- break;
1168
- case PICInterface.PIC_YJ:
1169
- if (element === DateElement.YEAR) {
1170
- buffer = date.substr(i, 2);
1171
- exitLoop = true;
1172
- }
1173
- i++;
1174
- break;
1175
- }
1176
- }
1177
- }
1178
- if (buffer == null) {
1179
- if (element === DateElement.YEAR)
1180
- return DateTime.Now.Year;
1181
- else
1182
- return 1;
1183
- }
1184
- buffer = buffer.trim();
1185
- if (letters > 0) {
1186
- if (element === DateElement.MONTH)
1187
- letters = this.getMonthOrWeek(buffer.toString(), letters, PICInterface.PIC_MMM);
1188
- else if (element === DateElement.DOW)
1189
- letters = this.getMonthOrWeek(buffer.toString(), letters, picWeekType);
1190
- }
1191
- else {
1192
- while (buffer.toString().startsWith("0") || buffer.toString().startsWith(" "))
1193
- buffer = buffer.toString().substr(1);
1194
- if (buffer.length === 0)
1195
- letters = 0;
1196
- else
1197
- letters = NNumber.Parse(buffer.toString());
1198
- }
1199
- if (element === DateElement.YEAR && isJpnEraYear) {
1200
- era_year = UtilDateJpn.getInstance().getStartYearOfEra(date, this._picture);
1201
- if (era_year === 0)
1202
- return 0;
1203
- letters += era_year - 1;
1204
- }
1205
- return letters;
1206
- }
1207
- changeDow(date, dow) {
1208
- let isDate = false;
1209
- let letters;
1210
- let startPart;
1211
- let finishPart;
1212
- let number1;
1213
- number1 = "" + dow;
1214
- let intPicIdxOfs = 0;
1215
- for (let i = 0; i + intPicIdxOfs < this._picture.length && !isDate; i++) {
1216
- if (this.isDataPositionalDirective(this._picture[i + intPicIdxOfs])) {
1217
- switch (this._picture.charCodeAt(i + intPicIdxOfs)) {
1218
- case PICInterface.PIC_W:
1219
- startPart = date.substr(0, i);
1220
- finishPart = date.substr(i + 1);
1221
- date = startPart + number1 + finishPart;
1222
- isDate = true;
1223
- break;
1224
- case PICInterface.PIC_WWW:
1225
- letters = this.getSizeOfBlock(i + intPicIdxOfs, PICInterface.PIC_WWW);
1226
- startPart = date.substr(0, i);
1227
- finishPart = date.substr(i + letters);
1228
- let dayStr = Events.GetMessageString(MsgInterface.DAYS_PTR);
1229
- let dayNames = DateUtil.getLocalDays(dayStr);
1230
- number1 = dayNames[dow];
1231
- if (number1.length > letters)
1232
- number1 = number1.substr(0, letters);
1233
- else if (number1.length < letters)
1234
- while (number1.length < letters)
1235
- number1 = number1 + ' ';
1236
- date = startPart + number1 + finishPart;
1237
- isDate = true;
1238
- break;
1239
- case PICInterface.PIC_BB:
1240
- letters = this.getSizeOfBlock(i + intPicIdxOfs, PICInterface.PIC_BB);
1241
- startPart = date.substr(0, i);
1242
- finishPart = date.substr(i + Math.floor(letters / 2));
1243
- number1 = UtilDateJpn.getStrDow(dow);
1244
- if (UtilStrByteMode.lenB(number1) > letters)
1245
- number1 = UtilStrByteMode.leftB(number1, letters);
1246
- else if (UtilStrByteMode.lenB(number1) < letters)
1247
- while (UtilStrByteMode.lenB(number1) < letters)
1248
- number1 = number1 + ' ';
1249
- date = startPart + number1 + finishPart;
1250
- isDate = true;
1251
- break;
1252
- default:
1253
- if (UtilStrByteMode.isLocaleDefLangDBCS()) {
1254
- if (i < date.length) {
1255
- if (UtilStrByteMode.isHalfWidth(date[i]) === false && UtilStrByteMode.isHalfWidth(this._picture[i + intPicIdxOfs]) === true)
1256
- intPicIdxOfs++;
1257
- }
1258
- }
1259
- break;
1260
- }
1261
- }
1262
- }
1263
- return date;
1264
- }
1265
- checkTimeField() {
1266
- let newTime = new Date(this._newvalue);
1267
- this.setValidationFailed(false);
1268
- if (this._valDet.getControl().isDateZero(this._newvalue)) {
1269
- let defaultMgValue = this._valDet.getControl().getField().getDefaultValue();
1270
- newTime = DisplayConvertor.Instance.mg2disp(defaultMgValue, "", this._valDet.getPIC(), true, this._valDet.getControl().getForm().getTask().getCompIdx(), false);
1271
- }
1272
- else {
1273
- if (this._valDet.getContinuousRangeValues() != null || this._valDet.getDiscreteRangeValues() != null)
1274
- newTime = this.fillTimeByRange(this._valDet.getContinuousRangeValues(), this._valDet.getDiscreteRangeValues(), this._newvalue);
1275
- }
1276
- return newTime;
1277
- }
1278
- add2Time(currValue, buffer, type) {
1279
- let start = currValue;
1280
- let i;
1281
- let STR_00 = "00";
1282
- let currAdd = new StringBuilder();
1283
- while (start < this._newvalue.length && !UtilStrByteMode.isDigit(this._newvalue[start])) {
1284
- start++;
1285
- }
1286
- if (start === this._newvalue.length) {
1287
- buffer.Append(STR_00.toString());
1288
- return currValue;
1289
- }
1290
- for (i = start; i < start + 2 && i < this._newvalue.length; i++) {
1291
- if (UtilStrByteMode.isDigit(this._newvalue[i]))
1292
- currAdd.Append(this._newvalue[i]);
1293
- else {
1294
- currAdd.Insert(0, '0');
1295
- break;
1296
- }
1297
- }
1298
- if (i === this._newvalue.length && i === start + 1)
1299
- currAdd.Insert(0, '0');
1300
- else if (i === this._newvalue.length && i === start)
1301
- currAdd.Append(STR_00.toString());
1302
- let add = NNumber.Parse(currAdd.ToString());
1303
- if (add < 0 || (add > 59 && type === PICInterface.PIC_MMT) || (add > 59 && type === PICInterface.PIC_SS))
1304
- throw new WrongFormatException(MsgInterface.STR_ERR_TIME);
1305
- else if (type === PICInterface.PIC_HH) {
1306
- let PM = this.getIsPM();
1307
- let newStr = null;
1308
- let dif;
1309
- if ((add >= 12 || add === 0) && PM) {
1310
- let addTmp = add % 24;
1311
- this._isPm = (addTmp >= 12 && addTmp < 24);
1312
- if (addTmp > 12)
1313
- dif = addTmp - 12;
1314
- else if (addTmp === 0)
1315
- dif = 12;
1316
- else
1317
- dif = addTmp;
1318
- newStr = ((dif > 9 ? "" : "0") + dif);
1319
- }
1320
- else if (add > 99 && !PM)
1321
- newStr = "99";
1322
- if (newStr != null) {
1323
- currAdd.Remove(0, currAdd.Length);
1324
- currAdd.Append(newStr.toString());
1325
- }
1326
- }
1327
- buffer.Append(currAdd.ToString());
1328
- return i;
1329
- }
1330
- addPM2Time(currValue, buffer) {
1331
- let i;
1332
- if ((i = this._newvalue.toUpperCase().indexOf("AM", currValue)) !== -1) {
1333
- buffer.Append("am");
1334
- return i + 2;
1335
- }
1336
- else {
1337
- if ((i = this._newvalue.toUpperCase().indexOf("PM", currValue)) !== -1) {
1338
- buffer.Append("pm");
1339
- return i + 2;
1340
- }
1341
- else if (this._isPm) {
1342
- buffer.Append("pm");
1343
- return currValue;
1344
- }
1345
- else
1346
- buffer.Append("am");
1347
- }
1348
- return currValue;
1349
- }
1350
- getIsPM() {
1351
- for (let curr = 0; curr < this._picture.length; curr++) {
1352
- if (this._picture.charCodeAt(curr) === PICInterface.PIC_PM)
1353
- return true;
1354
- }
1355
- return false;
1356
- }
1357
- fillTimeByRange(ContinuousRange, DiscreteRange, buffer) {
1358
- let pic = this._valDet.getPIC();
1359
- let currTime = DisplayConvertor.Instance.fromNativeTimeToMgTimeNumber(buffer, pic);
1360
- let downTime, topTime;
1361
- let i;
1362
- this.setValidationFailed(false);
1363
- if (ContinuousRange != null) {
1364
- for (i = 0; i < ContinuousRange.length - 1; i++) {
1365
- downTime = DisplayConvertor.Instance.a_2_time(ContinuousRange.get_Item(i), pic, false);
1366
- topTime = DisplayConvertor.Instance.a_2_time(ContinuousRange.get_Item(++i), pic, false);
1367
- if (currTime >= downTime && currTime <= topTime)
1368
- return new Date(buffer);
1369
- }
1370
- }
1371
- if (DiscreteRange != null) {
1372
- for (i = 0; i < DiscreteRange.length; i++) {
1373
- if (currTime === DisplayConvertor.Instance.a_2_time(DiscreteRange.get_Item(i), pic, false))
1374
- return new Date(buffer);
1375
- }
1376
- }
1377
- throw new WrongFormatException();
1378
- }
1379
- printMessage(msgId, setValidationFaild) {
1380
- let message = new StringBuilder("");
1381
- let ctrlType;
1382
- if (msgId === MsgInterface.EDT_ERR_STR_1) {
1383
- let pic = this._valDet.getPIC();
1384
- let token = "%d";
1385
- let messageString = Events.GetMessageString(msgId);
1386
- messageString = StrUtil.replaceStringTokens(messageString, token, 1, pic.getWholes().toString());
1387
- messageString = StrUtil.replaceStringTokens(messageString, token, 1, pic.getDec().toString());
1388
- message.Append(messageString);
1389
- }
1390
- else {
1391
- message.Append(Events.GetMessageString(msgId));
1392
- if (msgId === MsgInterface.STR_RNG_TXT && this._valDet.getRange() != null)
1393
- message.Append(StrUtil.makePrintableTokens(this._valDet.getRange(), HTML_2_STR));
1394
- }
1395
- if (this._valDet.getControl() != null) {
1396
- ctrlType = this._valDet.getControl().Type;
1397
- if (ctrlType !== MgControlType.CTRL_TYPE_BUTTON && ctrlType !== MgControlType.CTRL_TYPE_RADIO && !this._valDet.getControl().isSelectionCtrl()) {
1398
- let msgString = message.ToString();
1399
- this._valDet.getControl().getForm().getTask().WriteToMessagePane(StrUtil.makePrintable2(msgString), true);
1400
- this._valDet.getControl().getForm().ErrorOccured = !NString.IsNullOrEmpty(msgString);
1401
- this._valDet.ErrorMessage = message.ToString();
1402
- }
1403
- }
1404
- if (setValidationFaild)
1405
- this.setValidationFailed(true);
1406
- }
1407
- changeStringInside(to, index) {
1408
- this._newvalue = this._newvalue.substr(0, index) + to + this._newvalue.substr(index + to.length);
1409
- }
1410
- init(validationDetails) {
1411
- this._valDet = validationDetails;
1412
- this._valDet.setNull(false);
1413
- this._isPm = false;
1414
- let pIC = this._valDet.getPIC();
1415
- this._oldvalue = this._valDet.getOldValue();
1416
- this._newvalue = this._valDet.getDispValue();
1417
- if (this._newvalue === null) {
1418
- if (pIC == null || pIC.getAttr() != StorageAttribute.DATE)
1419
- this._newvalue = "";
1420
- }
1421
- if (this._oldvalue === null) {
1422
- this._oldvalue = "";
1423
- }
1424
- if (!(pIC === null || pIC.getAttr() === StorageAttribute.BLOB || pIC.getAttr() === StorageAttribute.BLOB_VECTOR)) {
1425
- this._picture = pIC.getMask();
1426
- this.hebrew = pIC.isHebrew();
1427
- this._picture = this._picture.substr(0, pIC.getMaskSize());
1428
- }
1429
- }
1430
- findMax(array) {
1431
- let index = 0;
1432
- let max = array[index];
1433
- for (let i = 1; i < array.length; i++) {
1434
- if (array[i] > max) {
1435
- max = array[i];
1436
- index = i;
1437
- }
1438
- }
1439
- return index;
1440
- }
1441
- isDataPositionalDirective(toCheck) {
1442
- let ascii = toCheck.charCodeAt(0);
1443
- return (ascii === PICInterface.PIC_YY || ascii === PICInterface.PIC_YYYY || ascii === PICInterface.PIC_MMD || ascii === PICInterface.PIC_MMM
1444
- || ascii === PICInterface.PIC_DD || ascii === PICInterface.PIC_DDD || ascii === PICInterface.PIC_DDDD || ascii === PICInterface.PIC_W
1445
- || ascii === PICInterface.PIC_WWW || ascii === PICInterface.PIC_HYYYYY || ascii === PICInterface.PIC_HL || ascii === PICInterface.PIC_HDD || ascii === PICInterface.PIC_YJ
1446
- || ascii === PICInterface.PIC_JY1 || ascii === PICInterface.PIC_JY2 || ascii === PICInterface.PIC_JY4 || ascii === PICInterface.PIC_BB);
1447
- }
1448
- isDatePositionalNumericDirective(toCheck) {
1449
- let ascii = toCheck.charCodeAt(0);
1450
- return (ascii === PICInterface.PIC_YY || ascii === PICInterface.PIC_YYYY || ascii === PICInterface.PIC_MMD || ascii === PICInterface.PIC_DD
1451
- || ascii === PICInterface.PIC_DDD || ascii === PICInterface.PIC_DDDD || ascii === PICInterface.PIC_W || ascii === PICInterface.PIC_HYYYYY
1452
- || ascii === PICInterface.PIC_HL || ascii === PICInterface.PIC_HDD || ascii === PICInterface.PIC_YJ || ascii === PICInterface.PIC_JY1
1453
- || ascii === PICInterface.PIC_JY2 || ascii === PICInterface.PIC_JY4 || ascii === PICInterface.PIC_BB);
1454
- }
1455
- isNumericPositionalDirective(toCheck) {
1456
- let ascii = toCheck.charCodeAt(0);
1457
- return (ascii === PICInterface.PIC_N);
1458
- }
1459
- isLogicPositionalDirective(toCheck) {
1460
- let ascii = toCheck.charCodeAt(0);
1461
- return (ascii === PICInterface.PIC_X);
1462
- }
1463
- isTimePositionalDirective(toCheck) {
1464
- let ascii = toCheck.charCodeAt(0);
1465
- return (ascii === PICInterface.PIC_HH || ascii === PICInterface.PIC_MMT || ascii === PICInterface.PIC_SS || ascii === PICInterface.PIC_PM || ascii === PICInterface.PIC_MS);
1466
- }
1467
- indexOfPositionalNonDirective(str) {
1468
- let tmp;
1469
- for (let i = 0; i < str.length; i++) {
1470
- tmp = str[i];
1471
- if (DisplayConvertor.isAlphaPositionalDirective(tmp) || this.isDataPositionalDirective(tmp) || this.isNumericPositionalDirective(tmp)
1472
- || this.isLogicPositionalDirective(tmp) || this.isTimePositionalDirective(tmp))
1473
- continue;
1474
- return i;
1475
- }
1476
- return -1;
1477
- }
1478
- setValidationFailed(val) {
1479
- if (this._valDet.ValidationFailed)
1480
- return;
1481
- else
1482
- this._valDet.setValidationFailed(val);
1483
- }
1484
- digitsBeforeDelimeter(inputString, searchStart, delimeter) {
1485
- let counter = 0;
1486
- let searchEndPos = inputString.indexOf(delimeter, searchStart);
1487
- if (searchEndPos < 0)
1488
- searchEndPos = inputString.length;
1489
- for (let i = searchStart; i < searchEndPos; i++)
1490
- if (NChar.IsDigit(inputString[i]))
1491
- counter++;
1492
- return counter;
1493
- }
1494
- isNullDisplayVal() {
1495
- let isNullDisplayVal = false;
1496
- let field = this._valDet.getControl().getField();
1497
- if (field.NullAllowed && field.hasNullDisplayValue()) {
1498
- let dispDefValue = field.getNullDisplay();
1499
- if (dispDefValue !== null)
1500
- isNullDisplayVal = (dispDefValue.toString() === this._newvalue);
1501
- else
1502
- isNullDisplayVal = (this._newvalue === null);
1503
- }
1504
- return isNullDisplayVal;
1505
- }
1506
- }
1507
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmllbGRWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL21hbmFnZW1lbnQvZ3VpL0ZpZWxkVmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUVULEtBQUssRUFDTCxPQUFPLEVBQ1AsT0FBTyxFQUNQLGdCQUFnQixFQUNoQixhQUFhLEVBQ2QsTUFBTSxzQkFBc0IsQ0FBQztBQUs5QixPQUFPLEVBQW1CLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdkUsT0FBTyxFQUNMLFFBQVEsRUFDUixVQUFVLEVBQ1YsYUFBYSxFQUNiLFlBQVksRUFDWixZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLE9BQU8sRUFDUCxXQUFXLEVBQ1gsZUFBZSxFQUNoQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFOUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRzlDLE1BQU0sT0FBTyxjQUFjO0lBWXpCO1FBWFEsY0FBUyxHQUFRLElBQUksQ0FBQztRQUN0QixjQUFTLEdBQVEsSUFBSSxDQUFDO1FBQ3RCLGlCQUFZLEdBQVcsSUFBSSxDQUFDO1FBQzVCLG1CQUFjLEdBQVcsSUFBSSxDQUFDO1FBQzlCLFlBQU8sR0FBc0IsSUFBSSxDQUFDO1FBQ2xDLFVBQUssR0FBWSxLQUFLLENBQUM7UUFDdkIsYUFBUSxHQUFXLElBQUksQ0FBQztRQUN4QixXQUFNLEdBQVksS0FBSyxDQUFDO1FBQ3hCLGFBQVEsR0FBVyxJQUFJLENBQUM7UUFDeEIsaUJBQVksR0FBaUIsSUFBSSxDQUFDO1FBR3hDLElBQUksQ0FBQyxZQUFZLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQztRQUMvQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBSUQsUUFBUSxDQUFDLE1BQXlCO1FBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEIsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLElBQUksSUFBSSxHQUFrQixNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFOUMsSUFBSSxVQUFVLEdBQ1osSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFFLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxhQUFhLENBQUMseUJBQXlCLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUU1SSxJQUFJLFNBQVMsR0FBWSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFN0MsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQzdELE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLE9BQU8sTUFBTSxDQUFDO1NBQ2Y7UUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFO1lBQ3hLLElBQUk7Z0JBQ0YsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxrQkFBa0IsRUFBRTtvQkFDbEQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO2lCQUNsRDtnQkFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRTtvQkFDckQsSUFBSSxHQUFHLEdBQVcsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ2hELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRTt3QkFDMUIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDdEI7aUJBQ0Y7YUFDRjtZQUNELE9BQU8sTUFBTSxFQUFFO2dCQUNiLElBQUksTUFBTSxZQUFZLFNBQVMsRUFBRTtpQkFDaEM7O29CQUVDLE1BQU0sTUFBTSxDQUFDO2FBQ2hCO1lBQ0QsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsT0FBTyxNQUFNLENBQUM7U0FDZjtRQUdELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUU7WUFDakksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsRUFBRTtnQkFDM0wsSUFBSSxLQUFLLEdBQWlCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDMUMsSUFBSSxZQUFZLEdBQVcsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUNuRCxJQUFJLElBQUksR0FBUSxJQUFJLENBQUM7Z0JBQ3JCLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxFQUFFO29CQUN6QixNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNyQixJQUFJLEdBQUcsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUM5QixJQUFJLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUU7d0JBQzFFLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7cUJBQzVJO2lCQUNGO2dCQUNELElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtvQkFDakIsSUFBSSxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDNUk7Z0JBQ0QsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7b0JBQ2xJLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO3FCQUV4QjtvQkFDRSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN0QixPQUFPLE1BQU0sQ0FBQztpQkFDZjthQUNGO1NBQ0w7UUFHRixJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQ3JJO1lBQ0UsSUFDQTtnQkFDRSxRQUFRLE1BQU0sQ0FBQyxPQUFPLEVBQUUsRUFDeEI7b0JBRUUsS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7b0JBQzVCLEtBQUssZ0JBQWdCLENBQUMsT0FBTzt3QkFDM0IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQzt3QkFDeEMsTUFBTTtvQkFFUixLQUFLLGdCQUFnQixDQUFDLE9BQU87d0JBQzNCLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO3dCQUM1QyxJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO3dCQUNoRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzt3QkFDM0IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO3dCQUMxQyxNQUFNO29CQUVSLEtBQUssZ0JBQWdCLENBQUMsT0FBTzt3QkFDM0IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO3dCQUMxQyxNQUFNO29CQUVSLEtBQUssZ0JBQWdCLENBQUMsSUFBSTt3QkFDeEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQzt3QkFDdkMsTUFBTTtvQkFFUixLQUFLLGdCQUFnQixDQUFDLElBQUk7d0JBQ3hCLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7d0JBQ3ZDLE1BQU07b0JBRVIsS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7b0JBRTNCLEtBQUssZ0JBQWdCLENBQUMsV0FBVzt3QkFDL0IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7d0JBQ2hDLE1BQU07b0JBRVIsS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7b0JBQzNCO3dCQUNFLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyw2Q0FBNkMsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQzt3QkFDN0YsTUFBTTtpQkFDVDthQUNGO1lBQ0QsT0FBTyxNQUFNLEVBQUU7Z0JBQ2IsSUFBSSxNQUFNLFlBQVksb0JBQW9CLEVBQUU7b0JBRTFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUNoQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQy9CLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLFlBQVksQ0FBQyxXQUFXLEVBQUU7d0JBQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUMzQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ2hDOzt3QkFFQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQ3JEO2FBQ0Y7U0FDRjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBRWhCLENBQUM7SUFTTyxlQUFlO1FBRXJCLElBQUksT0FBTyxHQUFrQixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRXZELElBQUksV0FBVyxHQUFZLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssZ0JBQWdCLENBQUMsS0FBSyxDQUFDO1FBRTdFLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNySSxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1NBQ3ZCO1FBRUQsSUFBSSxXQUFXLElBQUksZUFBZSxDQUFDLG1CQUFtQixFQUFFLEVBQUU7WUFDeEQsSUFBSSxPQUFPLEdBQVcsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUQsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxPQUFPLEVBQUU7Z0JBQ2xELElBQUksQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQ2pFO1NBQ0Y7YUFDSTtZQUNILElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7Z0JBQ2hELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDakU7U0FDRjtRQUNELElBQUksYUFBYSxHQUFrQixJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ3ZELElBQUksV0FBbUIsQ0FBQztRQUN4QixJQUFJLENBQUMsR0FBVyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBRWhDLEtBQUssV0FBVyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBSTtZQUMzRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDckosYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUN4RCxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDVixXQUFXLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQzthQUMvQjtpQkFDSTtnQkFDSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRTtvQkFDckosYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO29CQUN4RCxXQUFXLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQztpQkFDL0I7cUJBQ0k7b0JBQ0gsSUFBSSxnQkFBZ0IsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUU7d0JBQ2hJLElBQUksZUFBZSxDQUFDLG1CQUFtQixFQUFFLEVBQUU7NEJBQ3pDLElBQUksTUFBTSxHQUFXLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs0QkFDakQsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQ0FDdEMsSUFBSSxXQUFXLEVBQUU7b0NBQ2YsSUFBSSxXQUFXLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO3dDQUMxQyxJQUFJLGdCQUFnQixDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUUsV0FBVyxHQUFHLENBQUMsQ0FBQyxFQUFFOzRDQUN4SSxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7NENBQy9DLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRDQUNWLFdBQVcsR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDO3lDQUMvQjs2Q0FDSTs0Q0FDSCxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFROzRDQUNqQyxXQUFXLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQzt5Q0FDL0I7cUNBQ0Y7eUNBQ0k7d0NBQ0gsYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBUTt3Q0FDakMsV0FBVyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUM7cUNBQy9CO2lDQUNGO3FDQUNJO29DQUNILGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQ0FDL0MsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7b0NBQ1YsV0FBVyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUM7aUNBQy9COzZCQUNGO2lDQUNJO2dDQUNILGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FDL0MsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0NBQ1YsV0FBVyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUM7NkJBQy9CO3lCQUNGOzZCQUNJOzRCQUNILGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDL0MsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ1YsV0FBVyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUM7eUJBQy9CO3FCQUNGO3lCQUNJO3dCQUNILGFBQWEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQVE7d0JBQ2pDLFdBQVcsR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDO3dCQUM5QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEtBQUssSUFBSSxFQUFFOzRCQUN0QyxJQUFJLElBQUksR0FBa0IsT0FBTyxDQUFDLElBQUksQ0FBQzs0QkFDdkMsSUFBSSxJQUFJLEtBQUssYUFBYSxDQUFDLGdCQUFnQixFQUFFO2dDQUMzQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7NkJBQ3BEO3lCQUNGO3FCQUNGO2lCQUNGO2FBQ0Y7U0FDRjtRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3RHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQztTQUN4SDtRQUNELE9BQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN6QixDQUFDO0lBS08scUJBQXFCLENBQUMsVUFBa0IsRUFBRSxZQUFvQjtRQUNwRSxJQUFJLE1BQWUsQ0FBQztRQUNwQixRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQzlDLEtBQUssWUFBWSxDQUFDLEtBQUssQ0FBQztZQUN4QixLQUFLLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFDeEIsS0FBSyxZQUFZLENBQUMsS0FBSyxDQUFDO1lBQ3hCLEtBQUssWUFBWSxDQUFDLEtBQUssQ0FBQztZQUN4QixLQUFLLFlBQVksQ0FBQyxLQUFLO2dCQUNyQixPQUFPLElBQUksQ0FBQztZQUVkLEtBQUssWUFBWSxDQUFDLEtBQUs7Z0JBQ3JCLElBQUksS0FBSyxHQUFXLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzdELElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO29CQUN0QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDbEQsT0FBTyxJQUFJLENBQUM7WUFFZCxLQUFLLFlBQVksQ0FBQyxLQUFLO2dCQUNyQixJQUFJLEtBQUssR0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUM3RCxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ2xELE9BQU8sSUFBSSxDQUFDO1lBRWQsS0FBSyxZQUFZLENBQUMsS0FBSztnQkFDckIsSUFBSSxPQUFPLEdBQVcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDakQsSUFBSSxlQUFlLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksZUFBZSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7b0JBQ3ZHLE9BQU8sSUFBSSxDQUFDO3FCQUVkO29CQUNFLE1BQU0sQ0FBQyxlQUFlLENBQUMsdURBQXVELEdBQUcsVUFBVSxDQUFDLENBQUM7b0JBQzdGLE9BQU8sS0FBSyxDQUFDO2lCQUNkO1lBRUg7Z0JBQ0UsTUFBTSxDQUFDLGVBQWUsQ0FBQyxnRUFBZ0UsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDM0wsT0FBTyxLQUFLLENBQUM7U0FDaEI7SUFDSCxDQUFDO0lBS08sWUFBWTtRQUNsQixJQUFJLGFBQWEsR0FBa0IsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzRSxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVyQyxJQUFJLGVBQWUsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssZ0JBQWdCLENBQUMsS0FBSyxFQUFFO1lBQzlGLElBQUksZUFBZSxHQUFXLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ25FLElBQUksZUFBZSxHQUFXLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUNwRixLQUFLLElBQUksQ0FBQyxHQUFXLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNoRixJQUFJLGdCQUFnQixDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ3hFLGFBQWEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQzNCO3FCQUNJO29CQUNILGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDL0M7YUFDRjtTQUNGO2FBQ0k7WUFDSCxLQUFLLElBQUksQ0FBQyxHQUFXLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDdkYsSUFBSSxnQkFBZ0IsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUN4RSxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFRO2lCQUNsQztxQkFDSTtvQkFDSCxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQy9DO2dCQUNELENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ1g7U0FDRjtRQUNELE9BQU8sYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFJTyxnQkFBZ0IsQ0FBQyxxQkFBbUMsRUFBRSxtQkFBaUM7UUFFN0YsSUFBSSxTQUFTLEdBQVcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLDhCQUE4QixDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0SCxJQUFJLFNBQVMsS0FBSyxJQUFJLEVBQUU7WUFDdEIsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFFRCxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLGdDQUFnQyxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5RyxJQUFJLFNBQVMsS0FBSyxJQUFJO1lBQ3BCLE9BQU8sU0FBUyxDQUFDO1FBRWpCLElBQUksbUJBQW1CLEtBQUssSUFBSTtZQUM5QixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRzFELElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNsRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUlPLG9CQUFvQixDQUFDLG1CQUFpQztRQUM1RCxJQUFJLFdBQVcsR0FBVyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlHLElBQUksV0FBVyxLQUFLLElBQUksRUFBRTtZQUN4QixPQUFPLFdBQVcsQ0FBQztTQUNwQjtRQUdELElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNsRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFFeEIsQ0FBQztJQVNPLGlCQUFpQjtRQUV2QixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLHdCQUF3QixFQUFFLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDckksTUFBTSxJQUFJLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUMxRDtRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3RHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQztTQUN4SDtRQUVELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUdoQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQVdPLGlCQUFpQjtRQUV2QixJQUFJLFNBQWMsQ0FBQztRQUNuQixJQUFJLE9BQU8sSUFBSSxDQUFDLFNBQVMsS0FBSyxRQUFRLEVBQUU7WUFDdEMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO2FBQ3RCO1lBRUQsSUFBSSxrQkFBa0IsR0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdkUsSUFBSSxrQkFBa0IsR0FBVyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFMUUsU0FBUyxHQUFHLEVBQUUsQ0FBQztZQUNmLElBQUksYUFBcUIsQ0FBQztZQUMxQixJQUFJLGNBQXNCLENBQUM7WUFHM0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBR2hDLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUU7Z0JBQ2pDLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFN0QsSUFBSSxrQkFBa0IsS0FBSyxDQUFDLENBQUMsSUFBSSxrQkFBa0IsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDMUQsYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO2dCQUM5RSxjQUFjLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDLENBQUM7Z0JBQ2hGLFNBQVMsR0FBRyxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQUM7YUFDNUQ7aUJBQ0k7Z0JBQ0gsSUFBSSxrQkFBa0IsS0FBSyxDQUFDLENBQUMsSUFBSSxrQkFBa0IsS0FBSyxDQUFDLENBQUMsRUFBRTtvQkFDMUQsYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztvQkFDL0csY0FBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDcEYsU0FBUyxHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLGNBQWMsQ0FBQztpQkFDNUQ7cUJBQ0k7b0JBQ0gsSUFBSSxrQkFBa0IsS0FBSyxDQUFDLENBQUMsSUFBSSxrQkFBa0IsS0FBSyxDQUFDLENBQUMsRUFBRTt3QkFDMUQsU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUMzQyxhQUFhLEdBQUcsU0FBUyxDQUFDO3FCQUMzQjt5QkFDSTt3QkFDSCxJQUFJLGtCQUFrQixHQUFHLENBQUMsRUFBRTs0QkFDMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQzt5QkFDL0Q7NkJBQ0k7NEJBQ0gsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7eUJBQ3RCO3dCQUNELFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDM0MsYUFBYSxHQUFHLFNBQVMsQ0FBQztxQkFDM0I7aUJBQ0Y7YUFDRjtZQUVELElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBRXhILElBQUksSUFBbUIsQ0FBQztnQkFDeEIsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBRWpDLElBQUksS0FBSyxHQUFpQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzFDLElBQUksUUFBUSxHQUFXLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDL0MsSUFBSSxZQUFZLEdBQVEsSUFBSSxDQUFDO2dCQUU3QixJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUUsRUFBRTtvQkFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzNCLFlBQVksR0FBRyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7aUJBQ3ZDO2dCQUNELElBQUksWUFBWSxJQUFJLElBQUk7b0JBQ3RCLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUV6SjtZQUdELElBQUksY0FBYyxHQUFXLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBRXpILElBQUksY0FBYyxHQUFHLENBQUMsRUFBRTtnQkFDdEIsSUFBSSxXQUFXLEdBQVksS0FBSyxDQUFDO2dCQUVqQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEVBQUU7b0JBQy9CLFdBQVcsR0FBRyxJQUFJLENBQUM7b0JBQ25CLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLElBQUksV0FBVyxFQUFFLENBQUMsRUFBRTt3QkFFNUQsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUU7NEJBQ2hELFdBQVcsR0FBRyxLQUFLLENBQUM7aUJBQ3pCO2dCQUVELElBQUksQ0FBQyxXQUFXO29CQUNkLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDOUQ7WUFHRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDeE0sU0FBUyxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUM7YUFDN0I7WUFJRCxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsUUFBUSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDcEwsU0FBUyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRzVKLElBQUksV0FBVyxHQUFXLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbkQsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsVUFBVSxFQUFFLEtBQUssR0FBRztnQkFDNUcsU0FBUyxHQUFHLEdBQUcsQ0FBQztTQUNuQjthQUNJO1lBSUgsU0FBUyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ3BMLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUU3SjtRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixFQUFFLElBQUksSUFBSSxFQUNwRztZQUNFLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQzNCLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUN2QztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFPTyxnQkFBZ0IsQ0FBQyxrQkFBMEIsRUFBRSxrQkFBMEI7UUFDN0UsSUFBSSxNQUFNLEdBQWtCLElBQUksYUFBYSxFQUFFLENBQUM7UUFDaEQsSUFBSSxTQUFTLEdBQVcsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLElBQUksU0FBaUIsQ0FBQztRQUN0QixJQUFJLE9BQWdCLENBQUM7UUFFckIsS0FBSyxTQUFTLEdBQUcsa0JBQWtCLEdBQUcsQ0FBQyxFQUFFLFNBQVMsSUFBSSxDQUFDLElBQUksU0FBUyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFDdEY7WUFDRSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxFQUMxQztnQkFDRSxJQUFJLFVBQVUsR0FBVyxTQUFTLENBQUM7Z0JBQ25DLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBRWhCLE9BQU8sU0FBUyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFDbEM7b0JBQ0UsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQzlEO3dCQUNFLE9BQU8sR0FBRyxJQUFJLENBQUM7d0JBQ2YsU0FBUyxFQUFFLENBQUM7d0JBQ1osTUFBTTtxQkFDUDtpQkFDRjtnQkFFRCxJQUFJLENBQUMsT0FBTztvQkFDVixTQUFTLEdBQUcsVUFBVSxDQUFDO2dCQUV6QixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzthQUM3QztpQkFHRDtnQkFDRSxPQUFPLFNBQVMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQ2xDO29CQUNFLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQ3REO3dCQUNFLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO3dCQUN6QyxTQUFTLEVBQUUsQ0FBQzt3QkFDWixNQUFNO3FCQUNQO2lCQUNGO2FBQ0Y7U0FDRjtRQUVELElBQUksU0FBUyxHQUFHLENBQUMsSUFBSSxTQUFTLElBQUksQ0FBQztZQUVqQyxPQUFPLFNBQVMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQ2xDO2dCQUNFLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHO29CQUN4QyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztxQkFFOUM7b0JBRUUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTt3QkFDN0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7aUJBQ2hEO2FBQ0Y7UUFFSCxPQUFPLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEQsQ0FBQztJQU9PLGlCQUFpQixDQUFDLGtCQUEwQixFQUFFLGtCQUEwQjtRQUM5RSxJQUFJLE1BQU0sR0FBa0IsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNoRCxJQUFJLFNBQVMsR0FBVyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7UUFDL0MsSUFBSSxTQUFpQixDQUFDO1FBQ3RCLElBQUksR0FBRyxHQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFckMsS0FBSyxTQUFTLEdBQUcsa0JBQWtCLEdBQUcsQ0FBQyxFQUFFLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLEVBQ2pJO1lBQ0UsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsRUFDMUM7Z0JBQ0UsSUFBSSxTQUFTLEdBQUcsU0FBUztvQkFDdkIsU0FBUyxHQUFHLFNBQVMsQ0FBQztnQkFFeEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7YUFDN0M7aUJBR0Q7Z0JBQ0UsT0FBTyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLEVBQ3JEO29CQUVFLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUNuRjt3QkFDRSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzt3QkFDekMsU0FBUyxFQUFFLENBQUM7d0JBQ1osTUFBTTtxQkFDUDtpQkFDRjthQUNGO1NBQ0Y7UUFHRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUNyQjtZQUNFLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU07Z0JBRTVFLE9BQU8sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUN4RDtvQkFDRSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRzt3QkFDeEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7aUJBRS9DO1NBQ0o7UUFDRCxPQUFPLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBS08sbUJBQW1CO1FBQ3pCLElBQUksVUFBa0IsQ0FBQztRQUN2QixJQUFJLE9BQWUsQ0FBQztRQUNwQixJQUFJLFNBQWlCLENBQUM7UUFDdEIsSUFBSSxRQUFnQixDQUFDO1FBQ3JCLElBQUksU0FBUyxHQUFXLEdBQUcsQ0FBQztRQUU1QixJQUFJLEdBQUcsR0FBUSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRXJDLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLGdCQUFnQixDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUU7WUFDOUgsT0FBTztRQUVULE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuRCxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7UUFDdkMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNiLE9BQU8sUUFBUSxHQUFHLE9BQU8sRUFDekI7WUFDRSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRXhELElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQztnQkFFbkIsT0FBTztpQkFFVDtnQkFDRSxJQUFJLFVBQVUsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLEVBRWxFO29CQUNFLElBQUksS0FBYSxDQUFDO29CQUNsQixJQUFJLE1BQWMsQ0FBQztvQkFFbkIsS0FBSyxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUM7b0JBQ3BCLElBQUksVUFBVSxLQUFLLENBQUMsRUFFcEI7d0JBQ0UsSUFBSSxVQUFVLEdBQUcsQ0FBQyxHQUFHLFNBQVM7NEJBRTVCLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7cUJBQ3JEO3lCQUNJLElBQUksVUFBVSxLQUFLLFNBQVMsRUFFakM7d0JBQ0UsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRyxVQUFVLENBQUMsQ0FBQztxQkFDbEQ7eUJBRUQ7d0JBQ0UsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRyxVQUFVLENBQUMsQ0FBQzt3QkFDakQsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQztxQkFDbkQ7b0JBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7b0JBQ25ELE1BQU07aUJBQ1A7cUJBRUQ7b0JBQ0UsUUFBUSxHQUFHLEVBQUUsVUFBVSxDQUFDO2lCQUN6QjthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBSU8sa0JBQWtCO1FBQ3hCLElBQUksVUFBVSxHQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDekQsSUFBSSxxQkFBcUIsR0FBaUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2xGLElBQUksbUJBQW1CLEdBQWlCLElBQUksQ0FBQyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM5RSxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFaEMsSUFBSSxVQUFVLEdBQVcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUd2RixJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzNCLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNsRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7U0FDdkI7UUFHQyxJQUFJLFVBQVUsR0FBYSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFMUcsSUFBSSxtQkFBbUIsS0FBSyxJQUFJLEVBQUU7WUFDaEMsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDakUsSUFBSSxlQUFlLEdBQWEsSUFBSSxRQUFRLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFFN0YsSUFBSTtvQkFDRixJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRTt3QkFDdkQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO3FCQUN2QjtpQkFDRjtnQkFDRCxPQUFPLEtBQUssRUFBRTtpQkFFYjthQUNGO1NBQ0Y7UUFFRCxJQUFJLHFCQUFxQixLQUFLLElBQUksRUFBRTtZQUNsQyxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcscUJBQXFCLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUVuRSxJQUFJLGVBQWUsR0FBYSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUMvQyxJQUFJLGVBQWUsR0FBYSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUUvQyxlQUFlLENBQUMsV0FBVyxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pFLGVBQWUsQ0FBQyxXQUFXLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRS9ELElBQUk7b0JBQ0YsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTt3QkFDaEgsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO3FCQUN2QjtpQkFDRjtnQkFDRCxPQUFPLE1BQU0sRUFBRTtpQkFFZDthQUNGO1NBQ0Y7UUFDRCxNQUFNLElBQUksb0JBQW9CLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBTU8sWUFBWSxDQUFDLEdBQVc7UUFFOUIsSUFBSSxRQUFRLEdBQVksS0FBSyxDQUFDO1FBQzlCLElBQUksVUFBVSxHQUFZLEtBQUssQ0FBQztRQUNoQyxJQUFJLFVBQVUsR0FBWSxLQUFLLENBQUM7UUFDaEMsSUFBSSxRQUFRLEdBQVksS0FBSyxDQUFDO1FBQzlCLElBQUksQ0FBQyxHQUFXLENBQUMsQ0FBQztRQUdsQixLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQzVDO1lBQ0UsSUFBSSxDQUFDLEdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRztnQkFDdEIsVUFBVSxHQUFHLElBQUksQ0FBQztpQkFFcEI7Z0JBQ0UsUUFBUSxDQUFDLEVBQ1Q7b0JBQ0UsS0FBSyxHQUFHO3dCQUNOLElBQUksVUFBVSxJQUFJLFFBQVEsSUFBSSxVQUFVOzRCQUN0QyxRQUFRLEdBQUcsSUFBSSxDQUFDO3dCQUNsQixVQUFVLEdBQUcsSUFBSSxDQUFDO3dCQUNsQixNQUFNO29CQUVSLEtBQUssR0FBRzt3QkFDTixJQUFJLFFBQVEsSUFBSSxVQUFVLElBQUksQ0FBQyxVQUFVOzRCQUN2QyxRQUFRLEdBQUcsSUFBSSxDQUFDO3dCQUNsQixRQUFRLEdBQUcsSUFBSSxDQUFDO3dCQUNoQixNQUFNO29CQUVSLEtBQUssR0FBRzt3QkFDTixJQUFJLFVBQVUsSUFBSSxRQUFRLElBQUksVUFBVTs0QkFDdEMsUUFBUSxHQUFHLElBQUksQ0FBQzt3QkFDbEIsTUFBTTtvQkFFUjt3QkFDRSxRQUFRLEdBQUcsSUFBSSxDQUFDO3dCQUNoQixNQUFNO2lCQUNUO2FBQ0Y7U0FDRjtRQUVELElBQUksUUFBUSxFQUFFO1lBQ1osQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDWDtRQUVELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNULE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3hDO1FBRUQsT0FBTyxDQUFDLFFBQVEsQ0FBQztJQUNuQixDQUFDO0lBSU8sNkJBQTZCLENBQUMsR0FBVztRQUMvQyxJQUFJLFVBQVUsR0FBa0IsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlELElBQUksY0FBYyxHQUFZLEtBQUssQ0FBQztRQUNwQyxJQUFJLFFBQWdCLENBQUM7UUFFckIsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUMzRTtZQUNFLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEIsSUFBSSxlQUFlLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztnQkFDbkMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDekIsSUFBSSxRQUFRLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFDdkU7Z0JBQ0UsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDM0YsY0FBYyxHQUFHLElBQUksQ0FBQzthQUN2QjtpQkFDSSxJQUFJLFFBQVEsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUU7Z0JBQ3ZELFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQ3BGO1FBQ0QsSUFBSSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDdEM7WUFDRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2hDO1FBQ0QsT0FBTyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUlPLHVCQUF1QjtRQUc3QixJQUFJLEdBQUcsR0FBUSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBUyxDQUFDO1FBQ2QsSUFBSSxHQUFXLENBQUM7UUFDaEIsSUFBSSxLQUFhLENBQUM7UUFDbEIsSUFBSSxNQUFjLENBQUM7UUFDbkIsSUFBSSxXQUFXLEdBQVcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUl6RCxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1IsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNWLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVaLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO1lBQ3hDLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xCLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUU1QyxJQUFJLE1BQU0sSUFBSSxDQUFDO3dCQUNiLEdBQUcsRUFBRSxDQUFDOzt3QkFFTixLQUFLLEVBQUUsQ0FBQztxQkFDUCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssV0FBVztvQkFDeEMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUdqQixJQUFJLEdBQUcsQ0FBQyxTQUFTLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUc7WUFDL0MsT0FBTyxLQUFLLENBQUM7O1lBRWIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQVNPLGNBQWM7UUFFcEIsSUFBSSxPQUFPLEdBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUM5RSxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFakMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFFeEQsSUFBSSxjQUFjLEdBQVcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUVwRixPQUFPLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDaks7YUFFRDtZQUVFLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixFQUFFLElBQUksSUFBSTtnQkFDbEcsT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDbEk7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUVqQixDQUFDO0lBU08sUUFBUSxDQUFDLFNBQWlCLEVBQUUsTUFBcUIsRUFBRSxJQUFZO1FBQ3JFLElBQUksS0FBSyxHQUFXLFNBQVMsQ0FBQztRQUM5QixJQUFJLE9BQU8sR0FBa0IsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0RSxJQUFJLE9BQU8sR0FBVyxDQUFDLENBQUM7UUFFeEIsUUFBUSxJQUFJLEVBQ1o7WUFDRSxLQUFLLFlBQVksQ0FBQyxNQUFNLENBQUM7WUFDekIsS0FBSyxZQUFZLENBQUMsUUFBUSxDQUFDO1lBQzNCLEtBQUssWUFBWSxDQUFDLE9BQU8sQ0FBQztZQUMxQixLQUFLLFlBQVksQ0FBQyxNQUFNO2dCQUN0QixPQUFPLEdBQUcsQ0FBQyxDQUFDO2dCQUNaLE1BQU07WUFFUixLQUFLLFlBQVksQ0FBQyxPQUFPO2dCQUN2QixPQUFPLEdBQUcsQ0FBQyxDQUFDO2dCQUNaLE1BQU07WUFFUixLQUFLLFlBQVksQ0FBQyxRQUFRO2dCQUN4QixPQUFPLEdBQUcsQ0FBQyxDQUFDO2dCQUNaLE1BQU07WUFFUixLQUFLLFlBQVksQ0FBQyxLQUFLO2dCQUNyQixPQUFPLEdBQUcsQ0FBQyxDQUFDO2dCQUNaLE1BQU07WUFFUixLQUFLLFlBQVksQ0FBQyxNQUFNO2dCQUN0QixPQUFPLEdBQUcsQ0FBQyxDQUFDO2dCQUNaLElBQUksR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDO2dCQUMzQixNQUFNO1NBQ1Q7UUFFRCxPQUFPLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUYsS0FBSyxFQUFFLENBQUM7UUFHVixJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLEdBQUcsQ0FBQyxFQUFFO1lBQzlGLEtBQUssSUFBSSxHQUFHLEdBQVcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxPQUFPLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUU7Z0JBQ3RELE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQVE7YUFDM0I7WUFDRCxPQUFPLFNBQVMsQ0FBQztTQUNsQjthQUNJLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFO1lBQ3hDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7U0FDdkM7UUFFRCxJQUFJLENBQVMsQ0FBQztRQUNkLEtBQUssQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsS0FBSyxHQUFHLE9BQU8sSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDckUsSUFBSSxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuRCxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O2dCQUV6QyxNQUFNO1NBQ1Q7UUFFRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3hCLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDckI7UUFFRCxJQUFJLEdBQUcsR0FBVyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBR3BELElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksS0FBSyxZQUFZLENBQUMsUUFBUSxJQUFJLElBQUksS0FBSyxZQUFZLENBQUMsTUFBTSxDQUFDO1lBQzVFLENBQUMsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsTUFBTSxJQUFJLElBQUksS0FBTSxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEYsQ0FBQyxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksS0FBSyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksS0FBSyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDekYsTUFBTSxJQUFJLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMzRDtRQUdELElBQUksSUFBSSxLQUFLLFlBQVksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDeEosT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFbkMsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQy9ELE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQVE7U0FDM0I7UUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLE9BQVEsQ0FBQyxDQUFDO0lBQ1osQ0FBQztJQVNPLFNBQVMsQ0FBQyxTQUFpQixFQUFFLE9BQWUsRUFBRSxNQUFxQixFQUFFLElBQVk7UUFDdkYsSUFBSSxLQUFlLENBQUM7UUFDcEIsSUFBSSxNQUFjLENBQUM7UUFFbkIsSUFBSSxJQUFJLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxJQUFJLEtBQUssWUFBWSxDQUFDLE9BQU8sRUFBRTtZQUNsRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2YsS0FBSyxHQUFHLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUNyQztpQkFDSTtnQkFDSCxJQUFJLGFBQWEsR0FBVyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM3RSxLQUFLLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUNoRDtTQUNGO2FBQ0k7WUFDSCxJQUFJLElBQUksS0FBSyxZQUFZLENBQUMsT0FBTyxJQUFJLElBQUksS0FBSyxZQUFZLENBQUMsS0FBSyxFQUFFO2dCQUNoRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7b0JBQ2YsS0FBSyxHQUFHLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztpQkFDbkM7cUJBQ0k7b0JBQ0gsSUFBSSxNQUFNLEdBQVcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDcEUsS0FBSyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ3ZDO2FBQ0Y7aUJBQ0k7Z0JBQ0gsSUFBSSxJQUFJLEtBQUssWUFBWSxDQUFDLE1BQU0sRUFBRTtvQkFDaEMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztpQkFDbkM7cUJBQ0k7b0JBQ0gsSUFBSSxJQUFJLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxJQUFJLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxJQUFJLEtBQUssWUFBWSxDQUFDLE9BQU8sRUFDbkc7d0JBQ0UsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxTQUFTLEdBQUcsT0FBTyxFQUFFOzRCQUMvQyxNQUFNLElBQUksb0JBQW9CLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO3lCQUMzRDt3QkFDRCxJQUFJLElBQUksR0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7d0JBQzdELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ3BCLE9BQU8sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7cUJBQ2hDO3lCQUVEO3dCQUNFLE9BQU8sU0FBUyxHQUFHLE9BQU8sQ0FBQztxQkFDNUI7aUJBQ0Y7YUFDRjtTQUNGO1FBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxTQUFTLEVBQUU7WUFDckMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO1NBQ25DO1FBQ0QsSUFBSSxHQUFHLEdBQVcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFdkYsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxJQUFJLE9BQU8sRUFBRTtZQUN2QyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDckQ7YUFDSTtZQUNILE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDakMsS0FBSyxJQUFJLENBQUMsR0FBVyxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUN6RSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFRO2FBQzNCO1NBQ0Y7UUFDRCxPQUFPLFNBQVMsR0FBRyxPQUFPLENBQUM7SUFDN0IsQ0FBQztJQUlPLG9CQUFvQixDQUFDLFNBQWlCO1FBQzVDLE9BQU8sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFO1lBQ3RHLFNBQVMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1NBQzNCO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUdPLGFBQWEsQ0FBQyxJQUFZO1FBQ2hDLElBQUksU0FBUyxHQUFXLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsSUFBSSxTQUFTLEtBQUssQ0FBQyxJQUFJLFNBQVMsS0FBSyxFQUFFLElBQUksU0FBUyxLQUFLLEVBQUU7WUFDekQsT0FBTyxJQUFJLENBQUM7YUFDVCxJQUFJLFNBQVMsS0FBSyxDQUFDLElBQUksU0FBUyxLQUFLLEVBQUU7WUFDMUMsT0FBTyxJQUFJLENBQUM7YUFDVCxJQUFJLFNBQVMsS0FBSyxDQUFDLElBQUksU0FBUyxLQUFLLEVBQUU7WUFDMUMsT0FBTyxJQUFJLENBQUM7UUFDZCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFHTyxjQUFjLENBQUMsS0FBYSxFQUFFLElBQVk7UUFDaEQsSUFBSSxPQUFPLEdBQVcsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNoQyxPQUFPLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJO1lBQ25GLE9BQU8sRUFBRSxDQUFDO1FBQ1YsT0FBTyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFPTyxjQUFjLENBQUMsU0FBaUIsRUFBRSxPQUFlLEVBQUUsSUFBWTtRQUNyRSxJQUFJLEtBQWUsQ0FBQztRQUVwQixJQUFJLElBQUksS0FBSyxZQUFZLENBQUMsT0FBTyxJQUFJLElBQUksS0FBSyxZQUFZLENBQUMsT0FBTyxFQUFFO1lBRWhFLElBQUksSUFBSSxDQUFDLE1BQU07Z0JBQ2IsS0FBSyxHQUFHLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztpQkFFdEM7Z0JBQ0UsSUFBSSxRQUFRLEdBQVcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDeEUsS0FBSyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7YUFDdEQ7U0FDRjthQUNFLElBQUksSUFBSSxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksSUFBSSxLQUFLLFlBQVksQ0FBQyxLQUFLLEVBRW5FO1lBQ0UsSUFBSSxJQUFJLENBQUMsTUFBTTtnQkFDYixLQUFLLEdBQUcsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDO2lCQUVwQztnQkFDRSxJQUFJLE1BQU0sR0FBVyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNwRSxLQUFLLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQzthQUNsRDtTQUNGO2FBQ0ksSUFBSSxJQUFJLEtBQUssWUFBWSxDQUFDLE1BQU0sRUFFckM7WUFDRSxLQUFLLEdBQUcsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ25DO2FBRUQ7WUFDRSxPQUFPLENBQUMsQ0FBQztTQUNWO1FBRUgsSUFBSSxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU07WUFFNUIsT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFFN0IsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUNmO1lBQ0UsSUFBSSxJQUFJLEdBQVcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBRTFFLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUU3QztnQkFDRSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQzVCO29CQUNFLElBQUksQ0FBQyxLQUFLLEVBQUU7d0JBQ1YsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDUixPQUFPLENBQUMsQ0FBQztpQkFDVjthQUNGO1lBQ0QsT0FBTyxDQUFDLENBQUM7U0FDVjtRQUVELElBQUk7WUFHQSxJQUFJLEdBQUcsR0FBVyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0RCxJQUFJLFNBQVMsR0FBa0IsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTdELEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUMzQztnQkFDRSxJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNqQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztvQkFFekIsTUFBTTthQUNUO1lBRUQsSUFBSSxTQUFTLEdBQVcsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUM1RCxJQUFJLFNBQVMsR0FBRyxDQUFDO2dCQUNmLE9BQU8sQ0FBQyxDQUFDO1lBQ1gsSUFBSSxJQUFJLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxJQUFJLEtBQUssWUFBWSxDQUFDLE9BQU8sRUFDbEU7Z0JBQ0UsSUFBSSxTQUFTLEdBQUcsRUFBRTtvQkFDaEIsT0FBTyxFQUFFLENBQUM7YUFDYjtpQkFDSSxJQUFJLElBQUksS0FBSyxZQUFZLENBQUMsT0FBTyxJQUFJLElBQUksS0FBSyxZQUFZLENBQUMsS0FBSyxJQUFJLElBQUksS0FBSyxZQUFZLENBQUMsTUFBTSxFQUNyRztnQkFFRSxJQUFJLFNBQVMsR0FBRyxDQUFDO29CQUNmLE9BQU8sQ0FBQyxDQUFDO2FBQ1o7WUFDRCxPQUFPLFNBQVMsQ0FBQztTQUNoQjtRQUNMLE9BQU8sTUFBTSxFQUFFO1NBRVo7UUFHSCxJQUFJLEtBQUssR0FBYSxJQUFJLEtBQUssQ0FBUyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEQsSUFBSSxJQUFZLENBQUM7UUFDakIsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFHckIsS0FBSyxJQUFJLEdBQUcsR0FBVyxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBRW5EO1lBQ0UsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNmLElBQUksR0FBRyxDQUFDLENBQUM7WUFDVCxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxFQUNwRztnQkFDRSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDO29CQUMvRCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7b0JBRWIsTUFBTTthQUNUO1lBRUQsSUFBSSxJQUFJLEtBQUssT0FBTyxJQUFJLElBQUksS0FBSyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUVsRDtnQkFDRSxHQUFHLEdBQUcsR0FBRyxDQUFDO2dCQUNWLE1BQU07YUFDUDtTQUNGO1FBRUQsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDO1lBQ1osR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsT0FBTyxHQUFHLENBQUM7SUFFYixDQUFDO0lBSU8scUJBQXFCO1FBQzNCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFDckQ7WUFDRSxJQUFJLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBSU8sYUFBYTtRQUNuQixJQUFJLE9BQWUsQ0FBQztRQUNwQixLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQ3REO1lBQ0UsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFNUIsSUFBSSxlQUFlLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sS0FBSyxHQUFHO2dCQUNyRCxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUtPLFlBQVksQ0FBQyxNQUFjO1FBQ2pDLElBQUksTUFBYyxDQUFDO1FBQ25CLElBQUksYUFBYSxHQUFXLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUNySCxJQUFJLE9BQU8sR0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUN0RCxJQUFJLEtBQUssR0FBVyxhQUFhLEdBQUcsR0FBRyxDQUFDO1FBQ3hDLElBQUksTUFBTSxJQUFJLEtBQUssSUFBSSxNQUFNLEtBQUssQ0FBQztZQUNqQyxNQUFNLEdBQUcsQ0FBQyxPQUFPLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDOztZQUVsQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBRXhDLE9BQU8sSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQU1PLGlCQUFpQixDQUFDLGVBQTZCLEVBQUUsYUFBMkIsRUFBRSxRQUFnQjtRQUVwRyxJQUFJLEdBQUcsR0FBUSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBUyxDQUFDO1FBQ2QsSUFBSSxRQUFnQixDQUFDO1FBQ3JCLElBQUksT0FBZSxDQUFDO1FBRXBCLElBQUksZUFBZSxJQUFJLElBQUksRUFDM0I7WUFDRSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUMvQztnQkFDRSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO2dCQUMvSixPQUFPLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7Z0JBQ2hLLElBQUksUUFBUSxJQUFJLFFBQVEsSUFBSSxRQUFRLElBQUksT0FBTztvQkFDN0MsT0FBTyxJQUFJLENBQUM7YUFDZjtTQUNGO1FBRUQsSUFBSSxhQUFhLElBQUksSUFBSSxFQUN6QjtZQUNFLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFDekM7Z0JBQ0UsSUFBSSxRQUFRLEtBQUssZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDaEssT0FBTyxJQUFJLENBQUM7YUFDZjtTQUNGO1FBR0QsTUFBTSxJQUFJLG9CQUFvQixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUdPLGVBQWUsQ0FBQyxlQUE2QixFQUFFLGFBQTJCLEVBQUUsTUFBWTtRQUM5RixJQUFJLEdBQUcsR0FBUSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBUyxDQUFDO1FBQ2QsSUFBSSxRQUFnQixDQUFDO1FBQ3JCLElBQUksT0FBZSxDQUFDO1FBRXBCLElBQUksUUFBUSxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUUvSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsSUFBSSxlQUFlLElBQUksSUFBSSxFQUFFO1lBQzNCLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQy9DLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7Z0JBQy9KLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztnQkFDaEssSUFBSSxRQUFRLElBQUksUUFBUSxJQUFJLFFBQVEsSUFBSSxPQUFPO29CQUM3QyxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzNCO1NBQ0Y7UUFFRCxJQUFJLGFBQWEsSUFBSSxJQUFJLEVBQUU7WUFDekIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN6QyxJQUFJLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUU7b0JBQ2xLLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ3pCO2FBQ0Y7U0FDRjtRQUVELE1BQU0sSUFBSSxvQkFBb0IsRUFBRSxDQUFDO0lBRW5DLENBQUM7SUFLTyxRQUFRLENBQUMsSUFBWSxFQUFFLEtBQWM7UUFFM0MsSUFBSSxHQUFHLEdBQVcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdELElBQUksR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDcEIsT0FBTyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVqQyxJQUFJLElBQUksR0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFL0QsSUFBSSxDQUFDLEtBQUssRUFDVjtZQUNFLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUM1QixJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFFM0QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLEtBQUssR0FBRztnQkFDbkcsSUFBSSxJQUFJLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQztZQUV6QyxJQUFJLEtBQUssR0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFHakUsSUFBSSxNQUFNLEdBQVcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN4RCxJQUFJLEdBQUcsR0FBRyxNQUFNLEVBQ2hCO2dCQUNFLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDM0Q7U0FDRjthQUVEO1lBRUUsSUFBSSxTQUFTLEdBQVcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFdEQsSUFBSSxTQUFTLEdBQUcsQ0FBQyxJQUFJLFNBQVMsR0FBRyxFQUFFO2dCQUNqQyxNQUFNLElBQUksb0JBQW9CLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQzdEO1FBRUQsT0FBTyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBSU8sU0FBUyxDQUFDLElBQVk7UUFFNUIsSUFBSSxHQUFHLEdBQVcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTdELElBQUksV0FBVyxHQUFvQixnQkFBZ0IsQ0FBQyxRQUFRLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUVyRixJQUFJLFNBQVMsR0FBVyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUU1SSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBRXhJLElBQUksT0FBTyxHQUFXLFdBQVcsQ0FBQyxHQUFHLENBQUM7UUFDdEMsSUFBSSxPQUFPLEtBQUssT0FBTztZQUNyQixJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFdkMsT0FBTyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBT08sZUFBZSxDQUFDLE9BQWU7UUFFckMsSUFBSSxXQUFXLEdBQW9CLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3JGLElBQUksU0FBUyxHQUFXLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBRS9JLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFFeEksSUFBSSxTQUFTLEdBQVcsV0FBVyxDQUFDLElBQUksQ0FBQztRQUN6QyxJQUFJLE1BQU0sR0FBVyxXQUFXLENBQUMsR0FBRyxDQUFDO1FBR3JDLElBQUksV0FBbUIsQ0FBQztRQUN4QixJQUFJLFdBQW1CLENBQUM7UUFFeEIsV0FBVyxHQUFHLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsRixXQUFXLEdBQUcsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRWpGLElBQUksYUFBYSxHQUFrQixJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ3ZELElBQUksR0FBRyxHQUFXLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDakYsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFO1lBQ1osTUFBTSxJQUFJLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMzRDtRQUNELElBQUksR0FBRyxJQUFJLENBQUMsRUFBRTtZQUNaLGFBQWEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDM0I7UUFDRCxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBT3JDLElBQUksWUFBWSxHQUFXLENBQUMsQ0FBQztRQUM3QixLQUFLLElBQUksTUFBTSxHQUFXLENBQUMsRUFBRSxNQUFNLEdBQUcsWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUNuRjtZQUNFLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxFQUN2RDtnQkFDRSxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztvQkFDekIsT0FBTyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNwRSxNQUFNO2dCQUVSLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDO29CQUN6QixPQUFPLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3BFLFlBQVksRUFBRSxDQUFDO29CQUNmLE1BQU07Z0JBRVIsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7b0JBQ3pCLE9BQU8sR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDcEUsTUFBTSxFQUFFLENBQUM7b0JBQ1QsWUFBWSxJQUFJLENBQUMsQ0FBQztvQkFDbEIsTUFBTTtnQkFFUixLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztvQkFDeEIsT0FBTyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNqRixNQUFNLEVBQUUsQ0FBQztvQkFDVCxNQUFNO2dCQUVSO29CQUNFLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQzNCO3dCQUVFLElBQUksZUFBZSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksZUFBZSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsQ0FBQyxLQUFLLElBQUk7NEJBQ3RJLFlBQVksRUFBRSxDQUFDO3FCQUNsQjtvQkFDRCxNQUFNO2FBRVQ7U0FDRjtRQUNELE9BQU8sSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQU1PLGdCQUFnQixDQUFDLElBQVksRUFBRSxLQUFhO1FBQ2xELElBQUksS0FBSyxHQUFhO1lBQ3BCLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7U0FDbEQsQ0FBQztRQUNGLElBQUksUUFBUSxHQUFZLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUVqRixJQUFJLFFBQVEsSUFBSSxLQUFLLEtBQUssQ0FBQztZQUN6QixPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFekIsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQU1PLGFBQWEsQ0FBQyxJQUFZLEVBQUUsR0FBVztRQUM3QyxJQUFJLENBQVMsQ0FBQztRQUNkLElBQUksUUFBaUIsQ0FBQztRQUV0QixRQUFRLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTFFLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQ3JEO1lBQ0UsSUFBSSxDQUFDLFFBQVEsRUFDYjtnQkFDRSxJQUFJLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRztvQkFDckMsT0FBTyxDQUFDLENBQUM7YUFDWjtpQkFHRDtnQkFDRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQ1Q7b0JBQ0UsSUFBSSxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUc7d0JBQ3JDLE9BQU8sQ0FBQyxDQUFDO2lCQUNaO3FCQUdEO29CQUNFLElBQUksWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRzt3QkFDekMsT0FBTyxDQUFDLENBQUM7aUJBQ1o7YUFDRjtTQUNGO1FBQ0QsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBTU8sY0FBYyxDQUFDLElBQVksRUFBRSxPQUFvQjtRQUN2RCxJQUFJLE1BQU0sR0FBVyxJQUFJLENBQUM7UUFDMUIsSUFBSSxPQUFPLEdBQVcsQ0FBQyxDQUFDO1FBQ3hCLElBQUksUUFBUSxHQUFZLEtBQUssQ0FBQztRQUM5QixJQUFJLFdBQVcsR0FBVyxZQUFZLENBQUMsT0FBTyxDQUFDO1FBQy9DLElBQUksWUFBWSxHQUFZLEtBQUssQ0FBQztRQUNsQyxJQUFJLFFBQVEsR0FBVyxDQUFDLENBQUM7UUFLekIsSUFBSSxZQUFZLEdBQVcsQ0FBQyxDQUFDO1FBRTdCLElBQUksTUFBTSxHQUFXLENBQUMsQ0FBQztRQUV2QixJQUFJLGVBQWUsQ0FBQyxrQkFBa0IsRUFBRTtZQUN0QyxNQUFNLEdBQUcsZUFBZSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7O1lBRS9ELE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV2RCxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFDbkU7WUFDRSxJQUFJLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxFQUNuRTtnQkFDRSxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsRUFDbEQ7b0JBRUEsS0FBSyxZQUFZLENBQUMsTUFBTTt3QkFDdEIsSUFBSSxPQUFPLEtBQUssV0FBVyxDQUFDLEdBQUcsRUFDL0I7NEJBQ0UsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOzRCQUMzQixRQUFRLEdBQUcsSUFBSSxDQUFDOzRCQUNoQixNQUFNO3lCQUNQO3dCQUNELENBQUMsRUFBRSxDQUFDO3dCQUNKLE1BQU07b0JBRVIsS0FBSyxZQUFZLENBQUMsT0FBTzt3QkFDdkIsSUFBSSxPQUFPLEtBQUssV0FBVyxDQUFDLEdBQUcsRUFDL0I7NEJBQ0UsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOzRCQUMzQixRQUFRLEdBQUcsSUFBSSxDQUFDOzRCQUNoQixNQUFNO3lCQUNQO3dCQUNELENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ1AsTUFBTTtvQkFFUixLQUFLLFlBQVksQ0FBQyxRQUFRO3dCQUN4QixJQUFJLE9BQU8sS0FBSyxXQUFXLENBQUMsR0FBRyxFQUMvQjs0QkFDRSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQzNCLFFBQVEsR0FBRyxJQUFJLENBQUM7eUJBQ2pCO3dCQUNELENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ1AsTUFBTTtvQkFFUixLQUFLLFlBQVksQ0FBQyxPQUFPO3dCQUN2QixJQUFJLE9BQU8sS0FBSyxXQUFXLENBQUMsS0FBSyxFQUNqQzs0QkFDRSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQzNCLFFBQVEsR0FBRyxJQUFJLENBQUM7eUJBQ2pCO3dCQUNELENBQUMsRUFBRSxDQUFDO3dCQUNKLE1BQU07b0JBRVIsS0FBSyxZQUFZLENBQUMsT0FBTzt3QkFFdkIsT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLFlBQVksRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ3RFLElBQUksT0FBTyxLQUFLLFdBQVcsQ0FBQyxLQUFLLEVBQ2pDOzRCQUNFLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQzs0QkFDakMsUUFBUSxHQUFHLElBQUksQ0FBQzs0QkFDaEIsTUFBTTt5QkFDUDt3QkFDRCxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQzt3QkFDakIsT0FBTyxHQUFHLENBQUMsQ0FBQzt3QkFDWixNQUFNO29CQUVSLEtBQUssWUFBWSxDQUFDLE1BQU07d0JBQ3RCLElBQUksT0FBTyxLQUFLLFdBQVcsQ0FBQyxJQUFJLEVBQ2hDOzRCQUNFLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs0QkFDM0IsUUFBUSxHQUFHLElBQUksQ0FBQzt5QkFDakI7d0JBQ0QsQ0FBQyxFQUFFLENBQUM7d0JBQ0osTUFBTTtvQkFFUixLQUFLLFlBQVksQ0FBQyxRQUFRO3dCQUN4QixJQUFJLE9BQU8sS0FBSyxXQUFXLENBQUMsSUFBSSxFQUNoQzs0QkFDRSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQzNCLFFBQVEsR0FBRyxJQUFJLENBQUM7eUJBQ2pCO3dCQUNELENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ1AsTUFBTTtvQkFFUixLQUFLLFlBQVksQ0FBQyxLQUFLO3dCQUNyQixJQUFJLE9BQU8sS0FBSyxXQUFXLENBQUMsR0FBRyxFQUMvQjs0QkFDRSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQzNCLFFBQVEsR0FBRyxJQUFJLENBQUM7eUJBQ2pCO3dCQUNELE1BQU07b0JBRVIsS0FBSyxZQUFZLENBQUMsT0FBTzt3QkFDdkIsT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLFlBQVksRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ3RFLElBQUksT0FBTyxLQUFLLFdBQVcsQ0FBQyxHQUFHLEVBQy9COzRCQUNFLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQzs0QkFDakMsUUFBUSxHQUFHLElBQUksQ0FBQzs0QkFDaEIsTUFBTTt5QkFDUDt3QkFDRCxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQzt3QkFDakIsT0FBTyxHQUFHLENBQUMsQ0FBQzt3QkFDWixNQUFNO29CQUVSLEtBQUssWUFBWSxDQUFDLFVBQVUsQ0FBQztvQkFDN0IsS0FBSyxZQUFZLENBQUMsTUFBTSxDQUFDO29CQUN6QixLQUFLLFlBQVksQ0FBQyxPQUFPO3dCQUV2QixNQUFNO29CQUVSLEtBQUssWUFBWSxDQUFDLE1BQU07d0JBQ3RCLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxZQUFZLEVBQUUsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUVyRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUM3Qzs0QkFDRSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFFakQsWUFBWSxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO3lCQUN6Qzt3QkFFRCxJQUFJLE9BQU8sS0FBSyxXQUFXLENBQUMsR0FBRyxFQUMvQjs0QkFDRSxRQUFRLEdBQUcsSUFBSSxDQUFDOzRCQUNoQixXQUFXLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQzt5QkFDbkM7NkJBRUQ7NEJBQ0UsTUFBTSxHQUFHLElBQUksQ0FBQzt5QkFDZjt3QkFFRCxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQzt3QkFDakIsTUFBTTtvQkFFUixLQUFLLFlBQVksQ0FBQyxPQUFPO3dCQUN2QixZQUFZLEdBQUcsSUFBSSxDQUFDO3dCQUNwQixNQUFNO29CQUVSLEtBQUssWUFBWSxDQUFDLE9BQU87d0JBQ3ZCLFlBQVksR0FBRyxJQUFJLENBQUM7d0JBQ3BCLFlBQVksRUFBRSxDQUFDO3dCQUNmLE1BQU07b0JBRVIsS0FBSyxZQUFZLENBQUMsT0FBTzt3QkFDdkIsWUFBWSxHQUFHLElBQUksQ0FBQzt3QkFDcEIsWUFBWSxJQUFJLENBQUMsQ0FBQzt3QkFDbEIsQ0FBQyxFQUFFLENBQUM7d0JBQ0osTUFBTTtvQkFFUixLQUFLLFlBQVksQ0FBQyxNQUFNO3dCQUN0QixJQUFJLE9BQU8sS0FBSyxXQUFXLENBQUMsSUFBSSxFQUNoQzs0QkFDRSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQzNCLFFBQVEsR0FBRyxJQUFJLENBQUM7eUJBQ2pCO3dCQUNELENBQUMsRUFBRSxDQUFDO3dCQUNKLE1BQU07aUJBQ1A7YUFDQTtTQUNKO1FBRUQsSUFBSSxNQUFNLElBQUksSUFBSSxFQUNsQjtZQUNFLElBQUksT0FBTyxLQUFLLFdBQVcsQ0FBQyxJQUFJO2dCQUM5QixPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDOztnQkFFekIsT0FBTyxDQUFDLENBQUM7U0FDWjtRQUVELE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFdkIsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUVmO1lBQ0UsSUFBSSxPQUFPLEtBQUssV0FBVyxDQUFDLEtBQUs7Z0JBQy9CLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUM3RSxJQUFJLE9BQU8sS0FBSyxXQUFXLENBQUMsR0FBRztnQkFDbEMsT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztTQUMxRTthQUVEO1lBQ0UsT0FBTyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO2dCQUMzRSxNQUFNLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFDckIsT0FBTyxHQUFHLENBQUMsQ0FBQzs7Z0JBRVosT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDOUM7UUFFRCxJQUFJLE9BQU8sS0FBSyxXQUFXLENBQUMsSUFBSSxJQUFJLFlBQVksRUFDaEQ7WUFFRSxRQUFRLEdBQUcsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUUsSUFBSSxRQUFRLEtBQUssQ0FBQztnQkFDaEIsT0FBTyxDQUFDLENBQUM7WUFDWCxPQUFPLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztTQUN6QjtRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFLTyxTQUFTLENBQUMsSUFBWSxFQUFFLEdBQVc7UUFDekMsSUFBSSxNQUFNLEdBQVksS0FBSyxDQUFDO1FBQzVCLElBQUksT0FBZSxDQUFDO1FBQ3BCLElBQUksU0FBaUIsQ0FBQztRQUN0QixJQUFJLFVBQWtCLENBQUM7UUFDdkIsSUFBSSxPQUFlLENBQUM7UUFFcEIsT0FBTyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFLbkIsSUFBSSxZQUFZLEdBQVcsQ0FBQyxDQUFDO1FBRTdCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQy9FO1lBQ0UsSUFBSSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsRUFDbkU7Z0JBQ0UsUUFBUSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLEVBQ2xEO29CQUVBLEtBQUssWUFBWSxDQUFDLEtBQUs7d0JBQ3JCLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDOUIsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO3dCQUNoQyxJQUFJLEdBQUcsU0FBUyxHQUFHLE9BQU8sR0FBRyxVQUFVLENBQUM7d0JBQ3hDLE1BQU0sR0FBRyxJQUFJLENBQUM7d0JBQ2QsTUFBTTtvQkFFUixLQUFLLFlBQVksQ0FBQyxPQUFPO3dCQUN2QixPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsWUFBWSxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDdEUsU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUM5QixVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUM7d0JBQ3RDLElBQUksTUFBTSxHQUFXLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQ3BFLElBQUksUUFBUSxHQUFhLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ3ZELE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBRXhCLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxPQUFPOzRCQUMxQixPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7NkJBQ2xDLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxPQUFPOzRCQUMvQixPQUFPLE9BQU8sQ0FBQyxNQUFNLEdBQUcsT0FBTztnQ0FDN0IsT0FBTyxHQUFHLE9BQU8sR0FBRyxHQUFHLENBQUM7d0JBQzVCLElBQUksR0FBRyxTQUFTLEdBQUcsT0FBTyxHQUFHLFVBQVUsQ0FBQzt3QkFDeEMsTUFBTSxHQUFHLElBQUksQ0FBQzt3QkFDZCxNQUFNO29CQUVSLEtBQUssWUFBWSxDQUFDLE1BQU07d0JBQ3RCLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxZQUFZLEVBQUUsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUdyRSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQzlCLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUd0RCxPQUFPLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFFckMsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE9BQU87NEJBQ3pDLE9BQU8sR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQzs2QkFDL0MsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE9BQU87NEJBQzlDLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxPQUFPO2dDQUM1QyxPQUFPLEdBQUcsT0FBTyxHQUFHLEdBQUcsQ0FBQzt3QkFDNUIsSUFBSSxHQUFHLFNBQVMsR0FBRyxPQUFPLEdBQUcsVUFBVSxDQUFDO3dCQUN4QyxNQUFNLEdBQUcsSUFBSSxDQUFDO3dCQUNkLE1BQU07b0JBRVI7d0JBQ0UsSUFBSSxlQUFlLENBQUMsbUJBQW1CLEVBQUUsRUFFekM7NEJBQ0UsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFDbkI7Z0NBRUUsSUFBSSxlQUFlLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxlQUFlLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLEtBQUssSUFBSTtvQ0FDekgsWUFBWSxFQUFFLENBQUM7NkJBQ2xCO3lCQUNGO3dCQUNELE1BQU07aUJBRVA7YUFDQTtTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBU08sY0FBYztRQUNwQixJQUFJLE9BQU8sR0FBUyxJQUFJLElBQUksQ0FBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFHOUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWhDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBRXhELElBQUksY0FBYyxHQUFXLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDcEYsT0FBTyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ2pLO2FBQ0k7WUFHSCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLElBQUk7Z0JBQ2xHLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixFQUFFLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ2xJO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQVNPLFFBQVEsQ0FBQyxTQUFpQixFQUFFLE1BQXFCLEVBQUUsSUFBWTtRQUNyRSxJQUFJLEtBQUssR0FBVyxTQUFTLENBQUM7UUFDOUIsSUFBSSxDQUFTLENBQUM7UUFDZCxJQUFJLE1BQU0sR0FBVyxJQUFJLENBQUM7UUFDMUIsSUFBSyxPQUFPLEdBQWtCLElBQUksYUFBYSxFQUFFLENBQUM7UUFFbEQsT0FBTyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDdkY7WUFDRSxLQUFLLEVBQUUsQ0FBQztTQVFUO1FBRUQsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBRW5DO1lBQ0UsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNqQyxPQUFPLFNBQVMsQ0FBQztTQUNsQjtRQUVELEtBQUssQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQy9EO1lBQ0UsSUFBSSxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUVwQztnQkFDRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDdkIsTUFBTTthQUNQO1NBQ0Y7UUFFRCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssS0FBSyxHQUFHLENBQUM7WUFDaEQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFFcEIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLEtBQUs7WUFDakQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUVwQyxJQUFJLEdBQUcsR0FBVyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBUXBELElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxLQUFLLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxLQUFLLFlBQVksQ0FBQyxNQUFNLENBQUM7WUFDdEcsTUFBTSxJQUFJLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUN2RCxJQUFJLElBQUksS0FBSyxZQUFZLENBQUMsTUFBTSxFQUNyQztZQUNFLElBQUksRUFBRSxHQUFZLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQyxJQUFJLE1BQU0sR0FBVyxJQUFJLENBQUM7WUFDMUIsSUFBSSxHQUFXLENBQUM7WUFFaEIsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFDbEM7Z0JBQ0UsSUFBSSxNQUFNLEdBQVcsR0FBRyxHQUFHLEVBQUUsQ0FBQztnQkFFOUIsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLE1BQU0sSUFBSSxFQUFFLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUUzQyxJQUFJLE1BQU0sR0FBRyxFQUFFO29CQUNiLEdBQUcsR0FBRyxNQUFNLEdBQUcsRUFBRSxDQUFDO3FCQUNmLElBQUksTUFBTSxLQUFLLENBQUM7b0JBQ25CLEdBQUcsR0FBRyxFQUFFLENBQUM7O29CQUVULEdBQUcsR0FBRyxNQUFNLENBQUM7Z0JBRWYsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO2FBQ3ZDO2lCQUNJLElBQUksR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ3RCLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFFaEIsSUFBSSxNQUFNLElBQUksSUFBSSxFQUNsQjtnQkFDRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7YUFDbkM7U0FDRjtRQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDbEMsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBR08sVUFBVSxDQUFDLFNBQWlCLEVBQUUsTUFBcUI7UUFDekQsSUFBSSxDQUFTLENBQUM7UUFFZCxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUN0RTtZQUNFLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2Q7YUFFRDtZQUNFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQ3RFO2dCQUNFLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNkO2lCQUNJLElBQUksSUFBSSxDQUFDLEtBQUssRUFDbkI7Z0JBQ0UsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEIsT0FBTyxTQUFTLENBQUM7YUFDbEI7O2dCQUVDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdkI7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBSU8sT0FBTztRQUViLEtBQUssSUFBSSxJQUFJLEdBQVcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFDOUQ7WUFDRSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLFlBQVksQ0FBQyxNQUFNO2dCQUMxRCxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sZUFBZSxDQUFDLGVBQTZCLEVBQUUsYUFBMkIsRUFBRSxNQUFZO1FBQzlGLElBQUssR0FBRyxHQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdEMsSUFBSyxRQUFRLEdBQVcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM1RixJQUFJLFFBQWdCLEVBQUUsT0FBZSxDQUFDO1FBQ3RDLElBQUksQ0FBUyxDQUFDO1FBRWQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLElBQUksZUFBZSxJQUFJLElBQUksRUFDM0I7WUFDRSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUMvQztnQkFDRSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDdkYsT0FBTyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDeEYsSUFBSSxRQUFRLElBQUksUUFBUSxJQUFJLFFBQVEsSUFBSSxPQUFPO29CQUM3QyxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzNCO1NBQ0Y7UUFFRCxJQUFJLGFBQWEsSUFBSSxJQUFJLEVBQ3pCO1lBQ0UsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUN6QztnQkFDRSxJQUFJLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQztvQkFDeEYsT0FBTyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUMzQjtTQUNGO1FBRUQsTUFBTSxJQUFJLG9CQUFvQixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQVVPLFlBQVksQ0FBQyxLQUFhLEVBQUUsa0JBQTJCO1FBQzdELElBQUksT0FBTyxHQUFrQixJQUFJLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuRCxJQUFJLFFBQXVCLENBQUM7UUFFNUIsSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLGFBQWEsRUFDeEM7WUFDRSxJQUFJLEdBQUcsR0FBUSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3JDLElBQUksS0FBSyxHQUFXLElBQUksQ0FBQztZQUN6QixJQUFJLGFBQWEsR0FBVyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0QsYUFBYSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNqRyxhQUFhLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzlGLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDL0I7YUFFRDtZQUNFLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDL0MsSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUk7Z0JBQ3ZFLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztTQUNwRjtRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLEVBQ3JDO1lBQ0UsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQzFDLElBQUksUUFBUSxLQUFLLGFBQWEsQ0FBQyxnQkFBZ0IsSUFBSSxRQUFRLEtBQUssYUFBYSxDQUFDLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsZUFBZSxFQUFFLEVBQzdJO2dCQUNFLElBQUksU0FBUyxHQUFXLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMxRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLFlBQVksR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3JGLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQzthQUNoRDtTQUNGO1FBQ0QsSUFBSSxrQkFBa0I7WUFFcEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFNTyxrQkFBa0IsQ0FBQyxFQUFVLEVBQUUsS0FBYTtRQUNsRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBRU8sSUFBSSxDQUFDLGlCQUFvQztRQUMvQyxJQUFJLENBQUMsT0FBTyxHQUFHLGlCQUFpQixDQUFDO1FBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksR0FBRyxHQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzVDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUU3QyxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxFQUFFO1lBQzNCLElBQUksR0FBRyxJQUFJLElBQUksSUFBSyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksZ0JBQWdCLENBQUMsSUFBSTtnQkFDeEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7U0FDdkI7UUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxFQUFFO1lBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1NBQ3JCO1FBRUQsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUNoSCxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztTQUM1RDtJQUNILENBQUM7SUFHTyxPQUFPLENBQUMsS0FBZTtRQUM3QixJQUFJLEtBQUssR0FBVyxDQUFDLENBQUM7UUFDdEIsSUFBSSxHQUFHLEdBQVcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUM3QztZQUNFLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFDbEI7Z0JBQ0UsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDZixLQUFLLEdBQUcsQ0FBQyxDQUFDO2FBQ1g7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLHlCQUF5QixDQUFDLE9BQWU7UUFDL0MsSUFBSSxLQUFLLEdBQVcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQyxPQUFPLENBQUMsS0FBSyxLQUFLLFlBQVksQ0FBQyxNQUFNLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxRQUFRLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPO2VBQ3ZJLEtBQUssS0FBSyxZQUFZLENBQUMsTUFBTSxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsT0FBTyxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsUUFBUSxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsS0FBSztlQUNsSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLFVBQVUsSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU0sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU07ZUFDdkssS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU1SSxDQUFDO0lBR08sZ0NBQWdDLENBQUMsT0FBZTtRQUN0RCxJQUFJLEtBQUssR0FBVyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU0sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLFFBQVEsSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU07ZUFDdEksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxRQUFRLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxL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dEMsSUFBSSxLQUFLLEdBQWlCLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFL0QsSUFBSSxLQUFLLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxFQUNwRDtZQUNFLElBQUksWUFBWSxHQUFRLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMvQyxJQUFJLFlBQVksS0FBSyxJQUFJO2dCQUN2QixnQkFBZ0IsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7O2dCQUVoRSxnQkFBZ0IsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLENBQUM7U0FDaEQ7UUFFRCxPQUFPLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgRGF0ZVRpbWUsXHJcbiAgRXhjZXB0aW9uLFxyXG4gIExpc3QsXHJcbiAgTkNoYXIsXHJcbiAgTk51bWJlcixcclxuICBOU3RyaW5nLFxyXG4gIE51bWJlckZvcm1hdEluZm8sXHJcbiAgU3RyaW5nQnVpbGRlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHsgVmFsaWRhdGlvbkRldGFpbHMgfSBmcm9tICcuL1ZhbGlkYXRpb25EZXRhaWxzJztcclxuaW1wb3J0IHsgSUVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vZW52L0lFbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7IE1nQ29udHJvbEJhc2UgfSBmcm9tICcuL01nQ29udHJvbEJhc2UnO1xyXG5pbXBvcnQgeyBHdWlGaWVsZEJhc2UgfSBmcm9tICcuLi9kYXRhL0d1aUZpZWxkQmFzZSc7XHJcbmltcG9ydCB7IERhdGVCcmVha1BhcmFtcywgRGlzcGxheUNvbnZlcnRvciB9IGZyb20gJy4vRGlzcGxheUNvbnZlcnRvcic7XHJcbmltcG9ydCB7XHJcbiAgRGF0ZVV0aWwsXHJcbiAgSFRNTF8yX1NUUixcclxuICBNZ0NvbnRyb2xUeXBlLFxyXG4gIE1zZ0ludGVyZmFjZSxcclxuICBQSUNJbnRlcmZhY2UsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZSxcclxuICBTdHJVdGlsLFxyXG4gIFV0aWxEYXRlSnBuLFxyXG4gIFV0aWxTdHJCeXRlTW9kZVxyXG59IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQgeyBFdmVudHMgfSBmcm9tICcuLi8uLi9FdmVudHMnO1xyXG5pbXBvcnQgeyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbiB9IGZyb20gJy4vV3JvbmdGb3JtYXRFeGNlcHRpb24nO1xyXG5pbXBvcnQgeyBQSUMgfSBmcm9tICcuL1BJQyc7XHJcbmltcG9ydCB7IERhdGVFbGVtZW50IH0gZnJvbSAnLi4vLi4vR3VpRW51bXMnO1xyXG5pbXBvcnQgeyBOVU1fVFlQRSB9IGZyb20gJy4uL2RhdGEvTlVNX1RZUEUnO1xyXG5pbXBvcnQgeyBIZWJyZXdEYXRlIH0gZnJvbSAnLi9IZWJyZXdEYXRlJztcclxuaW1wb3J0IHsgQmxvYlR5cGUgfSBmcm9tICcuLi9kYXRhL0Jsb2JUeXBlJztcclxuaW1wb3J0IHsgR3VpRW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9HdWlFbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7UHJvcEludGVyZmFjZX0gZnJvbSBcIi4vUHJvcEludGVyZmFjZVwiO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBGaWVsZFZhbGlkYXRvciB7XHJcbiAgcHJpdmF0ZSBfbmV3dmFsdWU6IGFueSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfb2xkdmFsdWU6IGFueSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcGljdHVyZVJlYWw6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcGljdHVyZUVuYWJsZTogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIF92YWxEZXQ6IFZhbGlkYXRpb25EZXRhaWxzID0gbnVsbDtcclxuICBwcml2YXRlIF9pc1BtOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfcGljdHVyZTogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIGhlYnJldzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2RlY2ltYWw6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfZW52aXJvbm1lbnQ6IElFbnZpcm9ubWVudCA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5fZW52aXJvbm1lbnQgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudDtcclxuICAgIHRoaXMuX2RlY2ltYWwgPSAodGhpcy5fZW52aXJvbm1lbnQuR2V0RGVjaW1hbCgpIHx8IFwiXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiB0aGUgbWFpbiBtZXRob2Qgb2YgdGhpcyBjbGFzczwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWxEZXRcIj5hIFZhbGlkYXRpb25EZXRhaWxzIG9iamVjdCB0byB1c2Ugd2hlbiB2YWxpZGF0aW5nPC9wYXJhbT5cclxuICBjaGVja1ZhbCh2YWxEZXQ6IFZhbGlkYXRpb25EZXRhaWxzKTogVmFsaWRhdGlvbkRldGFpbHMge1xyXG4gICAgdGhpcy5fbmV3dmFsdWUgPSAodGhpcy5fb2xkdmFsdWUgPSAodGhpcy5fcGljdHVyZVJlYWwgPSAodGhpcy5fcGljdHVyZUVuYWJsZSA9IG51bGwpKSk7XHJcbiAgICB0aGlzLmluaXQodmFsRGV0KTtcclxuICAgIHZhbERldC5zZXRWYWxpZGF0aW9uRmFpbGVkKGZhbHNlKTtcclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2xCYXNlID0gdmFsRGV0LmdldENvbnRyb2woKTtcclxuICAgIC8vIFRPRE8gLSB1bmNvbW1lbnQgdGhpcyBsaW5lIHdoZW4gJ1BST1BfVFlQRV9NT0RJRllfSU5fUVVFUlknIGlzIHN1cHBvcnRlZCBmb3Igb3RoZXIgY29udHJvbHNcclxuICAgIGxldCBtb2RJblF1ZXV5OiBib29sZWFuID1cclxuICAgICAgY3RybC5pc1JlcGVhdGFibGUoKT8gZmFsc2UgOiAgY3RybC5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NT0RJRllfSU5fUVVFUlksIGZhbHNlLCBjdHJsLmdldERpc3BsYXlMaW5lKGZhbHNlKSk7XHJcblxyXG4gICAgbGV0IHVzZU5hdGl2ZTogYm9vbGVhbiA9IGN0cmwuaXNNb2RpZmlhYmxlKCk7XHJcblxyXG4gICAgaWYgKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRNb2RlKCkgPT09ICdFJyAmJiAhbW9kSW5RdWV1eSkge1xyXG4gICAgICB2YWxEZXQuc2V0VmFsdWUodGhpcy5fb2xkdmFsdWUpO1xyXG4gICAgICByZXR1cm4gdmFsRGV0O1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1JBRElPIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1ggfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUIgfHwgY3RybC5pc1NlbGVjdGlvbkN0cmwoKSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YKSB7XHJcbiAgICAgICAgICB2YWxEZXQuc2V0TnVsbChjdHJsLmlzTnVsbFZhbHVlKHRoaXMuX25ld3ZhbHVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9uZXd2YWx1ZSAhPT0gbnVsbCAmJiBjdHJsLmlzU2VsZWN0aW9uQ3RybCgpKSB7XHJcbiAgICAgICAgICBsZXQgaWR4OiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKHRoaXMuX25ld3ZhbHVlKTtcclxuICAgICAgICAgIGlmIChjdHJsLmlzQ2hvaWNlTnVsbChpZHgpKSB7XHJcbiAgICAgICAgICAgIHZhbERldC5zZXROdWxsKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoZXhfMTExKSB7XHJcbiAgICAgICAgaWYgKGV4XzExMSBpbnN0YW5jZW9mIEV4Y2VwdGlvbikge1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aHJvdyBleF8xMTE7XHJcbiAgICAgIH1cclxuICAgICAgdmFsRGV0LnNldFZhbHVlKHRoaXMuX25ld3ZhbHVlKTtcclxuICAgICAgcmV0dXJuIHZhbERldDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBzcGFjZXxub3RoaW5nIHdhcyBpbnNlcnRlZCAgLT4gdXNlIGRlZmF1bHQgdmFsdWVcclxuICAgIGlmIChjdHJsLkRhdGFUeXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBICYmIGN0cmwuRGF0YVR5cGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSAmJiBjdHJsLkRhdGFUeXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IpIHtcclxuICAgICAgICAgIGlmICgodHlwZW9mIHRoaXMuX25ld3ZhbHVlID09PSAnc3RyaW5nJyAmJiB0aGlzLl9uZXd2YWx1ZS50cmltKCkubGVuZ3RoID09PSAwKSB8fCAoY3RybC5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFICYmIChjdHJsLmlzRGF0ZVplcm8odGhpcy5fbmV3dmFsdWUpIHx8IHRoaXMuaXNOdWxsRGlzcGxheVZhbCgpKSkpIHtcclxuICAgICAgICAgICAgbGV0IGZpZWxkOiBHdWlGaWVsZEJhc2UgPSBjdHJsLmdldEZpZWxkKCk7XHJcbiAgICAgICAgICAgIGxldCBkZWZhdWx0VmFsdWU6IHN0cmluZyA9IGZpZWxkLmdldERlZmF1bHRWYWx1ZSgpO1xyXG4gICAgICAgICAgICBsZXQgdGV4dDogYW55ID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKGZpZWxkLmlzTnVsbERlZmF1bHQoKSkge1xyXG4gICAgICAgICAgICAgIHZhbERldC5zZXROdWxsKHRydWUpO1xyXG4gICAgICAgICAgICAgIHRleHQgPSBmaWVsZC5nZXROdWxsRGlzcGxheSgpO1xyXG4gICAgICAgICAgICAgIGlmIChOU3RyaW5nLklzTnVsbE9yRW1wdHkodGV4dCkgJiYgY3RybC5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKGRlZmF1bHRWYWx1ZSwgdmFsRGV0LmdldFJhbmdlKCksIHZhbERldC5nZXRQSUMoKSwgdXNlTmF0aXZlLCBmaWVsZC5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0ZXh0ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgdGV4dCA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UubWcyZGlzcChkZWZhdWx0VmFsdWUsIHZhbERldC5nZXRSYW5nZSgpLCB2YWxEZXQuZ2V0UElDKCksIHVzZU5hdGl2ZSwgZmllbGQuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICgoIWZpZWxkLmlzTnVsbERlZmF1bHQoKSAmJiAodGhpcy5fdmFsRGV0LmdldENvbnRpbnVvdXNSYW5nZVZhbHVlcygpICE9PSBudWxsIHx8IHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCkgIT09IG51bGwpKSlcclxuICAgICAgICAgICAgICB0aGlzLl9uZXd2YWx1ZSA9IHRleHQ7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHZhbERldC5zZXRWYWx1ZSh0ZXh0KTtcclxuICAgICAgICAgICAgICByZXR1cm4gdmFsRGV0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgfVxyXG5cclxuXHJcbiAgICBpZiAoKHR5cGVvZiB0aGlzLl9uZXd2YWx1ZSA9PT0gJ3N0cmluZycgJiYgIShTdHJVdGlsLnJ0cmltKHRoaXMuX25ld3ZhbHVlKSA9PT0gU3RyVXRpbC5ydHJpbSh0aGlzLl9vbGR2YWx1ZSkpKSB8fCBjdHJsLk1vZGlmaWVkQnlVc2VyKVxyXG4gICAge1xyXG4gICAgICB0cnlcclxuICAgICAge1xyXG4gICAgICAgIHN3aXRjaCAodmFsRGV0LmdldFR5cGUoKSlcclxuICAgICAgICB7XHJcblxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBOlxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6XHJcbiAgICAgICAgICAgIHZhbERldC5zZXRWYWx1ZSh0aGlzLmNoZWNrQWxwaGFGaWVsZCgpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgICAgICAgIHRoaXMuX3BpY3R1cmVSZWFsID0gdmFsRGV0LmdldFBpY3R1cmVSZWFsKCk7IC8vIG9ubHkgbnVtZXJpYyB0eXBlIG5lZWQgYW5vdGhlciBwaWN0dXJlIGZvcm1hdFxyXG4gICAgICAgICAgICB0aGlzLl9waWN0dXJlRW5hYmxlID0gdmFsRGV0LmdldFBpY3R1cmVFbmFibGUoKTtcclxuICAgICAgICAgICAgdGhpcy5jaGVja051bWVyaWNQaWN0dXJlKCk7XHJcbiAgICAgICAgICAgIHZhbERldC5zZXRWYWx1ZSh0aGlzLmNoZWNrTnVtZXJpY0ZpZWxkKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjpcclxuICAgICAgICAgICAgdmFsRGV0LnNldFZhbHVlKHRoaXMuY2hlY2tMb2dpY2FsRmllbGQoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5EQVRFOlxyXG4gICAgICAgICAgICB2YWxEZXQuc2V0VmFsdWUodGhpcy5jaGVja0RhdGVGaWVsZCgpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6XHJcbiAgICAgICAgICAgIHZhbERldC5zZXRWYWx1ZSh0aGlzLmNoZWNrVGltZUZpZWxkKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQjpcclxuICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIHJlYWwgcGljdHVyZSB0byBCTE9CLCBkbyBub3RoaW5nXHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1I6XHJcbiAgICAgICAgICAgIHZhbERldC5zZXRWYWx1ZSh0aGlzLl9uZXd2YWx1ZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OT05FOlxyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coXCJGaWVsZFZhbGlkYXRvci5jaGVja1ZhbDogVHlwZSBvZiB0aGUgZmllbGQgXCIgKyB2YWxEZXQuZ2V0VHlwZSgpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChnb0JhY2spIHtcclxuICAgICAgICBpZiAoZ29CYWNrIGluc3RhbmNlb2YgV3JvbmdGb3JtYXRFeGNlcHRpb24pIHtcclxuICAgICAgICAgIC8vIG5lZWQgY2hhbmdlIHRvIG9sZCB2YWx1ZSwgc2V0IGZvY3VzIGJhY2sgYW5kIHdyaXRlIEVycm9yIE1lc3NhZ2VcclxuICAgICAgICAgIHZhbERldC5zZXRWYWx1ZSh0aGlzLl9vbGR2YWx1ZSk7XHJcbiAgICAgICAgICB0aGlzLnNldFZhbGlkYXRpb25GYWlsZWQodHJ1ZSk7XHJcbiAgICAgICAgICBpZiAoZ29CYWNrLmdldFR5cGUoKSAhPT0gTXNnSW50ZXJmYWNlLlNUUl9STkdfVFhUKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJpbnRNZXNzYWdlKGdvQmFjay5nZXRUeXBlKCksIGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLnByaW50TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX1JOR19UWFQsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbERldDtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Q2hlY2sgJiB2YWxpZGF0ZSBBbHBoYSBmaWVsZCBieSBoaXMgb2xkL25ldyB2YWx1ZSBhbmQgMiBwaWN0dXJlczpcclxuICAvLy8gUmVhbCBhbmQgRW5hYmxlXHJcbiAgLy8vIDEuY2hlY2sgaWYgbmV3dmFsdWUgY29tcGxldGUgd2l0aCBwaWN0dXJlcywgb3RoZXJ3aXNlIHJldHVybiBvbGR2YWx1ZVxyXG4gIC8vLyAyLmNoZWNrIGlmIG5ld3ZhbHVlIGNvbXBsZXRlIHdpdGggcmFuZ2VcclxuICAvLy8gMi4xIGNvbXBsZXRlIHZhbHVlLCBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlICByZXR1cm4gb2xkdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gU3RyaW5nIC0gbmV3IHZhbHVlIG9mIHZhbGlkYXRlZCBmaWVsZDwvcmV0dXJucz5cclxuICBwcml2YXRlIGNoZWNrQWxwaGFGaWVsZCgpOiBzdHJpbmcge1xyXG5cclxuICAgIGxldCBjb250cm9sOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKTtcclxuXHJcbiAgICBsZXQgSXNBdHRyQWxwaGE6IGJvb2xlYW4gPSB0aGlzLl92YWxEZXQuZ2V0VHlwZSgpID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBO1xyXG5cclxuICAgIGlmICh0aGlzLl9uZXd2YWx1ZS5sZW5ndGggPT09IDAgJiYgdGhpcy5fdmFsRGV0LmdldENvbnRpbnVvdXNSYW5nZVZhbHVlcygpID09PSBudWxsICYmIHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCkgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKGZhbHNlKTtcclxuICAgICAgcmV0dXJuIHRoaXMuX25ld3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChJc0F0dHJBbHBoYSAmJiBVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nREJDUygpKSB7XHJcbiAgICAgIGxldCBwaWNMZW5COiBudW1iZXIgPSBVdGlsU3RyQnl0ZU1vZGUubGVuQih0aGlzLl9waWN0dXJlKTtcclxuICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5sZW5CKHRoaXMuX25ld3ZhbHVlKSA+IHBpY0xlbkIpIHtcclxuICAgICAgICB0aGlzLl9uZXd2YWx1ZSA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0Qih0aGlzLl9uZXd2YWx1ZSwgcGljTGVuQik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5fbmV3dmFsdWUubGVuZ3RoID4gdGhpcy5fcGljdHVyZS5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLl9uZXd2YWx1ZSA9IHRoaXMuX25ld3ZhbHVlLnN1YnN0cigwLCB0aGlzLl9waWN0dXJlLmxlbmd0aCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBzdHJpbmdCdWlsZGVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIGxldCBjdXJyUGljdHVyZTogbnVtYmVyO1xyXG4gICAgbGV0IGk6IG51bWJlciA9IGN1cnJQaWN0dXJlID0gMDtcclxuXHJcbiAgICBmb3IgKGN1cnJQaWN0dXJlID0gaSA9IDA7IGkgPCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggJiYgY3VyclBpY3R1cmUgPCB0aGlzLl9waWN0dXJlLmxlbmd0aDsgKSB7XHJcbiAgICAgIGlmICghRGlzcGxheUNvbnZlcnRvci5pc0FscGhhUG9zaXRpb25hbERpcmVjdGl2ZSh0aGlzLl9waWN0dXJlLmNoYXJBdChjdXJyUGljdHVyZSkpICYmIHRoaXMuX25ld3ZhbHVlLmNoYXJBdChpKSA9PT0gdGhpcy5fcGljdHVyZS5jaGFyQXQoY3VyclBpY3R1cmUpKSB7XHJcbiAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQodGhpcy5fcGljdHVyZS5jaGFyQXQoY3VyclBpY3R1cmUpKTtcclxuICAgICAgICBpID0gaSArIDE7XHJcbiAgICAgICAgY3VyclBpY3R1cmUgPSBjdXJyUGljdHVyZSArIDE7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKCFEaXNwbGF5Q29udmVydG9yLmlzQWxwaGFQb3NpdGlvbmFsRGlyZWN0aXZlKHRoaXMuX3BpY3R1cmUuY2hhckF0KGN1cnJQaWN0dXJlKSkgJiYgdGhpcy5fbmV3dmFsdWUuY2hhckF0KGkpICE9PSB0aGlzLl9waWN0dXJlLmNoYXJBdChjdXJyUGljdHVyZSkpIHtcclxuICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHRoaXMuX3BpY3R1cmUuY2hhckF0KGN1cnJQaWN0dXJlKSk7XHJcbiAgICAgICAgICBjdXJyUGljdHVyZSA9IGN1cnJQaWN0dXJlICsgMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBpZiAoRGlzcGxheUNvbnZlcnRvci5pc0FscGhhUG9zaXRpb25hbERpcmVjdGl2ZSh0aGlzLl9waWN0dXJlLmNoYXJBdChjdXJyUGljdHVyZSkpICYmIHRoaXMuaXNQb3NzaWJsZUFscGhhTGV0dGVyKGksIGN1cnJQaWN0dXJlKSkge1xyXG4gICAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSkge1xyXG4gICAgICAgICAgICAgIGxldCBzdHJWYWw6IHN0cmluZyA9IHRoaXMuX25ld3ZhbHVlLnN1YnN0cihpLCAxKTtcclxuICAgICAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmxlbkIoc3RyVmFsKSA9PT0gMikge1xyXG4gICAgICAgICAgICAgICAgaWYgKElzQXR0ckFscGhhKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChjdXJyUGljdHVyZSArIDEgPCB0aGlzLl9waWN0dXJlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChEaXNwbGF5Q29udmVydG9yLmlzQWxwaGFQb3NpdGlvbmFsRGlyZWN0aXZlKHRoaXMuX3BpY3R1cmUuY2hhckF0KGN1cnJQaWN0dXJlICsgMSkpICYmIHRoaXMuaXNQb3NzaWJsZUFscGhhTGV0dGVyKGksIGN1cnJQaWN0dXJlICsgMSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHRoaXMuX25ld3ZhbHVlLmNoYXJBdChpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyUGljdHVyZSA9IGN1cnJQaWN0dXJlICsgMjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZCgnICcpLyonICcqLztcclxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJQaWN0dXJlID0gY3VyclBpY3R1cmUgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZCgnICcpLyonICcqLztcclxuICAgICAgICAgICAgICAgICAgICBjdXJyUGljdHVyZSA9IGN1cnJQaWN0dXJlICsgMTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHRoaXMuX25ld3ZhbHVlLmNoYXJBdChpKSk7XHJcbiAgICAgICAgICAgICAgICAgIGkgPSBpICsgMTtcclxuICAgICAgICAgICAgICAgICAgY3VyclBpY3R1cmUgPSBjdXJyUGljdHVyZSArIDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQodGhpcy5fbmV3dmFsdWUuY2hhckF0KGkpKTtcclxuICAgICAgICAgICAgICAgIGkgPSBpICsgMTtcclxuICAgICAgICAgICAgICAgIGN1cnJQaWN0dXJlID0gY3VyclBpY3R1cmUgKyAxO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZCh0aGlzLl9uZXd2YWx1ZS5jaGFyQXQoaSkpO1xyXG4gICAgICAgICAgICAgIGkgPSBpICsgMTtcclxuICAgICAgICAgICAgICBjdXJyUGljdHVyZSA9IGN1cnJQaWN0dXJlICsgMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKCcgJykvKicgJyovO1xyXG4gICAgICAgICAgICBjdXJyUGljdHVyZSA9IGN1cnJQaWN0dXJlICsgMTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICBsZXQgdHlwZTogTWdDb250cm9sVHlwZSA9IGNvbnRyb2wuVHlwZTtcclxuICAgICAgICAgICAgICBpZiAodHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByaW50TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX0VSUl9OVU0sIGZhbHNlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuX25ld3ZhbHVlID0gc3RyaW5nQnVpbGRlci5Ub1N0cmluZygpO1xyXG4gICAgaWYgKHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKSAhPT0gbnVsbCB8fCB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX25ld3ZhbHVlID0gdGhpcy5maWxsQWxwaGFCeVJhbmdlKHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKSwgdGhpcy5fdmFsRGV0LmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gIHRoaXMuX25ld3ZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrIGlmIGNoYXIgaW4gQWxwaGEgY29tcGxlYXRlIHdpdGggRGlyZWN0aXZlIENoYXJhY3RlciBmb3IgdGhlIGxldHRlcjwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpbmRleFwiPm9mIGRpcmVjdGl2ZSBpbiBzdHJpbmcgdG8gY2hlY2s8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpZiBjb21wbGV0ZSwgZmFsc2Ugb3RoZXJ3aXNlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgaXNQb3NzaWJsZUFscGhhTGV0dGVyKGluZGV4SW5wdXQ6IG51bWJlciwgaW5kZXhQaWN0dXJlOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW47XHJcbiAgICBzd2l0Y2ggKHRoaXMuX3BpY3R1cmUuY2hhckNvZGVBdChpbmRleFBpY3R1cmUpKSB7XHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19YOlxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfSjpcclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0c6XHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19TOlxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfVDpcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19VOlxyXG4gICAgICAgIGxldCB1cHBlcjogc3RyaW5nID0gdGhpcy5fbmV3dmFsdWVbaW5kZXhJbnB1dF0udG9VcHBlckNhc2UoKTtcclxuICAgICAgICBpZiAodXBwZXIgIT09IHRoaXMuX25ld3ZhbHVlW2luZGV4SW5wdXRdKVxyXG4gICAgICAgICAgdGhpcy5jaGFuZ2VTdHJpbmdJbnNpZGUoXCJcIiArIHVwcGVyLCBpbmRleElucHV0KTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19MOlxyXG4gICAgICAgIGxldCBsb3dlcjogc3RyaW5nID0gdGhpcy5fbmV3dmFsdWVbaW5kZXhJbnB1dF0udG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAobG93ZXIgIT09IHRoaXMuX25ld3ZhbHVlW2luZGV4SW5wdXRdKVxyXG4gICAgICAgICAgdGhpcy5jaGFuZ2VTdHJpbmdJbnNpZGUoXCJcIiArIGxvd2VyLCBpbmRleElucHV0KTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19OOlxyXG4gICAgICAgIGxldCBudW1iZXIxOiBzdHJpbmcgPSB0aGlzLl9uZXd2YWx1ZVtpbmRleElucHV0XTtcclxuICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQobnVtYmVyMSkgfHwgTkNoYXIuSXNXaGl0ZVNwYWNlKG51bWJlcjEpIHx8IFV0aWxTdHJCeXRlTW9kZS5hc051bWVyaWMobnVtYmVyMSkpXHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgRXZlbnRzLldyaXRlRXJyb3JUb0xvZyhcIkJhZCBBbHBoYSB2YWx1ZS4gU2hvdWxkIGJlIG51bWJlciBvbmx5IG9uIHBsYWNlIE51bS4gXCIgKyBpbmRleElucHV0KTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIEV2ZW50cy5Xcml0ZUVycm9yVG9Mb2coXCJGaWVsZFZhbGlkYXRvci5pc1Bvc3NpYmxlQWxwaGFMZXR0ZXI6IGlsbGVnYWwgQ2hhciBEaXJlY3RpdmU6IFwiICsgdGhpcy5fcGljdHVyZS5pbmRleE9mKFN0cmluZy5mcm9tQ2hhckNvZGUoaW5kZXhQaWN0dXJlKSkgKyBcIiBmb3IgXCIgKyB0aGlzLl9uZXd2YWx1ZVtpbmRleElucHV0XSk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmlmIG5ldyB2YWx1ZSB3YXNuJ3QgZmluaXNoZWQgYW5kIHN0YXkgdW53cml0YWJsZSBwZWFjZXMgb2YgdGhlIFJlYWwgcGljdHVyZSAtIGFkZCBpdFxyXG4gIC8vLyB0byB0aGUgZW5kIG9mIHRoZSBuZXd2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBmaWxsQWxsQWxwaGEoKTogc3RyaW5nIHtcclxuICAgIGxldCBzdHJpbmdCdWlsZGVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIodGhpcy5fcGljdHVyZS5sZW5ndGgpO1xyXG4gICAgc3RyaW5nQnVpbGRlci5BcHBlbmQodGhpcy5fbmV3dmFsdWUpO1xyXG5cclxuICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nREJDUygpICYmIHRoaXMuX3ZhbERldC5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEpIHtcclxuICAgICAgbGV0IGludE5ld3ZhbHVlTGVuQjogbnVtYmVyID0gVXRpbFN0ckJ5dGVNb2RlLmxlbkIodGhpcy5fbmV3dmFsdWUpO1xyXG4gICAgICBsZXQgc3RyQnVpZWRQaWN0dXJlOiBzdHJpbmcgPSBVdGlsU3RyQnl0ZU1vZGUubGVmdEIodGhpcy5fcGljdHVyZSwgaW50TmV3dmFsdWVMZW5CKTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gc3RyQnVpZWRQaWN0dXJlLmxlbmd0aDsgaSA8IHRoaXMuX3BpY3R1cmUubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBpZiAoRGlzcGxheUNvbnZlcnRvci5pc0FscGhhUG9zaXRpb25hbERpcmVjdGl2ZSh0aGlzLl9waWN0dXJlLmNoYXJBdChpKSkpIHtcclxuICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKCcgJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQodGhpcy5fcGljdHVyZS5jaGFyQXQoaSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IHRoaXMuX25ld3ZhbHVlLmxlbmd0aCAtIDE7IGkgPCB0aGlzLl9waWN0dXJlLmxlbmd0aCAmJiBpID49IDA7IGkrKykge1xyXG4gICAgICAgIGlmIChEaXNwbGF5Q29udmVydG9yLmlzQWxwaGFQb3NpdGlvbmFsRGlyZWN0aXZlKHRoaXMuX3BpY3R1cmUuY2hhckF0KGkpKSkge1xyXG4gICAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQoJyAnKS8qJyAnKi87XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQodGhpcy5fcGljdHVyZS5jaGFyQXQoaSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpID0gaSArIDE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Q29tcGFyYXRpdmUgbmV3dmFsdWUgd2l0aCBwb3NzaWJsZSBSYW5nZSBpbiBDb250aW51b3VzUmFuZ2VWYWx1ZXMvRGlzY3JldGVSYW5nZVZhbHVlczwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IG5ld3ZhbHVlIGlmIGl0IHBvc3NpYmxlLCBvbGR2YWx1ZSBvdGhlcndpc2U8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBmaWxsQWxwaGFCeVJhbmdlKENvbnRpbnVvdXNSYW5nZVZhbHVlczogTGlzdDxzdHJpbmc+LCBEaXNjcmV0ZVJhbmdlVmFsdWVzOiBMaXN0PHN0cmluZz4pOiBzdHJpbmcge1xyXG5cclxuICAgIGxldCB0bXBCdWZmZXI6IHN0cmluZyA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuZmlsbEFscGhhQnlEaXNjcmV0ZVJhbmdlVmFsdWVzKERpc2NyZXRlUmFuZ2VWYWx1ZXMsIHRoaXMuX25ld3ZhbHVlKTtcclxuICAgIGlmICh0bXBCdWZmZXIgIT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHRtcEJ1ZmZlcjtcclxuICAgIH1cclxuXHJcbiAgICB0bXBCdWZmZXIgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmZpbGxBbHBoYUJ5Q29udGludW91c1JhbmdlVmFsdWVzKENvbnRpbnVvdXNSYW5nZVZhbHVlcywgdGhpcy5fbmV3dmFsdWUpO1xyXG4gICAgaWYgKHRtcEJ1ZmZlciAhPT0gbnVsbClcclxuICAgICAgcmV0dXJuIHRtcEJ1ZmZlcjtcclxuXHJcbiAgICAgIGlmIChEaXNjcmV0ZVJhbmdlVmFsdWVzICE9PSBudWxsKVxyXG4gICAgICAgIHJldHVybiB0aGlzLkNvbXBsZXRlQWxwaGFCeVJhbmdlKERpc2NyZXRlUmFuZ2VWYWx1ZXMpO1xyXG5cclxuXHJcbiAgICB0aGlzLnByaW50TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX1JOR19UWFQsIHRydWUpO1xyXG4gICAgcmV0dXJuIHRoaXMuX29sZHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlRyeSB0byBjb21wbGV0ZSB0aGUgbmV3dmFsdWUgYnkgUmFuZ2U8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBjb21wbGV0ZWQgdmFsdWUgaWYgaXQgcG9zc2libGUsIG90aGVyd2lzZSBvbGR2YWx1ZTwvcmV0dXJucz5cclxuICBwcml2YXRlIENvbXBsZXRlQWxwaGFCeVJhbmdlKERpc2NyZXRlUmFuZ2VWYWx1ZXM6IExpc3Q8c3RyaW5nPik6IHN0cmluZyB7XHJcbiAgICBsZXQgdG1wTmV3VmFsdWU6IHN0cmluZyA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuY29tcGxldGVBbHBoYUJ5UmFuZ2UoRGlzY3JldGVSYW5nZVZhbHVlcywgdGhpcy5fbmV3dmFsdWUpO1xyXG4gICAgaWYgKHRtcE5ld1ZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0bXBOZXdWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmb2N1cyBiYWNrXHJcbiAgICB0aGlzLnByaW50TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX1JOR19UWFQsIHRydWUpO1xyXG4gICAgcmV0dXJuIHRoaXMuX29sZHZhbHVlO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGVjayAmIHZhbGlkYXRlIExvZ2ljYWwgZmllbGQgYnkgaGlzIG9sZC9uZXcgdmFsdWUgYW5kIDIgcGljdHVyZXM6XHJcbiAgLy8vIFJlYWwgYW5kIEVuYWJsZVxyXG4gIC8vLyAxLmNoZWNrIGlmIG5ld3ZhbHVlIGNvbXBsZXRlIHdpdGggcGljdHVyZXMsIG90aGVyd2lzZSByZXR1cm4gb2xkdmFsdWVcclxuICAvLy8gMi5jaGVjayBpZiBuZXd2YWx1ZSBjb21wbGV0ZSB3aXRoIHJhbmdlXHJcbiAgLy8vIDIuMSBjb21wbGV0ZSB2YWx1ZSwgaWYgcG9zc2libGUsIG90aGVyd2lzZSAgcmV0dXJuIG9sZHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IFN0cmluZyAtIG5ldyB2YWx1ZSBvZiB2YWxpZGF0ZWQgZmllbGQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjaGVja0xvZ2ljYWxGaWVsZCgpOiBib29sZWFuIHtcclxuXHJcbiAgICBpZiAodGhpcy5fbmV3dmFsdWUubGVuZ3RoID09PSAwICYmIHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKSA9PT0gbnVsbCAmJiB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpID09PSBudWxsKSB7XHJcbiAgICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbihNc2dJbnRlcmZhY2UuU1RSX1JOR19UWFQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCkgIT09IG51bGwgfHwgdGhpcy5fdmFsRGV0LmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKSAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9uZXd2YWx1ZSA9IHRoaXMuZmlsbEFscGhhQnlSYW5nZSh0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCksIHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZChmYWxzZSk7XHJcblxyXG4gIC8vIHRvZG8gOiBuZWVkIHRvIGNoZWNrIHdoYXQgaXMgdG8gaGFuZGxlIGZvciBjaGVja2luZyByYW5nZXNcclxuICAgIHJldHVybiB0aGlzLl9uZXd2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4qKioqKioqKioqKioqKioqKioqKioqKioqKk51bWVyaWMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKio8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGVjayAmIHZhbGlkYXRlIE51bWVyaWMgZmllbGQgYnkgaGlzIG9sZC9uZXcgdmFsdWUgYW5kIDIgcGljdHVyZXM6XHJcbiAgLy8vIFJlYWwgYW5kIEVuYWJsZVxyXG4gIC8vLyAxLmNoZWNrIGlmIG5ld3ZhbHVlIGNvbXBsZXRlIHdpdGggcGljdHVyZXMsIG90aGVyd2lzZSByZXR1cm4gb2xkdmFsdWVcclxuICAvLy8gMi5jaGVjayBpZiBuZXd2YWx1ZSBjb21wbGV0ZSB3aXRoIHJhbmdlXHJcbiAgLy8vIDIuMSBjb21wbGV0ZSB2YWx1ZSwgaWYgcG9zc2libGUsIG90aGVyd2lzZSAgcmV0dXJuIG9sZHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IFN0cmluZyAtIG5ldyB2YWx1ZSBvZiB2YWxpZGF0ZWQgZmllbGQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjaGVja051bWVyaWNGaWVsZCgpOiBhbnkge1xyXG5cclxuICAgIGxldCBldmFsdWF0ZWQ6IGFueTtcclxuICAgIGlmICh0eXBlb2YgdGhpcy5fbmV3dmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIGlmICh0aGlzLl9uZXd2YWx1ZS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICB0aGlzLl9uZXd2YWx1ZSA9IFwiMFwiO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgZGVsaW1ldGVyUmVhbEluZGV4OiBudW1iZXIgPSB0aGlzLl9uZXd2YWx1ZS5pbmRleE9mKHRoaXMuX2RlY2ltYWwpO1xyXG4gICAgICBsZXQgZGVsaW1ldGVyUGljdEluZGV4OiBudW1iZXIgPSB0aGlzLl9waWN0dXJlUmVhbC5pbmRleE9mKHRoaXMuX2RlY2ltYWwpO1xyXG5cclxuICAgICAgZXZhbHVhdGVkID0gXCJcIjtcclxuICAgICAgbGV0IGV2YWx1YXRlZExlZnQ6IHN0cmluZztcclxuICAgICAgbGV0IGV2YWx1YXRlZFJpZ2h0OiBzdHJpbmc7XHJcblxyXG5cclxuICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKGZhbHNlKTtcclxuXHJcbiAgICAgIC8vIGNoZWNrIGlmIHRoZSBmb3JtYXQgb2YgbmV3dmFsdWUgbWF0Y2hlcyB0aGUgbnVtZXJpYyBtYXNrLlxyXG4gICAgICBpZiAoIXRoaXMuY2hlY2tOdW1lcmljSW5EZWNGb3JtYXQoKSlcclxuICAgICAgICB0aHJvdyBuZXcgV3JvbmdGb3JtYXRFeGNlcHRpb24oTXNnSW50ZXJmYWNlLkVEVF9FUlJfU1RSXzEpO1xyXG5cclxuICAgICAgaWYgKGRlbGltZXRlclBpY3RJbmRleCAhPT0gLTEgJiYgZGVsaW1ldGVyUmVhbEluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgIGV2YWx1YXRlZExlZnQgPSB0aGlzLmNoZWNrTnVtZXJpY0xlZnQoZGVsaW1ldGVyUGljdEluZGV4LCBkZWxpbWV0ZXJSZWFsSW5kZXgpO1xyXG4gICAgICAgIGV2YWx1YXRlZFJpZ2h0ID0gdGhpcy5jaGVja051bWVyaWNSaWdodChkZWxpbWV0ZXJQaWN0SW5kZXgsIGRlbGltZXRlclJlYWxJbmRleCk7XHJcbiAgICAgICAgZXZhbHVhdGVkID0gZXZhbHVhdGVkTGVmdCArIHRoaXMuX2RlY2ltYWwgKyBldmFsdWF0ZWRSaWdodDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoZGVsaW1ldGVyUGljdEluZGV4ICE9PSAtMSAmJiBkZWxpbWV0ZXJSZWFsSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICBldmFsdWF0ZWRMZWZ0ID0gdGhpcy5jaGVja051bWVyaWNMZWZ0KGRlbGltZXRlclBpY3RJbmRleCwgTWF0aC5taW4oZGVsaW1ldGVyUGljdEluZGV4LCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGgpKTtcclxuICAgICAgICAgIGV2YWx1YXRlZFJpZ2h0ID0gdGhpcy5jaGVja051bWVyaWNSaWdodChkZWxpbWV0ZXJQaWN0SW5kZXgsIGRlbGltZXRlclBpY3RJbmRleCAtIDEpO1xyXG4gICAgICAgICAgZXZhbHVhdGVkID0gZXZhbHVhdGVkTGVmdCArIHRoaXMuX2RlY2ltYWwgKyBldmFsdWF0ZWRSaWdodDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7IC8vIGRlbGltZXRlclBpY3RJbmRleCA9PSAtMSAmJiBkZWxpbWV0ZXJSZWFsSW5kZXggIT0gLTFcclxuICAgICAgICAgIGlmIChkZWxpbWV0ZXJQaWN0SW5kZXggPT09IC0xICYmIGRlbGltZXRlclJlYWxJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgZXZhbHVhdGVkID0gdGhpcy5jaGVja051bWVyaWNSaWdodCgtMSwgLTEpO1xyXG4gICAgICAgICAgICBldmFsdWF0ZWRMZWZ0ID0gZXZhbHVhdGVkO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChkZWxpbWV0ZXJSZWFsSW5kZXggPiAwKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fbmV3dmFsdWUgPSB0aGlzLl9uZXd2YWx1ZS5zdWJzdHIoMCwgZGVsaW1ldGVyUmVhbEluZGV4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLl9uZXd2YWx1ZSA9IFwiMFwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGV2YWx1YXRlZCA9IHRoaXMuY2hlY2tOdW1lcmljUmlnaHQoLTEsIC0xKTtcclxuICAgICAgICAgICAgZXZhbHVhdGVkTGVmdCA9IGV2YWx1YXRlZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICgoZXZhbHVhdGVkUmlnaHQubGVuZ3RoID09PSAwICYmIGV2YWx1YXRlZExlZnQubGVuZ3RoID09PSAwKSB8fCAoZXZhbHVhdGVkLmxlbmd0aCA9PT0gMCAmJiB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggPiAwKSkge1xyXG4gICAgICAgIC8vIHNwYWNlfG5vdGhpbmcgd2FzIGluc2VydGVkICAtPiB1c2UgZGVmYXVsdCB2YWx1ZVxyXG4gICAgICAgIGxldCBjdHJsOiBNZ0NvbnRyb2xCYXNlO1xyXG4gICAgICAgIGN0cmwgPSB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpO1xyXG5cclxuICAgICAgICBsZXQgZmllbGQ6IEd1aUZpZWxkQmFzZSA9IGN0cmwuZ2V0RmllbGQoKTtcclxuICAgICAgICBsZXQgZGVmVmFsdWU6IHN0cmluZyA9IGZpZWxkLmdldERlZmF1bHRWYWx1ZSgpOyAvLyBpbm5lciB2YWx1ZSBpbnNlcnRlZFxyXG4gICAgICAgIGxldCBkaXNwRGVmVmFsdWU6IGFueSA9IG51bGw7XHJcblxyXG4gICAgICAgIGlmIChmaWVsZC5pc051bGxEZWZhdWx0KCkpIHtcclxuICAgICAgICAgIHRoaXMuX3ZhbERldC5zZXROdWxsKHRydWUpO1xyXG4gICAgICAgICAgZGlzcERlZlZhbHVlID0gZmllbGQuZ2V0TnVsbERpc3BsYXkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRpc3BEZWZWYWx1ZSA9PSBudWxsKVxyXG4gICAgICAgICAgZGlzcERlZlZhbHVlID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKGRlZlZhbHVlLCB0aGlzLl92YWxEZXQuZ2V0UmFuZ2UoKSwgdGhpcy5fdmFsRGV0LmdldFBJQygpLCB0cnVlLCBmaWVsZC5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpLCBmYWxzZSk7XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBjaGVjayBpZiB0aGUgZGlnaXQgYmVmb3JlIHRoZSBkZWxpbWl0ZXIgZG8gbm90IGV4Y2VlZCB0aGUgcGljIHdob2xlcy5cclxuICAgICAgbGV0IHdob2xlRGlnaXRkaWZmOiBudW1iZXIgPSB0aGlzLmRpZ2l0c0JlZm9yZURlbGltZXRlcihldmFsdWF0ZWQsIDAsIHRoaXMuX2RlY2ltYWwpIC0gdGhpcy5fdmFsRGV0LmdldFBJQygpLmdldFdob2xlcygpO1xyXG4gICAgICAvLyBpZiB0aGV5IGRvLCBjaGVjayBpZiB0aGUgZXhjZWVkaW5nIGNoYXJzIGFyZSB0aGUgcGFkIGNoYXJzLiBpZiBzbywgdGhlcmUgaXMgbm8gZXJyb3IuXHJcbiAgICAgIGlmICh3aG9sZURpZ2l0ZGlmZiA+IDApIHtcclxuICAgICAgICBsZXQgcGFkQ2hhck9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICAvLyBpcyB0aGVyZSBhIHBhZCwgY2hlY2sgaXQuIG5vIHBhZCBpcyBhIGNlcnRhaW4gZXJyb3IuXHJcbiAgICAgICAgaWYgKHRoaXMuX3ZhbERldC5nZXRJc1BhZEZpbGwoKSkge1xyXG4gICAgICAgICAgcGFkQ2hhck9ubHkgPSB0cnVlO1xyXG4gICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHdob2xlRGlnaXRkaWZmICYmIHBhZENoYXJPbmx5OyBpKyspXHJcbiAgICAgICAgICAgIC8vIGlmIHRoZSBjaGFyIGlzIG5vdCB0aGUgcGFkLCB0aGVuIHRoaXMgaXMgYW4gZXJyb3IuXHJcbiAgICAgICAgICAgIGlmIChldmFsdWF0ZWRbaV0gIT09IHRoaXMuX3ZhbERldC5nZXRQYWRGaWxsQ2hhcigpKVxyXG4gICAgICAgICAgICAgIHBhZENoYXJPbmx5ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXBhZENoYXJPbmx5KVxyXG4gICAgICAgICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKE1zZ0ludGVyZmFjZS5FRFRfRVJSX1NUUl8xKTtcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0SXNOZWdhdGl2ZSgpICYmICh0aGlzLl9uZXd2YWx1ZS50cmltKCkuc3RhcnRzV2l0aChcIi1cIikgfHwgKHRoaXMuX3ZhbERldC5nZXROZWdhdGl2ZVNpZ25QcmVmKCkubGVuZ3RoICE9PSAwICYmIHRoaXMuX25ld3ZhbHVlLnRyaW0oKS5zdGFydHNXaXRoKHRoaXMuX3ZhbERldC5nZXROZWdhdGl2ZVNpZ25QcmVmKCkpKSkpIHtcclxuICAgICAgICBldmFsdWF0ZWQgPSBcIi1cIiArIGV2YWx1YXRlZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gZnJvbSB0aGlzIHBvaW50IGhhdmUgZXZhbHVhdGVkIHN0cmluZyAtIHRoZSB2YWx1ZSAod2l0aG91dCBtYXNrKSBvZiB0aGUgY29udHJvbFxyXG4gICAgICAvLyBuZWVkZWQgdG8gYmUgaW5zZXJ0ZWQgdG8gdGhlIHBpY3R1cmVcclxuICAgICAgZXZhbHVhdGVkID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5kaXNwMm1nKHRoaXMuX25ld3ZhbHVlLCBcIlwiLCB0aGlzLl92YWxEZXQuZ2V0UElDKCksIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCksIEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9VTktOT1dOKTtcclxuICAgICAgZXZhbHVhdGVkID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKGV2YWx1YXRlZCwgXCJcIiwgdGhpcy5fdmFsRGV0LmdldFBJQygpLCB0cnVlLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpLCB0cnVlKTtcclxuXHJcbiAgICAgIC8vIGluIG9yZGVyIGNoZWNrIGlmIHVzZXIgaGFzIGVudGVyZWQgYSBibGFuayB2YWx1ZSAsIHRyaW0gYW5kIHRoZW4gY2hlY2sgaXQncyBsZW5ndGguXHJcbiAgICAgIGxldCB0ZW1wRGlzcFZhbDogc3RyaW5nID0gU3RyVXRpbC5sdHJpbShldmFsdWF0ZWQpO1xyXG4gICAgICBpZiAodGVtcERpc3BWYWwubGVuZ3RoID09PSAwICYmIHRoaXMuX3ZhbERldC5nZXRQSUMoKS56ZXJvRmlsbCgpICYmIHRoaXMuX3ZhbERldC5nZXRQSUMoKS5nZXRaZXJvUGFkKCkgPT09ICcgJylcclxuICAgICAgICBldmFsdWF0ZWQgPSBcIjBcIjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG5cclxuICAgICAgLy8gZnJvbSB0aGlzIHBvaW50IGhhdmUgZXZhbHVhdGVkIHN0cmluZyAtIHRoZSB2YWx1ZSAod2l0aG91dCBtYXNrKSBvZiB0aGUgY29udHJvbFxyXG4gICAgICAvLyBuZWVkZWQgdG8gYmUgaW5zZXJ0ZWQgdG8gdGhlIHBpY3R1cmVcclxuICAgICAgZXZhbHVhdGVkID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5kaXNwMm1nKHRoaXMuX25ld3ZhbHVlLCBcIlwiLCB0aGlzLl92YWxEZXQuZ2V0UElDKCksIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCksIEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9VTktOT1dOKTtcclxuICAgICAgZXZhbHVhdGVkID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKGV2YWx1YXRlZCwgXCJcIiwgdGhpcy5fdmFsRGV0LmdldFBJQygpLCB0cnVlLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpLCB0cnVlKTtcclxuXHJcbiAgICB9XHJcbiAgICAvLyBJbnNlcnQgdGhlIG51bWJlciB0byByYW5nZVxyXG4gICAgaWYgKHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKSAhPSBudWxsIHx8IHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCkgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgdGhpcy5fbmV3dmFsdWUgPSBldmFsdWF0ZWQ7XHJcbiAgICAgIGV2YWx1YXRlZCA9IHRoaXMuZmlsbE51bWVyaWNCeVJhbmdlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZXZhbHVhdGVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkNoZWNrIHZhbGlkaXR5IG9mIG51bWVyaWNhbCBwaWN0dXJlIGZyb20gZm91bmQgJ2RlbGltZXRlcicgdG8gbGVmdC5cclxuICAvLy8gPC0uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZWxpbWV0ZXJQaWN0SW5kZXhcIj5mb3VuZCBkZWxpbWV0ZXIgaW4gdGhlIHBpY3R1cmU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRlbGltZXRlclJlYWxJbmRleFwiPmZvdW5kIGRlbGltZXRlciBpbiB0aGUgaW5zZXJ0ZWQgYnkgdXNlciBuZXcgdmFsdWU8L3BhcmFtPlxyXG4gIHByaXZhdGUgY2hlY2tOdW1lcmljTGVmdChkZWxpbWV0ZXJQaWN0SW5kZXg6IG51bWJlciwgZGVsaW1ldGVyUmVhbEluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IGJ1ZmZlcjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICBsZXQgUmVhbEluZGV4OiBudW1iZXIgPSBkZWxpbWV0ZXJSZWFsSW5kZXggLSAxO1xyXG4gICAgbGV0IFBpY3RJbmRleDogbnVtYmVyO1xyXG4gICAgbGV0IGlzRm91bmQ6IGJvb2xlYW47XHJcblxyXG4gICAgZm9yIChQaWN0SW5kZXggPSBkZWxpbWV0ZXJQaWN0SW5kZXggLSAxOyBQaWN0SW5kZXggPj0gMCAmJiBSZWFsSW5kZXggPj0gMDsgUGljdEluZGV4LS0pXHJcbiAgICB7XHJcbiAgICAgIGlmICh0aGlzLl9waWN0dXJlRW5hYmxlW1BpY3RJbmRleF0gPT09ICcxJylcclxuICAgICAge1xyXG4gICAgICAgIGxldCB0bXBzdG9yYWdlOiBudW1iZXIgPSBSZWFsSW5kZXg7XHJcbiAgICAgICAgaXNGb3VuZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBmb3IgKDsgUmVhbEluZGV4ID49IDA7IFJlYWxJbmRleC0tKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlmICh0aGlzLl9waWN0dXJlUmVhbFtQaWN0SW5kZXhdID09PSB0aGlzLl9uZXd2YWx1ZVtSZWFsSW5kZXhdKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBpc0ZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgUmVhbEluZGV4LS07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFpc0ZvdW5kKVxyXG4gICAgICAgICAgUmVhbEluZGV4ID0gdG1wc3RvcmFnZTtcclxuXHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZCh0aGlzLl9waWN0dXJlUmVhbFtQaWN0SW5kZXhdKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBjYW4gaW5zZXJ0IG9ubHkgbnVtYmVyXHJcbiAgICAgIGVsc2VcclxuICAgICAge1xyXG4gICAgICAgIGZvciAoOyBSZWFsSW5kZXggPj0gMDsgUmVhbEluZGV4LS0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX25ld3ZhbHVlW1JlYWxJbmRleF0pKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBidWZmZXIuQXBwZW5kKHRoaXMuX25ld3ZhbHVlW1JlYWxJbmRleF0pO1xyXG4gICAgICAgICAgICBSZWFsSW5kZXgtLTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFJlYWxJbmRleCA8IDAgJiYgUGljdEluZGV4ID49IDApXHJcbiAgICAvLyB0cnkgdG8gYWRkIHVud3JpdGFibGVcclxuICAgICAgZm9yICg7IFBpY3RJbmRleCA+PSAwOyBQaWN0SW5kZXgtLSlcclxuICAgICAge1xyXG4gICAgICAgIGlmICh0aGlzLl9waWN0dXJlRW5hYmxlW1BpY3RJbmRleF0gPT09ICcxJylcclxuICAgICAgICAgIGJ1ZmZlci5BcHBlbmQodGhpcy5fcGljdHVyZVJlYWxbUGljdEluZGV4XSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIC8vIG9ubHkgZnJvbSBsZWZ0IG5lZWQgUGFkRmlsbFxyXG4gICAgICAgICAgaWYgKHRoaXMuX3ZhbERldC5nZXRJc1BhZEZpbGwoKSlcclxuICAgICAgICAgICAgYnVmZmVyLkFwcGVuZCh0aGlzLl92YWxEZXQuZ2V0UGFkRmlsbENoYXIoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgcmV0dXJuIFN0clV0aWwuUmV2ZXJzZVN0cmluZyhidWZmZXIpLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Q2hlY2sgdmFsaWRpdHkgb2YgbnVtZXJpY2FsIHBpY3R1cmUgZnJvbSBmb3VuZCAnZGVsaW1ldGVyJyB0byByaWdodC5cclxuICAvLy8gLi0+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZWxpbWV0ZXJQaWN0SW5kZXhcIj5mb3VuZCBkZWxpbWV0ZXIgaW4gdGhlIHBpY3R1cmU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRlbGltZXRlclJlYWxJbmRleFwiPmZvdW5kIGRlbGltZXRlciBpbiB0aGUgaW5zZXJ0ZWQgYnkgdXNlciBuZXcgdmFsdWU8L3BhcmFtPlxyXG4gIHByaXZhdGUgY2hlY2tOdW1lcmljUmlnaHQoZGVsaW1ldGVyUGljdEluZGV4OiBudW1iZXIsIGRlbGltZXRlclJlYWxJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBidWZmZXI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgbGV0IFJlYWxJbmRleDogbnVtYmVyID0gZGVsaW1ldGVyUmVhbEluZGV4ICsgMTtcclxuICAgIGxldCBQaWN0SW5kZXg6IG51bWJlcjtcclxuICAgIGxldCBwaWM6IFBJQyA9IHRoaXMuX3ZhbERldC5nZXRQSUMoKTtcclxuXHJcbiAgICBmb3IgKFBpY3RJbmRleCA9IGRlbGltZXRlclBpY3RJbmRleCArIDE7IFBpY3RJbmRleCA8IHRoaXMuX3BpY3R1cmVFbmFibGUubGVuZ3RoICYmIFJlYWxJbmRleCA8IHRoaXMuX25ld3ZhbHVlLmxlbmd0aDsgUGljdEluZGV4KyspXHJcbiAgICB7XHJcbiAgICAgIGlmICh0aGlzLl9waWN0dXJlRW5hYmxlW1BpY3RJbmRleF0gPT09ICcxJylcclxuICAgICAge1xyXG4gICAgICAgIGlmIChSZWFsSW5kZXggPCBQaWN0SW5kZXgpXHJcbiAgICAgICAgICBSZWFsSW5kZXggPSBQaWN0SW5kZXg7XHJcblxyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQodGhpcy5fcGljdHVyZVJlYWxbUGljdEluZGV4XSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gY2FuIGluc2VydCBvbmx5IG51bWJlclxyXG4gICAgICBlbHNlXHJcbiAgICAgIHtcclxuICAgICAgICBmb3IgKDsgUmVhbEluZGV4IDwgdGhpcy5fbmV3dmFsdWUubGVuZ3RoOyBSZWFsSW5kZXgrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAvLyBBcHBlbmQgdGhlIGRpZ2l0IG9mIGFjdHVhbCBpbnB1dCBkYXRhLiBJZiBpdCBpcyBtYXNrIGNoYXIsIHNraXAgaXQuXHJcbiAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQodGhpcy5fbmV3dmFsdWVbUmVhbEluZGV4XSkgJiYgIXBpYy5waWNJc01hc2soUmVhbEluZGV4KSlcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyLkFwcGVuZCh0aGlzLl9uZXd2YWx1ZVtSZWFsSW5kZXhdKTtcclxuICAgICAgICAgICAgUmVhbEluZGV4Kys7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIHJpZ2h0IHBhcnQgaGFzIGFueSBpbnB1dCBkYXRhLCB0aGVuIG9ubHkgYXBwZW5kIHVud3JpdGFibGUgY2hhcnNcclxuICAgIGlmIChidWZmZXIuTGVuZ3RoID4gMClcclxuICAgIHtcclxuICAgICAgaWYgKFJlYWxJbmRleCA+PSB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggJiYgUGljdEluZGV4IDwgdGhpcy5fcGljdHVyZVJlYWwubGVuZ3RoKVxyXG4gICAgICAvLyB0cnkgdG8gYWRkIHVud3JpdGFibGVcclxuICAgICAgICBmb3IgKDsgUGljdEluZGV4IDwgdGhpcy5fcGljdHVyZVJlYWwubGVuZ3RoOyBQaWN0SW5kZXgrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZiAodGhpcy5fcGljdHVyZUVuYWJsZVtQaWN0SW5kZXhdID09PSAnMScpXHJcbiAgICAgICAgICAgIGJ1ZmZlci5BcHBlbmQodGhpcy5fcGljdHVyZVJlYWxbUGljdEluZGV4XSk7XHJcbiAgICAgICAgICAvLyBlbHNlIERvIG5vdGhpbmdcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnVmZmVyLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+QlVHOiA0NDI3ODhcclxuICAvLy8gQ2hhbmdpbmcgZGVjaW1hbCBzZXBhcmF0b3IgaW4gdGhldyBwaWN0dXJlUmVhbCB0byB2YWx1ZSBnb3QgZnJvbSBFbnZpcm9ubWVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBjaGVja051bWVyaWNQaWN0dXJlKCk6IHZvaWQge1xyXG4gICAgbGV0IGluZGV4T2ZEZWM6IG51bWJlcjtcclxuICAgIGxldCBsYXN0RGVjOiBudW1iZXI7XHJcbiAgICBsZXQgbWF4TGVuZ3RoOiBudW1iZXI7XHJcbiAgICBsZXQgY3VyckluZHg6IG51bWJlcjtcclxuICAgIGxldCBQT0lOVF9ERUM6IHN0cmluZyA9IFwiLlwiOyAvLyB1c2VkIGluIFBJQ1RVUkUgZm9yIGRlY2ltYWwgc2VwYXJhdG9yXHJcblxyXG4gICAgbGV0IHBpYzogUElDID0gdGhpcy5fdmFsRGV0LmdldFBJQygpO1xyXG5cclxuICAgIGlmICh0aGlzLl9waWN0dXJlUmVhbCA9PSBudWxsIHx8IHRoaXMuX3BpY3R1cmVFbmFibGUgPT0gbnVsbCB8fCBwaWMuZ2V0QXR0cigpICE9PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMgfHwgIXBpYy53aXRoRGVjaW1hbCgpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbGFzdERlYyA9IHRoaXMuX3BpY3R1cmVSZWFsLmxhc3RJbmRleE9mKFBPSU5UX0RFQyk7XHJcbiAgICBtYXhMZW5ndGggPSB0aGlzLl9waWN0dXJlRW5hYmxlLmxlbmd0aDtcclxuICAgIGN1cnJJbmR4ID0gMDtcclxuICAgIHdoaWxlIChjdXJySW5keCA8IGxhc3REZWMpXHJcbiAgICB7XHJcbiAgICAgIGluZGV4T2ZEZWMgPSB0aGlzLl9waWN0dXJlRW5hYmxlLmluZGV4T2YoXCIxXCIsIGN1cnJJbmR4KTtcclxuXHJcbiAgICAgIGlmIChpbmRleE9mRGVjID09PSAtMSlcclxuICAgICAgLy8gbm90IGZvdW5kXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICBlbHNlXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoaW5kZXhPZkRlYyA9PT0gdGhpcy5fcGljdHVyZVJlYWwuaW5kZXhPZiggUE9JTlRfREVDLCBjdXJySW5keCkpXHJcbiAgICAgICAgLy8gaXQncyByZWFsIGRlY2ltYWwgcG9pbnQgYW5kIG5vdCBcXC4gaW50byB0aGUgcGljdHVyZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCBmaXJzdDogc3RyaW5nO1xyXG4gICAgICAgICAgbGV0IHNlY29uZDogc3RyaW5nO1xyXG5cclxuICAgICAgICAgIGZpcnN0ID0gc2Vjb25kID0gXCJcIjtcclxuICAgICAgICAgIGlmIChpbmRleE9mRGVjID09PSAwKVxyXG4gICAgICAgICAgLy8gdGhlIHBvaW50IG9uIHRoZSBmaXJzdCBwbGFjZSAuIyMjXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChpbmRleE9mRGVjICsgMSA8IG1heExlbmd0aClcclxuICAgICAgICAgICAgLy8gb25seSAxIC5cclxuICAgICAgICAgICAgICBzZWNvbmQgPSB0aGlzLl9waWN0dXJlUmVhbC5zdWJzdHIoaW5kZXhPZkRlYyArIDEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZiAoaW5kZXhPZkRlYyA9PT0gbWF4TGVuZ3RoKVxyXG4gICAgICAgICAgLy8gdGhlIHBvaW50IG9uIHRoZSBsYXN0IHBsYWNlICMjIy5cclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZmlyc3QgPSB0aGlzLl9waWN0dXJlUmVhbC5zdWJzdHIoMCAsIGluZGV4T2ZEZWMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBmaXJzdCA9IHRoaXMuX3BpY3R1cmVSZWFsLnN1YnN0cigwICwgaW5kZXhPZkRlYyk7XHJcbiAgICAgICAgICAgIHNlY29uZCA9IHRoaXMuX3BpY3R1cmVSZWFsLnN1YnN0cihpbmRleE9mRGVjICsgMSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLl9waWN0dXJlUmVhbCA9IGZpcnN0ICsgdGhpcy5fZGVjaW1hbCArIHNlY29uZDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY3VyckluZHggPSArK2luZGV4T2ZEZWM7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENvbXBhcmUgbmV3dmFsdWUgd2l0aCB0aGUgcmFuZ2U8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBuZXd2YWx1ZSBpZiBpdCdzIGluIHRoZSByYW5nZSwgb2xkdmFsdWUgb3RoZXJ3aXNlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZmlsbE51bWVyaWNCeVJhbmdlKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgY29udHJvbFBpYzogUElDID0gdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRQSUMoKTtcclxuICAgIGxldCBjb250aW51b3VzUmFuZ2VWYWx1ZXM6IExpc3Q8c3RyaW5nPiA9IHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKTtcclxuICAgIGxldCBkaXNjcmV0ZVJhbmdlVmFsdWVzOiBMaXN0PHN0cmluZz4gPSB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpO1xyXG4gICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKGZhbHNlKTtcclxuXHJcbiAgICBsZXQgY2hlY2tlZFN0cjogc3RyaW5nID0gdGhpcy5zZXROdW1lcmljVmFsdWVXaXRob3V0UGljdHVyZSh0aGlzLl9uZXd2YWx1ZS50b1N0cmluZygpKTtcclxuXHJcblxyXG4gICAgaWYgKGNoZWNrZWRTdHIubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMucHJpbnRNZXNzYWdlKE1zZ0ludGVyZmFjZS5TVFJfUk5HX1RYVCwgdHJ1ZSk7XHJcbiAgICAgIHJldHVybiB0aGlzLl9vbGR2YWx1ZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgICBsZXQgY2hlY2tlZE51bTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUodGhpcy5fbmV3dmFsdWUudG9TdHJpbmcoKSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRQSUMoKSwgMCk7XHJcblxyXG4gICAgICBpZiAoZGlzY3JldGVSYW5nZVZhbHVlcyAhPT0gbnVsbCkge1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBkaXNjcmV0ZVJhbmdlVmFsdWVzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgICBsZXQgcmFuZ2VJdGVtVmFsdWUxOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRShkaXNjcmV0ZVJhbmdlVmFsdWVzLmdldF9JdGVtKGkpLCBjb250cm9sUGljLCAwKTtcclxuXHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoTlVNX1RZUEUubnVtX2NtcChjaGVja2VkTnVtLCByYW5nZUl0ZW1WYWx1ZTEpID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25ld3ZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXRjaCAoZXhfQ0MpIHtcclxuICAgICAgICAgICAgLy8gc2tpcCBub24tbnVtZXJpYyByYW5nZSB2YWx1ZXNcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjb250aW51b3VzUmFuZ2VWYWx1ZXMgIT09IG51bGwpIHtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgY29udGludW91c1JhbmdlVmFsdWVzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcblxyXG4gICAgICAgICAgbGV0IHJhbmdlSXRlbVZhbHVlMTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgICAgICAgIGxldCByYW5nZUl0ZW1WYWx1ZTI6IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcblxyXG4gICAgICAgICAgcmFuZ2VJdGVtVmFsdWUxLm51bV80X2Ffc3RkKGNvbnRpbnVvdXNSYW5nZVZhbHVlcy5nZXRfSXRlbShpKyspKTtcclxuICAgICAgICAgIHJhbmdlSXRlbVZhbHVlMi5udW1fNF9hX3N0ZChjb250aW51b3VzUmFuZ2VWYWx1ZXMuZ2V0X0l0ZW0oaSkpO1xyXG5cclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChOVU1fVFlQRS5udW1fY21wKGNoZWNrZWROdW0sIHJhbmdlSXRlbVZhbHVlMSkgIT09IC0xICYmIE5VTV9UWVBFLm51bV9jbXAocmFuZ2VJdGVtVmFsdWUyLCBjaGVja2VkTnVtKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbmV3dmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNhdGNoIChleF8xNUIpIHtcclxuICAgICAgICAgICAgLy8gc2tpcCBub24tbnVtZXJpYyByYW5nZSB2YWx1ZXNcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHJldHVybnMgYSBudW1lcmljIHZhbHVlIGV4dHJhY3RlZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJpbmdcclxuICAvLy8gb24gZmFpbHVyZSByZXR1cm5zIE5FR0FUSVZFX0lORklOSVRZXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWxcIj50aGUgc3RyaW5nIHRvIHBhcnNlPC9wYXJhbT5cclxuICBwcml2YXRlIGdldERvdWJsZVZhbCh2YWw6IHN0cmluZyk6IG51bWJlciB7XHJcblxyXG4gICAgbGV0IGRvdEZvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgbWludXNGb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGRpZ2l0Rm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBlbmRPZk51bTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGk6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLy8gZmluZCB0aGUgZGVsZW1ldGluZyBub24gbnVtZXJpYyBjaGFyYWN0ZXJcclxuICAgIGZvciAoaSA9IDA7IGkgPCB2YWwubGVuZ3RoICYmICFlbmRPZk51bTsgaSsrKVxyXG4gICAge1xyXG4gICAgICBsZXQgYzogc3RyaW5nID0gdmFsW2ldO1xyXG4gICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpXHJcbiAgICAgICAgZGlnaXRGb3VuZCA9IHRydWU7XHJcbiAgICAgIGVsc2VcclxuICAgICAge1xyXG4gICAgICAgIHN3aXRjaCAoYylcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjYXNlICctJzpcclxuICAgICAgICAgICAgaWYgKGRpZ2l0Rm91bmQgfHwgZG90Rm91bmQgfHwgbWludXNGb3VuZClcclxuICAgICAgICAgICAgICBlbmRPZk51bSA9IHRydWU7XHJcbiAgICAgICAgICAgIG1pbnVzRm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlICcuJzpcclxuICAgICAgICAgICAgaWYgKGRvdEZvdW5kIHx8IG1pbnVzRm91bmQgJiYgIWRpZ2l0Rm91bmQpXHJcbiAgICAgICAgICAgICAgZW5kT2ZOdW0gPSB0cnVlO1xyXG4gICAgICAgICAgICBkb3RGb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgJyAnOlxyXG4gICAgICAgICAgICBpZiAoZGlnaXRGb3VuZCB8fCBkb3RGb3VuZCB8fCBtaW51c0ZvdW5kKVxyXG4gICAgICAgICAgICAgIGVuZE9mTnVtID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgZW5kT2ZOdW0gPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoZW5kT2ZOdW0pIHtcclxuICAgICAgaSA9IGkgLSAxO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpID4gMCkge1xyXG4gICAgICByZXR1cm4gTk51bWJlci5QYXJzZSh2YWwuc3Vic3RyKDAsIGkpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gLUluZmluaXR5O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PnNldCBOdW1lcmljIHZhbHVlIFdpdGhvdXQgUGljdHVyZSwgZmlsdGVyIGlucHV0IGZyb20gdXNlcjwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBwdXJlIG51bWJlciwgd2l0aG91dCBwaWN0dXJlIG1hc2s8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzZXROdW1lcmljVmFsdWVXaXRob3V0UGljdHVyZSh2YWw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgY2hlY2tlZFN0cjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKHZhbC5sZW5ndGgpO1xyXG4gICAgbGV0IGlzRmlyc3REZWNpbWFsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgY3VyckNoYXI6IHN0cmluZztcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fcGljdHVyZVJlYWwubGVuZ3RoICYmIGkgPCB2YWwubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIGN1cnJDaGFyID0gdmFsW2ldO1xyXG4gICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQoY3VyckNoYXIpKVxyXG4gICAgICAgIGNoZWNrZWRTdHIuQXBwZW5kKGN1cnJDaGFyKTtcclxuICAgICAgZWxzZSBpZiAoY3VyckNoYXIgPT09IHRoaXMuX2Vudmlyb25tZW50LkdldERlY2ltYWwoKSAmJiAhaXNGaXJzdERlY2ltYWwpXHJcbiAgICAgIHtcclxuICAgICAgICBjaGVja2VkU3RyLkFwcGVuZChOU3RyaW5nLlRvQ2hhckFycmF5KE51bWJlckZvcm1hdEluZm8uTnVtYmVyRGVjaW1hbFNlcGFyYXRvcikudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgaXNGaXJzdERlY2ltYWwgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGN1cnJDaGFyID09PSAnLScgJiYgdGhpcy5fdmFsRGV0LmdldElzTmVnYXRpdmUoKSlcclxuICAgICAgICBjaGVja2VkU3RyLkFwcGVuZChOU3RyaW5nLlRvQ2hhckFycmF5KE51bWJlckZvcm1hdEluZm8uTmVnYXRpdmVTaWduKS50b1N0cmluZygpKTtcclxuICAgIH1cclxuICAgIGlmIChjaGVja2VkU3RyLlRvU3RyaW5nKCkubGVuZ3RoID09PSAwKVxyXG4gICAge1xyXG4gICAgICB0aGlzLnByaW50TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX0VSUl9OVU0sIGZhbHNlKTtcclxuICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKHRydWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNoZWNrZWRTdHIuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gY2hlY2sgaWYgbmV3dmFsdWUgZm9ybWF0IG1hdGNoZXMgdGhlIG51bWVyaWMgcGljIGZvcm1hdC48L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGNoZWNrTnVtZXJpY0luRGVjRm9ybWF0KCk6IGJvb2xlYW4ge1xyXG5cclxuXHJcbiAgICBsZXQgcGljOiBQSUMgPSB0aGlzLl92YWxEZXQuZ2V0UElDKCk7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IERlYzogbnVtYmVyO1xyXG4gICAgbGV0IFdob2xlOiBudW1iZXI7XHJcbiAgICBsZXQgRGVjUG9zOiBudW1iZXI7XHJcbiAgICBsZXQgZGVjaW1hbENoYXI6IHN0cmluZyA9IHRoaXMuX2Vudmlyb25tZW50LkdldERlY2ltYWwoKTtcclxuXHJcbiAgICAvLyBDb3VudCBudW1iZXIgb2YgZGlnaXRzIGFuZCBwb3NpdGlvbiBvZiBkZWNpbWFsIHBvaW50XHJcblxyXG4gICAgRGVjID0gMDtcclxuICAgIFdob2xlID0gMDtcclxuICAgIERlY1BvcyA9IC0xO1xyXG5cclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGg7IGkrKylcclxuICAgICAgaWYgKHBpYy5pc051bWVyaWMoaSkpXHJcbiAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX25ld3ZhbHVlW2ldKSlcclxuICAgICAgICAvLyB3aGVuIGRlYyBwb3Mgbm90IGZvdW5kLCBjb3VudCB3aG9sZXMsIGlmIGZvdW5kLCBjb3VudCBkZWMuXHJcbiAgICAgICAgICBpZiAoRGVjUG9zID49IDApXHJcbiAgICAgICAgICAgIERlYysrO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBXaG9sZSsrO1xyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX25ld3ZhbHVlW2ldID09PSBkZWNpbWFsQ2hhcilcclxuICAgICAgICAgIERlY1BvcyA9IGk7XHJcblxyXG4gICAgLy8gZGlkIHdlIGV4Y2VlZCB0aGUgbWFzayA/XHJcbiAgICBpZiAocGljLmdldFdob2xlcygpIDwgV2hvbGUgfHwgcGljLmdldERlYygpIDwgRGVjKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrICYgdmFsaWRhdGUgRGF0ZSBmaWVsZCBieSBoaXMgb2xkL25ldyB2YWx1ZSBhbmQgMiBwaWN0dXJlczpcclxuICAvLy8gUmVhbCBhbmQgRW5hYmxlXHJcbiAgLy8vIDEuY2hlY2sgaWYgbmV3dmFsdWUgY29tcGxldGUgd2l0aCBwaWN0dXJlcywgb3RoZXJ3aXNlIHJldHVybiBvbGR2YWx1ZVxyXG4gIC8vLyAyLmNoZWNrIGlmIG5ld3ZhbHVlIGNvbXBsZXRlIHdpdGggcmFuZ2VcclxuICAvLy8gMi4xIGNvbXBsZXRlIHZhbHVlLCBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlICByZXR1cm4gb2xkdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gbmV3IHZhbHVlIG9mIHZhbGlkYXRlZCBmaWVsZDwvcmV0dXJucz5cclxuICBwcml2YXRlIGNoZWNrRGF0ZUZpZWxkKCk6IERhdGUge1xyXG5cclxuICAgIGxldCBuZXdEYXRlOiBEYXRlID0gKHRoaXMuX25ld3ZhbHVlID09IG51bGwgPyBudWxsIDogbmV3IERhdGUodGhpcy5fbmV3dmFsdWUpKTtcclxuICAgICB0aGlzLnNldFZhbGlkYXRpb25GYWlsZWQoZmFsc2UpO1xyXG5cclxuICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmlzRGF0ZVplcm8odGhpcy5fbmV3dmFsdWUpKSB7XHJcbiAgICAgIC8vIGdldCBkZWZhdWx0IHZhbHVlIG9mIHRoZSBmaWVsZFxyXG4gICAgICBsZXQgZGVmYXVsdE1nVmFsdWU6IHN0cmluZyA9IHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0RmllbGQoKS5nZXREZWZhdWx0VmFsdWUoKTtcclxuXHJcbiAgICAgIG5ld0RhdGUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AoZGVmYXVsdE1nVmFsdWUsIFwiXCIsIHRoaXMuX3ZhbERldC5nZXRQSUMoKSwgdHJ1ZSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAvLyByYW5nZSBkYXRlXHJcbiAgICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCkgIT0gbnVsbCB8fCB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpICE9IG51bGwpXHJcbiAgICAgICAgbmV3RGF0ZSA9IHRoaXMuZmlsbERhdGVCeVJhbmdlKHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKSwgdGhpcy5fdmFsRGV0LmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKSwgdGhpcy5fbmV3dmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld0RhdGU7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkFkZCBmb3VuZCBpbiBuZXd2YWx1ZSBudW1iZXJzKDIgb3IgMyBsZXR0ZXJzKSB0byBidWZmZXIgYW5kIHJldHVyblxyXG4gIC8vLyBsYXN0IGZvdW5kIG51bWJlciBpbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3VyclZhbHVlXCI+aW4gbmV3dmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImJ1ZmZlclwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidHlwZVwiPi0gd2hpY2ggdHlwZSBvZiBwb3NpdGlvbmFsIGRpcmVjdGl2ZSwgZm9yIGNoZWNraW5nIHZhbGlkaXR5PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGN1cnJWYWx1ZSBpbiBuZXd2YWx1ZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGFkZDJEYXRlKGN1cnJWYWx1ZTogbnVtYmVyLCBidWZmZXI6IFN0cmluZ0J1aWxkZXIsIHR5cGU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgc3RhcnQ6IG51bWJlciA9IGN1cnJWYWx1ZTtcclxuICAgIGxldCBjdXJyQWRkOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIodGhpcy5fbmV3dmFsdWUubGVuZ3RoKTtcclxuICAgIGxldCBsZXR0ZXJzOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHN3aXRjaCAodHlwZSlcclxuICAgIHtcclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0REOlxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfRERERDpcclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX01NRDpcclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1lZOlxyXG4gICAgICAgIGxldHRlcnMgPSAyO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0RERDpcclxuICAgICAgICBsZXR0ZXJzID0gMztcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ZWVlZOlxyXG4gICAgICAgIGxldHRlcnMgPSA0O1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1c6XHJcbiAgICAgICAgbGV0dGVycyA9IDE7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWUo6ICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgICAgbGV0dGVycyA9IDI7XHJcbiAgICAgICAgdHlwZSA9IFBJQ0ludGVyZmFjZS5QSUNfWVk7IC8vIFBJQ19ZSiB3aWxsIGJlIGhhbmRsZWQgYXMgUElDX1lZIGluIHRoaXMgbWV0aG9kLlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlIChzdGFydCA8IHRoaXMuX25ld3ZhbHVlLmxlbmd0aCAmJiAhVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQodGhpcy5fbmV3dmFsdWUuY2hhckF0KHN0YXJ0KSkpXHJcbiAgICAgIHN0YXJ0Kys7IC8vIGZpbmQgZmlyc3QgZGlnaXRcclxuXHJcblxyXG4gICAgaWYgKHN0YXJ0ID09PSB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggJiYgKHRoaXMuX25ld3ZhbHVlLmxlbmd0aCA9PT0gMCB8fCB0aGlzLl9uZXd2YWx1ZSA9PT0gXCIwXCIpKSB7XHJcbiAgICAgIGZvciAobGV0IG51bDogbnVtYmVyID0gMDsgbnVsIDwgbGV0dGVyczsgbnVsID0gbnVsICsgMSkge1xyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoJzAnKS8qJzAnKi87XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGN1cnJWYWx1ZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHN0YXJ0ID09PSB0aGlzLl9uZXd2YWx1ZS5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5fbmV3dmFsdWUgPSB0aGlzLl9uZXd2YWx1ZSArIFwiMFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgbGV0dGVycyAmJiBpIDwgdGhpcy5fbmV3dmFsdWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX25ld3ZhbHVlLmNoYXJBdChpKSkpXHJcbiAgICAgICAgY3VyckFkZC5BcHBlbmQodGhpcy5fbmV3dmFsdWUuY2hhckF0KGkpKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjdXJyQWRkLkxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBjdXJyQWRkLkFwcGVuZCgnMCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBhZGQ6IG51bWJlciA9IE5OdW1iZXIuUGFyc2UoY3VyckFkZC5Ub1N0cmluZygpKTtcclxuXHJcbiAgICAvLyBib3VuZGFyeSBjb25kaXRpb25zIGNhc2VzOlxyXG4gICAgaWYgKChhZGQgPCAxICYmIHR5cGUgIT09IFBJQ0ludGVyZmFjZS5QSUNfWVlZWSAmJiB0eXBlICE9PSBQSUNJbnRlcmZhY2UuUElDX1lZKSB8fFxyXG4gICAgICAgKGFkZCA+IDMxICYmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX0REIHx8IHR5cGUgPT09ICBQSUNJbnRlcmZhY2UuUElDX0REREQpKSB8fFxyXG4gICAgICAoYWRkID4gMTIgJiYgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19NTUQpIHx8IChhZGQgPiA3ICYmIHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfVykpIHtcclxuICAgICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKE1zZ0ludGVyZmFjZS5TVFJfRVJSX0RBVEUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRoYW4gcGljdHVyZSBpcyBZWVlZIGFuZCBpbnNlcnRlZCAwLTIgbnVtYmVycywgdXNlIENFTlRVUkUgdmFsdWUsIG90aGVyd2lzZSBhZGQgemVyb3MgYmVmb3JlIHRoZSB5ZWFyXHJcbiAgICBpZiAodHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ZWVlZICYmIHRoaXMuX2Vudmlyb25tZW50LkdldENlbnR1cnkodGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSkgPiA5OTkgJiYgY3VyckFkZC5MZW5ndGggPCAzKVxyXG4gICAgICBjdXJyQWRkID0gdGhpcy5jaGVja0NlbnR1cnkoYWRkKTtcclxuXHJcbiAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgbGV0dGVycyAtIGN1cnJBZGQuTGVuZ3RoOyBqID0gaiArIDEpIHtcclxuICAgICAgYnVmZmVyLkFwcGVuZCgnMCcpLyonMCcqLztcclxuICAgIH1cclxuICAgIGJ1ZmZlci5BcHBlbmQoY3VyckFkZC5Ub1N0cmluZygpKTtcclxuICAgIHJldHVybiAgaTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5BZGQgZm91bmQgaW4gbmV3dmFsdWUgbGV0dGVycyB0byBidWZmZXIgYW5kIHJldHVyblxyXG4gIC8vLyBsYXN0IGZvdW5kIG51bWJlciBpbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3VyclZhbHVlXCI+aW4gbmV3dmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxldHRlcnNcIj5hbW91bnQgb2YgbGV0dGVycyB0byBpbnNlcnQgdG8gYnVmZmVyPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJidWZmZXJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gY3VyclZhbHVlIGluIG5ld3ZhbHVlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYWRkTTJEYXRlKGN1cnJWYWx1ZTogbnVtYmVyLCBsZXR0ZXJzOiBudW1iZXIsIGJ1ZmZlcjogU3RyaW5nQnVpbGRlciwgdHlwZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBhcnJheTogc3RyaW5nW107XHJcbiAgICBsZXQgcmVzdWx0OiBudW1iZXI7XHJcblxyXG4gICAgaWYgKHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1NIHx8IHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1EKSB7XHJcbiAgICAgIGlmICh0aGlzLmhlYnJldykge1xyXG4gICAgICAgIGFycmF5ID0gSGVicmV3RGF0ZS5HZXRMb2NhbE1vbnRocygpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGxldCBtZXNzYWdlU3RyaW5nOiBzdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhNc2dJbnRlcmZhY2UuTU9OVEhTX1BUUik7XHJcbiAgICAgICAgYXJyYXkgPSBEYXRlVXRpbC5nZXRMb2NhbE1vbnRocyhtZXNzYWdlU3RyaW5nKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX1dXVyB8fCB0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX1cpIHtcclxuICAgICAgICBpZiAodGhpcy5oZWJyZXcpIHtcclxuICAgICAgICAgIGFycmF5ID0gSGVicmV3RGF0ZS5HZXRMb2NhbERvd3MoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsZXQgZGF5U3RyOiBzdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhNc2dJbnRlcmZhY2UuREFZU19QVFIpO1xyXG4gICAgICAgICAgYXJyYXkgPSBEYXRlVXRpbC5nZXRMb2NhbERheXMoZGF5U3RyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfQkIpIHsgLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gICAgICAgICAgYXJyYXkgPSBVdGlsRGF0ZUpwbi5nZXRBcnJheURvdygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGlmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX0pZMSB8fCB0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX0pZMiB8fCB0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX0pZNClcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX25ld3ZhbHVlLmxlbmd0aCA8IGN1cnJWYWx1ZSArIGxldHRlcnMpIHtcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgV3JvbmdGb3JtYXRFeGNlcHRpb24oTXNnSW50ZXJmYWNlLlNUUl9FUlJfREFURSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHRleHQ6IHN0cmluZyA9IHRoaXMuX25ld3ZhbHVlLnN1YnN0cihjdXJyVmFsdWUsIGxldHRlcnMpO1xyXG4gICAgICAgICAgICBidWZmZXIuQXBwZW5kKHRleHQpO1xyXG4gICAgICAgICAgICByZXR1cm4gY3VyclZhbHVlICsgdGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBjdXJyVmFsdWUgKyBsZXR0ZXJzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9uZXd2YWx1ZS5sZW5ndGggPCBjdXJyVmFsdWUpIHtcclxuICAgICAgY3VyclZhbHVlID0gdGhpcy5fbmV3dmFsdWUubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgbGV0IG1heDogbnVtYmVyID0gdGhpcy5nZXRNb250aE9yV2Vlayh0aGlzLl9uZXd2YWx1ZS5zdWJzdHIoY3VyclZhbHVlKSwgbGV0dGVycywgdHlwZSk7XHJcblxyXG4gICAgaWYgKGFycmF5W21heF0udHJpbSgpLmxlbmd0aCA+PSBsZXR0ZXJzKSB7XHJcbiAgICAgIGJ1ZmZlci5BcHBlbmQoYXJyYXlbbWF4XS50cmltKCkuc3Vic3RyKDAsIGxldHRlcnMpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBidWZmZXIuQXBwZW5kKGFycmF5W21heF0udHJpbSgpKTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gbGV0dGVycyAtIGFycmF5W21heF0udHJpbSgpLmxlbmd0aDsgaSA+IDA7IGkgPSBpIC0gMSkge1xyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoJyAnKS8qJyAnKi87XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyVmFsdWUgKyBsZXR0ZXJzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmdldCBlbmQgaW5kZXggb2YgZXZlcnkgbnVtZXJpYyBibG9jayBpbiB0aGUgbWFzayBmcm9tIG1hc2tbY3VyclZhbHVlXTwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IGVuZCBvZiBudW1lcmljIGJsb2NrIGluIG5ld1ZhbHVlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0RW5kT2ZOdW1lcmljQmxvY2soY3VyclZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgd2hpbGUgKGN1cnJWYWx1ZSA8IHRoaXMuX25ld3ZhbHVlLmxlbmd0aCAmJiAhVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQodGhpcy5fbmV3dmFsdWUuY2hhckF0KGN1cnJWYWx1ZSkpKSB7XHJcbiAgICAgIGN1cnJWYWx1ZSA9IGN1cnJWYWx1ZSArIDE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3VyclZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmFkZGVkIHN1ZmZpeCB0byByZWxldmFudCBudW1iZXIgb2YgdGhlIGRheTwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFkZERhdGVTdWZmaXgobGFzdDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCB0aGVudW1iZXI6IG51bWJlciA9IE5OdW1iZXIuUGFyc2UobGFzdCk7XHJcbiAgICBpZiAodGhlbnVtYmVyID09PSAxIHx8IHRoZW51bWJlciA9PT0gMjEgfHwgdGhlbnVtYmVyID09PSAzMSlcclxuICAgICAgcmV0dXJuIFwic3RcIjtcclxuICAgIGVsc2UgaWYgKHRoZW51bWJlciA9PT0gMiB8fCB0aGVudW1iZXIgPT09IDIyKVxyXG4gICAgICByZXR1cm4gXCJuZFwiO1xyXG4gICAgZWxzZSBpZiAodGhlbnVtYmVyID09PSAzIHx8IHRoZW51bWJlciA9PT0gMjMpXHJcbiAgICAgIHJldHVybiBcInJkXCI7XHJcbiAgICByZXR1cm4gXCJ0aFwiO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmdldCBzaXplIG9mIGJsb2NrIGxldHRlcnMgb2YgdHlwZSAndHlwZScsIHdoaWNoIHN0YXJ0IGF0ICdzdGFydCc8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRTaXplT2ZCbG9jayhzdGFydDogbnVtYmVyLCB0eXBlOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IGxldHRlcnM6IG51bWJlciA9IHN0YXJ0ICsgMTtcclxuICAgIHdoaWxlIChsZXR0ZXJzIDwgdGhpcy5fcGljdHVyZS5sZW5ndGggJiYgdGhpcy5fcGljdHVyZS5jaGFyQ29kZUF0KGxldHRlcnMpID09PSB0eXBlKVxyXG4gICAgbGV0dGVycysrO1xyXG4gICAgcmV0dXJuIGxldHRlcnMgLSBzdGFydDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQgU3RyaW5nIHBhcnQvZnVsbCBuYW1lIG9mIG1vbnRoL2RheSBvZiB3ZWVrPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vbnRoXCI+cGFydC9mdWxsIG5hbWUgb2YgbW9udGgvZGF5IG9mIHdlZWs8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1heFwiPm9mIHBvc3NpYmxlIGxldHRlcnMgaW4gbW9udGgvZGF5IG9mIHdlZWssIHNpemUgb2YgYmxvY2sgaW4gcGljdHVyZSBvZiB0aGUgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidHlwZTpcIj5QSUNfICB3ZWVrfG1vbnRoPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IG51bWJlciBvZiBtb250aCAxLTEyLCBvciBkYXkgb2Ygd2VlayAxLTc8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRNb250aE9yV2Vlayhtb250aF9zdHI6IHN0cmluZywgbGV0dGVyczogbnVtYmVyLCB0eXBlOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IGFycmF5OiBzdHJpbmdbXTtcclxuXHJcbiAgICBpZiAodHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19NTU0gfHwgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19NTUQpIHtcclxuICAgICAgLy8gTW9udGhcclxuICAgICAgICBpZiAodGhpcy5oZWJyZXcpXHJcbiAgICAgICAgICBhcnJheSA9IEhlYnJld0RhdGUuR2V0TG9jYWxNb250aHMoKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGV0IG1vbnRoU3RyOiBTdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhNc2dJbnRlcmZhY2UuTU9OVEhTX1BUUik7XHJcbiAgICAgICAgICBhcnJheSA9IERhdGVVdGlsLmdldExvY2FsTW9udGhzKG1vbnRoU3RyLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgZWxzZSBpZiAodHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19XV1cgfHwgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19XKVxyXG4gICAgICAvLyBXZWVrXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAodGhpcy5oZWJyZXcpXHJcbiAgICAgICAgICBhcnJheSA9IEhlYnJld0RhdGUuR2V0TG9jYWxEb3dzKCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCBkYXlTdHI6IFN0cmluZyA9IEV2ZW50cy5HZXRNZXNzYWdlU3RyaW5nKE1zZ0ludGVyZmFjZS5EQVlTX1BUUik7XHJcbiAgICAgICAgICBhcnJheSA9IERhdGVVdGlsLmdldExvY2FsRGF5cyhkYXlTdHIudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfQkIpXHJcbiAgICAgIC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAge1xyXG4gICAgICAgIGFycmF5ID0gVXRpbERhdGVKcG4uZ2V0QXJyYXlEb3coKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgIHtcclxuICAgICAgICByZXR1cm4gMTsgLy8gb25seSB3ZWVrIG9yIG1vbnRoIHBvc3NpYmxlIC0+IGRpZmZhdWx0IDEuXHJcbiAgICAgIH1cclxuXHJcbiAgICBpZiAobGV0dGVycyA+IG1vbnRoX3N0ci5sZW5ndGgpXHJcbiAgICAvLyBjdXQgbGV0dGVyIGlmIGl0J3MgIGVuZCBvZiBzdHJpbmdcclxuICAgICAgbGV0dGVycyA9IG1vbnRoX3N0ci5sZW5ndGg7XHJcblxyXG4gICAgaWYgKHRoaXMuaGVicmV3KVxyXG4gICAge1xyXG4gICAgICBsZXQgaHN0cjogc3RyaW5nID0gTlN0cmluZy5UcmltU3RhcnQobW9udGhfc3RyKS5zdWJzdHIoMCwgbGV0dGVycykudHJpbSgpO1xyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMTsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAvLyBzdGFydCBjaGVja2luZyBmcm9tIDFzdCBtZW1iZXIsIGJlY2F1c2UgMCA9IFwiXCJcclxuICAgICAge1xyXG4gICAgICAgIGlmIChhcnJheVtpXS50cmltKCkgPT09IGhzdHIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWYgKGkgPT09IDE0KVxyXG4gICAgICAgICAgICBpID0gNjtcclxuICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAgIC8vIHRoZSBudW1iZXIgaW5zZXJ0ZWQgYW5kIG5vdCBzdHJpbmcgLT4gZmluZCBtb3VudGgvZGF5IG9mIHdlZWsgYnkgbnVtYmVyIDEtMTJ8MS03XHJcblxyXG4gICAgICAgIGxldCBzdHI6IHN0cmluZyA9IG1vbnRoX3N0ci5zdWJzdHIoMCwgbGV0dGVycykudHJpbSgpO1xyXG4gICAgICAgIGxldCBudW1CdWZmZXI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihzdHIubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQoc3RyW2ldKSlcclxuICAgICAgICAgICAgbnVtQnVmZmVyLkFwcGVuZChzdHJbaV0pO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB0aGVOdW1iZXI6IG51bWJlciA9IE5OdW1iZXIuUGFyc2UobnVtQnVmZmVyLlRvU3RyaW5nKCkpO1xyXG4gICAgICAgIGlmICh0aGVOdW1iZXIgPCAxKVxyXG4gICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgaWYgKHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1NIHx8IHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1EKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlmICh0aGVOdW1iZXIgPiAxMilcclxuICAgICAgICAgICAgcmV0dXJuIDEyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX1dXVyB8fCB0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX1cgfHwgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19CQilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgICAgICBpZiAodGhlTnVtYmVyID4gNylcclxuICAgICAgICAgICAgcmV0dXJuIDc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGVOdW1iZXI7XHJcbiAgICAgICAgfVxyXG4gICAgY2F0Y2ggKGV4XzIxQSkge1xyXG4gICAgICAgICAgLy8gZG9Ob3RoaW5nX1N0cmluZ0luc2VydGVkXHJcbiAgICAgIH1cclxuXHJcbiAgICAvLyBpbnNlcnRlZCBzdHJpbmcgLSBuYW1lIG9mIG1vbnRofGRheSBvZiB3ZWVrIC0+dHJ5IGlkZW50eWZ5IGl0XHJcbiAgICBsZXQgZm91bmQ6IG51bWJlcltdID0gbmV3IEFycmF5PG51bWJlcj4oYXJyYXkubGVuZ3RoKTtcclxuICAgIGxldCBmcm9tOiBudW1iZXI7XHJcbiAgICBsZXQgbWF4OiBudW1iZXIgPSAtMTsgLy8gbnVtYmVyIG9mIGZvdW5kIG1vbnRoL2RheSBvZiB3ZWVrXHJcblxyXG5cclxuICAgIGZvciAobGV0IHRtcDogbnVtYmVyID0gMTsgdG1wIDwgYXJyYXkubGVuZ3RoOyB0bXArKylcclxuICAgIC8vIHN0YXJ0IGNoZWNraW5nIGZyb20gMXN0IG1lbWJlciwgYmVjYXVzZSAwID0gXCJcIlxyXG4gICAge1xyXG4gICAgICBmb3VuZFt0bXBdID0gMDtcclxuICAgICAgZnJvbSA9IDA7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBhcnJheVt0bXBdLmxlbmd0aCAmJiBmcm9tIDwgbW9udGhfc3RyLmxlbmd0aCAmJiBpIDwgbGV0dGVyczsgaSsrLCBmcm9tKyspXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoYXJyYXlbdG1wXS50b0xvd2VyQ2FzZSgpW2ldID09PSBtb250aF9zdHIudG9Mb3dlckNhc2UoKVtmcm9tXSlcclxuICAgICAgICAgIGZvdW5kW3RtcF0rKztcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGZyb20gPT09IGxldHRlcnMgfHwgZnJvbSA9PT0gYXJyYXlbdG1wXS5sZW5ndGgpXHJcbiAgICAgIC8vIGFsbCBsZXR0ZXJzIGZvdW5kXHJcbiAgICAgIHtcclxuICAgICAgICBtYXggPSB0bXA7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAobWF4ID09PSAtMSlcclxuICAgICAgbWF4ID0gdGhpcy5maW5kTWF4KGZvdW5kKTtcclxuICAgIHJldHVybiBtYXg7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmlzIG51bWVyaWMgZGF0YSBhbGxvd2VkIGluIGRhdGVcclxuICAvLy8gcmV0dXJuIHRydWUgaWYgaXQgaXMgYWxsb3dlZCwgb3RoZXJ3aXNlIGZhbHNlPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgaXNOdW1iZXJBbGxvd2VkSW5EYXRlKCk6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX3BpY3R1cmUubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIGlmICh0aGlzLmlzRGF0ZVBvc2l0aW9uYWxOdW1lcmljRGlyZWN0aXZlKHRoaXMuX3BpY3R1cmVbaV0pKVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmZpbmQgaWYgYWxsIG51bWJlcnMgb2YgdGhlIG5ldyB1c2VyIGluc2VydGVkIHZhbHVlIGFyZSAwXHJcbiAgLy8vIHJldHVybiB0cnVlIGlmIGFsbCBudW1iZXJzIGluIHRoZSBpbnB1dCBhcmUgMCwgb3RoZXJ3aXNlIHRydWU8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBpc0FsbE51bWJlcnMwKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGN1cnJDaHI6IHN0cmluZztcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgY3VyckNociA9IHRoaXMuX25ld3ZhbHVlW2ldO1xyXG5cclxuICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KGN1cnJDaHIpICYmIGN1cnJDaHIgIT09ICcwJylcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Y2hlY2sgdmFsaWRpdHkgb2YgWWVhciBmb3IgWVlZWSBwYXJ0IG9mIHRoZSBtYXNrPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInllYXJJblwiPmluc2VydGVkIGJ5IHVzZXI8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gY2FsY3VsYXRlZCBieSBlbnZpcm9ubWVudC5jZW50dXJ5IHJpZ2h0IHZhbHVlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgY2hlY2tDZW50dXJ5KHllYXJJbjogbnVtYmVyKTogU3RyaW5nQnVpbGRlciB7XHJcbiAgICBsZXQgb3V0VmFsOiBudW1iZXI7XHJcbiAgICBsZXQgc3RhcnRfY2VudHVyeTogbnVtYmVyID0gdGhpcy5fZW52aXJvbm1lbnQuR2V0Q2VudHVyeSh0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuICAgIGxldCBjZW50dXJ5OiBudW1iZXIgPSBNYXRoLmZsb29yKHN0YXJ0X2NlbnR1cnkgLyAxMDApO1xyXG4gICAgbGV0IHllYXJzOiBudW1iZXIgPSBzdGFydF9jZW50dXJ5ICUgMTAwO1xyXG4gICAgaWYgKHllYXJJbiA+PSB5ZWFycyAmJiB5ZWFySW4gIT09IDApXHJcbiAgICAgIG91dFZhbCA9IChjZW50dXJ5ICogMTAwICsgeWVhckluKTtcclxuICAgIGVsc2VcclxuICAgICAgb3V0VmFsID0gKCgrK2NlbnR1cnkpICogMTAwICsgeWVhckluKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFN0cmluZ0J1aWxkZXIob3V0VmFsLnRvU3RyaW5nKCkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrIGlmIHRoZSBkYXRlIGxlZ2FsIGZvciBwaWN0dXJlIHJhbmdlLCB1c2VkIGZvciB2YWxpZGF0aW9uIGRhdGUgMDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJDb250aW51b3VzUmFuZ2VcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIkRpc2NyZXRlUmFuZ2VcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRhdGVcIj5pbnRlZ2VyIC0gbWFnaWMgZGF0ZSBudW1iZXIgb2YgZGF5cyBmcm9tIDAxLjAxLjAwMDA8L3BhcmFtPlxyXG4gIHByaXZhdGUgaXNEYXRlTGVnYWw0UmFuZ2UoQ29udGludW91c1JhbmdlOiBMaXN0PHN0cmluZz4sIERpc2NyZXRlUmFuZ2U6IExpc3Q8c3RyaW5nPiwgY3VyckRhdGU6IG51bWJlcik6IGJvb2xlYW4ge1xyXG5cclxuICAgIGxldCBwaWM6IFBJQyA9IHRoaXMuX3ZhbERldC5nZXRQSUMoKTtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgZG93bkRhdGU6IG51bWJlcjtcclxuICAgIGxldCB0b3BEYXRlOiBudW1iZXI7XHJcblxyXG4gICAgaWYgKENvbnRpbnVvdXNSYW5nZSAhPSBudWxsKVxyXG4gICAge1xyXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgQ29udGludW91c1JhbmdlLmxlbmd0aCAtIDE7IGkrKylcclxuICAgICAge1xyXG4gICAgICAgIGRvd25EYXRlID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5hXzJfZGF0ZV9waWMoQ29udGludW91c1JhbmdlLmdldF9JdGVtKGkpLCBwaWMsIHBpYy5nZXRNYXNrKCksIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG4gICAgICAgIHRvcERhdGUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmFfMl9kYXRlX3BpYyhDb250aW51b3VzUmFuZ2UuZ2V0X0l0ZW0oKytpKSwgcGljLCBwaWMuZ2V0TWFzaygpLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuICAgICAgICBpZiAoY3VyckRhdGUgPj0gZG93bkRhdGUgJiYgY3VyckRhdGUgPD0gdG9wRGF0ZSlcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKERpc2NyZXRlUmFuZ2UgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IERpc2NyZXRlUmFuZ2UubGVuZ3RoOyBpKyspXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoY3VyckRhdGUgPT09IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuYV8yX2RhdGVfcGljKERpc2NyZXRlUmFuZ2UuZ2V0X0l0ZW0oaSksIHBpYywgcGljLmdldE1hc2soKSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSkpXHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gdGhlIGRhdGUgaXMgbm90IGluIHRoZSByYW5nZVxyXG4gICAgLy8gcmV0dXJuIGZhbHNlO1xyXG4gICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Y2hlY2sgYW5kIGZpbGwgREFURSB0eXBlIGJ5IHJhbmdlPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZmlsbERhdGVCeVJhbmdlKENvbnRpbnVvdXNSYW5nZTogTGlzdDxzdHJpbmc+LCBEaXNjcmV0ZVJhbmdlOiBMaXN0PHN0cmluZz4sIGJ1ZmZlcjogRGF0ZSk6IERhdGUge1xyXG4gICAgbGV0IHBpYzogUElDID0gdGhpcy5fdmFsRGV0LmdldFBJQygpO1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBkb3duRGF0ZTogbnVtYmVyO1xyXG4gICAgbGV0IHRvcERhdGU6IG51bWJlcjtcclxuXHJcbiAgICBsZXQgY3VyckRhdGUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmZyb21OYXRpdmVEYXRlVG9NZ0RhdGVOdW1iZXIoYnVmZmVyLCBwaWMsIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG5cclxuICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZChmYWxzZSk7XHJcbiAgICBpZiAoQ29udGludW91c1JhbmdlICE9IG51bGwpIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IENvbnRpbnVvdXNSYW5nZS5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgICBkb3duRGF0ZSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuYV8yX2RhdGVfcGljKENvbnRpbnVvdXNSYW5nZS5nZXRfSXRlbShpKSwgcGljLCBwaWMuZ2V0TWFzaygpLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuICAgICAgICB0b3BEYXRlID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5hXzJfZGF0ZV9waWMoQ29udGludW91c1JhbmdlLmdldF9JdGVtKCsraSksIHBpYywgcGljLmdldE1hc2soKSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSk7XHJcbiAgICAgICAgaWYgKGN1cnJEYXRlID49IGRvd25EYXRlICYmIGN1cnJEYXRlIDw9IHRvcERhdGUpXHJcbiAgICAgICAgICByZXR1cm4gbmV3IERhdGUoYnVmZmVyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChEaXNjcmV0ZVJhbmdlICE9IG51bGwpIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IERpc2NyZXRlUmFuZ2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAoY3VyckRhdGUgPT09IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuYV8yX2RhdGVfcGljKERpc2NyZXRlUmFuZ2UuZ2V0X0l0ZW0oaSksIHBpYywgcGljLmdldE1hc2soKSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSkpIHtcclxuICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShidWZmZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gdGhlIGRhdGUgaXMgbm90IGluIHRoZSByYW5nZVxyXG4gICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrIGlmIGRheSBzdWl0YWJsZSAobm90IGJpZ2dlciB0aGFuIG1heCkgZm9yIFllYXIgYW5kIE1vbnRoPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRhdGVcIj51c2VyIGluc2VydGVkIHN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNEb3lcIj5pcyBwaWN0dXJlIG9mIG5lZWRlZCBkYXkgaXMgREREIC0gZGF5IG9mIHllYXI8L3BhcmFtPlxyXG4gIHByaXZhdGUgY2hlY2tEYXkoZGF0ZTogc3RyaW5nLCBpc0RveTogYm9vbGVhbik6IFN0cmluZ0J1aWxkZXIge1xyXG5cclxuICAgIGxldCBkYXk6IG51bWJlciA9IHRoaXMuZ2V0RGF0ZUVsZW1lbnQoZGF0ZSwgRGF0ZUVsZW1lbnQuREFZKTtcclxuICAgIGlmIChkYXkgPCAyOSAmJiAhaXNEb3kpXHJcbiAgICAgIHJldHVybiBuZXcgU3RyaW5nQnVpbGRlcihkYXRlKTtcclxuXHJcbiAgICBsZXQgeWVhcjogbnVtYmVyID0gdGhpcy5nZXREYXRlRWxlbWVudChkYXRlLCBEYXRlRWxlbWVudC5ZRUFSKTtcclxuXHJcbiAgICBpZiAoIWlzRG95KVxyXG4gICAge1xyXG4gICAgICBpZiAoeWVhci50b1N0cmluZygpLmxlbmd0aCA8IDMpXHJcbiAgICAgICAgeWVhciA9IE5OdW1iZXIuUGFyc2UodGhpcy5jaGVja0NlbnR1cnkoeWVhcikuVG9TdHJpbmcoKSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5fZW52aXJvbm1lbnQuR2V0RGF0ZU1vZGUodGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSkgPT09ICdCJylcclxuICAgICAgICB5ZWFyIC09IFBJQ0ludGVyZmFjZS5EQVRFX0JVRERISVNUX0dBUDtcclxuXHJcbiAgICAgIGxldCBtb250aDogbnVtYmVyID0gdGhpcy5nZXREYXRlRWxlbWVudChkYXRlLCBEYXRlRWxlbWVudC5NT05USCk7XHJcblxyXG4gICAgICAvLyBpZiBkYXkgbm90IGNvbnNpc3RhaW5lZCB0byB5ZWFyICYgbW9udGggLSBjaGFuZ2UgZGF5XHJcbiAgICAgIGxldCBkYXlNYXg6IG51bWJlciA9IHRoaXMuZ2V0TWF4RGF5SW5Nb250aCh5ZWFyLCBtb250aCk7XHJcbiAgICAgIGlmIChkYXkgPiBkYXlNYXgpXHJcbiAgICAgIHtcclxuICAgICAgICB0aHJvdyBuZXcgV3JvbmdGb3JtYXRFeGNlcHRpb24oTXNnSW50ZXJmYWNlLlNUUl9FUlJfREFURSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgLy8gaWYgbW9udGggbm90IGNvbnNpc3RhaW5lZCB0byBkYXkoREREKSAtIGNoYW5nZSBtb250aFxyXG4gICAgICBsZXQgbW9udGhSZWFsOiBudW1iZXIgPSB0aGlzLmdldE1vbnRoQnlEYXkoeWVhciwgZGF5KTtcclxuXHJcbiAgICAgIGlmIChtb250aFJlYWwgPCAxIHx8IG1vbnRoUmVhbCA+IDEyKVxyXG4gICAgICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbihNc2dJbnRlcmZhY2UuU1RSX0VSUl9EQVRFKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IFN0cmluZ0J1aWxkZXIoZGF0ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Y2hlY2sgaWYgZGF5IG9mIHdlZWsgc3VpdGFibGUgKHJpZ2h0KSBmb3IgWWVhciwgTW9udGggYW5kIERheTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXRlXCI+dXNlciBpbnNlcnRlZCBzdHJpbmc8L3BhcmFtPlxyXG4gIHByaXZhdGUgY2hlY2tXZWVrKGRhdGU6IHN0cmluZyk6IFN0cmluZ0J1aWxkZXIge1xyXG5cclxuICAgIGxldCBkb3c6IG51bWJlciA9IHRoaXMuZ2V0RGF0ZUVsZW1lbnQoZGF0ZSwgRGF0ZUVsZW1lbnQuRE9XKTtcclxuXHJcbiAgICBsZXQgYnJlYWtQYXJhbXM6IERhdGVCcmVha1BhcmFtcyA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuZ2V0TmV3RGF0ZUJyZWFrUGFyYW1zKCk7XHJcblxyXG4gICAgbGV0IGRhdGVNYWdpYzogbnVtYmVyID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5hXzJfZGF0ZShkYXRlLCB0aGlzLl9waWN0dXJlLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuXHJcbiAgICBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmRhdGVfYnJlYWtfZGF0ZW1vZGUoYnJlYWtQYXJhbXMsIGRhdGVNYWdpYywgdHJ1ZSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSk7XHJcblxyXG4gICAgbGV0IGRvd1JlYWw6IG51bWJlciA9IGJyZWFrUGFyYW1zLmRvdztcclxuICAgIGlmIChkb3dSZWFsICE9PSBkb3dSZWFsKVxyXG4gICAgICBkYXRlID0gdGhpcy5jaGFuZ2VEb3coZGF0ZSwgZG93UmVhbCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBTdHJpbmdCdWlsZGVyKGRhdGUpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAvLy8gPHN1bW1hcnk+Y2hlY2sgaWYgdGhlIGNvbWJpbmF0aW9uIG9mIEphcGFuZXNlIGVyYSBhbmQgeWVhciBpcyB2YWxpZC48L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3RyRGF0ZVwiPnVzZXIgaW5zZXJ0ZWQgc3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGRhdGUgc3RyaW5nIG9mIHByb3Blcmx5IEphcGFuZXNlIGVyYTwvcmV0dXJucz5cclxuICBwcml2YXRlIGNoZWNrSnBuRXJhWWVhcihzdHJEYXRlOiBzdHJpbmcpOiBTdHJpbmdCdWlsZGVyIHtcclxuXHJcbiAgICBsZXQgYnJlYWtQYXJhbXM6IERhdGVCcmVha1BhcmFtcyA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuZ2V0TmV3RGF0ZUJyZWFrUGFyYW1zKCk7XHJcbiAgICBsZXQgZGF0ZU1hZ2ljOiBudW1iZXIgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmFfMl9kYXRlKHN0ckRhdGUsIHRoaXMuX3BpY3R1cmUsIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG5cclxuICAgIERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuZGF0ZV9icmVha19kYXRlbW9kZShicmVha1BhcmFtcywgZGF0ZU1hZ2ljLCB0cnVlLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuXHJcbiAgICBsZXQgaW50WWVhckFEOiBudW1iZXIgPSBicmVha1BhcmFtcy55ZWFyO1xyXG4gICAgbGV0IGludERveTogbnVtYmVyID0gYnJlYWtQYXJhbXMuZG95O1xyXG5cclxuICAgIC8vIGdldCB0aGUgbmFtZSBhbmQgYSB5ZWFyIG9mIHRoZSBlcmFcclxuICAgIGxldCBzdHJFcmFBbHBoYTogc3RyaW5nO1xyXG4gICAgbGV0IHN0ckVyYUthbmppOiBzdHJpbmc7XHJcblxyXG4gICAgc3RyRXJhQWxwaGEgPSBVdGlsRGF0ZUpwbi5nZXRJbnN0YW5jZSgpLmRhdGVfanBuX3lyXzJfYShpbnRZZWFyQUQsIGludERveSwgZmFsc2UpO1xyXG4gICAgc3RyRXJhS2FuamkgPSBVdGlsRGF0ZUpwbi5nZXRJbnN0YW5jZSgpLmRhdGVfanBuX3lyXzJfYShpbnRZZWFyQUQsIGludERveSwgdHJ1ZSk7XHJcblxyXG4gICAgbGV0IHN0clllYXJKcG5FcmE6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgbGV0IG51bTogbnVtYmVyID0gVXRpbERhdGVKcG4uZ2V0SW5zdGFuY2UoKS5kYXRlX2pwbl95ZWFyX29mcyhpbnRZZWFyQUQsIGludERveSk7XHJcbiAgICBpZiAobnVtIDw9IDApIHtcclxuICAgICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKE1zZ0ludGVyZmFjZS5TVFJfRVJSX0RBVEUpO1xyXG4gICAgfVxyXG4gICAgaWYgKG51bSA8PSA5KSB7XHJcbiAgICAgIHN0clllYXJKcG5FcmEuQXBwZW5kKFwiMFwiKTtcclxuICAgIH1cclxuICAgIHN0clllYXJKcG5FcmEuQXBwZW5kKG51bS50b1N0cmluZygpKTtcclxuXHJcbiAgICAvLyBidWlsZCBhIHByb3Blcmx5IHllYXIgb2YgdGhlIGVyYVxyXG5cclxuICAgIC8vIEEgREJDUyBjaGFyYWN0ZXIgaW4gXCJzdHJcIiBjb25zdW1lcyB0d28gY2hhcmFjdGVycyBpbiBcIm1hc2tcIi5cclxuICAgIC8vIElmIFwic3RyXCIgY29udGFpbnMgREJDUywgdGhlIHBvc2l0aW9uIG9mIFwibWFza1wiIGhhcyB0byBza2lwIG5leHQgaW5kZXguXHJcbiAgICAvLyBUaGlzIHZhcmlhYmxlIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHNraXBwZWQgaW5kZXhlcy5cclxuICAgIGxldCBpbnRQaWNJZHhPZnM6IG51bWJlciA9IDA7XHJcbiAgICBmb3IgKGxldCBpbnRDbnQ6IG51bWJlciA9IDA7IGludENudCArIGludFBpY0lkeE9mcyA8IHRoaXMuX3BpY3R1cmUubGVuZ3RoOyBpbnRDbnQrKylcclxuICAgIHtcclxuICAgICAgc3dpdGNoICh0aGlzLl9waWN0dXJlLmNoYXJDb2RlQXQoaW50Q250ICsgaW50UGljSWR4T2ZzKSlcclxuICAgICAge1xyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfSlkxKTpcclxuICAgICAgICAgIHN0ckRhdGUgPSBVdGlsU3RyQnl0ZU1vZGUucmVwQyhzdHJEYXRlLCBzdHJFcmFBbHBoYSwgaW50Q250ICsgMSwgMSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19KWTIpOlxyXG4gICAgICAgICAgc3RyRGF0ZSA9IFV0aWxTdHJCeXRlTW9kZS5yZXBDKHN0ckRhdGUsIHN0ckVyYUthbmppLCBpbnRDbnQgKyAxLCAxKTtcclxuICAgICAgICAgIGludFBpY0lkeE9mcysrOyAvLyBQSUNfSlkyIGNvbnN1bWVzIDIgY2hhcmFjdGVycyBvZiBwaWN0dXJlICgxIG1vcmUgdGhhbiBzdHJEYXRlKVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfSlk0KTpcclxuICAgICAgICAgIHN0ckRhdGUgPSBVdGlsU3RyQnl0ZU1vZGUucmVwQyhzdHJEYXRlLCBzdHJFcmFLYW5qaSwgaW50Q250ICsgMSwgMik7XHJcbiAgICAgICAgICBpbnRDbnQrKzsgLy8gUElDX0pZNCBjb25zdW1lcyAyIGNoYXJhY3RlcnMgb2Ygc3RyRGF0ZVxyXG4gICAgICAgICAgaW50UGljSWR4T2ZzICs9IDI7IC8vIFBJQ19KWTQgY29uc3VtZXMgNCBjaGFyYWN0ZXJzIG9mIHBpY3R1cmUgKDIgbW9yZSB0aGFuIHN0ckRhdGUpXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19ZSik6XHJcbiAgICAgICAgICBzdHJEYXRlID0gVXRpbFN0ckJ5dGVNb2RlLnJlcEMoc3RyRGF0ZSwgc3RyWWVhckpwbkVyYS50b1N0cmluZygpLCBpbnRDbnQgKyAxLCAyKTtcclxuICAgICAgICAgIGludENudCsrOyAvLyBQSUNfWUogY29uc3VtZXMgMiBjaGFyYWN0ZXJzIG9mIHN0ckRhdGVcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgaWYgKGludENudCA8IHN0ckRhdGUubGVuZ3RoKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvLyBpZiBcInN0ckRhdGVcIiBjb250YWlucyBEQkNTLCB0aGUgbmV4dCBpbmRleCBvZiBcInBpY3R1cmVcIiBoYXMgdG8gYmUgc2tpcHBlZC5cclxuICAgICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0hhbGZXaWR0aChzdHJEYXRlW2ludENudF0pID09PSBmYWxzZSAmJiBVdGlsU3RyQnl0ZU1vZGUuaXNIYWxmV2lkdGgodGhpcy5fcGljdHVyZVtpbnRDbnQgKyBpbnRQaWNJZHhPZnNdKSA9PT0gdHJ1ZSlcclxuICAgICAgICAgICAgICBpbnRQaWNJZHhPZnMrKztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBTdHJpbmdCdWlsZGVyKHN0ckRhdGUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmdldCBtYXggbnVtYmVyIG9mIGRheSBpbiBtb250aDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ5ZWFyXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb250aFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBtYXggZGF5cyBbMjgtMzFdIG51bWJlcjwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldE1heERheUluTW9udGgoeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBhcnJheTogbnVtYmVyW10gPSBbXHJcbiAgICAgIDAsIDMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFcclxuICAgIF07XHJcbiAgICBsZXQgbGVhcHllYXI6IGJvb2xlYW4gPSB5ZWFyICUgNCA9PT0gMCAmJiAoeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwKTtcclxuXHJcbiAgICBpZiAobGVhcHllYXIgJiYgbW9udGggPT09IDIpXHJcbiAgICAgIHJldHVybiBhcnJheVttb250aF0gKyAxO1xyXG5cclxuICAgICByZXR1cm4gYXJyYXlbbW9udGhdO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmdldCBtb250aCBmb3IgZGF5LCB0aGFuIGRheSBoYXZlIG1hc2sgREREPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInllYXJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRheVwiPlswLTM2NV08L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gbnVtYmVyIG9mIG1vbnRoPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0TW9udGhCeURheSh5ZWFyOiBudW1iZXIsIGRheTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgTGVhcFllYXI6IGJvb2xlYW47XHJcblxyXG4gICAgTGVhcFllYXIgPSAoeWVhciAlIDQgPT09IDApICYmICgoeWVhciAlIDEwMCAhPT0gMCkgfHwgKHllYXIgJSA0MDAgPT09IDApKTtcclxuXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgUElDSW50ZXJmYWNlLmRhdGVfZGF5X3RhYi5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgaWYgKCFMZWFwWWVhcilcclxuICAgICAge1xyXG4gICAgICAgIGlmIChQSUNJbnRlcmZhY2UuZGF0ZV9kYXlfdGFiW2ldID49IGRheSlcclxuICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGlzIExlYXAgWWVhclxyXG4gICAgICBlbHNlXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoaSA8IDMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWYgKFBJQ0ludGVyZmFjZS5kYXRlX2RheV90YWJbaV0gPj0gZGF5KVxyXG4gICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gYWRkIDEgZGF5IGFmdGVyIHNlY29uZCBtb250aFxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZiAoUElDSW50ZXJmYWNlLmRhdGVfZGF5X3RhYltpXSArIDEgPj0gZGF5KVxyXG4gICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gLy8gZm9yIGxvb3BcclxuICAgIHJldHVybiBpOyAvLyB0aGUgZnVuY3Rpb24gY2Fubid0IGNhbWUgdG8gdGhlIHN0YXRlbWVudCBhbnl0aW1lXHJcbiAgfVxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PmdldCBZZWFyfE1vbnRofERheXxEb3cgb2YgZGF0ZVxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRhdGVcIj5kYXRlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJlbGVtZW50XCI+cmVxdWlyZWQgZGF0ZSBlbGVtZW50ICh5ZWFyL21vbnRoL2RheS9kb3cpIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPlllYXJ8TW9udGh8RGF5fERvdyBvZiBkYXRlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0RGF0ZUVsZW1lbnQoZGF0ZTogc3RyaW5nLCBlbGVtZW50OiBEYXRlRWxlbWVudCk6IG51bWJlciB7XHJcbiAgICBsZXQgYnVmZmVyOiBTdHJpbmcgPSBudWxsO1xyXG4gICAgbGV0IGxldHRlcnM6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZXhpdExvb3A6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBwaWNXZWVrVHlwZTogbnVtYmVyID0gUElDSW50ZXJmYWNlLlBJQ19XV1c7IC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgIGxldCBpc0pwbkVyYVllYXI6IGJvb2xlYW4gPSBmYWxzZTsgLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gICAgbGV0IGVyYV95ZWFyOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIEEgREJDUyBjaGFyYWN0ZXIgaW4gXCJkYXRlXCIgY29uc3VtZXMgdHdvIGNoYXJhY3RlcnMgaW4gXCJwaWN0dXJlXCIuXHJcbiAgICAvLyBJZiBcImRhdGVcIiBjb250YWlucyBEQkNTLCB0aGUgcG9zaXRpb24gb2YgXCJwaWN0dXJlXCIgaGFzIHRvIHNraXAgbmV4dCBpbmRleC5cclxuICAgIC8vIFRoaXMgdmFyaWFibGUgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2Ygc2tpcHBlZCBpbmRleGVzLlxyXG4gICAgbGV0IGludFBpY0lkeE9mczogbnVtYmVyID0gMDsgLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG5cclxuICAgIGxldCBtaW5MZW46IG51bWJlciA9IDA7XHJcblxyXG4gICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdKUE4oKSlcclxuICAgICAgbWluTGVuID0gVXRpbFN0ckJ5dGVNb2RlLmdldE1pbkxlblBpY3R1cmUoZGF0ZSwgdGhpcy5fcGljdHVyZSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIG1pbkxlbiA9IE1hdGgubWluKGRhdGUubGVuZ3RoLCB0aGlzLl9waWN0dXJlLmxlbmd0aCk7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSArIGludFBpY0lkeE9mcyA8IG1pbkxlbiAmJiAhZXhpdExvb3A7IGkrKylcclxuICAgIHtcclxuICAgICAgaWYgKHRoaXMuaXNEYXRhUG9zaXRpb25hbERpcmVjdGl2ZSh0aGlzLl9waWN0dXJlW2kgKyBpbnRQaWNJZHhPZnNdKSlcclxuICAgICAge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5fcGljdHVyZS5jaGFyQ29kZUF0KGkgKyBpbnRQaWNJZHhPZnMpKVxyXG4gICAgICAgIHtcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0REOlxyXG4gICAgICAgICAgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50LkRBWSlcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgMik7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpKys7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0RERDpcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5EQVkpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGUuc3Vic3RyKGksIDMpO1xyXG4gICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaSArPSAyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19EREREOlxyXG4gICAgICAgICAgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50LkRBWSlcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgMik7IC8vIG5vdCArNCBuZWVkIG5vdCBzdWZmaXggb2YgJ25kJywgJ3JkJywgJ3N0J1xyXG4gICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpICs9IDM7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX01NRDpcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5NT05USClcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgMik7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGkrKztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfTU1NOlxyXG4gICAgICAgICAgLy8gZ2V0IHNpemUgb2YgUElDX01NTSBibG9ja1xyXG4gICAgICAgICAgbGV0dGVycyA9IHRoaXMuZ2V0U2l6ZU9mQmxvY2soaSArIGludFBpY0lkeE9mcywgUElDSW50ZXJmYWNlLlBJQ19NTU0pO1xyXG4gICAgICAgICAgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50Lk1PTlRIKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBidWZmZXIgPSBkYXRlLnN1YnN0cihpLCBsZXR0ZXJzKTtcclxuICAgICAgICAgICAgZXhpdExvb3AgPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGkgKz0gbGV0dGVycyAtIDE7XHJcbiAgICAgICAgICBsZXR0ZXJzID0gMDtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWVk6XHJcbiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuWUVBUilcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgMik7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGkrKztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWVlZWTpcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5ZRUFSKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBidWZmZXIgPSBkYXRlLnN1YnN0cihpLCA0KTtcclxuICAgICAgICAgICAgZXhpdExvb3AgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaSArPSAzO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19XOlxyXG4gICAgICAgICAgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50LkRPVylcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgMSk7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfV1dXOlxyXG4gICAgICAgICAgbGV0dGVycyA9IHRoaXMuZ2V0U2l6ZU9mQmxvY2soaSArIGludFBpY0lkeE9mcywgUElDSW50ZXJmYWNlLlBJQ19XV1cpO1xyXG4gICAgICAgICAgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50LkRPVylcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgbGV0dGVycyk7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpICs9IGxldHRlcnMgLSAxO1xyXG4gICAgICAgICAgbGV0dGVycyA9IDA7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0hZWVlZWTpcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfSEw6XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0hERDpcclxuICAgICAgICAgIC8vIG5vdCBpbXBsZW1lbnRlZCBmb3IgaGVicmV3IHlldFxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19CQjogIC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAgICAgIGxldHRlcnMgPSB0aGlzLmdldFNpemVPZkJsb2NrKGkgKyBpbnRQaWNJZHhPZnMsIFBJQ0ludGVyZmFjZS5QSUNfQkIpO1xyXG5cclxuICAgICAgICAgIGlmIChpICsgTWF0aC5mbG9vcihsZXR0ZXJzIC8gMikgPCBkYXRlLmxlbmd0aClcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgTWF0aC5mbG9vcihsZXR0ZXJzIC8gMikpO1xyXG4gICAgICAgICAgICAvLyBpZiBkYXRlIGNvbnRhaW5zIERCQ1MsIHNvbWUgaW5kZXhlcyBvZiBwaWN0dXJlIGhhdmUgdG8gYmUgc2tpcHBlZC5cclxuICAgICAgICAgICAgaW50UGljSWR4T2ZzICs9IGxldHRlcnMgLSBidWZmZXIubGVuZ3RoO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5ET1cpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgICAgcGljV2Vla1R5cGUgPSBQSUNJbnRlcmZhY2UuUElDX0JCO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBidWZmZXIgPSBudWxsO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGkgKz0gbGV0dGVycyAtIDE7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0pZMTogIC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAgICAgIGlzSnBuRXJhWWVhciA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0pZMjogIC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAgICAgIGlzSnBuRXJhWWVhciA9IHRydWU7XHJcbiAgICAgICAgICBpbnRQaWNJZHhPZnMrKztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfSlk0OiAgLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gICAgICAgICAgaXNKcG5FcmFZZWFyID0gdHJ1ZTtcclxuICAgICAgICAgIGludFBpY0lkeE9mcyArPSAyO1xyXG4gICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ZSjogIC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5ZRUFSKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBidWZmZXIgPSBkYXRlLnN1YnN0cihpLCAyKTtcclxuICAgICAgICAgICAgZXhpdExvb3AgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfSAvLyBzd2l0Y2ggb2YgcG9zaXRpb25hbCBkaXJlY3RpdmVzXHJcbiAgICAgICAgfSAvLyBpZiBvZiBwb3NpdGlvbmFsIGRpcmVjdGl2ZXNcclxuICAgIH0gLy8gZm9yIGxvb3AgaW4gcGljdHVyZVxyXG5cclxuICAgIGlmIChidWZmZXIgPT0gbnVsbClcclxuICAgIHtcclxuICAgICAgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50LllFQVIpXHJcbiAgICAgICAgcmV0dXJuIERhdGVUaW1lLk5vdy5ZZWFyO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICB9XHJcblxyXG4gICAgYnVmZmVyID0gYnVmZmVyLnRyaW0oKTtcclxuXHJcbiAgICBpZiAobGV0dGVycyA+IDApXHJcbiAgICAvLyBpdCdzIFBJQ19XV1cgb3IgUElDX01NTVxyXG4gICAge1xyXG4gICAgICBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuTU9OVEgpXHJcbiAgICAgICAgbGV0dGVycyA9IHRoaXMuZ2V0TW9udGhPcldlZWsoYnVmZmVyLnRvU3RyaW5nKCksIGxldHRlcnMsIFBJQ0ludGVyZmFjZS5QSUNfTU1NKTtcclxuICAgICAgZWxzZSBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuRE9XKVxyXG4gICAgICAgIGxldHRlcnMgPSB0aGlzLmdldE1vbnRoT3JXZWVrKGJ1ZmZlci50b1N0cmluZygpLCBsZXR0ZXJzLCBwaWNXZWVrVHlwZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgIHdoaWxlIChidWZmZXIudG9TdHJpbmcoKS5zdGFydHNXaXRoKFwiMFwiKSB8fCBidWZmZXIudG9TdHJpbmcoKS5zdGFydHNXaXRoKFwiIFwiKSlcclxuICAgICAgICBidWZmZXIgPSBidWZmZXIudG9TdHJpbmcoKS5zdWJzdHIoMSk7XHJcbiAgICAgIGlmIChidWZmZXIubGVuZ3RoID09PSAwKVxyXG4gICAgICAgIGxldHRlcnMgPSAwO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgbGV0dGVycyA9IE5OdW1iZXIuUGFyc2UoYnVmZmVyLnRvU3RyaW5nKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5ZRUFSICYmIGlzSnBuRXJhWWVhcilcclxuICAgIHtcclxuICAgICAgLy8gZ2V0IHRoZSBzdGFydCB5ZWFyIG9mIHRoZSBlcmFcclxuICAgICAgZXJhX3llYXIgPSBVdGlsRGF0ZUpwbi5nZXRJbnN0YW5jZSgpLmdldFN0YXJ0WWVhck9mRXJhKGRhdGUsIHRoaXMuX3BpY3R1cmUpO1xyXG4gICAgICBpZiAoZXJhX3llYXIgPT09IDApXHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIGxldHRlcnMgKz0gZXJhX3llYXIgLSAxO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsZXR0ZXJzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoYW5nZSBkYXkgbnVtYmVyIGluIGRhdGUgZmllbGQgdG8gZGF5TWF4PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRhdGVcIj50byBjaGFuZ2UgZGF5IGludG88L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRheU1heFwiPnRoZSBuZXcgZGF5IHZhbHVlPC9wYXJhbT5cclxuICBwcml2YXRlIGNoYW5nZURvdyhkYXRlOiBzdHJpbmcsIGRvdzogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBpc0RhdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBsZXR0ZXJzOiBudW1iZXI7XHJcbiAgICBsZXQgc3RhcnRQYXJ0OiBzdHJpbmc7XHJcbiAgICBsZXQgZmluaXNoUGFydDogc3RyaW5nO1xyXG4gICAgbGV0IG51bWJlcjE6IHN0cmluZztcclxuXHJcbiAgICBudW1iZXIxID0gXCJcIiArIGRvdzsgLy8gXCIgXCJcclxuXHJcbiAgICAvLyBBIERCQ1MgY2hhcmFjdGVyIGluIFwiZGF0ZVwiIGNvbnN1bWVzIHR3byBjaGFyYWN0ZXJzIGluIFwicGljdHVyZVwiLlxyXG4gICAgLy8gSWYgXCJkYXRlXCIgY29udGFpbnMgREJDUywgdGhlIHBvc2l0aW9uIG9mIFwicGljdHVyZVwiIGhhcyB0byBza2lwIG5leHQgaW5kZXguXHJcbiAgICAvLyBUaGlzIHZhcmlhYmxlIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHNraXBwZWQgaW5kZXhlcy4gKEpQTjogREJDUyBzdXBwb3J0KVxyXG4gICAgbGV0IGludFBpY0lkeE9mczogbnVtYmVyID0gMDtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpICsgaW50UGljSWR4T2ZzIDwgdGhpcy5fcGljdHVyZS5sZW5ndGggJiYgIWlzRGF0ZTsgaSsrKVxyXG4gICAge1xyXG4gICAgICBpZiAodGhpcy5pc0RhdGFQb3NpdGlvbmFsRGlyZWN0aXZlKHRoaXMuX3BpY3R1cmVbaSArIGludFBpY0lkeE9mc10pKVxyXG4gICAgICB7XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLl9waWN0dXJlLmNoYXJDb2RlQXQoaSArIGludFBpY0lkeE9mcykpXHJcbiAgICAgICAge1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfVzpcclxuICAgICAgICAgIHN0YXJ0UGFydCA9IGRhdGUuc3Vic3RyKDAsIGkpO1xyXG4gICAgICAgICAgZmluaXNoUGFydCA9IGRhdGUuc3Vic3RyKGkgKyAxKTtcclxuICAgICAgICAgIGRhdGUgPSBzdGFydFBhcnQgKyBudW1iZXIxICsgZmluaXNoUGFydDtcclxuICAgICAgICAgIGlzRGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1dXVzpcclxuICAgICAgICAgIGxldHRlcnMgPSB0aGlzLmdldFNpemVPZkJsb2NrKGkgKyBpbnRQaWNJZHhPZnMsIFBJQ0ludGVyZmFjZS5QSUNfV1dXKTtcclxuICAgICAgICAgIHN0YXJ0UGFydCA9IGRhdGUuc3Vic3RyKDAsIGkpO1xyXG4gICAgICAgICAgZmluaXNoUGFydCA9IGRhdGUuc3Vic3RyKGkgKyBsZXR0ZXJzKTtcclxuICAgICAgICAgIGxldCBkYXlTdHI6IHN0cmluZyA9IEV2ZW50cy5HZXRNZXNzYWdlU3RyaW5nKE1zZ0ludGVyZmFjZS5EQVlTX1BUUik7XHJcbiAgICAgICAgICBsZXQgZGF5TmFtZXM6IHN0cmluZ1tdID0gRGF0ZVV0aWwuZ2V0TG9jYWxEYXlzKGRheVN0cik7XHJcbiAgICAgICAgICBudW1iZXIxID0gZGF5TmFtZXNbZG93XTtcclxuXHJcbiAgICAgICAgICBpZiAobnVtYmVyMS5sZW5ndGggPiBsZXR0ZXJzKVxyXG4gICAgICAgICAgICBudW1iZXIxID0gbnVtYmVyMS5zdWJzdHIoMCwgbGV0dGVycyk7XHJcbiAgICAgICAgICBlbHNlIGlmIChudW1iZXIxLmxlbmd0aCA8IGxldHRlcnMpXHJcbiAgICAgICAgICAgIHdoaWxlIChudW1iZXIxLmxlbmd0aCA8IGxldHRlcnMpXHJcbiAgICAgICAgICAgICAgbnVtYmVyMSA9IG51bWJlcjEgKyAnICc7XHJcbiAgICAgICAgICBkYXRlID0gc3RhcnRQYXJ0ICsgbnVtYmVyMSArIGZpbmlzaFBhcnQ7XHJcbiAgICAgICAgICBpc0RhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19CQjogIC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAgICAgIGxldHRlcnMgPSB0aGlzLmdldFNpemVPZkJsb2NrKGkgKyBpbnRQaWNJZHhPZnMsIFBJQ0ludGVyZmFjZS5QSUNfQkIpO1xyXG4gICAgICAgICAgLy8gXCJsZXR0ZXJzXCIgbWVhbnMgYSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBcInBpY3R1cmVcIlxyXG5cclxuICAgICAgICAgIHN0YXJ0UGFydCA9IGRhdGUuc3Vic3RyKDAsIGkpO1xyXG4gICAgICAgICAgZmluaXNoUGFydCA9IGRhdGUuc3Vic3RyKGkgKyBNYXRoLmZsb29yKGxldHRlcnMgLyAyKSk7XHJcbiAgICAgICAgICAvLyBcImxldHRlcnMgLyAyXCIgbWVhbnMgYSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBcImRhdGVcIlxyXG5cclxuICAgICAgICAgIG51bWJlcjEgPSBVdGlsRGF0ZUpwbi5nZXRTdHJEb3coZG93KTtcclxuXHJcbiAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmxlbkIobnVtYmVyMSkgPiBsZXR0ZXJzKVxyXG4gICAgICAgICAgICBudW1iZXIxID0gVXRpbFN0ckJ5dGVNb2RlLmxlZnRCKG51bWJlcjEsIGxldHRlcnMpO1xyXG4gICAgICAgICAgZWxzZSBpZiAoVXRpbFN0ckJ5dGVNb2RlLmxlbkIobnVtYmVyMSkgPCBsZXR0ZXJzKVxyXG4gICAgICAgICAgICB3aGlsZSAoVXRpbFN0ckJ5dGVNb2RlLmxlbkIobnVtYmVyMSkgPCBsZXR0ZXJzKVxyXG4gICAgICAgICAgICAgIG51bWJlcjEgPSBudW1iZXIxICsgJyAnO1xyXG4gICAgICAgICAgZGF0ZSA9IHN0YXJ0UGFydCArIG51bWJlcjEgKyBmaW5pc2hQYXJ0O1xyXG4gICAgICAgICAgaXNEYXRlID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkpXHJcbiAgICAgICAgICAvLyBKUE46IERCQ1Mgc3VwcG9ydFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoaSA8IGRhdGUubGVuZ3RoKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgLy8gaWYgXCJkYXRlXCIgY29udGFpbnMgREJDUywgdGhlIG5leHQgaW5kZXggb2YgXCJwaWN0dXJlXCIgaGFzIHRvIGJlIHNraXBwZWQuXHJcbiAgICAgICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0hhbGZXaWR0aChkYXRlW2ldKSA9PT0gZmFsc2UgJiYgVXRpbFN0ckJ5dGVNb2RlLmlzSGFsZldpZHRoKHRoaXMuX3BpY3R1cmVbaSArIGludFBpY0lkeE9mc10pID09PSB0cnVlKVxyXG4gICAgICAgICAgICAgICAgaW50UGljSWR4T2ZzKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICB9IC8vIHN3aXRjaFxyXG4gICAgICAgIH0gLy8gaWYgb2YgcG9zaXRpb25hbCBkaXJlY3RpdmVzXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGVjayAmIHZhbGlkYXRlIFRpbWUgZmllbGQgYnkgaGlzIG9sZC9uZXcgdmFsdWUgYW5kIDIgcGljdHVyZXM6XHJcbiAgLy8vIFJlYWwgYW5kIEVuYWJsZVxyXG4gIC8vLyAxLmNoZWNrIGlmIG5ld3ZhbHVlIGNvbXBsZXRlIHdpdGggcGljdHVyZXMsIG90aGVyd2lzZSByZXR1cm4gb2xkdmFsdWVcclxuICAvLy8gMi5jaGVjayBpZiBuZXd2YWx1ZSBjb21wbGV0ZSB3aXRoIHJhbmdlXHJcbiAgLy8vIDIuMSBjb21wbGV0ZSB2YWx1ZSwgaWYgcG9zc2libGUsIG90aGVyd2lzZSAgcmV0dXJuIG9sZHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IFN0cmluZyAtIG5ldyB2YWx1ZSBvZiB2YWxpZGF0ZWQgZmllbGQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjaGVja1RpbWVGaWVsZCgpOiBEYXRlIHtcclxuICAgIGxldCBuZXdUaW1lOiBEYXRlID0gbmV3IERhdGUgKHRoaXMuX25ld3ZhbHVlKTtcclxuXHJcblxyXG4gICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKGZhbHNlKTtcclxuXHJcbiAgICBpZiAodGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5pc0RhdGVaZXJvKHRoaXMuX25ld3ZhbHVlKSkge1xyXG4gICAgICAvLyBnZXQgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgZmllbGRcclxuICAgICAgbGV0IGRlZmF1bHRNZ1ZhbHVlOiBzdHJpbmcgPSB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZpZWxkKCkuZ2V0RGVmYXVsdFZhbHVlKCk7XHJcbiAgICAgIG5ld1RpbWUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AoZGVmYXVsdE1nVmFsdWUsIFwiXCIsIHRoaXMuX3ZhbERldC5nZXRQSUMoKSwgdHJ1ZSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcblxyXG4gICAgICAvLyByYW5nZSBvZiB0aGUgdGltZVxyXG4gICAgICBpZiAodGhpcy5fdmFsRGV0LmdldENvbnRpbnVvdXNSYW5nZVZhbHVlcygpICE9IG51bGwgfHwgdGhpcy5fdmFsRGV0LmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKSAhPSBudWxsKVxyXG4gICAgICAgIG5ld1RpbWUgPSB0aGlzLmZpbGxUaW1lQnlSYW5nZSh0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCksIHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCksIHRoaXMuX25ld3ZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXdUaW1lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkFkZCBmb3VuZCBpbiBuZXd2YWx1ZSBudW1iZXJzKDIob3IgMSkgbGV0dGVycykgdG8gYnVmZmVyIGFuZCByZXR1cm5cclxuICAvLy8gbGFzdCBmb3VuZCBudW1iZXIgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN1cnJWYWx1ZVwiPmluIG5ld3ZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJidWZmZXJcIj4vLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0eXBlXCI+d2hpY2ggdHlwZSBvZiBwb3NpdGlvbmFsIGRpcmVjdGl2ZSwgZm9yIGNoZWNraW5nIHZhbGlkaXR5PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGN1cnJWYWx1ZSBpbiBuZXd2YWx1ZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGFkZDJUaW1lKGN1cnJWYWx1ZTogbnVtYmVyLCBidWZmZXI6IFN0cmluZ0J1aWxkZXIsIHR5cGU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgc3RhcnQ6IG51bWJlciA9IGN1cnJWYWx1ZTtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgU1RSXzAwOiBTdHJpbmcgPSBcIjAwXCI7XHJcbiAgICBsZXQgIGN1cnJBZGQ6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG5cclxuICAgIHdoaWxlIChzdGFydCA8IHRoaXMuX25ld3ZhbHVlLmxlbmd0aCAmJiAhVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQodGhpcy5fbmV3dmFsdWVbc3RhcnRdKSlcclxuICAgIHtcclxuICAgICAgc3RhcnQrKzsgLy8gZmluZCBmaXJzdCBkaWdpdFxyXG4gICAgICAvLyBub24tZGlnaXRzIHdlcmUgZm91bmQgaW4gaW5wdXQgc3RyaW5nXHJcbiAgICAgIC8vIHdlIGRvIG5vdCB0aHJvdyBTVFJfRVJSX1RJTUUgZXhjZXB0aW9uIHRvIHByZXZlbnQgaW5wdXQgZGlnaXRzIGxvc3RcclxuICAgICAgLy8gb24gbm9uLWRpZ2l0cyBwbGFjZSBTVFJfMDAgd2lsbCBiZSBhZGRlZFxyXG4gICAgICAvLyBTaW5jZSBNYXNrIEVkaXRpbmcgLiBUaGlzIGVycm9yIGlzIGlycmVsZXZhbnQuIFRpbWUgbm93LCBhbHdheXMgY29udGFpbnMgbm9uIGRpZ2l0cyBsaWtlIDogYW5kIG1pZ2h0IGNvbnRhaW4gJyAnIGZvciB1bmZpbGxlZCBjaGFycy5cclxuICAgICAgLy8gVGhpcyBpcyBhIHZhbGlkIGNhc2UgYW5kIHdlIGRvIG5vdCB3YW50IGFuIGVycm9yIHBvcHBpbmcgYWJvdXQgaXQuXHJcbiAgICAgIC8vICBndWlNYW5hZ2VyLndyaXRlVG9NZXNzYWdlUGFuZSh2YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCksIENsaWVudE1hbmFnZXIuSW5zdGFuY2UuZ2V0TWVzc2FnZVN0cmluZyhTVFJfRVJSX1RJTUUpLCBTdGF0dXNCYXJNZXNzYWdlVHlwZS5TQl9SVU5USU1FX01TRyk7XHJcbiAgICAgIC8vICBzZXRWYWxpZGF0aW9uRmFpbGVkKHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdGFydCA9PT0gdGhpcy5fbmV3dmFsdWUubGVuZ3RoKVxyXG4gICAgLy8gbm90IGZvdW5kIG1vcmUgZGlnaXRzXHJcbiAgICB7XHJcbiAgICAgIGJ1ZmZlci5BcHBlbmQoU1RSXzAwLnRvU3RyaW5nKCkpO1xyXG4gICAgICByZXR1cm4gY3VyclZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyAyICYmIGkgPCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX25ld3ZhbHVlW2ldKSlcclxuICAgICAgICBjdXJyQWRkLkFwcGVuZCh0aGlzLl9uZXd2YWx1ZVtpXSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAge1xyXG4gICAgICAgIGN1cnJBZGQuSW5zZXJ0KDAsICcwJyk7IC8vIG9ubHkgMSBkaWdpdCBmb3VuZFxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGkgPT09IHRoaXMuX25ld3ZhbHVlLmxlbmd0aCAmJiBpID09PSBzdGFydCArIDEpXHJcbiAgICAgIGN1cnJBZGQuSW5zZXJ0KDAsICcwJyk7XHJcbiAgICAvLyBvbmx5IDEgZGlnaXQgZm91bmRcclxuICAgIGVsc2UgaWYgKGkgPT09IHRoaXMuX25ld3ZhbHVlLmxlbmd0aCAmJiBpID09PSBzdGFydClcclxuICAgICAgY3VyckFkZC5BcHBlbmQoU1RSXzAwLnRvU3RyaW5nKCkpO1xyXG5cclxuICAgIGxldCBhZGQ6IG51bWJlciA9IE5OdW1iZXIuUGFyc2UoY3VyckFkZC5Ub1N0cmluZygpKTtcclxuXHJcbiAgICAvKmlmIChhZGQgPCAwKVxyXG4gICAgY3VyckFkZD1uZXcgU3RyaW5nQnVmZmVyKFwiMDBcIik7XHJcbiAgICBlbHNlIGlmIChhZGQgPiA1OSAmJiB0eXBlPT1QSUNfTU1UKVxyXG4gICAgY3VyckFkZD1uZXcgU3RyaW5nQnVmZmVyKFwiNTlcIik7XHJcbiAgICBlbHNlIGlmIChhZGQgPiA1OSAmJiB0eXBlPT1QSUNfU1MpXHJcbiAgICBjdXJyQWRkPW5ldyBTdHJpbmdCdWZmZXIoXCI1OVwiKTsqL1xyXG4gICAgaWYgKGFkZCA8IDAgfHwgKGFkZCA+IDU5ICYmIHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1UKSB8fCAoYWRkID4gNTkgJiYgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19TUykpXHJcbiAgICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbihNc2dJbnRlcmZhY2UuU1RSX0VSUl9USU1FKTtcclxuICAgIGVsc2UgaWYgKHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfSEgpXHJcbiAgICB7XHJcbiAgICAgIGxldCBQTTogYm9vbGVhbiA9IHRoaXMuZ2V0SXNQTSgpO1xyXG4gICAgICBsZXQgbmV3U3RyOiBTdHJpbmcgPSBudWxsO1xyXG4gICAgICBsZXQgZGlmOiBudW1iZXI7XHJcblxyXG4gICAgICBpZiAoKGFkZCA+PSAxMiB8fCBhZGQgPT09IDApICYmIFBNKVxyXG4gICAgICB7XHJcbiAgICAgICAgbGV0IGFkZFRtcDogbnVtYmVyID0gYWRkICUgMjQ7XHJcblxyXG4gICAgICAgIHRoaXMuX2lzUG0gPSAoYWRkVG1wID49IDEyICYmIGFkZFRtcCA8IDI0KTtcclxuXHJcbiAgICAgICAgaWYgKGFkZFRtcCA+IDEyKVxyXG4gICAgICAgICAgZGlmID0gYWRkVG1wIC0gMTI7XHJcbiAgICAgICAgZWxzZSBpZiAoYWRkVG1wID09PSAwKVxyXG4gICAgICAgICAgZGlmID0gMTI7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgZGlmID0gYWRkVG1wO1xyXG5cclxuICAgICAgICBuZXdTdHIgPSAoKGRpZiA+IDkgPyBcIlwiIDogXCIwXCIpICsgZGlmKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChhZGQgPiA5OSAmJiAhUE0pXHJcbiAgICAgICAgbmV3U3RyID0gXCI5OVwiO1xyXG5cclxuICAgICAgaWYgKG5ld1N0ciAhPSBudWxsKVxyXG4gICAgICB7XHJcbiAgICAgICAgY3VyckFkZC5SZW1vdmUoMCwgY3VyckFkZC5MZW5ndGgpO1xyXG4gICAgICAgIGN1cnJBZGQuQXBwZW5kKG5ld1N0ci50b1N0cmluZygpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGJ1ZmZlci5BcHBlbmQoY3VyckFkZC5Ub1N0cmluZygpKTtcclxuICAgIHJldHVybiBpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkFwcGVuZCBQTSBvciBBTSB0byB0aW1lPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYWRkUE0yVGltZShjdXJyVmFsdWU6IG51bWJlciwgYnVmZmVyOiBTdHJpbmdCdWlsZGVyKTogbnVtYmVyIHtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcblxyXG4gICAgaWYgKChpID0gdGhpcy5fbmV3dmFsdWUudG9VcHBlckNhc2UoKS5pbmRleE9mKFwiQU1cIiwgY3VyclZhbHVlKSkgIT09IC0xKVxyXG4gICAge1xyXG4gICAgICBidWZmZXIuQXBwZW5kKFwiYW1cIik7XHJcbiAgICAgIHJldHVybiBpICsgMjtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgaWYgKChpID0gdGhpcy5fbmV3dmFsdWUudG9VcHBlckNhc2UoKS5pbmRleE9mKFwiUE1cIiwgY3VyclZhbHVlKSkgIT09IC0xKVxyXG4gICAgICB7XHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZChcInBtXCIpO1xyXG4gICAgICAgIHJldHVybiBpICsgMjtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLl9pc1BtKVxyXG4gICAgICB7XHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZChcInBtXCIpO1xyXG4gICAgICAgIHJldHVybiBjdXJyVmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoXCJhbVwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyVmFsdWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Q2hlY2sgaWYgd2hlcmUgaXMgJ1BNJyBwb3NpdGlvbmFsIGRpcmVjdGl2ZSBpbiB0aGUgVGltZSBQaWN0dXJlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSAtIHRoZXJlIGlzIFBNLCBlbHNlIGZhbHNlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0SXNQTSgpOiBib29sZWFuIHtcclxuXHJcbiAgICBmb3IgKGxldCBjdXJyOiBudW1iZXIgPSAwOyBjdXJyIDwgdGhpcy5fcGljdHVyZS5sZW5ndGg7IGN1cnIrKylcclxuICAgIHtcclxuICAgICAgaWYgKHRoaXMuX3BpY3R1cmUuY2hhckNvZGVBdChjdXJyKSA9PT0gUElDSW50ZXJmYWNlLlBJQ19QTSlcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbGxUaW1lQnlSYW5nZShDb250aW51b3VzUmFuZ2U6IExpc3Q8c3RyaW5nPiwgRGlzY3JldGVSYW5nZTogTGlzdDxzdHJpbmc+LCBidWZmZXI6IERhdGUpOiBEYXRlIHtcclxuICAgIGxldCAgcGljOiBQSUMgPSB0aGlzLl92YWxEZXQuZ2V0UElDKCk7XHJcbiAgICBsZXQgIGN1cnJUaW1lOiBudW1iZXIgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmZyb21OYXRpdmVUaW1lVG9NZ1RpbWVOdW1iZXIoYnVmZmVyLCBwaWMpO1xyXG4gICAgbGV0IGRvd25UaW1lOiBudW1iZXIsIHRvcFRpbWU6IG51bWJlcjtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcblxyXG4gICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKGZhbHNlKTtcclxuICAgIGlmIChDb250aW51b3VzUmFuZ2UgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IENvbnRpbnVvdXNSYW5nZS5sZW5ndGggLSAxOyBpKyspXHJcbiAgICAgIHtcclxuICAgICAgICBkb3duVGltZSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuYV8yX3RpbWUoQ29udGludW91c1JhbmdlLmdldF9JdGVtKGkpLCBwaWMsIGZhbHNlKTtcclxuICAgICAgICB0b3BUaW1lID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5hXzJfdGltZShDb250aW51b3VzUmFuZ2UuZ2V0X0l0ZW0oKytpKSwgcGljLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKGN1cnJUaW1lID49IGRvd25UaW1lICYmIGN1cnJUaW1lIDw9IHRvcFRpbWUpXHJcbiAgICAgICAgICByZXR1cm4gbmV3IERhdGUoYnVmZmVyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChEaXNjcmV0ZVJhbmdlICE9IG51bGwpXHJcbiAgICB7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBEaXNjcmV0ZVJhbmdlLmxlbmd0aDsgaSsrKVxyXG4gICAgICB7XHJcbiAgICAgICAgaWYgKGN1cnJUaW1lID09PSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmFfMl90aW1lKERpc2NyZXRlUmFuZ2UuZ2V0X0l0ZW0oaSksIHBpYywgZmFsc2UpKVxyXG4gICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGJ1ZmZlcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHRoZSB0aW1lIGlzIG5vdCBpbiB0aGUgcmFuZ2VcclxuICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAvLy8gU0VSVklDRSBmdW5jdGlvbnNcclxuICAvLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBwcmludCBFUlJPUiBwcm9tcHQgbWVzc2FnZSBhYm91dCByYW5nZSB0byBzdGF0dXMgYmFyPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ0lkXCI+b2YgZXJyb3IgTWVzc2FnZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2V0VmFsaWRhdGlvbkZhaWxkXCI+dmFsaWRhdGlvbiBmYWlsZWQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgcHJpbnRNZXNzYWdlKG1zZ0lkOiBzdHJpbmcsIHNldFZhbGlkYXRpb25GYWlsZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihcIlwiKTtcclxuICAgIGxldCBjdHJsVHlwZTogTWdDb250cm9sVHlwZTtcclxuXHJcbiAgICBpZiAobXNnSWQgPT09IE1zZ0ludGVyZmFjZS5FRFRfRVJSX1NUUl8xKVxyXG4gICAge1xyXG4gICAgICBsZXQgcGljOiBQSUMgPSB0aGlzLl92YWxEZXQuZ2V0UElDKCk7XHJcbiAgICAgIGxldCB0b2tlbjogc3RyaW5nID0gXCIlZFwiO1xyXG4gICAgICBsZXQgbWVzc2FnZVN0cmluZzogc3RyaW5nID0gRXZlbnRzLkdldE1lc3NhZ2VTdHJpbmcobXNnSWQpO1xyXG4gICAgICBtZXNzYWdlU3RyaW5nID0gU3RyVXRpbC5yZXBsYWNlU3RyaW5nVG9rZW5zKG1lc3NhZ2VTdHJpbmcsIHRva2VuLCAxLCBwaWMuZ2V0V2hvbGVzKCkudG9TdHJpbmcoKSk7XHJcbiAgICAgIG1lc3NhZ2VTdHJpbmcgPSBTdHJVdGlsLnJlcGxhY2VTdHJpbmdUb2tlbnMobWVzc2FnZVN0cmluZywgdG9rZW4sIDEsIHBpYy5nZXREZWMoKS50b1N0cmluZygpKTtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQobWVzc2FnZVN0cmluZyk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKEV2ZW50cy5HZXRNZXNzYWdlU3RyaW5nKG1zZ0lkKSk7XHJcbiAgICAgIGlmIChtc2dJZCA9PT0gTXNnSW50ZXJmYWNlLlNUUl9STkdfVFhUICYmIHRoaXMuX3ZhbERldC5nZXRSYW5nZSgpICE9IG51bGwpXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoU3RyVXRpbC5tYWtlUHJpbnRhYmxlVG9rZW5zKHRoaXMuX3ZhbERldC5nZXRSYW5nZSgpLCBIVE1MXzJfU1RSKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgY3RybFR5cGUgPSB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLlR5cGU7XHJcbiAgICAgIGlmIChjdHJsVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OICYmIGN0cmxUeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTyAmJiAhdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5pc1NlbGVjdGlvbkN0cmwoKSlcclxuICAgICAge1xyXG4gICAgICAgIGxldCBtc2dTdHJpbmc6IHN0cmluZyA9IG1lc3NhZ2UuVG9TdHJpbmcoKTtcclxuICAgICAgICB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuV3JpdGVUb01lc3NhZ2VQYW5lKFN0clV0aWwubWFrZVByaW50YWJsZTIobXNnU3RyaW5nKSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuRXJyb3JPY2N1cmVkID0gIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShtc2dTdHJpbmcpO1xyXG4gICAgICAgIHRoaXMuX3ZhbERldC5FcnJvck1lc3NhZ2UgPSBtZXNzYWdlLlRvU3RyaW5nKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChzZXRWYWxpZGF0aW9uRmFpbGQpXHJcbiAgICAvLyBmcm9tIHRoaXMgcG9pbnQgdGhlIGZvY3VzIHNlbmQgYmFjayB0byBjb250cm9sIGFuZCBzZXRWYWxpZGF0aW9uRmFpbGVkKHRydWUpIGNhbiBub3Qgc2V0IGl0IHRvIHRydWVcclxuICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkNoYW5nZSBpbnNpZGUgJ25ld3ZhbHVlJyBzdWJzdHJpbmcgb24gcG9zaXRpb24gJ2luZGV4JyB0byBzdHJpbmcgJ3RvJzwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJuZXd2YWx1ZVwiPnRvIGNoYW5nZSBpbnNpZGU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRvXCI+c3RyaW5nIHRvIGNoYW5nZSBieSBoaW08L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImluZGV4XCI+dGhlIHN1YnN0cmluZyB0byBjaGFuZ2Ugb24gdGhlIHBvc2l0aW9uPC9wYXJhbT5cclxuICBwcml2YXRlIGNoYW5nZVN0cmluZ0luc2lkZSh0bzogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9uZXd2YWx1ZSA9IHRoaXMuX25ld3ZhbHVlLnN1YnN0cigwLCBpbmRleCkgKyB0byArICB0aGlzLl9uZXd2YWx1ZS5zdWJzdHIoaW5kZXggKyB0by5sZW5ndGgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0KHZhbGlkYXRpb25EZXRhaWxzOiBWYWxpZGF0aW9uRGV0YWlscyk6IHZvaWQge1xyXG4gICAgdGhpcy5fdmFsRGV0ID0gdmFsaWRhdGlvbkRldGFpbHM7XHJcbiAgICB0aGlzLl92YWxEZXQuc2V0TnVsbChmYWxzZSk7XHJcbiAgICB0aGlzLl9pc1BtID0gZmFsc2U7XHJcbiAgICBsZXQgcElDOiBQSUMgPSB0aGlzLl92YWxEZXQuZ2V0UElDKCk7XHJcbiAgICB0aGlzLl9vbGR2YWx1ZSA9IHRoaXMuX3ZhbERldC5nZXRPbGRWYWx1ZSgpO1xyXG4gICAgdGhpcy5fbmV3dmFsdWUgPSB0aGlzLl92YWxEZXQuZ2V0RGlzcFZhbHVlKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX25ld3ZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgIGlmIChwSUMgPT0gbnVsbCAgfHwgcElDLmdldEF0dHIoKSAhPSBTdG9yYWdlQXR0cmlidXRlLkRBVEUpXHJcbiAgICAgICAgdGhpcy5fbmV3dmFsdWUgPSBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9vbGR2YWx1ZSA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9vbGR2YWx1ZSA9IFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCEocElDID09PSBudWxsIHx8IHBJQy5nZXRBdHRyKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiB8fCBwSUMuZ2V0QXR0cigpID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKSkge1xyXG4gICAgICB0aGlzLl9waWN0dXJlID0gcElDLmdldE1hc2soKTtcclxuICAgICAgdGhpcy5oZWJyZXcgPSBwSUMuaXNIZWJyZXcoKTtcclxuICAgICAgdGhpcy5fcGljdHVyZSA9IHRoaXMuX3BpY3R1cmUuc3Vic3RyKDAsIHBJQy5nZXRNYXNrU2l6ZSgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5SZXR1cm4gaW5kZXggb2YgTWF4IG1lbWJlciBpbiBhcnJheTwvc3VtbWFyeT5cclxuICBwcml2YXRlIGZpbmRNYXgoYXJyYXk6IG51bWJlcltdKTogbnVtYmVyIHtcclxuICAgIGxldCBpbmRleDogbnVtYmVyID0gMDtcclxuICAgIGxldCBtYXg6IG51bWJlciA9IGFycmF5W2luZGV4XTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPCBhcnJheS5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgaWYgKGFycmF5W2ldID4gbWF4KVxyXG4gICAgICB7XHJcbiAgICAgICAgbWF4ID0gYXJyYXlbaV07XHJcbiAgICAgICAgaW5kZXggPSBpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaW5kZXg7XHJcbiAgfVxyXG4gIC8vLyA8c3VtbWFyeT5pcyBjaGVja2VkIGNoYXIgRGF0YSBQb3NpdGlvbmFsIERpcmVjdGl2ZTwvc3VtbWFyeT5cclxuICBwcml2YXRlIGlzRGF0YVBvc2l0aW9uYWxEaXJlY3RpdmUodG9DaGVjazogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXNjaWk6IG51bWJlciA9IHRvQ2hlY2suY2hhckNvZGVBdCgwKTtcclxuICAgIHJldHVybiAoYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWVkgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWVlZWSB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19NTUQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1NXHJcbiAgICAgIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0REIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0RERCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19EREREIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX1dcclxuICAgICAgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfV1dXIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0hZWVlZWSB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ITCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19IREQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWUpcclxuICAgICAgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSlkxIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0pZMiB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfQkIpOyAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrIGlmIE51bWVyaWMgRGF0YSBQb3NpdGlvbmFsIERpcmVjdGl2ZSBleGlzdHM8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBpc0RhdGVQb3NpdGlvbmFsTnVtZXJpY0RpcmVjdGl2ZSh0b0NoZWNrOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBhc2NpaTogbnVtYmVyID0gdG9DaGVjay5jaGFyQ29kZUF0KDApO1xyXG4gICAgcmV0dXJuIChhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ZWSB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ZWVlZIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX01NRCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ERFxyXG4gICAgICB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19EREQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfRERERCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19XIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0hZWVlZWVxyXG4gICAgICB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ITCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19IREQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWUogfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSlkxXHJcbiAgICAgIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0pZMiB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfQkIpOyAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmlzIGNoZWNrZWQgY2hhciBOdW1lcmljIFBvc2l0aW9uYWwgRGlyZWN0aXZlPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgaXNOdW1lcmljUG9zaXRpb25hbERpcmVjdGl2ZSh0b0NoZWNrOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBhc2NpaTogbnVtYmVyID0gdG9DaGVjay5jaGFyQ29kZUF0KDApO1xyXG4gICAgcmV0dXJuIChhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19OKTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+aXMgY2hlY2tlZCBjaGFyIExvZ2ljIFBvc2l0aW9uYWwgRGlyZWN0aXZlPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgaXNMb2dpY1Bvc2l0aW9uYWxEaXJlY3RpdmUodG9DaGVjazogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXNjaWk6IG51bWJlciA9IHRvQ2hlY2suY2hhckNvZGVBdCgwKTtcclxuICAgIHJldHVybiAoYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWCk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkZpbmQgaWYgdGhlIGxldHRlciBhdCBpbmRleCBpcyBQb3NpdGlvbmFsIERhdGUgRGlyZWN0aXZlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNoYXJcIj50byBjaGVjayBpbiBwaWN0dXJlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgUG9zaXRpb25hbCBEYXRlIERpcmVjdGl2ZTsgZmFsc2Ugb3RoZXJ3aXNlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgaXNUaW1lUG9zaXRpb25hbERpcmVjdGl2ZSh0b0NoZWNrOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBhc2NpaTogbnVtYmVyID0gdG9DaGVjay5jaGFyQ29kZUF0KDApO1xyXG4gICAgcmV0dXJuIChhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ISCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19NTVQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfU1MgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfUE0gfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfTVMpO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5pcyBjaGVja2VkIHN0cmluZyBQb3NpdGlvbmFsIERpcmVjdGl2ZSBvZiBhbnkgdHlwZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmdWxsL3BhcnRcIj5vZiBwaWN0dXJlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBpbmRleCBvZiBkaXJlY3RpdmUgcG9zaXRpb24gb3IgLTEgaWYgbm90IGZvdW5kPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgaW5kZXhPZlBvc2l0aW9uYWxOb25EaXJlY3RpdmUoc3RyOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgbGV0IHRtcDogc3RyaW5nO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIHRtcCA9IHN0cltpXTtcclxuICAgICAgaWYgKERpc3BsYXlDb252ZXJ0b3IuaXNBbHBoYVBvc2l0aW9uYWxEaXJlY3RpdmUodG1wKSB8fCB0aGlzLmlzRGF0YVBvc2l0aW9uYWxEaXJlY3RpdmUodG1wKSB8fCB0aGlzLmlzTnVtZXJpY1Bvc2l0aW9uYWxEaXJlY3RpdmUodG1wKVxyXG4gICAgICAgIHx8IHRoaXMuaXNMb2dpY1Bvc2l0aW9uYWxEaXJlY3RpdmUodG1wKSB8fCB0aGlzLmlzVGltZVBvc2l0aW9uYWxEaXJlY3RpdmUodG1wKSlcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgcmV0dXJuIGk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gLTE7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHNldCB0aGUgXCJ2YWxpZGF0aW9uIGZhaWxlZFwiIGZsYWc8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsXCI+dmFsdWUgdG8gdXNlPC9wYXJhbT5cclxuICBwcml2YXRlIHNldFZhbGlkYXRpb25GYWlsZWQodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdmFsRGV0LlZhbGlkYXRpb25GYWlsZWQpXHJcbiAgICAgIHJldHVybjtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5fdmFsRGV0LnNldFZhbGlkYXRpb25GYWlsZWQodmFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQ291bnQgZGlnaXRzIGluIHN0cmluZyBiZWZvcmUgZGVsaW1ldGVyPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlucHV0U3RyaW5nXCI+LSBzdHJpbmcgdG8gbG9vayBpbnRvIGZvciBkZWxpbWV0ZXI8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNlYXJjaFN0YXJ0XCI+LSBpbml0aWFsIGluZGV4IHBvc2l0aW9uIGZvciBzZWFyY2ggaW4gaW5wdXRTdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRlbGltZXRlclwiPndlIGFyZSBsb29raW5nIGZvcjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBkaWdpdHNCZWZvcmVEZWxpbWV0ZXIoaW5wdXRTdHJpbmc6IHN0cmluZywgc2VhcmNoU3RhcnQ6IG51bWJlciwgZGVsaW1ldGVyOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgbGV0IGNvdW50ZXI6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgc2VhcmNoRW5kUG9zOiBudW1iZXIgPSBpbnB1dFN0cmluZy5pbmRleE9mKGRlbGltZXRlciwgc2VhcmNoU3RhcnQpO1xyXG5cclxuICAgIGlmIChzZWFyY2hFbmRQb3MgPCAwKVxyXG4gICAgICBzZWFyY2hFbmRQb3MgPSBpbnB1dFN0cmluZy5sZW5ndGg7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gc2VhcmNoU3RhcnQ7IGkgPCBzZWFyY2hFbmRQb3M7IGkrKylcclxuICAgIGlmIChOQ2hhci5Jc0RpZ2l0KGlucHV0U3RyaW5nW2ldKSlcclxuICAgICAgY291bnRlcisrO1xyXG5cclxuICAgIHJldHVybiBjb3VudGVyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBieSBDdHJsK1UgKFNldCB0byBOdWxsKSwgbnVsbCBkaXNwbGF5IHZhbHVlIGlzIHNldCB0byBjdHJsLiBJbiB0aGlzIGNhc2Ugd2UgbmVlZCBmb2xsb3dpbmcgY2hlY2tpbmcgLCBpbiBvcmRlciB0byBzZXQgZmllbGQgdG8gbnVsbC48L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsXCI+LSBlbnRlcmVkIHZhbHVlIHRvIHZhbHVlIHRvIGNoZWNrPC9wYXJhbT5cclxuICBwcml2YXRlIGlzTnVsbERpc3BsYXlWYWwoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNOdWxsRGlzcGxheVZhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGZpZWxkOiBHdWlGaWVsZEJhc2UgPSB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZpZWxkKCk7XHJcblxyXG4gICAgaWYgKGZpZWxkLk51bGxBbGxvd2VkICYmIGZpZWxkLmhhc051bGxEaXNwbGF5VmFsdWUoKSlcclxuICAgIHtcclxuICAgICAgbGV0IGRpc3BEZWZWYWx1ZTogYW55ID0gZmllbGQuZ2V0TnVsbERpc3BsYXkoKTtcclxuICAgICAgaWYgKGRpc3BEZWZWYWx1ZSAhPT0gbnVsbClcclxuICAgICAgICBpc051bGxEaXNwbGF5VmFsID0gKGRpc3BEZWZWYWx1ZS50b1N0cmluZygpID09PSB0aGlzLl9uZXd2YWx1ZSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBpc051bGxEaXNwbGF5VmFsID0gKHRoaXMuX25ld3ZhbHVlID09PSBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNOdWxsRGlzcGxheVZhbDtcclxuICB9XHJcbn1cclxuIl19