@magic-xpa/gui 4.1200.0-dev4120.2 → 4.1200.0-dev4120.201
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.
- package/fesm2022/magic-xpa-gui.mjs +5724 -249
- package/fesm2022/magic-xpa-gui.mjs.map +1 -1
- package/index.d.ts +3 -0
- package/package.json +2 -4
- package/src/GuiEnums.d.ts +3 -0
- package/src/gui/GuiMgControl.d.ts +1 -0
- package/src/management/exp/ExpressionInterface.d.ts +1 -0
- package/src/management/gui/MgControlBase.d.ts +1 -1
- package/src/management/gui/PropInterface.d.ts +2 -1
- package/esm2022/index.mjs +0 -71
- package/esm2022/magic-xpa-gui.mjs +0 -2
- package/esm2022/src/Commands.mjs +0 -184
- package/esm2022/src/Events.mjs +0 -425
- package/esm2022/src/EventsProcessor.mjs +0 -67
- package/esm2022/src/FocusManager.mjs +0 -34
- package/esm2022/src/GuiConstants.mjs +0 -68
- package/esm2022/src/GuiEnums.mjs +0 -301
- package/esm2022/src/GuiEnvironment.mjs +0 -4
- package/esm2022/src/IFlowMonitorQueue.mjs +0 -2
- package/esm2022/src/Manager.mjs +0 -91
- package/esm2022/src/UIBridge.mjs +0 -33
- package/esm2022/src/env/IEnvironment.mjs +0 -2
- package/esm2022/src/gui/ControlBase.mjs +0 -3
- package/esm2022/src/gui/GuiMgControl.mjs +0 -123
- package/esm2022/src/gui/GuiMgForm.mjs +0 -4
- package/esm2022/src/gui/KeyboardItem.mjs +0 -135
- package/esm2022/src/gui/LastFocusedVal.mjs +0 -11
- package/esm2022/src/gui/MgValue.mjs +0 -16
- package/esm2022/src/gui/PropParentInterface.mjs +0 -2
- package/esm2022/src/gui/low/DialogHandler.mjs +0 -7
- package/esm2022/src/gui/low/GuiCommand.mjs +0 -68
- package/esm2022/src/gui/low/GuiCommandQueue.mjs +0 -35
- package/esm2022/src/gui/low/GuiInteractive.mjs +0 -178
- package/esm2022/src/gui/low/Style.mjs +0 -20
- package/esm2022/src/management/RuntimeContextBase.mjs +0 -42
- package/esm2022/src/management/data/BlobType.mjs +0 -281
- package/esm2022/src/management/data/DcValues.mjs +0 -214
- package/esm2022/src/management/data/DcValuesBuilderBase.mjs +0 -96
- package/esm2022/src/management/data/FieldDef.mjs +0 -331
- package/esm2022/src/management/data/FieldsTable.mjs +0 -54
- package/esm2022/src/management/data/GuiDataViewBase.mjs +0 -88
- package/esm2022/src/management/data/GuiFieldBase.mjs +0 -82
- package/esm2022/src/management/data/IRecord.mjs +0 -2
- package/esm2022/src/management/data/IReferencedObject.mjs +0 -2
- package/esm2022/src/management/data/NUM_TYPE.mjs +0 -1739
- package/esm2022/src/management/data/ObjectReferenceBase.mjs +0 -48
- package/esm2022/src/management/data/ObjectReferencesCollection.mjs +0 -27
- package/esm2022/src/management/data/RecordUtils.mjs +0 -361
- package/esm2022/src/management/data/VectorType.mjs +0 -612
- package/esm2022/src/management/data/VectorTypeBase.mjs +0 -88
- package/esm2022/src/management/events/IActionManager.mjs +0 -2
- package/esm2022/src/management/events/IGuiEventsManager.mjs +0 -2
- package/esm2022/src/management/exp/ExpressionInterface.mjs +0 -244
- package/esm2022/src/management/exp/GuiExpressionEvaluator.mjs +0 -305
- package/esm2022/src/management/gui/ControlTable.mjs +0 -118
- package/esm2022/src/management/gui/DisplayConvertor.mjs +0 -1649
- package/esm2022/src/management/gui/FieldValidator.mjs +0 -711
- package/esm2022/src/management/gui/GuiControlPropertyAdapter.mjs +0 -24
- package/esm2022/src/management/gui/GuiFormPropertyAdapter.mjs +0 -11
- package/esm2022/src/management/gui/HebrewDate.mjs +0 -278
- package/esm2022/src/management/gui/Helps.mjs +0 -237
- package/esm2022/src/management/gui/MgControlBase.mjs +0 -1869
- package/esm2022/src/management/gui/MgFormBase.mjs +0 -741
- package/esm2022/src/management/gui/PIC.mjs +0 -1185
- package/esm2022/src/management/gui/PropDefaults.mjs +0 -230
- package/esm2022/src/management/gui/PropInterface.mjs +0 -246
- package/esm2022/src/management/gui/PropTable.mjs +0 -221
- package/esm2022/src/management/gui/Property.mjs +0 -1362
- package/esm2022/src/management/gui/ValidationDetails.mjs +0 -248
- package/esm2022/src/management/gui/ValidationDetailsBase.mjs +0 -93
- package/esm2022/src/management/gui/WrongFormatException.mjs +0 -29
- package/esm2022/src/management/tasks/GuiDataCollection.mjs +0 -4
- package/esm2022/src/management/tasks/GuiTaskBase.mjs +0 -511
- package/esm2022/src/management/tasks/IMGDataTable.mjs +0 -2
- package/esm2022/src/management/tasks/ITask.mjs +0 -2
- package/esm2022/src/management/tasks/MgTimer.mjs +0 -21
- package/esm2022/src/management/tasks/TaskDefinitionId.mjs +0 -54
- package/esm2022/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +0 -41
- package/esm2022/src/util/MemoryUtil.mjs +0 -35
- package/esm2022/src/util/ObjectReference.mjs +0 -36
- package/esm2022/src/util/UsernamePasswordCredentials.mjs +0 -52
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
import { Base64, HelpType, XMLConstants, XmlParser } from "@magic-xpa/utils";
|
|
2
|
-
import { Encoding, NNumber, List, NString } from "@magic-xpa/mscorelib";
|
|
3
|
-
import { Events } from "../../Events";
|
|
4
|
-
export class MagicHelp {
|
|
5
|
-
}
|
|
6
|
-
export class InternalHelp extends MagicHelp {
|
|
7
|
-
val = null;
|
|
8
|
-
Name = null;
|
|
9
|
-
FrameX = 0;
|
|
10
|
-
FrameY = 0;
|
|
11
|
-
FrameDx = 0;
|
|
12
|
-
FrameDy = 0;
|
|
13
|
-
SizedX = 0;
|
|
14
|
-
SizedY = 0;
|
|
15
|
-
FactorX = 0;
|
|
16
|
-
FactorY = 0;
|
|
17
|
-
Borderstyle = 0;
|
|
18
|
-
TitleBar = 0;
|
|
19
|
-
FontTableIndex = 0;
|
|
20
|
-
GetHelpType() {
|
|
21
|
-
return HelpType.Internal;
|
|
22
|
-
}
|
|
23
|
-
constructor() {
|
|
24
|
-
super();
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
export class PromptpHelp extends MagicHelp {
|
|
28
|
-
PromptHelpText = null;
|
|
29
|
-
GetHelpType() {
|
|
30
|
-
return HelpType.Prompt;
|
|
31
|
-
}
|
|
32
|
-
constructor() {
|
|
33
|
-
super();
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
export class ToolTipHelp extends MagicHelp {
|
|
37
|
-
tooltipHelpText = null;
|
|
38
|
-
GetHelpType() {
|
|
39
|
-
return HelpType.Tooltip;
|
|
40
|
-
}
|
|
41
|
-
constructor() {
|
|
42
|
-
super();
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
export class URLHelp extends MagicHelp {
|
|
46
|
-
urlHelpText = null;
|
|
47
|
-
GetHelpType() {
|
|
48
|
-
return HelpType.URL;
|
|
49
|
-
}
|
|
50
|
-
constructor() {
|
|
51
|
-
super();
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
export class WindowsHelp extends MagicHelp {
|
|
55
|
-
FilePath = null;
|
|
56
|
-
HelpCommand;
|
|
57
|
-
HelpKey = null;
|
|
58
|
-
GetHelpType() {
|
|
59
|
-
return HelpType.Windows;
|
|
60
|
-
}
|
|
61
|
-
constructor() {
|
|
62
|
-
super();
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
export class Helps {
|
|
66
|
-
_helps = null;
|
|
67
|
-
constructor() {
|
|
68
|
-
this._helps = new List();
|
|
69
|
-
}
|
|
70
|
-
fillData(parser) {
|
|
71
|
-
while (this.initInnerObjects(parser.getNextTag(), parser)) {
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
initInnerObjects(foundTagName, parser) {
|
|
75
|
-
if (foundTagName === null)
|
|
76
|
-
return false;
|
|
77
|
-
if (foundTagName === XMLConstants.MG_TAG_HELPTABLE) {
|
|
78
|
-
let currrentIndex = parser.getCurrIndex();
|
|
79
|
-
let encoded = parser.ReadContentOfCurrentElement().trim();
|
|
80
|
-
let decoded = Base64.decode(encoded.substr(0, encoded.length).trim(), Encoding.UTF8);
|
|
81
|
-
let newXmlData = parser.getXMLdata().replace(encoded.trim(), decoded);
|
|
82
|
-
parser.setXMLdata(newXmlData);
|
|
83
|
-
parser.setCurrIndex(currrentIndex);
|
|
84
|
-
parser.setCurrIndex(parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex()) +
|
|
85
|
-
1);
|
|
86
|
-
}
|
|
87
|
-
else if (foundTagName === XMLConstants.MG_TAG_HELPITEM) {
|
|
88
|
-
let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_TERM, parser.getCurrIndex());
|
|
89
|
-
if (endContext !== -1 && endContext < parser.getXMLdata().length) {
|
|
90
|
-
let tag = parser.getXMLsubstring(endContext);
|
|
91
|
-
parser.add2CurrIndex(tag.indexOf(XMLConstants.MG_TAG_HELPITEM) +
|
|
92
|
-
XMLConstants.MG_TAG_HELPITEM.length);
|
|
93
|
-
let tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
|
|
94
|
-
this.fillHelpItem(tokensVector);
|
|
95
|
-
parser.setCurrIndex(endContext + XMLConstants.TAG_TERM.length);
|
|
96
|
-
return true;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
else if (foundTagName === "/" + XMLConstants.MG_TAG_HELPTABLE) {
|
|
100
|
-
parser.setCurrIndex2EndOfTag();
|
|
101
|
-
return false;
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
Events.WriteExceptionToLog("in Command.FillData() out of string bounds");
|
|
105
|
-
return false;
|
|
106
|
-
}
|
|
107
|
-
return true;
|
|
108
|
-
}
|
|
109
|
-
fillHelpItem(tokensVector) {
|
|
110
|
-
let j = 0;
|
|
111
|
-
let attribute = tokensVector.get_Item(j);
|
|
112
|
-
let valueStr = tokensVector.get_Item(j + 1);
|
|
113
|
-
let hlpType = XmlParser.unescape(valueStr).toString();
|
|
114
|
-
switch (hlpType) {
|
|
115
|
-
case XMLConstants.MG_ATTR_HLP_TYP_TOOLTIP:
|
|
116
|
-
let toolTipHelp = new ToolTipHelp();
|
|
117
|
-
for (j = 2; j < tokensVector.length; j = j + 2) {
|
|
118
|
-
attribute = tokensVector.get_Item(j);
|
|
119
|
-
valueStr = tokensVector.get_Item(j + 1);
|
|
120
|
-
if (attribute === XMLConstants.MG_ATTR_VALUE) {
|
|
121
|
-
toolTipHelp.tooltipHelpText = XmlParser.unescape(valueStr).toString();
|
|
122
|
-
}
|
|
123
|
-
else
|
|
124
|
-
Events.WriteExceptionToLog(NString.Format("There is no such tag in <helptable><helpitem ..>.Insert case to HelpTable.FillHelpItem for {0}", attribute));
|
|
125
|
-
}
|
|
126
|
-
this._helps.push(toolTipHelp);
|
|
127
|
-
break;
|
|
128
|
-
case XMLConstants.MG_ATTR_HLP_TYP_PROMPT:
|
|
129
|
-
let promptpHelp = new PromptpHelp();
|
|
130
|
-
for (j = 2; j < tokensVector.length; j = j + 2) {
|
|
131
|
-
attribute = tokensVector.get_Item(j);
|
|
132
|
-
valueStr = tokensVector.get_Item(j + 1);
|
|
133
|
-
if (attribute === XMLConstants.MG_ATTR_VALUE) {
|
|
134
|
-
promptpHelp.PromptHelpText = XmlParser.unescape(valueStr).toString();
|
|
135
|
-
}
|
|
136
|
-
else
|
|
137
|
-
Events.WriteExceptionToLog(NString.Format("There is no such tag in <helptable><helpitem ..>.Insert case to HelpTable.FillHelpItem for {0}", attribute));
|
|
138
|
-
}
|
|
139
|
-
this._helps.push(promptpHelp);
|
|
140
|
-
break;
|
|
141
|
-
case XMLConstants.MG_ATTR_HLP_TYP_URL:
|
|
142
|
-
let urlHelp = new URLHelp();
|
|
143
|
-
for (j = 2; j < tokensVector.length; j = j + 2) {
|
|
144
|
-
attribute = tokensVector.get_Item(j);
|
|
145
|
-
valueStr = tokensVector.get_Item(j + 1);
|
|
146
|
-
if (attribute === XMLConstants.MG_ATTR_VALUE)
|
|
147
|
-
urlHelp.urlHelpText = valueStr;
|
|
148
|
-
else
|
|
149
|
-
Events.WriteExceptionToLog(NString.Format("There is no such tag in <helptable><helpitem ..>.Insert case to HelpTable.FillHelpItem for {0}", attribute));
|
|
150
|
-
}
|
|
151
|
-
this._helps.push(urlHelp);
|
|
152
|
-
break;
|
|
153
|
-
case XMLConstants.MG_ATTR_HLP_TYP_INTERNAL:
|
|
154
|
-
let internalHelpWindowDetails = new InternalHelp();
|
|
155
|
-
for (j = 2; j < tokensVector.length; j += 2) {
|
|
156
|
-
attribute = tokensVector.get_Item(j);
|
|
157
|
-
valueStr = tokensVector.get_Item(j + 1);
|
|
158
|
-
if (attribute === XMLConstants.MG_ATTR_VALUE) {
|
|
159
|
-
internalHelpWindowDetails.val = XmlParser.unescape(valueStr).toString();
|
|
160
|
-
}
|
|
161
|
-
else if (attribute === XMLConstants.MG_ATTR_INTERNAL_HELP_NAME) {
|
|
162
|
-
internalHelpWindowDetails.Name = XmlParser.unescape(valueStr).toString();
|
|
163
|
-
}
|
|
164
|
-
else if (attribute === XMLConstants.MG_ATTR_INTERNAL_HELP_FRAMEX) {
|
|
165
|
-
internalHelpWindowDetails.FrameX = NNumber.Parse(XmlParser.unescape(valueStr));
|
|
166
|
-
}
|
|
167
|
-
else if (attribute === XMLConstants.MG_ATTR_INTERNAL_HELP_FRAMEY) {
|
|
168
|
-
internalHelpWindowDetails.FrameY = NNumber.Parse(XmlParser.unescape(valueStr));
|
|
169
|
-
}
|
|
170
|
-
else if (attribute === XMLConstants.MG_ATTR_INTERNAL_HELP_FRAMEDX) {
|
|
171
|
-
internalHelpWindowDetails.FrameDx = NNumber.Parse(XmlParser.unescape(valueStr));
|
|
172
|
-
}
|
|
173
|
-
else if (attribute === XMLConstants.MG_ATTR_INTERNAL_HELP_FRAMEDY) {
|
|
174
|
-
internalHelpWindowDetails.FrameDy = NNumber.Parse(XmlParser.unescape(valueStr));
|
|
175
|
-
}
|
|
176
|
-
else if (attribute === XMLConstants.MG_ATTR_INTERNAL_HELP_SIZEDX) {
|
|
177
|
-
internalHelpWindowDetails.SizedX = NNumber.Parse(XmlParser.unescape(valueStr));
|
|
178
|
-
}
|
|
179
|
-
else if (attribute === XMLConstants.MG_ATTR_INTERNAL_HELP_SIZEDY) {
|
|
180
|
-
internalHelpWindowDetails.SizedY = NNumber.Parse(XmlParser.unescape(valueStr));
|
|
181
|
-
}
|
|
182
|
-
else if (attribute === XMLConstants.MG_ATTR_INTERNAL_HELP_FACTORX) {
|
|
183
|
-
internalHelpWindowDetails.FactorX = NNumber.Parse(XmlParser.unescape(valueStr));
|
|
184
|
-
}
|
|
185
|
-
else if (attribute === XMLConstants.MG_ATTR_INTERNAL_HELP_FACTORY) {
|
|
186
|
-
internalHelpWindowDetails.FactorY = NNumber.Parse(XmlParser.unescape(valueStr));
|
|
187
|
-
}
|
|
188
|
-
else if (attribute === XMLConstants.MG_ATTR_INTERNAL_HELP_BORDERSTYLE) {
|
|
189
|
-
internalHelpWindowDetails.Borderstyle = NNumber.Parse(XmlParser.unescape(valueStr));
|
|
190
|
-
}
|
|
191
|
-
else if (attribute === XMLConstants.MG_ATTR_INTERNAL_TITLE_BAR) {
|
|
192
|
-
internalHelpWindowDetails.TitleBar = NNumber.Parse(XmlParser.unescape(valueStr));
|
|
193
|
-
}
|
|
194
|
-
else if (attribute === XMLConstants.MG_ATTR_INTERNAL_HELP_SYSTEM_MENU) {
|
|
195
|
-
}
|
|
196
|
-
else if (attribute === XMLConstants.MG_ATTR_INTERNAL_HELP_FONT_TABLE_INDEX) {
|
|
197
|
-
internalHelpWindowDetails.FontTableIndex = NNumber.Parse(XmlParser.unescape(valueStr));
|
|
198
|
-
}
|
|
199
|
-
else
|
|
200
|
-
Events.WriteExceptionToLog(NString.Format("There is no such tag in <helptable><helpitem ..>.Insert case to HelpTable.FillHelpItem for {0}", attribute));
|
|
201
|
-
}
|
|
202
|
-
this._helps.push(internalHelpWindowDetails);
|
|
203
|
-
break;
|
|
204
|
-
case XMLConstants.MG_ATTR_HLP_TYP_WINDOWS:
|
|
205
|
-
let wndHelpDetails = new WindowsHelp();
|
|
206
|
-
for (j = 2; j < tokensVector.length; j = j + 2) {
|
|
207
|
-
attribute = tokensVector.get_Item(j);
|
|
208
|
-
valueStr = tokensVector.get_Item(j + 1);
|
|
209
|
-
if (attribute === XMLConstants.MG_ATTR_WINDOWS_HELP_FILE) {
|
|
210
|
-
wndHelpDetails.FilePath = valueStr;
|
|
211
|
-
}
|
|
212
|
-
else if (attribute === XMLConstants.MG_ATTR_WINDOWS_HELP_COMMAND) {
|
|
213
|
-
wndHelpDetails.HelpCommand = NNumber.Parse(valueStr);
|
|
214
|
-
}
|
|
215
|
-
else if (attribute === XMLConstants.MG_ATTR_WINDOWS_HELP_KEY) {
|
|
216
|
-
wndHelpDetails.HelpKey = XmlParser.unescape(valueStr).toString();
|
|
217
|
-
}
|
|
218
|
-
else
|
|
219
|
-
Events.WriteExceptionToLog(NString.Format("There is no such tag in <helptable><helpitem ..>.Insert case to HelpTable.FillHelpItem for {0}", attribute));
|
|
220
|
-
}
|
|
221
|
-
this._helps.push(wndHelpDetails);
|
|
222
|
-
break;
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
getHelp(idx) {
|
|
226
|
-
let flag = idx < 0 || idx >= this._helps.length;
|
|
227
|
-
let result;
|
|
228
|
-
if (flag) {
|
|
229
|
-
result = null;
|
|
230
|
-
}
|
|
231
|
-
else {
|
|
232
|
-
result = this._helps.get_Item(idx);
|
|
233
|
-
}
|
|
234
|
-
return result;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGVscHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL21hbmFnZW1lbnQvZ3VpL0hlbHBzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQWUsUUFBUSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRixPQUFPLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDdEUsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUtwQyxNQUFNLE9BQWdCLFNBQVM7Q0FFOUI7QUFLRCxNQUFNLE9BQU8sWUFBYSxTQUFRLFNBQVM7SUFDekMsR0FBRyxHQUFXLElBQUksQ0FBQztJQUNuQixJQUFJLEdBQVcsSUFBSSxDQUFDO0lBQ3BCLE1BQU0sR0FBVyxDQUFDLENBQUM7SUFDbkIsTUFBTSxHQUFXLENBQUMsQ0FBQztJQUNuQixPQUFPLEdBQVcsQ0FBQyxDQUFDO0lBQ3BCLE9BQU8sR0FBVyxDQUFDLENBQUM7SUFDcEIsTUFBTSxHQUFXLENBQUMsQ0FBQztJQUNuQixNQUFNLEdBQVcsQ0FBQyxDQUFDO0lBQ25CLE9BQU8sR0FBVyxDQUFDLENBQUM7SUFDcEIsT0FBTyxHQUFXLENBQUMsQ0FBQztJQUNwQixXQUFXLEdBQVcsQ0FBQyxDQUFDO0lBQ3hCLFFBQVEsR0FBVyxDQUFDLENBQUM7SUFDckIsY0FBYyxHQUFXLENBQUMsQ0FBQztJQUUzQixXQUFXO1FBQ1QsT0FBTyxRQUFRLENBQUMsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRDtRQUNFLEtBQUssRUFBRSxDQUFDO0lBQ1YsQ0FBQztDQUNGO0FBS0QsTUFBTSxPQUFPLFdBQVksU0FBUSxTQUFTO0lBQ3hDLGNBQWMsR0FBVyxJQUFJLENBQUM7SUFFOUIsV0FBVztRQUNULE9BQU8sUUFB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QUNILENBQUM7SUFFRCxPQUFPLENBQUMsR0FBVztRQUNqQixJQUFJLElBQUksR0FBWSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUN6RCxJQUFJLE1BQWlCLENBQUM7UUFDdEIsSUFBSSxJQUFJLEVBQUU7WUFDUixNQUFNLEdBQUcsSUFBSSxDQUFDO1NBQ2Y7YUFDSTtZQUNILE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNwQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2U2NCwgSGVscENvbW1hbmQsIEhlbHBUeXBlLCBYTUxDb25zdGFudHMsIFhtbFBhcnNlciB9IGZyb20gXCJAbWFnaWMteHBhL3V0aWxzXCI7XHJcbmltcG9ydCB7RW5jb2RpbmcsIE5OdW1iZXIsIExpc3QsIE5TdHJpbmd9IGZyb20gXCJAbWFnaWMteHBhL21zY29yZWxpYlwiO1xyXG5pbXBvcnQge0V2ZW50c30gZnJvbSBcIi4uLy4uL0V2ZW50c1wiO1xyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gQmFzZSBjbGFzcyBmb3IgYWxsIHRoZSBoZWxwIHR5cGVzIHN1cHBvcnRlZCBpbiBtYWdpYy5cclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1hZ2ljSGVscCB7XHJcbiAgYWJzdHJhY3QgR2V0SGVscFR5cGUoKTogSGVscFR5cGU7XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vIFRoaXMgY2xhc3Mgd2lsbCBjb250YWluIHRoZSBkZXRhaWxzIHJlcXVpcmVkIHRvIGRyYXcgdGhlIGludGVybmFsIGhlbHAgd2luZG93LlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxIZWxwIGV4dGVuZHMgTWFnaWNIZWxwIHtcclxuICB2YWw6IHN0cmluZyA9IG51bGw7XHJcbiAgTmFtZTogc3RyaW5nID0gbnVsbDtcclxuICBGcmFtZVg6IG51bWJlciA9IDA7XHJcbiAgRnJhbWVZOiBudW1iZXIgPSAwO1xyXG4gIEZyYW1lRHg6IG51bWJlciA9IDA7XHJcbiAgRnJhbWVEeTogbnVtYmVyID0gMDtcclxuICBTaXplZFg6IG51bWJlciA9IDA7XHJcbiAgU2l6ZWRZOiBudW1iZXIgPSAwO1xyXG4gIEZhY3Rvclg6IG51bWJlciA9IDA7XHJcbiAgRmFjdG9yWTogbnVtYmVyID0gMDtcclxuICBCb3JkZXJzdHlsZTogbnVtYmVyID0gMDtcclxuICBUaXRsZUJhcjogbnVtYmVyID0gMDtcclxuICBGb250VGFibGVJbmRleDogbnVtYmVyID0gMDtcclxuXHJcbiAgR2V0SGVscFR5cGUoKTogSGVscFR5cGUge1xyXG4gICAgcmV0dXJuIEhlbHBUeXBlLkludGVybmFsO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gVGhpcyBjbGFzcyB3aWxsIGNvbnRhaW4gdGhlIGRldGFpbHMgcmVxdWlyZWQgdG8gc2hvdyBwcm9tcHQgaGVscC5cclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIFByb21wdHBIZWxwIGV4dGVuZHMgTWFnaWNIZWxwIHtcclxuICBQcm9tcHRIZWxwVGV4dDogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgR2V0SGVscFR5cGUoKTogSGVscFR5cGUge1xyXG4gICAgcmV0dXJuIEhlbHBUeXBlLlByb21wdDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vIFRoaXMgY2xhc3Mgd2lsbCBjb250YWluIHRoZSBkZXRhaWxzIHJlcXVpcmVkIHRvIHNob3cgdG9vbCB0aXAgaGVscC5cclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIFRvb2xUaXBIZWxwIGV4dGVuZHMgTWFnaWNIZWxwIHtcclxuICB0b29sdGlwSGVscFRleHQ6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIEdldEhlbHBUeXBlKCk6IEhlbHBUeXBlIHtcclxuICAgIHJldHVybiBIZWxwVHlwZS5Ub29sdGlwO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gVGhpcyBjbGFzcyB3aWxsIGNvbnRhaW4gdGhlIGRldGFpbHMgcmVxdWlyZWQgdG8gc2hvdyBVUkwgaGVscC5cclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIFVSTEhlbHAgZXh0ZW5kcyBNYWdpY0hlbHAge1xyXG4gIHVybEhlbHBUZXh0OiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICBHZXRIZWxwVHlwZSgpOiBIZWxwVHlwZSB7XHJcbiAgICByZXR1cm4gSGVscFR5cGUuVVJMO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gVGhpcyBjbGFzcyB3aWxsIGNvbnRhaW4gdGhlIGRldGFpbHMgcmVxdWlyZWQgdG8gc2hvdyB3aW5kb3dzIGhlbHAuXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBXaW5kb3dzSGVscCBleHRlbmRzIE1hZ2ljSGVscCB7XHJcbiAgRmlsZVBhdGg6IHN0cmluZyA9IG51bGw7XHJcbiAgSGVscENvbW1hbmQ6IEhlbHBDb21tYW5kO1xyXG4gIEhlbHBLZXk6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIEdldEhlbHBUeXBlKCk6IEhlbHBUeXBlIHtcclxuICAgIHJldHVybiBIZWxwVHlwZS5XaW5kb3dzO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gZGF0YSBmb3IgPGhlbHB0YWJsZT4gPGhlbHBpdGVtIHZhbHVlID0gXCJzdHJpbmdcIj4gLi4uIDwvaGVscHRhYmxlPlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgSGVscHMge1xyXG4gIHByaXZhdGUgX2hlbHBzOiBMaXN0PE1hZ2ljSGVscD4gPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENUT1JcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5faGVscHMgPSBuZXcgTGlzdDxNYWdpY0hlbHA+KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFRvIHBhcnNlIHRoZSBpbnB1dCBzdHJpbmcgYW5kIGZpbGwgZGF0YSBmaWVsZCAoaGVscHMpIGluIHRoZSBjbGFzcy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGZpbGxEYXRhKHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICB3aGlsZSAodGhpcy5pbml0SW5uZXJPYmplY3RzKHBhcnNlci5nZXROZXh0VGFnKCksIHBhcnNlcikpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVG8gaW5pdGlhbCBpbm5lciBvYmplY3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm91bmRUYWdOYW1lXCI+b2YgZm91bmQvY3VycmVudCB0YWc8L3BhcmFtPlxyXG4gIHByaXZhdGUgaW5pdElubmVyT2JqZWN0cyhmb3VuZFRhZ05hbWU6IHN0cmluZywgcGFyc2VyOiBYbWxQYXJzZXIpOiBib29sZWFuIHtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBYTUxDb25zdGFudHMuTUdfVEFHX0hFTFBUQUJMRSkge1xyXG5cclxuICAgICAgICBsZXQgY3VycnJlbnRJbmRleCA9IHBhcnNlci5nZXRDdXJySW5kZXgoKTsgLy8gZ2V0IHRoZSBjdXJyZW50SW5kZXggb2YgSGVscCB0YWdcclxuICAgICAgICBsZXQgZW5jb2RlZCA9IHBhcnNlci5SZWFkQ29udGVudE9mQ3VycmVudEVsZW1lbnQoKS50cmltKCk7IC8vIGdldCB2YWx1ZSBvZiBlbmNvZGVkIHZhbHVlIG9mIEhlbHBcclxuICAgICAgICBsZXQgZGVjb2RlZCA9IEJhc2U2NC5kZWNvZGUoZW5jb2RlZC5zdWJzdHIoMCwgZW5jb2RlZC5sZW5ndGgpLnRyaW0oKSwgRW5jb2RpbmcuVVRGOCk7IC8vZGVjb2RlIHRoZSB2YWx1ZSBvZiBIZWxwXHJcblxyXG4gICAgICAgIGxldCBuZXdYbWxEYXRhID0gcGFyc2VyLmdldFhNTGRhdGEoKS5yZXBsYWNlKGVuY29kZWQudHJpbSgpLCBkZWNvZGVkKTsgLy8gcmVwbGFjZSB0aGUgZW5jb2RlZCB2YWx1ZSB3aXRoIGRlY29kZWQgdmFsdWVcclxuICAgICAgICBwYXJzZXIuc2V0WE1MZGF0YShuZXdYbWxEYXRhKTsgLy9jcmVhdGUgYSBwYXJzZXIgd2l0aCBuZXdYTUxcclxuICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KGN1cnJyZW50SW5kZXgpOyAvLyBzZXQgdGhlIGN1cnJlbnQgaW5kZXggb2YgcGFyc2VyIHRvIEhlbHAgdGFnXHJcblxyXG4gICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgocGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIHBhcnNlci5nZXRDdXJySW5kZXgoKSkgK1xyXG4gICAgICAgICAgMSk7IC8vZW5kIG9mIG91dGVyIHRhZCBhbmQgaXRzIFwiPlwiXHJcbiAgICB9XHJcbiAgICAvLyBlbmQgb2Ygb3V0ZXIgdGFkIGFuZCBpdHMgXCI+XCJcclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19IRUxQSVRFTSkge1xyXG4gICAgICBsZXQgZW5kQ29udGV4dCA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX1RFUk0sIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICAgIGlmIChlbmRDb250ZXh0ICE9PSAtMSAmJiBlbmRDb250ZXh0IDwgcGFyc2VyLmdldFhNTGRhdGEoKS5sZW5ndGgpIHtcclxuICAgICAgICAvLyBsYXN0IHBvc2l0aW9uIG9mIGl0cyB0YWdcclxuICAgICAgICBsZXQgdGFnOiBzdHJpbmcgPSBwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpO1xyXG4gICAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKFhNTENvbnN0YW50cy5NR19UQUdfSEVMUElURU0pICtcclxuICAgICAgICAgIFhNTENvbnN0YW50cy5NR19UQUdfSEVMUElURU0ubGVuZ3RoKTtcclxuICAgICAgICBsZXQgdG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4gPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcbiAgICAgICAgdGhpcy5maWxsSGVscEl0ZW0odG9rZW5zVmVjdG9yKTtcclxuICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQgKyBYTUxDb25zdGFudHMuVEFHX1RFUk0ubGVuZ3RoKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZm91bmRUYWdOYW1lID09PSBcIi9cIiArIFhNTENvbnN0YW50cy5NR19UQUdfSEVMUFRBQkxFKSB7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKFwiaW4gQ29tbWFuZC5GaWxsRGF0YSgpIG91dCBvZiBzdHJpbmcgYm91bmRzXCIpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRmlsbCBtZW1iZXIgZWxlbWVudCBoZWxwcyBieSA8aGVscGl0ZW0+IHRhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0b2tlbnNWZWN0b3JcIj5hdHRyaWJ1dGUvdmFsdWUvLi4uYXR0cmlidXRlL3ZhbHVlLyB2ZWN0b3I8L3BhcmFtPlxyXG4gIHByaXZhdGUgZmlsbEhlbHBJdGVtKHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+KTogdm9pZCB7XHJcbiAgICAvLyBTaW5jZSB0aGUgZmlyc3QgYXR0cmlidXRlIGlzIHR5cGUgb2YgaGVscC4gRXh0cmFjdCB0aGlzIGF0dHJpYnV0ZSB0byBjaGVjayB0eXBlLlxyXG4gICAgbGV0IGo6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgYXR0cmlidXRlOiBzdHJpbmcgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaik7XHJcbiAgICBsZXQgdmFsdWVTdHI6IHN0cmluZyA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSk7XHJcbiAgICBsZXQgaGxwVHlwZTogc3RyaW5nID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKS50b1N0cmluZygpO1xyXG5cclxuICAgIHN3aXRjaCAoaGxwVHlwZSkge1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0hMUF9UWVBfVE9PTFRJUDpcclxuICAgICAgICBsZXQgdG9vbFRpcEhlbHA6IFRvb2xUaXBIZWxwID0gbmV3IFRvb2xUaXBIZWxwKCk7XHJcbiAgICAgICAgZm9yIChqID0gMjsgaiA8IHRva2Vuc1ZlY3Rvci5sZW5ndGg7IGogPSBqICsgMikge1xyXG4gICAgICAgICAgYXR0cmlidXRlID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKGopO1xyXG4gICAgICAgICAgdmFsdWVTdHIgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaiArIDEpO1xyXG4gICAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PT0gWE1MQ29uc3RhbnRzLk1HX0FUVFJfVkFMVUUpIHtcclxuICAgICAgICAgICAgLy8gIzkzMjA4NjogU3BlY2lhbCBjaGFyYWN0ZXJzIGluIGhlbHBzIHRleHQgYXJlIGVzY2FwZWQgd2hpbGUgc2VyaWFsaXppbmcsXHJcbiAgICAgICAgICAgIC8vIHNvIHVuZXNjYXBlIHRoZSBlc2NhcGVkIGNoYXJhY3RlcnMuXHJcbiAgICAgICAgICAgIHRvb2xUaXBIZWxwLnRvb2x0aXBIZWxwVGV4dCA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cikudG9TdHJpbmcoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJUaGVyZSBpcyBubyBzdWNoIHRhZyBpbiA8aGVscHRhYmxlPjxoZWxwaXRlbSAuLj4uSW5zZXJ0IGNhc2UgdG8gSGVscFRhYmxlLkZpbGxIZWxwSXRlbSBmb3IgezB9XCIsIGF0dHJpYnV0ZSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9oZWxwcy5wdXNoKHRvb2xUaXBIZWxwKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfSExQX1RZUF9QUk9NUFQ6XHJcbiAgICAgICAgbGV0IHByb21wdHBIZWxwOiBQcm9tcHRwSGVscCA9IG5ldyBQcm9tcHRwSGVscCgpO1xyXG4gICAgICAgIGZvciAoaiA9IDI7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqID0gaiArIDIpIHtcclxuICAgICAgICAgIGF0dHJpYnV0ZSA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKTtcclxuICAgICAgICAgIHZhbHVlU3RyID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKTtcclxuICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX1ZBTFVFKSB7XHJcbiAgICAgICAgICAgIC8vICM5MzIwODY6IFNwZWNpYWwgY2hhcmFjdGVycyBpbiBoZWxwcyB0ZXh0IGFyZSBlc2NhcGVkIHdoaWxlIHNlcmlhbGl6aW5nLFxyXG4gICAgICAgICAgICAvLyBzbyB1bmVzY2FwZSB0aGUgZXNjYXBlZCBjaGFyYWN0ZXJzLlxyXG4gICAgICAgICAgICBwcm9tcHRwSGVscC5Qcm9tcHRIZWxwVGV4dCA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cikudG9TdHJpbmcoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJUaGVyZSBpcyBubyBzdWNoIHRhZyBpbiA8aGVscHRhYmxlPjxoZWxwaXRlbSAuLj4uSW5zZXJ0IGNhc2UgdG8gSGVscFRhYmxlLkZpbGxIZWxwSXRlbSBmb3IgezB9XCIsIGF0dHJpYnV0ZSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9oZWxwcy5wdXNoKHByb21wdHBIZWxwKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfSExQX1RZUF9VUkw6XHJcbiAgICAgICAgbGV0IHVybEhlbHA6IFVSTEhlbHAgPSBuZXcgVVJMSGVscCgpO1xyXG4gICAgICAgIGZvciAoaiA9IDI7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqID0gaiArIDIpIHtcclxuICAgICAgICAgIGF0dHJpYnV0ZSA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKTtcclxuICAgICAgICAgIHZhbHVlU3RyID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKTtcclxuICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX1ZBTFVFKVxyXG4gICAgICAgICAgICB1cmxIZWxwLnVybEhlbHBUZXh0ID0gdmFsdWVTdHI7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiVGhlcmUgaXMgbm8gc3VjaCB0YWcgaW4gPGhlbHB0YWJsZT48aGVscGl0ZW0gLi4+Lkluc2VydCBjYXNlIHRvIEhlbHBUYWJsZS5GaWxsSGVscEl0ZW0gZm9yIHswfVwiLCBhdHRyaWJ1dGUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faGVscHMucHVzaCh1cmxIZWxwKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfSExQX1RZUF9JTlRFUk5BTDpcclxuICAgICAgICBsZXQgaW50ZXJuYWxIZWxwV2luZG93RGV0YWlsczogSW50ZXJuYWxIZWxwID0gbmV3IEludGVybmFsSGVscCgpO1xyXG4gICAgICAgIC8vIEluaXQgSW50ZXJuYWwgSGVscCBXaW5kb3cgRGV0YWlscy5cclxuICAgICAgICBmb3IgKGogPSAyOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiArPSAyKSB7XHJcbiAgICAgICAgICBhdHRyaWJ1dGUgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaik7XHJcbiAgICAgICAgICB2YWx1ZVN0ciA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSk7XHJcblxyXG4gICAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PT0gWE1MQ29uc3RhbnRzLk1HX0FUVFJfVkFMVUUpIHtcclxuICAgICAgICAgICAgaW50ZXJuYWxIZWxwV2luZG93RGV0YWlscy52YWwgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX0lOVEVSTkFMX0hFTFBfTkFNRSkge1xyXG4gICAgICAgICAgICBpbnRlcm5hbEhlbHBXaW5kb3dEZXRhaWxzLk5hbWUgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX0lOVEVSTkFMX0hFTFBfRlJBTUVYKSB7XHJcbiAgICAgICAgICAgIGludGVybmFsSGVscFdpbmRvd0RldGFpbHMuRnJhbWVYID0gTk51bWJlci5QYXJzZShYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZSA9PT0gWE1MQ29uc3RhbnRzLk1HX0FUVFJfSU5URVJOQUxfSEVMUF9GUkFNRVkpIHtcclxuICAgICAgICAgICAgaW50ZXJuYWxIZWxwV2luZG93RGV0YWlscy5GcmFtZVkgPSBOTnVtYmVyLlBhcnNlKFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cikpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZiAoYXR0cmlidXRlID09PSBYTUxDb25zdGFudHMuTUdfQVRUUl9JTlRFUk5BTF9IRUxQX0ZSQU1FRFgpIHtcclxuICAgICAgICAgICAgaW50ZXJuYWxIZWxwV2luZG93RGV0YWlscy5GcmFtZUR4ID0gTk51bWJlci5QYXJzZShYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZSA9PT0gWE1MQ29uc3RhbnRzLk1HX0FUVFJfSU5URVJOQUxfSEVMUF9GUkFNRURZKSB7XHJcbiAgICAgICAgICAgIGludGVybmFsSGVscFdpbmRvd0RldGFpbHMuRnJhbWVEeSA9IE5OdW1iZXIuUGFyc2UoWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX0lOVEVSTkFMX0hFTFBfU0laRURYKSB7XHJcbiAgICAgICAgICAgIGludGVybmFsSGVscFdpbmRvd0RldGFpbHMuU2l6ZWRYID0gTk51bWJlci5QYXJzZShYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZSA9PT0gWE1MQ29uc3RhbnRzLk1HX0FUVFJfSU5URVJOQUxfSEVMUF9TSVpFRFkpIHtcclxuICAgICAgICAgICAgaW50ZXJuYWxIZWxwV2luZG93RGV0YWlscy5TaXplZFkgPSBOTnVtYmVyLlBhcnNlKFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cikpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZiAoYXR0cmlidXRlID09PSBYTUxDb25zdGFudHMuTUdfQVRUUl9JTlRFUk5BTF9IRUxQX0ZBQ1RPUlgpIHtcclxuICAgICAgICAgICAgaW50ZXJuYWxIZWxwV2luZG93RGV0YWlscy5GYWN0b3JYID0gTk51bWJlci5QYXJzZShYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZSA9PT0gWE1MQ29uc3RhbnRzLk1HX0FUVFJfSU5URVJOQUxfSEVMUF9GQUNUT1JZKSB7XHJcbiAgICAgICAgICAgIGludGVybmFsSGVscFdpbmRvd0RldGFpbHMuRmFjdG9yWSA9IE5OdW1iZXIuUGFyc2UoWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX0lOVEVSTkFMX0hFTFBfQk9SREVSU1RZTEUpIHtcclxuICAgICAgICAgICAgaW50ZXJuYWxIZWxwV2luZG93RGV0YWlscy5Cb3JkZXJzdHlsZSA9IE5OdW1iZXIuUGFyc2UoWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX0lOVEVSTkFMX1RJVExFX0JBUikge1xyXG4gICAgICAgICAgICBpbnRlcm5hbEhlbHBXaW5kb3dEZXRhaWxzLlRpdGxlQmFyID0gTk51bWJlci5QYXJzZShYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZSA9PT0gWE1MQ29uc3RhbnRzLk1HX0FUVFJfSU5URVJOQUxfSEVMUF9TWVNURU1fTUVOVSkge1xyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZSA9PT0gWE1MQ29uc3RhbnRzLk1HX0FUVFJfSU5URVJOQUxfSEVMUF9GT05UX1RBQkxFX0lOREVYKSB7XHJcbiAgICAgICAgICAgIGludGVybmFsSGVscFdpbmRvd0RldGFpbHMuRm9udFRhYmxlSW5kZXggPSBOTnVtYmVyLlBhcnNlKFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cikpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcIlRoZXJlIGlzIG5vIHN1Y2ggdGFnIGluIDxoZWxwdGFibGU+PGhlbHBpdGVtIC4uPi5JbnNlcnQgY2FzZSB0byBIZWxwVGFibGUuRmlsbEhlbHBJdGVtIGZvciB7MH1cIiwgYXR0cmlidXRlKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBBZGQgaGVscCBvYmplY3QgdG8gY29sbGVjdGlvbi5cclxuICAgICAgICB0aGlzLl9oZWxwcy5wdXNoKGludGVybmFsSGVscFdpbmRvd0RldGFpbHMpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9ITFBfVFlQX1dJTkRPV1M6XHJcbiAgICAgICAgbGV0IHduZEhlbHBEZXRhaWxzOiBXaW5kb3dzSGVscCA9IG5ldyBXaW5kb3dzSGVscCgpO1xyXG5cclxuICAgICAgICAvLyBJbml0IFdpbmRvd3MgSGVscCBEZXRhaWxzLlxyXG4gICAgICAgIGZvciAoaiA9IDI7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqID0gaiArIDIpIHtcclxuICAgICAgICAgIGF0dHJpYnV0ZSA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKTtcclxuICAgICAgICAgIHZhbHVlU3RyID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKTtcclxuICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX1dJTkRPV1NfSEVMUF9GSUxFKSB7XHJcbiAgICAgICAgICAgIHduZEhlbHBEZXRhaWxzLkZpbGVQYXRoID0gdmFsdWVTdHI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX1dJTkRPV1NfSEVMUF9DT01NQU5EKSB7XHJcbiAgICAgICAgICAgICAgd25kSGVscERldGFpbHMuSGVscENvbW1hbmQgPSA8SGVscENvbW1hbmQ+Tk51bWJlci5QYXJzZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX1dJTkRPV1NfSEVMUF9LRVkpIHtcclxuICAgICAgICAgICAgd25kSGVscERldGFpbHMuSGVscEtleSA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cikudG9TdHJpbmcoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJUaGVyZSBpcyBubyBzdWNoIHRhZyBpbiA8aGVscHRhYmxlPjxoZWxwaXRlbSAuLj4uSW5zZXJ0IGNhc2UgdG8gSGVscFRhYmxlLkZpbGxIZWxwSXRlbSBmb3IgezB9XCIsIGF0dHJpYnV0ZSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBBZGQgaGVscCBvYmplY3QgdG8gY29sbGVjdGlvbi5cclxuICAgICAgICB0aGlzLl9oZWxwcy5wdXNoKHduZEhlbHBEZXRhaWxzKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEhlbHAoaWR4OiBudW1iZXIpOiBNYWdpY0hlbHAge1xyXG4gICAgbGV0IGZsYWc6IGJvb2xlYW4gPSBpZHggPCAwIHx8IGlkeCA+PSB0aGlzLl9oZWxwcy5sZW5ndGg7XHJcbiAgICBsZXQgcmVzdWx0OiBNYWdpY0hlbHA7XHJcbiAgICBpZiAoZmxhZykge1xyXG4gICAgICByZXN1bHQgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuX2hlbHBzLmdldF9JdGVtKGlkeCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxufVxyXG4iXX0=
|