@magic-xpa/gui 4.800.0 → 4.801.0-dev000.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/esm2020/src/Events.mjs +420 -0
- package/esm2020/src/EventsProcessor.mjs +67 -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} +2 -1
- 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/esm2020/src/gui/low/GuiInteractive.mjs +545 -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/esm2020/src/management/data/DcValues.mjs +214 -0
- package/esm2020/src/management/data/DcValuesBuilderBase.mjs +97 -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/esm2020/src/management/data/GuiDataViewBase.mjs +90 -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/esm2020/src/management/data/ObjectReferenceBase.mjs +48 -0
- package/{esm2015/src/management/data/ObjectReferencesCollection.js → esm2020/src/management/data/ObjectReferencesCollection.mjs} +0 -0
- package/esm2020/src/management/data/RecordUtils.mjs +361 -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/esm2020/src/management/events/IGuiEventsManager.mjs +2 -0
- package/{esm2015/src/management/exp/ExpressionInterface.js → esm2020/src/management/exp/ExpressionInterface.mjs} +0 -0
- package/esm2020/src/management/exp/GuiExpressionEvaluator.mjs +333 -0
- package/{esm2015/src/management/gui/ControlTable.js → esm2020/src/management/gui/ControlTable.mjs} +0 -0
- package/esm2020/src/management/gui/DisplayConvertor.mjs +1706 -0
- package/esm2020/src/management/gui/FieldValidator.mjs +1507 -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/esm2020/src/management/gui/PropDefaults.mjs +230 -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/esm2020/src/management/tasks/MgTimer.mjs +21 -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/esm2020/src/util/ProcessLauncher.mjs +32 -0
- package/esm2020/src/util/UsernamePasswordCredentials.mjs +52 -0
- package/fesm2015/{magic-xpa-gui.js → magic-xpa-gui.mjs} +133 -175
- 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/Events.d.ts +2 -2
- package/src/EventsProcessor.d.ts +1 -1
- package/src/IFlowMonitorQueue.d.ts +1 -1
- package/src/Manager.d.ts +2 -3
- package/src/management/data/DcValues.d.ts +1 -1
- package/src/management/data/DcValuesBuilderBase.d.ts +1 -1
- package/src/management/data/RecordUtils.d.ts +0 -3
- package/src/management/events/IGuiEventsManager.d.ts +5 -5
- package/src/management/exp/GuiExpressionEvaluator.d.ts +2 -2
- package/src/management/gui/DisplayConvertor.d.ts +6 -6
- package/src/management/gui/GuiControlPropertyAdapter.d.ts +6 -6
- package/src/management/gui/MgControlBase.d.ts +2 -4
- package/src/management/gui/MgFormBase.d.ts +1 -1
- package/src/management/gui/PropTable.d.ts +1 -1
- package/src/management/gui/Property.d.ts +2 -2
- package/src/management/tasks/GuiTaskBase.d.ts +3 -3
- package/src/util/ProcessLauncher.d.ts +1 -3
- package/bundles/magic-xpa-gui.umd.js +0 -19431
- 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/Events.js +0 -420
- package/esm2015/src/EventsProcessor.js +0 -68
- package/esm2015/src/FocusManager.js +0 -41
- package/esm2015/src/Manager.js +0 -197
- package/esm2015/src/gui/low/GuiInteractive.js +0 -545
- package/esm2015/src/management/data/DcValues.js +0 -214
- package/esm2015/src/management/data/DcValuesBuilderBase.js +0 -97
- package/esm2015/src/management/data/GuiDataViewBase.js +0 -90
- package/esm2015/src/management/data/GuiFieldBase.js +0 -85
- package/esm2015/src/management/data/ObjectReferenceBase.js +0 -48
- package/esm2015/src/management/data/RecordUtils.js +0 -447
- package/esm2015/src/management/events/IGuiEventsManager.js +0 -1
- package/esm2015/src/management/exp/GuiExpressionEvaluator.js +0 -333
- package/esm2015/src/management/gui/DisplayConvertor.js +0 -1706
- package/esm2015/src/management/gui/FieldValidator.js +0 -1507
- package/esm2015/src/management/gui/GuiControlPropertyAdapter.js +0 -4
- package/esm2015/src/management/gui/MgControlBase.js +0 -1981
- package/esm2015/src/management/gui/MgFormBase.js +0 -763
- package/esm2015/src/management/gui/PropDefaults.js +0 -230
- 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/MgTimer.js +0 -21
- package/esm2015/src/management/tasks/TaskDefinitionIdTableSaxHandler.js +0 -41
- package/esm2015/src/util/ProcessLauncher.js +0 -32
- package/esm2015/src/util/UsernamePasswordCredentials.js +0 -52
- package/fesm2015/magic-xpa-gui.js.map +0 -1
|
@@ -1,763 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Constants, Logger_LogLevels, MgControlType, StorageAttribute, StrUtil, TabbingOrderType, WindowType, XMLConstants, XmlParser } from '@magic-xpa/utils';
|
|
3
|
-
import { Debug, Int32, List, NString, Stack, StringBuilder } from '@magic-xpa/mscorelib';
|
|
4
|
-
import { MgControlBase } from './MgControlBase';
|
|
5
|
-
import { PropTable } from './PropTable';
|
|
6
|
-
import { ControlTable } from './ControlTable';
|
|
7
|
-
import { Manager } from '../../Manager';
|
|
8
|
-
import { Events } from '../../Events';
|
|
9
|
-
import { Property } from './Property';
|
|
10
|
-
import { CommandType, HtmlProperties } from '../../GuiEnums';
|
|
11
|
-
import { NUM_TYPE } from '../data/NUM_TYPE';
|
|
12
|
-
import { Commands } from '../../Commands';
|
|
13
|
-
import { PropInterface } from './PropInterface';
|
|
14
|
-
import { GuiConstants } from '../../GuiConstants';
|
|
15
|
-
import { GuiFormPropertyAdapter } from './GuiFormPropertyAdapter';
|
|
16
|
-
const delimiter = ', ';
|
|
17
|
-
export class MgFormBase extends GuiFormPropertyAdapter {
|
|
18
|
-
constructor() {
|
|
19
|
-
super();
|
|
20
|
-
this.InInitForm = false;
|
|
21
|
-
this.CtrlTab = null;
|
|
22
|
-
this.FormRefreshed = false;
|
|
23
|
-
this.RefreshRepeatableAllowed = false;
|
|
24
|
-
this.Rows = null;
|
|
25
|
-
this.ModalFormsCount = 0;
|
|
26
|
-
this.ErrorOccured = false;
|
|
27
|
-
this.FormIsn = 0;
|
|
28
|
-
this.Name = null;
|
|
29
|
-
this.Opened = false;
|
|
30
|
-
this.isLegalForm = false;
|
|
31
|
-
this.PBImagesNumber = 0;
|
|
32
|
-
this.ignoreFirstRefreshTable = false;
|
|
33
|
-
this.ParentForm = null;
|
|
34
|
-
this._destTblRow = Int32.MinValue;
|
|
35
|
-
this._firstTableTabOrder = 0;
|
|
36
|
-
this._inRefreshDisp = false;
|
|
37
|
-
this._inRestore = false;
|
|
38
|
-
this._lastRowSent = -1;
|
|
39
|
-
this._prevGuiTopIndex = -1;
|
|
40
|
-
this._propTab = null;
|
|
41
|
-
this._rowsInPage = 1;
|
|
42
|
-
this._maxRowsInPaginatedTable = 0;
|
|
43
|
-
this._subFormCtrl = null;
|
|
44
|
-
this._tableMgControl = null;
|
|
45
|
-
this._tableItemsCount = 0;
|
|
46
|
-
this._tableRefreshed = false;
|
|
47
|
-
this._task = null;
|
|
48
|
-
this._topIndexUpdated = false;
|
|
49
|
-
this._transferingData = false;
|
|
50
|
-
this._allowedSubformRecompute = true;
|
|
51
|
-
this._concreteWindowType = 0;
|
|
52
|
-
this._containerCtrl = null;
|
|
53
|
-
this._firstRefreshOfProps = true;
|
|
54
|
-
this._prevSelIndex = -1;
|
|
55
|
-
this._shouldCreateToolbar = false;
|
|
56
|
-
this._tableChildren = null;
|
|
57
|
-
this._tableColumns = null;
|
|
58
|
-
this._userStateId = '';
|
|
59
|
-
this.displayLine = 0;
|
|
60
|
-
this.defaultRouterOutlet = null;
|
|
61
|
-
this._propTab = new PropTable(this);
|
|
62
|
-
this.CtrlTab = new ControlTable();
|
|
63
|
-
this.Rows = new List();
|
|
64
|
-
this._concreteWindowType = 0;
|
|
65
|
-
this.ParentForm = null;
|
|
66
|
-
}
|
|
67
|
-
get DisplayLine() {
|
|
68
|
-
return this.displayLine;
|
|
69
|
-
}
|
|
70
|
-
set DisplayLine(value) {
|
|
71
|
-
this.displayLine = value;
|
|
72
|
-
}
|
|
73
|
-
get UniqueName() {
|
|
74
|
-
if (this.GetComputedProperty(PropInterface.PROP_TYPE_FORM_NAME) != null)
|
|
75
|
-
return this.GetComputedProperty(PropInterface.PROP_TYPE_FORM_NAME).GetComputedValue();
|
|
76
|
-
else
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
get TaskTag() {
|
|
80
|
-
return this.getTask().getTaskTag();
|
|
81
|
-
}
|
|
82
|
-
get TableChildren() {
|
|
83
|
-
if (this._tableChildren === null)
|
|
84
|
-
this.buildTableChildren();
|
|
85
|
-
return this._tableChildren;
|
|
86
|
-
}
|
|
87
|
-
set TableChildren(value) {
|
|
88
|
-
this._tableChildren = value;
|
|
89
|
-
}
|
|
90
|
-
get ShouldCreateToolbar() {
|
|
91
|
-
return this._shouldCreateToolbar;
|
|
92
|
-
}
|
|
93
|
-
get AllowedSubformRecompute() {
|
|
94
|
-
return this._allowedSubformRecompute;
|
|
95
|
-
}
|
|
96
|
-
set AllowedSubformRecompute(value) {
|
|
97
|
-
this._allowedSubformRecompute = value;
|
|
98
|
-
}
|
|
99
|
-
get ConcreteWindowType() {
|
|
100
|
-
if (this._concreteWindowType === 0) {
|
|
101
|
-
let windowType = this.GetComputedProperty(PropInterface.PROP_TYPE_WINDOW_TYPE).GetComputedValueInteger();
|
|
102
|
-
if (this.ParentForm === null || windowType !== WindowType.Overlay)
|
|
103
|
-
windowType = WindowType.Default;
|
|
104
|
-
this._concreteWindowType = windowType;
|
|
105
|
-
}
|
|
106
|
-
return this._concreteWindowType;
|
|
107
|
-
}
|
|
108
|
-
set ConcreteWindowType(value) {
|
|
109
|
-
this._concreteWindowType = value;
|
|
110
|
-
}
|
|
111
|
-
static ShouldPutActOnFormClose() {
|
|
112
|
-
return false;
|
|
113
|
-
}
|
|
114
|
-
static ShouldBehaveAsModal() {
|
|
115
|
-
return false;
|
|
116
|
-
}
|
|
117
|
-
static ConvertArrayListToString(items, isItemNumType) {
|
|
118
|
-
let from = ['\\', '-', ','];
|
|
119
|
-
let to = ['\\\\', '\\-', '\\,'];
|
|
120
|
-
let stringBuilder = new StringBuilder();
|
|
121
|
-
let nUM_TYPE;
|
|
122
|
-
for (let index = 0; index < items.length; index = index + 1) {
|
|
123
|
-
if (isItemNumType) {
|
|
124
|
-
nUM_TYPE = new NUM_TYPE(items.get_Item(index));
|
|
125
|
-
items.set_Item(index, nUM_TYPE.to_double().toString());
|
|
126
|
-
}
|
|
127
|
-
stringBuilder.Append(StrUtil.searchAndReplace(items.get_Item(index), from, to));
|
|
128
|
-
if (index < items.length - 1)
|
|
129
|
-
stringBuilder.Append(delimiter);
|
|
130
|
-
}
|
|
131
|
-
return stringBuilder.ToString();
|
|
132
|
-
}
|
|
133
|
-
UpdateModalFormsCount(mgFormBase, increase) {
|
|
134
|
-
if (increase)
|
|
135
|
-
this.ModalFormsCount += 1;
|
|
136
|
-
else
|
|
137
|
-
this.ModalFormsCount -= 1;
|
|
138
|
-
Events.SetModal(mgFormBase, increase);
|
|
139
|
-
}
|
|
140
|
-
EvaluateExpression(expId, resType, length, contentTypeUnicode, resCellType, alwaysEvaluate, wasEvaluated) {
|
|
141
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
142
|
-
return yield this._task.EvaluateExpression(expId, resType, length, contentTypeUnicode, resCellType, true, wasEvaluated);
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
GetExpressionStorage(expId) {
|
|
146
|
-
return this._task.GetExpressionStorage(expId);
|
|
147
|
-
}
|
|
148
|
-
checkIfExistProp(propId) {
|
|
149
|
-
let exist = false;
|
|
150
|
-
if (this._propTab !== null) {
|
|
151
|
-
let propById = this._propTab.getPropById(propId);
|
|
152
|
-
exist = (propById !== null);
|
|
153
|
-
}
|
|
154
|
-
return exist;
|
|
155
|
-
}
|
|
156
|
-
getProp(propId) {
|
|
157
|
-
let prop = null;
|
|
158
|
-
if (this._propTab !== null) {
|
|
159
|
-
prop = this._propTab.getPropById(propId);
|
|
160
|
-
if (prop === null) {
|
|
161
|
-
prop = Property.getDefaultProp(propId, GuiConstants.PARENT_TYPE_FORM, this);
|
|
162
|
-
if (prop !== null)
|
|
163
|
-
this._propTab.addProp(prop);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
return prop;
|
|
167
|
-
}
|
|
168
|
-
GetComputedProperty(propId) {
|
|
169
|
-
let prop = null;
|
|
170
|
-
if (this._propTab !== null)
|
|
171
|
-
prop = this._propTab.getPropById(propId);
|
|
172
|
-
return prop;
|
|
173
|
-
}
|
|
174
|
-
PropertyHasExpression(propId) {
|
|
175
|
-
let prop = this._propTab.getPropById(propId);
|
|
176
|
-
return prop !== null && prop.isExpression();
|
|
177
|
-
}
|
|
178
|
-
getCompIdx() {
|
|
179
|
-
return (this.getTask() === null) ? 0 : this.getTask().getCompIdx();
|
|
180
|
-
}
|
|
181
|
-
IsFirstRefreshOfProps() {
|
|
182
|
-
return this._firstRefreshOfProps;
|
|
183
|
-
}
|
|
184
|
-
getForm() {
|
|
185
|
-
return this;
|
|
186
|
-
}
|
|
187
|
-
fillData(taskRef) {
|
|
188
|
-
let parser = Manager.GetCurrentRuntimeContext().Parser;
|
|
189
|
-
if (this._task === null && taskRef !== null)
|
|
190
|
-
this._task = taskRef;
|
|
191
|
-
while (this.initInnerObjects(parser.getNextTag())) {
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
init() {
|
|
195
|
-
for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
|
|
196
|
-
let ctrl = this.CtrlTab.getCtrl(i);
|
|
197
|
-
ctrl.Init();
|
|
198
|
-
}
|
|
199
|
-
this.buildLinkedControlsLists();
|
|
200
|
-
this.buildTableColumnsList();
|
|
201
|
-
this.createForm();
|
|
202
|
-
this._task.setKeyboardMappingState(Constants.ACT_STT_TBL_SCREEN_MODE, this.isScreenMode());
|
|
203
|
-
this._task.setKeyboardMappingState(Constants.ACT_STT_TBL_LEFT_TO_RIGHT, !this.GetComputedProperty(PropInterface.PROP_TYPE_HEBREW).GetComputedValueBoolean());
|
|
204
|
-
}
|
|
205
|
-
fillName(formTag) {
|
|
206
|
-
let parser = Manager.GetCurrentRuntimeContext().Parser;
|
|
207
|
-
let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
|
|
208
|
-
if (endContext !== -1 && endContext < parser.getXMLdata().length) {
|
|
209
|
-
let tag = parser.getXMLsubstring(endContext);
|
|
210
|
-
parser.add2CurrIndex(tag.indexOf(formTag) + formTag.length);
|
|
211
|
-
let tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
|
|
212
|
-
let attribute;
|
|
213
|
-
let valueStr;
|
|
214
|
-
for (let i = 0; i < tokensVector.length; i = i + 2) {
|
|
215
|
-
attribute = tokensVector.get_Item(i);
|
|
216
|
-
valueStr = tokensVector.get_Item(i + 1);
|
|
217
|
-
switch (attribute) {
|
|
218
|
-
case XMLConstants.MG_ATTR_NAME:
|
|
219
|
-
this.Name = XmlParser.unescape(valueStr).toString();
|
|
220
|
-
if (Events.ShouldLog(Logger_LogLevels.Gui))
|
|
221
|
-
Events.WriteGuiToLog(NString.Format('Parsing form "{0}"', this.Name));
|
|
222
|
-
break;
|
|
223
|
-
case XMLConstants.MG_ATTR_IS_FRAMESET:
|
|
224
|
-
break;
|
|
225
|
-
case XMLConstants.MG_ATTR_IS_LIGAL_RC_FORM:
|
|
226
|
-
this.isLegalForm = XmlParser.getBoolean(valueStr);
|
|
227
|
-
break;
|
|
228
|
-
case XMLConstants.MG_ATTR_PB_IMAGES_NUMBER:
|
|
229
|
-
this.PBImagesNumber = XmlParser.getInt(valueStr);
|
|
230
|
-
break;
|
|
231
|
-
case XMLConstants.MG_ATTR_FORM_ISN:
|
|
232
|
-
this.FormIsn = XmlParser.getInt(valueStr);
|
|
233
|
-
break;
|
|
234
|
-
case XMLConstants.MG_ATTR_USERSTATE_ID:
|
|
235
|
-
this._userStateId = XmlParser.unescape(valueStr).toString();
|
|
236
|
-
break;
|
|
237
|
-
default:
|
|
238
|
-
Events.WriteExceptionToLog(NString.Format('Unhandled attribute \'{0}\'.', attribute));
|
|
239
|
-
break;
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
parser.setCurrIndex(endContext + 1);
|
|
243
|
-
return;
|
|
244
|
-
}
|
|
245
|
-
Events.WriteExceptionToLog('in Form.FillName() out of bounds');
|
|
246
|
-
}
|
|
247
|
-
createForm() {
|
|
248
|
-
let inputControls = this.GetListOfInputControls();
|
|
249
|
-
let formName = this.buildFormName();
|
|
250
|
-
if (!this.isSubForm()) {
|
|
251
|
-
Commands.addOpenForm(this, formName, '0', this.getTask().getTaskTag(), inputControls, this.isDialog());
|
|
252
|
-
}
|
|
253
|
-
else {
|
|
254
|
-
Commands.addOpensubform(CommandType.CREATE_SUB_FORM, this.getSubFormCtrl(), this.getTask().getTaskTag(), this.getSubFormCtrl().getName(), formName, inputControls, this.getTask().RouterPath, this.getTask().GetRouterParams(), this.getTask().InDefaultRouterOutlet);
|
|
255
|
-
}
|
|
256
|
-
if (this.HasTable())
|
|
257
|
-
this.InitTableControl();
|
|
258
|
-
Commands.beginInvoke();
|
|
259
|
-
}
|
|
260
|
-
CallJS(methodName, args) {
|
|
261
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
262
|
-
return Commands.addCallJS(this, this.UniqueName, methodName, args);
|
|
263
|
-
});
|
|
264
|
-
}
|
|
265
|
-
isAutomaticTabbingOrder() {
|
|
266
|
-
return this.GetComputedProperty(PropInterface.PROP_TYPE_TABBING_ORDER).GetComputedValueInteger() === TabbingOrderType.Automatically;
|
|
267
|
-
}
|
|
268
|
-
isRefreshRepeatableAllowed() {
|
|
269
|
-
return this.RefreshRepeatableAllowed;
|
|
270
|
-
}
|
|
271
|
-
isScreenMode() {
|
|
272
|
-
return !this.isLineMode();
|
|
273
|
-
}
|
|
274
|
-
isLineMode() {
|
|
275
|
-
return this.getMainControl() !== null;
|
|
276
|
-
}
|
|
277
|
-
hasTable() {
|
|
278
|
-
return this._tableMgControl !== null;
|
|
279
|
-
}
|
|
280
|
-
isDialog() {
|
|
281
|
-
let isDialog = false;
|
|
282
|
-
let windowType = this.ConcreteWindowType;
|
|
283
|
-
if (windowType === WindowType.Overlay)
|
|
284
|
-
isDialog = true;
|
|
285
|
-
else if (MgFormBase.ShouldBehaveAsModal())
|
|
286
|
-
isDialog = true;
|
|
287
|
-
return isDialog;
|
|
288
|
-
}
|
|
289
|
-
isSubForm() {
|
|
290
|
-
return this._subFormCtrl !== null;
|
|
291
|
-
}
|
|
292
|
-
HasTable() {
|
|
293
|
-
return this._tableMgControl !== null;
|
|
294
|
-
}
|
|
295
|
-
getTopMostForm() {
|
|
296
|
-
let topMostForm = this;
|
|
297
|
-
while (topMostForm.isSubForm() && topMostForm.ParentForm !== null)
|
|
298
|
-
topMostForm = topMostForm.ParentForm;
|
|
299
|
-
return topMostForm;
|
|
300
|
-
}
|
|
301
|
-
getTopMostFrameForm() {
|
|
302
|
-
let topMostForm = this;
|
|
303
|
-
while (topMostForm !== null)
|
|
304
|
-
topMostForm = ((topMostForm.ParentForm !== null) ? topMostForm.ParentForm : null);
|
|
305
|
-
return topMostForm;
|
|
306
|
-
}
|
|
307
|
-
getSubFormCtrl() {
|
|
308
|
-
return this._subFormCtrl;
|
|
309
|
-
}
|
|
310
|
-
getCtrl(ctrlIdx) {
|
|
311
|
-
return this.CtrlTab.getCtrl(ctrlIdx);
|
|
312
|
-
}
|
|
313
|
-
GetCtrl(ctrlName) {
|
|
314
|
-
return this.CtrlTab.getCtrl(ctrlName);
|
|
315
|
-
}
|
|
316
|
-
get DefaultRouterOutlet() {
|
|
317
|
-
if (this.defaultRouterOutlet == null) {
|
|
318
|
-
this.defaultRouterOutlet = this.CtrlTab.GetControl((x) => {
|
|
319
|
-
return x.IsDefaultRouterOutlet();
|
|
320
|
-
});
|
|
321
|
-
}
|
|
322
|
-
return this.defaultRouterOutlet;
|
|
323
|
-
}
|
|
324
|
-
GetChoiceControlItemList(mgControl) {
|
|
325
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
326
|
-
Debug.Assert(mgControl.isChoiceControl());
|
|
327
|
-
let items = new List();
|
|
328
|
-
let fld = mgControl.getField();
|
|
329
|
-
let storageAttribute = fld.getCellsType();
|
|
330
|
-
if (storageAttribute !== StorageAttribute.DATE && storageAttribute !== StorageAttribute.TIME) {
|
|
331
|
-
if (mgControl.isRadio()) {
|
|
332
|
-
for (let i = 0; i < fld.GetRadioCtrls().length; i++) {
|
|
333
|
-
let radioControl = fld.GetRadioCtrls().get_Item(i);
|
|
334
|
-
items.AddRange(yield radioControl.GetItemsRange());
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
else {
|
|
338
|
-
items.AddRange(yield mgControl.GetItemsRange());
|
|
339
|
-
}
|
|
340
|
-
return MgFormBase.ConvertArrayListToString(items, storageAttribute === StorageAttribute.NUMERIC);
|
|
341
|
-
}
|
|
342
|
-
return NString.Empty;
|
|
343
|
-
});
|
|
344
|
-
}
|
|
345
|
-
GetChoiceControlDisplayList(mgControl) {
|
|
346
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
347
|
-
Debug.Assert(mgControl.isChoiceControl());
|
|
348
|
-
let items = new List();
|
|
349
|
-
let fld = mgControl.getField();
|
|
350
|
-
let storageAttribute = fld.getCellsType();
|
|
351
|
-
if (storageAttribute !== StorageAttribute.DATE && storageAttribute !== StorageAttribute.TIME) {
|
|
352
|
-
if (mgControl.isRadio()) {
|
|
353
|
-
for (let i = 0; i < fld.GetRadioCtrls().length; i++) {
|
|
354
|
-
let radioControl = fld.GetRadioCtrls().get_Item(i);
|
|
355
|
-
items.AddRange(yield radioControl.GetDisplayRange());
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
else {
|
|
359
|
-
items.AddRange(yield mgControl.GetItemsRange());
|
|
360
|
-
}
|
|
361
|
-
return MgFormBase.ConvertArrayListToString(items, false);
|
|
362
|
-
}
|
|
363
|
-
return NString.Empty;
|
|
364
|
-
});
|
|
365
|
-
}
|
|
366
|
-
getControlColumn(ctrl) {
|
|
367
|
-
let column = null;
|
|
368
|
-
if ((ctrl.IsRepeatable || ctrl.IsTableHeaderChild) && this._tableColumns !== null)
|
|
369
|
-
column = this._tableColumns.get_Item(ctrl.getLayer() - 1);
|
|
370
|
-
return column;
|
|
371
|
-
}
|
|
372
|
-
getContainerCtrl() {
|
|
373
|
-
return this._containerCtrl;
|
|
374
|
-
}
|
|
375
|
-
getColumnControls() {
|
|
376
|
-
let columnControlsList = null;
|
|
377
|
-
if (this.CtrlTab !== null) {
|
|
378
|
-
for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
|
|
379
|
-
let ctrl = this.CtrlTab.getCtrl(i);
|
|
380
|
-
if (ctrl.Type === MgControlType.CTRL_TYPE_COLUMN) {
|
|
381
|
-
if (columnControlsList === null)
|
|
382
|
-
columnControlsList = new List();
|
|
383
|
-
columnControlsList.push(ctrl);
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
return columnControlsList;
|
|
388
|
-
}
|
|
389
|
-
getTask() {
|
|
390
|
-
return this._task;
|
|
391
|
-
}
|
|
392
|
-
getTableCtrl() {
|
|
393
|
-
return this._tableMgControl;
|
|
394
|
-
}
|
|
395
|
-
getMainControl() {
|
|
396
|
-
return this._tableMgControl;
|
|
397
|
-
}
|
|
398
|
-
getCtrlByName(ctrlName, ctrlType) {
|
|
399
|
-
return this.CtrlTab.getCtrlByName(ctrlName, ctrlType);
|
|
400
|
-
}
|
|
401
|
-
checkAndCreateRow(idx) {
|
|
402
|
-
if (this._tableMgControl !== null && !this.isRowCreated(idx))
|
|
403
|
-
this.createRow(idx);
|
|
404
|
-
}
|
|
405
|
-
IsValidRow(idx) {
|
|
406
|
-
let validRow = false;
|
|
407
|
-
if (this._tableMgControl !== null && idx >= 0 && idx < this.Rows.length) {
|
|
408
|
-
let row = this.Rows.get_Item(idx);
|
|
409
|
-
validRow = (row !== null && row.Validated);
|
|
410
|
-
}
|
|
411
|
-
return validRow;
|
|
412
|
-
}
|
|
413
|
-
refreshProps() {
|
|
414
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
415
|
-
if (this._firstRefreshOfProps) {
|
|
416
|
-
this.getProp(PropInterface.PROP_TYPE_TITLE_BAR);
|
|
417
|
-
}
|
|
418
|
-
yield this._propTab.RefreshDisplay(false, false);
|
|
419
|
-
if (this._firstRefreshOfProps)
|
|
420
|
-
this._firstRefreshOfProps = false;
|
|
421
|
-
});
|
|
422
|
-
}
|
|
423
|
-
refreshControls(repeatableOnly) {
|
|
424
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
425
|
-
let ctrl;
|
|
426
|
-
if (this.DisplayLine === Int32.MinValue)
|
|
427
|
-
return;
|
|
428
|
-
if (this._tableMgControl !== null && !repeatableOnly)
|
|
429
|
-
yield this._tableMgControl.RefreshDisplay();
|
|
430
|
-
if (this._tableColumns !== null && !repeatableOnly) {
|
|
431
|
-
for (let i = 0; i < this._tableColumns.length; i = i + 1) {
|
|
432
|
-
let mgControlBase = this._tableColumns.get_Item(i);
|
|
433
|
-
yield mgControlBase.RefreshDisplay();
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
this.checkAndCreateRow(this.DisplayLine);
|
|
437
|
-
let tabAndGroupControls = new Stack();
|
|
438
|
-
for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
|
|
439
|
-
ctrl = this.CtrlTab.getCtrl(i);
|
|
440
|
-
if ((ctrl.isTabControl() || ctrl.isGroup()) && !repeatableOnly) {
|
|
441
|
-
tabAndGroupControls.push(ctrl);
|
|
442
|
-
}
|
|
443
|
-
if (ctrl.Type !== MgControlType.CTRL_TYPE_TABLE && ctrl.Type !== MgControlType.CTRL_TYPE_COLUMN) {
|
|
444
|
-
if (ctrl.IsRepeatable || !repeatableOnly)
|
|
445
|
-
yield ctrl.RefreshDisplay();
|
|
446
|
-
}
|
|
447
|
-
else if (ctrl.Type === MgControlType.CTRL_TYPE_TABLE && repeatableOnly)
|
|
448
|
-
yield ctrl.RefreshDisplay(repeatableOnly);
|
|
449
|
-
}
|
|
450
|
-
});
|
|
451
|
-
}
|
|
452
|
-
markRowNOTCreated(idx) {
|
|
453
|
-
Commands.addWithNumber(CommandType.UNDO_CREATE_TABLE_ROW, this._tableMgControl, idx);
|
|
454
|
-
if (idx >= 0 && idx < this.Rows.length)
|
|
455
|
-
this.Rows.set_Item(idx, new Row(false, false));
|
|
456
|
-
}
|
|
457
|
-
SelectRow(sendAlwaysOrRowIdx, sendAlways) {
|
|
458
|
-
if (arguments.length === 0)
|
|
459
|
-
this.SelectRow_0();
|
|
460
|
-
else if (arguments.length === 1)
|
|
461
|
-
this.SelectRow_1(sendAlwaysOrRowIdx);
|
|
462
|
-
else
|
|
463
|
-
this.SelectRow_2(sendAlwaysOrRowIdx, sendAlways);
|
|
464
|
-
}
|
|
465
|
-
getRowsInPage() {
|
|
466
|
-
return this._rowsInPage;
|
|
467
|
-
}
|
|
468
|
-
getMaxRowsInPaginatedTable() {
|
|
469
|
-
return this._maxRowsInPaginatedTable;
|
|
470
|
-
}
|
|
471
|
-
setRowsInPage(size) {
|
|
472
|
-
this._rowsInPage = size;
|
|
473
|
-
}
|
|
474
|
-
getColumnsCount() {
|
|
475
|
-
let columnsCount = 0;
|
|
476
|
-
if (this.CtrlTab !== null) {
|
|
477
|
-
for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
|
|
478
|
-
let control = this.CtrlTab.getCtrl(i);
|
|
479
|
-
if (control.Type === MgControlType.CTRL_TYPE_COLUMN)
|
|
480
|
-
columnsCount = columnsCount + 1;
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
return columnsCount;
|
|
484
|
-
}
|
|
485
|
-
inRefreshDisplay() {
|
|
486
|
-
return this._inRefreshDisp;
|
|
487
|
-
}
|
|
488
|
-
setTitle(newTitle) {
|
|
489
|
-
Commands.setTitle(this, newTitle);
|
|
490
|
-
}
|
|
491
|
-
getControlIdx(ctrl) {
|
|
492
|
-
return this.CtrlTab.getControlIdx(ctrl, true);
|
|
493
|
-
}
|
|
494
|
-
getTopIndexFromGUI() {
|
|
495
|
-
let topDisplayLine = 0;
|
|
496
|
-
if (this.hasTable())
|
|
497
|
-
topDisplayLine = Commands.getTopIndex(this.getMainControl());
|
|
498
|
-
return topDisplayLine;
|
|
499
|
-
}
|
|
500
|
-
getTableItemsCount() {
|
|
501
|
-
return this._tableItemsCount;
|
|
502
|
-
}
|
|
503
|
-
removeRefsToCtrls() {
|
|
504
|
-
for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
|
|
505
|
-
this.CtrlTab.getCtrl(i).removeRefFromField();
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
buildTableChildren() {
|
|
509
|
-
if (this._tableChildren === null) {
|
|
510
|
-
this._tableChildren = new List();
|
|
511
|
-
if (this.CtrlTab !== null) {
|
|
512
|
-
let minTabOrder = 2147483647;
|
|
513
|
-
let automaticTabbingOrder = this.isAutomaticTabbingOrder();
|
|
514
|
-
for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
|
|
515
|
-
let ctrl = this.CtrlTab.getCtrl(i);
|
|
516
|
-
if (ctrl.IsRepeatable || ctrl.IsTableHeaderChild) {
|
|
517
|
-
this._tableChildren.push(ctrl);
|
|
518
|
-
if (automaticTabbingOrder) {
|
|
519
|
-
let prop = ctrl.GetComputedProperty(PropInterface.PROP_TYPE_TAB_ORDER);
|
|
520
|
-
if (prop !== null) {
|
|
521
|
-
let valueInt = prop.GetComputedValueInteger();
|
|
522
|
-
if (valueInt < minTabOrder)
|
|
523
|
-
minTabOrder = valueInt;
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
if (minTabOrder !== Int32.MaxValue && automaticTabbingOrder) {
|
|
529
|
-
this._firstTableTabOrder = minTabOrder;
|
|
530
|
-
}
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
setTableCtrl(tableCtrl) {
|
|
535
|
-
this._tableMgControl = tableCtrl;
|
|
536
|
-
}
|
|
537
|
-
getCtrlCount() {
|
|
538
|
-
return this.CtrlTab.getSize();
|
|
539
|
-
}
|
|
540
|
-
GetControlsCountExcludingStatusBar() {
|
|
541
|
-
return this.CtrlTab.getSize();
|
|
542
|
-
}
|
|
543
|
-
refreshPropsOnExpression() {
|
|
544
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
545
|
-
let i;
|
|
546
|
-
let size = (this._propTab == null ? 0 : this._propTab.getSize());
|
|
547
|
-
let prop;
|
|
548
|
-
let refresh = false;
|
|
549
|
-
for (i = 0; i < size && !refresh; i++) {
|
|
550
|
-
prop = this._propTab.getProp(i);
|
|
551
|
-
if (prop.isExpression()) {
|
|
552
|
-
refresh = true;
|
|
553
|
-
yield this.refreshProps();
|
|
554
|
-
}
|
|
555
|
-
}
|
|
556
|
-
});
|
|
557
|
-
}
|
|
558
|
-
getTabControl(ctrl) {
|
|
559
|
-
let obj;
|
|
560
|
-
let result = null;
|
|
561
|
-
obj = ctrl;
|
|
562
|
-
while (obj instanceof MgControlBase) {
|
|
563
|
-
let currCtrl = obj;
|
|
564
|
-
if (currCtrl.isTabControl()) {
|
|
565
|
-
result = currCtrl;
|
|
566
|
-
break;
|
|
567
|
-
}
|
|
568
|
-
obj = currCtrl.getParent();
|
|
569
|
-
}
|
|
570
|
-
if (result == null) {
|
|
571
|
-
for (let i = 0; i < this.CtrlTab.getSize(); i++) {
|
|
572
|
-
obj = this.CtrlTab.getCtrl(i);
|
|
573
|
-
if (obj.isTabControl()) {
|
|
574
|
-
result = obj;
|
|
575
|
-
break;
|
|
576
|
-
}
|
|
577
|
-
}
|
|
578
|
-
}
|
|
579
|
-
return result;
|
|
580
|
-
}
|
|
581
|
-
IsInputType(ctrl) {
|
|
582
|
-
switch (ctrl.Type) {
|
|
583
|
-
case MgControlType.CTRL_TYPE_CHECKBOX:
|
|
584
|
-
case MgControlType.CTRL_TYPE_TEXT:
|
|
585
|
-
case MgControlType.CTRL_TYPE_COMBO:
|
|
586
|
-
case MgControlType.CTRL_TYPE_LIST:
|
|
587
|
-
case MgControlType.CTRL_TYPE_RADIO:
|
|
588
|
-
return true;
|
|
589
|
-
default:
|
|
590
|
-
return false;
|
|
591
|
-
}
|
|
592
|
-
}
|
|
593
|
-
GetListOfInputControls() {
|
|
594
|
-
let filterterList = this.CtrlTab.filter(((c, index, array) => this.IsInputType(c)));
|
|
595
|
-
let names = filterterList.reduce((pre, ctrl, i) => {
|
|
596
|
-
pre[ctrl.UniqueName] = ctrl.IsRepeatable ? '1' : '0';
|
|
597
|
-
return pre;
|
|
598
|
-
}, {});
|
|
599
|
-
return names;
|
|
600
|
-
}
|
|
601
|
-
firstTableRefresh() {
|
|
602
|
-
if (this._tableMgControl !== null) {
|
|
603
|
-
this._rowsInPage = Commands.getRowsInPage(this._tableMgControl);
|
|
604
|
-
this.RefreshRepeatableAllowed = true;
|
|
605
|
-
}
|
|
606
|
-
}
|
|
607
|
-
SetTableItemsCount(dvsize, tableItemsCountOrRemoveAll, removeAll) {
|
|
608
|
-
if (typeof tableItemsCountOrRemoveAll == 'boolean') {
|
|
609
|
-
this.SetTableItemsCount_0(dvsize, tableItemsCountOrRemoveAll);
|
|
610
|
-
}
|
|
611
|
-
else
|
|
612
|
-
this.SetTableItemsCount_1(dvsize, tableItemsCountOrRemoveAll, removeAll);
|
|
613
|
-
}
|
|
614
|
-
SetTableItemsCount_0(dvsize, removeAll) {
|
|
615
|
-
this.SetTableItemsCount_1(dvsize, dvsize, removeAll);
|
|
616
|
-
}
|
|
617
|
-
SetTableItemsCount_1(dvsize, tableItemsCount, removeAll) {
|
|
618
|
-
this.InitTableControl(dvsize, tableItemsCount, removeAll);
|
|
619
|
-
}
|
|
620
|
-
InitTableControl(dvSize, tableItemsCount, removeAll) {
|
|
621
|
-
if (arguments.length === 0) {
|
|
622
|
-
this.InitTableControl_0();
|
|
623
|
-
return;
|
|
624
|
-
}
|
|
625
|
-
this.InitTableControl_1(dvSize, tableItemsCount, removeAll);
|
|
626
|
-
}
|
|
627
|
-
UpdateTableChildrenArraysSize(size) {
|
|
628
|
-
let children = this.TableChildren;
|
|
629
|
-
if (children != null) {
|
|
630
|
-
for (let i = 0; i < children.length; i++) {
|
|
631
|
-
let control = children.get_Item(i);
|
|
632
|
-
control.updateArrays(size);
|
|
633
|
-
}
|
|
634
|
-
}
|
|
635
|
-
if (this._tableMgControl != null)
|
|
636
|
-
this._tableMgControl.updateArrays(size);
|
|
637
|
-
}
|
|
638
|
-
toString() {
|
|
639
|
-
return '{GuiMgForm' + ': Id=' + this._userStateId + '}';
|
|
640
|
-
}
|
|
641
|
-
IncludeControlInTabbingOrder(control, includeControlChildOfFrameForm) {
|
|
642
|
-
if (!control.PropertyExists(PropInterface.PROP_TYPE_TAB_ORDER))
|
|
643
|
-
return false;
|
|
644
|
-
return true;
|
|
645
|
-
}
|
|
646
|
-
GetHashCode() {
|
|
647
|
-
return this.FormIsn;
|
|
648
|
-
}
|
|
649
|
-
initInnerObjects(foundTagName) {
|
|
650
|
-
if (foundTagName === null)
|
|
651
|
-
return false;
|
|
652
|
-
let parser = Manager.GetCurrentRuntimeContext().Parser;
|
|
653
|
-
if (MgFormBase.IsFormTag(foundTagName))
|
|
654
|
-
this.fillName(foundTagName);
|
|
655
|
-
else if (foundTagName === XMLConstants.MG_TAG_PROP)
|
|
656
|
-
this._propTab.fillData(this, 'F', parser);
|
|
657
|
-
else if (foundTagName === XMLConstants.MG_TAG_CONTROL) {
|
|
658
|
-
this.CtrlTab.fillData(this, parser);
|
|
659
|
-
if (!this.HasTable())
|
|
660
|
-
this.RefreshRepeatableAllowed = true;
|
|
661
|
-
}
|
|
662
|
-
else if (MgFormBase.IsEndFormTag(foundTagName)) {
|
|
663
|
-
parser.setCurrIndex2EndOfTag();
|
|
664
|
-
return false;
|
|
665
|
-
}
|
|
666
|
-
else
|
|
667
|
-
return false;
|
|
668
|
-
return true;
|
|
669
|
-
}
|
|
670
|
-
isRowCreated(idx) {
|
|
671
|
-
if (this.Rows.length <= idx || idx < 0) {
|
|
672
|
-
return false;
|
|
673
|
-
}
|
|
674
|
-
let row = this.Rows.get_Item(idx);
|
|
675
|
-
if (row === null)
|
|
676
|
-
return false;
|
|
677
|
-
return row.Created;
|
|
678
|
-
}
|
|
679
|
-
buildLinkedControlsLists() {
|
|
680
|
-
for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
|
|
681
|
-
let ctrl = this.CtrlTab.getCtrl(i);
|
|
682
|
-
let linkedParent = ctrl.getLinkedParent(false);
|
|
683
|
-
if (linkedParent !== null)
|
|
684
|
-
linkedParent.linkCtrl(ctrl);
|
|
685
|
-
}
|
|
686
|
-
}
|
|
687
|
-
buildTableColumnsList() {
|
|
688
|
-
if (this._tableMgControl !== null) {
|
|
689
|
-
this._tableColumns = new List();
|
|
690
|
-
for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
|
|
691
|
-
let control = this.CtrlTab.getCtrl(i);
|
|
692
|
-
if (control.Type === MgControlType.CTRL_TYPE_COLUMN)
|
|
693
|
-
this._tableColumns.push(control);
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
createRow(idx) {
|
|
698
|
-
Commands.addWithNumber(CommandType.CREATE_TABLE_ROW, this._tableMgControl, idx);
|
|
699
|
-
if (this.Rows.length <= idx)
|
|
700
|
-
this.Rows.SetSize(idx + 1);
|
|
701
|
-
this.Rows.set_Item(idx, new Row(true, true));
|
|
702
|
-
}
|
|
703
|
-
SelectRow_0() {
|
|
704
|
-
this.SelectRow(false);
|
|
705
|
-
}
|
|
706
|
-
SelectRow_1(sendAlways) {
|
|
707
|
-
this.SelectRow(this.DisplayLine, sendAlways);
|
|
708
|
-
}
|
|
709
|
-
SelectRow_2(rowIdx, sendAlways) {
|
|
710
|
-
let mainControl = this.getMainControl();
|
|
711
|
-
if (mainControl !== null && this.RefreshRepeatableAllowed) {
|
|
712
|
-
let index = rowIdx;
|
|
713
|
-
if (this._task.DataView.isEmptyDataview())
|
|
714
|
-
index = GuiConstants.NO_ROW_SELECTED;
|
|
715
|
-
if (sendAlways || index !== this._prevSelIndex) {
|
|
716
|
-
this._prevSelIndex = index;
|
|
717
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, mainControl, 0, HtmlProperties.SelectedRow, index);
|
|
718
|
-
}
|
|
719
|
-
}
|
|
720
|
-
}
|
|
721
|
-
InitTableControl_0() {
|
|
722
|
-
this.InitTableControl(1, 1, false);
|
|
723
|
-
}
|
|
724
|
-
InitTableControl_1(dvSize, tableItemsCount, removeAll) {
|
|
725
|
-
if (this._tableMgControl != null) {
|
|
726
|
-
Commands.addWithNumber(CommandType.SET_TABLE_ITEMS_COUNT, this._tableMgControl, tableItemsCount);
|
|
727
|
-
this._tableItemsCount = tableItemsCount;
|
|
728
|
-
this.Rows.SetSize(dvSize);
|
|
729
|
-
this._prevGuiTopIndex = -2;
|
|
730
|
-
this._prevSelIndex = -2;
|
|
731
|
-
this.UpdateTableChildrenArraysSize(dvSize);
|
|
732
|
-
this._maxRowsInPaginatedTable = Commands.getMaxRowsInPaginatedTable(this._tableMgControl);
|
|
733
|
-
}
|
|
734
|
-
}
|
|
735
|
-
InsertTableChildrenArrays(idx, count) {
|
|
736
|
-
let children = this.TableChildren;
|
|
737
|
-
if (children != null) {
|
|
738
|
-
for (let i = 0; i < children.length; i++) {
|
|
739
|
-
let control = children[i];
|
|
740
|
-
control.InsertArrays(idx, count);
|
|
741
|
-
}
|
|
742
|
-
}
|
|
743
|
-
}
|
|
744
|
-
}
|
|
745
|
-
export class Row {
|
|
746
|
-
constructor(created, validated) {
|
|
747
|
-
this.Created = false;
|
|
748
|
-
this.Validated = false;
|
|
749
|
-
if (arguments.length === 0) {
|
|
750
|
-
this.constructor_0();
|
|
751
|
-
return;
|
|
752
|
-
}
|
|
753
|
-
this.constructor_1(created, validated);
|
|
754
|
-
}
|
|
755
|
-
constructor_0() {
|
|
756
|
-
this.Validated = true;
|
|
757
|
-
}
|
|
758
|
-
constructor_1(created, validated) {
|
|
759
|
-
this.Created = created;
|
|
760
|
-
this.Validated = validated;
|
|
761
|
-
}
|
|
762
|
-
}
|
|
763
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWdGb3JtQmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9zcmMvbWFuYWdlbWVudC9ndWkvTWdGb3JtQmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUNMLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixPQUFPLEVBQ1AsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVixZQUFZLEVBQ1osU0FBUyxFQUNWLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLEtBQUssRUFBYSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBWSxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBSWxFLE1BQU0sU0FBUyxHQUFXLElBQUksQ0FBQztBQUsvQixNQUFNLE9BQWdCLFVBQVcsU0FBUSxzQkFBc0I7SUFvRDdEO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUFwRFYsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUU1QixZQUFPLEdBQWlCLElBQUksQ0FBQztRQUU3QixrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUMvQiw2QkFBd0IsR0FBWSxLQUFLLENBQUM7UUFDMUMsU0FBSSxHQUFjLElBQUksQ0FBQztRQUN2QixvQkFBZSxHQUFXLENBQUMsQ0FBQztRQUM1QixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixZQUFPLEdBQVcsQ0FBQyxDQUFDO1FBQ3BCLFNBQUksR0FBVyxJQUFJLENBQUM7UUFDcEIsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUN4QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixtQkFBYyxHQUFXLENBQUMsQ0FBQztRQUMzQiw0QkFBdUIsR0FBWSxLQUFLLENBQUM7UUFFekMsZUFBVSxHQUFlLElBQUksQ0FBQztRQUVwQixnQkFBVyxHQUFXLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDckMsd0JBQW1CLEdBQVcsQ0FBQyxDQUFDO1FBQ2hDLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsaUJBQVksR0FBVyxDQUFDLENBQUMsQ0FBQztRQUMxQixxQkFBZ0IsR0FBVyxDQUFDLENBQUMsQ0FBQztRQUM5QixhQUFRLEdBQWMsSUFBSSxDQUFDO1FBQzNCLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1FBQ3hCLDZCQUF3QixHQUFXLENBQUMsQ0FBQztRQUNyQyxpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFDbkMsb0JBQWUsR0FBa0IsSUFBSSxDQUFDO1FBQ3RDLHFCQUFnQixHQUFXLENBQUMsQ0FBQztRQUM3QixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUNqQyxVQUFLLEdBQWdCLElBQUksQ0FBQztRQUMxQixxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFHbEMscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBRXBDLDZCQUF3QixHQUFZLElBQUksQ0FBQztRQUN6Qyx3QkFBbUIsR0FBZSxDQUFDLENBQUM7UUFDcEMsbUJBQWMsR0FBa0IsSUFBSSxDQUFDO1FBQ3JDLHlCQUFvQixHQUFZLElBQUksQ0FBQztRQUVyQyxrQkFBYSxHQUFXLENBQUMsQ0FBQyxDQUFDO1FBQzNCLHlCQUFvQixHQUFZLEtBQUssQ0FBQztRQUN0QyxtQkFBYyxHQUF3QixJQUFJLENBQUM7UUFDM0Msa0JBQWEsR0FBd0IsSUFBSSxDQUFDO1FBQ3hDLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBRTVCLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1FBeWV4Qix3QkFBbUIsR0FBa0IsSUFBSSxDQUFDO1FBcGVoRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLG1CQUFtQixHQUFlLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLFdBQVcsQ0FBQyxLQUFhO1FBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsSUFBSSxJQUFJO1lBQ3JFLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUM7O1lBRXRGLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBR0QsSUFBSSxhQUFhO1FBQ2YsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLElBQUk7WUFDOUIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDNUIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFJLGFBQWEsQ0FBQyxLQUEwQjtRQUMxQyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxtQkFBbUI7UUFDckIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQUksdUJBQXVCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFJLHVCQUF1QixDQUFDLEtBQWM7UUFDeEMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQztJQUN4QyxDQUFDO0lBTUQsSUFBSSxrQkFBa0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEtBQWlCLENBQUMsRUFBRTtZQUM5QyxJQUFJLFVBQVUsR0FBMkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDakksSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksSUFBSSxVQUFVLEtBQUssVUFBVSxDQUFDLE9BQU87Z0JBQy9ELFVBQVUsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDO1lBRWxDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxVQUFVLENBQUM7U0FDdkM7UUFDRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUNsQyxDQUFDO0lBS0QsSUFBSSxrQkFBa0IsQ0FBQyxLQUFpQjtRQUN0QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0lBQ25DLENBQUM7SUFTRCxNQUFNLENBQUMsdUJBQXVCO1FBQzVCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQVlTLE1BQU0sQ0FBQyxtQkFBbUI7UUFDbEMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBUU8sTUFBTSxDQUFDLHdCQUF3QixDQUFDLEtBQW1CLEVBQUUsYUFBc0I7UUFDakYsSUFBSSxJQUFJLEdBQWEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLElBQUksRUFBRSxHQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxQyxJQUFJLGFBQWEsR0FBa0IsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUN2RCxJQUFJLFFBQWtCLENBQUM7UUFFdkIsS0FBSyxJQUFJLEtBQUssR0FBVyxDQUFDLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxHQUFHLEtBQUssR0FBRyxDQUFDLEVBQUU7WUFDbkUsSUFBSSxhQUFhLEVBQUU7Z0JBQ2pCLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FBUyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZELEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2FBQ3hEO1lBRUQsYUFBYSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQVMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUV4RixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQzFCLGFBQWEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDbkM7UUFFRCxPQUFPLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBT0QscUJBQXFCLENBQUMsVUFBc0IsRUFBRSxRQUFpQjtRQUU3RCxJQUFJLFFBQVE7WUFDVixJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsQ0FBQzs7WUFFMUIsSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLENBQUM7UUFFNUIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQVFLLGtCQUFrQixDQUFDLEtBQWEsRUFBRSxPQUF5QixFQUFFLE1BQWMsRUFBRSxrQkFBMkIsRUFDckYsV0FBNkIsRUFBRSxjQUF1QixFQUFFLFlBQStCOztZQUM5RyxPQUFPLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzFILENBQUM7S0FBQTtJQUVELG9CQUFvQixDQUFDLEtBQWE7UUFDaEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFPRCxnQkFBZ0IsQ0FBQyxNQUFjO1FBQzdCLElBQUksS0FBSyxHQUFZLEtBQUssQ0FBQztRQUMzQixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFO1lBQzFCLElBQUksUUFBUSxHQUFhLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNELEtBQUssR0FBRyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsQ0FBQztTQUM3QjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQU9ELE9BQU8sQ0FBQyxNQUFjO1FBQ3BCLElBQUksSUFBSSxHQUFhLElBQUksQ0FBQztRQUUxQixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFO1lBQzFCLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUl6QyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7Z0JBQ2pCLElBQUksR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzVFLElBQUksSUFBSSxLQUFLLElBQUk7b0JBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDL0I7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQU1ELG1CQUFtQixDQUFDLE1BQWM7UUFDaEMsSUFBSSxJQUFJLEdBQWEsSUFBSSxDQUFDO1FBRTFCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJO1lBQ3hCLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUzQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFJRCxxQkFBcUIsQ0FBQyxNQUFjO1FBQ2xDLElBQUksSUFBSSxHQUFhLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQU1ELFVBQVU7UUFDUixPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNyRSxDQUFDO0lBT0QscUJBQXFCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7SUFNRCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBT0QsUUFBUSxDQUFDLE9BQW9CO1FBQzNCLElBQUksTUFBTSxHQUFjLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUVsRSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxJQUFJO1lBQ3pDLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO1FBRXZCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFO1NBQ2xEO0lBRUgsQ0FBQztJQUlELElBQUk7UUFDRixLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUM3RCxJQUFJLElBQUksR0FBa0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFbEQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2I7UUFHRCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUdoQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDM0YsSUFBSSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMseUJBQXlCLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO0lBQy9KLENBQUM7SUFPRCxRQUFRLENBQUMsT0FBZTtRQUN0QixJQUFJLE1BQU0sR0FBYyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDbEUsSUFBSSxVQUFVLEdBQVcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBRXBHLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQyxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxFQUFFO1lBRWhFLElBQUksR0FBRyxHQUFXLE1BQU0sQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDckQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUU1RCxJQUFJLFlBQVksR0FBaUIsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUV0SCxJQUFJLFNBQWlCLENBQUM7WUFDdEIsSUFBSSxRQUFnQixDQUFDO1lBRXJCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUMxRCxTQUFTLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckMsUUFBUSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUV4QyxRQUFRLFNBQVMsRUFBRTtvQkFDakIsS0FBSyxZQUFZLENBQUMsWUFBWTt3QkFDNUIsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUNwRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDOzRCQUN4QyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQ3hFLE1BQU07b0JBQ1IsS0FBSyxZQUFZLENBQUMsbUJBQW1CO3dCQUNuQyxNQUFNO29CQUNSLEtBQUssWUFBWSxDQUFDLHdCQUF3Qjt3QkFDeEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUNsRCxNQUFNO29CQUNSLEtBQUssWUFBWSxDQUFDLHdCQUF3Qjt3QkFDeEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUNqRCxNQUFNO29CQUNSLEtBQUssWUFBWSxDQUFDLGdCQUFnQjt3QkFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUMxQyxNQUFNO29CQUNSLEtBQUssWUFBWSxDQUFDLG9CQUFvQjt3QkFDcEMsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUM1RCxNQUFNO29CQUNSO3dCQUNFLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLDhCQUE4QixFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7d0JBQ3RGLE1BQU07aUJBQ1Q7YUFDRjtZQUNELE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLE9BQU87U0FDUjtRQUNELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFXRCxVQUFVO1FBQ1IsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDbEQsSUFBSSxRQUFRLEdBQVcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDckIsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQ3hHO2FBQU07WUFDTCxRQUFRLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBa0IsSUFBSSxDQUFDLGNBQWMsRUFBRyxDQUFDLE9BQU8sRUFBRSxFQUN2SixRQUFRLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLGVBQWUsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1NBQy9IO1FBSUQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRTFCLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBTUssTUFBTSxDQUFDLFVBQWtCLEVBQUUsSUFBZ0I7O1lBQy9DLE9BQU8sUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDckUsQ0FBQztLQUFBO0lBTUQsdUJBQXVCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLHVCQUF1QixFQUFFLEtBQUssZ0JBQWdCLENBQUMsYUFBYSxDQUFDO0lBQ3RJLENBQUM7SUFPRCwwQkFBMEI7UUFDeEIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUM7SUFDdkMsQ0FBQztJQUtELFlBQVk7UUFDVixPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFNRCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLEtBQUssSUFBSSxDQUFDO0lBQ3hDLENBQUM7SUFNRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQztJQUN2QyxDQUFDO0lBTUQsUUFBUTtRQUNOLElBQUksUUFBUSxHQUFZLEtBQUssQ0FBQztRQUM5QixJQUFJLFVBQVUsR0FBZSxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDckQsSUFBSSxVQUFVLEtBQUssVUFBVSxDQUFDLE9BQU87WUFDbkMsUUFBUSxHQUFHLElBQUksQ0FBQzthQUNiLElBQUksVUFBVSxDQUFDLG1CQUFtQixFQUFFO1lBQ3ZDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDbEIsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQU9ELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDO0lBQ3BDLENBQUM7SUFPRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQztJQUN2QyxDQUFDO0lBSUQsY0FBYztRQUNaLElBQUksV0FBVyxHQUFlLElBQUksQ0FBQztRQUduQyxPQUFPLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxXQUFXLENBQUMsVUFBVSxLQUFLLElBQUk7WUFDL0QsV0FBVyxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUM7UUFFdkMsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQVFELG1CQUFtQjtRQUNqQixJQUFJLFdBQVcsR0FBZSxJQUFJLENBQUM7UUFFbkMsT0FBTyxXQUFXLEtBQUssSUFBSTtZQUN6QixXQUFXLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXBGLE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFPRCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFRRCxPQUFPLENBQUMsT0FBZTtRQUNyQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFLRCxPQUFPLENBQUMsUUFBZ0I7UUFDdEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBSUQsSUFBSSxtQkFBbUI7UUFDckIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxFQUFFO1lBQ3BDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQWdCLEVBQUUsRUFBRTtnQkFDdEUsT0FBTyxDQUFDLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNuQyxDQUFDLENBQUMsQ0FBQztTQUNKO1FBRUQsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDbEMsQ0FBQztJQVFLLHdCQUF3QixDQUFDLFNBQXdCOztZQUNyRCxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1lBRTFDLElBQUksS0FBSyxHQUFpQixJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3JDLElBQUksR0FBRyxHQUFpQixTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDN0MsSUFBSSxnQkFBZ0IsR0FBcUIsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRTVELElBQUksZ0JBQWdCLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxJQUFJLGdCQUFnQixLQUFLLGdCQUFnQixDQUFDLElBQUksRUFBRTtnQkFDNUYsSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO3dCQUMzRCxJQUFJLFlBQVksR0FBa0IsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDbEUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO3FCQUNwRDtpQkFDRjtxQkFBTTtvQkFDTCxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sU0FBUyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7aUJBQ2pEO2dCQUNELE9BQU8sVUFBVSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxnQkFBZ0IsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUNsRztZQUVELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQztRQUN2QixDQUFDO0tBQUE7SUFRSywyQkFBMkIsQ0FBQyxTQUF3Qjs7WUFDeEQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztZQUUxQyxJQUFJLEtBQUssR0FBaUIsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNyQyxJQUFJLEdBQUcsR0FBaUIsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzdDLElBQUksZ0JBQWdCLEdBQXFCLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUU1RCxJQUFJLGdCQUFnQixLQUFLLGdCQUFnQixDQUFDLElBQUksSUFBSSxnQkFBZ0IsS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUU7Z0JBQzVGLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUN2QixLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDM0QsSUFBSSxZQUFZLEdBQWtCLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ2xFLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztxQkFDdEQ7aUJBQ0Y7cUJBQU07b0JBQ0wsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO2lCQUNqRDtnQkFDRCxPQUFPLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDMUQ7WUFFRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDdkIsQ0FBQztLQUFBO0lBVUQsZ0JBQWdCLENBQUMsSUFBbUI7UUFDbEMsSUFBSSxNQUFNLEdBQWtCLElBQUksQ0FBQztRQUVqQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUk7WUFDL0UsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUU1RCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBR0QsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFRRCxpQkFBaUI7UUFDZixJQUFJLGtCQUFrQixHQUF3QixJQUFJLENBQUM7UUFFbkQsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRTtZQUN6QixLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDN0QsSUFBSSxJQUFJLEdBQWtCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGdCQUFnQixFQUFFO29CQUNoRCxJQUFJLGtCQUFrQixLQUFLLElBQUk7d0JBQzdCLGtCQUFrQixHQUFHLElBQUksSUFBSSxFQUFpQixDQUFDO29CQUNqRCxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQy9CO2FBQ0Y7U0FDRjtRQUNELE9BQU8sa0JBQWtCLENBQUM7SUFDNUIsQ0FBQztJQUdELE9BQU87UUFDTCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQVNELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQU9ELGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUdELGFBQWEsQ0FBQyxRQUFnQixFQUFFLFFBQXVCO1FBQ3JELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFPRCxpQkFBaUIsQ0FBQyxHQUFXO1FBQzNCLElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQztZQUMxRCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFJRCxVQUFVLENBQUMsR0FBVztRQUNwQixJQUFJLFFBQVEsR0FBWSxLQUFLLENBQUM7UUFFOUIsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUN2RSxJQUFJLEdBQUcsR0FBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QyxRQUFRLEdBQUcsQ0FBQyxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUM1QztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFXSyxZQUFZOztZQUNoQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtnQkFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsQ0FBQzthQUVqRDtZQUNELE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRWpELElBQUksSUFBSSxDQUFDLG9CQUFvQjtnQkFDM0IsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztRQUN0QyxDQUFDO0tBQUE7SUFTSyxlQUFlLENBQUMsY0FBdUI7O1lBQzNDLElBQUksSUFBbUIsQ0FBQztZQUV4QixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssS0FBSyxDQUFDLFFBQVE7Z0JBQ3JDLE9BQU87WUFHVCxJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssSUFBSSxJQUFJLENBQUMsY0FBYztnQkFDbEQsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBSTlDLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ2xELEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDaEUsSUFBSSxhQUFhLEdBQWtCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNsRSxNQUFNLGFBQWEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztpQkFDdEM7YUFDRjtZQUVELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFNekMsSUFBSSxtQkFBbUIsR0FBeUIsSUFBSSxLQUFLLEVBQWlCLENBQUM7WUFFM0UsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzdELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDOUQsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUVoQztnQkFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRTtvQkFDL0YsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsY0FBYzt3QkFDdEMsTUFBTSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7aUJBQy9CO3FCQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsZUFBZSxJQUFJLGNBQWM7b0JBQ3RFLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUM3QztRQUNILENBQUM7S0FBQTtJQUlELGlCQUFpQixDQUFDLEdBQVc7UUFDM0IsUUFBUSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUVyRixJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQW9CRCxTQUFTLENBQUMsa0JBQXdCLEVBQUUsVUFBb0I7UUFDdEQsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDeEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBRWhCLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsQ0FBQzs7WUFHckMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBV0QsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBR0QsMEJBQTBCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDO0lBQ3ZDLENBQUM7SUFRRCxhQUFhLENBQUMsSUFBWTtRQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDO0lBT0QsZUFBZTtRQUNiLElBQUksWUFBWSxHQUFXLENBQUMsQ0FBQztRQUU3QixJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFO1lBQ3pCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUM3RCxJQUFJLE9BQU8sR0FBa0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsZ0JBQWdCO29CQUNqRCxZQUFZLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQzthQUNuQztTQUNGO1FBRUQsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUlELGdCQUFnQjtRQUNkLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBRUQsUUFBUSxDQUFDLFFBQWdCO1FBQ3ZCLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFNRCxhQUFhLENBQUMsSUFBbUI7UUFDL0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQU9ELGtCQUFrQjtRQUNoQixJQUFJLGNBQWMsR0FBVyxDQUFDLENBQUM7UUFDL0IsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLGNBQWMsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFRRCxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQVVELGlCQUFpQjtRQUNmLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzdELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUM7U0FDOUM7SUFDSCxDQUFDO0lBTUQsa0JBQWtCO1FBQ2hCLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxJQUFJLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLElBQUksRUFBaUIsQ0FBQztZQUVoRCxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFO2dCQUN6QixJQUFJLFdBQVcsR0FBVyxVQUFVLENBQUM7Z0JBQ3JDLElBQUkscUJBQXFCLEdBQVksSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7Z0JBRXBFLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUM3RCxJQUFJLElBQUksR0FBa0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBRWxELElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7d0JBQ2hELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUUvQixJQUFJLHFCQUFxQixFQUFFOzRCQUN6QixJQUFJLElBQUksR0FBYSxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLENBQUM7NEJBRWpGLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtnQ0FDakIsSUFBSSxRQUFRLEdBQVcsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7Z0NBQ3RELElBQUksUUFBUSxHQUFHLFdBQVc7b0NBQ3hCLFdBQVcsR0FBRyxRQUFRLENBQUM7NkJBQzFCO3lCQUNGO3FCQUNGO2lCQUNGO2dCQUVELElBQUksV0FBVyxLQUFLLEtBQUssQ0FBQyxRQUFRLElBQUkscUJBQXFCLEVBQUU7b0JBQzNELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxXQUFXLENBQUM7aUJBQ3hDO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFRRCxZQUFZLENBQUMsU0FBd0I7UUFDbkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUM7SUFDbkMsQ0FBQztJQVFELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUdELGtDQUFrQztRQUNoQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUlLLHdCQUF3Qjs7WUFDNUIsSUFBSSxDQUFTLENBQUM7WUFDZCxJQUFJLElBQUksR0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN6RSxJQUFJLElBQWMsQ0FBQztZQUNuQixJQUFJLE9BQU8sR0FBWSxLQUFLLENBQUM7WUFDN0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3JDLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUU7b0JBQ3ZCLE9BQU8sR0FBRyxJQUFJLENBQUM7b0JBQ2YsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7aUJBQzNCO2FBQ0Y7UUFDSCxDQUFDO0tBQUE7SUFHRCxhQUFhLENBQUMsSUFBbUI7UUFDL0IsSUFBSSxHQUFXLENBQUM7UUFDaEIsSUFBSSxNQUFNLEdBQWtCLElBQUksQ0FBQztRQUVqQyxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBQ1gsT0FBTyxHQUFHLFlBQVksYUFBYSxFQUFFO1lBQ25DLElBQUksUUFBUSxHQUFrQixHQUFHLENBQUM7WUFDbEMsSUFBSSxRQUFRLENBQUMsWUFBWSxFQUFFLEVBQUU7Z0JBQzNCLE1BQU0sR0FBRyxRQUFRLENBQUM7Z0JBQ2xCLE1BQU07YUFDUDtZQUNELEdBQUcsR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDNUI7UUFHRCxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7WUFDbEIsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZELEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDOUIsSUFBb0IsR0FBSSxDQUFDLFlBQVksRUFBRSxFQUFFO29CQUN2QyxNQUFNLEdBQWtCLEdBQUcsQ0FBQztvQkFDNUIsTUFBTTtpQkFDUDthQUNGO1NBQ0Y7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBTUQsV0FBVyxDQUFDLElBQW1CO1FBQzdCLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNqQixLQUFLLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQztZQUN0QyxLQUFLLGFBQWEsQ0FBQyxjQUFjLENBQUM7WUFDbEMsS0FBSyxhQUFhLENBQUMsZUFBZSxDQUFDO1lBQ25DLEtBQUssYUFBYSxDQUFDLGNBQWMsQ0FBQztZQUNsQyxLQUFLLGFBQWEsQ0FBQyxlQUFlO2dCQUNoQyxPQUFPLElBQUksQ0FBQztZQUVkO2dCQUNFLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO0lBQ0gsQ0FBQztJQUtNLHNCQUFzQjtRQUMzQixJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BGLElBQUksS0FBSyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2hELEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDckQsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFxQ0QsaUJBQWlCO1FBQ2YsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUksRUFBRTtZQUNqQyxJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ2hFLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7U0FDdEM7SUFDSCxDQUFDO0lBVUQsa0JBQWtCLENBQUMsTUFBYyxFQUFFLDBCQUErQixFQUFFLFNBQW1CO1FBQ3BGLElBQUksT0FBTywwQkFBMEIsSUFBSSxTQUFTLEVBQUM7WUFDbEQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1NBQy9EOztZQUNDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsMEJBQTBCLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVPLG9CQUFvQixDQUFDLE1BQWMsRUFBRSxTQUFrQjtRQUM3RCxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsTUFBYyxFQUFFLGVBQXVCLEVBQUUsU0FBa0I7UUFDdEYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQVFELGdCQUFnQixDQUFDLE1BQWUsRUFBRSxlQUF3QixFQUFFLFNBQW1CO1FBQzdFLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDMUIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQU1ELDZCQUE2QixDQUFDLElBQVk7UUFDeEMsSUFBSSxRQUFRLEdBQXdCLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDdkQsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO1lBQ3BCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNoRCxJQUFJLE9BQU8sR0FBa0IsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEQsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM1QjtTQUNGO1FBQ0QsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUk7WUFDOUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQVFELFFBQVE7UUFDTixPQUFPLFlBQVksR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUM7SUFDMUQsQ0FBQztJQUdELDRCQUE0QixDQUFDLE9BQXNCLEVBQUUsOEJBQXVDO1FBQzFGLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQztZQUM1RCxPQUFPLEtBQUssQ0FBQztRQUdmLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUdELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUdTLGdCQUFnQixDQUFDLFlBQW9CO1FBQzdDLElBQUksWUFBWSxLQUFLLElBQUk7WUFDdkIsT0FBTyxLQUFLLENBQUM7UUFHZixJQUFJLE1BQU0sR0FBYyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDbEUsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQztZQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ3pCLElBQUksWUFBWSxLQUFLLFlBQVksQ0FBQyxXQUFXO1lBQ2hELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDdkMsSUFBSSxZQUFZLEtBQUssWUFBWSxDQUFDLGNBQWMsRUFBRTtZQUNyRCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7U0FDeEM7YUFBTSxJQUFJLFVBQVUsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDaEQsTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDL0IsT0FBTyxLQUFLLENBQUM7U0FDZDs7WUFDQyxPQUFPLEtBQUssQ0FBQztRQUVmLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQVVNLFlBQVksQ0FBQyxHQUFXO1FBQzdCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7WUFDdEMsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELElBQUksR0FBRyxHQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksR0FBRyxLQUFLLElBQUk7WUFDZCxPQUFPLEtBQUssQ0FBQztRQUVmLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQztJQUNyQixDQUFDO0lBSU8sd0JBQXdCO1FBQzlCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzdELElBQUksSUFBSSxHQUFrQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRCxJQUFJLFlBQVksR0FBaUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3RSxJQUFJLFlBQVksS0FBSyxJQUFJO2dCQUN2QixZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQU1PLHFCQUFxQjtRQUMzQixJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssSUFBSSxFQUFFO1lBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxJQUFJLEVBQWlCLENBQUM7WUFDL0MsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzdELElBQUksT0FBTyxHQUFrQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxnQkFBZ0I7b0JBQ2pELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3BDO1NBQ0Y7SUFDSCxDQUFDO0lBUU8sU0FBUyxDQUFDLEdBQVc7UUFDM0IsUUFBUSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUVoRixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLEdBQUc7WUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRTdCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBR08sV0FBVztRQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFRTyxXQUFXLENBQUMsVUFBbUI7UUFDckMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFTTyxXQUFXLENBQUMsTUFBYyxFQUFFLFVBQW1CO1FBRXJELElBQUksV0FBVyxHQUFrQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFdkQsSUFBSSxXQUFXLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtZQUN6RCxJQUFJLEtBQUssR0FBVyxNQUFNLENBQUM7WUFDM0IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUU7Z0JBQ3ZDLEtBQUssR0FBRyxZQUFZLENBQUMsZUFBZSxDQUFDO1lBRXZDLElBQUksVUFBVSxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUU5QyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztnQkFDM0IsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxjQUFjLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQzVHO1NBQ0Y7SUFDSCxDQUFDO0lBT08sa0JBQWtCO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFHTyxrQkFBa0IsQ0FBQyxNQUFjLEVBQUUsZUFBdUIsRUFBRSxTQUFrQjtRQUNwRixJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxFQUFFO1lBQ2hDLFFBQVEsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFDakcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGVBQWUsQ0FBQztZQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsNkJBQTZCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLHdCQUF3QixHQUFHLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDM0Y7SUFDSCxDQUFDO0lBTU0seUJBQXlCLENBQUMsR0FBVyxFQUFFLEtBQWE7UUFDdkQsSUFBSSxRQUFRLEdBQXdCLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDdkQsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO1lBQ2xCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM5QyxJQUFJLE9BQU8sR0FBa0IsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6QyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUNwQztTQUNKO0lBQ0wsQ0FBQztDQUNGO0FBTUQsTUFBTSxPQUFPLEdBQUc7SUFNZCxZQUFZLE9BQWlCLEVBQUUsU0FBbUI7UUFMbEQsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUN6QixjQUFTLEdBQVksS0FBSyxDQUFDO1FBS3pCLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTyxhQUFhO1FBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ3hCLENBQUM7SUFFTyxhQUFhLENBQUMsT0FBZ0IsRUFBRSxTQUFrQjtRQUN4RCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUM3QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQcm9wUGFyZW50SW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vZ3VpL1Byb3BQYXJlbnRJbnRlcmZhY2UnO1xyXG5pbXBvcnQge1xyXG4gIENvbnN0YW50cyxcclxuICBMb2dnZXJfTG9nTGV2ZWxzLFxyXG4gIE1nQ29udHJvbFR5cGUsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZSxcclxuICBTdHJVdGlsLFxyXG4gIFRhYmJpbmdPcmRlclR5cGUsXHJcbiAgV2luZG93VHlwZSxcclxuICBYTUxDb25zdGFudHMsXHJcbiAgWG1sUGFyc2VyXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcbmltcG9ydCB7IERlYnVnLCBJSGFzaENvZGUsIEludDMyLCBMaXN0LCBOU3RyaW5nLCBSZWZQYXJhbSwgU3RhY2ssIFN0cmluZ0J1aWxkZXIgfSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7IE1nQ29udHJvbEJhc2UgfSBmcm9tICcuL01nQ29udHJvbEJhc2UnO1xyXG5pbXBvcnQgeyBQcm9wVGFibGUgfSBmcm9tICcuL1Byb3BUYWJsZSc7XHJcbmltcG9ydCB7IEd1aVRhc2tCYXNlIH0gZnJvbSAnLi4vdGFza3MvR3VpVGFza0Jhc2UnO1xyXG5pbXBvcnQgeyBDb250cm9sVGFibGUgfSBmcm9tICcuL0NvbnRyb2xUYWJsZSc7XHJcbmltcG9ydCB7IE1hbmFnZXIgfSBmcm9tICcuLi8uLi9NYW5hZ2VyJztcclxuaW1wb3J0IHsgRXZlbnRzIH0gZnJvbSAnLi4vLi4vRXZlbnRzJztcclxuaW1wb3J0IHsgUHJvcGVydHkgfSBmcm9tICcuL1Byb3BlcnR5JztcclxuaW1wb3J0IHsgQ29tbWFuZFR5cGUsIEh0bWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vLi4vR3VpRW51bXMnO1xyXG5pbXBvcnQgeyBOVU1fVFlQRSB9IGZyb20gJy4uL2RhdGEvTlVNX1RZUEUnO1xyXG5pbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gJy4uLy4uL0NvbW1hbmRzJztcclxuaW1wb3J0IHsgR3VpRmllbGRCYXNlIH0gZnJvbSAnLi4vZGF0YS9HdWlGaWVsZEJhc2UnO1xyXG5pbXBvcnQgeyBQcm9wSW50ZXJmYWNlIH0gZnJvbSAnLi9Qcm9wSW50ZXJmYWNlJztcclxuaW1wb3J0IHsgR3VpQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vR3VpQ29uc3RhbnRzJztcclxuaW1wb3J0IHsgR3VpRm9ybVByb3BlcnR5QWRhcHRlciB9IGZyb20gJy4vR3VpRm9ybVByb3BlcnR5QWRhcHRlcic7XHJcbmltcG9ydCB7IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgfSBmcm9tICcuL0d1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXInO1xyXG5cclxuXHJcbmNvbnN0IGRlbGltaXRlcjogc3RyaW5nID0gJywgJztcclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vIGRhdGEgZm9yIDxmb3JtPi4uLjwvZm9ybT5cclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1nRm9ybUJhc2UgZXh0ZW5kcyBHdWlGb3JtUHJvcGVydHlBZGFwdGVyIGltcGxlbWVudHMgUHJvcFBhcmVudEludGVyZmFjZSwgSUhhc2hDb2RlIHtcclxuICBJbkluaXRGb3JtOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEN0cmxUYWI6IENvbnRyb2xUYWJsZSA9IG51bGw7XHJcbiAgLy8gdW50aWwgdGhlIGZvcm0gaXMgcmVmcmVzaGVkIGluIHRoZSBmaXJzdCB0aW1lXHJcbiAgRm9ybVJlZnJlc2hlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFJlZnJlc2hSZXBlYXRhYmxlQWxsb3dlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFJvd3M6IExpc3Q8Um93PiA9IG51bGw7XHJcbiAgTW9kYWxGb3Jtc0NvdW50OiBudW1iZXIgPSAwO1xyXG4gIEVycm9yT2NjdXJlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEZvcm1Jc246IG51bWJlciA9IDA7XHJcbiAgTmFtZTogc3RyaW5nID0gbnVsbDtcclxuICBPcGVuZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0xlZ2FsRm9ybTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFBCSW1hZ2VzTnVtYmVyOiBudW1iZXIgPSAwO1xyXG4gIGlnbm9yZUZpcnN0UmVmcmVzaFRhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBQYXJlbnRGb3JtOiBNZ0Zvcm1CYXNlID0gbnVsbDtcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByb3RlY3RlZCBfZGVzdFRibFJvdzogbnVtYmVyID0gSW50MzIuTWluVmFsdWU7XHJcbiAgcHJvdGVjdGVkIF9maXJzdFRhYmxlVGFiT3JkZXI6IG51bWJlciA9IDA7ICAgICAgICAgICAgLy8gdGFiIG9yZGVyIG9mIGZpcnN0IGNoaWxkIG9mIHRhYmxlXHJcbiAgcHJvdGVjdGVkIF9pblJlZnJlc2hEaXNwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJvdGVjdGVkIF9pblJlc3RvcmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcm90ZWN0ZWQgX2xhc3RSb3dTZW50OiBudW1iZXIgPSAtMTsgICAgICAgICAgICAgICAgICAvLyBsYXN0IHJvdyBzZW50IHJvIGd1aSB0aHJlYWRcclxuICBwcm90ZWN0ZWQgX3ByZXZHdWlUb3BJbmRleDogbnVtYmVyID0gLTE7ICAgICAgICAgICAgICAvLyBGb3IgcGFnaW5hdGVkIHRhYmxlIGl0J3MgR3VpVG9wSW5kZXggZWxzZSBpdCdzIGR2VG9wSW5kZXhcclxuICBwcm90ZWN0ZWQgX3Byb3BUYWI6IFByb3BUYWJsZSA9IG51bGw7XHJcbiAgcHJvdGVjdGVkIF9yb3dzSW5QYWdlOiBudW1iZXIgPSAxO1xyXG4gIHByb3RlY3RlZCBfbWF4Um93c0luUGFnaW5hdGVkVGFibGU6IG51bWJlciA9IDA7ICAgICAgIC8vIG1heCBubyBvZiByb3dzIGluIHBhZ2luYXRlZCB0YWJsZVxyXG4gIHByb3RlY3RlZCBfc3ViRm9ybUN0cmw6IE1nQ29udHJvbEJhc2UgPSBudWxsO1xyXG4gIHByb3RlY3RlZCBfdGFibGVNZ0NvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSBudWxsO1xyXG4gIHByb3RlY3RlZCBfdGFibGVJdGVtc0NvdW50OiBudW1iZXIgPSAwOyAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiByb3dzIGluIHRoZSB0YWJsZVxyXG4gIHByb3RlY3RlZCBfdGFibGVSZWZyZXNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcm90ZWN0ZWQgX3Rhc2s6IEd1aVRhc2tCYXNlID0gbnVsbDsgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGFzayB0byB3aGljaCB0aGUgY3VycmVudCBmb3JtIGJlbG9uZ3NcclxuICBwcm90ZWN0ZWQgX3RvcEluZGV4VXBkYXRlZDogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAvLyB0cnVlIGlmIGEgdG9wIGluZGV4IHdhcyB1cGRhdGVkXHJcblxyXG4gIC8vIEZvcm0gcmVwcmVzZW50aW5nIHRoZSBpbnRlcm5hbCBoZWxwIHdpbmRvdy5IZXJlIHRoZSBpbnRlcm5hbCBmb3JtIG9iamVjdCBpcyBrZXB0IG9uIHRoZSBmb3JtIG9iamVjdCBpdHNlbGYuXHJcbiAgcHJvdGVjdGVkIF90cmFuc2ZlcmluZ0RhdGE6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgLy8gcm93cyBhcmUgcmVxdWVzdGVkIGZvciBhIEdVSSB0aHJlYWRcclxuICAvLyBwcmV2ZW50cyByZWZyZXNoIG9mIERpc3BsYXlMaXN0IGZvciB0aGUgY29ycmVzcG9uZGluZyBjb250cm9scyBhbmQgY3VyclJlY0NvbXB1dGUoUkMpXHJcbiAgcHJpdmF0ZSBfYWxsb3dlZFN1YmZvcm1SZWNvbXB1dGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByaXZhdGUgX2NvbmNyZXRlV2luZG93VHlwZTogV2luZG93VHlwZSA9IDA7XHJcbiAgcHJpdmF0ZSBfY29udGFpbmVyQ3RybDogTWdDb250cm9sQmFzZSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfZmlyc3RSZWZyZXNoT2ZQcm9wczogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIHByaXZhdGUgX3ByZXZTZWxJbmRleDogbnVtYmVyID0gLTE7XHJcbiAgcHJpdmF0ZSBfc2hvdWxkQ3JlYXRlVG9vbGJhcjogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgLy8gaWYgdG8gY3JlYXRlIHRvb2xiYXJcclxuICBwcml2YXRlIF90YWJsZUNoaWxkcmVuOiBMaXN0PE1nQ29udHJvbEJhc2U+ID0gbnVsbDsgICAvLyBDYW4ndCB1c2UgTGlzdDxUPlxyXG4gIHByaXZhdGUgX3RhYmxlQ29sdW1uczogTGlzdDxNZ0NvbnRyb2xCYXNlPiA9IG51bGw7XHJcbiAgcHJvdGVjdGVkIF91c2VyU3RhdGVJZDogc3RyaW5nID0gJyc7XHJcblxyXG4gIHByaXZhdGUgZGlzcGxheUxpbmU6IG51bWJlciA9IDA7XHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5fcHJvcFRhYiA9IG5ldyBQcm9wVGFibGUodGhpcyk7XHJcbiAgICB0aGlzLkN0cmxUYWIgPSBuZXcgQ29udHJvbFRhYmxlKCk7XHJcbiAgICB0aGlzLlJvd3MgPSBuZXcgTGlzdCgpO1xyXG4gICAgdGhpcy5fY29uY3JldGVXaW5kb3dUeXBlID0gPFdpbmRvd1R5cGU+MDtcclxuICAgIHRoaXMuUGFyZW50Rm9ybSA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXQgRGlzcGxheUxpbmUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlMaW5lO1xyXG4gIH1cclxuXHJcbiAgc2V0IERpc3BsYXlMaW5lKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuZGlzcGxheUxpbmUgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBVbmlxdWVOYW1lKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5HZXRDb21wdXRlZFByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUk1fTkFNRSkgIT0gbnVsbClcclxuICAgICAgcmV0dXJuIHRoaXMuR2V0Q29tcHV0ZWRQcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JNX05BTUUpLkdldENvbXB1dGVkVmFsdWUoKTtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXQgVGFza1RhZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0VGFzaygpLmdldFRhc2tUYWcoKTtcclxuICB9XHJcblxyXG5cclxuICBnZXQgVGFibGVDaGlsZHJlbigpOiBMaXN0PE1nQ29udHJvbEJhc2U+IHtcclxuICAgIGlmICh0aGlzLl90YWJsZUNoaWxkcmVuID09PSBudWxsKVxyXG4gICAgICB0aGlzLmJ1aWxkVGFibGVDaGlsZHJlbigpO1xyXG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlQ2hpbGRyZW47XHJcbiAgfVxyXG5cclxuICBzZXQgVGFibGVDaGlsZHJlbih2YWx1ZTogTGlzdDxNZ0NvbnRyb2xCYXNlPikge1xyXG4gICAgdGhpcy5fdGFibGVDaGlsZHJlbiA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IFNob3VsZENyZWF0ZVRvb2xiYXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2hvdWxkQ3JlYXRlVG9vbGJhcjtcclxuICB9XHJcblxyXG4gIGdldCBBbGxvd2VkU3ViZm9ybVJlY29tcHV0ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9hbGxvd2VkU3ViZm9ybVJlY29tcHV0ZTtcclxuICB9XHJcblxyXG4gIHNldCBBbGxvd2VkU3ViZm9ybVJlY29tcHV0ZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fYWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUgPSB2YWx1ZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgdHJ1ZSBmb3IgYSBGaXRUb01kaSB3aW5kb3cuXHJcblxyXG4gIGdldCBDb25jcmV0ZVdpbmRvd1R5cGUoKTogV2luZG93VHlwZSB7XHJcbiAgICBpZiAodGhpcy5fY29uY3JldGVXaW5kb3dUeXBlID09PSA8V2luZG93VHlwZT4wKSB7XHJcbiAgICAgIGxldCB3aW5kb3dUeXBlOiBXaW5kb3dUeXBlID0gPFdpbmRvd1R5cGU+dGhpcy5HZXRDb21wdXRlZFByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1dJTkRPV19UWVBFKS5HZXRDb21wdXRlZFZhbHVlSW50ZWdlcigpO1xyXG4gICAgICBpZiAodGhpcy5QYXJlbnRGb3JtID09PSBudWxsIHx8IHdpbmRvd1R5cGUgIT09IFdpbmRvd1R5cGUuT3ZlcmxheSlcclxuICAgICAgICB3aW5kb3dUeXBlID0gV2luZG93VHlwZS5EZWZhdWx0O1xyXG5cclxuICAgICAgdGhpcy5fY29uY3JldGVXaW5kb3dUeXBlID0gd2luZG93VHlwZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9jb25jcmV0ZVdpbmRvd1R5cGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgdHJ1ZSBmb3IgRmxvYXRpbmcsIFRvb2wgb3IgTW9kYWwuXHJcblxyXG4gIHNldCBDb25jcmV0ZVdpbmRvd1R5cGUodmFsdWU6IFdpbmRvd1R5cGUpIHtcclxuICAgIHRoaXMuX2NvbmNyZXRlV2luZG93VHlwZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBUaGlzIG1ldGhvZCBlbmFibGVzIGEgc3BlY2lmaWMgYWN0aW9uIG9uIGFsbCB0aGUgbWVudSBvYmplY3RzIG9mIHRoZSBmb3JtIGFuZCBpdHMgY2hpbGRyZW4nc1xyXG4gIC8vLyBtZW51cy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYWN0aW9uXCI+YWN0aW9uIHdob3NlIHN0YXRlIGhhcyBjaGFuZ2VkPC9wYXJhbT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgU2hvdWxkUHV0QWN0T25Gb3JtQ2xvc2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgYSBwcm9wZXJ0eSBvZiB0aGUgZm9ybSB0aGF0IGFscmVhZHkgd2FzIGNvbXB1dGVkIGJ5IGl0cyBJZFxyXG4gIC8vLyBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjcmVhdGUgYSBwcm9wZXJ0eSBpZiBpdCBpc24ndCBleGlzdC5cclxuICAvLy8gTWF5IHdlIG5lZWQgdG8gY3JlYXRlIGEgcHJvcGVydHkgYW5kIHVzZSBpdHMgZGVmYXVsdCB2YWx1ZS5cclxuICAvLy8gSW4gUGhhc2UgMiBpbiBSZWZyZXNoUHJvcGVydGllcyBtZXRob2Qgd2UnbGwgY3JlYXRlIGFuZCBjb21wdXRlIHByb3BlcnRpZXMsXHJcbiAgLy8vIHBlcmhhcHMgd2UgbmVlZCBjcmVhdGUgYWxsIHByb3BlcnRpZXMgbm90IG9ubHkgdGhvc2UgdGhhdCBhcmUgZGlmZmVyZW50IGZyb20gZGVmYXVsdC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByb3RlY3RlZCBzdGF0aWMgU2hvdWxkQmVoYXZlQXNNb2RhbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2hlY2tzIGlmIHByb3BlcnR5IGhhcyBleHByZXNzaW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwcm9wSWRcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc3RhdGljIENvbnZlcnRBcnJheUxpc3RUb1N0cmluZyhpdGVtczogTGlzdDxzdHJpbmc+LCBpc0l0ZW1OdW1UeXBlOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGxldCBmcm9tOiBzdHJpbmdbXSA9IFsnXFxcXCcsICctJywgJywnXTtcclxuICAgIGxldCB0bzogc3RyaW5nW10gPSBbJ1xcXFxcXFxcJywgJ1xcXFwtJywgJ1xcXFwsJ107XHJcbiAgICBsZXQgc3RyaW5nQnVpbGRlcjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICBsZXQgblVNX1RZUEU6IE5VTV9UWVBFO1xyXG5cclxuICAgIGZvciAobGV0IGluZGV4OiBudW1iZXIgPSAwOyBpbmRleCA8IGl0ZW1zLmxlbmd0aDsgaW5kZXggPSBpbmRleCArIDEpIHtcclxuICAgICAgaWYgKGlzSXRlbU51bVR5cGUpIHtcclxuICAgICAgICBuVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSg8c3RyaW5nPml0ZW1zLmdldF9JdGVtKGluZGV4KSk7XHJcbiAgICAgICAgaXRlbXMuc2V0X0l0ZW0oaW5kZXgsIG5VTV9UWVBFLnRvX2RvdWJsZSgpLnRvU3RyaW5nKCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZChTdHJVdGlsLnNlYXJjaEFuZFJlcGxhY2UoPHN0cmluZz5pdGVtcy5nZXRfSXRlbShpbmRleCksIGZyb20sIHRvKSk7XHJcblxyXG4gICAgICBpZiAoaW5kZXggPCBpdGVtcy5sZW5ndGggLSAxKVxyXG4gICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKGRlbGltaXRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcGFyc2UgdGhlIGZvcm0gc3RydWN0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbmNyZWFzZVwiPjwvcGFyYW0+XHJcbiAgVXBkYXRlTW9kYWxGb3Jtc0NvdW50KG1nRm9ybUJhc2U6IE1nRm9ybUJhc2UsIGluY3JlYXNlOiBib29sZWFuKTogdm9pZCB7XHJcblxyXG4gICAgaWYgKGluY3JlYXNlKVxyXG4gICAgICB0aGlzLk1vZGFsRm9ybXNDb3VudCArPSAxO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLk1vZGFsRm9ybXNDb3VudCAtPSAxO1xyXG5cclxuICAgIEV2ZW50cy5TZXRNb2RhbChtZ0Zvcm1CYXNlLCBpbmNyZWFzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFRvIGFsbG9jYXRlIGFuZCBmaWxsIGlubmVyIG9iamVjdHMgb2YgdGhlIGNsYXNzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3VuZFRhZ05hbWVcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIEV2YWx1YXRlRXhwcmVzc2lvbihleHBJZDogbnVtYmVyLCByZXNUeXBlOiBTdG9yYWdlQXR0cmlidXRlLCBsZW5ndGg6IG51bWJlciwgY29udGVudFR5cGVVbmljb2RlOiBib29sZWFuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICByZXNDZWxsVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgYWx3YXlzRXZhbHVhdGU6IGJvb2xlYW4sIHdhc0V2YWx1YXRlZDogUmVmUGFyYW08Ym9vbGVhbj4pOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3Rhc2suRXZhbHVhdGVFeHByZXNzaW9uKGV4cElkLCByZXNUeXBlLCBsZW5ndGgsIGNvbnRlbnRUeXBlVW5pY29kZSwgcmVzQ2VsbFR5cGUsIHRydWUsIHdhc0V2YWx1YXRlZCk7XHJcbiAgfVxyXG5cclxuICBHZXRFeHByZXNzaW9uU3RvcmFnZShleHBJZDogbnVtYmVyKTogU3RvcmFnZUF0dHJpYnV0ZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFzay5HZXRFeHByZXNzaW9uU3RvcmFnZShleHBJZCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbml0aWFsaXphdGlvbi5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBjaGVja0lmRXhpc3RQcm9wKHByb3BJZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgZXhpc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLl9wcm9wVGFiICE9PSBudWxsKSB7XHJcbiAgICAgIGxldCBwcm9wQnlJZDogUHJvcGVydHkgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKHByb3BJZCk7XHJcbiAgICAgIGV4aXN0ID0gKHByb3BCeUlkICE9PSBudWxsKTtcclxuICAgIH1cclxuICAgIHJldHVybiBleGlzdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBGaWxsIG5hbWUgbWVtYmVyIG9mIHRoZSBjbGFzc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+dGhlIElkIG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgZ2V0UHJvcChwcm9wSWQ6IG51bWJlcik6IFByb3BlcnR5IHtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuX3Byb3BUYWIgIT09IG51bGwpIHtcclxuICAgICAgcHJvcCA9IHRoaXMuX3Byb3BUYWIuZ2V0UHJvcEJ5SWQocHJvcElkKTtcclxuXHJcbiAgICAgIC8vIGlmIHRoZSBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0IHRoZW4gY3JlYXRlIGEgbmV3IHByb3BlcnR5IGFuZCBnaXZlIGl0IHRoZSBkZWZhdWx0IHZhbHVlXHJcbiAgICAgIC8vIGluIGFkZGl0aW9uIGFkZCB0aGlzIHByb3BlcnR5IHRvIHRoZSBwcm9wZXJ0aWVzIHRhYmxlXHJcbiAgICAgIGlmIChwcm9wID09PSBudWxsKSB7XHJcbiAgICAgICAgcHJvcCA9IFByb3BlcnR5LmdldERlZmF1bHRQcm9wKHByb3BJZCwgR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0ZPUk0sIHRoaXMpO1xyXG4gICAgICAgIGlmIChwcm9wICE9PSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5fcHJvcFRhYi5hZGRQcm9wKHByb3ApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJvcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBmb3IgZWFjaCBjb250cm9sIGJ1aWxkIHRoZSBsaXN0IG9mIGFsbCB0aGUgY29udHJvbHMgdGhhdCBhcmUgbGlua2VkIHRvIGl0XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+dGhlIElkIG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgR2V0Q29tcHV0ZWRQcm9wZXJ0eShwcm9wSWQ6IG51bWJlcik6IFByb3BlcnR5IHtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuX3Byb3BUYWIgIT09IG51bGwpXHJcbiAgICAgIHByb3AgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKHByb3BJZCk7XHJcblxyXG4gICAgcmV0dXJuIHByb3A7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBQcm9wZXJ0eUhhc0V4cHJlc3Npb24ocHJvcElkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuX3Byb3BUYWIuZ2V0UHJvcEJ5SWQocHJvcElkKTtcclxuICAgIHJldHVybiBwcm9wICE9PSBudWxsICYmIHByb3AuaXNFeHByZXNzaW9uKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldENvbXBJZHgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAodGhpcy5nZXRUYXNrKCkgPT09IG51bGwpID8gMCA6IHRoaXMuZ2V0VGFzaygpLmdldENvbXBJZHgoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhcnJhbmdlIHpvcmRlciBmb3IgY29udHJvbHMuIHJlY3Vyc2l2ZSBmdW5jdGlvbi5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIElzRmlyc3RSZWZyZXNoT2ZQcm9wcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9maXJzdFJlZnJlc2hPZlByb3BzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIGxpc3Qgb2YgYWxsIGNvbHVtbnMgY29udHJvbHNcclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRGb3JtKCk6IE1nRm9ybUJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrcyBpZiBhbiBpbnRlcm5hbCBGaXQgdG8gTURJIGZvcm0gbmVlZHMgdG8gYmUgY3JlYXRlZCB0byBob2xkIHRoZSBNYWluIFByb2dyYW0gY29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tSZWZcIj5yZWZlcmVuY2UgdG8gdGhlIG93bmVyVGFzayBvZiB0aGlzIGZvcm08L3BhcmFtPlxyXG4gIGZpbGxEYXRhKHRhc2tSZWY6IEd1aVRhc2tCYXNlKTogdm9pZCB7XHJcbiAgICBsZXQgcGFyc2VyOiBYbWxQYXJzZXIgPSBNYW5hZ2VyLkdldEN1cnJlbnRSdW50aW1lQ29udGV4dCgpLlBhcnNlcjtcclxuXHJcbiAgICBpZiAodGhpcy5fdGFzayA9PT0gbnVsbCAmJiB0YXNrUmVmICE9PSBudWxsKVxyXG4gICAgICB0aGlzLl90YXNrID0gdGFza1JlZjtcclxuXHJcbiAgICB3aGlsZSAodGhpcy5pbml0SW5uZXJPYmplY3RzKHBhcnNlci5nZXROZXh0VGFnKCkpKSB7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaW5pdCgpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLkN0cmxUYWIuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IGN0cmw6IE1nQ29udHJvbEJhc2UgPSB0aGlzLkN0cmxUYWIuZ2V0Q3RybChpKTtcclxuICAgICAgLy8gaW5pdGlhbGl6ZXMgdGhlIHN1YmZvcm0gY29udHJvbHNcclxuICAgICAgY3RybC5Jbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYnVpbGQgbGlzdHMgb2YgbGlua2VkIGNvbnRyb2xzIG9uIHRoZWlyIHBhcmVudHNcclxuICAgIHRoaXMuYnVpbGRMaW5rZWRDb250cm9sc0xpc3RzKCk7XHJcblxyXG4gICAgLy8gYnVpbGQgbGlzdCBvZiBjb2x1bW5zIGFuZCBub24gY29sdW1uc1xyXG4gICAgdGhpcy5idWlsZFRhYmxlQ29sdW1uc0xpc3QoKTtcclxuICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xyXG5cclxuICAgIHRoaXMuX3Rhc2suc2V0S2V5Ym9hcmRNYXBwaW5nU3RhdGUoQ29uc3RhbnRzLkFDVF9TVFRfVEJMX1NDUkVFTl9NT0RFLCB0aGlzLmlzU2NyZWVuTW9kZSgpKTtcclxuICAgIHRoaXMuX3Rhc2suc2V0S2V5Ym9hcmRNYXBwaW5nU3RhdGUoQ29uc3RhbnRzLkFDVF9TVFRfVEJMX0xFRlRfVE9fUklHSFQsICF0aGlzLkdldENvbXB1dGVkUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSEVCUkVXKS5HZXRDb21wdXRlZFZhbHVlQm9vbGVhbigpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBvcmRlciB0aGUgc3BsaXR0ZXIgY29udGFpbmVyIGNoaWxkcmVuLiBUaGUgY2hpbGQgdGhhdCBpcyBkb2NrZWQgdG8gZmlsbCBpcyBhZGRlZCBmaXJzdCwgdGhlblxyXG4gIC8vLyAgIHRoZSBzcGxpdHRlciBjb250cm9sIGFuZCBmaW5hbGx5IHRoZSBjaGlsZCB0aGF0IGlzIGRvY2tlZCBlaXRoZXIgdG8gdGhlIHRvcCBvciB0byB0aGUgbGVmdFxyXG5cclxuICAvLy8gPHJldHVybnM+IGVuZCBJbmRleCBvZiB0aGU8Zm9ybSAuLi4+IHN1YnRhZzwvcmV0dXJucz5cclxuICBmaWxsTmFtZShmb3JtVGFnOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBwYXJzZXI6IFhtbFBhcnNlciA9IE1hbmFnZXIuR2V0Q3VycmVudFJ1bnRpbWVDb250ZXh0KCkuUGFyc2VyO1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG5cclxuICAgIGlmIChlbmRDb250ZXh0ICE9PSAtMSAmJiBlbmRDb250ZXh0IDwgcGFyc2VyLmdldFhNTGRhdGEoKS5sZW5ndGgpIHtcclxuICAgICAgLy8gbGFzdCBwb3NpdGlvbiBvZiBpdHMgdGFnXHJcbiAgICAgIGxldCB0YWc6IHN0cmluZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKGZvcm1UYWcpICsgZm9ybVRhZy5sZW5ndGgpO1xyXG5cclxuICAgICAgbGV0IHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+ID0gWG1sUGFyc2VyLmdldFRva2VucyhwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG5cclxuICAgICAgbGV0IGF0dHJpYnV0ZTogc3RyaW5nO1xyXG4gICAgICBsZXQgdmFsdWVTdHI6IHN0cmluZztcclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBpID0gaSArIDIpIHtcclxuICAgICAgICBhdHRyaWJ1dGUgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgICAgdmFsdWVTdHIgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaSArIDEpO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKGF0dHJpYnV0ZSkge1xyXG4gICAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9OQU1FOlxyXG4gICAgICAgICAgICB0aGlzLk5hbWUgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIGlmIChFdmVudHMuU2hvdWxkTG9nKExvZ2dlcl9Mb2dMZXZlbHMuR3VpKSlcclxuICAgICAgICAgICAgICBFdmVudHMuV3JpdGVHdWlUb0xvZyhOU3RyaW5nLkZvcm1hdCgnUGFyc2luZyBmb3JtIFwiezB9XCInLCB0aGlzLk5hbWUpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0lTX0ZSQU1FU0VUOlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfSVNfTElHQUxfUkNfRk9STTpcclxuICAgICAgICAgICAgdGhpcy5pc0xlZ2FsRm9ybSA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1BCX0lNQUdFU19OVU1CRVI6XHJcbiAgICAgICAgICAgIHRoaXMuUEJJbWFnZXNOdW1iZXIgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0ZPUk1fSVNOOlxyXG4gICAgICAgICAgICB0aGlzLkZvcm1Jc24gPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1VTRVJTVEFURV9JRDpcclxuICAgICAgICAgICAgdGhpcy5fdXNlclN0YXRlSWQgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoJ1VuaGFuZGxlZCBhdHRyaWJ1dGUgXFwnezB9XFwnLicsIGF0dHJpYnV0ZSkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleChlbmRDb250ZXh0ICsgMSk7IC8vIHRvIGRlbGV0ZSBcIj5cIiB0b29cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coJ2luIEZvcm0uRmlsbE5hbWUoKSBvdXQgb2YgYm91bmRzJyk7XHJcbiAgfVxyXG5cclxuXHJcbiAgYWJzdHJhY3QgYnVpbGRGb3JtTmFtZSgpOiBzdHJpbmc7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJucyB0cnVlIGZvciBtZGkgY2hpbGQgYW5kIGZpdCB0byBtZGlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIndpbmRvd1R5cGVcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNyZWF0ZUZvcm0oKTogdm9pZCB7XHJcbiAgICBsZXQgaW5wdXRDb250cm9scyA9IHRoaXMuR2V0TGlzdE9mSW5wdXRDb250cm9scygpO1xyXG4gICAgbGV0IGZvcm1OYW1lOiBzdHJpbmcgPSB0aGlzLmJ1aWxkRm9ybU5hbWUoKTtcclxuICAgIGlmICghdGhpcy5pc1N1YkZvcm0oKSkge1xyXG4gICAgICBDb21tYW5kcy5hZGRPcGVuRm9ybSh0aGlzLCBmb3JtTmFtZSwgJzAnLCB0aGlzLmdldFRhc2soKS5nZXRUYXNrVGFnKCksIGlucHV0Q29udHJvbHMsIHRoaXMuaXNEaWFsb2coKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBDb21tYW5kcy5hZGRPcGVuc3ViZm9ybShDb21tYW5kVHlwZS5DUkVBVEVfU1VCX0ZPUk0sIHRoaXMuZ2V0U3ViRm9ybUN0cmwoKSwgdGhpcy5nZXRUYXNrKCkuZ2V0VGFza1RhZygpLCAoPE1nQ29udHJvbEJhc2U+dGhpcy5nZXRTdWJGb3JtQ3RybCgpKS5nZXROYW1lKCksXHJcbiAgICAgICAgZm9ybU5hbWUsIGlucHV0Q29udHJvbHMsIHRoaXMuZ2V0VGFzaygpLlJvdXRlclBhdGgsIHRoaXMuZ2V0VGFzaygpLkdldFJvdXRlclBhcmFtcygpLCB0aGlzLmdldFRhc2soKS5JbkRlZmF1bHRSb3V0ZXJPdXRsZXQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGRlZmF1bHQgY3JlYXRlIG9uZSByb3cgaW4gdGFibGUgY29udHJvbC4gRE9OJ1Qgc2V0IGl0ZW1zIGNvdW50IGR1cmluZyBmb3JtIG9wZW4uXHJcbiAgICAvLyBmaXJzdFRhYmxlUmVmcmVzaCgpIHdpbGwgY3JlYXRlIHRoZSBhY3R1YWwgcm93cywgYW5kIHJlZnJlc2ggdGhlIHRhYmxlLlxyXG4gICAgaWYgKHRoaXMuSGFzVGFibGUoKSlcclxuICAgICAgdGhpcy5Jbml0VGFibGVDb250cm9sKCk7XHJcblxyXG4gICAgQ29tbWFuZHMuYmVnaW5JbnZva2UoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gIGFkZCB0aGUgY2FsbCBqcyBjb21tYW5kIGFuZCBnZXQgdGhlIHJldHVybiB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBDYWxsSlMobWV0aG9kTmFtZTogc3RyaW5nLCBhcmdzOiBBcnJheTxhbnk+KTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBDb21tYW5kcy5hZGRDYWxsSlModGhpcywgdGhpcy5VbmlxdWVOYW1lLCBtZXRob2ROYW1lLCBhcmdzKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdHJ1ZSBpZiBmb3JtIGhhcyBhdXRvbWF0aWMgdGFiYmluZyBvcmRlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0F1dG9tYXRpY1RhYmJpbmdPcmRlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLkdldENvbXB1dGVkUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFCQklOR19PUkRFUikuR2V0Q29tcHV0ZWRWYWx1ZUludGVnZXIoKSA9PT0gVGFiYmluZ09yZGVyVHlwZS5BdXRvbWF0aWNhbGx5O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRydWUgaWYgd2UgY2FuIHJlZnJlc2ggcmVwZWF0YWJsZSBjb250cm9sc1xyXG4gIC8vLyAgIFFDUiAjNDM0NjQ5LCB3ZSBwcmV2ZW50IHBhaW50aW5nIHRhYmxlJ3MgY29udHJvbCB1bnRpbGwgc2hlbGwgaXMgb3BlbmVkIGFuZCB3ZSBrbm93IGhvdyBtYW55IHJvd3MgdG8gcGFpbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNSZWZyZXNoUmVwZWF0YWJsZUFsbG93ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5SZWZyZXNoUmVwZWF0YWJsZUFsbG93ZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoZSBmb3JtIGlzIHNjcmVlbiBtb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc1NjcmVlbk1vZGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIXRoaXMuaXNMaW5lTW9kZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgZm9ybSBpcyBsaW5lIG1vZGVcclxuICAvLy8gICBpZiB3ZSBoYXZlIGEgdHJlZSBvciBhIHRhYmxlIG9uIHRoZSBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc0xpbmVNb2RlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0TWFpbkNvbnRyb2woKSAhPT0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdHJ1ZSBpZiB0YXNrIGhhcyB0YWJsZSBvciB0cmVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGhhc1RhYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0cnVlIGlmIGZvcm0gc2hvdWxkIGJlIG9wZW5lZCBhcyBtb2RhbCB3aW5kb3dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNEaWFsb2coKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNEaWFsb2c6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCB3aW5kb3dUeXBlOiBXaW5kb3dUeXBlID0gdGhpcy5Db25jcmV0ZVdpbmRvd1R5cGU7XHJcbiAgICBpZiAod2luZG93VHlwZSA9PT0gV2luZG93VHlwZS5PdmVybGF5KVxyXG4gICAgICBpc0RpYWxvZyA9IHRydWU7XHJcbiAgICBlbHNlIGlmIChNZ0Zvcm1CYXNlLlNob3VsZEJlaGF2ZUFzTW9kYWwoKSlcclxuICAgICAgaXNEaWFsb2cgPSB0cnVlO1xyXG4gICAgcmV0dXJuIGlzRGlhbG9nO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTaG91bGQgdGhpcyBmb3JtIGJlaGF2ZSBhcyBNb2RhbCBhbHRob3VnaCBpdHMgV2luZG93VHlwZSAhPSBNb2RhbD9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHJldHVybnM+IGJvb2xlYW48L3JldHVybnM+XHJcbiAgaXNTdWJGb3JtKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N1YkZvcm1DdHJsICE9PSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGZvcm0gaXMgc3ViZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgSGFzVGFibGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGw7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRUb3BNb3N0Rm9ybSgpOiBNZ0Zvcm1CYXNlIHtcclxuICAgIGxldCB0b3BNb3N0Rm9ybTogTWdGb3JtQmFzZSA9IHRoaXM7XHJcblxyXG4gICAgLy8gVGhlIGZvcm0gb2YgdGhlIHN1YiBmb3JtIGNvbnRyb2xcclxuICAgIHdoaWxlICh0b3BNb3N0Rm9ybS5pc1N1YkZvcm0oKSAmJiB0b3BNb3N0Rm9ybS5QYXJlbnRGb3JtICE9PSBudWxsKVxyXG4gICAgICB0b3BNb3N0Rm9ybSA9IHRvcE1vc3RGb3JtLlBhcmVudEZvcm07XHJcblxyXG4gICAgcmV0dXJuIHRvcE1vc3RGb3JtO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIHRvcG1vc3QgZnJhbWUgZm9ybSBmb3IgbWVudSByZWZyZXNoLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0VG9wTW9zdEZyYW1lRm9ybSgpOiBNZ0Zvcm1CYXNlIHtcclxuICAgIGxldCB0b3BNb3N0Rm9ybTogTWdGb3JtQmFzZSA9IHRoaXM7XHJcblxyXG4gICAgd2hpbGUgKHRvcE1vc3RGb3JtICE9PSBudWxsKVxyXG4gICAgICB0b3BNb3N0Rm9ybSA9ICgodG9wTW9zdEZvcm0uUGFyZW50Rm9ybSAhPT0gbnVsbCkgPyB0b3BNb3N0Rm9ybS5QYXJlbnRGb3JtIDogbnVsbCk7XHJcblxyXG4gICAgcmV0dXJuIHRvcE1vc3RGb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgdG9wbW9zdCBtZ2Zvcm0gb2YgdGhlIHN1YmZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGdldFN1YkZvcm1DdHJsKCk6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N1YkZvcm1DdHJsO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gb2JqZWN0IHRoYXQgaXMgdXNlZCBmb3IgZm9ybSBtYXBwaW5nIGluIGNvbnRyb2wncyBtYXBcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxJZHhcIj50aGUgaW5kZXggb2YgdGhlIHJlcXVlc3RlZCBjb250cm9sPC9wYXJhbT5cclxuICBnZXRDdHJsKGN0cmxJZHg6IG51bWJlcik6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuQ3RybFRhYi5nZXRDdHJsKGN0cmxJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlJldHVybnMgdGhlIHJlcXVlc3RlZCBjb250cm9sPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHJldHVybnM+IGEgcmVmZXJlbmNlIHRvIHRoZSBjb250cm9sIHdpdGggdGhlIGdpdmVuIG5hbWUgb3IgbnVsbCBpZiBkb2VzIG5vdCBleGlzdDwvcmV0dXJucz5cclxuICBHZXRDdHJsKGN0cmxOYW1lOiBzdHJpbmcpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLkN0cmxUYWIuZ2V0Q3RybChjdHJsTmFtZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlZmF1bHRSb3V0ZXJPdXRsZXQ6IE1nQ29udHJvbEJhc2UgPSBudWxsO1xyXG5cclxuICBnZXQgRGVmYXVsdFJvdXRlck91dGxldCgpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIGlmICh0aGlzLmRlZmF1bHRSb3V0ZXJPdXRsZXQgPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmRlZmF1bHRSb3V0ZXJPdXRsZXQgPSB0aGlzLkN0cmxUYWIuR2V0Q29udHJvbCgoeDogTWdDb250cm9sQmFzZSkgPT4ge1xyXG4gICAgICAgIHJldHVybiB4LklzRGVmYXVsdFJvdXRlck91dGxldCgpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0Um91dGVyT3V0bGV0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybiB0aGUgY29udHJvbCB3aXRoIGEgZ2l2ZW4gbmFtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsTmFtZVwiPnRoZSBvZiB0aGUgcmVxdWVzdGVkIGNvbnRyb2w8L3BhcmFtPlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIEdldENob2ljZUNvbnRyb2xJdGVtTGlzdChtZ0NvbnRyb2w6IE1nQ29udHJvbEJhc2UpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgRGVidWcuQXNzZXJ0KG1nQ29udHJvbC5pc0Nob2ljZUNvbnRyb2woKSk7XHJcblxyXG4gICAgbGV0IGl0ZW1zOiBMaXN0PHN0cmluZz4gPSBuZXcgTGlzdCgpO1xyXG4gICAgbGV0IGZsZDogR3VpRmllbGRCYXNlID0gbWdDb250cm9sLmdldEZpZWxkKCk7XHJcbiAgICBsZXQgc3RvcmFnZUF0dHJpYnV0ZTogU3RvcmFnZUF0dHJpYnV0ZSA9IGZsZC5nZXRDZWxsc1R5cGUoKTtcclxuXHJcbiAgICBpZiAoc3RvcmFnZUF0dHJpYnV0ZSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFICYmIHN0b3JhZ2VBdHRyaWJ1dGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuVElNRSkge1xyXG4gICAgICBpZiAobWdDb250cm9sLmlzUmFkaW8oKSkge1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBmbGQuR2V0UmFkaW9DdHJscygpLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgcmFkaW9Db250cm9sOiBNZ0NvbnRyb2xCYXNlID0gZmxkLkdldFJhZGlvQ3RybHMoKS5nZXRfSXRlbShpKTtcclxuICAgICAgICAgIGl0ZW1zLkFkZFJhbmdlKGF3YWl0IHJhZGlvQ29udHJvbC5HZXRJdGVtc1JhbmdlKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpdGVtcy5BZGRSYW5nZShhd2FpdCBtZ0NvbnRyb2wuR2V0SXRlbXNSYW5nZSgpKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gTWdGb3JtQmFzZS5Db252ZXJ0QXJyYXlMaXN0VG9TdHJpbmcoaXRlbXMsIHN0b3JhZ2VBdHRyaWJ1dGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIE5TdHJpbmcuRW1wdHk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldCB0aGUgaXRlbXMgbGlzdCBvZiBjaG9pY2UgY29udHJvbHMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtZ0NvbnRyb2xcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIEdldENob2ljZUNvbnRyb2xEaXNwbGF5TGlzdChtZ0NvbnRyb2w6IE1nQ29udHJvbEJhc2UpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgRGVidWcuQXNzZXJ0KG1nQ29udHJvbC5pc0Nob2ljZUNvbnRyb2woKSk7XHJcblxyXG4gICAgbGV0IGl0ZW1zOiBMaXN0PHN0cmluZz4gPSBuZXcgTGlzdCgpO1xyXG4gICAgbGV0IGZsZDogR3VpRmllbGRCYXNlID0gbWdDb250cm9sLmdldEZpZWxkKCk7XHJcbiAgICBsZXQgc3RvcmFnZUF0dHJpYnV0ZTogU3RvcmFnZUF0dHJpYnV0ZSA9IGZsZC5nZXRDZWxsc1R5cGUoKTtcclxuXHJcbiAgICBpZiAoc3RvcmFnZUF0dHJpYnV0ZSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFICYmIHN0b3JhZ2VBdHRyaWJ1dGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuVElNRSkge1xyXG4gICAgICBpZiAobWdDb250cm9sLmlzUmFkaW8oKSkge1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBmbGQuR2V0UmFkaW9DdHJscygpLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgcmFkaW9Db250cm9sOiBNZ0NvbnRyb2xCYXNlID0gZmxkLkdldFJhZGlvQ3RybHMoKS5nZXRfSXRlbShpKTtcclxuICAgICAgICAgIGl0ZW1zLkFkZFJhbmdlKGF3YWl0IHJhZGlvQ29udHJvbC5HZXREaXNwbGF5UmFuZ2UoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGl0ZW1zLkFkZFJhbmdlKGF3YWl0IG1nQ29udHJvbC5HZXRJdGVtc1JhbmdlKCkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBNZ0Zvcm1CYXNlLkNvbnZlcnRBcnJheUxpc3RUb1N0cmluZyhpdGVtcywgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBOU3RyaW5nLkVtcHR5O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyB0aGUgY29tbWEgY29uY2F0ZW5hdGVkIHN0cmluZyBmcm9tIGFycmF5IGxpc3QuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpdGVtc1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNJdGVtTnVtVHlwZVwiPjwvcGFyYW0+XHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0Q29udHJvbENvbHVtbihjdHJsOiBNZ0NvbnRyb2xCYXNlKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICBsZXQgY29sdW1uOiBNZ0NvbnRyb2xCYXNlID0gbnVsbDtcclxuXHJcbiAgICBpZiAoKGN0cmwuSXNSZXBlYXRhYmxlIHx8IGN0cmwuSXNUYWJsZUhlYWRlckNoaWxkKSAmJiB0aGlzLl90YWJsZUNvbHVtbnMgIT09IG51bGwpXHJcbiAgICAgIGNvbHVtbiA9IHRoaXMuX3RhYmxlQ29sdW1ucy5nZXRfSXRlbShjdHJsLmdldExheWVyKCkgLSAxKTtcclxuXHJcbiAgICByZXR1cm4gY29sdW1uO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgY29udGFpbmVyIGNvbnRyb2w8L3JldHVybnM+XHJcbiAgZ2V0Q29udGFpbmVyQ3RybCgpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLl9jb250YWluZXJDdHJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBjb250cm9sJ3MgY29sdW1uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldENvbHVtbkNvbnRyb2xzKCk6IExpc3Q8TWdDb250cm9sQmFzZT4ge1xyXG4gICAgbGV0IGNvbHVtbkNvbnRyb2xzTGlzdDogTGlzdDxNZ0NvbnRyb2xCYXNlPiA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuQ3RybFRhYiAhPT0gbnVsbCkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5DdHJsVGFiLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IGN0cmw6IE1nQ29udHJvbEJhc2UgPSB0aGlzLkN0cmxUYWIuZ2V0Q3RybChpKTtcclxuICAgICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT0xVTU4pIHtcclxuICAgICAgICAgIGlmIChjb2x1bW5Db250cm9sc0xpc3QgPT09IG51bGwpXHJcbiAgICAgICAgICAgIGNvbHVtbkNvbnRyb2xzTGlzdCA9IG5ldyBMaXN0PE1nQ29udHJvbEJhc2U+KCk7XHJcbiAgICAgICAgICBjb2x1bW5Db250cm9sc0xpc3QucHVzaChjdHJsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjb2x1bW5Db250cm9sc0xpc3Q7XHJcbiAgfVxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFRhc2soKTogR3VpVGFza0Jhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICBjb252ZXJ0cyBmcm9tIGRvdWJsZSBwaXhlbHMgdG8gdW9tXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwaXhWYWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzWGF4aXNcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldFRhYmxlQ3RybCgpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLl90YWJsZU1nQ29udHJvbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZnRlciBvcGVuIHRoZSBmb3JtIG5lZWQgdG8gbW92ZSBpdCBhY2NvcmRpbmcgdG8gdGhlIHN0YXJ0dXAgcG9zaXRpb24gcHJvcGVydHkgb24gdGhlIGZvcm1cclxuICAvLy8gICBQUk9QX1RZUEVfU1RBUlRVUF9QT1NJVElPTlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldE1haW5Db250cm9sKCk6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlTWdDb250cm9sO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBhIHJlZmVyZW5jZSB0byB0aGUgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lIG9yIG51bGwgaWYgZG9lcyBub3QgZXhpc3Q8L3JldHVybnM+XHJcbiAgZ2V0Q3RybEJ5TmFtZShjdHJsTmFtZTogc3RyaW5nLCBjdHJsVHlwZTogTWdDb250cm9sVHlwZSk6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuQ3RybFRhYi5nZXRDdHJsQnlOYW1lKGN0cmxOYW1lLCBjdHJsVHlwZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBQb2ludCAsY2VudGVyIHRvIHRoZSBnaXZpbmcgcmVsYXRpdmVSZWN0XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+PC9wYXJhbT5cclxuICBjaGVja0FuZENyZWF0ZVJvdyhpZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsICYmICF0aGlzLmlzUm93Q3JlYXRlZChpZHgpKVxyXG4gICAgICB0aGlzLmNyZWF0ZVJvdyhpZHgpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlkeFwiPjwvcGFyYW0+XHJcbiAgSXNWYWxpZFJvdyhpZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHZhbGlkUm93OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsICYmIGlkeCA+PSAwICYmIGlkeCA8IHRoaXMuUm93cy5sZW5ndGgpIHtcclxuICAgICAgbGV0IHJvdzogUm93ID0gdGhpcy5Sb3dzLmdldF9JdGVtKGlkeCk7XHJcbiAgICAgIHZhbGlkUm93ID0gKHJvdyAhPT0gbnVsbCAmJiByb3cuVmFsaWRhdGVkKTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWxpZFJvdztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGFibGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdHJlZSBvciB0YWJsZSBjb250cm9sIG9mIHRoZSBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyByZWZyZXNoUHJvcHMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5fZmlyc3RSZWZyZXNoT2ZQcm9wcykge1xyXG4gICAgICB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVElUTEVfQkFSKTtcclxuXHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLl9wcm9wVGFiLlJlZnJlc2hEaXNwbGF5KGZhbHNlLCBmYWxzZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuX2ZpcnN0UmVmcmVzaE9mUHJvcHMpXHJcbiAgICAgIHRoaXMuX2ZpcnN0UmVmcmVzaE9mUHJvcHMgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZXR1cm4gdGhlIGNvbnRyb2wgKHdoaWNoIGlzIG5vdCB0aGUgZnJhbWUgZm9ybSkgd2l0aCBhIGdpdmVuIG5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybE5hbWVcIj50aGUgb2YgdGhlIHJlcXVlc3RlZCBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsVHlwZVwiPjwvcGFyYW0+XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVwZWF0YWJsZU9ubHlcIj5zaG91bGQgYmUgdHJ1ZSBpbiBvcmRlciB0byByZWZyZXNoIG9ubHkgdGhlIGNvbnRyb2xzIHRoYXQgYmVsb25nIHRvIGEgdGFibGU8L3BhcmFtPlxyXG4gIGFzeW5jIHJlZnJlc2hDb250cm9scyhyZXBlYXRhYmxlT25seTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbEJhc2U7XHJcbiAgICAvLyByZWNvcmQgZG9lcyBub3QgZXhpc3RcclxuICAgIGlmICh0aGlzLkRpc3BsYXlMaW5lID09PSBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIC8vIHJlZnJlc2ggdGhlIHRhYmxlIGZpcnN0XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwgJiYgIXJlcGVhdGFibGVPbmx5KVxyXG4gICAgICBhd2FpdCB0aGlzLl90YWJsZU1nQ29udHJvbC5SZWZyZXNoRGlzcGxheSgpO1xyXG5cclxuICAgIC8vIHJlZnJlc2ggYWxsIENPTFVNTlMgKHJlZnJlc2ggZm9yIGVhY2ggY29udHJvbCBiYXNlIG9uIHRoZSByZWZyZXNoIG9mIHRoZSBjb2x1bW4gKGUuZzpjb2x1bW4gd2lkdGgpXHJcbiAgICAvLyBzbyB3ZSBtdXN0IHJlZnJlc2ggdGhlIGNvbHVtbiBmaXJzdFxyXG4gICAgaWYgKHRoaXMuX3RhYmxlQ29sdW1ucyAhPT0gbnVsbCAmJiAhcmVwZWF0YWJsZU9ubHkpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX3RhYmxlQ29sdW1ucy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGxldCBtZ0NvbnRyb2xCYXNlOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5fdGFibGVDb2x1bW5zLmdldF9JdGVtKGkpO1xyXG4gICAgICAgIGF3YWl0IG1nQ29udHJvbEJhc2UuUmVmcmVzaERpc3BsYXkoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2hlY2tBbmRDcmVhdGVSb3codGhpcy5EaXNwbGF5TGluZSk7XHJcblxyXG4gICAgLy8gUUNSICM3MDk1NjMgTXVzdCByZWZyZXNoIGZyYW1lc2V0J3Mgc3ViZnJvbXMgYmVmb3JlIHdlIHJlZnJlc2ggZnJhbWVzZXQgaXRzZWxmLlxyXG4gICAgLy8gRHVyaW5nIHJlZnJlc2ggb2YgdGhlIGZyYW1lc2V0IG5lc3RlZCBzdWJmb3JtcyB3aXRoIFJlZnJlc2hXaGVuSGlkZGVuIG1pZ2h0IGJlIGJyb3VnaHQgdG8gc2VydmVyXHJcbiAgICAvLyBidXQgdGhlaXIgc3ViZm9ybSdzIGNvbnRyb2xzIGhhdmUgbm90IGJlZW4gc2V0IHdpdGggY29ycmVjdCBib3VuZHMuIFRoaXMgY2F1c2VzIGlsbGVnYWwgcGxhY2VtZW50XHJcbiAgICAvLyBhbmQgaW5jb3JyZWN0IGZpbmFsIGxvY2F0aW9uIG9mIGNvbnRyb2xzIG9uIG5lc3RlZCBzdWJmb3Jtc1xyXG4gICAgbGV0IHRhYkFuZEdyb3VwQ29udHJvbHM6IFN0YWNrPE1nQ29udHJvbEJhc2U+ID0gbmV3IFN0YWNrPE1nQ29udHJvbEJhc2U+KCk7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuQ3RybFRhYi5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICBjdHJsID0gdGhpcy5DdHJsVGFiLmdldEN0cmwoaSk7XHJcbiAgICAgIGlmICgoY3RybC5pc1RhYkNvbnRyb2woKSB8fCBjdHJsLmlzR3JvdXAoKSkgJiYgIXJlcGVhdGFibGVPbmx5KSB7XHJcbiAgICAgICAgdGFiQW5kR3JvdXBDb250cm9scy5wdXNoKGN0cmwpO1xyXG5cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGN0cmwuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCTEUgJiYgY3RybC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT0xVTU4pIHtcclxuICAgICAgICBpZiAoY3RybC5Jc1JlcGVhdGFibGUgfHwgIXJlcGVhdGFibGVPbmx5KVxyXG4gICAgICAgICAgYXdhaXQgY3RybC5SZWZyZXNoRGlzcGxheSgpO1xyXG4gICAgICB9IGVsc2UgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCTEUgJiYgcmVwZWF0YWJsZU9ubHkpXHJcbiAgICAgICAgYXdhaXQgY3RybC5SZWZyZXNoRGlzcGxheShyZXBlYXRhYmxlT25seSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj48L3BhcmFtPlxyXG4gIG1hcmtSb3dOT1RDcmVhdGVkKGlkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBDb21tYW5kcy5hZGRXaXRoTnVtYmVyKENvbW1hbmRUeXBlLlVORE9fQ1JFQVRFX1RBQkxFX1JPVywgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIGlkeCk7XHJcblxyXG4gICAgaWYgKGlkeCA+PSAwICYmIGlkeCA8IHRoaXMuUm93cy5sZW5ndGgpXHJcbiAgICAgIHRoaXMuUm93cy5zZXRfSXRlbShpZHgsIG5ldyBSb3coZmFsc2UsIGZhbHNlKSk7XHJcbiAgfVxyXG5cclxuICBTZWxlY3RSb3coKTogdm9pZDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGlmIHJvdyBpcyBub3QgY3JlYXRlZCB5ZXQgY3JlYXRlcyByb3dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICBTZWxlY3RSb3coc2VuZEFsd2F5czogYm9vbGVhbik6IHZvaWQ7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBtYXJrcyByb3cgY3JlYXRlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIFNlbGVjdFJvdyhyb3dJZHg6IG51bWJlciwgc2VuZEFsd2F5czogYm9vbGVhbik6IHZvaWQ7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB2YWxpZGF0ZSByb3dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICBTZWxlY3RSb3coc2VuZEFsd2F5c09yUm93SWR4PzogYW55LCBzZW5kQWx3YXlzPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXHJcbiAgICAgIHRoaXMuU2VsZWN0Um93XzAoKTtcclxuXHJcbiAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKVxyXG4gICAgICB0aGlzLlNlbGVjdFJvd18xKHNlbmRBbHdheXNPclJvd0lkeCk7XHJcblxyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLlNlbGVjdFJvd18yKHNlbmRBbHdheXNPclJvd0lkeCwgc2VuZEFsd2F5cyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+KHB1YmxpYylcclxuICAvLy8gY2hlY2sgaWYgc3BlY2lmaWVkIHJvdyBpcyB2YWxpZCByb3cgaW4gcGFnZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoIHRoZSBjb250cm9scyBvZiB0aGUgY3VycmVudCByb3dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHJldHVybnM+IGludCBpcyB0aGUgdGFibGUgc2l6ZTwvcmV0dXJucz5cclxuICBnZXRSb3dzSW5QYWdlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fcm93c0luUGFnZTtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gaW50IGlzIHRoZSB0YWJsZSBzaXplPC9yZXR1cm5zPlxyXG4gIGdldE1heFJvd3NJblBhZ2luYXRlZFRhYmxlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fbWF4Um93c0luUGFnaW5hdGVkVGFibGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIFJvdyBpcyBjcmVhdGVkIG9uIEdVSSBsZXZlbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNpemVcIj50aGUgdGFibGUgc2l6ZTwvcGFyYW0+XHJcbiAgc2V0Um93c0luUGFnZShzaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX3Jvd3NJblBhZ2UgPSBzaXplO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIG1hcmtzIHRoaXMgcm93IGFzIG5vdCBjcmVhdGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRDb2x1bW5zQ291bnQoKTogbnVtYmVyIHtcclxuICAgIGxldCBjb2x1bW5zQ291bnQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgaWYgKHRoaXMuQ3RybFRhYiAhPT0gbnVsbCkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5DdHJsVGFiLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IGNvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSB0aGlzLkN0cmxUYWIuZ2V0Q3RybChpKTtcclxuICAgICAgICBpZiAoY29udHJvbC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT0xVTU4pXHJcbiAgICAgICAgICBjb2x1bW5zQ291bnQgPSBjb2x1bW5zQ291bnQgKyAxO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbnNDb3VudDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGluUmVmcmVzaERpc3BsYXkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5SZWZyZXNoRGlzcDtcclxuICB9XHJcblxyXG4gIHNldFRpdGxlKG5ld1RpdGxlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIENvbW1hbmRzLnNldFRpdGxlKHRoaXMsIG5ld1RpdGxlKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIFwiaW4gcmVmcmVzaCBkaXNwbGF5XCIgZmxhZ1xyXG5cclxuICBnZXRDb250cm9sSWR4KGN0cmw6IE1nQ29udHJvbEJhc2UpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuQ3RybFRhYi5nZXRDb250cm9sSWR4KGN0cmwsIHRydWUpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBFeGVjdXRlIHRoZSBsYXlvdXQgYW5kIGFsbCBpdHMgY2hpbGRyZW5cclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRUb3BJbmRleEZyb21HVUkoKTogbnVtYmVyIHtcclxuICAgIGxldCB0b3BEaXNwbGF5TGluZTogbnVtYmVyID0gMDtcclxuICAgIGlmICh0aGlzLmhhc1RhYmxlKCkpXHJcbiAgICAgIHRvcERpc3BsYXlMaW5lID0gQ29tbWFuZHMuZ2V0VG9wSW5kZXgodGhpcy5nZXRNYWluQ29udHJvbCgpKTtcclxuICAgIHJldHVybiB0b3BEaXNwbGF5TGluZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gVFJVRSBpZiB0aGlzIGdyb3VwIGlzIHRoZSBsYXN0IGdyb3VwIGluIHRoZSB0b29sYmFyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImdyb3VwTnVtYmVyXCI+PC9wYXJhbT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiB0YWJsZSBpdGVtcyBjb3VudDwvcmV0dXJucz5cclxuICBnZXRUYWJsZUl0ZW1zQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl90YWJsZUl0ZW1zQ291bnQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFRhYmxlIGNvbnRyb2wgaXMgYWx3YXlzIGZpcnN0IG9uIHRoZSBmb3JtXHJcbiAgLy8vIFdoZW4gdGFibGUgaXMgYSBjaGlsZCBvZiB0YWIsIGl0IGlzIGNyZWF0ZWQgYmVmb3JlIHRhYidzIGxheWVycyhUYWJQYWdlcykgYXJlIGNyZWF0ZWQuXHJcbiAgLy8vIENvbXB1dGluZyBUYWIncyBjaGlsZHJlbiBjb29yZGluYXRlcyBkZXBlbmRzIG9uIHRoZSBUYWJQYWdlcyBiZWluZyBjcmVhdGVkXHJcbiAgLy8vIFNvLCB3ZSBtdXN0IGZpeCB0YWJsZSdzIGxvY2F0aW9uIGFmdGVyIFRhYiBpcyBjcmVhdGVkXHJcbiAgLy8vIFFDUiAjMjg5OTY2XHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVtb3ZlUmVmc1RvQ3RybHMoKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5DdHJsVGFiLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIHRoaXMuQ3RybFRhYi5nZXRDdHJsKGkpLnJlbW92ZVJlZkZyb21GaWVsZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB0aGlzIGZvcm0gbWF5IGhhdmUgQWN0aXZlUm93SGlnaHRsaWdodFN0YXRlXHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYnVpbGRUYWJsZUNoaWxkcmVuKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlQ2hpbGRyZW4gPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fdGFibGVDaGlsZHJlbiA9IG5ldyBMaXN0PE1nQ29udHJvbEJhc2U+KCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5DdHJsVGFiICE9PSBudWxsKSB7XHJcbiAgICAgICAgbGV0IG1pblRhYk9yZGVyOiBudW1iZXIgPSAyMTQ3NDgzNjQ3O1xyXG4gICAgICAgIGxldCBhdXRvbWF0aWNUYWJiaW5nT3JkZXI6IGJvb2xlYW4gPSB0aGlzLmlzQXV0b21hdGljVGFiYmluZ09yZGVyKCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLkN0cmxUYWIuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgICAgIGxldCBjdHJsOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5DdHJsVGFiLmdldEN0cmwoaSk7XHJcblxyXG4gICAgICAgICAgaWYgKGN0cmwuSXNSZXBlYXRhYmxlIHx8IGN0cmwuSXNUYWJsZUhlYWRlckNoaWxkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RhYmxlQ2hpbGRyZW4ucHVzaChjdHJsKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhdXRvbWF0aWNUYWJiaW5nT3JkZXIpIHtcclxuICAgICAgICAgICAgICBsZXQgcHJvcDogUHJvcGVydHkgPSBjdHJsLkdldENvbXB1dGVkUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFCX09SREVSKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHByb3AgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGxldCB2YWx1ZUludDogbnVtYmVyID0gcHJvcC5HZXRDb21wdXRlZFZhbHVlSW50ZWdlcigpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlSW50IDwgbWluVGFiT3JkZXIpXHJcbiAgICAgICAgICAgICAgICAgIG1pblRhYk9yZGVyID0gdmFsdWVJbnQ7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobWluVGFiT3JkZXIgIT09IEludDMyLk1heFZhbHVlICYmIGF1dG9tYXRpY1RhYmJpbmdPcmRlcikge1xyXG4gICAgICAgICAgdGhpcy5fZmlyc3RUYWJsZVRhYk9yZGVyID0gbWluVGFiT3JkZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBwcmV2IGdyb3VwIGluZGV4IGlmIGV4aXN0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN1cnJHcm91cFwiPjwvcGFyYW0+XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFibGVDdHJsXCI+dGhlIHRhYmxlQ3RybCB0byBzZXQ8L3BhcmFtPlxyXG4gIHNldFRhYmxlQ3RybCh0YWJsZUN0cmw6IE1nQ29udHJvbEJhc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuX3RhYmxlTWdDb250cm9sID0gdGFibGVDdHJsO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj48L3BhcmFtPlxyXG5cclxuICBnZXRDdHJsQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLkN0cmxUYWIuZ2V0U2l6ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRDb250cm9sc0NvdW50RXhjbHVkaW5nU3RhdHVzQmFyKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5DdHJsVGFiLmdldFNpemUoKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHJlZnJlc2hQcm9wc09uRXhwcmVzc2lvbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgc2l6ZTogbnVtYmVyID0gKHRoaXMuX3Byb3BUYWIgPT0gbnVsbCA/IDAgOiB0aGlzLl9wcm9wVGFiLmdldFNpemUoKSk7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHk7XHJcbiAgICBsZXQgcmVmcmVzaDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHNpemUgJiYgIXJlZnJlc2g7IGkrKykge1xyXG4gICAgICBwcm9wID0gdGhpcy5fcHJvcFRhYi5nZXRQcm9wKGkpO1xyXG4gICAgICBpZiAocHJvcC5pc0V4cHJlc3Npb24oKSkge1xyXG4gICAgICAgIHJlZnJlc2ggPSB0cnVlO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaFByb3BzKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0VGFiQ29udHJvbChjdHJsOiBNZ0NvbnRyb2xCYXNlKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICBsZXQgb2JqOiBPYmplY3Q7XHJcbiAgICBsZXQgcmVzdWx0OiBNZ0NvbnRyb2xCYXNlID0gbnVsbDtcclxuXHJcbiAgICBvYmogPSBjdHJsO1xyXG4gICAgd2hpbGUgKG9iaiBpbnN0YW5jZW9mIE1nQ29udHJvbEJhc2UpIHtcclxuICAgICAgbGV0IGN1cnJDdHJsID0gPE1nQ29udHJvbEJhc2U+b2JqO1xyXG4gICAgICBpZiAoY3VyckN0cmwuaXNUYWJDb250cm9sKCkpIHtcclxuICAgICAgICByZXN1bHQgPSBjdXJyQ3RybDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBvYmogPSBjdXJyQ3RybC5nZXRQYXJlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiBjdHJsIGlzIG5vdCB0YWIgYW5kIG5vdCB0YWIncyBjaGlsZCAtIGZpbmQgZmlyc3QgdGFiIGluIHRoZSBmb3JtXHJcbiAgICBpZiAocmVzdWx0ID09IG51bGwpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuQ3RybFRhYi5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICAgIG9iaiA9IHRoaXMuQ3RybFRhYi5nZXRDdHJsKGkpO1xyXG4gICAgICAgIGlmICgoPE1nQ29udHJvbEJhc2U+b2JqKS5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICAgICAgcmVzdWx0ID0gPE1nQ29udHJvbEJhc2U+b2JqO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZW1vdmUgcmVmZXJlbmNlcyB0byB0aGUgY29udHJvbHMgb2YgdGhpcyBmb3JtXHJcblxyXG4gIElzSW5wdXRUeXBlKGN0cmw6IE1nQ29udHJvbEJhc2UpOiBib29sZWFuIHtcclxuICAgIHN3aXRjaCAoY3RybC5UeXBlKSB7XHJcbiAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1g6XHJcbiAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEVYVDpcclxuICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT01CTzpcclxuICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUOlxyXG4gICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1JBRElPOlxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgbGlzdCBvZiB0YWJsZSBjaGlsZHJlblxyXG5cclxuICBwdWJsaWMgR2V0TGlzdE9mSW5wdXRDb250cm9scygpOiBhbnkge1xyXG4gICAgbGV0IGZpbHRlcnRlckxpc3QgPSB0aGlzLkN0cmxUYWIuZmlsdGVyKCgoYywgaW5kZXgsIGFycmF5KSA9PiB0aGlzLklzSW5wdXRUeXBlKGMpKSk7XHJcbiAgICBsZXQgbmFtZXMgPSBmaWx0ZXJ0ZXJMaXN0LnJlZHVjZSgocHJlLCBjdHJsLCBpKSA9PiB7XHJcbiAgICAgIHByZVtjdHJsLlVuaXF1ZU5hbWVdID0gY3RybC5Jc1JlcGVhdGFibGUgPyAnMScgOiAnMCc7XHJcbiAgICAgIHJldHVybiBwcmU7XHJcbiAgICB9LCB7fSk7XHJcbiAgICByZXR1cm4gbmFtZXM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhYnN0cmFjdCBDb25zdHJ1Y3RNZ0NvbnRyb2woKTogTWdDb250cm9sQmFzZTtcclxuXHJcbiAgLy8gZ2V0R3VpVGFibGVDaGlsZHJlbigpOiBMaXN0PEd1aU1nQ29udHJvbD4ge1xyXG4gIC8vICAgbGV0IGZsYWc6IGJvb2xlYW4gPSB0aGlzLl9ndWlUYWJsZUNoaWxkcmVuID09PSBudWxsO1xyXG4gIC8vICAgaWYgKGZsYWcpIHtcclxuICAvLyAgICAgdGhpcy5fZ3VpVGFibGVDaGlsZHJlbiA9IG5ldyBMaXN0PEd1aU1nQ29udHJvbD4oKTtcclxuICAvLyAgICAgbGV0IHRhYmxlQ2hpbGRyZW46IExpc3Q8TWdDb250cm9sQmFzZT4gPSB0aGlzLlRhYmxlQ2hpbGRyZW47XHJcbiAgLy8gICAgIGxldCBlbnVtZXJhdG9yOiBMaXN0X0VudW1lcmF0b3I8TWdDb250cm9sQmFzZT4gPSB0YWJsZUNoaWxkcmVuLkdldEVudW1lcmF0b3IoKTtcclxuICAvLyAgICAgdHJ5IHtcclxuICAvLyAgICAgICB3aGlsZSAoZW51bWVyYXRvci5Nb3ZlTmV4dCgpKSB7XHJcbiAgLy8gICAgICAgICBsZXQgY3VycmVudDogTWdDb250cm9sQmFzZSA9IGVudW1lcmF0b3IuQ3VycmVudDtcclxuICAvLyAgICAgICAgIHRoaXMuX2d1aVRhYmxlQ2hpbGRyZW4uQWRkKGN1cnJlbnQpO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfVxyXG4gIC8vICAgICBmaW5hbGx5IHtcclxuICAvLyAgICAgICAoPElEaXNwb3NhYmxlPmVudW1lcmF0b3IpLkRpc3Bvc2UoKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIHRoaXMuX2d1aVRhYmxlQ2hpbGRyZW47XHJcbiAgLy8gfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgU2V0cyB0aGUgdGFibGUgY29udHJvbCByZWxhdGVkIHRvIHRoaXMgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmVmcmVzaCBmb3JtIGRpc3BsYXkgaWYgaXQgaGFzIGEgcHJvcGVydHkgd2hpY2ggaXMgYW4gZXhwcmVzc2lvblxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGZpcnN0VGFibGVSZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3Jvd3NJblBhZ2UgPSBDb21tYW5kcy5nZXRSb3dzSW5QYWdlKHRoaXMuX3RhYmxlTWdDb250cm9sKTtcclxuICAgICAgdGhpcy5SZWZyZXNoUmVwZWF0YWJsZUFsbG93ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHVwZGF0ZSB0YWJsZSBpdGVtJ3MgY291bnQgYWNjb3JkaW5nIHRvIHBhcmFtZXRlciBzaXplXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImR2c2l6ZVwiPm5ldyBkdnNpemU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFibGVJdGVtc0NvdW50XCI+bmV3IHRhYmxlSXRlbXNDb3VudDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZW1vdmVBbGxcIj5yZW1vdmUgYWxsIGVsZW1lbnRzIGZvcm0gdGhlIHRhYmxlIGluY2x1ZGluZyBmaXJzdCBhbmQgbGFzdCBkdW1teSBlbGVtZW50czwvcGFyYW0+XHJcbiAgU2V0VGFibGVJdGVtc0NvdW50KGR2c2l6ZTogbnVtYmVyLCByZW1vdmVBbGw6IGJvb2xlYW4pOiB2b2lkXHJcbiAgU2V0VGFibGVJdGVtc0NvdW50KGR2c2l6ZTogbnVtYmVyLCB0YWJsZUl0ZW1zQ291bnQ6IG51bWJlciwgcmVtb3ZlQWxsOiBib29sZWFuKTogdm9pZDtcclxuICBTZXRUYWJsZUl0ZW1zQ291bnQoZHZzaXplOiBudW1iZXIsIHRhYmxlSXRlbXNDb3VudE9yUmVtb3ZlQWxsOiBhbnksIHJlbW92ZUFsbD86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICBpZiAodHlwZW9mIHRhYmxlSXRlbXNDb3VudE9yUmVtb3ZlQWxsID09ICdib29sZWFuJyl7XHJcbiAgICAgIHRoaXMuU2V0VGFibGVJdGVtc0NvdW50XzAoZHZzaXplLCB0YWJsZUl0ZW1zQ291bnRPclJlbW92ZUFsbCk7XHJcbiAgICB9IGVsc2VcclxuICAgICAgdGhpcy5TZXRUYWJsZUl0ZW1zQ291bnRfMShkdnNpemUsIHRhYmxlSXRlbXNDb3VudE9yUmVtb3ZlQWxsLCByZW1vdmVBbGwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBTZXRUYWJsZUl0ZW1zQ291bnRfMChkdnNpemU6IG51bWJlciwgcmVtb3ZlQWxsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLlNldFRhYmxlSXRlbXNDb3VudF8xKGR2c2l6ZSwgZHZzaXplLCByZW1vdmVBbGwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBTZXRUYWJsZUl0ZW1zQ291bnRfMShkdnNpemU6IG51bWJlciwgdGFibGVJdGVtc0NvdW50OiBudW1iZXIsIHJlbW92ZUFsbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5Jbml0VGFibGVDb250cm9sKGR2c2l6ZSwgdGFibGVJdGVtc0NvdW50LCByZW1vdmVBbGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbml0cyB0aGUgdGFibGUgY29udHJvbFxyXG4gIC8vLyB1cGRhdGUgdGFibGUgaXRlbSdzIGNvdW50IGFjY29yZGluZyB0byBwYXJhbWV0ZXIgZHZzaXplXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBJbml0VGFibGVDb250cm9sKCk6IHZvaWQ7XHJcbiAgSW5pdFRhYmxlQ29udHJvbChkdlNpemU6IG51bWJlciwgdGFibGVJdGVtc0NvdW50OiBudW1iZXIsIHJlbW92ZUFsbDogYm9vbGVhbik6IHZvaWQ7XHJcbiAgSW5pdFRhYmxlQ29udHJvbChkdlNpemU/OiBudW1iZXIsIHRhYmxlSXRlbXNDb3VudD86IG51bWJlciwgcmVtb3ZlQWxsPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5Jbml0VGFibGVDb250cm9sXzAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5Jbml0VGFibGVDb250cm9sXzEoZHZTaXplLCB0YWJsZUl0ZW1zQ291bnQsIHJlbW92ZUFsbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHVwZGF0ZSBhcnJheXMgb2YgdGFibGUgY2hpbGRyZW4gY29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNpemVcIj48L3BhcmFtPlxyXG4gIFVwZGF0ZVRhYmxlQ2hpbGRyZW5BcnJheXNTaXplKHNpemU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IGNoaWxkcmVuOiBMaXN0PE1nQ29udHJvbEJhc2U+ID0gdGhpcy5UYWJsZUNoaWxkcmVuO1xyXG4gICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGNvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSBjaGlsZHJlbi5nZXRfSXRlbShpKTtcclxuICAgICAgICBjb250cm9sLnVwZGF0ZUFycmF5cyhzaXplKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9IG51bGwpXHJcbiAgICAgIHRoaXMuX3RhYmxlTWdDb250cm9sLnVwZGF0ZUFycmF5cyhzaXplKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBmaW5kIHRhYiBjb250cm9sIGZvciBwZXJmb3JtaW5nIENUUkwrVEFCICYmIENUUkwrU0hJRlQrVEFCIGFjdGlvbnNcclxuICAvLy8gICB0aGUgY29kZSBvcmlnaW5hbCBpcyBpbiBSVDo6c2tpcF90b190YWJfY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y3VycmVudCBjb250cm9sPC9wYXJhbT5cclxuXHJcbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAne0d1aU1nRm9ybScgKyAnOiBJZD0nICsgdGhpcy5fdXNlclN0YXRlSWQgKyAnfSc7XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEluY2x1ZGVDb250cm9sSW5UYWJiaW5nT3JkZXIoY29udHJvbDogTWdDb250cm9sQmFzZSwgaW5jbHVkZUNvbnRyb2xDaGlsZE9mRnJhbWVGb3JtOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIWNvbnRyb2wuUHJvcGVydHlFeGlzdHMoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFCX09SREVSKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG5cclxuICBHZXRIYXNoQ29kZSgpIHtcclxuICAgIHJldHVybiB0aGlzLkZvcm1Jc247XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByb3RlY3RlZCBpbml0SW5uZXJPYmplY3RzKGZvdW5kVGFnTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG5cclxuICAgIGxldCBwYXJzZXI6IFhtbFBhcnNlciA9IE1hbmFnZXIuR2V0Q3VycmVudFJ1bnRpbWVDb250ZXh0KCkuUGFyc2VyO1xyXG4gICAgaWYgKE1nRm9ybUJhc2UuSXNGb3JtVGFnKGZvdW5kVGFnTmFtZSkpXHJcbiAgICAgIHRoaXMuZmlsbE5hbWUoZm91bmRUYWdOYW1lKTtcclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19QUk9QKVxyXG4gICAgICB0aGlzLl9wcm9wVGFiLmZpbGxEYXRhKHRoaXMsICdGJywgcGFyc2VyKTtcclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19DT05UUk9MKSB7XHJcbiAgICAgIHRoaXMuQ3RybFRhYi5maWxsRGF0YSh0aGlzLCBwYXJzZXIpO1xyXG4gICAgICAvL3RoaXMuaW5pdENvbnRleHRQcm9wRm9yQ29udHJvbHMoKTtcclxuICAgICAgaWYgKCF0aGlzLkhhc1RhYmxlKCkpXHJcbiAgICAgICAgdGhpcy5SZWZyZXNoUmVwZWF0YWJsZUFsbG93ZWQgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmIChNZ0Zvcm1CYXNlLklzRW5kRm9ybVRhZyhmb3VuZFRhZ05hbWUpKSB7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBlbHNlXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY29uc3RydWN0cyBhbiBvYmplY3Qgb2YgTWdDb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0eXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwYXJlbnRDb250cm9sXCI+PC9wYXJhbT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwdWJsaWMgaXNSb3dDcmVhdGVkKGlkeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5Sb3dzLmxlbmd0aCA8PSBpZHggfHwgaWR4IDwgMCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJvdzogUm93ID0gdGhpcy5Sb3dzLmdldF9JdGVtKGlkeCk7XHJcbiAgICBpZiAocm93ID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIHJvdy5DcmVhdGVkO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBidWlsZExpbmtlZENvbnRyb2xzTGlzdHMoKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5DdHJsVGFiLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBjdHJsOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5DdHJsVGFiLmdldEN0cmwoaSk7XHJcbiAgICAgIGxldCBsaW5rZWRQYXJlbnQ6IE1nQ29udHJvbEJhc2UgPSA8TWdDb250cm9sQmFzZT5jdHJsLmdldExpbmtlZFBhcmVudChmYWxzZSk7XHJcbiAgICAgIGlmIChsaW5rZWRQYXJlbnQgIT09IG51bGwpXHJcbiAgICAgICAgbGlua2VkUGFyZW50LmxpbmtDdHJsKGN0cmwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCBsaXN0IG9mIGFsbCBjb2x1bW5zIGNvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGJ1aWxkVGFibGVDb2x1bW5zTGlzdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl90YWJsZUNvbHVtbnMgPSBuZXcgTGlzdDxNZ0NvbnRyb2xCYXNlPigpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5DdHJsVGFiLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IGNvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSB0aGlzLkN0cmxUYWIuZ2V0Q3RybChpKTtcclxuICAgICAgICBpZiAoY29udHJvbC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT0xVTU4pXHJcbiAgICAgICAgICB0aGlzLl90YWJsZUNvbHVtbnMucHVzaChjb250cm9sKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gdXBkYXRlIGFycmF5cyBvZiB0YWJsZSBjaGlsZHJlbiBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGNyZWF0ZVJvdyhpZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgQ29tbWFuZHMuYWRkV2l0aE51bWJlcihDb21tYW5kVHlwZS5DUkVBVEVfVEFCTEVfUk9XLCB0aGlzLl90YWJsZU1nQ29udHJvbCwgaWR4KTtcclxuXHJcbiAgICBpZiAodGhpcy5Sb3dzLmxlbmd0aCA8PSBpZHgpXHJcbiAgICAgIHRoaXMuUm93cy5TZXRTaXplKGlkeCArIDEpO1xyXG5cclxuICAgIHRoaXMuUm93cy5zZXRfSXRlbShpZHgsIG5ldyBSb3codHJ1ZSwgdHJ1ZSkpO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgU2VsZWN0Um93XzAoKTogdm9pZCB7XHJcbiAgICB0aGlzLlNlbGVjdFJvdyhmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldCB0aGUgYXBwcm9wcmlhdGUgd2luZG93IHR5cGUgZm9yIGEgRGVmYXVsdCB3aW5kb3cgdHlwZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIndpbmRvd1R5cGVcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgU2VsZWN0Um93XzEoc2VuZEFsd2F5czogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5TZWxlY3RSb3codGhpcy5EaXNwbGF5TGluZSwgc2VuZEFsd2F5cyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEZvciBvbmxpbmUgd2UgbmVlZCB0byBwaXQgJ0FDVF9ISVQnIHdoZW4gdGhlIGZvcm0gd2FzIGNsb3NlZCBmcm9tIHN5c3RlbSBtZW51XHJcbiAgLy8vIGlmIHRoZSB0YXNrIGhhcyBvbmx5IHN1YmZvcm0gY29udHJvbCBvbiBpdC5cclxuICAvLy8gRm9yIFJDIGFsd2F5cyByZXR1cm4gZmFsc2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNlbmRBbHdheXNcIj5zZW5kIHNlbGVjdGlvbiBjb21tYW5kIGRlcGVuZGluZyBvbiBwcmV2aW91cyB2YWx1ZTwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBTZWxlY3RSb3dfMihyb3dJZHg6IG51bWJlciwgc2VuZEFsd2F5czogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgLy8gY29udHJvbEZvclNlbGVjdCBjYW4gYmUgdGFibGUgY29udHJvbCBvciB0cmVlIGNvbnRyb2xcclxuICAgIGxldCBtYWluQ29udHJvbDogTWdDb250cm9sQmFzZSA9IHRoaXMuZ2V0TWFpbkNvbnRyb2woKTtcclxuXHJcbiAgICBpZiAobWFpbkNvbnRyb2wgIT09IG51bGwgJiYgdGhpcy5SZWZyZXNoUmVwZWF0YWJsZUFsbG93ZWQpIHtcclxuICAgICAgbGV0IGluZGV4OiBudW1iZXIgPSByb3dJZHg7XHJcbiAgICAgIGlmICh0aGlzLl90YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKVxyXG4gICAgICAgIGluZGV4ID0gR3VpQ29uc3RhbnRzLk5PX1JPV19TRUxFQ1RFRDtcclxuXHJcbiAgICAgIGlmIChzZW5kQWx3YXlzIHx8IGluZGV4ICE9PSB0aGlzLl9wcmV2U2VsSW5kZXgpIHtcclxuICAgICAgICAvLyBmb3IgdHJlZSBjb250cm9sIHdlIGFsd2F5cyBzZW5kIHNlbGVjdGlvbiwgc2luY2Ugc29tZXRpbWVzIHdlIG5lZWQgdG8gdW5kbyB0cmVlIGRlZmF1bCBzZWxlY3Rpb25cclxuICAgICAgICB0aGlzLl9wcmV2U2VsSW5kZXggPSBpbmRleDtcclxuICAgICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIG1haW5Db250cm9sLCAwLCBIdG1sUHJvcGVydGllcy5TZWxlY3RlZFJvdywgaW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBmb3JjZSBhbGwgTWdDb250cm9scyB0byB1cGRhdGUgdGhlIGNvbG9ycyB1c2VkIG9uIHRoZSBjb250cm9sc1xyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgSW5pdFRhYmxlQ29udHJvbF8wKCk6IHZvaWQge1xyXG4gICAgdGhpcy5Jbml0VGFibGVDb250cm9sKDEsIDEsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVtb3ZlQWxsXCI+cmVtb3ZlIGFsbCBlbGVtZW50cyBmb3JtIHRoZSB0YWJsZSBpbmNsdWRpbmcgZmlyc3QgYW5kIGxhc3QgZHVtbXkgZWxlbWVudHM8L3BhcmFtPlxyXG4gIHByaXZhdGUgSW5pdFRhYmxlQ29udHJvbF8xKGR2U2l6ZTogbnVtYmVyLCB0YWJsZUl0ZW1zQ291bnQ6IG51bWJlciwgcmVtb3ZlQWxsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT0gbnVsbCkge1xyXG4gICAgICBDb21tYW5kcy5hZGRXaXRoTnVtYmVyKENvbW1hbmRUeXBlLlNFVF9UQUJMRV9JVEVNU19DT1VOVCwgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIHRhYmxlSXRlbXNDb3VudCk7XHJcbiAgICAgIHRoaXMuX3RhYmxlSXRlbXNDb3VudCA9IHRhYmxlSXRlbXNDb3VudDtcclxuICAgICAgdGhpcy5Sb3dzLlNldFNpemUoZHZTaXplKTtcclxuICAgICAgdGhpcy5fcHJldkd1aVRvcEluZGV4ID0gLTI7XHJcbiAgICAgIHRoaXMuX3ByZXZTZWxJbmRleCA9IC0yO1xyXG4gICAgICB0aGlzLlVwZGF0ZVRhYmxlQ2hpbGRyZW5BcnJheXNTaXplKGR2U2l6ZSk7XHJcbiAgICAgIHRoaXMuX21heFJvd3NJblBhZ2luYXRlZFRhYmxlID0gQ29tbWFuZHMuZ2V0TWF4Um93c0luUGFnaW5hdGVkVGFibGUodGhpcy5fdGFibGVNZ0NvbnRyb2wpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB1cGRhdGUgYXJyYXlzIG9mIHRhYmxlIGNoaWxkcmVuIGNvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzaXplXCI+PC9wYXJhbT5cclxuICBwdWJsaWMgSW5zZXJ0VGFibGVDaGlsZHJlbkFycmF5cyhpZHg6IG51bWJlciwgY291bnQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICBsZXQgY2hpbGRyZW46IExpc3Q8TWdDb250cm9sQmFzZT4gPSB0aGlzLlRhYmxlQ2hpbGRyZW47XHJcbiAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBsZXQgY29udHJvbDogTWdDb250cm9sQmFzZSA9IGNoaWxkcmVuW2ldO1xyXG4gICAgICAgICAgICAgIGNvbnRyb2wuSW5zZXJ0QXJyYXlzKGlkeCwgY291bnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIGNsYXNzIGRlc2NyaWJpbmcgcm93XHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vLyA8YXV0aG9yPnJpbmF2PC9hdXRob3I+XHJcbmV4cG9ydCBjbGFzcyBSb3cge1xyXG4gIENyZWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTsgICAgIC8vIGlzIHJvdyBjcmVhdGVkIG9uIGd1aSBsZXZlbFxyXG4gIFZhbGlkYXRlZDogYm9vbGVhbiA9IGZhbHNlOyAgIC8vIGlzIHJvdyBWYWxpZGF0ZWRcclxuXHJcbiAgY29uc3RydWN0b3IoKTtcclxuICBjb25zdHJ1Y3RvcihjcmVhdGVkOiBib29sZWFuLCB2YWxpZGF0ZWQ6IGJvb2xlYW4pO1xyXG4gIGNvbnN0cnVjdG9yKGNyZWF0ZWQ/OiBib29sZWFuLCB2YWxpZGF0ZWQ/OiBib29sZWFuKSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKGNyZWF0ZWQsIHZhbGlkYXRlZCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzAoKTogdm9pZCB7XHJcbiAgICB0aGlzLlZhbGlkYXRlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEoY3JlYXRlZDogYm9vbGVhbiwgdmFsaWRhdGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLkNyZWF0ZWQgPSBjcmVhdGVkO1xyXG4gICAgdGhpcy5WYWxpZGF0ZWQgPSB2YWxpZGF0ZWQ7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|