@magic-xpa/gui 4.801.0-dev481.242 → 4.801.0-dev481.248
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/{esm2015/index.js → esm2020/index.mjs} +0 -0
- package/{esm2015/magic-xpa-gui.js → esm2020/magic-xpa-gui.mjs} +0 -0
- package/esm2020/src/Commands.mjs +186 -0
- package/{esm2015/src/Events.js → esm2020/src/Events.mjs} +0 -0
- package/{esm2015/src/EventsProcessor.js → esm2020/src/EventsProcessor.mjs} +0 -0
- package/esm2020/src/FocusManager.mjs +34 -0
- package/{esm2015/src/GuiConstants.js → esm2020/src/GuiConstants.mjs} +0 -0
- package/{esm2015/src/GuiEnums.js → esm2020/src/GuiEnums.mjs} +0 -0
- package/{esm2015/src/GuiEnvironment.js → esm2020/src/GuiEnvironment.mjs} +0 -0
- package/{esm2015/src/IFlowMonitorQueue.js → esm2020/src/IFlowMonitorQueue.mjs} +1 -0
- package/esm2020/src/Manager.mjs +192 -0
- package/{esm2015/src/UIBridge.js → esm2020/src/UIBridge.mjs} +0 -0
- package/{esm2015/src/env/IEnvironment.js → esm2020/src/env/IEnvironment.mjs} +1 -0
- package/{esm2015/src/gui/ControlBase.js → esm2020/src/gui/ControlBase.mjs} +0 -0
- package/{esm2015/src/gui/GuiMgControl.js → esm2020/src/gui/GuiMgControl.mjs} +0 -0
- package/{esm2015/src/gui/GuiMgForm.js → esm2020/src/gui/GuiMgForm.mjs} +0 -0
- package/{esm2015/src/gui/KeyboardItem.js → esm2020/src/gui/KeyboardItem.mjs} +0 -0
- package/{esm2015/src/gui/LastFocusedVal.js → esm2020/src/gui/LastFocusedVal.mjs} +0 -0
- package/{esm2015/src/gui/MgValue.js → esm2020/src/gui/MgValue.mjs} +0 -0
- package/{esm2015/src/gui/PropParentInterface.js → esm2020/src/gui/PropParentInterface.mjs} +1 -0
- package/{esm2015/src/gui/low/DialogHandler.js → esm2020/src/gui/low/DialogHandler.mjs} +0 -0
- package/{esm2015/src/gui/low/GuiCommand.js → esm2020/src/gui/low/GuiCommand.mjs} +0 -0
- package/{esm2015/src/gui/low/GuiCommandQueue.js → esm2020/src/gui/low/GuiCommandQueue.mjs} +0 -0
- package/{esm2015/src/gui/low/GuiInteractive.js → esm2020/src/gui/low/GuiInteractive.mjs} +0 -0
- package/{esm2015/src/gui/low/Style.js → esm2020/src/gui/low/Style.mjs} +0 -0
- package/{esm2015/src/management/RuntimeContextBase.js → esm2020/src/management/RuntimeContextBase.mjs} +0 -0
- package/{esm2015/src/management/data/BlobType.js → esm2020/src/management/data/BlobType.mjs} +0 -0
- package/{esm2015/src/management/data/DcValues.js → esm2020/src/management/data/DcValues.mjs} +0 -0
- package/{esm2015/src/management/data/DcValuesBuilderBase.js → esm2020/src/management/data/DcValuesBuilderBase.mjs} +0 -0
- package/{esm2015/src/management/data/FieldDef.js → esm2020/src/management/data/FieldDef.mjs} +0 -0
- package/{esm2015/src/management/data/FieldsTable.js → esm2020/src/management/data/FieldsTable.mjs} +0 -0
- package/{esm2015/src/management/data/GuiDataViewBase.js → esm2020/src/management/data/GuiDataViewBase.mjs} +0 -0
- package/esm2020/src/management/data/GuiFieldBase.mjs +82 -0
- package/{esm2015/src/management/data/IRecord.js → esm2020/src/management/data/IRecord.mjs} +1 -0
- package/{esm2015/src/management/data/IReferencedObject.js → esm2020/src/management/data/IReferencedObject.mjs} +1 -0
- package/{esm2015/src/management/data/NUM_TYPE.js → esm2020/src/management/data/NUM_TYPE.mjs} +0 -0
- package/{esm2015/src/management/data/ObjectReferenceBase.js → esm2020/src/management/data/ObjectReferenceBase.mjs} +0 -0
- package/{esm2015/src/management/data/ObjectReferencesCollection.js → esm2020/src/management/data/ObjectReferencesCollection.mjs} +0 -0
- package/{esm2015/src/management/data/RecordUtils.js → esm2020/src/management/data/RecordUtils.mjs} +0 -0
- package/{esm2015/src/management/data/VectorType.js → esm2020/src/management/data/VectorType.mjs} +0 -0
- package/{esm2015/src/management/data/VectorTypeBase.js → esm2020/src/management/data/VectorTypeBase.mjs} +0 -0
- package/{esm2015/src/management/events/IActionManager.js → esm2020/src/management/events/IActionManager.mjs} +1 -0
- package/{esm2015/src/management/events/IGuiEventsManager.js → esm2020/src/management/events/IGuiEventsManager.mjs} +1 -0
- package/{esm2015/src/management/exp/ExpressionInterface.js → esm2020/src/management/exp/ExpressionInterface.mjs} +0 -0
- package/{esm2015/src/management/exp/GuiExpressionEvaluator.js → esm2020/src/management/exp/GuiExpressionEvaluator.mjs} +0 -0
- package/{esm2015/src/management/gui/ControlTable.js → esm2020/src/management/gui/ControlTable.mjs} +0 -0
- package/{esm2015/src/management/gui/DisplayConvertor.js → esm2020/src/management/gui/DisplayConvertor.mjs} +0 -0
- package/{esm2015/src/management/gui/FieldValidator.js → esm2020/src/management/gui/FieldValidator.mjs} +0 -0
- package/esm2020/src/management/gui/GuiControlPropertyAdapter.mjs +22 -0
- package/{esm2015/src/management/gui/GuiFormPropertyAdapter.js → esm2020/src/management/gui/GuiFormPropertyAdapter.mjs} +0 -0
- package/{esm2015/src/management/gui/HebrewDate.js → esm2020/src/management/gui/HebrewDate.mjs} +0 -0
- package/{esm2015/src/management/gui/Helps.js → esm2020/src/management/gui/Helps.mjs} +0 -0
- package/esm2020/src/management/gui/MgControlBase.mjs +1873 -0
- package/esm2020/src/management/gui/MgFormBase.mjs +748 -0
- package/{esm2015/src/management/gui/PIC.js → esm2020/src/management/gui/PIC.mjs} +0 -0
- package/{esm2015/src/management/gui/PropDefaults.js → esm2020/src/management/gui/PropDefaults.mjs} +0 -0
- package/{esm2015/src/management/gui/PropInterface.js → esm2020/src/management/gui/PropInterface.mjs} +0 -0
- package/esm2020/src/management/gui/PropTable.mjs +221 -0
- package/esm2020/src/management/gui/Property.mjs +1382 -0
- package/{esm2015/src/management/gui/ValidationDetails.js → esm2020/src/management/gui/ValidationDetails.mjs} +0 -0
- package/{esm2015/src/management/gui/ValidationDetailsBase.js → esm2020/src/management/gui/ValidationDetailsBase.mjs} +0 -0
- package/{esm2015/src/management/gui/WrongFormatException.js → esm2020/src/management/gui/WrongFormatException.mjs} +0 -0
- package/{esm2015/src/management/tasks/GuiDataCollection.js → esm2020/src/management/tasks/GuiDataCollection.mjs} +0 -0
- package/esm2020/src/management/tasks/GuiTaskBase.mjs +502 -0
- package/{esm2015/src/management/tasks/IMGDataTable.js → esm2020/src/management/tasks/IMGDataTable.mjs} +1 -0
- package/{esm2015/src/management/tasks/ITask.js → esm2020/src/management/tasks/ITask.mjs} +1 -0
- package/{esm2015/src/management/tasks/MgTimer.js → esm2020/src/management/tasks/MgTimer.mjs} +0 -0
- package/{esm2015/src/management/tasks/TaskDefinitionId.js → esm2020/src/management/tasks/TaskDefinitionId.mjs} +0 -0
- package/esm2020/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +41 -0
- package/{esm2015/src/util/AuthenticationDialogHandler.js → esm2020/src/util/AuthenticationDialogHandler.mjs} +0 -0
- package/{esm2015/src/util/MemoryUtil.js → esm2020/src/util/MemoryUtil.mjs} +0 -0
- package/{esm2015/src/util/ObjectReference.js → esm2020/src/util/ObjectReference.mjs} +0 -0
- package/{esm2015/src/util/ProcessLauncher.js → esm2020/src/util/ProcessLauncher.mjs} +0 -0
- package/{esm2015/src/util/UsernamePasswordCredentials.js → esm2020/src/util/UsernamePasswordCredentials.mjs} +0 -0
- package/fesm2015/{magic-xpa-gui.js → magic-xpa-gui.mjs} +51 -6
- package/fesm2015/magic-xpa-gui.mjs.map +1 -0
- package/fesm2020/magic-xpa-gui.mjs +17805 -0
- package/fesm2020/magic-xpa-gui.mjs.map +1 -0
- package/package.json +27 -14
- package/src/management/gui/GuiControlPropertyAdapter.d.ts +6 -6
- package/src/management/tasks/GuiTaskBase.d.ts +1 -1
- package/bundles/magic-xpa-gui.umd.js +0 -19344
- package/bundles/magic-xpa-gui.umd.js.map +0 -1
- package/bundles/magic-xpa-gui.umd.min.js +0 -16
- package/bundles/magic-xpa-gui.umd.min.js.map +0 -1
- package/esm2015/src/Commands.js +0 -189
- package/esm2015/src/FocusManager.js +0 -41
- package/esm2015/src/Manager.js +0 -197
- package/esm2015/src/management/data/GuiFieldBase.js +0 -85
- package/esm2015/src/management/gui/GuiControlPropertyAdapter.js +0 -4
- package/esm2015/src/management/gui/MgControlBase.js +0 -1979
- package/esm2015/src/management/gui/MgFormBase.js +0 -763
- package/esm2015/src/management/gui/PropTable.js +0 -224
- package/esm2015/src/management/gui/Property.js +0 -1402
- package/esm2015/src/management/tasks/GuiTaskBase.js +0 -506
- package/esm2015/src/management/tasks/TaskDefinitionIdTableSaxHandler.js +0 -41
- package/fesm2015/magic-xpa-gui.js.map +0 -1
|
@@ -1,1402 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { ApplicationException, Debug, Int32, List, NNumber, NString, RefParam, StringBuilder } from '@magic-xpa/mscorelib';
|
|
3
|
-
import { Constants, Logger_LogLevels, MgControlType, StorageAttribute, StrUtil, UtilImeJpn, UtilStrByteMode, XMLConstants, XmlParser } from '@magic-xpa/utils';
|
|
4
|
-
import { TaskDefinitionIdTableSaxHandler } from '../tasks/TaskDefinitionIdTableSaxHandler';
|
|
5
|
-
import { PIC } from './PIC';
|
|
6
|
-
import { Events } from '../../Events';
|
|
7
|
-
import { GuiConstants } from '../../GuiConstants';
|
|
8
|
-
import { PropInterface } from './PropInterface';
|
|
9
|
-
import { GuiControlPropertyAdapter } from './GuiControlPropertyAdapter';
|
|
10
|
-
import { DisplayConvertor } from './DisplayConvertor';
|
|
11
|
-
import { Commands } from '../../Commands';
|
|
12
|
-
import { CommandType, HtmlProperties } from '../../GuiEnums';
|
|
13
|
-
import { PropDefaults } from './PropDefaults';
|
|
14
|
-
import { GuiEnvironment } from '../../GuiEnvironment';
|
|
15
|
-
export class CustomValidatorProp {
|
|
16
|
-
}
|
|
17
|
-
;
|
|
18
|
-
export class CustomValidator {
|
|
19
|
-
constructor(valid, errMessage) {
|
|
20
|
-
this._valid = valid;
|
|
21
|
-
this._errorMessage = errMessage;
|
|
22
|
-
}
|
|
23
|
-
isValid() { return this._valid; }
|
|
24
|
-
getErrMessage() { return this._errorMessage; }
|
|
25
|
-
}
|
|
26
|
-
export class Property {
|
|
27
|
-
constructor(cId, cParentObj, parType, val) {
|
|
28
|
-
this._id = Int32.MinValue;
|
|
29
|
-
this._dataType = StorageAttribute.NONE;
|
|
30
|
-
this._val = null;
|
|
31
|
-
this._pic = null;
|
|
32
|
-
this._expId = 0;
|
|
33
|
-
this._parentObj = null;
|
|
34
|
-
this._parentType = null;
|
|
35
|
-
this._prevValues = null;
|
|
36
|
-
this._orgValue = null;
|
|
37
|
-
this._taskDefinitionId = null;
|
|
38
|
-
this.StudioValue = null;
|
|
39
|
-
this._expAlreadyComputedOnce = false;
|
|
40
|
-
this.customProperties = new Map();
|
|
41
|
-
this.customPropertiesValues = new Map();
|
|
42
|
-
this.customValidatorProperties = new Map();
|
|
43
|
-
this.customValidatorValues = new Map();
|
|
44
|
-
if (arguments.length === 0)
|
|
45
|
-
this.constructor_0();
|
|
46
|
-
else if (arguments.length === 3)
|
|
47
|
-
this.constructor_1(cId, cParentObj, parType);
|
|
48
|
-
else
|
|
49
|
-
this.constructor_2(cId, cParentObj, parType, val);
|
|
50
|
-
}
|
|
51
|
-
get TaskDefinitionId() {
|
|
52
|
-
return this._taskDefinitionId;
|
|
53
|
-
}
|
|
54
|
-
constructor_0() {
|
|
55
|
-
this._prevValues = new List();
|
|
56
|
-
}
|
|
57
|
-
constructor_1(cId, cParentObj, parType) {
|
|
58
|
-
this.constructor_0();
|
|
59
|
-
this.setId(cId);
|
|
60
|
-
this._parentObj = cParentObj;
|
|
61
|
-
this._parentType = parType;
|
|
62
|
-
this.setDataType();
|
|
63
|
-
}
|
|
64
|
-
constructor_2(cId, cParentObj, parType, val) {
|
|
65
|
-
this.constructor_1(cId, cParentObj, parType);
|
|
66
|
-
this.setValue(val);
|
|
67
|
-
this.setOrgValue();
|
|
68
|
-
}
|
|
69
|
-
setId(cId) {
|
|
70
|
-
this._id = cId;
|
|
71
|
-
}
|
|
72
|
-
fillData(parentRef, parType, parser) {
|
|
73
|
-
let endContext = parser.getXMLdata().indexOf(">", parser.getCurrIndex());
|
|
74
|
-
if (this._parentObj === null && parentRef !== null) {
|
|
75
|
-
this._parentObj = parentRef;
|
|
76
|
-
this._parentType = parType;
|
|
77
|
-
}
|
|
78
|
-
if (endContext !== -1 && endContext < parser.getXMLdata().length) {
|
|
79
|
-
let tag = parser.getXMLsubstring(endContext);
|
|
80
|
-
parser.add2CurrIndex(tag.indexOf(XMLConstants.MG_TAG_PROP) + XMLConstants.MG_TAG_PROP.length);
|
|
81
|
-
let tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
|
|
82
|
-
if (Events.ShouldLog(Logger_LogLevels.Development)) {
|
|
83
|
-
Events.WriteDevToLog(NString.Format("In Prop.FillData(): {0}", tokensVector.toString()));
|
|
84
|
-
}
|
|
85
|
-
this.initElements(tokensVector);
|
|
86
|
-
parser.setCurrIndex(endContext + XMLConstants.TAG_CLOSE.length);
|
|
87
|
-
this.InitInnerObjects(parser);
|
|
88
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL)
|
|
89
|
-
this.setControlAttributes();
|
|
90
|
-
else if (this._parentType === GuiConstants.PARENT_TYPE_FORM)
|
|
91
|
-
this._prevValues.SetSize(1);
|
|
92
|
-
}
|
|
93
|
-
else
|
|
94
|
-
Events.WriteExceptionToLog("In Property.FillData(): Out of string bounds");
|
|
95
|
-
}
|
|
96
|
-
InitInnerObjects(xmlParser) {
|
|
97
|
-
let nextTag = xmlParser.getNextTag();
|
|
98
|
-
if (nextTag === XMLConstants.MG_TAG_TASKDEFINITIONID_ENTRY) {
|
|
99
|
-
let xmlBuffer = xmlParser.ReadToEndOfCurrentElement();
|
|
100
|
-
this.InitTaskDefinitionId(xmlBuffer);
|
|
101
|
-
let endContext = xmlParser.getXMLdata().indexOf(XMLConstants.MG_TAG_PROP + XMLConstants.TAG_CLOSE, xmlParser.getCurrIndex());
|
|
102
|
-
xmlParser.setCurrIndex(endContext + (XMLConstants.MG_TAG_PROP + XMLConstants.TAG_CLOSE).length);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
initElements(tokensVector) {
|
|
106
|
-
for (let j = 0; j < tokensVector.length; j += 2) {
|
|
107
|
-
let attribute = (tokensVector.get_Item(j));
|
|
108
|
-
let valueStr = (tokensVector.get_Item(j + 1));
|
|
109
|
-
switch (attribute) {
|
|
110
|
-
case XMLConstants.MG_ATTR_ID:
|
|
111
|
-
this.setId(XmlParser.getInt(valueStr));
|
|
112
|
-
this.setDataType();
|
|
113
|
-
break;
|
|
114
|
-
case XMLConstants.MG_ATTR_STUDIO_VALUE:
|
|
115
|
-
this.StudioValue = XmlParser.unescape(valueStr);
|
|
116
|
-
break;
|
|
117
|
-
case XMLConstants.MG_ATTR_VALUE:
|
|
118
|
-
if (this._id === PropInterface.PROP_TYPE_CUSTOM_PROPERTIES) {
|
|
119
|
-
this.InitCustomProperties(XmlParser.unescape(valueStr));
|
|
120
|
-
}
|
|
121
|
-
if (this._id === PropInterface.PROP_TYPE_CUSTOM_VALIDATORS) {
|
|
122
|
-
this.InitCustomValidationProperties(XmlParser.unescape(valueStr));
|
|
123
|
-
}
|
|
124
|
-
else {
|
|
125
|
-
this._val = XmlParser.unescape(valueStr);
|
|
126
|
-
this._orgValue = this._val;
|
|
127
|
-
}
|
|
128
|
-
break;
|
|
129
|
-
case XMLConstants.MG_ATTR_EXP:
|
|
130
|
-
this._expId = XmlParser.getInt(valueStr);
|
|
131
|
-
if (this._expId > 0 && this._id === PropInterface.PROP_TYPE_TOOLTIP)
|
|
132
|
-
this.setDataType();
|
|
133
|
-
break;
|
|
134
|
-
case XMLConstants.MG_ATTR_NAME:
|
|
135
|
-
break;
|
|
136
|
-
case XMLConstants.MG_ATTR_CTL_IDX:
|
|
137
|
-
this._taskDefinitionId.CtlIndex = XmlParser.getInt(valueStr);
|
|
138
|
-
break;
|
|
139
|
-
case XMLConstants.MG_ATTR_PROGRAM_ISN:
|
|
140
|
-
this._taskDefinitionId.ProgramIsn = XmlParser.getInt(valueStr);
|
|
141
|
-
break;
|
|
142
|
-
default:
|
|
143
|
-
Events.WriteExceptionToLog(NString.Format("There is no such tag in Property class. Insert case to Property.initElements for {0}", attribute));
|
|
144
|
-
break;
|
|
145
|
-
}
|
|
146
|
-
if (this.IsComputedOnceOnServer())
|
|
147
|
-
this._expAlreadyComputedOnce = true;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
InitCustomProperties(customProprtiesStr) {
|
|
151
|
-
this.customProperties = new Map(JSON.parse(customProprtiesStr));
|
|
152
|
-
if (this._parentObj.IsFirstRefreshOfProps())
|
|
153
|
-
this.SetFirstValueForCustomProperties();
|
|
154
|
-
}
|
|
155
|
-
InitCustomValidator(parser) {
|
|
156
|
-
let text = parser.ReadToEndOfCurrentElement();
|
|
157
|
-
text = text.substr(text.indexOf(XMLConstants.MG_TAG_CUSTOM_VALIDATOR) + XMLConstants.MG_TAG_CUSTOM_VALIDATOR.length);
|
|
158
|
-
let tokens = XmlParser.getTokens(text, XMLConstants.XML_ATTR_DELIM);
|
|
159
|
-
let c = new CustomValidatorProp();
|
|
160
|
-
let key;
|
|
161
|
-
for (let j = 0; j < tokens.length; j += 2) {
|
|
162
|
-
let attribute = tokens.get_Item(j);
|
|
163
|
-
let valueStr = tokens.get_Item(j + 1);
|
|
164
|
-
switch (attribute) {
|
|
165
|
-
case XMLConstants.MG_ATTR_EXP:
|
|
166
|
-
c._exp = XmlParser.getInt(valueStr);
|
|
167
|
-
break;
|
|
168
|
-
case XMLConstants.MG_ATTR_NAME:
|
|
169
|
-
key = XmlParser.unescape(valueStr);
|
|
170
|
-
break;
|
|
171
|
-
case XMLConstants.MG_ATTR_ERROR_EXP:
|
|
172
|
-
c._errorMessageExp = XmlParser.getInt(valueStr);
|
|
173
|
-
break;
|
|
174
|
-
case XMLConstants.MG_ATTR_ERROR:
|
|
175
|
-
c._errorMessage = XmlParser.unescape(valueStr);
|
|
176
|
-
break;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
this.customValidatorProperties.set(key, c);
|
|
180
|
-
}
|
|
181
|
-
InitCustomValidationProperties(customProprtiesStr) {
|
|
182
|
-
let parser = new XmlParser(customProprtiesStr);
|
|
183
|
-
let currTagName = parser.getNextTag();
|
|
184
|
-
while (currTagName != null) {
|
|
185
|
-
switch (currTagName) {
|
|
186
|
-
case XMLConstants.MG_TAG_CUSTOM_VALIDATORS:
|
|
187
|
-
parser.setCurrIndex2EndOfTag();
|
|
188
|
-
this.customValidatorProperties = new Map();
|
|
189
|
-
break;
|
|
190
|
-
case XMLConstants.MG_TAG_CUSTOM_VALIDATOR:
|
|
191
|
-
this.InitCustomValidator(parser);
|
|
192
|
-
break;
|
|
193
|
-
default:
|
|
194
|
-
parser.setCurrIndex2EndOfTag();
|
|
195
|
-
break;
|
|
196
|
-
}
|
|
197
|
-
currTagName = parser.getNextTag();
|
|
198
|
-
}
|
|
199
|
-
if (this._parentObj.IsFirstRefreshOfProps())
|
|
200
|
-
this.SetFirstValueForCustomValidationProperties();
|
|
201
|
-
}
|
|
202
|
-
SetFirstValueForCustomValidationProperties() {
|
|
203
|
-
for (let customProperty of this.customValidatorProperties.keys()) {
|
|
204
|
-
let c = this.customValidatorProperties.get(customProperty);
|
|
205
|
-
this.customValidatorValues.set(customProperty, new CustomValidator(true, ""));
|
|
206
|
-
}
|
|
207
|
-
this._val = this.GetArrayValuesForCustomValidationProperties();
|
|
208
|
-
this._orgValue = this._val;
|
|
209
|
-
}
|
|
210
|
-
GetArrayValuesForCustomValidationProperties() {
|
|
211
|
-
let values = Array.from(this.customValidatorValues.values());
|
|
212
|
-
let valuesStr = JSON.stringify(values);
|
|
213
|
-
return valuesStr;
|
|
214
|
-
}
|
|
215
|
-
GetArrayValuesForCustomProperties() {
|
|
216
|
-
let values = Array.from(this.customPropertiesValues.values());
|
|
217
|
-
let valuesStr = JSON.stringify(values);
|
|
218
|
-
return valuesStr;
|
|
219
|
-
}
|
|
220
|
-
SetFirstValueForCustomProperties() {
|
|
221
|
-
for (let customProperty of this.customProperties.keys())
|
|
222
|
-
this.customPropertiesValues.set(customProperty, "");
|
|
223
|
-
this._val = this.GetArrayValuesForCustomProperties();
|
|
224
|
-
this._orgValue = this._val;
|
|
225
|
-
}
|
|
226
|
-
ResetComputedOnceFlag() {
|
|
227
|
-
this._expAlreadyComputedOnce = false;
|
|
228
|
-
}
|
|
229
|
-
InitTaskDefinitionId(xmlBuffer) {
|
|
230
|
-
let taskDefinitionIdTableSaxHandler = new TaskDefinitionIdTableSaxHandler(this.SetTaskDefinitionId);
|
|
231
|
-
taskDefinitionIdTableSaxHandler.parse(xmlBuffer);
|
|
232
|
-
}
|
|
233
|
-
SetTaskDefinitionId(taskDefinitionId) {
|
|
234
|
-
this._taskDefinitionId = taskDefinitionId;
|
|
235
|
-
}
|
|
236
|
-
setDataType() {
|
|
237
|
-
let compIdx = this._parentObj.getCompIdx();
|
|
238
|
-
this._pic = null;
|
|
239
|
-
if (this._id === Int32.MinValue) {
|
|
240
|
-
Events.WriteExceptionToLog(NString.Format("To fill dataType member in Property.FillDataType must id!={0}", Int32.MinValue));
|
|
241
|
-
return;
|
|
242
|
-
}
|
|
243
|
-
switch (this._id) {
|
|
244
|
-
case PropInterface.PROP_TYPE_TITLE_BAR:
|
|
245
|
-
case PropInterface.PROP_TYPE_DISPLAY_MENU:
|
|
246
|
-
case PropInterface.PROP_TYPE_BORDER:
|
|
247
|
-
case PropInterface.PROP_TYPE_HEBREW:
|
|
248
|
-
case PropInterface.PROP_TYPE_MODIFY_IN_QUERY:
|
|
249
|
-
case PropInterface.PROP_TYPE_SYSTEM_MENU:
|
|
250
|
-
case PropInterface.PROP_TYPE_END_CONDITION:
|
|
251
|
-
case PropInterface.PROP_TYPE_SELECTION:
|
|
252
|
-
case PropInterface.PROP_TYPE_ALLOW_MODIFY:
|
|
253
|
-
case PropInterface.PROP_TYPE_ALLOW_CREATE:
|
|
254
|
-
case PropInterface.PROP_TYPE_ALLOW_DELETE:
|
|
255
|
-
case PropInterface.PROP_TYPE_ALLOW_QUERY:
|
|
256
|
-
case PropInterface.PROP_TYPE_ALLOW_RANGE:
|
|
257
|
-
case PropInterface.PROP_TYPE_ALLOW_LOCATE:
|
|
258
|
-
case PropInterface.PROP_TYPE_ALLOW_SORT:
|
|
259
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_INDEX:
|
|
260
|
-
case PropInterface.PROP_TYPE_ALLOW_LOCATE_IN_QUERY:
|
|
261
|
-
case PropInterface.PROP_TYPE_CONFIRM_UPDATE:
|
|
262
|
-
case PropInterface.PROP_TYPE_FORCE_SUFFIX:
|
|
263
|
-
case PropInterface.PROP_TYPE_FORCE_DELETE:
|
|
264
|
-
case PropInterface.PROP_TYPE_MUST_INPUT:
|
|
265
|
-
case PropInterface.PROP_TYPE_MODIFIABLE:
|
|
266
|
-
case PropInterface.PROP_TYPE_VISIBLE:
|
|
267
|
-
case PropInterface.PROP_TYPE_ENABLED:
|
|
268
|
-
case PropInterface.PROP_TYPE_CONFIRM_CANCEL:
|
|
269
|
-
case PropInterface.PROP_TYPE_REPEATABLE:
|
|
270
|
-
case PropInterface.PROP_TYPE_HIGHLIGHTING:
|
|
271
|
-
case PropInterface.PROP_TYPE_PASSWORD:
|
|
272
|
-
case PropInterface.PROP_TYPE_MULTILINE:
|
|
273
|
-
case PropInterface.PROP_TYPE_IS_CACHED:
|
|
274
|
-
case PropInterface.PROP_TYPE_PRELOAD_VIEW:
|
|
275
|
-
case PropInterface.PROP_TYPE_MULTILINE_VERTICAL_SCROLL:
|
|
276
|
-
case PropInterface.PROP_TYPE_MULTILINE_ALLOW_CR:
|
|
277
|
-
case PropInterface.PROP_TYPE_ALLOW_COL_RESIZE:
|
|
278
|
-
case PropInterface.PROP_TYPE_ALLOW_REORDER:
|
|
279
|
-
case PropInterface.PROP_TYPE_SHOW_LINES:
|
|
280
|
-
case PropInterface.PROP_TYPE_SORT_COLUMN:
|
|
281
|
-
case PropInterface.PROP_TYPE_COL_ALLOW_FILTERING:
|
|
282
|
-
case PropInterface.PROP_TYPE_DISPLAY_STATUS_BAR:
|
|
283
|
-
case PropInterface.PROP_TYPE_AUTO_REFRESH:
|
|
284
|
-
case PropInterface.PROP_TYPE_PARK_ON_CLICK:
|
|
285
|
-
case PropInterface.PROP_TYPE_SHOW_FULL_ROW:
|
|
286
|
-
case PropInterface.PROP_TYPE_TRACK_SELECTION:
|
|
287
|
-
case PropInterface.PROP_TYPE_SHOW_BUTTONS:
|
|
288
|
-
case PropInterface.PROP_TYPE_LINES_AT_ROOT:
|
|
289
|
-
case PropInterface.PROP_TYPE_ALLOW_EMPTY_DATAVIEW:
|
|
290
|
-
case PropInterface.PROP_TYPE_SCROLL_BAR:
|
|
291
|
-
case PropInterface.PROP_TYPE_COLUMN_DIVIDER:
|
|
292
|
-
case PropInterface.PROP_TYPE_LINE_DIVIDER:
|
|
293
|
-
case PropInterface.PROP_TYPE_THREE_STATES:
|
|
294
|
-
case PropInterface.PROP_TYPE_REFRESH_WHEN_HIDDEN:
|
|
295
|
-
case PropInterface.PROP_TYPE_ALLOW_OPTION:
|
|
296
|
-
case PropInterface.PROP_TYPE_RETAIN_FOCUS:
|
|
297
|
-
case PropInterface.PROP_TYPE_PRINT_DATA:
|
|
298
|
-
case PropInterface.PROP_TYPE_CLOSE_TASKS_BY_MDI_MENU:
|
|
299
|
-
case PropInterface.PROP_TYPE_DATAVIEWCONTROL:
|
|
300
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_OPEN_TASK_WINDOW:
|
|
301
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_EVENTS:
|
|
302
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_INDEX_OPTIMIZATION:
|
|
303
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_RANGE:
|
|
304
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_LOCATE:
|
|
305
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_POSITION:
|
|
306
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_SQL_RANGE:
|
|
307
|
-
case PropInterface.PROP_TYPE_BEFORE_900_VERSION:
|
|
308
|
-
case PropInterface.PROP_TYPE_FILL_WIDTH:
|
|
309
|
-
case PropInterface.PROP_TYPE_MULTI_COLUMN_DISPLAY:
|
|
310
|
-
case PropInterface.PROP_TYPE_IS_ROUTER_OUTLET:
|
|
311
|
-
case PropInterface.PROP_TYPE_DEFAULT_OUTLET:
|
|
312
|
-
case PropInterface.PROP_TYPE_SERVER_READ_AHEAD:
|
|
313
|
-
case PropInterface.PROP_TYPE_AUTO_COMPLETE_MODE_WC:
|
|
314
|
-
this._dataType = StorageAttribute.BOOLEAN;
|
|
315
|
-
break;
|
|
316
|
-
case PropInterface.PROP_TYPE_IMAGE_FILENAME:
|
|
317
|
-
case PropInterface.PROP_TYPE_EVAL_END_CONDITION:
|
|
318
|
-
case PropInterface.PROP_TYPE_FRAME_NAME:
|
|
319
|
-
case PropInterface.PROP_TYPE_NAME:
|
|
320
|
-
case PropInterface.PROP_TYPE_TRASACTION_BEGIN:
|
|
321
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_TRANSACTION_MODE:
|
|
322
|
-
case PropInterface.PROP_TYPE_WALLPAPER:
|
|
323
|
-
case PropInterface.PROP_TYPE_ATTRIBUTE:
|
|
324
|
-
case PropInterface.PROP_TYPE_TRIGGER:
|
|
325
|
-
case PropInterface.PROP_TYPE_SELECT_MODE:
|
|
326
|
-
case PropInterface.PROP_TYPE_TASK_ID:
|
|
327
|
-
case PropInterface.PROP_TYPE_TABBING_CYCLE:
|
|
328
|
-
case PropInterface.PROP_TYPE_PARAMETERS:
|
|
329
|
-
case PropInterface.PROP_TYPE_IMAGE_LIST_INDEXES:
|
|
330
|
-
case PropInterface.PROP_TYPE_VISIBLE_LAYERS_LIST:
|
|
331
|
-
case PropInterface.PROP_TYPE_OBJECT_TYPE:
|
|
332
|
-
case PropInterface.PROP_TYPE_REAL_OBJECT_TYPE:
|
|
333
|
-
case PropInterface.PROP_TYPE_DATAVIEWCONTROL_FIELDS:
|
|
334
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_RANGE_ORDER:
|
|
335
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_LOCATE_ORDER:
|
|
336
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_POSITION_USAGE:
|
|
337
|
-
case PropInterface.PROP_TYPE_TASK_MODE:
|
|
338
|
-
case PropInterface.PROP_TYPE_CUSTOM_PROPERTIES:
|
|
339
|
-
case PropInterface.PROP_TYPE_CUSTOM_VALIDATORS:
|
|
340
|
-
this._dataType = StorageAttribute.ALPHA;
|
|
341
|
-
break;
|
|
342
|
-
case PropInterface.PROP_TYPE_COLUMN_TITLE:
|
|
343
|
-
case PropInterface.PROP_TYPE_DISPLAY_LIST:
|
|
344
|
-
case PropInterface.PROP_TYPE_LABEL:
|
|
345
|
-
case PropInterface.PROP_TYPE_FORMAT:
|
|
346
|
-
case PropInterface.PROP_TYPE_RANGE:
|
|
347
|
-
case PropInterface.PROP_TYPE_FORM_NAME:
|
|
348
|
-
case PropInterface.PROP_TYPE_ADDITIONAL_INFORMATION:
|
|
349
|
-
case PropInterface.PROP_TYPE_TEXT:
|
|
350
|
-
case PropInterface.PROP_TYPE_HINT:
|
|
351
|
-
this._dataType = StorageAttribute.UNICODE;
|
|
352
|
-
break;
|
|
353
|
-
case PropInterface.PROP_TYPE_UOM:
|
|
354
|
-
case PropInterface.PROP_TYPE_HOR_FAC:
|
|
355
|
-
case PropInterface.PROP_TYPE_VER_FAC:
|
|
356
|
-
case PropInterface.PROP_TYPE_TAB_ORDER:
|
|
357
|
-
case PropInterface.PROP_TYPE_WALLPAPER_STYLE:
|
|
358
|
-
case PropInterface.PROP_TYPE_INDEX:
|
|
359
|
-
case PropInterface.PROP_TYPE_LINK_FIELD:
|
|
360
|
-
case PropInterface.PROP_TYPE_DISPLAY_FIELD:
|
|
361
|
-
case PropInterface.PROP_TYPE_PULLDOWN_MENU:
|
|
362
|
-
case PropInterface.PROP_TYPE_WINDOW_TYPE:
|
|
363
|
-
case PropInterface.PROP_TYPE_IMAGE_STYLE:
|
|
364
|
-
case PropInterface.PROP_TYPE_AUTO_FIT:
|
|
365
|
-
case PropInterface.PROP_TYPE_RAISE_AT:
|
|
366
|
-
case PropInterface.PROP_TYPE_EXPAND_WINDOW:
|
|
367
|
-
case PropInterface.PROP_TYPE_VISIBLE_LINES:
|
|
368
|
-
case PropInterface.PROP_TYPE_CHOICE_COLUMNS:
|
|
369
|
-
case PropInterface.PROP_TYPE_STYLE_3D:
|
|
370
|
-
case PropInterface.PROP_TYPE_FONT:
|
|
371
|
-
case PropInterface.PROP_TYPE_LAYER:
|
|
372
|
-
case PropInterface.PROP_TYPE_WIDTH:
|
|
373
|
-
case PropInterface.PROP_TYPE_TITLE_HEIGHT:
|
|
374
|
-
case PropInterface.PROP_TYPE_COLOR:
|
|
375
|
-
case PropInterface.PROP_TYPE_LEFT:
|
|
376
|
-
case PropInterface.PROP_TYPE_TOP:
|
|
377
|
-
case PropInterface.PROP_TYPE_TOOLTIP:
|
|
378
|
-
case PropInterface.PROP_TYPE_HELP_SCR:
|
|
379
|
-
case PropInterface.PROP_TYPE_LINES_IN_TABLE:
|
|
380
|
-
case PropInterface.PROP_TYPE_SELECTION_ROWS:
|
|
381
|
-
case PropInterface.PROP_TYPE_HORIZONTAL_ALIGNMENT:
|
|
382
|
-
case PropInterface.PROP_TYPE_MULTILINE_WORDWRAP_SCROLL:
|
|
383
|
-
case PropInterface.PROP_TYPE_ROW_HEIGHT:
|
|
384
|
-
case PropInterface.PROP_TYPE_WINDOW_WIDTH:
|
|
385
|
-
case PropInterface.PROP_TYPE_MAIN_DISPLAY:
|
|
386
|
-
case PropInterface.PROP_TYPE_TRANSLATOR:
|
|
387
|
-
case PropInterface.PROP_TYPE_FRAMESET_STYLE:
|
|
388
|
-
case PropInterface.PROP_TYPE_FRAME_TYPE:
|
|
389
|
-
case PropInterface.PROP_TYPE_ALLOWED_DIRECTION:
|
|
390
|
-
case PropInterface.PROP_TYPE_ROW_HIGHLIGHT_STYLE:
|
|
391
|
-
case PropInterface.PROP_TYPE_VERTICAL_ALIGNMENT:
|
|
392
|
-
case PropInterface.PROP_TYPE_TABBING_ORDER:
|
|
393
|
-
case PropInterface.PROP_TYPE_STATIC_TYPE:
|
|
394
|
-
case PropInterface.PROP_TYPE_BUTTON_STYLE:
|
|
395
|
-
case PropInterface.PROP_TYPE_LOAD_IMAGE_FROM:
|
|
396
|
-
case PropInterface.PROP_TYPE_SUBFORM_TYPE:
|
|
397
|
-
case PropInterface.PROP_TYPE_BOTTOM_POSITION_INTERVAL:
|
|
398
|
-
case PropInterface.PROP_TYPE_SELECTION_MODE:
|
|
399
|
-
case PropInterface.PROP_TYPE_PRGTSK_NUM:
|
|
400
|
-
case PropInterface.PROP_TYPE_PERSISTENT_FORM_STATE_VERSION:
|
|
401
|
-
case PropInterface.PROP_TYPE_SCROLL_BAR_THUMB:
|
|
402
|
-
case PropInterface.PROP_TYPE_BINDING_LEVEL:
|
|
403
|
-
case PropInterface.PROP_TYPE_CONNECTED_ZOOM_CONTROL:
|
|
404
|
-
case PropInterface.PROP_TYPE_SELECT_PROGRAM:
|
|
405
|
-
if (this._id === PropInterface.PROP_TYPE_TOOLTIP && this._expId > 0)
|
|
406
|
-
this._dataType = StorageAttribute.UNICODE;
|
|
407
|
-
else {
|
|
408
|
-
this._dataType = StorageAttribute.NUMERIC;
|
|
409
|
-
if (Property._numericPropertyPic == null)
|
|
410
|
-
Property._numericPropertyPic = new PIC("N6", StorageAttribute.NUMERIC, compIdx);
|
|
411
|
-
this._pic = Property._numericPropertyPic;
|
|
412
|
-
}
|
|
413
|
-
break;
|
|
414
|
-
case PropInterface.PROP_TYPE_RETURN_ACTION:
|
|
415
|
-
this._dataType = StorageAttribute.NONE;
|
|
416
|
-
break;
|
|
417
|
-
case PropInterface.PROP_TYPE_DATA:
|
|
418
|
-
this._dataType = this._parentObj.DataType;
|
|
419
|
-
break;
|
|
420
|
-
case PropInterface.PROP_TYPE_POP_UP:
|
|
421
|
-
case PropInterface.PROP_TYPE_ORIENTATION_LOCK:
|
|
422
|
-
case PropInterface.PROP_TYPE_ENTER_ANIMATION:
|
|
423
|
-
case PropInterface.PROP_TYPE_EXIT_ANIMATION:
|
|
424
|
-
case PropInterface.PROP_TYPE_NAVIGATION_DRAWER_MENU:
|
|
425
|
-
case PropInterface.PROP_TYPE_ACTION_BAR_MENU:
|
|
426
|
-
case PropInterface.PROP_TYPE_OPEN_PICKER:
|
|
427
|
-
case PropInterface.PROP_TYPE_OPEN_EDIT_DIALOG:
|
|
428
|
-
case PropInterface.PROP_TYPE_DEFAULT_ALIGNMENT:
|
|
429
|
-
case PropInterface.PROP_TYPE_KEYBOARD_TYPE:
|
|
430
|
-
case PropInterface.PROP_TYPE_KEYBOARD_RETURN_KEY:
|
|
431
|
-
case PropInterface.PROP_TYPE_ALLOW_SUGGESTIONS:
|
|
432
|
-
case PropInterface.PROP_TYPE_MOBILE_IMAGE_LIST_FILE_NAME:
|
|
433
|
-
case PropInterface.PROP_TYPE_SWIPE_REFRESH:
|
|
434
|
-
break;
|
|
435
|
-
default:
|
|
436
|
-
Events.WriteExceptionToLog(NString.Format("in Property.setDataType() no case for: {0}", this._id));
|
|
437
|
-
break;
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
setControlAttributes() {
|
|
441
|
-
if (this._parentObj == null || this._parentType !== GuiConstants.PARENT_TYPE_CONTROL) {
|
|
442
|
-
Events.WriteExceptionToLog("in Property.setControlAttributes() there is no parent or the parent is not a control");
|
|
443
|
-
return;
|
|
444
|
-
}
|
|
445
|
-
let parentControl = this._parentObj;
|
|
446
|
-
switch (this._id) {
|
|
447
|
-
case PropInterface.PROP_TYPE_FRAME_NAME:
|
|
448
|
-
case PropInterface.PROP_TYPE_NAME:
|
|
449
|
-
parentControl.Name = this._val;
|
|
450
|
-
break;
|
|
451
|
-
case PropInterface.PROP_TYPE_ATTRIBUTE:
|
|
452
|
-
parentControl.DataType = this._val[0];
|
|
453
|
-
break;
|
|
454
|
-
case PropInterface.PROP_TYPE_FORMAT:
|
|
455
|
-
parentControl.setPicStr(this._val, this._expId);
|
|
456
|
-
break;
|
|
457
|
-
case PropInterface.PROP_TYPE_RANGE:
|
|
458
|
-
parentControl.setRange(this._val);
|
|
459
|
-
break;
|
|
460
|
-
case PropInterface.PROP_TYPE_DATA:
|
|
461
|
-
if (this._expId > 0)
|
|
462
|
-
parentControl.setValExp(this._expId);
|
|
463
|
-
else if (this._val != null)
|
|
464
|
-
parentControl.setField(this._val);
|
|
465
|
-
break;
|
|
466
|
-
case PropInterface.PROP_TYPE_BUTTON_STYLE:
|
|
467
|
-
if (this._val != null)
|
|
468
|
-
parentControl.ButtonStyle = this.GetComputedValueInteger();
|
|
469
|
-
break;
|
|
470
|
-
case PropInterface.PROP_TYPE_LAYER:
|
|
471
|
-
if (this._val != null)
|
|
472
|
-
parentControl.Layer = this.GetComputedValueInteger();
|
|
473
|
-
break;
|
|
474
|
-
default:
|
|
475
|
-
break;
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
getParentObj() {
|
|
479
|
-
return this._parentObj;
|
|
480
|
-
}
|
|
481
|
-
getParentType() {
|
|
482
|
-
return this._parentType;
|
|
483
|
-
}
|
|
484
|
-
getID() {
|
|
485
|
-
return this._id;
|
|
486
|
-
}
|
|
487
|
-
setValue(mgVal) {
|
|
488
|
-
let compIdx = this._parentObj.getCompIdx();
|
|
489
|
-
if (this._id === PropInterface.PROP_TYPE_DATA || this._id === PropInterface.PROP_TYPE_NODE_ID || this._id === PropInterface.PROP_TYPE_NODE_PARENTID)
|
|
490
|
-
return;
|
|
491
|
-
if (this._dataType === StorageAttribute.NONE)
|
|
492
|
-
this.setDataType();
|
|
493
|
-
switch (this._dataType) {
|
|
494
|
-
case StorageAttribute.NUMERIC:
|
|
495
|
-
if (mgVal == null)
|
|
496
|
-
mgVal = "FF00000000000000000000000000000000000000";
|
|
497
|
-
this._val = DisplayConvertor.Instance.mg2disp(mgVal, "", this._pic, false, compIdx, false).trim();
|
|
498
|
-
break;
|
|
499
|
-
case StorageAttribute.ALPHA:
|
|
500
|
-
case StorageAttribute.BLOB:
|
|
501
|
-
case StorageAttribute.BLOB_VECTOR:
|
|
502
|
-
case StorageAttribute.BOOLEAN:
|
|
503
|
-
case StorageAttribute.UNICODE:
|
|
504
|
-
this._val = mgVal;
|
|
505
|
-
break;
|
|
506
|
-
default:
|
|
507
|
-
throw new ApplicationException("in Property.setValue() illegal data type: " + this._dataType);
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
SetValue(val) {
|
|
511
|
-
this._val = String(val);
|
|
512
|
-
}
|
|
513
|
-
setOrgValue() {
|
|
514
|
-
this._orgValue = this._val;
|
|
515
|
-
}
|
|
516
|
-
SetStudioValueAsOrgValue() {
|
|
517
|
-
this._orgValue = this.StudioValue;
|
|
518
|
-
}
|
|
519
|
-
getForm() {
|
|
520
|
-
let form = null;
|
|
521
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_FORM)
|
|
522
|
-
form = this._parentObj;
|
|
523
|
-
else if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL)
|
|
524
|
-
form = this._parentObj.getForm();
|
|
525
|
-
return form;
|
|
526
|
-
}
|
|
527
|
-
GetTaskByParentObject() {
|
|
528
|
-
let task = null;
|
|
529
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_FORM)
|
|
530
|
-
task = this._parentObj.getTask();
|
|
531
|
-
else if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL)
|
|
532
|
-
task = this._parentObj.getForm().getTask();
|
|
533
|
-
else if (this._parentType === GuiConstants.PARENT_TYPE_TASK)
|
|
534
|
-
task = this._parentObj;
|
|
535
|
-
return task;
|
|
536
|
-
}
|
|
537
|
-
RefreshDisplay(forceRefresh) {
|
|
538
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
539
|
-
yield this.RefreshDisplayWithCurrentLine(forceRefresh, Int32.MinValue);
|
|
540
|
-
});
|
|
541
|
-
}
|
|
542
|
-
ShouldSkipRefreshControl() {
|
|
543
|
-
let skip = false;
|
|
544
|
-
let mgControl = this._parentObj;
|
|
545
|
-
switch (this._id) {
|
|
546
|
-
case PropInterface.PROP_TYPE_HEBREW:
|
|
547
|
-
if (mgControl.isTableControl())
|
|
548
|
-
skip = true;
|
|
549
|
-
break;
|
|
550
|
-
case PropInterface.PROP_TYPE_NODE_ID:
|
|
551
|
-
case PropInterface.PROP_TYPE_NODE_PARENTID:
|
|
552
|
-
case PropInterface.PROP_TYPE_DATA:
|
|
553
|
-
case PropInterface.PROP_TYPE_HIGHLIGHTING:
|
|
554
|
-
case PropInterface.PROP_TYPE_MUST_INPUT:
|
|
555
|
-
case PropInterface.PROP_TYPE_HELP_SCR:
|
|
556
|
-
case PropInterface.PROP_TYPE_SELECT_PROGRAM:
|
|
557
|
-
case PropInterface.PROP_TYPE_SELECT_MODE:
|
|
558
|
-
case PropInterface.PROP_TYPE_ALLOWED_DIRECTION:
|
|
559
|
-
case PropInterface.PROP_TYPE_RETURN_ACTION:
|
|
560
|
-
case PropInterface.PROP_TYPE_ATTRIBUTE:
|
|
561
|
-
case PropInterface.PROP_TYPE_REPEATABLE:
|
|
562
|
-
case PropInterface.PROP_TYPE_FRAME_NAME:
|
|
563
|
-
case PropInterface.PROP_TYPE_TRIGGER:
|
|
564
|
-
case PropInterface.PROP_TYPE_TAB_ORDER:
|
|
565
|
-
case PropInterface.PROP_TYPE_IS_CACHED:
|
|
566
|
-
case PropInterface.PROP_TYPE_LAYER:
|
|
567
|
-
case PropInterface.PROP_TYPE_AUTO_FIT:
|
|
568
|
-
case PropInterface.PROP_TYPE_RAISE_AT:
|
|
569
|
-
case PropInterface.PROP_TYPE_FRAMESET_STYLE:
|
|
570
|
-
case PropInterface.PROP_TYPE_FRAME_TYPE:
|
|
571
|
-
case PropInterface.PROP_TYPE_RANGE:
|
|
572
|
-
case PropInterface.PROP_TYPE_WINDOW_WIDTH:
|
|
573
|
-
case PropInterface.PROP_TYPE_TABBING_ORDER:
|
|
574
|
-
case PropInterface.PROP_TYPE_AUTO_REFRESH:
|
|
575
|
-
case PropInterface.PROP_TYPE_PARAMETERS:
|
|
576
|
-
case PropInterface.PROP_TYPE_OBJECT_TYPE:
|
|
577
|
-
case PropInterface.PROP_TYPE_RETAIN_FOCUS:
|
|
578
|
-
case PropInterface.PROP_TYPE_SUBFORM_TYPE:
|
|
579
|
-
case PropInterface.PROP_TYPE_REAL_OBJECT_TYPE:
|
|
580
|
-
case PropInterface.PROP_TYPE_ADDITIONAL_INFORMATION:
|
|
581
|
-
case PropInterface.PROP_TYPE_DATAVIEWCONTROL:
|
|
582
|
-
case PropInterface.PROP_TYPE_DATAVIEWCONTROL_FIELDS:
|
|
583
|
-
case PropInterface.PROP_TYPE_PRGTSK_NUM:
|
|
584
|
-
case PropInterface.PROP_TYPE_INDEX:
|
|
585
|
-
case PropInterface.PROP_TYPE_DISPLAY_FIELD:
|
|
586
|
-
case PropInterface.PROP_TYPE_LINK_FIELD:
|
|
587
|
-
case PropInterface.PROP_TYPE_BEFORE_900_VERSION:
|
|
588
|
-
case PropInterface.PROP_TYPE_REFRESH_WHEN_HIDDEN:
|
|
589
|
-
case PropInterface.PROP_TYPE_SERVER_READ_AHEAD:
|
|
590
|
-
skip = true;
|
|
591
|
-
break;
|
|
592
|
-
case PropInterface.PROP_TYPE_BUTTON_STYLE:
|
|
593
|
-
if (!this._parentObj.isRadio())
|
|
594
|
-
skip = true;
|
|
595
|
-
break;
|
|
596
|
-
default:
|
|
597
|
-
break;
|
|
598
|
-
}
|
|
599
|
-
return skip;
|
|
600
|
-
}
|
|
601
|
-
ShouldSkipRefreshForm() {
|
|
602
|
-
Debug.Assert(this._parentType === GuiConstants.PARENT_TYPE_FORM);
|
|
603
|
-
let skip = false;
|
|
604
|
-
let mgFormBase = this._parentObj;
|
|
605
|
-
switch (this._id) {
|
|
606
|
-
case PropInterface.PROP_TYPE_WINDOW_TYPE:
|
|
607
|
-
if (!this._parentObj.IsFirstRefreshOfProps())
|
|
608
|
-
skip = true;
|
|
609
|
-
break;
|
|
610
|
-
case PropInterface.PROP_TYPE_LINES_IN_TABLE:
|
|
611
|
-
case PropInterface.PROP_TYPE_HELP_SCR:
|
|
612
|
-
case PropInterface.PROP_TYPE_TABBING_ORDER:
|
|
613
|
-
case PropInterface.PROP_TYPE_PERSISTENT_FORM_STATE_VERSION:
|
|
614
|
-
skip = true;
|
|
615
|
-
break;
|
|
616
|
-
default:
|
|
617
|
-
break;
|
|
618
|
-
}
|
|
619
|
-
if (!skip && mgFormBase.isSubForm()) {
|
|
620
|
-
skip = true;
|
|
621
|
-
switch (this._id) {
|
|
622
|
-
case PropInterface.PROP_TYPE_CUSTOM_PROPERTIES:
|
|
623
|
-
case PropInterface.PROP_TYPE_CUSTOM_VALIDATORS:
|
|
624
|
-
skip = false;
|
|
625
|
-
break;
|
|
626
|
-
}
|
|
627
|
-
}
|
|
628
|
-
return skip;
|
|
629
|
-
}
|
|
630
|
-
ShouldSkipRefreshTask() {
|
|
631
|
-
let skip = false;
|
|
632
|
-
switch (this._id) {
|
|
633
|
-
case PropInterface.PROP_TYPE_ALLOW_CREATE:
|
|
634
|
-
case PropInterface.PROP_TYPE_ALLOW_DELETE:
|
|
635
|
-
case PropInterface.PROP_TYPE_ALLOW_MODIFY:
|
|
636
|
-
case PropInterface.PROP_TYPE_ALLOW_QUERY:
|
|
637
|
-
case PropInterface.PROP_TYPE_ALLOW_RANGE:
|
|
638
|
-
case PropInterface.PROP_TYPE_ALLOW_LOCATE:
|
|
639
|
-
case PropInterface.PROP_TYPE_ALLOW_SORT:
|
|
640
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_INDEX:
|
|
641
|
-
case PropInterface.PROP_TYPE_TABBING_CYCLE:
|
|
642
|
-
case PropInterface.PROP_TYPE_CONFIRM_CANCEL:
|
|
643
|
-
case PropInterface.PROP_TYPE_CONFIRM_UPDATE:
|
|
644
|
-
case PropInterface.PROP_TYPE_END_CONDITION:
|
|
645
|
-
case PropInterface.PROP_TYPE_EVAL_END_CONDITION:
|
|
646
|
-
case PropInterface.PROP_TYPE_FORCE_SUFFIX:
|
|
647
|
-
case PropInterface.PROP_TYPE_FORCE_DELETE:
|
|
648
|
-
case PropInterface.PROP_TYPE_TASK_MODE:
|
|
649
|
-
case PropInterface.PROP_TYPE_SELECTION:
|
|
650
|
-
case PropInterface.PROP_TYPE_TRASACTION_BEGIN:
|
|
651
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_TRANSACTION_MODE:
|
|
652
|
-
case PropInterface.PROP_TYPE_PRINT_DATA:
|
|
653
|
-
case PropInterface.PROP_TYPE_CLOSE_TASKS_BY_MDI_MENU:
|
|
654
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_OPEN_TASK_WINDOW:
|
|
655
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_EVENTS:
|
|
656
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_CHUNK_SIZE:
|
|
657
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_INDEX_OPTIMIZATION:
|
|
658
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_RANGE:
|
|
659
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_RANGE_ORDER:
|
|
660
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_LOCATE:
|
|
661
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_LOCATE_ORDER:
|
|
662
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_POSITION:
|
|
663
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_POSITION_USAGE:
|
|
664
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_SQL_RANGE:
|
|
665
|
-
skip = true;
|
|
666
|
-
break;
|
|
667
|
-
default:
|
|
668
|
-
break;
|
|
669
|
-
}
|
|
670
|
-
return skip;
|
|
671
|
-
}
|
|
672
|
-
ShouldSkipRefresh() {
|
|
673
|
-
let skip = false;
|
|
674
|
-
switch (this._parentType) {
|
|
675
|
-
case GuiConstants.PARENT_TYPE_CONTROL:
|
|
676
|
-
skip = this.ShouldSkipRefreshControl();
|
|
677
|
-
break;
|
|
678
|
-
case GuiConstants.PARENT_TYPE_FORM:
|
|
679
|
-
skip = this.ShouldSkipRefreshForm();
|
|
680
|
-
break;
|
|
681
|
-
case GuiConstants.PARENT_TYPE_TASK:
|
|
682
|
-
skip = this.ShouldSkipRefreshTask();
|
|
683
|
-
break;
|
|
684
|
-
default:
|
|
685
|
-
break;
|
|
686
|
-
}
|
|
687
|
-
switch (this._id) {
|
|
688
|
-
case PropInterface.PROP_TYPE_POP_UP:
|
|
689
|
-
case PropInterface.PROP_TYPE_ORIENTATION_LOCK:
|
|
690
|
-
case PropInterface.PROP_TYPE_ENTER_ANIMATION:
|
|
691
|
-
case PropInterface.PROP_TYPE_EXIT_ANIMATION:
|
|
692
|
-
case PropInterface.PROP_TYPE_NAVIGATION_DRAWER_MENU:
|
|
693
|
-
case PropInterface.PROP_TYPE_ACTION_BAR_MENU:
|
|
694
|
-
case PropInterface.PROP_TYPE_OPEN_PICKER:
|
|
695
|
-
case PropInterface.PROP_TYPE_OPEN_EDIT_DIALOG:
|
|
696
|
-
case PropInterface.PROP_TYPE_DEFAULT_ALIGNMENT:
|
|
697
|
-
case PropInterface.PROP_TYPE_KEYBOARD_TYPE:
|
|
698
|
-
case PropInterface.PROP_TYPE_KEYBOARD_RETURN_KEY:
|
|
699
|
-
case PropInterface.PROP_TYPE_ALLOW_SUGGESTIONS:
|
|
700
|
-
case PropInterface.PROP_TYPE_MOBILE_IMAGE_LIST_FILE_NAME:
|
|
701
|
-
skip = true;
|
|
702
|
-
break;
|
|
703
|
-
}
|
|
704
|
-
return skip;
|
|
705
|
-
}
|
|
706
|
-
RefreshDisplayWithCurrentLine(forceRefresh, currLine) {
|
|
707
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
708
|
-
yield this.RefreshDisplayWithCurrLineAndCheckSkipRefresh(forceRefresh, currLine, true);
|
|
709
|
-
});
|
|
710
|
-
}
|
|
711
|
-
SkipWhenNoExpression() {
|
|
712
|
-
let skipWhenNoExpression = true;
|
|
713
|
-
let ctrl = ((this._parentObj instanceof GuiControlPropertyAdapter) ? this._parentObj : null);
|
|
714
|
-
if ((ctrl != null && ctrl.isButton() && this._id === PropInterface.PROP_TYPE_FORMAT) ||
|
|
715
|
-
(ctrl != null && ctrl.isComboBox() && this._id === PropInterface.PROP_TYPE_LABEL) ||
|
|
716
|
-
(ctrl != null && ctrl.isListBox() && this._id === PropInterface.PROP_TYPE_LABEL) ||
|
|
717
|
-
(ctrl != null && ctrl.isRadio() && this._id === PropInterface.PROP_TYPE_LABEL) ||
|
|
718
|
-
(ctrl != null && ctrl.isCheckBox() && this._id === PropInterface.PROP_TYPE_LABEL) ||
|
|
719
|
-
(ctrl != null && ctrl.isTabControl() && this._id === PropInterface.PROP_TYPE_LABEL) ||
|
|
720
|
-
(ctrl != null && ctrl.isImageControl() && this._id === PropInterface.PROP_TYPE_IMAGE_FILENAME) ||
|
|
721
|
-
(ctrl != null && ctrl.IsImageButton() && this._id === PropInterface.PROP_TYPE_IMAGE_FILENAME) ||
|
|
722
|
-
(ctrl != null && ctrl.isColumnControl() && this._id === PropInterface.PROP_TYPE_COLUMN_TITLE) ||
|
|
723
|
-
(this._id === PropInterface.PROP_TYPE_DISPLAY_LIST) ||
|
|
724
|
-
(this._id === PropInterface.PROP_TYPE_TEXT) ||
|
|
725
|
-
(this._id === PropInterface.PROP_TYPE_TOOLTIP) ||
|
|
726
|
-
(this._id === PropInterface.PROP_TYPE_HINT) ||
|
|
727
|
-
(this._id === PropInterface.PROP_TYPE_PASSWORD) ||
|
|
728
|
-
(this._id === PropInterface.PROP_TYPE_CUSTOM_PROPERTIES) ||
|
|
729
|
-
(this._id === PropInterface.PROP_TYPE_CUSTOM_VALIDATORS) ||
|
|
730
|
-
(this._id === PropInterface.PROP_TYPE_VISIBLE) ||
|
|
731
|
-
(this._id === PropInterface.PROP_TYPE_ENABLED) ||
|
|
732
|
-
(this._id === PropInterface.PROP_TYPE_BINDING_LEVEL))
|
|
733
|
-
skipWhenNoExpression = false;
|
|
734
|
-
return skipWhenNoExpression;
|
|
735
|
-
}
|
|
736
|
-
RefreshDisplayWithCurrLineAndCheckSkipRefresh(forceRefresh, currLine, checkSkipRefresh) {
|
|
737
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
738
|
-
let ctrl = null;
|
|
739
|
-
let line = 0;
|
|
740
|
-
let prevValue;
|
|
741
|
-
let valChanged = true;
|
|
742
|
-
if (this._val === null && this._expId === 0) {
|
|
743
|
-
Events.WriteExceptionToLog("in Property.RefreshDisplay() null value and expression");
|
|
744
|
-
return;
|
|
745
|
-
}
|
|
746
|
-
if (checkSkipRefresh && this.ShouldSkipRefresh())
|
|
747
|
-
return;
|
|
748
|
-
if (this._expId === 0 && this.SkipWhenNoExpression())
|
|
749
|
-
return;
|
|
750
|
-
if (this._prevValues.length === 0)
|
|
751
|
-
this.setPrevArraySize();
|
|
752
|
-
yield this.ComputeValue();
|
|
753
|
-
switch (this._parentType) {
|
|
754
|
-
case GuiConstants.PARENT_TYPE_CONTROL:
|
|
755
|
-
ctrl = this._parentObj;
|
|
756
|
-
if (this._id === PropInterface.PROP_TYPE_FORMAT && this._expId > 0)
|
|
757
|
-
ctrl.computePIC(this._val);
|
|
758
|
-
if (ctrl.IsRepeatable && !ctrl.getForm().isRefreshRepeatableAllowed())
|
|
759
|
-
return;
|
|
760
|
-
if (currLine === Int32.MinValue)
|
|
761
|
-
line = this.getLine();
|
|
762
|
-
else
|
|
763
|
-
line = currLine;
|
|
764
|
-
prevValue = this._prevValues.get_Item(line);
|
|
765
|
-
if (!forceRefresh && (this._val === prevValue)
|
|
766
|
-
&& this._id !== PropInterface.PROP_TYPE_MODIFIABLE
|
|
767
|
-
&& this._id !== PropInterface.PROP_TYPE_VISIBLE
|
|
768
|
-
&& this._id !== PropInterface.PROP_TYPE_ENABLED)
|
|
769
|
-
return;
|
|
770
|
-
if (ctrl.Type === MgControlType.CTRL_TYPE_COLUMN
|
|
771
|
-
&& this._id === PropInterface.PROP_TYPE_VISIBLE
|
|
772
|
-
&& this._val === prevValue)
|
|
773
|
-
return;
|
|
774
|
-
if (this._val === prevValue)
|
|
775
|
-
valChanged = false;
|
|
776
|
-
this._prevValues.set_Item(line, this._val);
|
|
777
|
-
break;
|
|
778
|
-
case GuiConstants.PARENT_TYPE_FORM:
|
|
779
|
-
prevValue = this._prevValues.get_Item(0);
|
|
780
|
-
if (!forceRefresh && (this._val === prevValue))
|
|
781
|
-
return;
|
|
782
|
-
this._prevValues.set_Item(0, this._val);
|
|
783
|
-
break;
|
|
784
|
-
case GuiConstants.PARENT_TYPE_TASK:
|
|
785
|
-
Events.WriteExceptionToLog(NString.Format("Property.RefreshDisplay(): task property {0} wasn't handled", this._id));
|
|
786
|
-
return;
|
|
787
|
-
default:
|
|
788
|
-
Events.WriteExceptionToLog(NString.Format("Property.RefreshDisplay(): parentType unknown, property {0} wasn't handled", this._id));
|
|
789
|
-
return;
|
|
790
|
-
}
|
|
791
|
-
switch (this._id) {
|
|
792
|
-
case PropInterface.PROP_TYPE_IMAGE_FILENAME:
|
|
793
|
-
this.onImageFileName();
|
|
794
|
-
break;
|
|
795
|
-
case PropInterface.PROP_TYPE_ENABLED:
|
|
796
|
-
this.onEnable(valChanged);
|
|
797
|
-
break;
|
|
798
|
-
case PropInterface.PROP_TYPE_VISIBLE:
|
|
799
|
-
yield this.onVisible(valChanged);
|
|
800
|
-
break;
|
|
801
|
-
case PropInterface.PROP_TYPE_NAME:
|
|
802
|
-
this.OnControlName();
|
|
803
|
-
break;
|
|
804
|
-
case PropInterface.PROP_TYPE_FORM_NAME:
|
|
805
|
-
this.onFormName();
|
|
806
|
-
break;
|
|
807
|
-
case PropInterface.PROP_TYPE_COLUMN_TITLE:
|
|
808
|
-
this.onText(0);
|
|
809
|
-
break;
|
|
810
|
-
case PropInterface.PROP_TYPE_TEXT:
|
|
811
|
-
this.onText(line);
|
|
812
|
-
break;
|
|
813
|
-
case PropInterface.PROP_TYPE_HINT:
|
|
814
|
-
this.onHint();
|
|
815
|
-
break;
|
|
816
|
-
case PropInterface.PROP_TYPE_MODIFIABLE:
|
|
817
|
-
yield this.onModifiable();
|
|
818
|
-
break;
|
|
819
|
-
case PropInterface.PROP_TYPE_TOOLTIP:
|
|
820
|
-
this.onTooltip();
|
|
821
|
-
break;
|
|
822
|
-
case PropInterface.PROP_TYPE_DISPLAY_LIST:
|
|
823
|
-
yield this.onDisplayList(line);
|
|
824
|
-
break;
|
|
825
|
-
case PropInterface.PROP_TYPE_AUTO_COMPLETE_MODE_WC:
|
|
826
|
-
this.onAutoCompleteMode();
|
|
827
|
-
break;
|
|
828
|
-
case PropInterface.PROP_TYPE_VISIBLE_LAYERS_LIST:
|
|
829
|
-
yield this.onVisibleLayerList(line);
|
|
830
|
-
break;
|
|
831
|
-
case PropInterface.PROP_TYPE_FORMAT:
|
|
832
|
-
this.onFormat();
|
|
833
|
-
break;
|
|
834
|
-
case PropInterface.PROP_TYPE_LABEL:
|
|
835
|
-
yield this.onLabel(line);
|
|
836
|
-
break;
|
|
837
|
-
case PropInterface.PROP_TYPE_PASSWORD:
|
|
838
|
-
this.onPassword();
|
|
839
|
-
break;
|
|
840
|
-
case PropInterface.PROP_TYPE_MODIFY_IN_QUERY:
|
|
841
|
-
case PropInterface.PROP_TYPE_TAB_IN:
|
|
842
|
-
case PropInterface.PROP_TYPE_PARK_ON_CLICK:
|
|
843
|
-
case PropInterface.PROP_TYPE_LOAD_IMAGE_FROM:
|
|
844
|
-
break;
|
|
845
|
-
case PropInterface.PROP_TYPE_CUSTOM_PROPERTIES:
|
|
846
|
-
this.onCustomProperties();
|
|
847
|
-
break;
|
|
848
|
-
case PropInterface.PROP_TYPE_CUSTOM_VALIDATORS:
|
|
849
|
-
this.onCustomValidators();
|
|
850
|
-
break;
|
|
851
|
-
case PropInterface.PROP_TYPE_BINDING_LEVEL:
|
|
852
|
-
this.onBindingLevel();
|
|
853
|
-
break;
|
|
854
|
-
default:
|
|
855
|
-
Events.WriteExceptionToLog(NString.Format("Property.RefreshDisplay(): Property {0} wasn't handled", this._id));
|
|
856
|
-
break;
|
|
857
|
-
}
|
|
858
|
-
});
|
|
859
|
-
}
|
|
860
|
-
ShouldBeComputedOnce() {
|
|
861
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_TASK) {
|
|
862
|
-
switch (this._id) {
|
|
863
|
-
case PropInterface.PROP_TYPE_TASK_MODE:
|
|
864
|
-
case PropInterface.PROP_TYPE_PRELOAD_VIEW:
|
|
865
|
-
case PropInterface.PROP_TYPE_TABBING_CYCLE:
|
|
866
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_OPEN_TASK_WINDOW:
|
|
867
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_EVENTS:
|
|
868
|
-
case PropInterface.PROP_TYPE_ALLOW_LOCATE_IN_QUERY:
|
|
869
|
-
case PropInterface.PROP_TYPE_PRINT_DATA:
|
|
870
|
-
case PropInterface.PROP_TYPE_ALLOW_RANGE:
|
|
871
|
-
case PropInterface.PROP_TYPE_ALLOW_LOCATE:
|
|
872
|
-
case PropInterface.PROP_TYPE_ALLOW_SORT:
|
|
873
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_INDEX:
|
|
874
|
-
case PropInterface.PROP_TYPE_MAIN_DISPLAY:
|
|
875
|
-
return true;
|
|
876
|
-
}
|
|
877
|
-
}
|
|
878
|
-
else if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
879
|
-
if (this._id === PropInterface.PROP_TYPE_IS_CACHED || this._id === PropInterface.PROP_TYPE_MULTILINE)
|
|
880
|
-
return true;
|
|
881
|
-
}
|
|
882
|
-
return false;
|
|
883
|
-
}
|
|
884
|
-
IsComputedOnceOnServer() {
|
|
885
|
-
if (this.ShouldBeComputedOnce()) {
|
|
886
|
-
let task = this.GetTaskByParentObject();
|
|
887
|
-
if (task != null)
|
|
888
|
-
return !task.ShouldEvaluatePropertyLocally(this._id);
|
|
889
|
-
}
|
|
890
|
-
return false;
|
|
891
|
-
}
|
|
892
|
-
ComputeValue() {
|
|
893
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
894
|
-
let result = null;
|
|
895
|
-
let len = 255;
|
|
896
|
-
let wasEvaluated = new RefParam(false);
|
|
897
|
-
if (this._id === PropInterface.PROP_TYPE_CUSTOM_PROPERTIES) {
|
|
898
|
-
yield this.computeCustomPropertiesValues();
|
|
899
|
-
result = this.GetArrayValuesForCustomProperties();
|
|
900
|
-
this.setValue(result);
|
|
901
|
-
}
|
|
902
|
-
if (this._id === PropInterface.PROP_TYPE_CUSTOM_VALIDATORS) {
|
|
903
|
-
yield this.computeCustomValidators();
|
|
904
|
-
result = this.GetArrayValuesForCustomValidationProperties();
|
|
905
|
-
this.setValue(result);
|
|
906
|
-
}
|
|
907
|
-
else if (this._expId > 0) {
|
|
908
|
-
if (this.ShouldBeComputedOnce() && this._expAlreadyComputedOnce)
|
|
909
|
-
return;
|
|
910
|
-
this._expAlreadyComputedOnce = true;
|
|
911
|
-
let alwaysEvaluate = false;
|
|
912
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_TASK)
|
|
913
|
-
alwaysEvaluate = true;
|
|
914
|
-
if (this._id === PropInterface.PROP_TYPE_FORMAT) {
|
|
915
|
-
len = 65535;
|
|
916
|
-
result = StrUtil.rtrim(yield this._parentObj.EvaluateExpression(this._expId, this._dataType, len, true, StorageAttribute.SKIP, alwaysEvaluate, wasEvaluated));
|
|
917
|
-
}
|
|
918
|
-
else {
|
|
919
|
-
try {
|
|
920
|
-
result = yield this._parentObj.EvaluateExpression(this._expId, this._dataType, len, true, StorageAttribute.SKIP, alwaysEvaluate, wasEvaluated);
|
|
921
|
-
}
|
|
922
|
-
catch (e) {
|
|
923
|
-
let warningMsg = new StringBuilder("Exception: " + e.Message);
|
|
924
|
-
if (this._parentObj instanceof GuiControlPropertyAdapter)
|
|
925
|
-
warningMsg.Append(" Control: " + this._parentObj.Name);
|
|
926
|
-
Events.WriteWarningToLog(warningMsg.ToString());
|
|
927
|
-
}
|
|
928
|
-
}
|
|
929
|
-
if (wasEvaluated.value) {
|
|
930
|
-
result = this.updateResult(result);
|
|
931
|
-
this.setValue(result);
|
|
932
|
-
}
|
|
933
|
-
else if (this._val == null && this._parentType !== GuiConstants.PARENT_TYPE_CONTROL) {
|
|
934
|
-
result = PropDefaults.getDefaultValue(this._id, this._parentType, this._parentObj);
|
|
935
|
-
this.setValue(result);
|
|
936
|
-
}
|
|
937
|
-
}
|
|
938
|
-
});
|
|
939
|
-
}
|
|
940
|
-
updateResult(result) {
|
|
941
|
-
switch (this._id) {
|
|
942
|
-
case PropInterface.PROP_TYPE_FORMAT:
|
|
943
|
-
if (result == null)
|
|
944
|
-
result = NString.Empty;
|
|
945
|
-
break;
|
|
946
|
-
case PropInterface.PROP_TYPE_TASK_MODE:
|
|
947
|
-
result = Property.updateTaskModeResult(result);
|
|
948
|
-
break;
|
|
949
|
-
default:
|
|
950
|
-
return result;
|
|
951
|
-
}
|
|
952
|
-
return result;
|
|
953
|
-
}
|
|
954
|
-
static updateTaskModeResult(result) {
|
|
955
|
-
let code = ' ';
|
|
956
|
-
if (!NString.IsNullOrEmpty(result)) {
|
|
957
|
-
code = result[0].toUpperCase();
|
|
958
|
-
switch (code) {
|
|
959
|
-
case 'Q':
|
|
960
|
-
code = 'E';
|
|
961
|
-
break;
|
|
962
|
-
case 'F':
|
|
963
|
-
code = 'O';
|
|
964
|
-
break;
|
|
965
|
-
case 'O':
|
|
966
|
-
code = 'N';
|
|
967
|
-
break;
|
|
968
|
-
}
|
|
969
|
-
}
|
|
970
|
-
return code;
|
|
971
|
-
}
|
|
972
|
-
getValue() {
|
|
973
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
974
|
-
yield this.ComputeValue();
|
|
975
|
-
return this._val;
|
|
976
|
-
});
|
|
977
|
-
}
|
|
978
|
-
getValueInt() {
|
|
979
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
980
|
-
let result = 0;
|
|
981
|
-
yield this.ComputeValue();
|
|
982
|
-
if (this._val !== null)
|
|
983
|
-
result = NNumber.Parse(this._val);
|
|
984
|
-
return result;
|
|
985
|
-
});
|
|
986
|
-
}
|
|
987
|
-
GetComputedValueInteger() {
|
|
988
|
-
return NNumber.Parse(this._val);
|
|
989
|
-
}
|
|
990
|
-
getValueBoolean() {
|
|
991
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
992
|
-
if (this._dataType === StorageAttribute.BOOLEAN) {
|
|
993
|
-
yield this.getValue();
|
|
994
|
-
return DisplayConvertor.toBoolean(this._val);
|
|
995
|
-
}
|
|
996
|
-
else {
|
|
997
|
-
Events.WriteExceptionToLog(NString.Format("Property.getValueBoolean() was called for non boolean type property: {0}", this._id));
|
|
998
|
-
}
|
|
999
|
-
});
|
|
1000
|
-
}
|
|
1001
|
-
GetComputedValue() {
|
|
1002
|
-
return this._val;
|
|
1003
|
-
}
|
|
1004
|
-
GetComputedValueBoolean() {
|
|
1005
|
-
if (this._dataType === StorageAttribute.BOOLEAN) {
|
|
1006
|
-
return DisplayConvertor.toBoolean(this._val);
|
|
1007
|
-
}
|
|
1008
|
-
else {
|
|
1009
|
-
Events.WriteExceptionToLog(NString.Format("Property.getValueBoolean() was called for non boolean type property: {0}", this._id));
|
|
1010
|
-
}
|
|
1011
|
-
}
|
|
1012
|
-
getPrevValue(line) {
|
|
1013
|
-
if (line < this._prevValues.length)
|
|
1014
|
-
return this._prevValues.get_Item(line);
|
|
1015
|
-
return null;
|
|
1016
|
-
}
|
|
1017
|
-
isExpression() {
|
|
1018
|
-
return this._expId > 0;
|
|
1019
|
-
}
|
|
1020
|
-
GetExpressionId() {
|
|
1021
|
-
return this._expId;
|
|
1022
|
-
}
|
|
1023
|
-
onImageFileName() {
|
|
1024
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1025
|
-
let mgControlBase = this._parentObj;
|
|
1026
|
-
if (mgControlBase.isTabControl()) {
|
|
1027
|
-
mgControlBase.setImageList(this.GetComputedValue());
|
|
1028
|
-
}
|
|
1029
|
-
else if (mgControlBase.isImageControl() || mgControlBase.isRadio() || mgControlBase.isCheckBox() || mgControlBase.IsImageButton()) {
|
|
1030
|
-
mgControlBase.setImageWithFileName(this.GetComputedValue());
|
|
1031
|
-
}
|
|
1032
|
-
}
|
|
1033
|
-
else
|
|
1034
|
-
throw new ApplicationException("in onImageFileName.onEnable()");
|
|
1035
|
-
}
|
|
1036
|
-
onEnable(valChanged) {
|
|
1037
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1038
|
-
let ctrl = this._parentObj;
|
|
1039
|
-
let currentEditingControl = ctrl.getForm().getTask().CurrentEditingControl;
|
|
1040
|
-
if (this._val !== null && this._val === "0" && valChanged && currentEditingControl !== null &&
|
|
1041
|
-
(ctrl === currentEditingControl || currentEditingControl.isDescendentOfControl(ctrl) || ctrl === currentEditingControl.getLinkedParent(false))) {
|
|
1042
|
-
let parkedControl = ctrl.getForm().getTask().getLastParkedCtrl();
|
|
1043
|
-
if (parkedControl !== null && parkedControl.InControl && (ctrl === parkedControl || parkedControl.isDescendentOfControl(ctrl))) {
|
|
1044
|
-
Events.OnNonParkableLastParkedCtrl(ctrl);
|
|
1045
|
-
ctrl.getForm().getTask().CurrentEditingControl = null;
|
|
1046
|
-
}
|
|
1047
|
-
}
|
|
1048
|
-
ctrl.SetEnabled(this.GetComputedValueBoolean());
|
|
1049
|
-
}
|
|
1050
|
-
else
|
|
1051
|
-
throw new ApplicationException("in Property.onEnable()");
|
|
1052
|
-
}
|
|
1053
|
-
onVisible(valChanged) {
|
|
1054
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1055
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1056
|
-
let ctrl = this._parentObj;
|
|
1057
|
-
let currentEditingControl = ctrl.getForm().getTask().CurrentEditingControl;
|
|
1058
|
-
if (this._val !== null && this._val === "0" && valChanged && currentEditingControl !== null &&
|
|
1059
|
-
(ctrl === currentEditingControl || currentEditingControl.isDescendentOfControl(ctrl) || ctrl === currentEditingControl.getLinkedParent(false))) {
|
|
1060
|
-
let parkedControl = ctrl.getForm().getTask().getLastParkedCtrl();
|
|
1061
|
-
if (parkedControl !== null && parkedControl.InControl && (ctrl === parkedControl || parkedControl.isDescendentOfControl(ctrl))) {
|
|
1062
|
-
Events.OnNonParkableLastParkedCtrl(ctrl);
|
|
1063
|
-
ctrl.getForm().getTask().CurrentEditingControl = null;
|
|
1064
|
-
}
|
|
1065
|
-
}
|
|
1066
|
-
yield ctrl.updatePropertyLogicNesting(PropInterface.PROP_TYPE_VISIBLE, CommandType.PROP_SET_VISIBLE, this.GetComputedValueBoolean(), true);
|
|
1067
|
-
}
|
|
1068
|
-
});
|
|
1069
|
-
}
|
|
1070
|
-
OnControlName() {
|
|
1071
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1072
|
-
}
|
|
1073
|
-
else
|
|
1074
|
-
throw new ApplicationException("in Property.OnControlName()");
|
|
1075
|
-
}
|
|
1076
|
-
onHint() {
|
|
1077
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1078
|
-
let control = this.getObjectByParentObj();
|
|
1079
|
-
let translatedString = Events.Translate(this.GetComputedValue());
|
|
1080
|
-
if (!control.IsDateTimePicture() && (!control.IsTableChild || control.IsTableHeaderChild)) {
|
|
1081
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, this.getObjectByParentObj(), this.getLine(), HtmlProperties.PlaceHolder, translatedString);
|
|
1082
|
-
}
|
|
1083
|
-
}
|
|
1084
|
-
else
|
|
1085
|
-
throw new ApplicationException("inProperty.onHint()");
|
|
1086
|
-
}
|
|
1087
|
-
onFormName() {
|
|
1088
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_FORM)
|
|
1089
|
-
this.addCommandTypeText(0);
|
|
1090
|
-
else
|
|
1091
|
-
throw new ApplicationException("in Property.onFormName()");
|
|
1092
|
-
}
|
|
1093
|
-
addCommandTypeText(line) {
|
|
1094
|
-
let mlsTransValue = Events.Translate(this.GetComputedValue());
|
|
1095
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_FORM ||
|
|
1096
|
-
(this._parentType === GuiConstants.PARENT_TYPE_CONTROL && this._parentObj.isColumnControl())) {
|
|
1097
|
-
mlsTransValue = StrUtil.rtrim(mlsTransValue);
|
|
1098
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_FORM && mlsTransValue === NString.Empty) {
|
|
1099
|
-
mlsTransValue = " ";
|
|
1100
|
-
}
|
|
1101
|
-
}
|
|
1102
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL && (this._parentObj.isTextControl()
|
|
1103
|
-
|| (this._parentObj.isButton())))
|
|
1104
|
-
Commands.addValueWithLine(CommandType.SET_VALUE, this._parentObj, line, mlsTransValue);
|
|
1105
|
-
else
|
|
1106
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, this._parentObj, line, HtmlProperties.Text, mlsTransValue);
|
|
1107
|
-
}
|
|
1108
|
-
onText(line) {
|
|
1109
|
-
this.addCommandTypeText(line);
|
|
1110
|
-
}
|
|
1111
|
-
onModifiable() {
|
|
1112
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1113
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1114
|
-
let ctrl = this._parentObj;
|
|
1115
|
-
if (ctrl.isTextControl()) {
|
|
1116
|
-
let task = this.GetTaskByParentObject();
|
|
1117
|
-
let readOnlyValue = !this.GetComputedValueBoolean();
|
|
1118
|
-
if ((readOnlyValue || task.getMode() !== Constants.TASK_MODE_QUERY) && ctrl.GetCurrReadOnly() !== readOnlyValue) {
|
|
1119
|
-
ctrl.SetCurrReadOnly(readOnlyValue);
|
|
1120
|
-
if (UtilStrByteMode.isLocaleDefLangDBCS()) {
|
|
1121
|
-
if (yield ctrl.getForm().getTask().checkProp(PropInterface.PROP_TYPE_ALLOW_LOCATE_IN_QUERY, false)) {
|
|
1122
|
-
return;
|
|
1123
|
-
}
|
|
1124
|
-
}
|
|
1125
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, this.getObjectByParentObj(), this.getLine(), HtmlProperties.ReadOnly, readOnlyValue);
|
|
1126
|
-
}
|
|
1127
|
-
}
|
|
1128
|
-
}
|
|
1129
|
-
else
|
|
1130
|
-
throw new ApplicationException("in Property.onModifiable()");
|
|
1131
|
-
});
|
|
1132
|
-
}
|
|
1133
|
-
onTooltip() {
|
|
1134
|
-
let toolTip;
|
|
1135
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1136
|
-
let ctrl = this._parentObj;
|
|
1137
|
-
if (this._expId === 0)
|
|
1138
|
-
toolTip = ctrl.getForm().getTask().getHelpItem(NNumber.Parse(this._val)).tooltipHelpText;
|
|
1139
|
-
else
|
|
1140
|
-
toolTip = this._val;
|
|
1141
|
-
toolTip = StrUtil.rtrim(toolTip);
|
|
1142
|
-
if (ctrl.isButton() && ctrl.ConnectedControl)
|
|
1143
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, ctrl.ConnectedControl, this.getLine(), HtmlProperties.ZoomButtonTooltip, toolTip);
|
|
1144
|
-
else
|
|
1145
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, ctrl, this.getLine(), HtmlProperties.Tooltip, toolTip);
|
|
1146
|
-
}
|
|
1147
|
-
else
|
|
1148
|
-
throw new ApplicationException("in Property.onTooltip()");
|
|
1149
|
-
}
|
|
1150
|
-
onDisplayList(currLine) {
|
|
1151
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1152
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1153
|
-
let ctrl = this._parentObj;
|
|
1154
|
-
if (ctrl.isSelectionCtrl() || ctrl.isTabControl() || ctrl.isRadio() || ctrl.HasAutocomplete()) {
|
|
1155
|
-
let line = (currLine === Int32.MinValue) ? ctrl.getDisplayLine(false) : currLine;
|
|
1156
|
-
yield ctrl.refreshAndSetItemsList(line, true);
|
|
1157
|
-
}
|
|
1158
|
-
}
|
|
1159
|
-
else
|
|
1160
|
-
throw new ApplicationException("in Property.onDisplayList()");
|
|
1161
|
-
});
|
|
1162
|
-
}
|
|
1163
|
-
onVisibleLayerList(currLine) {
|
|
1164
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1165
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1166
|
-
let ctrl = this._parentObj;
|
|
1167
|
-
let line = 0;
|
|
1168
|
-
if (currLine === Int32.MinValue)
|
|
1169
|
-
line = ctrl.getDisplayLine(false);
|
|
1170
|
-
else
|
|
1171
|
-
line = currLine;
|
|
1172
|
-
yield ctrl.refreshTabForLayerList(line);
|
|
1173
|
-
}
|
|
1174
|
-
else
|
|
1175
|
-
throw new ApplicationException("in Property.onVisibleLayerList()");
|
|
1176
|
-
});
|
|
1177
|
-
}
|
|
1178
|
-
onFormat() {
|
|
1179
|
-
let ctrl = null;
|
|
1180
|
-
let ctrlPic;
|
|
1181
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1182
|
-
ctrl = this._parentObj;
|
|
1183
|
-
ctrlPic = ctrl.getPIC();
|
|
1184
|
-
ctrl.resetPrevVal();
|
|
1185
|
-
switch (ctrl.Type) {
|
|
1186
|
-
case MgControlType.CTRL_TYPE_BUTTON:
|
|
1187
|
-
if (ctrl.getField() == null && !ctrl.expressionSetAsData() || ctrl.IsImageButton() || (this._parentObj.IsFirstRefreshOfProps() && !GuiEnvironment.Environment.GetSpecialIgnoreButtonFormat()))
|
|
1188
|
-
this.addCommandTypeText(this.getLine());
|
|
1189
|
-
break;
|
|
1190
|
-
case MgControlType.CTRL_TYPE_TEXT:
|
|
1191
|
-
if (ctrl.Type === MgControlType.CTRL_TYPE_TEXT) {
|
|
1192
|
-
if (ctrlPic.getAttr() !== StorageAttribute.NUMERIC) {
|
|
1193
|
-
}
|
|
1194
|
-
}
|
|
1195
|
-
break;
|
|
1196
|
-
}
|
|
1197
|
-
}
|
|
1198
|
-
else
|
|
1199
|
-
throw new ApplicationException("in Property.onFormat()");
|
|
1200
|
-
}
|
|
1201
|
-
onLabel(currLine) {
|
|
1202
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1203
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1204
|
-
let ctrl = this._parentObj;
|
|
1205
|
-
let line;
|
|
1206
|
-
if (currLine === Int32.MinValue)
|
|
1207
|
-
line = ctrl.getDisplayLine(false);
|
|
1208
|
-
else
|
|
1209
|
-
line = currLine;
|
|
1210
|
-
if (ctrl.Type === MgControlType.CTRL_TYPE_CHECKBOX)
|
|
1211
|
-
this.addCommandTypeText(line);
|
|
1212
|
-
else if (ctrl.isSelectionCtrl() || ctrl.isTabControl() || ctrl.isRadio()) {
|
|
1213
|
-
ctrl.setRange(yield this.getValue());
|
|
1214
|
-
ctrl.clearRange(line);
|
|
1215
|
-
yield ctrl.refreshAndSetItemsList(line, true);
|
|
1216
|
-
if (this._expId > 0)
|
|
1217
|
-
yield ctrl.ComputeAndRefreshDisplayValue(false);
|
|
1218
|
-
}
|
|
1219
|
-
else if (ctrl.HasAutocomplete())
|
|
1220
|
-
yield ctrl.refreshAndSetItemsList(line, true);
|
|
1221
|
-
else
|
|
1222
|
-
throw new ApplicationException("Property.onLabel(), not support control");
|
|
1223
|
-
}
|
|
1224
|
-
else
|
|
1225
|
-
throw new ApplicationException("in Property.onLabel()");
|
|
1226
|
-
});
|
|
1227
|
-
}
|
|
1228
|
-
getObjectByParentObj() {
|
|
1229
|
-
let result = this._parentObj;
|
|
1230
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_FORM) {
|
|
1231
|
-
let form = this._parentObj;
|
|
1232
|
-
if (form.isSubForm())
|
|
1233
|
-
result = form.getSubFormCtrl();
|
|
1234
|
-
}
|
|
1235
|
-
return result;
|
|
1236
|
-
}
|
|
1237
|
-
static isRepeatableInTable() {
|
|
1238
|
-
return false;
|
|
1239
|
-
}
|
|
1240
|
-
getLine() {
|
|
1241
|
-
let line = 0;
|
|
1242
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1243
|
-
let ctrl = this._parentObj;
|
|
1244
|
-
let displayLineForTreeOrTable = ctrl.isPropertyRepeatable(this._id);
|
|
1245
|
-
line = ctrl.getDisplayLine(displayLineForTreeOrTable);
|
|
1246
|
-
}
|
|
1247
|
-
return line;
|
|
1248
|
-
}
|
|
1249
|
-
getOrgValue() {
|
|
1250
|
-
return this._orgValue;
|
|
1251
|
-
}
|
|
1252
|
-
updatePrevValueArray(newSize) {
|
|
1253
|
-
if (!this.ShouldSkipRefresh())
|
|
1254
|
-
this._prevValues.SetSize(newSize);
|
|
1255
|
-
}
|
|
1256
|
-
clearPrevValueArray() {
|
|
1257
|
-
this._prevValues.Clear();
|
|
1258
|
-
}
|
|
1259
|
-
ResetPrevValueArray() {
|
|
1260
|
-
let count = this._prevValues.length;
|
|
1261
|
-
this._prevValues.Clear();
|
|
1262
|
-
this._prevValues.SetSize(count);
|
|
1263
|
-
}
|
|
1264
|
-
setPrevArraySize() {
|
|
1265
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_FORM || this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1266
|
-
let size = 1;
|
|
1267
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1268
|
-
let mgControlBase = this._parentObj;
|
|
1269
|
-
if (mgControlBase.IsRepeatable)
|
|
1270
|
-
size = mgControlBase.getForm().getTableItemsCount();
|
|
1271
|
-
else if (mgControlBase.isTableControl() && Property.isRepeatableInTable())
|
|
1272
|
-
size = mgControlBase.getForm().getTableItemsCount();
|
|
1273
|
-
}
|
|
1274
|
-
this._prevValues.SetSize(size);
|
|
1275
|
-
}
|
|
1276
|
-
}
|
|
1277
|
-
onPassword() {
|
|
1278
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL)
|
|
1279
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, this.getObjectByParentObj(), this.getLine(), HtmlProperties.Password, this.GetComputedValueBoolean());
|
|
1280
|
-
else
|
|
1281
|
-
throw new ApplicationException("in Property.onPassword()");
|
|
1282
|
-
}
|
|
1283
|
-
computeCustomPropertiesValues() {
|
|
1284
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1285
|
-
for (let [customPropertyKey, customPropertyValue] of this.customProperties) {
|
|
1286
|
-
let len = 255;
|
|
1287
|
-
let wasEvaluated = new RefParam(false);
|
|
1288
|
-
let expression = customPropertyValue;
|
|
1289
|
-
let retExpressionValue = yield this.GetRetrunValueForCustomPropertyExpression(expression);
|
|
1290
|
-
this.customPropertiesValues.set(customPropertyKey, retExpressionValue);
|
|
1291
|
-
}
|
|
1292
|
-
});
|
|
1293
|
-
}
|
|
1294
|
-
computeCustomValidators() {
|
|
1295
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1296
|
-
let mgControl = this._parentObj;
|
|
1297
|
-
if (mgControl.ModifiedByUser || mgControl.ValidateControl || this.GetTaskByParentObject().IsInRecompute()) {
|
|
1298
|
-
for (let [customPropertyKey, customValidatorProperty] of this.customValidatorProperties) {
|
|
1299
|
-
let len = 255;
|
|
1300
|
-
let wasEvaluated = new RefParam(false);
|
|
1301
|
-
let expression = customValidatorProperty._exp;
|
|
1302
|
-
let isInValid = yield this.GetRetrunValueForCustomPropertyExpression(expression);
|
|
1303
|
-
let errString = "";
|
|
1304
|
-
let InValid = (isInValid === "1") ? true : false;
|
|
1305
|
-
if (InValid) {
|
|
1306
|
-
expression = customValidatorProperty._errorMessageExp;
|
|
1307
|
-
if (expression > 0)
|
|
1308
|
-
errString = yield this.GetRetrunValueForCustomPropertyExpression(expression);
|
|
1309
|
-
else
|
|
1310
|
-
errString = customValidatorProperty._errorMessage;
|
|
1311
|
-
}
|
|
1312
|
-
this.customValidatorValues.set(customPropertyKey, new CustomValidator(!InValid, errString));
|
|
1313
|
-
}
|
|
1314
|
-
}
|
|
1315
|
-
});
|
|
1316
|
-
}
|
|
1317
|
-
onCustomProperties() {
|
|
1318
|
-
for (let [customPropertyKey, customPropertyValue] of this.customPropertiesValues) {
|
|
1319
|
-
Commands.addOperationWithLine(CommandType.PROP_SET_USER_PROPERTY, this._parentObj, this.getLine(), customPropertyKey, customPropertyValue);
|
|
1320
|
-
}
|
|
1321
|
-
}
|
|
1322
|
-
onCustomValidators() {
|
|
1323
|
-
for (let [customPropertyKey, customPropertyValue] of this.customValidatorValues) {
|
|
1324
|
-
Commands.addOperationWithLine(CommandType.PROP_SET_CUSTOM_VALIDATOR, this._parentObj, this.getLine(), customPropertyKey, customPropertyValue);
|
|
1325
|
-
}
|
|
1326
|
-
}
|
|
1327
|
-
onBindingLevel() {
|
|
1328
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL)
|
|
1329
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, this.getObjectByParentObj(), this.getLine(), HtmlProperties.BindingLevel, this.GetComputedValueInteger());
|
|
1330
|
-
else
|
|
1331
|
-
throw new ApplicationException("in Property.BindingLevel()");
|
|
1332
|
-
}
|
|
1333
|
-
onAutoCompleteMode() {
|
|
1334
|
-
}
|
|
1335
|
-
GetRetrunValueForCustomPropertyExpression(expression) {
|
|
1336
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1337
|
-
let len = 255;
|
|
1338
|
-
let expStorageAttribute = this._parentObj.GetExpressionStorage(expression);
|
|
1339
|
-
let wasEvaluated = new RefParam(false);
|
|
1340
|
-
let returnValue = yield this._parentObj.EvaluateExpression(expression, expStorageAttribute, len, true, StorageAttribute.SKIP, false, wasEvaluated);
|
|
1341
|
-
expStorageAttribute = this._parentObj.GetExpressionStorage(expression);
|
|
1342
|
-
let compIdx = this._parentObj.getCompIdx();
|
|
1343
|
-
switch (expStorageAttribute) {
|
|
1344
|
-
case StorageAttribute.NUMERIC:
|
|
1345
|
-
let tempPic = new PIC("N6.2", StorageAttribute.NUMERIC, this._parentObj.getCompIdx());
|
|
1346
|
-
if (returnValue == null)
|
|
1347
|
-
returnValue = "FF00000000000000000000000000000000000000";
|
|
1348
|
-
returnValue = DisplayConvertor.Instance.mg2disp(returnValue, "", tempPic, false, compIdx, false).trim();
|
|
1349
|
-
break;
|
|
1350
|
-
case StorageAttribute.DATE:
|
|
1351
|
-
tempPic = new PIC("##/##/####", expStorageAttribute, compIdx);
|
|
1352
|
-
returnValue = DisplayConvertor.Instance.mg2disp(returnValue, "", tempPic, true, false, compIdx, true);
|
|
1353
|
-
break;
|
|
1354
|
-
case StorageAttribute.TIME:
|
|
1355
|
-
tempPic = new PIC("##:##/####", expStorageAttribute, compIdx);
|
|
1356
|
-
returnValue = DisplayConvertor.Instance.mg2disp(returnValue, "", tempPic, true, false, compIdx, true);
|
|
1357
|
-
break;
|
|
1358
|
-
case StorageAttribute.ALPHA:
|
|
1359
|
-
case StorageAttribute.BOOLEAN:
|
|
1360
|
-
case StorageAttribute.BLOB:
|
|
1361
|
-
case StorageAttribute.BLOB_VECTOR:
|
|
1362
|
-
case StorageAttribute.UNICODE:
|
|
1363
|
-
case StorageAttribute.NONE:
|
|
1364
|
-
break;
|
|
1365
|
-
default:
|
|
1366
|
-
throw new ApplicationException("in Property.GetRetrunValueForCustomPropertyExpression() illegal data type: " + expStorageAttribute);
|
|
1367
|
-
}
|
|
1368
|
-
return returnValue;
|
|
1369
|
-
});
|
|
1370
|
-
}
|
|
1371
|
-
RemovePrevValIndexAt(idx) {
|
|
1372
|
-
if (this._prevValues.length > idx) {
|
|
1373
|
-
this._prevValues.RemoveAt(idx);
|
|
1374
|
-
}
|
|
1375
|
-
}
|
|
1376
|
-
InsertPrevValAt(idx) {
|
|
1377
|
-
this._prevValues.Insert(idx, null);
|
|
1378
|
-
}
|
|
1379
|
-
resetPrevValAt(idx) {
|
|
1380
|
-
if (idx >= 0 && idx < this._prevValues.length)
|
|
1381
|
-
this._prevValues.set_Item(idx, null);
|
|
1382
|
-
}
|
|
1383
|
-
toString() {
|
|
1384
|
-
return NString.Format("{0} = {1} (exp={2}, studio value={3})", [
|
|
1385
|
-
PropDefaults.GetPropertyName(this._id), (this._val === null) ? "is null" : this._val, this._expId, this.StudioValue
|
|
1386
|
-
]);
|
|
1387
|
-
}
|
|
1388
|
-
static getDefaultProp(propId, parentType, propParent) {
|
|
1389
|
-
let prop = null;
|
|
1390
|
-
let mgVal = PropDefaults.getDefaultValue(propId, parentType, propParent);
|
|
1391
|
-
if (mgVal !== null)
|
|
1392
|
-
prop = new Property(propId, propParent, parentType, mgVal);
|
|
1393
|
-
return prop;
|
|
1394
|
-
}
|
|
1395
|
-
InsertPrevValueArray(count) {
|
|
1396
|
-
if (!this.ShouldSkipRefresh())
|
|
1397
|
-
this._prevValues.InsertRange(new Array(count));
|
|
1398
|
-
}
|
|
1399
|
-
}
|
|
1400
|
-
Property._numericPropertyPic = null;
|
|
1401
|
-
Property.UtilImeJpn = (UtilStrByteMode.isLocaleDefLangJPN() ? new UtilImeJpn() : null);
|
|
1402
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvcGVydHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL21hbmFnZW1lbnQvZ3VpL1Byb3BlcnR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLEtBQUssRUFDTCxLQUFLLEVBQ0wsSUFBSSxFQUNKLE9BQU8sRUFDUCxPQUFPLEVBQ1AsUUFBUSxFQUNSLGFBQWEsRUFDZCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFDTCxTQUFTLEVBRVQsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLFVBQVUsRUFDVixlQUFlLEVBQ2YsWUFBWSxFQUNaLFNBQVMsRUFDVixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBQywrQkFBK0IsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBRXpGLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFFMUIsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRXBELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUMsV0FBVyxFQUFFLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTNELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUU1QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFHcEQsTUFBTSxPQUFPLG1C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QixDQUFDO1lBQ3JDLEtBQUssYUFBYSxDQUFDLGlCQUFpQixDQUFDO1lBQ3JDLEtBQUssYUFBYSxDQUFDLHdCQUF3QixDQUFDO1lBQzVDLEtBQUssYUFBYSxDQUFDLG9CQUFvQixDQUFDO1lBQ3hDLEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUFDO1lBQzFDLEtBQUssYUFBYSxDQUFDLGtCQUFrQixDQUFDO1lBQ3RDLEtBQUssYUFBYSxDQUFDLG1CQUFtQixDQUFDO1lBQ3ZDLEtBQUssYUFBYSxDQUFDLG1CQUFtQixDQUFDO1lBQ3ZDLEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUFDO1lBQzFDLEtBQUssYUFBYSxDQUFDLG1DQUFtQyxDQUFDO1lBQ3ZELEtBQUssYUFBYSxDQUFDLDRCQUE0QixDQUFDO1lBQ2hELEtBQUssYUFBYSxDQUFDLDBCQUEwQixDQUFDO1lBQzlDLEtBQUssYUFBYSxDQUFDLHVCQUF1QixDQUFDO1lBQzNDLEtBQUssYUFBYSxDQUFDLG9CQUFvQixDQUFDO1lBQ3hDLEtBQUssYUFBYSxDQUFDLHFCQUFxQixDQUFDO1lBQ3pDLEtBQUssYUFBYSxDQUFDLDZCQUE2QixDQUFDO1lBQ2pELEtBQUssYUFBYSxDQUFDLDRCQUE0QixDQUFDO1lBQ2hELEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUFDO1lBQzFDLEtBQUssYUFBYSxDQUFDLHVCQUF1QixDQUFDO1lBQzNDLEtBQUssYUFBYSxDQUFDLHVCQUF1QixDQUFDO1lBQzNDLEtBQUssYUFBYSxDQUFDLHlCQUF5QixDQUFDO1lBQzdDLEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUFDO1lBQzFDLEtBQUssYUFBYSxDQUFDLHVCQUF1QixDQUFDO1lBQzNDLEtBQUssYUFBYSxDQUFDLDhCQUE4QixDQUFDO1lBQ2xELEtBQUssYUFBYSxDQUFDLG9CQUFvQixDQUFDO1lBQ3hDLEtBQUssYUFBYSxDQUFDLHdCQUF3QixDQUFDO1lBQzVDLEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUFDO1lBQzFDLEtBQUssYUFBYSxDQUFDLHNCQUFzQixDQUFDO1lB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QUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7O0FBNTVEYyw0QkFBbUIsR0FBUSxJQUFJLENBQUM7QUFpQnhDLG1CQUFVLEdBQWUsQ0FBQyxlQUFlLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFwcGxpY2F0aW9uRXhjZXB0aW9uLFxyXG4gIERlYnVnLFxyXG4gIEludDMyLFxyXG4gIExpc3QsXHJcbiAgTk51bWJlcixcclxuICBOU3RyaW5nLFxyXG4gIFJlZlBhcmFtLFxyXG4gIFN0cmluZ0J1aWxkZXJcclxufSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7XHJcbiAgQ29uc3RhbnRzLFxyXG4gIEN0cmxCdXR0b25UeXBlR3VpLFxyXG4gIExvZ2dlcl9Mb2dMZXZlbHMsXHJcbiAgTWdDb250cm9sVHlwZSxcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFN0clV0aWwsXHJcbiAgVXRpbEltZUpwbixcclxuICBVdGlsU3RyQnl0ZU1vZGUsXHJcbiAgWE1MQ29uc3RhbnRzLFxyXG4gIFhtbFBhcnNlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQge1Rhc2tEZWZpbml0aW9uSWRUYWJsZVNheEhhbmRsZXJ9IGZyb20gJy4uL3Rhc2tzL1Rhc2tEZWZpbml0aW9uSWRUYWJsZVNheEhhbmRsZXInO1xyXG5pbXBvcnQge1Byb3BQYXJlbnRJbnRlcmZhY2V9IGZyb20gJy4uLy4uL2d1aS9Qcm9wUGFyZW50SW50ZXJmYWNlJztcclxuaW1wb3J0IHtQSUN9IGZyb20gJy4vUElDJztcclxuaW1wb3J0IHtUYXNrRGVmaW5pdGlvbklkfSBmcm9tICcuLi90YXNrcy9UYXNrRGVmaW5pdGlvbklkJztcclxuaW1wb3J0IHtFdmVudHN9IGZyb20gJy4uLy4uL0V2ZW50cyc7XHJcbmltcG9ydCB7R3VpQ29uc3RhbnRzfSBmcm9tICcuLi8uLi9HdWlDb25zdGFudHMnO1xyXG5pbXBvcnQge1Byb3BJbnRlcmZhY2V9IGZyb20gJy4vUHJvcEludGVyZmFjZSc7XHJcbmltcG9ydCB7R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcn0gZnJvbSAnLi9HdWlDb250cm9sUHJvcGVydHlBZGFwdGVyJztcclxuaW1wb3J0IHtEaXNwbGF5Q29udmVydG9yfSBmcm9tICcuL0Rpc3BsYXlDb252ZXJ0b3InO1xyXG5pbXBvcnQge0d1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXJ9IGZyb20gJy4vR3VpRm9ybVByb3BlcnR5QWRhcHRlcic7XHJcbmltcG9ydCB7Q29tbWFuZHN9IGZyb20gJy4uLy4uL0NvbW1hbmRzJztcclxuaW1wb3J0IHtDb21tYW5kVHlwZSwgSHRtbFByb3BlcnRpZXN9IGZyb20gJy4uLy4uL0d1aUVudW1zJztcclxuaW1wb3J0IHtHdWlUYXNrQmFzZX0gZnJvbSAnLi4vdGFza3MvR3VpVGFza0Jhc2UnO1xyXG5pbXBvcnQge1Byb3BEZWZhdWx0c30gZnJvbSAnLi9Qcm9wRGVmYXVsdHMnO1xyXG5pbXBvcnQge1Rvb2xUaXBIZWxwfSBmcm9tICcuL0hlbHBzJztcclxuaW1wb3J0IHtHdWlFbnZpcm9ubWVudH0gZnJvbSAnLi4vLi4vR3VpRW52aXJvbm1lbnQnO1xyXG5pbXBvcnQge01nQ29udHJvbEJhc2V9IGZyb20gJy4vTWdDb250cm9sQmFzZSc7XHJcblxyXG5leHBvcnQgY2xhc3MgQ3VzdG9tVmFsaWRhdG9yUHJvcCB7XHJcbiAgX2V4cDogbnVtYmVyO1xyXG4gIF9lcnJvck1lc3NhZ2VFeHA6IG51bWJlcjtcclxuICBfZXJyb3JNZXNzYWdlOiBzdHJpbmc7XHJcbn07XHJcblxyXG5leHBvcnQgY2xhc3MgQ3VzdG9tVmFsaWRhdG9yIHtcclxuICBfdmFsaWQ6IGJvb2xlYW47XHJcbiAgX2Vycm9yTWVzc2FnZTogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3Rvcih2YWxpZDogYm9vbGVhbiwgZXJyTWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl92YWxpZCA9IHZhbGlkO1xyXG4gICAgdGhpcy5fZXJyb3JNZXNzYWdlID0gZXJyTWVzc2FnZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1ZhbGlkKCk6IGJvb2xlYW4ge3JldHVybiB0aGlzLl92YWxpZDt9XHJcbiAgcHVibGljIGdldEVyck1lc3NhZ2UoKTogc3RyaW5nIHtyZXR1cm4gdGhpcy5fZXJyb3JNZXNzYWdlO31cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICB0aGlzIGNsYXNzIHJlcHJlc2VudHMgYSBQcm9wZXJ0eSBvYmplY3Qgb2YgY29udHJvbCwgZm9ybSBvciB0YXNrLlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgUHJvcGVydHkge1xyXG4gIHByaXZhdGUgX2lkOiBudW1iZXIgPSBJbnQzMi5NaW5WYWx1ZTtcclxuICBwcml2YXRlIF9kYXRhVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORTtcclxuICBwcml2YXRlIF92YWw6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcGljOiBQSUMgPSBudWxsO1xyXG4gIHByaXZhdGUgX2V4cElkOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgX3BhcmVudE9iajogUHJvcFBhcmVudEludGVyZmFjZSA9IG51bGw7IC8vIGEgcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgb2JqZWN0IChDb250cm9sLCBGb3JtLCBHdWlUYXNrQmFzZSlcclxuICBwcml2YXRlIF9wYXJlbnRUeXBlOiBzdHJpbmcgPSBudWxsOyAvLyBDb250cm9sfEZvcm18R3VpVGFza0Jhc2VcclxuICBwcml2YXRlIF9wcmV2VmFsdWVzOiBMaXN0PHN0cmluZz4gPSBudWxsOyAvLyByZXZlcmVuY2UgdG8gcHJvcGVydHkgdmFsdWVzIGluIGEgdGFibGVcclxuICBwcml2YXRlIF9vcmdWYWx1ZTogc3RyaW5nID0gbnVsbDsgLy8gcmV2ZXJlbmNlIHRvIHByb3BlcnR5IHZhbHVlcyBpbiBhIHRhYmxlXHJcbiAgcHJpdmF0ZSBzdGF0aWMgX251bWVyaWNQcm9wZXJ0eVBpYzogUElDID0gbnVsbDtcclxuICBwcml2YXRlIF90YXNrRGVmaW5pdGlvbklkOiBUYXNrRGVmaW5pdGlvbklkID0gbnVsbDsgLy8gdGFzayBkZWZpbml0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcGVydHkuXHJcbiAgLy8gc3R1ZGlvVmFsdWUgZm9yIG9mZmxpbmUgc3RhdGVcclxuICAvLyBUb0RvOiBjb21tZW50IHNheXMgdGhhdCBpdCBpcyBmb3IgXCJPZmZsaW5lIHN0YXRlXCIuIFNvLCBkbyB3ZSBuZWVkIGl0IGluV2ViQ2xpZW50P1xyXG4gIFN0dWRpb1ZhbHVlOiBzdHJpbmcgPSBudWxsO1xyXG4gIHByaXZhdGUgX2V4cEFscmVhZHlDb21wdXRlZE9uY2U6IGJvb2xlYW4gPSBmYWxzZTsgLy8gdGhlIGV4cHJlc3Npb24gaXMgYWxyZWFkeSBjb21wdXRlZCBvbmNlXHJcblxyXG4gIC8vIGZvciB3ZWIgY2xpZW50IDpcclxuICAvLyBzYXZlIHRoZSBjdXN0b20gcHJvcGVydGllcyB0aGF0IGRlZmluZSBieSB0aGUgdXNlclxyXG4gIHByaXZhdGUgY3VzdG9tUHJvcGVydGllczogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcclxuICBwcml2YXRlIGN1c3RvbVByb3BlcnRpZXNWYWx1ZXM6IE1hcDxzdHJpbmcsIGFueT4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIC8vIGZvciB3ZWIgY2xpZW50IDpcclxuICAvLyBzYXZlIHRoZSBjdXN0b20gdmFsaWRhdG9ycyB0aGF0IGRlZmluZSBieSB0aGUgdXNlclxyXG4gIHByaXZhdGUgY3VzdG9tVmFsaWRhdG9yUHJvcGVydGllczogTWFwPHN0cmluZywgQ3VzdG9tVmFsaWRhdG9yUHJvcD4gPSBuZXcgTWFwKCk7XHJcbiAgcHJpdmF0ZSBjdXN0b21WYWxpZGF0b3JWYWx1ZXM6IE1hcDxzdHJpbmcsIEN1c3RvbVZhbGlkYXRvcj4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIHN0YXRpYyBVdGlsSW1lSnBuOiBVdGlsSW1lSnBuID0gKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdKUE4oKSA/IG5ldyBVdGlsSW1lSnBuKCkgOiBudWxsKTsgLy8gSlBOOiBJTUUgc3VwcG9ydFxyXG5cclxuICAvLyB0YXNrIGRlZmluaXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wZXJ0eS5cclxuICBnZXQgVGFza0RlZmluaXRpb25JZCgpOiBUYXNrRGVmaW5pdGlvbklkIHtcclxuICAgIHJldHVybiB0aGlzLl90YXNrRGVmaW5pdGlvbklkO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoKTtcclxuICBjb25zdHJ1Y3RvcihjSWQ6IG51bWJlciwgY1BhcmVudE9iajogUHJvcFBhcmVudEludGVyZmFjZSwgcGFyVHlwZTogc3RyaW5nKTtcclxuICBjb25zdHJ1Y3RvcihjSWQ6IG51bWJlciwgY1BhcmVudE9iajogUHJvcFBhcmVudEludGVyZmFjZSwgcGFyVHlwZTogc3RyaW5nLCB2YWw6IHN0cmluZyk7XHJcbiAgY29uc3RydWN0b3IoY0lkPzogbnVtYmVyLCBjUGFyZW50T2JqPzogUHJvcFBhcmVudEludGVyZmFjZSwgcGFyVHlwZT86IHN0cmluZywgdmFsPzogc3RyaW5nKSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcblxyXG4gICAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMylcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKGNJZCwgY1BhcmVudE9iaiwgcGFyVHlwZSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMihjSWQsIGNQYXJlbnRPYmosIHBhclR5cGUsIHZhbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzAoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2VmFsdWVzID0gbmV3IExpc3QoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMShjSWQ6IG51bWJlciwgY1BhcmVudE9iajogUHJvcFBhcmVudEludGVyZmFjZSwgcGFyVHlwZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgIHRoaXMuc2V0SWQoY0lkKTtcclxuICAgIHRoaXMuX3BhcmVudE9iaiA9IGNQYXJlbnRPYmo7XHJcbiAgICB0aGlzLl9wYXJlbnRUeXBlID0gcGFyVHlwZTtcclxuICAgIHRoaXMuc2V0RGF0YVR5cGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMihjSWQ6IG51bWJlciwgY1BhcmVudE9iajogUHJvcFBhcmVudEludGVyZmFjZSwgcGFyVHlwZTogc3RyaW5nLCB2YWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKGNJZCwgY1BhcmVudE9iaiwgcGFyVHlwZSk7XHJcbiAgICB0aGlzLnNldFZhbHVlKHZhbCk7XHJcbiAgICB0aGlzLnNldE9yZ1ZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBpZCBvZiB0aGlzIHByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHNldElkKGNJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pZCA9IGNJZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBOZWVkIHBhcnQgaW5wdXQgU3RyaW5nIHRvIHJlbGV2YW50IGZvciB0aGUgY2xhc3MgZGF0YVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwYXJlbnRSZWZcIj5yZWZlcmVuY2UgdG8gcGFyZW50IDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicGFyVHlwZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgZmlsbERhdGEocGFyZW50UmVmOiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJUeXBlOiBzdHJpbmcsIHBhcnNlcjogWG1sUGFyc2VyKSB7XHJcbiAgICBsZXQgZW5kQ29udGV4dDogbnVtYmVyID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFwiPlwiLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG5cclxuICAgIGlmICh0aGlzLl9wYXJlbnRPYmogPT09IG51bGwgJiYgcGFyZW50UmVmICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3BhcmVudE9iaiA9IHBhcmVudFJlZjtcclxuICAgICAgdGhpcy5fcGFyZW50VHlwZSA9IHBhclR5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG4gICAgICAvLyBsYXN0IHBvc2l0aW9uIG9mIGl0cyB0YWdcclxuICAgICAgbGV0IHRhZzogc3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgICAgcGFyc2VyLmFkZDJDdXJySW5kZXgodGFnLmluZGV4T2YoWE1MQ29uc3RhbnRzLk1HX1RBR19QUk9QKSArIFhNTENvbnN0YW50cy5NR19UQUdfUFJPUC5sZW5ndGgpO1xyXG5cclxuICAgICAgbGV0IHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+ID0gWG1sUGFyc2VyLmdldFRva2VucyhwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG4gICAgICBpZiAoRXZlbnRzLlNob3VsZExvZyhMb2dnZXJfTG9nTGV2ZWxzLkRldmVsb3BtZW50KSkge1xyXG4gICAgICAgIEV2ZW50cy5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiSW4gUHJvcC5GaWxsRGF0YSgpOiB7MH1cIiwgdG9rZW5zVmVjdG9yLnRvU3RyaW5nKCkpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5pbml0RWxlbWVudHModG9rZW5zVmVjdG9yKTtcclxuXHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UubGVuZ3RoKTtcclxuXHJcbiAgICAgIC8vIGRlYWwgd2l0aCBpbnRlcm5hbCB0YWdzXHJcbiAgICAgIHRoaXMuSW5pdElubmVyT2JqZWN0cyhwYXJzZXIpO1xyXG5cclxuICAgICAgLy8gZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgdHlwZXMgbmVlZCBzZXQgcGFyYW1ldGVycyB0byB0aGUgcGFyZW50IC0gQ09OVFJPTCAoaW4gdGhpcyBjYXNlKVxyXG4gICAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpXHJcbiAgICAgICAgdGhpcy5zZXRDb250cm9sQXR0cmlidXRlcygpO1xyXG4gICAgICBlbHNlIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfRk9STSlcclxuICAgICAgICB0aGlzLl9wcmV2VmFsdWVzLlNldFNpemUoMSk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKFwiSW4gUHJvcGVydHkuRmlsbERhdGEoKTogT3V0IG9mIHN0cmluZyBib3VuZHNcIik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIEluaXRJbm5lck9iamVjdHMoeG1sUGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIGxldCBuZXh0VGFnOiBzdHJpbmcgPSB4bWxQYXJzZXIuZ2V0TmV4dFRhZygpO1xyXG5cclxuICAgIGlmIChuZXh0VGFnID09PSBYTUxDb25zdGFudHMuTUdfVEFHX1RBU0tERUZJTklUSU9OSURfRU5UUlkpIHtcclxuICAgICAgbGV0IHhtbEJ1ZmZlcjogc3RyaW5nID0geG1sUGFyc2VyLlJlYWRUb0VuZE9mQ3VycmVudEVsZW1lbnQoKTtcclxuICAgICAgdGhpcy5Jbml0VGFza0RlZmluaXRpb25JZCh4bWxCdWZmZXIpO1xyXG5cclxuICAgICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHhtbFBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuTUdfVEFHX1BST1AgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFLCB4bWxQYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgICB4bWxQYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQgKyAoWE1MQ29uc3RhbnRzLk1HX1RBR19QUk9QICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRSkubGVuZ3RoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBNYWtlIGluaXRpYWxpemF0aW9uIG9mIHByaXZhdGUgZWxlbWVudHMgYnkgZm91bmQgdG9rZW5zXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRva2Vuc1ZlY3RvclwiPmZvdW5kIHRva2Vucywgd2hpY2ggY29uc2lzdCBhdHRyaWJ1dGUvdmFsdWUgb2YgZXZlcnkgZm91bmQgZWxlbWVudCA8L3BhcmFtPlxyXG4gIHByaXZhdGUgaW5pdEVsZW1lbnRzKHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+KTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiArPSAyKSB7XHJcbiAgICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZyA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaikpO1xyXG4gICAgICBsZXQgdmFsdWVTdHI6IHN0cmluZyA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaiArIDEpKTtcclxuXHJcbiAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9JRDpcclxuICAgICAgICAgIHRoaXMuc2V0SWQoWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cikpO1xyXG4gICAgICAgICAgdGhpcy5zZXREYXRhVHlwZSgpOyAvLyBUaGUgJ25hbWUnIG1lbWJlciBtdXN0IGJlIGZvdW5kIGluIHRoaXMgcG9pbnRcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfU1RVRElPX1ZBTFVFOlxyXG4gICAgICAgICAgdGhpcy5TdHVkaW9WYWx1ZSA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1ZBTFVFOlxyXG4gICAgICAgICAgaWYgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fUFJPUEVSVElFUykge1xyXG4gICAgICAgICAgICB0aGlzLkluaXRDdXN0b21Qcm9wZXJ0aWVzKFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cikpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fVkFMSURBVE9SUykge1xyXG4gICAgICAgICAgICB0aGlzLkluaXRDdXN0b21WYWxpZGF0aW9uUHJvcGVydGllcyhYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl92YWwgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpO1xyXG4gICAgICAgICAgICB0aGlzLl9vcmdWYWx1ZSA9IHRoaXMuX3ZhbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfRVhQOlxyXG4gICAgICAgICAgdGhpcy5fZXhwSWQgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGlmICh0aGlzLl9leHBJZCA+IDAgJiYgdGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RPT0xUSVApXHJcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0YVR5cGUoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTkFNRTpcclxuICAgICAgICAgIC8vIE5hbWUgaXMgb25seSBzZXJpYWxpemVkIGZvciBkZWJ1ZyB2ZXJzaW9uIC5cclxuICAgICAgICAgIC8vIFRvIGF2b2lkIGV4Y2VwdGlvbnMsIGFkZCBhIGJsYW5rIGNhc2UgZm9yIGl0XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0NUTF9JRFg6XHJcbiAgICAgICAgICB0aGlzLl90YXNrRGVmaW5pdGlvbklkLkN0bEluZGV4ID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1BST0dSQU1fSVNOOlxyXG4gICAgICAgICAgdGhpcy5fdGFza0RlZmluaXRpb25JZC5Qcm9ncmFtSXNuID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJUaGVyZSBpcyBubyBzdWNoIHRhZyBpbiBQcm9wZXJ0eSBjbGFzcy4gSW5zZXJ0IGNhc2UgdG8gUHJvcGVydHkuaW5pdEVsZW1lbnRzIGZvciB7MH1cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGlmIHRoZSBwcm9wZXJ0eSBpcyBhbHJlYWR5IGNvbXB1dGUgaW4gdGhlIHNlcnZlciAsIHRoZW4gc2V0IF9leHBBbHJlYWR5Q29tcHV0ZWRPbmNlXHJcbiAgICAgIGlmICh0aGlzLklzQ29tcHV0ZWRPbmNlT25TZXJ2ZXIoKSlcclxuICAgICAgICB0aGlzLl9leHBBbHJlYWR5Q29tcHV0ZWRPbmNlID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdCB0aGUgY3VzdG9tIHByb3BlcnRpZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgSW5pdEN1c3RvbVByb3BlcnRpZXMoY3VzdG9tUHJvcHJ0aWVzU3RyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuY3VzdG9tUHJvcGVydGllcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KEpTT04ucGFyc2UoY3VzdG9tUHJvcHJ0aWVzU3RyKSk7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50T2JqLklzRmlyc3RSZWZyZXNoT2ZQcm9wcygpKVxyXG4gICAgICB0aGlzLlNldEZpcnN0VmFsdWVGb3JDdXN0b21Qcm9wZXJ0aWVzKCk7XHJcbiAgfVxyXG5cclxuICAvLyBJbml0IEN1c3RvbVZhbGlkYXRvclxyXG4gIHByaXZhdGUgSW5pdEN1c3RvbVZhbGlkYXRvciAocGFyc2VyIDogWG1sUGFyc2VyKTogdm9pZCB7XHJcblxyXG4gICAgbGV0IHRleHQ6IHN0cmluZyA9IHBhcnNlci5SZWFkVG9FbmRPZkN1cnJlbnRFbGVtZW50KCk7XHJcbiAgICB0ZXh0ID0gdGV4dC5zdWJzdHIodGV4dC5pbmRleE9mKFhNTENvbnN0YW50cy5NR19UQUdfQ1VTVE9NX1ZBTElEQVRPUikgKyBYTUxDb25zdGFudHMuTUdfVEFHX0NVU1RPTV9WQUxJREFUT1IubGVuZ3RoKTtcclxuICAgIGxldCB0b2tlbnM6IExpc3Q8c3RyaW5nPiA9IFhtbFBhcnNlci5nZXRUb2tlbnModGV4dCwgWE1MQ29uc3RhbnRzLlhNTF9BVFRSX0RFTElNKTtcclxuXHJcbiAgICBsZXQgYyA9IG5ldyBDdXN0b21WYWxpZGF0b3JQcm9wKCk7XHJcbiAgICBsZXQga2V5O1xyXG5cclxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdG9rZW5zLmxlbmd0aDsgaiArPSAyKVxyXG4gICAge1xyXG4gICAgICBsZXQgYXR0cmlidXRlOiBzdHJpbmcgPSB0b2tlbnMuZ2V0X0l0ZW0oaik7XHJcbiAgICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nID0gdG9rZW5zLmdldF9JdGVtKGogKyAxKTtcclxuXHJcbiAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9FWFA6XHJcbiAgICAgICAgICBjLl9leHAgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTkFNRTpcclxuICAgICAgICAgIGtleSA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0VSUk9SX0VYUDpcclxuICAgICAgICAgIGMuX2Vycm9yTWVzc2FnZUV4cCA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9FUlJPUjpcclxuICAgICAgICAgIGMuX2Vycm9yTWVzc2FnZSA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY3VzdG9tVmFsaWRhdG9yUHJvcGVydGllcy5zZXQgKGtleSwgYyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGluaXQgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIHByb3BlcnRpZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgSW5pdEN1c3RvbVZhbGlkYXRpb25Qcm9wZXJ0aWVzKGN1c3RvbVByb3BydGllc1N0cjogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgbGV0IHBhcnNlciA9IG5ldyBYbWxQYXJzZXIoY3VzdG9tUHJvcHJ0aWVzU3RyKTtcclxuICAgIGxldCBjdXJyVGFnTmFtZSA9IHBhcnNlci5nZXROZXh0VGFnKCk7XHJcbiAgICB3aGlsZSAoY3VyclRhZ05hbWUgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgc3dpdGNoIChjdXJyVGFnTmFtZSlcclxuICAgICAge1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19DVVNUT01fVkFMSURBVE9SUzpcclxuICAgICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgICAgIHRoaXMuY3VzdG9tVmFsaWRhdG9yUHJvcGVydGllcyA9IG5ldyBNYXA8c3RyaW5nLCBDdXN0b21WYWxpZGF0b3JQcm9wPigpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX0NVU1RPTV9WQUxJREFUT1I6XHJcbiAgICAgICAgICB0aGlzLkluaXRDdXN0b21WYWxpZGF0b3IgKHBhcnNlcik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgcGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY3VyclRhZ05hbWUgPSBwYXJzZXIuZ2V0TmV4dFRhZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9wYXJlbnRPYmouSXNGaXJzdFJlZnJlc2hPZlByb3BzKCkpXHJcbiAgICAgIHRoaXMuU2V0Rmlyc3RWYWx1ZUZvckN1c3RvbVZhbGlkYXRpb25Qcm9wZXJ0aWVzKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBTZXRGaXJzdFZhbHVlRm9yQ3VzdG9tVmFsaWRhdGlvblByb3BlcnRpZXMoKTogdm9pZCB7XHJcblxyXG4gICAgICBmb3IgKGxldCBjdXN0b21Qcm9wZXJ0eSBvZiB0aGlzLmN1c3RvbVZhbGlkYXRvclByb3BlcnRpZXMua2V5cygpKSB7XHJcbiAgICAgIGxldCBjIDogQ3VzdG9tVmFsaWRhdG9yUHJvcCA9IHRoaXMuY3VzdG9tVmFsaWRhdG9yUHJvcGVydGllcy5nZXQoY3VzdG9tUHJvcGVydHkpO1xyXG4gICAgICB0aGlzLmN1c3RvbVZhbGlkYXRvclZhbHVlcy5zZXQoPHN0cmluZz5jdXN0b21Qcm9wZXJ0eSwgbmV3IEN1c3RvbVZhbGlkYXRvcih0cnVlLCBcIlwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY3JlYXRlIGZyb20gdGhlIHZhbHVlIHN0cmluZyBhbmQgc2F2ZSBpdCBpbiB2YWwgJiBvcmdWYWx1ZVxyXG4gICAgdGhpcy5fdmFsID0gdGhpcy5HZXRBcnJheVZhbHVlc0ZvckN1c3RvbVZhbGlkYXRpb25Qcm9wZXJ0aWVzKClcclxuICAgIHRoaXMuX29yZ1ZhbHVlID0gdGhpcy5fdmFsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBHZXRBcnJheVZhbHVlc0ZvckN1c3RvbVZhbGlkYXRpb25Qcm9wZXJ0aWVzKCk6IHN0cmluZ3tcclxuICAgIGxldCB2YWx1ZXMgPSBBcnJheS5mcm9tKHRoaXMuY3VzdG9tVmFsaWRhdG9yVmFsdWVzLnZhbHVlcygpKTtcclxuICAgIGxldCB2YWx1ZXNTdHIgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZXMpO1xyXG4gICAgcmV0dXJuIHZhbHVlc1N0cjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgR2V0QXJyYXlWYWx1ZXNGb3JDdXN0b21Qcm9wZXJ0aWVzKCk6IHN0cmluZ3tcclxuICAgIGxldCB2YWx1ZXMgPSBBcnJheS5mcm9tKHRoaXMuY3VzdG9tUHJvcGVydGllc1ZhbHVlcy52YWx1ZXMoKSk7XHJcbiAgICBsZXQgdmFsdWVzU3RyID0gSlNPTi5zdHJpbmdpZnkodmFsdWVzKTtcclxuICAgIHJldHVybiB2YWx1ZXNTdHI7XHJcbn1cclxuXHJcbiAgcHJpdmF0ZSBTZXRGaXJzdFZhbHVlRm9yQ3VzdG9tUHJvcGVydGllcygpOiB2b2lkIHtcclxuXHJcbiAgICBmb3IgKGxldCBjdXN0b21Qcm9wZXJ0eSBvZiB0aGlzLmN1c3RvbVByb3BlcnRpZXMua2V5cygpKVxyXG4gICAgICB0aGlzLmN1c3RvbVByb3BlcnRpZXNWYWx1ZXMuc2V0KDxzdHJpbmc+Y3VzdG9tUHJvcGVydHksIFwiXCIpO1xyXG5cclxuICAgIC8vIGNyZWF0ZSBmcm9tIHRoZSB2YWx1ZSBzdHJpbmcgYW5kIHNhdmUgaXQgaW4gdmFsICYgb3JnVmFsdWVcclxuICAgIHRoaXMuX3ZhbCA9IHRoaXMuR2V0QXJyYXlWYWx1ZXNGb3JDdXN0b21Qcm9wZXJ0aWVzKClcclxuICAgIHRoaXMuX29yZ1ZhbHVlID0gdGhpcy5fdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXNldCBfZXhwQWxyZWFkeUNvbXB1dGVkT25jZSBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBSZXNldENvbXB1dGVkT25jZUZsYWcoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9leHBBbHJlYWR5Q29tcHV0ZWRPbmNlID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIEluaXRUYXNrRGVmaW5pdGlvbklkKHhtbEJ1ZmZlcjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgdGFza0RlZmluaXRpb25JZFRhYmxlU2F4SGFuZGxlcjogVGFza0RlZmluaXRpb25JZFRhYmxlU2F4SGFuZGxlciA9IG5ldyBUYXNrRGVmaW5pdGlvbklkVGFibGVTYXhIYW5kbGVyKHRoaXMuU2V0VGFza0RlZmluaXRpb25JZCk7XHJcbiAgICB0YXNrRGVmaW5pdGlvbklkVGFibGVTYXhIYW5kbGVyLnBhcnNlKHhtbEJ1ZmZlcik7XHJcbiAgfVxyXG5cclxuICAvLyBjYWxsYmFjayBmb3IgVGFza0RlZmluaXRpb25JZFRhYmxlU2F4SGFuZGxlclxyXG4gIFNldFRhc2tEZWZpbml0aW9uSWQodGFza0RlZmluaXRpb25JZDogVGFza0RlZmluaXRpb25JZCk6IHZvaWQge1xyXG4gICAgdGhpcy5fdGFza0RlZmluaXRpb25JZCA9IHRhc2tEZWZpbml0aW9uSWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldERhdGFUeXBlKCk6IHZvaWQge1xyXG4gICAgbGV0IGNvbXBJZHg6IG51bWJlciA9IHRoaXMuX3BhcmVudE9iai5nZXRDb21wSWR4KCk7XHJcblxyXG4gICAgdGhpcy5fcGljID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5faWQgPT09IEludDMyLk1pblZhbHVlKSB7XHJcbiAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiVG8gZmlsbCBkYXRhVHlwZSBtZW1iZXIgaW4gUHJvcGVydHkuRmlsbERhdGFUeXBlIG11c3QgaWQhPXswfVwiLCBJbnQzMi5NaW5WYWx1ZSkpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLl9pZCkge1xyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RJVExFX0JBUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ESVNQTEFZX01FTlU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQk9SREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hFQlJFVzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NT0RJRllfSU5fUVVFUlk6XHJcblxyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TWVNURU1fTUVOVTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkRfQ09ORElUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19NT0RJRlk6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfQ1JFQVRFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0RFTEVURTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19RVUVSWTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19SQU5HRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19MT0NBVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfU09SVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfQUxMT1dfSU5ERVg6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTE9DQVRFX0lOX1FVRVJZOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTkZJUk1fVVBEQVRFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9ERUxFVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVTVF9JTlBVVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NT0RJRklBQkxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5BQkxFRDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05GSVJNX0NBTkNFTDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SRVBFQVRBQkxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hJR0hMSUdIVElORzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QQVNTV09SRDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NVUxUSUxJTkU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSVNfQ0FDSEVEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BSRUxPQURfVklFVzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NVUxUSUxJTkVfVkVSVElDQUxfU0NST0xMOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01VTFRJTElORV9BTExPV19DUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19DT0xfUkVTSVpFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1JFT1JERVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0hPV19MSU5FUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TT1JUX0NPTFVNTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT0xfQUxMT1dfRklMVEVSSU5HOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RJU1BMQVlfU1RBVFVTX0JBUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BVVRPX1JFRlJFU0g6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUEFSS19PTl9DTElDSzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TSE9XX0ZVTExfUk9XOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RSQUNLX1NFTEVDVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TSE9XX0JVVFRPTlM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTElORVNfQVRfUk9PVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19FTVBUWV9EQVRBVklFVzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TQ1JPTExfQkFSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTFVNTl9ESVZJREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xJTkVfRElWSURFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9USFJFRV9TVEFURVM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVGUkVTSF9XSEVOX0hJRERFTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19PUFRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVUQUlOX0ZPQ1VTOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BSSU5UX0RBVEE6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ0xPU0VfVEFTS1NfQllfTURJX01FTlU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfREFUQVZJRVdDT05UUk9MOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19PUEVOX1RBU0tfV0lORE9XOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19BTExPV19FVkVOVFM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0lOREVYX09QVElNSVpBVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfUkFOR0U6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0xPQ0FURTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfUE9TSVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX1NRTF9SQU5HRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9CRUZPUkVfOTAwX1ZFUlNJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRklMTF9XSURUSDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NVUxUSV9DT0xVTU5fRElTUExBWTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JU19ST1VURVJfT1VUTEVUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RFRkFVTFRfT1VUTEVUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFUlZFUl9SRUFEX0FIRUFEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FVVE9fQ09NUExFVEVfTU9ERV9XQzpcclxuICAgICAgICB0aGlzLl9kYXRhVHlwZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSU1BR0VfRklMRU5BTUU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRVZBTF9FTkRfQ09ORElUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZSQU1FX05BTUU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UUkFTQUNUSU9OX0JFR0lOOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19UUkFOU0FDVElPTl9NT0RFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1dBTExQQVBFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BVFRSSUJVVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVFJJR0dFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRUxFQ1RfTU9ERTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX0lEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBQkJJTkdfQ1lDTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUEFSQU1FVEVSUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JTUFHRV9MSVNUX0lOREVYRVM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRV9MQVlFUlNfTElTVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9PQkpFQ1RfVFlQRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SRUFMX09CSkVDVF9UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RBVEFWSUVXQ09OVFJPTF9GSUVMRFM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX1JBTkdFX09SREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19MT0NBVEVfT1JERVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX1BPU0lUSU9OX1VTQUdFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfTU9ERTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fUFJPUEVSVElFUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fVkFMSURBVE9SUzpcclxuICAgICAgICB0aGlzLl9kYXRhVHlwZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTFVNTl9USVRMRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ESVNQTEFZX0xJU1Q6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTEFCRUw6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9STUFUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JBTkdFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUk1fTkFNRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BRERJVElPTkFMX0lORk9STUFUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RFWFQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSElOVDpcclxuICAgICAgICB0aGlzLl9kYXRhVHlwZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVU9NOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hPUl9GQUM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVkVSX0ZBQzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJfT1JERVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfV0FMTFBBUEVSX1NUWUxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lOREVYOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xJTktfRklFTEQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRElTUExBWV9GSUVMRDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QVUxMRE9XTl9NRU5VOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1dJTkRPV19UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lNQUdFX1NUWUxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FVVE9fRklUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JBSVNFX0FUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VYUEFORF9XSU5ET1c6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRV9MSU5FUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DSE9JQ0VfQ09MVU1OUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TVFlMRV8zRDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT05UOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xBWUVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1dJRFRIOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RJVExFX0hFSUdIVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT0xPUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MRUZUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RPUDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UT09MVElQOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hFTFBfU0NSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xJTkVTX0lOX1RBQkxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVElPTl9ST1dTOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hPUklaT05UQUxfQUxJR05NRU5UOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01VTFRJTElORV9XT1JEV1JBUF9TQ1JPTEw6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUk9XX0hFSUdIVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9XSU5ET1dfV0lEVEg6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTUFJTl9ESVNQTEFZOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RSQU5TTEFUT1I6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRlJBTUVTRVRfU1RZTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRlJBTUVfVFlQRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV0VEX0RJUkVDVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ST1dfSElHSExJR0hUX1NUWUxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZFUlRJQ0FMX0FMSUdOTUVOVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJCSU5HX09SREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NUQVRJQ19UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0JVVFRPTl9TVFlMRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MT0FEX0lNQUdFX0ZST006XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU1VCRk9STV9UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0JPVFRPTV9QT1NJVElPTl9JTlRFUlZBTDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRUxFQ1RJT05fTU9ERTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QUkdUU0tfTlVNOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BFUlNJU1RFTlRfRk9STV9TVEFURV9WRVJTSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NDUk9MTF9CQVJfVEhVTUI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQklORElOR19MRVZFTDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05ORUNURURfWk9PTV9DT05UUk9MOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVF9QUk9HUkFNOlxyXG4gICAgICAgIGlmICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVE9PTFRJUCAmJiB0aGlzLl9leHBJZCA+IDApXHJcbiAgICAgICAgICB0aGlzLl9kYXRhVHlwZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTtcclxuICAgICAgICAvLyBwaWMgd2lsbCBiZSBzZXQgYWNjb3JkaW5nIHRvIGV4cCBsZW5ndGhcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuX2RhdGFUeXBlID0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDO1xyXG4gICAgICAgICAgaWYgKFByb3BlcnR5Ll9udW1lcmljUHJvcGVydHlQaWMgPT0gbnVsbClcclxuICAgICAgICAgICAgUHJvcGVydHkuX251bWVyaWNQcm9wZXJ0eVBpYyA9IG5ldyBQSUMoXCJONlwiLCBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMsIGNvbXBJZHgpO1xyXG4gICAgICAgICAgdGhpcy5fcGljID0gUHJvcGVydHkuX251bWVyaWNQcm9wZXJ0eVBpYztcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVUVVJOX0FDVElPTjpcclxuICAgICAgICB0aGlzLl9kYXRhVHlwZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9EQVRBOlxyXG4gICAgICAgIHRoaXMuX2RhdGFUeXBlID0gKDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqKS5EYXRhVHlwZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QT1BfVVA6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfT1JJRU5UQVRJT05fTE9DSzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTlRFUl9BTklNQVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRVhJVF9BTklNQVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFWSUdBVElPTl9EUkFXRVJfTUVOVTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BQ1RJT05fQkFSX01FTlU6XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX09QRU5fUElDS0VSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX09QRU5fRURJVF9ESUFMT0c6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfREVGQVVMVF9BTElHTk1FTlQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfS0VZQk9BUkRfVFlQRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9LRVlCT0FSRF9SRVRVUk5fS0VZOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1NVR0dFU1RJT05TOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01PQklMRV9JTUFHRV9MSVNUX0ZJTEVfTkFNRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TV0lQRV9SRUZSRVNIOlxyXG4gICAgICAgIC8vIE5vIGhhbmRsaW5nIGlzIG5lZWRlZCBoZXJlIGFzIHRoZSBwcm9wZXJ0aWVzIGFyZSB2YWxpZCBmb3IgbW9iaWxlIGFzIGZvciBub3cuXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJpbiBQcm9wZXJ0eS5zZXREYXRhVHlwZSgpIG5vIGNhc2UgZm9yOiB7MH1cIiwgdGhpcy5faWQpKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgYXR0cmlidXRlcyBvZiBhIHRoZSBwYXJlbnQgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRDb250cm9sQXR0cmlidXRlcygpIHtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRPYmogPT0gbnVsbCB8fCB0aGlzLl9wYXJlbnRUeXBlICE9PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhcImluIFByb3BlcnR5LnNldENvbnRyb2xBdHRyaWJ1dGVzKCkgdGhlcmUgaXMgbm8gcGFyZW50IG9yIHRoZSBwYXJlbnQgaXMgbm90IGEgY29udHJvbFwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBwYXJlbnRDb250cm9sID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcbiAgICBzd2l0Y2ggKHRoaXMuX2lkKSB7XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRlJBTUVfTkFNRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQU1FOlxyXG4gICAgICAgIHBhcmVudENvbnRyb2wuTmFtZSA9IHRoaXMuX3ZhbDtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQVRUUklCVVRFOlxyXG4gICAgICAgIHBhcmVudENvbnRyb2wuRGF0YVR5cGUgPSA8U3RvcmFnZUF0dHJpYnV0ZT50aGlzLl92YWxbMF07XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUk1BVDpcclxuICAgICAgICBwYXJlbnRDb250cm9sLnNldFBpY1N0cih0aGlzLl92YWwsIHRoaXMuX2V4cElkKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkFOR0U6XHJcbiAgICAgICAgcGFyZW50Q29udHJvbC5zZXRSYW5nZSh0aGlzLl92YWwpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9EQVRBOlxyXG4gICAgICAgIGlmICh0aGlzLl9leHBJZCA+IDApXHJcbiAgICAgICAgICBwYXJlbnRDb250cm9sLnNldFZhbEV4cCh0aGlzLl9leHBJZCk7XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5fdmFsICE9IG51bGwpXHJcbiAgICAgICAgICBwYXJlbnRDb250cm9sLnNldEZpZWxkKHRoaXMuX3ZhbCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0JVVFRPTl9TVFlMRTpcclxuICAgICAgICBpZiAodGhpcy5fdmFsICE9IG51bGwpXHJcbiAgICAgICAgICBwYXJlbnRDb250cm9sLkJ1dHRvblN0eWxlID0gPEN0cmxCdXR0b25UeXBlR3VpPnRoaXMuR2V0Q29tcHV0ZWRWYWx1ZUludGVnZXIoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTEFZRVI6XHJcbiAgICAgICAgaWYgKHRoaXMuX3ZhbCAhPSBudWxsKVxyXG4gICAgICAgICAgcGFyZW50Q29udHJvbC5MYXllciA9IHRoaXMuR2V0Q29tcHV0ZWRWYWx1ZUludGVnZXIoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBvYmplY3Qgb2YgdGhpcyBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0UGFyZW50T2JqKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50T2JqO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHR5cGUgb2YgdGhlIHBhcmVudCBvYmplY3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFBhcmVudFR5cGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9wYXJlbnRUeXBlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGlkIG9mIHRoZSBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0SUQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9pZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBhbmQgdGFrZSBjYXJlIG9mIHRoZSBwcmVzZW50YXRpb24gdGhlIHZhbHVlIG11c3QgYmUgaW4gYSBtYWdpYyBpbnRlcm5hbFxyXG4gIC8vLyAgIGZvcm1hdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ1ZhbFwiPnRoZSBuZXcgdmFsdWU8L3BhcmFtPlxyXG4gIHNldFZhbHVlKG1nVmFsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBjb21wSWR4OiBudW1iZXIgPSB0aGlzLl9wYXJlbnRPYmouZ2V0Q29tcElkeCgpO1xyXG5cclxuICAgIGlmICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfREFUQSB8fCB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTk9ERV9JRCB8fCB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTk9ERV9QQVJFTlRJRClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmICh0aGlzLl9kYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OT05FKVxyXG4gICAgICB0aGlzLnNldERhdGFUeXBlKCk7XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLl9kYXRhVHlwZSkge1xyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQzpcclxuICAgICAgICBpZiAobWdWYWwgPT0gbnVsbClcclxuICAgICAgICAgIG1nVmFsID0gXCJGRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwXCI7XHJcbiAgICAgICAgdGhpcy5fdmFsID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKG1nVmFsLCBcIlwiLCB0aGlzLl9waWMsIGZhbHNlLCBjb21wSWR4LCBmYWxzZSkudHJpbSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQjpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6XHJcbiAgICAgICAgdGhpcy5fdmFsID0gbWdWYWw7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5LnNldFZhbHVlKCkgaWxsZWdhbCBkYXRhIHR5cGU6IFwiICsgdGhpcy5fZGF0YVR5cGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzZXQgYW4gaW50IHZhbHVlIGRpcmVjdGx5LCBhcyBpcyBkb25lIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsXCI+PC9wYXJhbT5cclxuICBTZXRWYWx1ZSh2YWw6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fdmFsID0gU3RyaW5nKHZhbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgYW5kIHRha2UgY2FyZSBvZiB0aGUgcHJlc2VudGF0aW9uIHRoZSB2YWx1ZSBtdXN0IGJlIGluIGEgbWFnaWMgaW50ZXJuYWwgZm9ybWF0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRPcmdWYWx1ZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX29yZ1ZhbHVlID0gdGhpcy5fdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgU2V0U3R1ZGlvVmFsdWVBc09yZ1ZhbHVlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fb3JnVmFsdWUgPSB0aGlzLlN0dWRpb1ZhbHVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZXR1cm5zIHRoZSBmb3JtIHJlbGF0ZWQgdG8gdGhpcyBwcm9wZXJ0eS4gSWYgdGhlIHByb3BlcnR5J3MgcGFyZW50IGlzIHRoZSBmb3JtIHRoZW4gcmV0dXJuIGl0LFxyXG4gIC8vLyAgIG90aGVyd2lzZSwgaWYgdGhlIHByb3BlcnR5J3MgcGFyZW50IGlzIGEgY29udHJvbCB0aGVuIHJldHVybiB0aGUgZm9ybSB0byB3aGljaCB0aGlzIGNvbnRyb2wgYmVsb25ncy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gTWdGb3JtPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0Rm9ybSgpOiBHdWlGb3JtUHJvcGVydHlBZGFwdGVyIHtcclxuICAgIGxldCBmb3JtOiBHdWlGb3JtUHJvcGVydHlBZGFwdGVyID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0ZPUk0pXHJcbiAgICAgIGZvcm0gPSA8R3VpRm9ybVByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuICAgIGVsc2UgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKVxyXG4gICAgICBmb3JtID0gKDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqKS5nZXRGb3JtKCk7XHJcblxyXG4gICAgcmV0dXJuIGZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSB0YXNrIGJ5IHRoZSBwYXJlbnQgb2JqZWN0PC9yZXR1cm5zPlxyXG4gIEdldFRhc2tCeVBhcmVudE9iamVjdCgpOiBHdWlUYXNrQmFzZSB7XHJcbiAgICBsZXQgdGFzazogR3VpVGFza0Jhc2UgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfRk9STSlcclxuICAgICAgdGFzayA9ICg8R3VpRm9ybVByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iaikuZ2V0VGFzaygpO1xyXG4gICAgZWxzZSBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpXHJcbiAgICAgIHRhc2sgPSAoPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmopLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcbiAgICBlbHNlIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfVEFTSylcclxuICAgICAgdGFzayA9IDxHdWlUYXNrQmFzZT50aGlzLl9wYXJlbnRPYmo7XHJcblxyXG4gICAgcmV0dXJuIHRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaCB0aGUgZGlzcGxheSBmb3IgY29udHJvbCBwcm9wZXJ0aWVzIGFuZCBmb3JtIHByb3BlcnRpZXMgb25seVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3JjZVJlZnJlc2hcIj5pZiB0cnVlIHRoZW4gcmVmcmVzaCBpcyBmb3JjZWQgcmVnYXJkbGVzcyBvZiB0aGUgcHJldmlvdXMgdmFsdWU8L3BhcmFtPlxyXG4gIGFzeW5jIFJlZnJlc2hEaXNwbGF5KGZvcmNlUmVmcmVzaDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheVdpdGhDdXJyZW50TGluZShmb3JjZVJlZnJlc2gsIEludDMyLk1pblZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gVFJVRSBpZiB0aGUgcHJvcGVydHkgbmVlZCB0byBiZSBza2lwIGZyb20gdGhlIHJlZnJlc2ggcHJvcGVydGllcy4gZm9yIGEgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIFNob3VsZFNraXBSZWZyZXNoQ29udHJvbCgpOiBib29sZWFuIHtcclxuICAgIGxldCBza2lwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgbWdDb250cm9sOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLl9pZCkge1xyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hFQlJFVzpcclxuICAgICAgICBpZiAobWdDb250cm9sLmlzVGFibGVDb250cm9sKCkpXHJcbiAgICAgICAgICBza2lwID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OT0RFX0lEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05PREVfUEFSRU5USUQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfREFUQTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ISUdITElHSFRJTkc6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVTVF9JTlBVVDpcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSEVMUF9TQ1I6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0VMRUNUX1BST0dSQU06XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0VMRUNUX01PREU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dFRF9ESVJFQ1RJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVUVVJOX0FDVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BVFRSSUJVVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVQRUFUQUJMRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GUkFNRV9OQU1FOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RSSUdHRVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFCX09SREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lTX0NBQ0hFRDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MQVlFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BVVRPX0ZJVDpcclxuICAgICAgLy8gY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NVUxUSUxJTkVfVkVSVElDQUxfU0NST0xMOlxyXG4gICAgICAvLyBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01VTFRJTElORV9XT1JEV1JBUF9TQ1JPTEw6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkFJU0VfQVQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRlJBTUVTRVRfU1RZTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRlJBTUVfVFlQRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SQU5HRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9XSU5ET1dfV0lEVEg6XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBQkJJTkdfT1JERVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQVVUT19SRUZSRVNIOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BBUkFNRVRFUlM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfT0JKRUNUX1RZUEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVUQUlOX0ZPQ1VTOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NVQkZPUk1fVFlQRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SRUFMX09CSkVDVF9UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FERElUSU9OQUxfSU5GT1JNQVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfREFUQVZJRVdDT05UUk9MOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RBVEFWSUVXQ09OVFJPTF9GSUVMRFM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUFJHVFNLX05VTTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JTkRFWDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ESVNQTEFZX0ZJRUxEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xJTktfRklFTEQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQkVGT1JFXzkwMF9WRVJTSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JFRlJFU0hfV0hFTl9ISURERU46XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0VSVkVSX1JFQURfQUhFQUQ6XHJcbiAgICAgICAgc2tpcCA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0JVVFRPTl9TVFlMRTpcclxuICAgICAgICBpZiAoISg8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iaikuaXNSYWRpbygpKVxyXG4gICAgICAgICAgc2tpcCA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiBza2lwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBUUlVFIGlmIHRoZSBwcm9wZXJ0eSBuZWVkIHRvIGJlIHNraXAgZnJvbSB0aGUgcmVmcmVzaCBwcm9wZXJ0aWVzLiBmb3IgYSBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgU2hvdWxkU2tpcFJlZnJlc2hGb3JtKCk6IGJvb2xlYW4ge1xyXG4gICAgRGVidWcuQXNzZXJ0KHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9GT1JNKTtcclxuXHJcbiAgICBsZXQgc2tpcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IG1nRm9ybUJhc2U6IEd1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpRm9ybVByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuXHJcbiAgICAvLyBDb21wdXRlIHByb3BlcnRpZXM6IGFsbCB0aG9zZSBwcm9wZXJ0aWVzIHdpbGwgYmUgcmVmcmVzaCBvbmx5IG9uZSB0aW1lXHJcbiAgICBzd2l0Y2ggKHRoaXMuX2lkKSB7XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfV0lORE9XX1RZUEU6XHJcbiAgICAgICAgaWYgKCF0aGlzLl9wYXJlbnRPYmouSXNGaXJzdFJlZnJlc2hPZlByb3BzKCkpXHJcbiAgICAgICAgICBza2lwID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTElORVNfSU5fVEFCTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSEVMUF9TQ1I6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFCQklOR19PUkRFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QRVJTSVNURU5UX0ZPUk1fU1RBVEVfVkVSU0lPTjpcclxuICAgICAgICBza2lwID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcmVmcmVzaCBvbmx5IHRoZSByZWxldmFudCBzdWJmb3JtIHByb3BlcnRpZXMgKGNvbG9yLCBmb250LCBldGMuKVxyXG4gICAgaWYgKCFza2lwICYmIG1nRm9ybUJhc2UuaXNTdWJGb3JtKCkpIHtcclxuICAgICAgc2tpcCA9IHRydWU7XHJcbiAgICAgIHN3aXRjaCAodGhpcy5faWQpIHtcclxuXHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fUFJPUEVSVElFUzpcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9WQUxJREFUT1JTOlxyXG4gICAgICAgICAgc2tpcCA9IGZhbHNlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2tpcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gVFJVRSBpZiB0aGUgcHJvcGVydHkgbmVlZCB0byBiZSBza2lwIGZyb20gdGhlIHJlZnJlc2ggcHJvcGVydGllcy4gZm9yIGEgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIFNob3VsZFNraXBSZWZyZXNoVGFzaygpOiBib29sZWFuIHtcclxuICAgIGxldCBza2lwOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLl9pZCkge1xyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0NSRUFURTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19ERUxFVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTU9ESUZZOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1FVRVJZOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1JBTkdFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0xPQ0FURTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19TT1JUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19BTExPV19JTkRFWDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJCSU5HX0NZQ0xFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTkZJUk1fQ0FOQ0VMOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTkZJUk1fVVBEQVRFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VORF9DT05ESVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRVZBTF9FTkRfQ09ORElUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9ERUxFVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19NT0RFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UUkFTQUNUSU9OX0JFR0lOOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19UUkFOU0FDVElPTl9NT0RFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BSSU5UX0RBVEE6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ0xPU0VfVEFTS1NfQllfTURJX01FTlU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX09QRU5fVEFTS19XSU5ET1c6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0FMTE9XX0VWRU5UUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfQ0hVTktfU0laRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfSU5ERVhfT1BUSU1JWkFUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19SQU5HRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfUkFOR0VfT1JERVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0xPQ0FURTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfTE9DQVRFX09SREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19QT1NJVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfUE9TSVRJT05fVVNBR0U6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX1NRTF9SQU5HRTpcclxuICAgICAgICBza2lwID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNraXA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBpZ25vcmVkIGJ5IFJlZnJlc2hEaXNwbGF5KCkgc2tpcCBwcm9wZXJ0aWVzIHdoaWNoIGhhcyBub3RoaW5nIHRvIGRvIHdpdGhcclxuICAvLy8gICB0aGUgZGlzcGxheVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgaWdub3JlZDwvcmV0dXJucz5cclxuICBwcml2YXRlIFNob3VsZFNraXBSZWZyZXNoKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHNraXA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHN3aXRjaCAodGhpcy5fcGFyZW50VHlwZSkge1xyXG4gICAgICBjYXNlIEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MOlxyXG4gICAgICAgIHNraXAgPSB0aGlzLlNob3VsZFNraXBSZWZyZXNoQ29udHJvbCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9GT1JNOlxyXG4gICAgICAgIHNraXAgPSB0aGlzLlNob3VsZFNraXBSZWZyZXNoRm9ybSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9UQVNLOlxyXG4gICAgICAgIHNraXAgPSB0aGlzLlNob3VsZFNraXBSZWZyZXNoVGFzaygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaCAodGhpcy5faWQpIHtcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QT1BfVVA6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfT1JJRU5UQVRJT05fTE9DSzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTlRFUl9BTklNQVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRVhJVF9BTklNQVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFWSUdBVElPTl9EUkFXRVJfTUVOVTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BQ1RJT05fQkFSX01FTlU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfT1BFTl9QSUNLRVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfT1BFTl9FRElUX0RJQUxPRzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ERUZBVUxUX0FMSUdOTUVOVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9LRVlCT0FSRF9UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0tFWUJPQVJEX1JFVFVSTl9LRVk6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfU1VHR0VTVElPTlM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTU9CSUxFX0lNQUdFX0xJU1RfRklMRV9OQU1FOlxyXG4gICAgICAgIHNraXAgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNraXA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaCB0aGUgZGlzcGxheSBmb3IgY29udHJvbCBwcm9wZXJ0aWVzIGFuZCBmb3JtIHByb3BlcnRpZXMgb25seVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3JjZVJlZnJlc2hcIj5pZiB0cnVlIHRoZW4gcmVmcmVzaCBpcyBmb3JjZWQgcmVnYXJkbGVzcyBvZiB0aGUgcHJldmlvdXMgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3VyckxpbmVcIj5saW5lIG51bWJlciBpbiB0YWJsZSB3aGVuIHJlZnJlc2hpbmcgYSBjb2x1bW4gaWYgdGhlIGN1cnJlbnQgbGluZSBpcyByZWZyZXNoZWQgc2V0IHRvXHJcbiAgLy8vICAgKEludGVnZXIuTUlOX1ZBTFVFKVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgUmVmcmVzaERpc3BsYXlXaXRoQ3VycmVudExpbmUoZm9yY2VSZWZyZXNoOiBib29sZWFuLCBjdXJyTGluZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5V2l0aEN1cnJMaW5lQW5kQ2hlY2tTa2lwUmVmcmVzaChmb3JjZVJlZnJlc2gsIGN1cnJMaW5lLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiB3ZSBtdXN0IHJlZnJlc2ggdGhlIHByb3BlcnR5IGV2ZW4gaWYgaXQgaGFzIGV4cHJlc3Npb25cclxuICAvLyBGb3Igbm93IGl0IHJldHVybnMgdHJ1ZSBmb3IgcHJvcGVydGllcyB3aXRoIHRleHQgZm9yIG11bHRpbGluZ3VhbCBzdXBwb3J0XHJcblxyXG4gIC8vIHRvZG8gTmVlZCB0byBhZGQgaGVyZSBjaGVjayBpZiB1c2VyIHdhbnRzIG11bHRpbGluZ3VhbCBzdXBwb3J0IGF0IGFsbFxyXG4gIFNraXBXaGVuTm9FeHByZXNzaW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHNraXBXaGVuTm9FeHByZXNzaW9uID0gdHJ1ZTtcclxuXHJcbiAgICBsZXQgY3RybCA9ICgodGhpcy5fcGFyZW50T2JqIGluc3RhbmNlb2YgR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcikgPyA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj50aGlzLl9wYXJlbnRPYmogOiBudWxsKTtcclxuICAgIGlmICgoY3RybCAhPSBudWxsICYmIGN0cmwuaXNCdXR0b24oKSAmJiB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9STUFUKSB8fFxyXG4gICAgICAoY3RybCAhPSBudWxsICYmIGN0cmwuaXNDb21ib0JveCgpICYmIHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MQUJFTCkgfHxcclxuICAgICAgKGN0cmwgIT0gbnVsbCAmJiBjdHJsLmlzTGlzdEJveCgpICYmIHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MQUJFTCkgfHxcclxuICAgICAgKGN0cmwgIT0gbnVsbCAmJiBjdHJsLmlzUmFkaW8oKSAmJiB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTEFCRUwpIHx8XHJcbiAgICAgIChjdHJsICE9IG51bGwgJiYgY3RybC5pc0NoZWNrQm94KCkgJiYgdGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xBQkVMKSB8fFxyXG4gICAgICAoY3RybCAhPSBudWxsICYmIGN0cmwuaXNUYWJDb250cm9sKCkgJiYgdGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xBQkVMKSB8fFxyXG4gICAgICAoY3RybCAhPSBudWxsICYmIGN0cmwuaXNJbWFnZUNvbnRyb2woKSAmJiB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSU1BR0VfRklMRU5BTUUpIHx8XHJcbiAgICAgIChjdHJsICE9IG51bGwgJiYgY3RybC5Jc0ltYWdlQnV0dG9uKCkgJiYgdGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lNQUdFX0ZJTEVOQU1FKSB8fFxyXG4gICAgICAoY3RybCAhPSBudWxsICYmIGN0cmwuaXNDb2x1bW5Db250cm9sKCkgJiYgdGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTFVNTl9USVRMRSkgfHxcclxuICAgICAgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ESVNQTEFZX0xJU1QpIHx8XHJcbiAgICAgICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEVYVCkgfHxcclxuICAgICAgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UT09MVElQKSB8fFxyXG4gICAgICAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hJTlQpIHx8XHJcbiAgICAgICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUEFTU1dPUkQpIHx8XHJcbiAgICAgICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ1VTVE9NX1BST1BFUlRJRVMpIHx8XHJcbiAgICAgICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ1VTVE9NX1ZBTElEQVRPUlMpIHx8XHJcbiAgICAgICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRSkgfHxcclxuICAgICAgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkFCTEVEKXx8XHJcbiAgICAgICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQklORElOR19MRVZFTCkpXHJcbiAgICAgIHNraXBXaGVuTm9FeHByZXNzaW9uID0gZmFsc2U7XHJcbiAgICByZXR1cm4gc2tpcFdoZW5Ob0V4cHJlc3Npb247XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJlZXZhbHVhdGUgdGhlIHByb3BlcnR5IHZhbHVlIChpZiBpdCBoYXMgYW4gZXhwcmVzc2lvbikgYW5kXHJcbiAgLy8vIHJlZnJlc2ggdGhlIGRpc3BsYXkgZm9yIGNvbnRyb2wgcHJvcGVydGllcyBhbmQgZm9ybSBwcm9wZXJ0aWVzIG9ubHlcclxuICAvLy9cclxuICAvLy8gVGhpcyBtZXRob2Qgd2FzIChhcyBpdHMgbmFtZSBpbXBsaWVzKSByZWxldmFudCBvbmx5IGZvciBHVUkgcHJvcGVydGllcywgaS5lLiBwcm9wZXJ0aWVzIHRoYXQgYWZmZWN0IG9uIHRoZSBkaXNwbGF5LlxyXG4gIC8vLyBOb24tR1VJIHByb3BlcnRpZXMgKHN1Y2ggYXMgUFJPUF9UWVBFX1RBQl9JTikgd2VyZSBza2lwcGVkIGFuZCBub3QgcmVldmFsdWF0ZWQuXHJcbiAgLy8vIFRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIEdVSSBwcm9wZXJ0aWVzIGFuZCBub24tR1VJIHByb3BlcnRpZXMgaXMgZG9uZSBieSB0aGUgbWV0aG9kIO+/vVNob3VsZFNraXBSZWZyZXNo77+9RVxyXG4gIC8vLyBOb3cgd2UgaGF2ZSBub24tR1VJIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVldmFsdWF0ZWQgaW4gdGhpcyBmdW5jdGlvbjpcclxuICAvLy8gUFJPUF9UWVBFX01PRElGWV9JTl9RVUVSWSwgUFJPUF9UWVBFX0NPTlRFWFRfTUVOVSwgUFJPUF9UWVBFX1RBQl9JTiwgUFJPUF9UWVBFX1BBUktfT05fQ0xJQ0suXHJcbiAgLy8vIEZvciB0aGVzZSBwcm9wZXJ0aWVzIHdlIGRvIG5vdCBleGVjdXRlIGV4cGxpY2l0bHkgdGhlaXIgZXhwcmVzc2lvbnMgKGl0IHdhcyBkb25lIGluIDEuOSBieSBDaGVja1Byb3AgZnVuY3Rpb24pLFxyXG4gIC8vLyB3ZSBvbmx5IHVzZSB0aGVpciB2YWx1ZXMgYnkgR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkgZnVuY3Rpb24uIEl0IGlzIGRvbmUgZm9yIGRvIG5vdCBleGVjdXRlIHRoZSBwcm9wZXJ0eSBleHByZXNzaW9uXHJcbiAgLy8vIGluIEdVSSB0aHJlYWQuIEluIEdVSSB0aHJlYWQgd2Ugb25seSB1c2UgdGhlIHByb3BlcnR5IHZhbHVlLiBTbyBpdCBpcyBuZWVkZWQgdG8gcmVldmFsdWF0ZSB0aGUgcHJvcGVydHkgdmFsdWUuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvcmNlUmVmcmVzaFwiPmlmIHRydWUgdGhlbiByZWZyZXNoIGlzIGZvcmNlZCByZWdhcmRsZXNzIG9mIHRoZSBwcmV2aW91cyB2YWx1ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdXJyTGluZVwiPmxpbmUgbnVtYmVyIGluIHRhYmxlIHdoZW4gcmVmcmVzaGluZyBhIGNvbHVtbiBpZiB0aGUgY3VycmVudCBsaW5lIGlzIHJlZnJlc2hlZCBzZXQgdG9cclxuICAvLy8gICAoSW50ZWdlci5NSU5fVkFMVUUpXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgYXN5bmMgUmVmcmVzaERpc3BsYXlXaXRoQ3VyckxpbmVBbmRDaGVja1NraXBSZWZyZXNoKGZvcmNlUmVmcmVzaDogYm9vbGVhbiwgY3VyckxpbmU6IG51bWJlciwgY2hlY2tTa2lwUmVmcmVzaDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGN0cmw6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSBudWxsO1xyXG4gICAgbGV0IGxpbmU6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgcHJldlZhbHVlOiBzdHJpbmc7XHJcbiAgICBsZXQgdmFsQ2hhbmdlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgaWYgKHRoaXMuX3ZhbCA9PT0gbnVsbCAmJiB0aGlzLl9leHBJZCA9PT0gMCkge1xyXG4gICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhcImluIFByb3BlcnR5LlJlZnJlc2hEaXNwbGF5KCkgbnVsbCB2YWx1ZSBhbmQgZXhwcmVzc2lvblwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGVja1NraXBSZWZyZXNoICYmIHRoaXMuU2hvdWxkU2tpcFJlZnJlc2goKSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmICh0aGlzLl9leHBJZCA9PT0gMCAmJiB0aGlzLlNraXBXaGVuTm9FeHByZXNzaW9uKCkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAodGhpcy5fcHJldlZhbHVlcy5sZW5ndGggPT09IDApXHJcbiAgICAgIHRoaXMuc2V0UHJldkFycmF5U2l6ZSgpO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuQ29tcHV0ZVZhbHVlKCk7XHJcblxyXG4gICAgLy8gYmVmb3JlIHVwZGF0ZSB0aGUgcHJvcGVydHkgbmVlZCB0byBwcmVwYXJlIGRhdGFcclxuICAgIHN3aXRjaCAodGhpcy5fcGFyZW50VHlwZSkge1xyXG4gICAgICBjYXNlIEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MOlxyXG4gICAgICAgIGN0cmwgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuICAgICAgICAvLyByZWNvbXB1dGUgdGhlIFBJQyBmb3IgZm9ybWF0IHByb3BlcnRpZXNcclxuICAgICAgICBpZiAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUk1BVCAmJiB0aGlzLl9leHBJZCA+IDApXHJcbiAgICAgICAgICBjdHJsLmNvbXB1dGVQSUModGhpcy5fdmFsKTtcclxuXHJcbiAgICAgICAgaWYgKGN0cmwuSXNSZXBlYXRhYmxlICYmICFjdHJsLmdldEZvcm0oKS5pc1JlZnJlc2hSZXBlYXRhYmxlQWxsb3dlZCgpKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBpZiAoY3VyckxpbmUgPT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICAgICAgbGluZSA9IHRoaXMuZ2V0TGluZSgpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGxpbmUgPSBjdXJyTGluZTtcclxuXHJcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB3YXMgY2hhbmdlZCB0byBwcmV2ZW50IHNlbmRpbmcgcmVkdW5kYW50XHJcbiAgICAgICAgLy8gamF2YXNjcmlwdCBjb21tYW5kcyB0byB0aGUgYnJvd3NlclxyXG4gICAgICAgIHByZXZWYWx1ZSA9IHRoaXMuX3ByZXZWYWx1ZXMuZ2V0X0l0ZW0obGluZSk7XHJcblxyXG5cclxuICAgICAgICBpZiAoIWZvcmNlUmVmcmVzaCAmJiAodGhpcy5fdmFsID09PSBwcmV2VmFsdWUpXHJcbiAgICAgICAgICAmJiB0aGlzLl9pZCAhPT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTU9ESUZJQUJMRVxyXG4gICAgICAgICAgJiYgdGhpcy5faWQgIT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEVcclxuICAgICAgICAgICYmIHRoaXMuX2lkICE9PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkFCTEVEKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyB0byBwcmV2ZW50IHJlY3Vyc2lvbiB3aGlsZSB1cGRhdGluZyBjb2x1bW4gdmlzaWJpbGl0eVxyXG4gICAgICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTFVNTlxyXG4gICAgICAgICAgJiYgdGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEVcclxuICAgICAgICAgICYmIHRoaXMuX3ZhbCA9PT0gcHJldlZhbHVlKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fdmFsID09PSBwcmV2VmFsdWUpXHJcbiAgICAgICAgICB2YWxDaGFuZ2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuX3ByZXZWYWx1ZXMuc2V0X0l0ZW0obGluZSwgdGhpcy5fdmFsKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0ZPUk06XHJcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB3YXMgY2hhbmdlZCB0byBwcmV2ZW50IHNlbmRpbmcgcmVkdW5kYW50XHJcbiAgICAgICAgLy8gamF2YXNjcmlwdCBjb21tYW5kcyB0byB0aGUgYnJvd3NlclxyXG4gICAgICAgIHByZXZWYWx1ZSA9IHRoaXMuX3ByZXZWYWx1ZXMuZ2V0X0l0ZW0oMCk7XHJcbiAgICAgICAgaWYgKCFmb3JjZVJlZnJlc2ggJiYgKHRoaXMuX3ZhbCA9PT0gcHJldlZhbHVlKSlcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB0aGlzLl9wcmV2VmFsdWVzLnNldF9JdGVtKDAsIHRoaXMuX3ZhbCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9UQVNLOiAvLyBUQVNLIFBST1BFUlRJRVNcclxuICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhcclxuICAgICAgICAgIE5TdHJpbmcuRm9ybWF0KFwiUHJvcGVydHkuUmVmcmVzaERpc3BsYXkoKTogdGFzayBwcm9wZXJ0eSB7MH0gd2Fzbid0IGhhbmRsZWRcIiwgdGhpcy5faWQpKTtcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKFxyXG4gICAgICAgICAgTlN0cmluZy5Gb3JtYXQoXCJQcm9wZXJ0eS5SZWZyZXNoRGlzcGxheSgpOiBwYXJlbnRUeXBlIHVua25vd24sIHByb3BlcnR5IHswfSB3YXNuJ3QgaGFuZGxlZFwiLCB0aGlzLl9pZCkpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMuX2lkKSB7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lNQUdFX0ZJTEVOQU1FOlxyXG4gICAgICAgIHRoaXMub25JbWFnZUZpbGVOYW1lKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VOQUJMRUQ6XHJcbiAgICAgICAgdGhpcy5vbkVuYWJsZSh2YWxDaGFuZ2VkKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRTpcclxuICAgICAgICBhd2FpdCB0aGlzLm9uVmlzaWJsZSh2YWxDaGFuZ2VkKTtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05BTUU6XHJcbiAgICAgICAgdGhpcy5PbkNvbnRyb2xOYW1lKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUk1fTkFNRTpcclxuICAgICAgICB0aGlzLm9uRm9ybU5hbWUoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09MVU1OX1RJVExFOlxyXG4gICAgICAgIHRoaXMub25UZXh0KDApO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9URVhUOlxyXG4gICAgICAgIHRoaXMub25UZXh0KGxpbmUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ISU5UOlxyXG4gICAgICAgIHRoaXMub25IaW50KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01PRElGSUFCTEU6XHJcbiAgICAgICAgYXdhaXQgdGhpcy5vbk1vZGlmaWFibGUoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVE9PTFRJUDpcclxuICAgICAgICB0aGlzLm9uVG9vbHRpcCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ESVNQTEFZX0xJU1Q6XHJcbiAgICAgICAgYXdhaXQgdGhpcy5vbkRpc3BsYXlMaXN0KGxpbmUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BVVRPX0NPTVBMRVRFX01PREVfV0M6XHJcbiAgICAgICAgdGhpcy5vbkF1dG9Db21wbGV0ZU1vZGUoKTtcclxuICAgICAgICBicmVha1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFX0xBWUVSU19MSVNUOlxyXG4gICAgICAgIGF3YWl0IHRoaXMub25WaXNpYmxlTGF5ZXJMaXN0KGxpbmUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JNQVQ6XHJcbiAgICAgICAgdGhpcy5vbkZvcm1hdCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MQUJFTDpcclxuICAgICAgICBhd2FpdCB0aGlzLm9uTGFiZWwobGluZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUEFTU1dPUkQ6XHJcbiAgICAgICAgdGhpcy5vblBhc3N3b3JkKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NT0RJRllfSU5fUVVFUlk6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFCX0lOOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BBUktfT05fQ0xJQ0s6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTE9BRF9JTUFHRV9GUk9NOiAvLyB0aGlzIHByb3BlcnR5IGlzIHVzZWQgZm9yIGlkZW50aWZ5aW5nIGxvYWRpbmcgb2YgaW1hZ2UgKFNlcnZlci9DbGllbnQpLlxyXG4gICAgICAgIC8vIFNvIG5vIGhhbmRsaW5nIG5lZWRlZCBpbiBSZWZyZXNoRGlzcGxheVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ1VTVE9NX1BST1BFUlRJRVM6XHJcbiAgICAgICAgdGhpcy5vbkN1c3RvbVByb3BlcnRpZXMoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fVkFMSURBVE9SUzpcclxuICAgICAgICB0aGlzLm9uQ3VzdG9tVmFsaWRhdG9ycygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9CSU5ESU5HX0xFVkVMOlxyXG4gICAgICAgIHRoaXMub25CaW5kaW5nTGV2ZWwoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhcclxuICAgICAgICAgIE5TdHJpbmcuRm9ybWF0KFwiUHJvcGVydHkuUmVmcmVzaERpc3BsYXkoKTogUHJvcGVydHkgezB9IHdhc24ndCBoYW5kbGVkXCIsIHRoaXMuX2lkKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBuZWVkIHRvIGNhbGN1bGF0ZSBvbmNlIG9ubHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBTaG91bGRCZUNvbXB1dGVkT25jZSgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfVEFTSykge1xyXG4gICAgICBzd2l0Y2ggKHRoaXMuX2lkKSB7XHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX01PREU6XHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QUkVMT0FEX1ZJRVc6XHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJCSU5HX0NZQ0xFOlxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX09QRU5fVEFTS19XSU5ET1c6XHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfQUxMT1dfRVZFTlRTOlxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTE9DQVRFX0lOX1FVRVJZOlxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUFJJTlRfREFUQTpcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1JBTkdFOlxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTE9DQVRFOlxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfU09SVDpcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19BTExPV19JTkRFWDpcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01BSU5fRElTUExBWTpcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICBpZiAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lTX0NBQ0hFRCB8fCB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVMVElMSU5FKVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaWYgdGhlIHZhbHVlIGlzIGNvbXB1dGVkIGluIHRoZSBzZXJ2ZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBJc0NvbXB1dGVkT25jZU9uU2VydmVyKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuU2hvdWxkQmVDb21wdXRlZE9uY2UoKSkge1xyXG4gICAgICBsZXQgdGFzazogR3VpVGFza0Jhc2UgPSB0aGlzLkdldFRhc2tCeVBhcmVudE9iamVjdCgpO1xyXG4gICAgICBpZiAodGFzayAhPSBudWxsKVxyXG4gICAgICAgIHJldHVybiAhdGFzay5TaG91bGRFdmFsdWF0ZVByb3BlcnR5TG9jYWxseSh0aGlzLl9pZCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY29tcHV0ZXMgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBhbmQgZG9lcyBub3QgYWZmZWN0IHRoZSBkaXNwbGF5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIENvbXB1dGVWYWx1ZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IG51bGw7XHJcbiAgICBsZXQgbGVuOiBudW1iZXIgPSAyNTU7XHJcbiAgICBsZXQgd2FzRXZhbHVhdGVkOiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbShmYWxzZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fUFJPUEVSVElFUykge1xyXG4gICAgICBhd2FpdCB0aGlzLmNvbXB1dGVDdXN0b21Qcm9wZXJ0aWVzVmFsdWVzKCk7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuR2V0QXJyYXlWYWx1ZXNGb3JDdXN0b21Qcm9wZXJ0aWVzKCk7XHJcbiAgICAgIHRoaXMuc2V0VmFsdWUocmVzdWx0KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ1VTVE9NX1ZBTElEQVRPUlMpIHtcclxuICAgICAgYXdhaXQgdGhpcy5jb21wdXRlQ3VzdG9tVmFsaWRhdG9ycygpO1xyXG4gICAgICByZXN1bHQgPSB0aGlzLkdldEFycmF5VmFsdWVzRm9yQ3VzdG9tVmFsaWRhdGlvblByb3BlcnRpZXMoKTtcclxuICAgICAgdGhpcy5zZXRWYWx1ZShyZXN1bHQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5fZXhwSWQgPiAwKSB7XHJcbiAgICAgIC8vIGZvciBvZmZsaW5lIDogY29tcHV0ZSBvbmNlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgd2FzIGNvbXB1dGUgb24gdGhlIHNlcnZlclxyXG4gICAgICBpZiAodGhpcy5TaG91bGRCZUNvbXB1dGVkT25jZSgpICYmIHRoaXMuX2V4cEFscmVhZHlDb21wdXRlZE9uY2UpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgdGhpcy5fZXhwQWxyZWFkeUNvbXB1dGVkT25jZSA9IHRydWU7XHJcblxyXG4gICAgICAvLyBmb3IgZm9sbG93aW5nIGNvbnRyb2wgcHJvcGVydGllcyBhbHdheXMgZXZhbHVhdGUgZXhwcmVzc2lvbnNcclxuICAgICAgbGV0IGFsd2F5c0V2YWx1YXRlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cclxuICAgICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9UQVNLKVxyXG4gICAgICAgIGFsd2F5c0V2YWx1YXRlID0gdHJ1ZTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9STUFUKSB7XHJcbiAgICAgICAgbGVuID0gNjU1MzU7XHJcbiAgICAgICAgcmVzdWx0ID0gU3RyVXRpbC5ydHJpbShhd2FpdCB0aGlzLl9wYXJlbnRPYmouRXZhbHVhdGVFeHByZXNzaW9uKHRoaXMuX2V4cElkLCB0aGlzLl9kYXRhVHlwZSwgbGVuLCB0cnVlLFxyXG4gICAgICAgICAgU3RvcmFnZUF0dHJpYnV0ZS5TS0lQLCBhbHdheXNFdmFsdWF0ZSwgd2FzRXZhbHVhdGVkKSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuX3BhcmVudE9iai5FdmFsdWF0ZUV4cHJlc3Npb24odGhpcy5fZXhwSWQsIHRoaXMuX2RhdGFUeXBlLCBsZW4sIHRydWUsIFN0b3JhZ2VBdHRyaWJ1dGUuU0tJUCwgYWx3YXlzRXZhbHVhdGUsIHdhc0V2YWx1YXRlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICBsZXQgd2FybmluZ01zZyA9IG5ldyBTdHJpbmdCdWlsZGVyKFwiRXhjZXB0aW9uOiBcIiArIGUuTWVzc2FnZSk7XHJcbiAgICAgICAgICBpZiAodGhpcy5fcGFyZW50T2JqIGluc3RhbmNlb2YgR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcilcclxuICAgICAgICAgICAgd2FybmluZ01zZy5BcHBlbmQoXCIgQ29udHJvbDogXCIgKyAoPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+dGhpcy5fcGFyZW50T2JqKS5OYW1lKTtcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZVdhcm5pbmdUb0xvZyh3YXJuaW5nTXNnLlRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh3YXNFdmFsdWF0ZWQudmFsdWUpIHtcclxuICAgICAgICByZXN1bHQgPSB0aGlzLnVwZGF0ZVJlc3VsdChyZXN1bHQpO1xyXG4gICAgICAgIHRoaXMuc2V0VmFsdWUocmVzdWx0KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLl92YWwgPT0gbnVsbCAmJiB0aGlzLl9wYXJlbnRUeXBlICE9PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICAgIHJlc3VsdCA9IFByb3BEZWZhdWx0cy5nZXREZWZhdWx0VmFsdWUodGhpcy5faWQsIHRoaXMuX3BhcmVudFR5cGUsIHRoaXMuX3BhcmVudE9iaik7XHJcbiAgICAgICAgdGhpcy5zZXRWYWx1ZShyZXN1bHQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdXBkYXRlcyByZXN1bHRzIG9mIGV4cHJlc3Npb24gZm9yIHNvbWUgcHJvcGVydGllc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXN1bHRcIj4gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IDwvcmV0dXJucz5cclxuICBwcml2YXRlIHVwZGF0ZVJlc3VsdChyZXN1bHQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBzd2l0Y2ggKHRoaXMuX2lkKSB7XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9STUFUOlxyXG4gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbClcclxuICAgICAgICAgIHJlc3VsdCA9IE5TdHJpbmcuRW1wdHk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfTU9ERTpcclxuICAgICAgICByZXN1bHQgPSBQcm9wZXJ0eS51cGRhdGVUYXNrTW9kZVJlc3VsdChyZXN1bHQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGRvIHRoZSBzYW1lIGFzIHdlIGRvaW5nIGZvciBjKysgVWNoYXIgUlQ6OnRza19tb2RlX2V4cCAobG9uZyBleHAsIFVjaGFyIG1vZGUpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXN1bHRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgdXBkYXRlVGFza01vZGVSZXN1bHQocmVzdWx0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IGNvZGU6IHN0cmluZyA9ICcgJztcclxuICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KHJlc3VsdCkpIHtcclxuICAgICAgY29kZSA9IHJlc3VsdFswXS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICBzd2l0Y2ggKGNvZGUpIHtcclxuICAgICAgICBjYXNlICdRJzpcclxuICAgICAgICAgIGNvZGUgPSAnRSc7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdGJzpcclxuICAgICAgICAgIGNvZGUgPSAnTyc7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdPJzpcclxuICAgICAgICAgIGNvZGUgPSAnTic7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjb2RlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZ2V0VmFsdWUoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGF3YWl0IHRoaXMuQ29tcHV0ZVZhbHVlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGludGVnZXIgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBpbnQgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eTwvcmV0dXJucz5cclxuICBhc3luYyBnZXRWYWx1ZUludCgpOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgbGV0IHJlc3VsdDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBhd2FpdCB0aGlzLkNvbXB1dGVWYWx1ZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLl92YWwgIT09IG51bGwpXHJcbiAgICAgIHJlc3VsdCA9IE5OdW1iZXIuUGFyc2UodGhpcy5fdmFsKTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm5zIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgd2l0aG91dCBleGVjdXRlIGl0cyBleHByZXNzaW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IGludCB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5PC9yZXR1cm5zPlxyXG4gIEdldENvbXB1dGVkVmFsdWVJbnRlZ2VyKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gTk51bWJlci5QYXJzZSh0aGlzLl92YWwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgYSBib29sZWFuIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB2YWxpZCBvbmx5IGZvciBsb2dpY2FsIHR5cGUgcHJvcGVydGllc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZ2V0VmFsdWVCb29sZWFuKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKHRoaXMuX2RhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU4pIHtcclxuICAgICAgYXdhaXQgdGhpcy5nZXRWYWx1ZSgpO1xyXG4gICAgICByZXR1cm4gRGlzcGxheUNvbnZlcnRvci50b0Jvb2xlYW4odGhpcy5fdmFsKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcIlByb3BlcnR5LmdldFZhbHVlQm9vbGVhbigpIHdhcyBjYWxsZWQgZm9yIG5vbiBib29sZWFuIHR5cGUgcHJvcGVydHk6IHswfVwiLCB0aGlzLl9pZCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXQgdGhlIGNvbXB1dGVkIHZhbHVlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRDb21wdXRlZFZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgdGhlIGNvbXB1dGVkIGJvb2xlYW4gdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdpdGhvdXQgZXhlY3V0ZSBpdHMgZXhwcmVzc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgR2V0Q29tcHV0ZWRWYWx1ZUJvb2xlYW4oKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5fZGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTikge1xyXG4gICAgICByZXR1cm4gRGlzcGxheUNvbnZlcnRvci50b0Jvb2xlYW4odGhpcy5fdmFsKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcIlByb3BlcnR5LmdldFZhbHVlQm9vbGVhbigpIHdhcyBjYWxsZWQgZm9yIG5vbiBib29sZWFuIHR5cGUgcHJvcGVydHk6IHswfVwiLCB0aGlzLl9pZCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vICAgcmV0dXJucyB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGluIHRoZSBzcGVjaWZpZWQgbGluZSBvZiB0aGUgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPnRoZSByZXF1ZXN0ZWQgbGluZSBudW1iZXI8L3BhcmFtPlxyXG4gIGdldFByZXZWYWx1ZShsaW5lOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKGxpbmUgPCB0aGlzLl9wcmV2VmFsdWVzLmxlbmd0aClcclxuICAgICAgcmV0dXJuIHRoaXMuX3ByZXZWYWx1ZXMuZ2V0X0l0ZW0obGluZSk7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhpcyBwcm9wZXJ0eSBoYXMgYW4gZXhwcmVzc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNFeHByZXNzaW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V4cElkID4gMDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0RXhwcmVzc2lvbklkKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXhwSWQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvbkltYWdlRmlsZU5hbWUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgbGV0IG1nQ29udHJvbEJhc2U6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuICAgICAgaWYgKG1nQ29udHJvbEJhc2UuaXNUYWJDb250cm9sKCkpIHtcclxuICAgICAgICBtZ0NvbnRyb2xCYXNlLnNldEltYWdlTGlzdCh0aGlzLkdldENvbXB1dGVkVmFsdWUoKSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAobWdDb250cm9sQmFzZS5pc0ltYWdlQ29udHJvbCgpIHx8IG1nQ29udHJvbEJhc2UuaXNSYWRpbygpIHx8IG1nQ29udHJvbEJhc2UuaXNDaGVja0JveCgpIHx8IG1nQ29udHJvbEJhc2UuSXNJbWFnZUJ1dHRvbigpKSB7XHJcbiAgICAgICAgbWdDb250cm9sQmFzZS5zZXRJbWFnZVdpdGhGaWxlTmFtZSh0aGlzLkdldENvbXB1dGVkVmFsdWUoKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gb25JbWFnZUZpbGVOYW1lLm9uRW5hYmxlKClcIik7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25FbmFibGUodmFsQ2hhbmdlZDogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgIGxldCBjdHJsOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcbiAgICAgIGxldCBjdXJyZW50RWRpdGluZ0NvbnRyb2w6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSBjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuQ3VycmVudEVkaXRpbmdDb250cm9sO1xyXG5cclxuICAgICAgLy8gQUNUX1RCTF9OWFRGTEQgaXMgYWRkZWQgaW4gcXVldWUsIHdoZW5ldmVyIGN1cnJlbnQgY29udHJvbCBpcyBoaWRkZW4gb3IgZGlzYWJsZWQgdG8gc2V0IHRoZSBmb2N1cyB0byBuZXh0IGNvbnRyb2wgZm9yIGJvdGggUkMgJiBPTFxyXG4gICAgICAvLyB3aGljaCBpcyBjb3JyZWN0IGJlaGF2aW9yLiBCdXQgb25jZSBjdXJyZW50IGN0cmwgaXMgYWxyZWFkeSBkaXNhYmxlZC9oaWRkZW4gLCB3ZSBzaG91bGQgbm90IHB1dCB0aGUgc2FtZSBhY3Rpb25cclxuICAgICAgLy8gaW4gcXVldWUgYWdhaW4gd2hlbiBzYW1lIGN0cmwgaXMgZGlzYWJsZWQvaGlkZGVuIG11bHRpcGxlIHRpbWVzLlxyXG4gICAgICBpZiAodGhpcy5fdmFsICE9PSBudWxsICYmIHRoaXMuX3ZhbCA9PT0gXCIwXCIgJiYgdmFsQ2hhbmdlZCAmJiBjdXJyZW50RWRpdGluZ0NvbnRyb2wgIT09IG51bGwgJiZcclxuICAgICAgICAoY3RybCA9PT0gY3VycmVudEVkaXRpbmdDb250cm9sIHx8IGN1cnJlbnRFZGl0aW5nQ29udHJvbC5pc0Rlc2NlbmRlbnRPZkNvbnRyb2woY3RybCkgfHwgY3RybCA9PT0gY3VycmVudEVkaXRpbmdDb250cm9sLmdldExpbmtlZFBhcmVudChmYWxzZSkpKSB7XHJcbiAgICAgICAgbGV0IHBhcmtlZENvbnRyb2w6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSBjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICBpZiAocGFya2VkQ29udHJvbCAhPT0gbnVsbCAmJiBwYXJrZWRDb250cm9sLkluQ29udHJvbCAmJiAoY3RybCA9PT0gcGFya2VkQ29udHJvbCB8fCBwYXJrZWRDb250cm9sLmlzRGVzY2VuZGVudE9mQ29udHJvbChjdHJsKSkpIHtcclxuICAgICAgICAgIEV2ZW50cy5Pbk5vblBhcmthYmxlTGFzdFBhcmtlZEN0cmwoY3RybCk7XHJcbiAgICAgICAgICBjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuQ3VycmVudEVkaXRpbmdDb250cm9sID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY3RybC5TZXRFbmFibGVkKHRoaXMuR2V0Q29tcHV0ZWRWYWx1ZUJvb2xlYW4oKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5Lm9uRW5hYmxlKClcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIG9uVmlzaWJsZSh2YWxDaGFuZ2VkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgbGV0IGN0cmw6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuICAgICAgbGV0IGN1cnJlbnRFZGl0aW5nQ29udHJvbDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5DdXJyZW50RWRpdGluZ0NvbnRyb2w7XHJcbiAgICAgIGlmICh0aGlzLl92YWwgIT09IG51bGwgJiYgdGhpcy5fdmFsID09PSBcIjBcIiAmJiB2YWxDaGFuZ2VkICYmIGN1cnJlbnRFZGl0aW5nQ29udHJvbCAhPT0gbnVsbCAmJlxyXG4gICAgICAgIChjdHJsID09PSBjdXJyZW50RWRpdGluZ0NvbnRyb2wgfHwgY3VycmVudEVkaXRpbmdDb250cm9sLmlzRGVzY2VuZGVudE9mQ29udHJvbChjdHJsKSB8fCBjdHJsID09PSBjdXJyZW50RWRpdGluZ0NvbnRyb2wuZ2V0TGlua2VkUGFyZW50KGZhbHNlKSkpIHtcclxuICAgICAgICBsZXQgcGFya2VkQ29udHJvbDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICAgIGlmIChwYXJrZWRDb250cm9sICE9PSBudWxsICYmIHBhcmtlZENvbnRyb2wuSW5Db250cm9sICYmIChjdHJsID09PSBwYXJrZWRDb250cm9sIHx8IHBhcmtlZENvbnRyb2wuaXNEZXNjZW5kZW50T2ZDb250cm9sKGN0cmwpKSkge1xyXG4gICAgICAgICAgRXZlbnRzLk9uTm9uUGFya2FibGVMYXN0UGFya2VkQ3RybChjdHJsKTtcclxuICAgICAgICAgIGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5DdXJyZW50RWRpdGluZ0NvbnRyb2wgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBhd2FpdCBjdHJsLnVwZGF0ZVByb3BlcnR5TG9naWNOZXN0aW5nKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUsIENvbW1hbmRUeXBlLlBST1BfU0VUX1ZJU0lCTEUsIHRoaXMuR2V0Q29tcHV0ZWRWYWx1ZUJvb2xlYW4oKSwgdHJ1ZSk7XHJcblxyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgT25Db250cm9sTmFtZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG5cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUHJvcGVydHkuT25Db250cm9sTmFtZSgpXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzZXQgaGludCBmb3IgZWRpdCBjb250cm9sIHByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG9uSGludCgpIHtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICBsZXQgY29udHJvbDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPnRoaXMuZ2V0T2JqZWN0QnlQYXJlbnRPYmooKTtcclxuICAgICAgbGV0IHRyYW5zbGF0ZWRTdHJpbmc6IHN0cmluZyA9IEV2ZW50cy5UcmFuc2xhdGUodGhpcy5HZXRDb21wdXRlZFZhbHVlKCkpO1xyXG5cclxuICAgICAgaWYgKCFjb250cm9sLklzRGF0ZVRpbWVQaWN0dXJlKCkgJiYgKCFjb250cm9sLklzVGFibGVDaGlsZCB8fCBjb250cm9sLklzVGFibGVIZWFkZXJDaGlsZCkpIHtcclxuICAgICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMuZ2V0T2JqZWN0QnlQYXJlbnRPYmooKSwgdGhpcy5nZXRMaW5lKCksIEh0bWxQcm9wZXJ0aWVzLlBsYWNlSG9sZGVyLCB0cmFuc2xhdGVkU3RyaW5nKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpblByb3BlcnR5Lm9uSGludCgpXCIpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25Gb3JtTmFtZSgpIHtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfRk9STSlcclxuICAgICAgdGhpcy5hZGRDb21tYW5kVHlwZVRleHQoMCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5Lm9uRm9ybU5hbWUoKVwiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYWRkQ29tbWFuZFR5cGVUZXh0KGxpbmU6IG51bWJlcikge1xyXG4gICAgbGV0IG1sc1RyYW5zVmFsdWU6IHN0cmluZyA9IEV2ZW50cy5UcmFuc2xhdGUodGhpcy5HZXRDb21wdXRlZFZhbHVlKCkpO1xyXG5cclxuICAgIC8vIEZpeGVkIGJ1ZyM6NzMzNDgwIFN5c3RlbUJveCA9IGZhbHNlIGFuZCB0aXRsZSBpcyBlbXB0eS0+IC5ORVQgaGlkZSB0aGUgdGl0bGUuXHJcbiAgICAvLyB3ZSB3aWxsIHNldCBpdCB0byAnICdcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfRk9STSB8fFxyXG4gICAgICAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wgJiYgKDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqKS5pc0NvbHVtbkNvbnRyb2woKSkpIHtcclxuICAgICAgLy8gIzczNzQ4ODogV2hlbiB2YXJpYWJsZSBhdHRhY2hlZCB0byBmb3JtJ3MgdGV4dCBwcm9wZXJ0eSwgc3BhY2VzIGFyZSBhcHBlbmRlZFxyXG4gICAgICAvLyBhZnRlciBhY3R1YWwgdmFsdWUsIGVxdWFsIHRvIHBpY3R1cmUgb2YgdmFyaWFibGUuIEJlZm9yZSBzZXR0aW5nIHRleHQgcmVtb3ZlIHRoZXNlIGV4dHJhXHJcbiAgICAgIC8vIHNwYWNlcyBhdCB0aGUgZW5kLlxyXG4gICAgICBtbHNUcmFuc1ZhbHVlID0gU3RyVXRpbC5ydHJpbShtbHNUcmFuc1ZhbHVlKTtcclxuICAgICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9GT1JNICYmIG1sc1RyYW5zVmFsdWUgPT09IE5TdHJpbmcuRW1wdHkpIHtcclxuICAgICAgICBtbHNUcmFuc1ZhbHVlID0gXCIgXCI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCAmJiAoKDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqKS5pc1RleHRDb250cm9sKClcclxuICAgICAgICB8fCAoKDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqKS5pc0J1dHRvbigpKSkpIC8vIG5lZWQgdG8gY2hlY2sgZm9yIGh5cGVydGV4dCBvciBvdGhlciB0eXBlcyBvZiBidXR0b25cclxuICAgICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVkFMVUUsIHRoaXMuX3BhcmVudE9iaiwgbGluZSwgbWxzVHJhbnNWYWx1ZSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcy5fcGFyZW50T2JqLCBsaW5lLCBIdG1sUHJvcGVydGllcy5UZXh0LCBtbHNUcmFuc1ZhbHVlKTtcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvblRleHQobGluZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmFkZENvbW1hbmRUeXBlVGV4dChsaW5lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgb25Nb2RpZmlhYmxlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgIGxldCBjdHJsOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcblxyXG4gICAgICBpZiAoY3RybC5pc1RleHRDb250cm9sKCkpIHtcclxuICAgICAgICBsZXQgdGFzazogR3VpVGFza0Jhc2UgPSB0aGlzLkdldFRhc2tCeVBhcmVudE9iamVjdCgpO1xyXG5cclxuICAgICAgICBsZXQgcmVhZE9ubHlWYWx1ZTogYm9vbGVhbiA9ICF0aGlzLkdldENvbXB1dGVkVmFsdWVCb29sZWFuKCk7XHJcblxyXG4gICAgICAgIGlmICgocmVhZE9ubHlWYWx1ZSB8fCB0YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSkgJiYgY3RybC5HZXRDdXJyUmVhZE9ubHkoKSAhPT0gcmVhZE9ubHlWYWx1ZSkge1xyXG4gICAgICAgICAgY3RybC5TZXRDdXJyUmVhZE9ubHkocmVhZE9ubHlWYWx1ZSk7XHJcblxyXG4gICAgICAgICAgLy8gSlBOOiBJTUUgc3VwcG9ydCAoZW5hYmxlIElNRSBpbiBxdWVyeSBtb2RlKVxyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkpIHtcclxuICAgICAgICAgICAgaWYgKGF3YWl0IGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTE9DQVRFX0lOX1FVRVJZLCBmYWxzZSkpIHtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMuZ2V0T2JqZWN0QnlQYXJlbnRPYmooKSwgdGhpcy5nZXRMaW5lKCksIEh0bWxQcm9wZXJ0aWVzLlJlYWRPbmx5LCByZWFkT25seVZhbHVlKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5Lm9uTW9kaWZpYWJsZSgpXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvblRvb2x0aXAoKTogdm9pZCB7XHJcbiAgICBsZXQgdG9vbFRpcDogc3RyaW5nO1xyXG5cclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICBsZXQgY3RybDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqO1xyXG5cclxuICAgICAgLy8gVG9vbHRpcCBleHByZXNzaW9uIHJldHVybnMgc3RyaW5nXHJcbiAgICAgIGlmICh0aGlzLl9leHBJZCA9PT0gMClcclxuICAgICAgICB0b29sVGlwID0gKDxUb29sVGlwSGVscD5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0SGVscEl0ZW0oTk51bWJlci5QYXJzZSh0aGlzLl92YWwpKSkudG9vbHRpcEhlbHBUZXh0O1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdG9vbFRpcCA9IHRoaXMuX3ZhbDtcclxuXHJcbiAgICAgIC8vICM5Mjk4ODk6IFJlbW92ZSBleHRyYSB3aGl0ZSBzcGFjZXMgYXQgdGhlIGVuZCBvZiB0b29sdGlwIHRleHQuXHJcbiAgICAgIHRvb2xUaXAgPSBTdHJVdGlsLnJ0cmltKHRvb2xUaXApO1xyXG4gICAgICBpZihjdHJsLmlzQnV0dG9uKCkgJiYgIGN0cmwuQ29ubmVjdGVkQ29udHJvbClcclxuICAgICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIGN0cmwuQ29ubmVjdGVkQ29udHJvbCwgdGhpcy5nZXRMaW5lKCksIEh0bWxQcm9wZXJ0aWVzLlpvb21CdXR0b25Ub29sdGlwLCB0b29sVGlwKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgY3RybCwgdGhpcy5nZXRMaW5lKCksIEh0bWxQcm9wZXJ0aWVzLlRvb2x0aXAsIHRvb2xUaXApO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBQcm9wZXJ0eS5vblRvb2x0aXAoKVwiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgb25EaXNwbGF5TGlzdChjdXJyTGluZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgbGV0IGN0cmw6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuXHJcbiAgICAgIGlmIChjdHJsLmlzU2VsZWN0aW9uQ3RybCgpIHx8IGN0cmwuaXNUYWJDb250cm9sKCkgfHwgY3RybC5pc1JhZGlvKCkgfHwgKDxNZ0NvbnRyb2xCYXNlPmN0cmwpLkhhc0F1dG9jb21wbGV0ZSgpKSB7XHJcbiAgICAgICAgbGV0IGxpbmU6IG51bWJlciA9IChjdXJyTGluZSA9PT0gSW50MzIuTWluVmFsdWUpID8gY3RybC5nZXREaXNwbGF5TGluZShmYWxzZSkgOiBjdXJyTGluZTtcclxuICAgICAgICBhd2FpdCBjdHJsLnJlZnJlc2hBbmRTZXRJdGVtc0xpc3QobGluZSwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUHJvcGVydHkub25EaXNwbGF5TGlzdCgpXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdXJyTGluZVwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBvblZpc2libGVMYXllckxpc3QoY3VyckxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgIGxldCBjdHJsOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcbiAgICAgIGxldCBsaW5lOiBudW1iZXIgPSAwO1xyXG5cclxuICAgICAgaWYgKGN1cnJMaW5lID09PSBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgICBsaW5lID0gY3RybC5nZXREaXNwbGF5TGluZShmYWxzZSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBsaW5lID0gY3VyckxpbmU7XHJcblxyXG4gICAgICAvLyBBbHdheXMgbGF5ZXJpbmcgc2hvdWxkIGJlIHBlcmZvcm1lZCBvbiBEaXNwbGF5bGlzdC4gQnV0LFxyXG4gICAgICAvLyBEaXNwbGF5TGlzdCBhbmQgaXRlbUxpc3Qgc2hvdWxkIG5vdCBiZSByZWZyZXNoZWQuXHJcbiAgICAgIGF3YWl0IGN0cmwucmVmcmVzaFRhYkZvckxheWVyTGlzdChsaW5lKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUHJvcGVydHkub25WaXNpYmxlTGF5ZXJMaXN0KClcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG9uRm9ybWF0KCkge1xyXG4gICAgbGV0IGN0cmw6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSBudWxsO1xyXG4gICAgbGV0IGN0cmxQaWM6IFBJQztcclxuXHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgY3RybCA9IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqO1xyXG4gICAgICBjdHJsUGljID0gY3RybC5nZXRQSUMoKTtcclxuICAgICAgY3RybC5yZXNldFByZXZWYWwoKTtcclxuXHJcbiAgICAgIHN3aXRjaCAoY3RybC5UeXBlKSB7XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT046XHJcbiAgICAgICAgICAvLyBpZiB0aGUgYnV0dG9uIGRvZXNuJ3QgaGF2ZSBmaWVsZCB3ZSBuZWVkIHRvIHNldCB0aGUgZm9ybWF0IGFzIHRoZSB0ZXh0IG9mIHRoZSBjb250cm9sLFxyXG4gICAgICAgICAgLy8gb3RoZXJ3aXNlLCB0aGUgZmllbGQgdmFsdWUgd2lsbCBzZXQgdGhlIHRleHQgb24gdGhlIGNvbnRyb2xcclxuICAgICAgICAgIC8vIGluIGFkZGl0aW9uIHdlIG5lZWQgdG8gc2V0IHRoZSB0ZXh0IGZvciBpbWFnZSBidXR0b25cclxuICAgICAgICAgIC8vIEFsc28sIGRvIG5vdCBvdmVycmlkZSB0aGUgdGV4dCB3aXRoIHRoZSBmb3JtYXQgaWYgdGhlIGNvbnRyb2wgaGFzIGFuIGV4cHJlc3Npb24uXHJcbiAgICAgICAgICAvLyBRQ1IjIDkzODkzMy4gV2hlbiB0aGUgY29udHJvbCBpcyByZWZyZXNoZWQgZm9yIHRoZSBmaXJzdCB0aW1lLCB3ZSBzaG91bGQgc2hvdyB0aGUgdGV4dCBhcyBpdFxyXG4gICAgICAgICAgLy8gaXMgaW4gdGhlIEZvcm1hdCBwcm9wZXJ0eSAtIGlycmVzcGVjdGl2ZSBvZiB3aGV0aGVyIGZpZWxkIG9yIGV4cHJlc3Npb24gaXMgYXR0YWNoZWQgdG8gaXQgb3Igbm90LlxyXG4gICAgICAgICAgLy8gVGhlIGZpeCBpcyBjb25maW5lZCB0byBDb250cm9sVHlwZXMuQ1RSTF9UWVBFX0JVVFRPTiBiZWNhdXNlIG9ubHkgaW4gY2FzZSBvZiBCdXR0b24gd2UgZGlzcGxheSB0aGUgdmFsdWUgb2YgdGhlIEZvcm1hdCBwcm9wZXJ0eS5cclxuICAgICAgICAgIGlmIChjdHJsLmdldEZpZWxkKCkgPT0gbnVsbCAmJiAhY3RybC5leHByZXNzaW9uU2V0QXNEYXRhKCkgfHwgY3RybC5Jc0ltYWdlQnV0dG9uKCkgfHwgKHRoaXMuX3BhcmVudE9iai5Jc0ZpcnN0UmVmcmVzaE9mUHJvcHMoKSAmJiAhR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0U3BlY2lhbElnbm9yZUJ1dHRvbkZvcm1hdCgpKSlcclxuICAgICAgICAgICAgdGhpcy5hZGRDb21tYW5kVHlwZVRleHQodGhpcy5nZXRMaW5lKCkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RFWFQ6XHJcblxyXG4gICAgICAgICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEVYVCkge1xyXG4gICAgICAgICAgICBpZiAoY3RybFBpYy5nZXRBdHRyKCkgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQykge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBQcm9wZXJ0eS5vbkZvcm1hdCgpXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBvbkxhYmVsKGN1cnJMaW5lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICAvLyBTRUxFQ1QgY29udHJvbC4gTm90ZSB3ZSBkbyBub3Qgc3VwcG9ydCBkeW5hbWljIGNoYW5nZSBvZiByYWRpbyBidXR0b25zIHJhbmdlIVxyXG4gICAgICAvLyBkYXRhIGNvbnRyb2wgcmFuZ2VzIGFyZSB1cGRhdGVkIHdoZW4gd2Ugc2V0IHZhbHVlcyB0byB0aGVtIGluIENvbnRyb2wucmVmcmVzaERpc3BWYWwoKVxyXG4gICAgICBsZXQgY3RybDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqO1xyXG4gICAgICBsZXQgbGluZTogbnVtYmVyO1xyXG5cclxuICAgICAgaWYgKGN1cnJMaW5lID09PSBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgICBsaW5lID0gY3RybC5nZXREaXNwbGF5TGluZShmYWxzZSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBsaW5lID0gY3VyckxpbmU7XHJcblxyXG4gICAgICAvLyBvbiBjb21ibyBib3ggY29tcGZvciBjaGVjayBib3ggdGhlIGxhYmVsIGlzIHRoZSBpdGVtIGxpc3QgcHJvcGVydHlcclxuICAgICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1gpXHJcbiAgICAgICAgdGhpcy5hZGRDb21tYW5kVHlwZVRleHQobGluZSk7XHJcbiAgICAgIGVsc2UgaWYgKGN0cmwuaXNTZWxlY3Rpb25DdHJsKCkgfHwgY3RybC5pc1RhYkNvbnRyb2woKSB8fCBjdHJsLmlzUmFkaW8oKSkge1xyXG4gICAgICAgIGN0cmwuc2V0UmFuZ2UoYXdhaXQgdGhpcy5nZXRWYWx1ZSgpKTtcclxuICAgICAgICBjdHJsLmNsZWFyUmFuZ2UobGluZSk7XHJcbiAgICAgICAgYXdhaXQgY3RybC5yZWZyZXNoQW5kU2V0SXRlbXNMaXN0KGxpbmUsIHRydWUpO1xyXG5cclxuICAgICAgICAvLyBJZiBJdGVtTGlzdCBoYXMgYW4gZXhwcmVzc2lvbiBBbmQgaXQgbWF5IGJlIG1vZGlmaWVkIGFnYWluLCByZWZyZXNoIHRoZSBkaXNwbGF5IHZhbHVlIG9mIGNvbnRyb2wuXHJcbiAgICAgICAgLy8gQmVjYXVzZSBpdCBtYXkgYmUgcG9zc2libGUgdGhhdCBkaXNwbGF5IHZhbHVlIHdpbGwgY2hhbmdlLlxyXG4gICAgICAgIGlmICh0aGlzLl9leHBJZCA+IDApXHJcbiAgICAgICAgICBhd2FpdCBjdHJsLkNvbXB1dGVBbmRSZWZyZXNoRGlzcGxheVZhbHVlKGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICgoPE1nQ29udHJvbEJhc2U+Y3RybCkuSGFzQXV0b2NvbXBsZXRlKCkpXHJcbiAgICAgICAgYXdhaXQgY3RybC5yZWZyZXNoQW5kU2V0SXRlbXNMaXN0KGxpbmUsIHRydWUpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiUHJvcGVydHkub25MYWJlbCgpLCBub3Qgc3VwcG9ydCBjb250cm9sXCIpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBQcm9wZXJ0eS5vbkxhYmVsKClcIik7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhbGwgdGhlIHByb3BlcnRpZXMgdGhhdCBzdXBwb3J0IGluIHN1YmZvcm0sIG11c3QgY2FsbCB0aGlzIG1ldGhvZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldE9iamVjdEJ5UGFyZW50T2JqKCk6IGFueSB7XHJcbiAgICBsZXQgcmVzdWx0OiBhbnkgPSB0aGlzLl9wYXJlbnRPYmo7XHJcblxyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9GT1JNKSB7XHJcbiAgICAgIGxldCBmb3JtOiBHdWlGb3JtUHJvcGVydHlBZGFwdGVyID0gPEd1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcbiAgICAgIGlmIChmb3JtLmlzU3ViRm9ybSgpKVxyXG4gICAgICAgIHJlc3VsdCA9IGZvcm0uZ2V0U3ViRm9ybUN0cmwoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicHJvcElkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBpc1JlcGVhdGFibGVJblRhYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBjdXJyZW50IGxpbmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRMaW5lKCk6IG51bWJlciB7XHJcbiAgICBsZXQgbGluZTogbnVtYmVyID0gMDtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICBsZXQgY3RybDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqO1xyXG4gICAgICBsZXQgZGlzcGxheUxpbmVGb3JUcmVlT3JUYWJsZTogYm9vbGVhbiA9IGN0cmwuaXNQcm9wZXJ0eVJlcGVhdGFibGUodGhpcy5faWQpO1xyXG5cclxuICAgICAgbGluZSA9IGN0cmwuZ2V0RGlzcGxheUxpbmUoZGlzcGxheUxpbmVGb3JUcmVlT3JUYWJsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGxpbmU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIG9yaWdpbmFsIHZhbHVlIG9mIHByb3BlcnR5IHRoYXQgd2FzIGNvbXB1dGVkIGJlZm9yZSBleGVjdXRpb24gb2YgZXhwcmVzc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRPcmdWYWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX29yZ1ZhbHVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB1cGRhdGUgc2l6ZSBvZiBwcmV2dmFsdWVzIGFycmF5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1NpemVcIj48L3BhcmFtPlxyXG4gIHVwZGF0ZVByZXZWYWx1ZUFycmF5KG5ld1NpemU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLlNob3VsZFNraXBSZWZyZXNoKCkpXHJcbiAgICAgIHRoaXMuX3ByZXZWYWx1ZXMuU2V0U2l6ZShuZXdTaXplKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2xlYXIgX3ByZXZWYWx1ZXMgYXJyYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3U2l6ZVwiPjwvcGFyYW0+XHJcbiAgY2xlYXJQcmV2VmFsdWVBcnJheSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXZWYWx1ZXMuQ2xlYXIoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIFJlc2V0UHJldlZhbHVlQXJyYXkoKTogdm9pZCB7XHJcbiAgICBsZXQgY291bnQ6IG51bWJlciA9IHRoaXMuX3ByZXZWYWx1ZXMubGVuZ3RoO1xyXG4gICAgdGhpcy5fcHJldlZhbHVlcy5DbGVhcigpO1xyXG4gICAgdGhpcy5fcHJldlZhbHVlcy5TZXRTaXplKGNvdW50KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb21wdXRlIGFuZCBzZXQgYXJyYXlzIHNpemVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgc2V0UHJldkFycmF5U2l6ZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfRk9STSB8fCB0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICBsZXQgc2l6ZTogbnVtYmVyID0gMTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICAgIGxldCBtZ0NvbnRyb2xCYXNlOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcbiAgICAgICAgaWYgKG1nQ29udHJvbEJhc2UuSXNSZXBlYXRhYmxlKVxyXG4gICAgICAgICAgc2l6ZSA9IG1nQ29udHJvbEJhc2UuZ2V0Rm9ybSgpLmdldFRhYmxlSXRlbXNDb3VudCgpO1xyXG4gICAgICAgIGVsc2UgaWYgKG1nQ29udHJvbEJhc2UuaXNUYWJsZUNvbnRyb2woKSAmJiBQcm9wZXJ0eS5pc1JlcGVhdGFibGVJblRhYmxlKCkpXHJcbiAgICAgICAgICBzaXplID0gbWdDb250cm9sQmFzZS5nZXRGb3JtKCkuZ2V0VGFibGVJdGVtc0NvdW50KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX3ByZXZWYWx1ZXMuU2V0U2l6ZShzaXplKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBQYXNzd29yZCBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvblBhc3N3b3JkKCkge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKVxyXG4gICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMuZ2V0T2JqZWN0QnlQYXJlbnRPYmooKSwgdGhpcy5nZXRMaW5lKCksIEh0bWxQcm9wZXJ0aWVzLlBhc3N3b3JkLCB0aGlzLkdldENvbXB1dGVkVmFsdWVCb29sZWFuKCkpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBQcm9wZXJ0eS5vblBhc3N3b3JkKClcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNldCB1c2VyIHByb3BlcnR5IFRpdGxlUGFkZGluZyBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21wdXRlQ3VzdG9tUHJvcGVydGllc1ZhbHVlcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGZvciAobGV0IFtjdXN0b21Qcm9wZXJ0eUtleSwgY3VzdG9tUHJvcGVydHlWYWx1ZV0gb2YgdGhpcy5jdXN0b21Qcm9wZXJ0aWVzKSB7XHJcbiAgICAgIGxldCBsZW46IG51bWJlciA9IDI1NTtcclxuICAgICAgbGV0IHdhc0V2YWx1YXRlZDogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW0oZmFsc2UpO1xyXG4gICAgICBsZXQgZXhwcmVzc2lvbiA9IGN1c3RvbVByb3BlcnR5VmFsdWU7XHJcbiAgICAgIC8vIGluaXQgdGhlIHZhbHVlXHJcbiAgICAgIGxldCByZXRFeHByZXNzaW9uVmFsdWUgPSBhd2FpdCB0aGlzLkdldFJldHJ1blZhbHVlRm9yQ3VzdG9tUHJvcGVydHlFeHByZXNzaW9uKGV4cHJlc3Npb24pO1xyXG4gICAgICB0aGlzLmN1c3RvbVByb3BlcnRpZXNWYWx1ZXMuc2V0KGN1c3RvbVByb3BlcnR5S2V5LCByZXRFeHByZXNzaW9uVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjb21wdXRlIGN1c3RvbSB2YWxpZGF0b3JzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIGNvbXB1dGVDdXN0b21WYWxpZGF0b3JzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG1nQ29udHJvbCA9IDxNZ0NvbnRyb2xCYXNlPnRoaXMuX3BhcmVudE9iajtcclxuICAgIGlmIChtZ0NvbnRyb2wuTW9kaWZpZWRCeVVzZXIgfHwgbWdDb250cm9sLlZhbGlkYXRlQ29udHJvbCB8fCB0aGlzLkdldFRhc2tCeVBhcmVudE9iamVjdCgpLklzSW5SZWNvbXB1dGUoKSl7XHJcbiAgICAgIGZvciAobGV0IFtjdXN0b21Qcm9wZXJ0eUtleSwgY3VzdG9tVmFsaWRhdG9yUHJvcGVydHldIG9mIHRoaXMuY3VzdG9tVmFsaWRhdG9yUHJvcGVydGllcykge1xyXG4gICAgICAgIGxldCBsZW46IG51bWJlciA9IDI1NTtcclxuICAgICAgICBsZXQgd2FzRXZhbHVhdGVkOiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbShmYWxzZSk7XHJcbiAgICAgICAgbGV0IGV4cHJlc3Npb24gPSAoPEN1c3RvbVZhbGlkYXRvclByb3A+Y3VzdG9tVmFsaWRhdG9yUHJvcGVydHkpLl9leHA7XHJcbiAgICAgICAgLy8gaW5pdCB0aGUgdmFsdWVcclxuICAgICAgICBsZXQgaXNJblZhbGlkID0gYXdhaXQgdGhpcy5HZXRSZXRydW5WYWx1ZUZvckN1c3RvbVByb3BlcnR5RXhwcmVzc2lvbihleHByZXNzaW9uKTtcclxuICAgICAgICBsZXQgZXJyU3RyaW5nID0gXCJcIjtcclxuICAgICAgICBsZXQgSW5WYWxpZCA9IChpc0luVmFsaWQgPT09IFwiMVwiKSA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgICBpZiAoSW5WYWxpZCkge1xyXG4gICAgICAgICAgZXhwcmVzc2lvbiA9ICg8Q3VzdG9tVmFsaWRhdG9yUHJvcD5jdXN0b21WYWxpZGF0b3JQcm9wZXJ0eSkuX2Vycm9yTWVzc2FnZUV4cDtcclxuICAgICAgICAgIGlmIChleHByZXNzaW9uID4gMClcclxuICAgICAgICAgICAgZXJyU3RyaW5nID0gYXdhaXQgdGhpcy5HZXRSZXRydW5WYWx1ZUZvckN1c3RvbVByb3BlcnR5RXhwcmVzc2lvbihleHByZXNzaW9uKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgZXJyU3RyaW5nID0gKDxDdXN0b21WYWxpZGF0b3JQcm9wPmN1c3RvbVZhbGlkYXRvclByb3BlcnR5KS5fZXJyb3JNZXNzYWdlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jdXN0b21WYWxpZGF0b3JWYWx1ZXMuc2V0KGN1c3RvbVByb3BlcnR5S2V5LCBuZXcgQ3VzdG9tVmFsaWRhdG9yKCFJblZhbGlkLCBlcnJTdHJpbmcpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTZXQgdXNlciBwcm9wZXJ0eSBUaXRsZVBhZGRpbmcgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25DdXN0b21Qcm9wZXJ0aWVzKCk6IHZvaWQge1xyXG5cclxuICAgIGZvciAobGV0IFtjdXN0b21Qcm9wZXJ0eUtleSwgY3VzdG9tUHJvcGVydHlWYWx1ZV0gb2YgdGhpcy5jdXN0b21Qcm9wZXJ0aWVzVmFsdWVzKSB7XHJcbiAgICAgIC8vIHVzZSB0aGlzLl9wYXJlbnRPYmogYW5kIG5vdCB0aGlzLmdldE9iamVjdEJ5UGFyZW50T2JqKClcclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuUFJPUF9TRVRfVVNFUl9QUk9QRVJUWSwgdGhpcy5fcGFyZW50T2JqLCB0aGlzLmdldExpbmUoKSwgY3VzdG9tUHJvcGVydHlLZXksIGN1c3RvbVByb3BlcnR5VmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2V0IGN1c3RvbSB2YWxpZGF0b3JzIHByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG9uQ3VzdG9tVmFsaWRhdG9ycygpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IFtjdXN0b21Qcm9wZXJ0eUtleSwgY3VzdG9tUHJvcGVydHlWYWx1ZV0gb2YgdGhpcy5jdXN0b21WYWxpZGF0b3JWYWx1ZXMpIHtcclxuXHJcbiAgICAgIC8vIHVzZSB0aGlzLl9wYXJlbnRPYmogYW5kIG5vdCB0aGlzLmdldE9iamVjdEJ5UGFyZW50T2JqKClcclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuUFJPUF9TRVRfQ1VTVE9NX1ZBTElEQVRPUiwgdGhpcy5fcGFyZW50T2JqLCB0aGlzLmdldExpbmUoKSxcclxuICAgICAgICBjdXN0b21Qcm9wZXJ0eUtleSwgY3VzdG9tUHJvcGVydHlWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNldCBCaW5kaW5nIExldmVsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG9uQmluZGluZ0xldmVsKClcclxuICB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpXHJcbiAgICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMuZ2V0T2JqZWN0QnlQYXJlbnRPYmooKSwgdGhpcy5nZXRMaW5lKCksIEh0bWxQcm9wZXJ0aWVzLkJpbmRpbmdMZXZlbCwgdGhpcy5HZXRDb21wdXRlZFZhbHVlSW50ZWdlcigpKTtcclxuICAgIGVsc2VcclxuICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5LkJpbmRpbmdMZXZlbCgpXCIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkF1dG9Db21wbGV0ZU1vZGUoKVxyXG4gIHtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBHZXRSZXRydW5WYWx1ZUZvckN1c3RvbVByb3BlcnR5RXhwcmVzc2lvbihleHByZXNzaW9uOiBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgbGV0IGxlbjogbnVtYmVyID0gMjU1O1xyXG4gICAgbGV0IGV4cFN0b3JhZ2VBdHRyaWJ1dGUgPSB0aGlzLl9wYXJlbnRPYmouR2V0RXhwcmVzc2lvblN0b3JhZ2UoZXhwcmVzc2lvbik7XHJcbiAgICBsZXQgd2FzRXZhbHVhdGVkOiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbShmYWxzZSk7XHJcbiAgICBsZXQgcmV0dXJuVmFsdWUgPSBhd2FpdCB0aGlzLl9wYXJlbnRPYmouRXZhbHVhdGVFeHByZXNzaW9uKGV4cHJlc3Npb24sIGV4cFN0b3JhZ2VBdHRyaWJ1dGUsIGxlbiwgdHJ1ZSwgU3RvcmFnZUF0dHJpYnV0ZS5TS0lQLCBmYWxzZSwgd2FzRXZhbHVhdGVkKTtcclxuXHJcbiAgICBleHBTdG9yYWdlQXR0cmlidXRlID0gdGhpcy5fcGFyZW50T2JqLkdldEV4cHJlc3Npb25TdG9yYWdlKGV4cHJlc3Npb24pO1xyXG4gICAgbGV0IGNvbXBJZHg6IG51bWJlciA9IHRoaXMuX3BhcmVudE9iai5nZXRDb21wSWR4KCk7XHJcblxyXG4gICAgc3dpdGNoIChleHBTdG9yYWdlQXR0cmlidXRlKSB7XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICAgIGxldCB0ZW1wUGljID0gbmV3IFBJQyhcIk42LjJcIiwgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDLCB0aGlzLl9wYXJlbnRPYmouZ2V0Q29tcElkeCgpKTtcclxuICAgICAgICBpZiAocmV0dXJuVmFsdWUgPT0gbnVsbClcclxuICAgICAgICAgIHJldHVyblZhbHVlID0gXCJGRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwXCI7XHJcbiAgICAgICAgcmV0dXJuVmFsdWUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AocmV0dXJuVmFsdWUsIFwiXCIsIHRlbXBQaWMsIGZhbHNlLCBjb21wSWR4LCBmYWxzZSkudHJpbSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkRBVEU6XHJcbiAgICAgICAgdGVtcFBpYyA9IG5ldyBQSUMoXCIjIy8jIy8jIyMjXCIsIGV4cFN0b3JhZ2VBdHRyaWJ1dGUsIGNvbXBJZHgpO1xyXG4gICAgICAgIHJldHVyblZhbHVlID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKHJldHVyblZhbHVlLCBcIlwiLCB0ZW1wUGljLCB0cnVlLCBmYWxzZSwgY29tcElkeCwgdHJ1ZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRTpcclxuICAgICAgICB0ZW1wUGljID0gbmV3IFBJQyhcIiMjOiMjLyMjIyNcIiwgZXhwU3RvcmFnZUF0dHJpYnV0ZSwgY29tcElkeCk7XHJcbiAgICAgICAgcmV0dXJuVmFsdWUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AocmV0dXJuVmFsdWUsIFwiXCIsIHRlbXBQaWMsIHRydWUsIGZhbHNlLCBjb21wSWR4LCB0cnVlKTtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQjpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5PTkU6XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5LkdldFJldHJ1blZhbHVlRm9yQ3VzdG9tUHJvcGVydHlFeHByZXNzaW9uKCkgaWxsZWdhbCBkYXRhIHR5cGU6IFwiICsgZXhwU3RvcmFnZUF0dHJpYnV0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlkeFwiPjwvcGFyYW0+XHJcbiAgUmVtb3ZlUHJldlZhbEluZGV4QXQoaWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9wcmV2VmFsdWVzLmxlbmd0aCA+IGlkeCkge1xyXG4gICAgICB0aGlzLl9wcmV2VmFsdWVzLlJlbW92ZUF0KGlkeCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpZHhcIj48L3BhcmFtPlxyXG4gIEluc2VydFByZXZWYWxBdChpZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJldlZhbHVlcy5JbnNlcnQoaWR4LCBudWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlkeFwiPjwvcGFyYW0+XHJcbiAgcmVzZXRQcmV2VmFsQXQoaWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChpZHggPj0gMCAmJiBpZHggPCB0aGlzLl9wcmV2VmFsdWVzLmxlbmd0aClcclxuICAgICAgdGhpcy5fcHJldlZhbHVlcy5zZXRfSXRlbShpZHgsIG51bGwpO1xyXG4gIH1cclxuXHJcblxyXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gTlN0cmluZy5Gb3JtYXQoXCJ7MH0gPSB7MX0gKGV4cD17Mn0sIHN0dWRpbyB2YWx1ZT17M30pXCIsIFtcclxuICAgICAgUHJvcERlZmF1bHRzLkdldFByb3BlcnR5TmFtZSh0aGlzLl9pZCksICh0aGlzLl92YWwgPT09IG51bGwpID8gXCJpcyBudWxsXCIgOiB0aGlzLl92YWwsIHRoaXMuX2V4cElkLCB0aGlzLlN0dWRpb1ZhbHVlXHJcbiAgICBdKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0RGVmYXVsdFByb3AoKSByZXR1cm5zIGEgcHJvcGVydHkgdGhhdCBoYXMgYSBzeXN0ZW0gZGVmYXVsdCB2YWx1ZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+VGhlIHByb3BlcnR5IGlkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBhcmVudFR5cGVcIj5QQVJFTlRfVFlQRV9DT05UUk9MLCBQQVJFTlRfVFlQRV9GT1JNLCBQQVJFTlRfVFlQRV9UQVNLPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BQYXJlbnRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gUHJvcGVydHkgdGhhdCBoYXMgYSBzeXN0ZW0gZGVmYXVsdCB2YWx1ZTwvcmV0dXJucz5cclxuICBzdGF0aWMgZ2V0RGVmYXVsdFByb3AocHJvcElkOiBudW1iZXIsIHBhcmVudFR5cGU6IHN0cmluZywgcHJvcFBhcmVudDogUHJvcFBhcmVudEludGVyZmFjZSk6IFByb3BlcnR5IHtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IG51bGw7XHJcbiAgICBsZXQgbWdWYWw6IHN0cmluZyA9IFByb3BEZWZhdWx0cy5nZXREZWZhdWx0VmFsdWUocHJvcElkLCBwYXJlbnRUeXBlLCBwcm9wUGFyZW50KTtcclxuXHJcbiAgICBpZiAobWdWYWwgIT09IG51bGwpXHJcbiAgICAgIHByb3AgPSBuZXcgUHJvcGVydHkocHJvcElkLCBwcm9wUGFyZW50LCBwYXJlbnRUeXBlLCBtZ1ZhbCk7XHJcblxyXG4gICAgcmV0dXJuIHByb3A7XHJcbiAgfVxyXG5cclxuICBJbnNlcnRQcmV2VmFsdWVBcnJheShjb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuU2hvdWxkU2tpcFJlZnJlc2goKSlcclxuICAgICAgdGhpcy5fcHJldlZhbHVlcy5JbnNlcnRSYW5nZShuZXcgQXJyYXkoY291bnQpKTtcclxuICB9XHJcbn1cclxuIl19
|