@sapui5/sap.fe.core 1.124.3 → 1.124.4
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/package.json +1 -1
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js +38 -37
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +40 -39
- package/src/sap/fe/core/converters/ManifestWrapper.js +3 -2
- package/src/sap/fe/core/converters/ManifestWrapper.ts +2 -2
- package/src/sap/fe/core/converters/controls/Common/Table.js +47 -38
- package/src/sap/fe/core/converters/controls/Common/Table.ts +33 -25
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +33 -37
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +30 -28
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +2 -2
- package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.ts +1 -1
|
@@ -155,58 +155,58 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
155
155
|
/**
|
|
156
156
|
* Creates a draft document for the existing active document.
|
|
157
157
|
*
|
|
158
|
-
* @param
|
|
159
|
-
* @returns Promise
|
|
158
|
+
* @param context Context of the active document
|
|
159
|
+
* @returns Promise resolved once the editable document is available with the editable context
|
|
160
160
|
* @public
|
|
161
161
|
* @since 1.90.0
|
|
162
162
|
*/;
|
|
163
|
-
_proto.editDocument = async function editDocument(
|
|
163
|
+
_proto.editDocument = async function editDocument(context) {
|
|
164
164
|
const transactionHelper = this.getTransactionHelper();
|
|
165
|
-
const
|
|
166
|
-
const model =
|
|
167
|
-
const
|
|
168
|
-
const
|
|
169
|
-
let
|
|
170
|
-
const
|
|
165
|
+
const rootViewController = this._getRootViewController();
|
|
166
|
+
const model = context.getModel();
|
|
167
|
+
const viewData = this.getView().getViewData();
|
|
168
|
+
const programmingModel = this.getProgrammingModel(context);
|
|
169
|
+
let rootContext = context;
|
|
170
|
+
const view = this.base.getView();
|
|
171
171
|
const groupId = "editGroup";
|
|
172
172
|
try {
|
|
173
|
-
if ((
|
|
174
|
-
if (
|
|
175
|
-
|
|
173
|
+
if ((viewData === null || viewData === void 0 ? void 0 : viewData.viewLevel) > 1) {
|
|
174
|
+
if (programmingModel === ProgrammingModel.Draft || programmingModel === ProgrammingModel.Sticky) {
|
|
175
|
+
rootContext = await CommonUtils.createRootContext(programmingModel, view, this.getAppComponent());
|
|
176
176
|
}
|
|
177
177
|
}
|
|
178
178
|
await this.base.editFlow.onBeforeEdit({
|
|
179
|
-
context:
|
|
179
|
+
context: rootContext
|
|
180
180
|
});
|
|
181
|
-
const rightmostContext = this._isFclEnabled() ?
|
|
182
|
-
const
|
|
181
|
+
const rightmostContext = this._isFclEnabled() ? rootViewController.getRightmostContext() : context;
|
|
182
|
+
const newDocumentContextPromise = transactionHelper.editDocument(rootContext, this.base.getView(), this.getAppComponent(), this.getMessageHandler(), groupId);
|
|
183
183
|
const rootContextInfo = {
|
|
184
|
-
rootSiblingPathPromise:
|
|
184
|
+
rootSiblingPathPromise: newDocumentContextPromise
|
|
185
185
|
};
|
|
186
|
-
this._setStickySessionInternalProperties(
|
|
186
|
+
this._setStickySessionInternalProperties(programmingModel, model);
|
|
187
187
|
let siblingInfoPromise;
|
|
188
188
|
// rightmostContext === rootContext => we're in OP. If not, we're in multi-column layout of FCL
|
|
189
|
-
const computeSiblingInfo = rightmostContext !==
|
|
189
|
+
const computeSiblingInfo = rightmostContext !== rootContext || (viewData === null || viewData === void 0 ? void 0 : viewData.viewLevel) > 1;
|
|
190
190
|
if (computeSiblingInfo) {
|
|
191
|
-
siblingInfoPromise = this._computeSiblingInformation(
|
|
191
|
+
siblingInfoPromise = this._computeSiblingInformation(rootContext, rightmostContext, programmingModel, true, rootContextInfo, groupId);
|
|
192
192
|
}
|
|
193
|
-
|
|
193
|
+
context.getModel().submitBatch(groupId);
|
|
194
194
|
let siblingInfo = await siblingInfoPromise;
|
|
195
|
-
const
|
|
196
|
-
let contextToNavigate =
|
|
195
|
+
const newDocumentContext = await newDocumentContextPromise;
|
|
196
|
+
let contextToNavigate = newDocumentContext;
|
|
197
197
|
if (computeSiblingInfo) {
|
|
198
198
|
if (siblingInfo === undefined) {
|
|
199
|
-
siblingInfo = await this._computeSiblingInformation(
|
|
199
|
+
siblingInfo = await this._computeSiblingInformation(rootContext, rightmostContext, programmingModel, true, rootContextInfo, "$auto");
|
|
200
200
|
}
|
|
201
|
-
contextToNavigate = this._getNavigationTargetForEdit(
|
|
201
|
+
contextToNavigate = this._getNavigationTargetForEdit(context, newDocumentContext, siblingInfo);
|
|
202
202
|
} else {
|
|
203
203
|
this._updatePathsInHistory([]);
|
|
204
204
|
}
|
|
205
|
-
if (
|
|
205
|
+
if (newDocumentContext) {
|
|
206
206
|
this.setEditMode(EditMode.Editable, false);
|
|
207
207
|
this.setDocumentModified(false);
|
|
208
208
|
this.getMessageHandler().showMessageDialog();
|
|
209
|
-
if (
|
|
209
|
+
if (newDocumentContext !== rootContext) {
|
|
210
210
|
await this.base.editFlow.onAfterEdit({
|
|
211
211
|
context: contextToNavigate
|
|
212
212
|
});
|
|
@@ -215,26 +215,27 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
215
215
|
recreateContext: false,
|
|
216
216
|
forceFocus: true
|
|
217
217
|
});
|
|
218
|
-
if (
|
|
218
|
+
if (programmingModel === ProgrammingModel.Sticky) {
|
|
219
219
|
// The stickyOn handler must be set after the navigation has been done,
|
|
220
220
|
// as the URL may change in the case of FCL
|
|
221
221
|
let stickyContext;
|
|
222
222
|
if (this._isFclEnabled()) {
|
|
223
223
|
// We need to use the kept-alive context used to bind the page
|
|
224
|
-
stickyContext =
|
|
224
|
+
stickyContext = newDocumentContext === null || newDocumentContext === void 0 ? void 0 : newDocumentContext.getModel().getKeepAliveContext(newDocumentContext.getPath());
|
|
225
225
|
} else {
|
|
226
|
-
stickyContext =
|
|
226
|
+
stickyContext = newDocumentContext;
|
|
227
227
|
}
|
|
228
228
|
this.handleStickyOn(stickyContext);
|
|
229
229
|
} else if (ModelHelper.isCollaborationDraftSupported(model.getMetaModel())) {
|
|
230
230
|
// according to UX in case of enabled collaboration draft we share the object immediately
|
|
231
|
-
await shareObject(
|
|
231
|
+
await shareObject(newDocumentContext);
|
|
232
232
|
}
|
|
233
233
|
return contextToNavigate;
|
|
234
234
|
}
|
|
235
235
|
}
|
|
236
|
-
} catch (
|
|
237
|
-
Log.error("Error while editing the document",
|
|
236
|
+
} catch (error) {
|
|
237
|
+
Log.error("Error while editing the document", error);
|
|
238
|
+
return Promise.reject(error);
|
|
238
239
|
}
|
|
239
240
|
}
|
|
240
241
|
|
|
@@ -1219,11 +1220,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1219
1220
|
context: oContext
|
|
1220
1221
|
});
|
|
1221
1222
|
const sProgrammingModel = this.getProgrammingModel(oContext);
|
|
1222
|
-
const
|
|
1223
|
+
const rootViewController = this._getRootViewController();
|
|
1223
1224
|
let siblingInfo;
|
|
1224
|
-
if ((sProgrammingModel === ProgrammingModel.Sticky || oContext.getProperty("HasActiveEntity")) &&
|
|
1225
|
+
if ((sProgrammingModel === ProgrammingModel.Sticky || oContext.getProperty("HasActiveEntity")) && rootViewController.isFclEnabled()) {
|
|
1225
1226
|
// No need to try to get rightmost context in case of a new object
|
|
1226
|
-
siblingInfo = await this._computeSiblingInformation(oContext,
|
|
1227
|
+
siblingInfo = await this._computeSiblingInformation(oContext, rootViewController.getRightmostContext(), sProgrammingModel, true);
|
|
1227
1228
|
}
|
|
1228
1229
|
|
|
1229
1230
|
// The $auto queue can only have pending changes at this point when SAVE was clicked immediately after changing a field.
|
|
@@ -1262,7 +1263,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1262
1263
|
}
|
|
1263
1264
|
}
|
|
1264
1265
|
this._updatePathsInHistory(siblingInfo.pathMapping);
|
|
1265
|
-
if (
|
|
1266
|
+
if (rootViewController.isFclEnabled()) {
|
|
1266
1267
|
if (siblingInfo.targetContext.getPath() !== activeDocumentContext.getPath()) {
|
|
1267
1268
|
contextToNavigate = siblingInfo.targetContext;
|
|
1268
1269
|
}
|
|
@@ -2895,4 +2896,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
2895
2896
|
}(BaseControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "editDocument", [_dec2, _dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "editDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "updateDocument", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "updateDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createDocument", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "createDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeCreate", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeEdit", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeSave", [_dec12, _dec13, _dec14], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDiscard", [_dec15, _dec16], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDelete", [_dec17, _dec18], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterSave", [_dec19, _dec20, _dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterCreate", [_dec22, _dec23], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterEdit", [_dec24, _dec25], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterDiscard", [_dec26, _dec27], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterDelete", [_dec28, _dec29], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "saveDocument", [_dec30, _dec31], Object.getOwnPropertyDescriptor(_class2.prototype, "saveDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "cancelDocument", [_dec32, _dec33], Object.getOwnPropertyDescriptor(_class2.prototype, "cancelDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteDocument", [_dec34, _dec35], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyDocument", [_dec36, _dec37], Object.getOwnPropertyDescriptor(_class2.prototype, "applyDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "invokeAction", [_dec38, _dec39], Object.getOwnPropertyDescriptor(_class2.prototype, "invokeAction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterActionExecution", [_dec40, _dec41], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterActionExecution"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "securedExecution", [_dec42, _dec43], Object.getOwnPropertyDescriptor(_class2.prototype, "securedExecution"), _class2.prototype)), _class2)) || _class);
|
|
2896
2897
|
return EditFlow;
|
|
2897
2898
|
}, false);
|
|
2898
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiQ29uc3RhbnRzIiwiRHJhZnRTdGF0dXMiLCJFZGl0TW9kZSIsIlN0YXJ0dXBNb2RlIiwiTWVzc2FnZVR5cGUiLCJjb3JlTGlicmFyeSIsIkVkaXRGbG93IiwiZGVmaW5lVUk1Q2xhc3MiLCJwdWJsaWNFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiaG9va2FibGUiLCJzeW5jVGFza3MiLCJQcm9taXNlIiwicmVzb2x2ZSIsImhhbmRsZVNpZGVFZmZlY3RzIiwibGlzdEJpbmRpbmciLCJjcmVhdGlvblByb21pc2UiLCJ2aWV3QmluZGluZ0NvbnRleHQiLCJnZXRWaWV3IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJuZXdDb250ZXh0IiwiY3JlYXRlZCIsIkNvbW1vblV0aWxzIiwiaGFzVHJhbnNpZW50Q29udGV4dCIsImdldEFwcENvbXBvbmVudCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSIsImdldFBhdGgiLCJlcnJvciIsIkxvZyIsImNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyIsInZhbGlkYXRpb25NZXNzYWdlcyIsInRhYmxlIiwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwiZ2V0Q3JlYXRpb25Sb3ciLCJkYXRhIiwiY3VzdG9tVmFsaWRpdHkiLCJnZXRQcm9wZXJ0eSIsImN1c3RvbU1lc3NhZ2VzIiwiZmllbGRDb250cm9sIiwiZmluYWxUYXJnZXQiLCJvbGRNZXNzYWdlcyIsIk1lc3NhZ2luZyIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJmaWx0ZXIiLCJtZXNzYWdlIiwiZ2V0Q29kZSIsInJlbW92ZU1lc3NhZ2VzIiwiZm9yRWFjaCIsInZhbGlkYXRpb25NZXNzYWdlIiwibWVzc2FnZVRhcmdldCIsIkVsZW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImZpZWxkSWQiLCJnZXRCaW5kaW5nUGF0aCIsImdldFRhcmdldHMiLCJzb21lIiwidGFyZ2V0IiwibGVuZ3RoIiwiYWRkTWVzc2FnZXMiLCJNZXNzYWdlIiwibWVzc2FnZVRleHQiLCJwcm9jZXNzb3IiLCJnZXRNb2RlbCIsInR5cGUiLCJFcnJvciIsImNvZGUiLCJ0ZWNobmljYWwiLCJwZXJzaXN0ZW50IiwiZXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMiLCJhZGRDb250cm9sSWQiLCJwdXNoIiwidGV4dCIsImdldE1lc3NhZ2VIYW5kbGVyIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJyZXNvbHZlQ3JlYXRpb25Nb2RlIiwiaW5pdGlhbENyZWF0aW9uTW9kZSIsImNyZWF0ZURhdGEiLCJOZXdQYWdlIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwicHJvZ3JhbW1pbmdNb2RlbCIsImdldFByb2dyYW1taW5nTW9kZWwiLCJpc1JlbGF0aXZlIiwiZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiZ2V0TWV0YUNvbnRleHQiLCJlbnRpdHlTZXQiLCJ0YXJnZXRFbnRpdHlTZXQiLCJuZXdBY3Rpb24iLCJEcmFmdCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiRHJhZnRSb290IiwiU2Vzc2lvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJOZXdBY3Rpb24iLCJ0b1N0cmluZyIsInRhcmdldEVudGl0eVR5cGUiLCJhY3Rpb25zIiwicGFyYW1ldGVycyIsIkRlZmVycmVkIiwiY3JlYXRpb25QYXJhbWV0ZXJzIiwiZ2V0VHJhbnNhY3Rpb25IZWxwZXIiLCJnZXRDcmVhdGlvblBhcmFtZXRlcnMiLCJBc3luYyIsImdldEludGVyZmFjZSIsImJhc2UiLCJlZGl0RG9jdW1lbnQiLCJvQ29udGV4dCIsInRyYW5zYWN0aW9uSGVscGVyIiwib1Jvb3RWaWV3Q29udHJvbGxlciIsIl9nZXRSb290Vmlld0NvbnRyb2xsZXIiLCJtb2RlbCIsIm9WaWV3RGF0YSIsImdldFZpZXdEYXRhIiwic1Byb2dyYW1taW5nTW9kZWwiLCJvUm9vdENvbnRleHQiLCJvVmlldyIsImdyb3VwSWQiLCJ2aWV3TGV2ZWwiLCJTdGlja3kiLCJjcmVhdGVSb290Q29udGV4dCIsImVkaXRGbG93Iiwib25CZWZvcmVFZGl0IiwiY29udGV4dCIsInJpZ2h0bW9zdENvbnRleHQiLCJfaXNGY2xFbmFibGVkIiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsIm9OZXdEb2N1bWVudENvbnRleHRQcm9taXNlIiwicm9vdENvbnRleHRJbmZvIiwicm9vdFNpYmxpbmdQYXRoUHJvbWlzZSIsIl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzIiwic2libGluZ0luZm9Qcm9taXNlIiwiY29tcHV0ZVNpYmxpbmdJbmZvIiwiX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJzdWJtaXRCYXRjaCIsInNpYmxpbmdJbmZvIiwib05ld0RvY3VtZW50Q29udGV4dCIsImNvbnRleHRUb05hdmlnYXRlIiwidW5kZWZpbmVkIiwiX2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0IiwiX3VwZGF0ZVBhdGhzSW5IaXN0b3J5Iiwic2V0RWRpdE1vZGUiLCJFZGl0YWJsZSIsInNldERvY3VtZW50TW9kaWZpZWQiLCJvbkFmdGVyRWRpdCIsIl9oYW5kbGVOZXdDb250ZXh0IiwiZWRpdGFibGUiLCJyZWNyZWF0ZUNvbnRleHQiLCJmb3JjZUZvY3VzIiwic3RpY2t5Q29udGV4dCIsImdldEtlZXBBbGl2ZUNvbnRleHQiLCJoYW5kbGVTdGlja3lPbiIsIk1vZGVsSGVscGVyIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJzaGFyZU9iamVjdCIsIm9FcnJvciIsInJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlIiwicGFyZW50Q29udGV4dCIsInNpZGVFZmZlY3RTZXJ2aWNlIiwic3RhdGVNZXNzYWdlc1BhdGgiLCJnZXRNZXNzYWdlc1BhdGgiLCJpc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMiLCJjb250ZXh0c1RvRGVsZXRlIiwiYmVmb3JlRGVsZXRlQ2FsbEJhY2siLCJvbkJlZm9yZURlbGV0ZSIsImxvY2tPYmplY3QiLCJnZXRHbG9iYWxVSU1vZGVsIiwicGFyZW50Q29udHJvbCIsImJ5SWQiLCJjb250cm9sSWQiLCJpbmFjdGl2ZUNvbnRleHRzVG9EZWxldGUiLCJpc0EiLCJpc0luYWN0aXZlIiwiZ2V0QmluZGluZyIsImdldFJvd0JpbmRpbmciLCJiRmluZEFjdGl2ZUNvbnRleHRzIiwiQnVzeUxvY2tlciIsImxvY2siLCJzZWxlY3RlZENvbnRleHRzIiwiZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbiIsInJlc3VsdCIsImNsZWFyU2VsZWN0aW9uIiwiaXNSb290IiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJnZXRIZWFkZXJDb250ZXh0IiwiYXR0YWNoRXZlbnRPbmNlIiwicmVmcmVzaCIsIkVkaXRTdGF0ZSIsInNldEVkaXRTdGF0ZURpcnR5IiwiaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQiLCJyZWNvbW1lbmRhdGlvbnMiLCJpZ25vcmVSZWNvbW1lbmRhdGlvbkZvckNvbnRleHRzIiwib25BZnRlckRlbGV0ZSIsImNvbnRleHRzIiwidGFibGVBUEkiLCJnZXRQYXJlbnQiLCJ0YWJsZURlZmluaXRpb24iLCJjb250cm9sIiwiY3JlYXRpb25Nb2RlIiwiSW5saW5lQ3JlYXRpb25Sb3dzIiwicmVtb3ZlRW1wdHlSb3dzTWVzc2FnZXMiLCJzZXRVcEVtcHR5Um93cyIsIl9zZW5kQWN0aXZpdHkiLCJBY3Rpdml0eSIsIkRlbGV0ZSIsInVubG9jayIsInVwZGF0ZURvY3VtZW50IiwidXBkYXRlZENvbnRleHQiLCJ1cGRhdGVQcm9taXNlIiwib3JpZ2luYWxCaW5kaW5nQ29udGV4dCIsImlzRHJhZnQiLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJzeW5jVGFzayIsInNldERyYWZ0U3RhdHVzIiwiU2F2aW5nIiwiY3VycmVudEJpbmRpbmdDb250ZXh0IiwiZW50aXR5U2V0TmFtZSIsImdldE9iamVjdCIsInNlbWFudGljS2V5cyIsIlNlbWFudGljS2V5SGVscGVyIiwiZ2V0U2VtYW50aWNLZXlzIiwiY3VycmVudFNlbWFudGljTWFwcGluZyIsIl9nZXRTZW1hbnRpY01hcHBpbmciLCJjdXJyZW50U2VtYW50aWNQYXRoIiwic2VtYW50aWNQYXRoIiwic0NoYW5nZWRQYXRoIiwiZ2V0U2VtYW50aWNQYXRoIiwiU2F2ZWQiLCJDbGVhciIsInNob3dNZXNzYWdlcyIsImdldFBhcmVudENvbnRleHRGcm9tU2VsZWN0aW9uIiwiY3JlYXRlRG9jdW1lbnQiLCJ2TGlzdEJpbmRpbmciLCJtSW5QYXJhbWV0ZXJzIiwib0RhdGFMaXN0QmluZGluZyIsIkV4dGVybmFsIiwib0RhdGFNb2RlbCIsImJpbmRMaXN0IiwiU3luYyIsImNyZWF0ZUF0RW5kIiwicmVzb2x2ZWRDcmVhdGlvbk1vZGUiLCJnZXRSb3V0ZXJQcm94eSIsInJlbW92ZUlBcHBTdGF0ZUtleSIsInNpbmdsZURyYWZ0Rm9yQ3JlYXRlIiwiZ2V0TWFuaWZlc3QiLCJhcHAiLCJnZXRSb290QmluZGluZyIsIm5ld0JpbmRpbmciLCJnZXRDb250ZXh0IiwiU29ydGVyIiwiRmlsdGVyIiwiZmlsdGVycyIsInBhdGgiLCJvcGVyYXRvciIsInZhbHVlMSIsImFuZCIsInJlcXVlc3RDb250ZXh0cyIsInRoZW4iLCJkZXN0cm95IiwiX2hhbmRsZUNyZWF0aW9uTW9kZSIsImNyZWF0ZUV4dGVybmFsRG9jdW1lbnQiLCJvdXRib3VuZCIsImNyZWF0ZURlZmVycmVkRG9jdW1lbnQiLCJDcmVhdGlvblJvdyIsImNyZWF0aW9uUm93IiwiY3JlYXRlQ3JlYXRlUm93RG9jdW1lbnQiLCJza2lwU2lkZUVmZmVjdHMiLCJJbmxpbmUiLCJjcmVhdGVJbmxpbmVEb2N1bWVudCIsInRhYmxlSWQiLCJjcmVhdGVTeW5jQXN5bmNEb2N1bWVudCIsImJGcm9tRGVmZXJyZWQiLCJjcmVhdGVBY3Rpb24iLCJwb3N0RG9jdW1lbnRDcmVhdGlvbiIsInByZXJlcXVpc2l0ZSIsInBhcmFtcyIsIm5ld0RvY3VtZW50Q29udGV4dCIsIm9uQWZ0ZXJDcmVhdGUiLCJtZXRhQ29udGV4dCIsInN0YXJ0aW5nRW50aXR5U2V0IiwiZ2V0SW50ZXJuYWxNb2RlbCIsInNldFByb3BlcnR5IiwiZm9yY2VEcmFmdFNhdmVPckRpc2NhcmQiLCJzZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUiLCJDcmVhdGUiLCJpc0RyYWZ0Um9vdCIsImNvbGxhYm9yYXRpdmVEcmFmdCIsImlzQ29ubmVjdGVkIiwiYXBwQ29tcG9uZW50IiwibmF2aWdhdGlvbiIsImNyZWF0aW9uUm93Q29udGV4dCIsImRvY3VtZW50VmFsaWRhdGlvbiIsImdldENyZWF0aW9uUm93VmFsaWRhdGlvbkZ1bmN0aW9uIiwiZW50aXR5VHlwZSIsImNyZWF0aW9uUm93UGF5bG9hZCIsIl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMiLCJjcmVhdGlvbiIsInNjcm9sbFRvSW5kZXgiLCJnZXRMZW5ndGgiLCJoYW5kbGVDcmVhdGVFdmVudHMiLCJPYmplY3QiLCJhc3NpZ24iLCJrZXlzIiwicHJvcGVydHlQYXRoIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJmaW5kSW5kZXgiLCJwcm9wZXJ0eSIsIm5hbWUiLCJtYXAiLCJrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIiwiYnVzeU1vZGUiLCJidXN5SWQiLCJnZXRUYWJsZURlZmluaXRpb24iLCJhbm5vdGF0aW9uIiwiaWQiLCJiZWZvcmVDcmVhdGVDYWxsQmFjayIsIm9uQmVmb3JlQ3JlYXRlIiwic2tpcFBhcmFtZXRlckRpYWxvZyIsImdldFN0YXJ0dXBNb2RlIiwiQXV0b0NyZWF0ZSIsImNyZWF0aW9uUm93TGlzdEJpbmRpbmciLCJuZXdUcmFuc2llbnRDb250ZXh0IiwiY3JlYXRlIiwic2V0QmluZGluZ0NvbnRleHQiLCJjYXRjaCIsInRyYWNlIiwiZGVsZXRlIiwiaXNMb2NrZWQiLCJhbGwiLCJhbGxDdXJyZW50Q29udGV4dHMiLCJnZXRBbGxDdXJyZW50Q29udGV4dHMiLCJjb250ZXh0SW5kZXgiLCJpbmRleE9mIiwiZm9jdXNSb3ciLCJwYXJlbnRJbmRleCIsImdldEludGVybmFsUm91dGluZyIsIm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dCIsImNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzIiwibW9kZSIsInJvdXRpbmdMaXN0ZW5lciIsImNyZWF0ZUNvbnRleHRQcm9taXNlIiwiY29yZVJlc291cmNlQnVuZGxlIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwibmF2aWdhdGVUb01lc3NhZ2VQYWdlIiwiZ2V0VGV4dCIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJuYXZQYXJhbWV0ZXJzIiwidHJhbnNpZW50IiwibmF2aWdhdGVUb0NvbnRleHQiLCJDYW5jZWxBY3Rpb25EaWFsb2ciLCJBY3Rpb25FeGVjdXRpb25GYWlsZWQiLCJDcmVhdGlvbkZhaWxlZCIsIk9uQmVmb3JlQ3JlYXRlRmFpbGVkIiwiaW5jbHVkZXMiLCJuYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUiLCJjb250cm9sbGVyIiwiZ2V0Q29udHJvbGxlciIsImNyZWF0ZVBhdGgiLCJnZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmciLCJfaW50ZW50QmFzZWROYXZpZ2F0aW9uIiwib25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kIiwidmFsaWRhdGVEb2N1bWVudCIsImNyZWF0aW9uUm93T2JqZWN0cyIsImNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzIiwiZGF0YUZvckNyZWF0ZSIsImlzRnJvbUNvcHlQYXN0ZSIsImNyZWF0ZUFzSW5hY3RpdmUiLCJ0YXJnZXRMaXN0QmluZGluZyIsImNvbnRleHRQYXRoIiwibWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsImNyZWF0aW9uUHJvbWlzZXMiLCJwcm9wZXJ0eVZhbHVlcyIsImNyZWF0ZVBhcmFtZXRlcnMiLCJpbmFjdGl2ZSIsIiRraW5kIiwiY3JlYXRlZENvbnRleHRzIiwiYWN0aXZlQ29udGV4dHMiLCJlcnIiLCJfbVBhcmFtZXRlcnMiLCJvbkJlZm9yZVNhdmUiLCJvbkJlZm9yZURpc2NhcmQiLCJvbkFmdGVyU2F2ZSIsIm9uQWZ0ZXJEaXNjYXJkIiwic2F2ZURvY3VtZW50IiwibVBhcmFtZXRlcnMiLCJiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciIsImFCaW5kaW5ncyIsImJpbmRpbmdzIiwibWVyZ2VQYXRjaERyYWZ0IiwiX3N1Ym1pdE9wZW5DaGFuZ2VzIiwicmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuIiwiY2hlY2tSZWNvbW1lbmRhdGlvbk9wdGlvbiIsImlzRmNsRW5hYmxlZCIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiYWN0aXZlRG9jdW1lbnRDb250ZXh0IiwiX2dldFJlc291cmNlTW9kZWwiLCJnZXRDcmVhdGlvbk1vZGUiLCJfcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsIkFjdGl2YXRlIiwiZGlzY29ubmVjdCIsIl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleSIsIlN0YW5kYXJkQWN0aW9ucyIsInNhdmUiLCJUcmlnZ2VyVHlwZSIsInN0YW5kYXJkQWN0aW9uIiwiRGlzcGxheSIsInN0b3JlRGF0YUZvclRlbGVtZXRyeSIsIl9jcmVhdGVTaWJsaW5nSW5mbyIsInByZXZpb3VzU2VtYW50aWNQYXRoIiwibmV3U2VtYW50aWNQYXRoIiwicGF0aE1hcHBpbmciLCJvbGRQYXRoIiwibmV3UGF0aCIsInRhcmdldENvbnRleHQiLCJjYW5jZWxlZCIsInRvZ2dsZURyYWZ0QWN0aXZlIiwib0NvbnRleHREYXRhIiwiYklzRHJhZnQiLCJJc0FjdGl2ZUVudGl0eSIsIkhhc0FjdGl2ZUVudGl0eSIsIkhhc0RyYWZ0RW50aXR5Iiwib1JpZ2h0bW9zdENvbnRleHQiLCJsYXN0U2VtYW50aWNNYXBwaW5nIiwidGVjaG5pY2FsUGF0aCIsInRhcmdldFBhdGgiLCJjYW5jZWxEb2N1bWVudCIsImlzTmV3RG9jdW1lbnQiLCJjYW5jZWxQYXJhbWV0ZXJzIiwic2tpcERpc2NhcmRQb3BvdmVyIiwiY2FuY2VsQnV0dG9uIiwiYmVmb3JlQ2FuY2VsQ2FsbEJhY2siLCJjYW5jZWxSZXN1bHQiLCJpc0RvY3VtZW50TW9kaWZpZWQiLCJnZXRJbnN0YW5jZWRWaWV3cyIsInZpZXciLCJpc0tlZXBBbGl2ZSIsInNldEtlZXBBbGl2ZSIsIkRpc2NhcmQiLCJza2lwQmFja05hdmlnYXRpb24iLCJuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCIsIm9BY3RpdmVEb2N1bWVudENvbnRleHQiLCJfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyIsInNraXBCaW5kaW5nVG9WaWV3Iiwic2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2UiLCJyZXNvdXJjZU1vZGVsIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJhdHRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsInNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCIsIk1lc3NhZ2VUb2FzdCIsInNob3ciLCJkZXRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsImRlbGV0ZURvY3VtZW50Iiwib0FwcENvbXBvbmVudCIsImdldEluZGV4Iiwic2libGluZ0NvbnRleHQiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsImRyYWZ0UGF0aCIsInJlcXVlc3RDYW5vbmljYWxQYXRoIiwiZHJhZnRDb250ZXh0VG9SZW1vdmUiLCJyZXBsYWNlV2l0aCIsImNvbnRleHRCaW5kaW5nIiwicGFyZW50TGlzdEJpbmRpbmciLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJEZWVwbGluayIsImV4aXRGcm9tQXBwIiwiYXBwbHlEb2N1bWVudCIsIm9Mb2NrT2JqZWN0IiwiY2hlY2tJZlJlY29tbWVuZGF0aW9uc0V4aXN0IiwiaXNDb250aW51ZSIsInNob3dDb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nIiwiUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiIsIkNvbnRpbnVlIiwiaW52b2tlQWN0aW9uIiwic0FjdGlvbk5hbWUiLCJtRXh0cmFQYXJhbXMiLCJhUGFydHMiLCJzT3ZlcmxvYWRFbnRpdHlUeXBlIiwib0N1cnJlbnRBY3Rpb25DYWxsQmFja3MiLCJBcnJheSIsImlzQXJyYXkiLCJpc05hdmlnYWJsZSIsInJlcXVpcmVzTmF2aWdhdGlvbiIsImNvbnZlcnRlZE1ldGFkYXRhIiwiY29udmVydFR5cGVzIiwiZW50aXR5Q29udGFpbmVyIiwiaXNCb3VuZCIsIm9Db250cm9sIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJpZ25vcmVFVGFnIiwic3BsaXQiLCJyZXBsYWNlQWxsIiwiYlN0YXRpY0FjdGlvbiIsImlzVGFibGVCb3VuZCIsInNCaW5kaW5nUGF0aCIsIm9MaXN0QmluZGluZyIsIl9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tTWV0YWRhdGFQYXRoIiwiZW5hYmxlQXV0b1Njcm9sbCIsImNyZWF0ZUFjdGlvblByb21pc2UiLCJnZXRJZCIsImJHZXRCb3VuZENvbnRleHQiLCJfZ2V0Qm91bmRDb250ZXh0IiwiYk9iamVjdFBhZ2UiLCJjb252ZXJ0ZXJUeXBlIiwib1Jlc3BvbnNlIiwiY2FsbEFjdGlvbiIsImxpc3RSZWZyZXNoZWQiLCJfcmVmcmVzaExpc3RJZlJlcXVpcmVkIiwiZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyIsImFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXMiLCJ2YWx1ZSIsIkFjdGlvbiIsImFjdGlvbiIsImZSZXNvbHZlciIsInZDb250ZXh0Iiwib01ldGFNb2RlbCIsInNDb250ZXh0TWV0YVBhdGgiLCJfZm5WYWxpZENvbnRleHRzIiwiYXBwbGljYWJsZUNvbnRleHRzIiwiZWxlbWVudCIsIm9BY3Rpb25Db250ZXh0Iiwic0FjdGlvbkNvbnRleHRNZXRhUGF0aCIsImNoZWNrTm9IYXNoQ2hhbmdlIiwicmV0dXJuQ29udGV4dCIsImluZm8iLCJvbkFmdGVyQWN0aW9uRXhlY3V0aW9uIiwiZlJlamVjdG9yIiwiZXJyUHJvbWlzZSIsInJlamVjdGVkSXRlbXMiLCJfYWN0aW9uTmFtZSIsInNlY3VyZWRFeGVjdXRpb24iLCJmbkZ1bmN0aW9uIiwiYkJ1c3lTZXQiLCJidXN5Iiwic2V0IiwiYkJ1c3lDaGVjayIsImNoZWNrIiwiYlVwZGF0ZXNEb2N1bWVudCIsInVwZGF0ZXNEb2N1bWVudCIsInJlamVjdCIsImZpbmFsbHkiLCJoYW5kbGVQYXRjaFNlbnQiLCJvRXZlbnQiLCJpbnRlcm5hbENvbnRleHQiLCJnZXRTb3VyY2UiLCJzZXRJZ25vcmVFVGFnIiwic291cmNlQmluZGluZyIsIm9QYXRjaFByb21pc2UiLCJwYXRjaENvbXBsZXRlZEV2ZW50IiwiQWN0aW9uUnVudGltZSIsInNldEFjdGlvbkVuYWJsZW1lbnRBZnRlclBhdGNoIiwiYlN1Y2Nlc3MiLCJnZXRQYXJhbWV0ZXIiLCJoYW5kbGVDcmVhdGVTZW50IiwiZXZlbnQiLCJuZXdUYXNrIiwiZGVidWciLCJjb21wdXRlRWRpdE1vZGUiLCJnbG9iYWxNb2RlbCIsImlzQWN0aXZlRW50aXR5IiwicmVxdWVzdE9iamVjdCIsImhhc0FjdGl2ZUVudGl0eSIsImxhc3RJbnZva2VkQWN0aW9uTmFtZSIsImlzTmV3QWN0aW9uRm9yU3RpY2t5IiwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIiwiZ2V0UmVzb3VyY2VNb2RlbCIsIlRyYW5zYWN0aW9uSGVscGVyIiwibWVzc2FnZUhhbmRsZXIiLCJzZXRDcmVhdGlvbk1vZGUiLCJiQ3JlYXRpb25Nb2RlIiwidWlNb2RlbENvbnRleHQiLCJVaU1vZGVsQ29uc3RhbnRzIiwiQ3JlYXRlTW9kZSIsIkRvY3VtZW50TW9kaWZpZWQiLCJtb2RpZmllZCIsImJpbmRpbmciLCJhdHRhY2hFdmVudCIsInN1Y2Nlc3MiLCJkcmFmdFN0YXR1cyIsInNvdXJjZSIsImVkaXRNb2RlIiwiaXNDcmVhdGlvbiIsImZvcmNlZCIsInNoYWxsRm9yY2VEcmFmdFNhdmVPckRpc2NhcmQiLCJhY3Rpb25OYW1lIiwic3RpY2t5U2Vzc2lvbiIsIkFkZGl0aW9uYWxOZXdBY3Rpb25zIiwiaGFzTmF2aWdhdGlvbkd1YXJkIiwiaGFzaFRyYWNrZXIiLCJnZXRIYXNoIiwiaW50ZXJuYWxNb2RlbCIsInNldFRpbWVvdXQiLCJzZXROYXZpZ2F0aW9uR3VhcmQiLCJzdWJzdHJpbmciLCJvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uIiwiYmluZCIsImRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uIiwiZ2V0RGlydHlTdGF0ZVByb3ZpZGVyIiwicmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIiLCJpMThuTW9kZWwiLCJzZXNzaW9uVGltZW91dEZ1bmN0aW9uIiwiZ2V0U2Vzc2lvblRpbWVvdXRGdW5jdGlvbiIsImF0dGFjaFNlc3Npb25UaW1lb3V0Iiwic3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbkZ1bmN0aW9uIiwiZ2V0Um91dGVNYXRjaGVkRnVuY3Rpb24iLCJhdHRhY2hSb3V0ZU1hdGNoZWQiLCJoYW5kbGVTdGlja3lPZmYiLCJkaXNjYXJkTmF2aWdhdGlvbkd1YXJkIiwiZGVyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciIsImRldGFjaFNlc3Npb25UaW1lb3V0IiwiZGV0YWNoUm91dGVNYXRjaGVkIiwiZ2V0SHR0cEhlYWRlcnMiLCJuYXZpZ2F0aW9uQ29udGV4dCIsInRhcmdldEhhc2giLCJpbm5lckFwcFJvdXRlIiwicm91dGVyUHJveHkiLCJsY2xIYXNoVHJhY2tlciIsImlzRGlydHkiLCJpc1Nlc3Npb25PbiIsImlzTmF2aWdhdGlvbkZpbmFsaXplZCIsImNoZWNrSGFzaFdpdGhHdWFyZCIsImlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIiLCJzZXREaXJ0eUZsYWciLCJ3YXJuaW5nRGlhbG9nIiwiRGlhbG9nIiwic3RhdGUiLCJjb250ZW50IiwiVGV4dCIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwicHJlc3MiLCJhZnRlckNsb3NlIiwiYWRkU3R5bGVDbGFzcyIsInNldE1vZGVsIiwiYWRkRGVwZW5kZW50Iiwib3BlbiIsImN1cnJlbnRIYXNoIiwiZGlzY2FyZFN0aWNreVNlc3Npb24iLCJjbGVhclNlc3Npb25Db250ZXh0IiwiZGlzY2FyZGVkQ29udGV4dCIsInN0aWNreSIsImRpc2NhcmREb2N1bWVudCIsInJlc2V0Q2hhbmdlcyIsIl9yb3V0aW5nIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiZ2V0TGFzdFNlbWFudGljTWFwcGluZyIsInJlc29sdmVGdW5jdGlvbiIsInJlamVjdEZ1bmN0aW9uIiwiYWN0aW9uUHJvbWlzZSIsInJlc3BvbnNlIiwiY3VycmVudFZpZXciLCJtZXRhTW9kZWxEYXRhIiwibWV0YU1vZGVsQWN0aW9uIiwiYWN0aW9uUmV0dXJuVHlwZSIsIiRSZXR1cm5UeXBlIiwiJFR5cGUiLCIkS2V5Iiwib0RhdGEiLCJnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsImRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiaXNTYXZlIiwiY29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyIsIkNvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZ0Jsb2NrIiwiX3Njcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyIsInJvd0JpbmRpbmciLCJhY3RpdmVSb3dJbmRleCIsImdldENvdW50IiwiYWxsUm93Q29udGV4dHMiLCJnZXRDb250ZXh0cyIsImluZGV4Iiwic2luZ2xlQ29udGV4dCIsImNyZWF0ZUVtcHR5Um93c0FuZEZvY3VzIiwiaW5saW5lQ3JlYXRpb25Sb3dzSGlkZGVuSW5FZGl0TW9kZSIsInJlbGF0ZWRDb250ZXh0cyIsInRyaWdnZXJlZEFjdGlvbk5hbWUiLCJyZWZyZXNoTGlzdEJpbmRpbmciLCJzZW5kIiwidHJpZ2dlclR5cGUiLCJ0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSIsIm9Nb2RlbCIsIm9SZXF1ZXN0b3IiLCJ3YWl0Rm9yUnVubmluZ0NoYW5nZVJlcXVlc3RzIiwiY2hlY2tJZkJhY2tJc091dE9mR3VhcmQiLCJwcm9jZXNzRGF0YUxvc3NDb25maXJtYXRpb24iLCJoaXN0b3J5IiwiYmFjayIsIm5hdmlnYXRpb25QYXJhbWV0ZXJzIiwicGVyc2lzdE9QU2Nyb2xsIiwicmVhc29uIiwiTmF2aWdhdGlvblJlYXNvbiIsIkVkaXRGbG93QWN0aW9uIiwic2hvd1BsYWNlaG9sZGVyIiwia2VlcEN1cnJlbnRMYXlvdXQiLCJiUmVmcmVzaEFmdGVyQWN0aW9uIiwic1ZpZXdJZCIsImFNZXNzYWdlcyIsInZhbGlkYXRpb24iLCJnZXRDb250cm9sSWQiLCJvQmluZGluZyIsImFLZXlzIiwib0N1cnJlbnREYXRhIiwiYlJldHVybmVkQ29udGV4dElzU2FtZSIsImV2ZXJ5Iiwic0tleSIsImUiLCJzRW50aXR5U2V0TmFtZSIsImFTZW1hbnRpY0tleXMiLCJhUmVxdWVzdFByb21pc2VzIiwib0tleSIsIiRQcm9wZXJ0eVBhdGgiLCJyb290Q29udGV4dCIsIm92ZXJsb2FkRW50aXR5VHlwZSIsImNvbnRleHRTZWdtZW50cyIsImN1cnJlbnRDb250ZXh0IiwicG9wIiwidW5zaGlmdCIsInBhcmVudENvbnRleHRzIiwicGF0aFNlZ21lbnQiLCJyZXZlcnNlIiwib3ZlcmxvYWRDb250ZXh0IiwiZmluZCIsIm1hcHBpbmdzIiwic2V0UGF0aE1hcHBpbmciLCJyb290Q3VycmVudENvbnRleHQiLCJyaWdodG1vc3RDdXJyZW50Q29udGV4dCIsImRvTm90Q29tcHV0ZUlmUm9vdCIsInN0YXJ0c1dpdGgiLCJkcmFmdCIsImNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJCYXNlQ29udHJvbGxlckV4dGVuc2lvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRWRpdEZsb3cudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBCYXNlQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQmFzZUNvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBTdGFuZGFyZEFjdGlvbnMsIFRyaWdnZXJUeXBlLCB0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9GZWVkYmFja1wiO1xuaW1wb3J0IHsgaG9va2FibGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSG9va1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIEludGVybmFsUm91dGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZXJuYWxSb3V0aW5nXCI7XG5pbXBvcnQgdHlwZSBNZXNzYWdlSGFuZGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB0eXBlIHsgQ3VzdG9tTWVzc2FnZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHsgQWN0aXZpdHksIHNoYXJlT2JqZWN0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBDYW5jZWxQYXJhbWV0ZXJzLCBDcmVhdGVQYXJhbWV0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L1RyYW5zYWN0aW9uSGVscGVyXCI7XG5pbXBvcnQgVHJhbnNhY3Rpb25IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L1RyYW5zYWN0aW9uSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRDb250ZXh0UGFyYW1ldGVycywgUm9vdENvbnRleHRJbmZvLCBTaWJsaW5nSW5mb3JtYXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBVaU1vZGVsQ29uc3RhbnRzIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9lZGl0Rmxvd0NvbnN0YW50c1wiO1xuaW1wb3J0IHN0aWNreSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvc3RpY2t5XCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbEFjdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSB7IERyYWZ0U2libGluZ1BhaXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9EZWxldGVIZWxwZXJcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2VNb2RlbCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Jlc291cmNlTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBTZW1hbnRpY0tleUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TZW1hbnRpY0tleUhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgRmNsQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvcm9vdFZpZXcvRmNsLmNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFJvb3RWaWV3QmFzZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL3Jvb3RWaWV3L1Jvb3RWaWV3QmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzLCBTZW1hbnRpY01hcHBpbmcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvUm91dGluZ1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBUYWJsZUFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUFQSVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlVG9hc3QgZnJvbSBcInNhcC9tL01lc3NhZ2VUb2FzdFwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCB0eXBlIFVJNUV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IHR5cGUgQmFzZU9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgRWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IE1lc3NhZ2luZyBmcm9tIFwic2FwL3VpL2NvcmUvTWVzc2FnaW5nXCI7XG5pbXBvcnQgY29yZUxpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQ3JlYXRpb25Sb3cgZnJvbSBcInNhcC91aS9tZGMvdGFibGUvQ3JlYXRpb25Sb3dcIjtcbmltcG9ydCB0eXBlIEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nXCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyXCI7XG5pbXBvcnQgdHlwZSBNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgU29ydGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvU29ydGVyXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIENvbnRleHQsIGRlZmF1bHQgYXMgT0RhdGFWNENvbnRleHQgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgT0RhdGFDb250ZXh0QmluZGluZyRQYXRjaFNlbnRFdmVudCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbEVudGl0eVR5cGUgfSBmcm9tIFwidHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5pbXBvcnQgQWN0aW9uUnVudGltZSBmcm9tIFwiLi4vQWN0aW9uUnVudGltZVwiO1xuaW1wb3J0IHtcblx0Q29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nQmxvY2ssXG5cdFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb25cbn0gZnJvbSBcIi4uL2NvbnRyb2xzL1JlY29tbWVuZGF0aW9ucy9Db25maXJtUmVjb21tZW5kYXRpb25EaWFsb2cuYmxvY2tcIjtcbmltcG9ydCB0eXBlIHsgQmFzZU1hbmlmZXN0U2V0dGluZ3MgfSBmcm9tIFwiLi4vY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgTmF2aWdhdGlvblJlYXNvbiBmcm9tIFwiLi9yb3V0aW5nL05hdmlnYXRpb25SZWFzb25cIjtcblxuY29uc3QgQ3JlYXRpb25Nb2RlID0gRkVMaWJyYXJ5LkNyZWF0aW9uTW9kZSxcblx0UHJvZ3JhbW1pbmdNb2RlbCA9IEZFTGlicmFyeS5Qcm9ncmFtbWluZ01vZGVsLFxuXHRDb25zdGFudHMgPSBGRUxpYnJhcnkuQ29uc3RhbnRzLFxuXHREcmFmdFN0YXR1cyA9IEZFTGlicmFyeS5EcmFmdFN0YXR1cyxcblx0RWRpdE1vZGUgPSBGRUxpYnJhcnkuRWRpdE1vZGUsXG5cdFN0YXJ0dXBNb2RlID0gRkVMaWJyYXJ5LlN0YXJ0dXBNb2RlLFxuXHRNZXNzYWdlVHlwZSA9IGNvcmVMaWJyYXJ5Lk1lc3NhZ2VUeXBlO1xuXG50eXBlIFNhdmVEb2N1bWVudFBhcmFtZXRlcnMgPSB7XG5cdGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yPzogYm9vbGVhbjtcblx0bWVyZ2VQYXRjaERyYWZ0PzogYm9vbGVhbjtcblx0YmluZGluZ3M/OiBPRGF0YUxpc3RCaW5kaW5nW107XG59O1xuXG50eXBlIEludGVybmFsQ3JlYXRlUGFyYW1ldGVycyA9IHtcblx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0YkZyb21EZWZlcnJlZD86IGJvb2xlYW47XG5cdGJ1c3lNb2RlPzogc3RyaW5nO1xuXHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRjcmVhdGlvblJvdz86IENyZWF0aW9uUm93O1xuXHRkYXRhPzogb2JqZWN0O1xuXHR0YWJsZUlkPzogc3RyaW5nO1xuXHRvdXRib3VuZD86IHN0cmluZztcblx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdHNlbGVjdGVkQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xufTtcblxuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIGhvb2tzIGludG8gdGhlIGVkaXQgZmxvdyBvZiB0aGUgYXBwbGljYXRpb25cbiAqXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKiBAc2luY2UgMS45MC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XCIpXG5jbGFzcyBFZGl0RmxvdyBleHRlbmRzIEJhc2VDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJvdGVjdGVkIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblxuXHRwcml2YXRlIGRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uPzogRnVuY3Rpb247XG5cblx0cHJpdmF0ZSBzZXNzaW9uVGltZW91dEZ1bmN0aW9uPzogRnVuY3Rpb247XG5cblx0cHJpdmF0ZSBzdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24/OiBGdW5jdGlvbjtcblxuXHRwcml2YXRlIHN5bmNUYXNrczogUHJvbWlzZTx1bmtub3duPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG5cdHByaXZhdGUgYWN0aW9uUHJvbWlzZT86IFByb21pc2U8eyBjb250cm9sSWQ/OiBzdHJpbmc7IG9EYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsga2V5czogc3RyaW5nW10gfT47XG5cblx0cHJpdmF0ZSBjb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nPzogQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nQmxvY2s7XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gUHVibGljIG1ldGhvZHNcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHRnZXRJbnRlcmZhY2UoKTogQmFzZU9iamVjdCB7XG5cdFx0cmV0dXJuIHN1cGVyLmdldEludGVyZmFjZSgpO1xuXHR9XG5cblx0Z2V0QXBwQ29tcG9uZW50KCk6IEFwcENvbXBvbmVudCB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZHJhZnQgZG9jdW1lbnQgZm9yIHRoZSBleGlzdGluZyBhY3RpdmUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBlZGl0YWJsZSBkb2N1bWVudCBpcyBhdmFpbGFibGUgd2l0aCB0aGUgZWRpdGFibGUgY29udGV4dFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBlZGl0RG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0IHwgdm9pZD4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRjb25zdCBtb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3Qgb1ZpZXdEYXRhID0gdGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBCYXNlTWFuaWZlc3RTZXR0aW5ncztcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0bGV0IG9Sb290Q29udGV4dDogQ29udGV4dCA9IG9Db250ZXh0O1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCBncm91cElkID0gXCJlZGl0R3JvdXBcIjtcblx0XHR0cnkge1xuXHRcdFx0aWYgKChvVmlld0RhdGE/LnZpZXdMZXZlbCBhcyBudW1iZXIpID4gMSkge1xuXHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgfHwgc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0b1Jvb3RDb250ZXh0ID0gKGF3YWl0IENvbW1vblV0aWxzLmNyZWF0ZVJvb3RDb250ZXh0KHNQcm9ncmFtbWluZ01vZGVsLCBvVmlldywgdGhpcy5nZXRBcHBDb21wb25lbnQoKSkpIGFzIENvbnRleHQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUVkaXQoeyBjb250ZXh0OiBvUm9vdENvbnRleHQgfSk7XG5cblx0XHRcdGNvbnN0IHJpZ2h0bW9zdENvbnRleHQgPSB0aGlzLl9pc0ZjbEVuYWJsZWQoKSA/IChvUm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSA6IG9Db250ZXh0O1xuXHRcdFx0Y29uc3Qgb05ld0RvY3VtZW50Q29udGV4dFByb21pc2UgPSB0cmFuc2FjdGlvbkhlbHBlci5lZGl0RG9jdW1lbnQoXG5cdFx0XHRcdG9Sb290Q29udGV4dCxcblx0XHRcdFx0dGhpcy5iYXNlLmdldFZpZXcoKSxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRncm91cElkXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3Qgcm9vdENvbnRleHRJbmZvID0ge1xuXHRcdFx0XHRyb290U2libGluZ1BhdGhQcm9taXNlOiBvTmV3RG9jdW1lbnRDb250ZXh0UHJvbWlzZVxuXHRcdFx0fTtcblx0XHRcdHRoaXMuX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwsIG1vZGVsKTtcblxuXHRcdFx0bGV0IHNpYmxpbmdJbmZvUHJvbWlzZTtcblx0XHRcdC8vIHJpZ2h0bW9zdENvbnRleHQgPT09IHJvb3RDb250ZXh0ID0+IHdlJ3JlIGluIE9QLiBJZiBub3QsIHdlJ3JlIGluIG11bHRpLWNvbHVtbiBsYXlvdXQgb2YgRkNMXG5cdFx0XHRjb25zdCBjb21wdXRlU2libGluZ0luZm8gPSByaWdodG1vc3RDb250ZXh0ICE9PSBvUm9vdENvbnRleHQgfHwgKG9WaWV3RGF0YT8udmlld0xldmVsIGFzIG51bWJlcikgPiAxO1xuXHRcdFx0aWYgKGNvbXB1dGVTaWJsaW5nSW5mbykge1xuXHRcdFx0XHRzaWJsaW5nSW5mb1Byb21pc2UgPSB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdG9Sb290Q29udGV4dCxcblx0XHRcdFx0XHRyaWdodG1vc3RDb250ZXh0LFxuXHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0cm9vdENvbnRleHRJbmZvLFxuXHRcdFx0XHRcdGdyb3VwSWRcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdG9Db250ZXh0LmdldE1vZGVsKCkuc3VibWl0QmF0Y2goZ3JvdXBJZCk7XG5cblx0XHRcdGxldCBzaWJsaW5nSW5mbyA9IGF3YWl0IHNpYmxpbmdJbmZvUHJvbWlzZTtcblx0XHRcdGNvbnN0IG9OZXdEb2N1bWVudENvbnRleHQgPSAoYXdhaXQgb05ld0RvY3VtZW50Q29udGV4dFByb21pc2UpIGFzIENvbnRleHQ7XG5cdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGU6IENvbnRleHQgfCB1bmRlZmluZWQgPSBvTmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0aWYgKGNvbXB1dGVTaWJsaW5nSW5mbykge1xuXHRcdFx0XHRpZiAoc2libGluZ0luZm8gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRcdG9Sb290Q29udGV4dCxcblx0XHRcdFx0XHRcdHJpZ2h0bW9zdENvbnRleHQsXG5cdFx0XHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0XHRyb290Q29udGV4dEluZm8sXG5cdFx0XHRcdFx0XHRcIiRhdXRvXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gdGhpcy5fZ2V0TmF2aWdhdGlvblRhcmdldEZvckVkaXQob0NvbnRleHQsIG9OZXdEb2N1bWVudENvbnRleHQsIHNpYmxpbmdJbmZvKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KFtdKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9OZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSwgZmFsc2UpO1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQoZmFsc2UpO1xuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblxuXHRcdFx0XHRpZiAob05ld0RvY3VtZW50Q29udGV4dCAhPT0gb1Jvb3RDb250ZXh0KSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJFZGl0KHsgY29udGV4dDogY29udGV4dFRvTmF2aWdhdGUgfSk7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSBhcyBDb250ZXh0LCB7XG5cdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHJlY3JlYXRlQ29udGV4dDogZmFsc2UsXG5cdFx0XHRcdFx0XHRmb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhlIHN0aWNreU9uIGhhbmRsZXIgbXVzdCBiZSBzZXQgYWZ0ZXIgdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gZG9uZSxcblx0XHRcdFx0XHRcdC8vIGFzIHRoZSBVUkwgbWF5IGNoYW5nZSBpbiB0aGUgY2FzZSBvZiBGQ0xcblx0XHRcdFx0XHRcdGxldCBzdGlja3lDb250ZXh0OiBDb250ZXh0O1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFdlIG5lZWQgdG8gdXNlIHRoZSBrZXB0LWFsaXZlIGNvbnRleHQgdXNlZCB0byBiaW5kIHRoZSBwYWdlXG5cdFx0XHRcdFx0XHRcdHN0aWNreUNvbnRleHQgPSBvTmV3RG9jdW1lbnRDb250ZXh0Py5nZXRNb2RlbCgpLmdldEtlZXBBbGl2ZUNvbnRleHQob05ld0RvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0c3RpY2t5Q29udGV4dCA9IG9OZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9uKHN0aWNreUNvbnRleHQpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoTW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobW9kZWwuZ2V0TWV0YU1vZGVsKCkpKSB7XG5cdFx0XHRcdFx0XHQvLyBhY2NvcmRpbmcgdG8gVVggaW4gY2FzZSBvZiBlbmFibGVkIGNvbGxhYm9yYXRpb24gZHJhZnQgd2Ugc2hhcmUgdGhlIG9iamVjdCBpbW1lZGlhdGVseVxuXHRcdFx0XHRcdFx0YXdhaXQgc2hhcmVPYmplY3Qob05ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBjb250ZXh0VG9OYXZpZ2F0ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZWRpdGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHRoZSBzaWRlIGVmZmVjdHMgcmVxdWlyZWQgYWZ0ZXIgZGVsZXRpbmcgYW4gb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3QgYmluZGluZyB0aGUgZGVsZXRlZCBvYmplY3QgYmVsb25ncyB0b1xuXHQgKiBAcGFyYW0gcGFyZW50Q29udGV4dCBUaGUgY29udGV4dCBvZiBwYXJlbnQgb2JqZWN0IG9mIHRoZSBkZWxldGVkIG9iamVjdFxuXHQgKi9cblx0cHJpdmF0ZSByZXF1ZXN0U2lkZUVmZmVjdHNPbkRlbGV0ZShsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHVuZGVmaW5lZCwgcGFyZW50Q29udGV4dDogQ29udGV4dCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuXHRcdGlmICghbGlzdEJpbmRpbmcgfHwgIXBhcmVudENvbnRleHQgfHwgQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChsaXN0QmluZGluZykpIHtcblx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc2lkZUVmZmVjdFNlcnZpY2UgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRcdHNpZGVFZmZlY3RTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShsaXN0QmluZGluZy5nZXRQYXRoKCksIHBhcmVudENvbnRleHQpO1xuXG5cdFx0Y29uc3Qgc3RhdGVNZXNzYWdlc1BhdGggPSBNb2RlbEhlbHBlci5nZXRNZXNzYWdlc1BhdGgobGlzdEJpbmRpbmcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSwgcGFyZW50Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdC8vIEluIGNhc2Ugb2YgYSBUcmVlVGFibGUsIHdlIG5lZWQgdG8gcmVmcmVzaCBzdGF0ZSBtZXNzYWdlcyBmb3IgdGhlIE9iamVjdFBhZ2UsIGFzIHNvbWUgb2YgdGhlc2UgbWVzc2FnZXMgbWlnaHQgYmUgYXR0YWNoZWRcblx0XHQvLyB0byBjaGlsZHJlbiBvZiBhIGRlbGV0ZWQgcm93IHdoaWNoIG1heSBub3QgaGF2ZSBiZWVuIGxvYWRlZCB5ZXQsIGFuZCB0aGVyZWZvcmUgdGhlIG1vZGVsIHdvdWxkbid0IGNsZWFuIHVwIHRoZXNlIG1lc3NhZ2VzXG5cdFx0aWYgKHN0YXRlTWVzc2FnZXNQYXRoICYmIHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0c2lkZUVmZmVjdFNlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFtzdGF0ZU1lc3NhZ2VzUGF0aF0sIHBhcmVudENvbnRleHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBEZWxldGVzIHNldmVyYWwgZG9jdW1lbnRzLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dHNUb0RlbGV0ZSBUaGUgY29udGV4dHMgb2YgdGhlIGRvY3VtZW50cyB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jb250cm9sSWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udHJvbFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMubm9EaWFsb2dcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBkb2N1bWVudHMgYXJlIGRlbGV0ZWRcblx0ICovXG5cdGFzeW5jIGRlbGV0ZU11bHRpcGxlRG9jdW1lbnRzKFxuXHRcdGNvbnRleHRzVG9EZWxldGU6IENvbnRleHRbXSxcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRiZWZvcmVEZWxldGVDYWxsQmFjaz86IEZ1bmN0aW9uO1xuXHRcdFx0cmVxdWVzdFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdGNvbnRyb2xJZDogc3RyaW5nO1xuXHRcdFx0bm9EaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0cGFyZW50Q29udHJvbD86IENvbnRyb2w7XG5cdFx0XHRiRmluZEFjdGl2ZUNvbnRleHRzPzogYm9vbGVhbjtcblx0XHRcdHNlbGVjdGVkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0fVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRwYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrID0gdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlO1xuXHRcdHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzID0gcGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHMgIT09IGZhbHNlO1xuXG5cdFx0Y29uc3QgbG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGNvbnN0IHBhcmVudENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKS5ieUlkKHBhcmFtZXRlcnMuY29udHJvbElkKSA/PyBFbGVtZW50LmdldEVsZW1lbnRCeUlkKHBhcmFtZXRlcnMuY29udHJvbElkKTtcblx0XHRsZXQgaW5hY3RpdmVDb250ZXh0c1RvRGVsZXRlOiBDb250ZXh0W10gPSBbXTtcblx0XHRpZiAocGFyZW50Q29udHJvbD8uaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdGluYWN0aXZlQ29udGV4dHNUb0RlbGV0ZSA9IGNvbnRleHRzVG9EZWxldGUuZmlsdGVyKChjb250ZXh0KSA9PiBjb250ZXh0LmlzSW5hY3RpdmUoKSk7XG5cdFx0fVxuXHRcdGlmICghcGFyZW50Q29udHJvbCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwicGFyYW1ldGVyIGNvbnRyb2xJZCBtaXNzaW5nIG9yIGluY29ycmVjdFwiKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGFyYW1ldGVycy5wYXJlbnRDb250cm9sID0gcGFyZW50Q29udHJvbCBhcyBDb250cm9sO1xuXHRcdH1cblx0XHRjb25zdCBsaXN0QmluZGluZyA9IChwYXJlbnRDb250cm9sLmdldEJpbmRpbmcoXCJpdGVtc1wiKSB8fCAocGFyZW50Q29udHJvbCBhcyBUYWJsZSkuZ2V0Um93QmluZGluZygpKSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdHBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0cyA9IHRydWU7XG5cdFx0QnVzeUxvY2tlci5sb2NrKGxvY2tPYmplY3QpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGlmICh0aGlzLmdldFByb2dyYW1taW5nTW9kZWwocGFyYW1ldGVycz8uc2VsZWN0ZWRDb250ZXh0cz8uWzBdID8/IGNvbnRleHRzVG9EZWxldGVbMF0pID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0XHRhd2FpdCB0aGlzLmRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24oY29udGV4dHNUb0RlbGV0ZSwgcGFyYW1ldGVycyk7XG5cblx0XHRcdGxldCByZXN1bHQ7XG5cblx0XHRcdC8vIE11bHRpcGxlIG9iamVjdCBkZWxldGlvbiBpcyB0cmlnZ2VyZWQgZnJvbSBhIGxpc3Rcblx0XHRcdC8vIEZpcnN0IGNsZWFyIHRoZSBzZWxlY3Rpb24gaW4gdGhlIHRhYmxlIGFzIGl0J3Mgbm90IHZhbGlkIGFueSBtb3JlXG5cdFx0XHRpZiAocGFyZW50Q29udHJvbC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRwYXJlbnRDb250cm9sLmNsZWFyU2VsZWN0aW9uKCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoZW4gcmVmcmVzaCB0aGUgbGlzdC1iaW5kaW5nIChMUiksIG9yIHJlcXVpcmUgc2lkZS1lZmZlY3RzIChPUClcblx0XHRcdGNvbnN0IHZpZXdCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdGlmIChsaXN0QmluZGluZy5pc1Jvb3QoKSkge1xuXHRcdFx0XHQvLyBrZWVwIHByb21pc2UgY2hhaW4gcGVuZGluZyB1bnRpbCByZWZyZXNoIG9mIGxpc3RiaW5kaW5nIGlzIGNvbXBsZXRlZFxuXHRcdFx0XHRpZiAodGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0Ly8gV2UgdXNlIGEgc2lkZS1lZmZlY3QgcmVmcmVzaCBmb3IgYSBUcmVlVGFibGUsIHRvIHByZXNlcnZlIGV4cGFuc2lvbiBzdGF0ZXNcblx0XHRcdFx0XHRyZXN1bHQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpXG5cdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHMoW3sgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IFwiXCIgfV0sIGxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSEpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlc3VsdCA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG5cdFx0XHRcdFx0XHRsaXN0QmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVjZWl2ZWRcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRsaXN0QmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAocGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0dGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHNPbkRlbGV0ZShsaXN0QmluZGluZywgdmlld0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gZGVsZXRpbmcgYXQgbGVhc3Qgb25lIG9iamVjdCBzaG91bGQgYWxzbyBzZXQgdGhlIFVJIHRvIGRpcnR5XG5cdFx0XHRpZiAoIXRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQgPSB0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLmlzUmVjb21tZW5kYXRpb25FbmFibGVkKCk7XG5cdFx0XHQvLyBXZSBjbGVhciByZWNvbW1lbmRhdGlvbiBkYXRhIGFuZCBjb250ZXh0cyBmcm9tIGludGVybmFsIG1vZGVsIGZvciB0aGUgZGVsZXRlZCBjb250ZXh0c1xuXHRcdFx0aWYgKGlzUmVjb21tZW5kYXRpb25FbmFibGVkKSB7XG5cdFx0XHRcdHRoaXMuYmFzZS5yZWNvbW1lbmRhdGlvbnMuaWdub3JlUmVjb21tZW5kYXRpb25Gb3JDb250ZXh0cyhjb250ZXh0c1RvRGVsZXRlKTtcblx0XHRcdH1cblx0XHRcdC8vIE5vdGlmeSBjb25zdW1lcnMgb2Ygd2hpY2ggY29udGV4dHMgd2VyZSBkZWxldGVkXG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckRlbGV0ZSh7IGNvbnRleHRzOiBjb250ZXh0c1RvRGVsZXRlIH0pO1xuXG5cdFx0XHRpZiAocGFyZW50Q29udHJvbC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRjb25zdCB0YWJsZUFQSSA9IHBhcmVudENvbnRyb2wuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHR0YWJsZUFQST8udGFibGVEZWZpbml0aW9uPy5jb250cm9sPy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmVDcmVhdGlvblJvd3MgJiZcblx0XHRcdFx0XHRpbmFjdGl2ZUNvbnRleHRzVG9EZWxldGUubGVuZ3RoID4gMFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHR0YWJsZUFQSS5yZW1vdmVFbXB0eVJvd3NNZXNzYWdlcyhpbmFjdGl2ZUNvbnRleHRzVG9EZWxldGUpO1xuXHRcdFx0XHRcdGF3YWl0IHRhYmxlQVBJLnNldFVwRW1wdHlSb3dzKHBhcmVudENvbnRyb2wsIGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGVsZXRlLCBjb250ZXh0c1RvRGVsZXRlKTtcblxuXHRcdFx0cmV0dXJuIGF3YWl0IHJlc3VsdDtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGVsZXRpbmcgdGhlIGRvY3VtZW50KHMpXCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKGxvY2tPYmplY3QpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBkcmFmdCBzdGF0dXMgYW5kIGRpc3BsYXlzIHRoZSBlcnJvciBtZXNzYWdlcyBpZiB0aGVyZSBhcmUgZXJyb3JzIGR1cmluZyBhbiB1cGRhdGUuXG5cdCAqXG5cdCAqIEBwYXJhbSB1cGRhdGVkQ29udGV4dCBDb250ZXh0IG9mIHRoZSB1cGRhdGVkIGZpZWxkXG5cdCAqIEBwYXJhbSB1cGRhdGVQcm9taXNlIFByb21pc2UgdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIHVwZGF0ZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLiBUaGUgcHJvbWlzZSBzaG91bGQgYmUgcmVzb2x2ZWQgd2hlbiB0aGUgdXBkYXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIHNvIHRoZSBkcmFmdCBzdGF0dXMgY2FuIGJlIHVwZGF0ZWQuXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBkcmFmdCBzdGF0dXMgaGFzIGJlZW4gdXBkYXRlZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyB1cGRhdGVEb2N1bWVudCh1cGRhdGVkQ29udGV4dDogb2JqZWN0LCB1cGRhdGVQcm9taXNlOiBQcm9taXNlPHVua25vd24+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgaXNEcmFmdCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbCh1cGRhdGVkQ29udGV4dCBhcyBCaW5kaW5nIHwgQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soYXN5bmMgKCkgPT4ge1xuXHRcdFx0aWYgKG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaXNEcmFmdCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2aW5nKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB1cGRhdGVQcm9taXNlO1xuXHRcdFx0XHRjb25zdCBjdXJyZW50QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0IHwgbnVsbCB8IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKCFpc0RyYWZ0IHx8ICFjdXJyZW50QmluZGluZ0NvbnRleHQgfHwgY3VycmVudEJpbmRpbmdDb250ZXh0ICE9PSBvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdFx0Ly8gSWYgYSBuYXZpZ2F0aW9uIGhhcHBlbmVkIHdoaWxlIG9Qcm9taXNlIHdhcyBiZWluZyByZXNvbHZlZCwgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBjaGFuZ2VkXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2UncmUgc3RpbGwgb24gdGhlIHNhbWUgY29udGV4dFxuXHRcdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBjdXJyZW50QmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0Y29uc3QgZW50aXR5U2V0TmFtZSA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjdXJyZW50QmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCJAc2FwdWkubmFtZVwiKTtcblx0XHRcdFx0Y29uc3Qgc2VtYW50aWNLZXlzID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG1ldGFNb2RlbCwgZW50aXR5U2V0TmFtZSk7XG5cdFx0XHRcdGlmIChzZW1hbnRpY0tleXM/Lmxlbmd0aCkge1xuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRcdFx0XHRjb25zdCBjdXJyZW50U2VtYW50aWNQYXRoID0gY3VycmVudFNlbWFudGljTWFwcGluZz8uc2VtYW50aWNQYXRoLFxuXHRcdFx0XHRcdFx0c0NoYW5nZWRQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKGN1cnJlbnRCaW5kaW5nQ29udGV4dCwgdHJ1ZSk7XG5cdFx0XHRcdFx0Ly8gY3VycmVudFNlbWFudGljUGF0aCBjb3VsZCBiZSBudWxsIGlmIHdlIGhhdmUgbmF2aWdhdGVkIHZpYSBkZWVwIGxpbmsgdGhlbiB0aGVyZSBhcmUgbm8gc2VtYW50aWNNYXBwaW5ncyB0byBjYWxjdWxhdGUgaXQgZnJvbVxuXHRcdFx0XHRcdGlmIChjdXJyZW50U2VtYW50aWNQYXRoICYmIGN1cnJlbnRTZW1hbnRpY1BhdGggIT09IHNDaGFuZ2VkUGF0aCkge1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjdXJyZW50QmluZGluZ0NvbnRleHQsIHsgZWRpdGFibGU6IHRydWUsIHJlY3JlYXRlQ29udGV4dDogZmFsc2UgfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSB1cGRhdGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0aWYgKGlzRHJhZnQgJiYgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGdldFBhcmVudENvbnRleHRGcm9tU2VsZWN0aW9uKHNlbGVjdGVkQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10gfCB1bmRlZmluZWQpOiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHNlbGVjdGVkQ29udGV4dHMgJiYgc2VsZWN0ZWRDb250ZXh0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHQvLyBPbmUgcGFyZW50IGF0IG1vc3QgISFcblx0XHRcdHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBhIG5ldyBkb2N1bWVudCBpbiBhIFRyZWVUYWJsZSB3aXRoICR7c2VsZWN0ZWRDb250ZXh0cy5sZW5ndGh9IHBhcmVudHNgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gc2VsZWN0ZWRDb250ZXh0cz8ubGVuZ3RoID09PSAxID8gc2VsZWN0ZWRDb250ZXh0c1swXSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyAqIEBwYXJhbSB7c3RyaW5nfSBtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG5cdC8vICogICAgICAgICAgICAgICAgICAgIFN5bmMgLSB0aGUgY3JlYXRpb24gaXMgdHJpZ2dlcmVkIGFuZCBvbmNlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkLCB0aGUgbmF2aWdhdGlvbiBpcyBkb25lXG5cdC8vICogICAgICAgICAgICAgICAgICAgIEFzeW5jIC0gdGhlIGNyZWF0aW9uIGFuZCB0aGUgbmF2aWdhdGlvbiB0byB0aGUgaW5zdGFuY2UgYXJlIGRvbmUgaW4gcGFyYWxsZWxcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgRGVmZXJyZWQgLSB0aGUgY3JlYXRpb24gaXMgZG9uZSBvbiB0aGUgdGFyZ2V0IHBhZ2Vcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgQ3JlYXRpb25Sb3cgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbmxpbmUgYXN5bmMgc28gdGhlIHVzZXIgaXMgbm90IGJsb2NrZWRcblx0Ly8gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cgSW5zdGFuY2Ugb2YgdGhlIGNyZWF0aW9uIHJvdyAtIChUT0RPOiBnZXQgcmlkIGJ1dCB1c2UgbGlzdCBiaW5kaW5ncyBvbmx5KVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gdkxpc3RCaW5kaW5nICBPRGF0YUxpc3RCaW5kaW5nIG9iamVjdCBvciB0aGUgYmluZGluZyBwYXRoIGZvciBhIHRlbXBvcmFyeSBsaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmc6PGJyLz5cblx0ICogICAgICAgICAgICAgICAgICAgIE5ld1BhZ2UgLSB0aGUgY3JlYXRlZCBkb2N1bWVudCBpcyBzaG93biBpbiBhIG5ldyBwYWdlLCBkZXBlbmRpbmcgb24gd2hldGhlciBtZXRhZGF0YSAnU3luYycsICdBc3luYycgb3IgJ0RlZmVycmVkJyBpcyB1c2VkPGJyLz5cblx0ICogICAgICAgICAgICAgICAgICAgIElubGluZSAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGlubGluZSAoaW4gYSB0YWJsZSk8YnIvPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbiBhIGRpZmZlcmVudCBhcHBsaWNhdGlvbiBzcGVjaWZpZWQgdmlhIHRoZSBwYXJhbWV0ZXIgJ291dGJvdW5kJ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy50YWJsZUlkIElEIG9mIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5vdXRib3VuZCBUaGUgbmF2aWdhdGlvbiB0YXJnZXQgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQgaW4gY2FzZSBvZiBjcmVhdGlvbk1vZGUgJ0V4dGVybmFsJ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGVBdEVuZCBTcGVjaWZpZXMgaWYgdGhlIG5ldyBlbnRyeSBzaG91bGQgYmUgY3JlYXRlZCBhdCB0aGUgdG9wIG9yIGJvdHRvbSBvZiBhIHRhYmxlIGluIGNhc2Ugb2YgY3JlYXRpb25Nb2RlICdJbmxpbmUnXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmRhdGEgVGhlIGluaXRpYWwgZGF0YSBmb3IgdGhlIGNyZWF0ZWQgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5iRnJvbURlZmVycmVkIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuYnVzeU1vZGUgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGVBY3Rpb24gUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGlvblJvdyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2cgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzIFRoZSBjb250ZXh0cyB0aGF0IGFyZSBzZWxlY3RlZCBpbiB0aGUgdGFibGUgaW5pdGlhdGluZyB0aGUgY3JlYXRpb24uIFVzZWQgaW4gY2FzZSBvZiBhIFRyZWVUYWJsZSB0byBkZXRlcm1pbmUgdGhlIHBhcmVudCBjb250ZXh0IG9mIHRoZSBjcmVhdGVkIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNpbmdsZURyYWZ0Rm9yQ3JlYXRlIFdoZW4gZW5hYmxlZCwgYW4gZXh0cmEgcmVxdWVzdCBjaGVja3MgaWYgYW55IGRyYWZ0cyBleGlzdCB0aGF0IHdlcmUgbmV2ZXIgc2F2ZWQuIElmIHVuc2F2ZWQgZHJhZnRzIGFyZSBmb3VuZCwgdGhlIG5ld2VzdCBvbmUgaXMgb3BlbmVkLiBJZiBubyB1bnNhdmVkIGRyYWZ0cyBhcmUgZm91bmQsIGEgbmV3IGVudGl0eSBpcyBjcmVhdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgY3JlYXRlRG9jdW1lbnQoXG5cdFx0dkxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nIHwgc3RyaW5nLFxuXHRcdG1JblBhcmFtZXRlcnM6IHtcblx0XHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdFx0XHRiRnJvbURlZmVycmVkPzogYm9vbGVhbjtcblx0XHRcdGJ1c3lNb2RlPzogc3RyaW5nO1xuXHRcdFx0Y3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHRcdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRcdFx0Y3JlYXRpb25Sb3c/OiBDcmVhdGlvblJvdztcblx0XHRcdGRhdGE/OiBvYmplY3Q7XG5cdFx0XHR0YWJsZUlkPzogc3RyaW5nO1xuXHRcdFx0b3V0Ym91bmQ/OiBzdHJpbmc7XG5cdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0XHRcdHNpbmdsZURyYWZ0Rm9yQ3JlYXRlPzogYm9vbGVhbjtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCBvRGF0YUxpc3RCaW5kaW5nITogT0RhdGFMaXN0QmluZGluZztcblx0XHRsZXQgcGFyZW50Q29udGV4dDogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cblx0XHRpZiAobUluUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5FeHRlcm5hbCkge1xuXHRcdFx0aWYgKHR5cGVvZiB2TGlzdEJpbmRpbmcgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0Y29uc3Qgb0RhdGFNb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCk7XG5cdFx0XHRcdGlmICghb0RhdGFNb2RlbCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nID0gb0RhdGFNb2RlbC5iaW5kTGlzdCh2TGlzdEJpbmRpbmcpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0XHRcdG1JblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLlN5bmM7XG5cdFx0XHRcdGRlbGV0ZSBtSW5QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kO1xuXHRcdFx0fSBlbHNlIGlmICh2TGlzdEJpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0b0RhdGFMaXN0QmluZGluZyA9IHZMaXN0QmluZGluZztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgb2JqZWN0IG9yIHBhdGggZXhwZWN0ZWRcIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChvRGF0YUxpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHRwYXJlbnRDb250ZXh0ID0gdGhpcy5nZXRQYXJlbnRDb250ZXh0RnJvbVNlbGVjdGlvbihtSW5QYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IHJlc29sdmVkQ3JlYXRpb25Nb2RlID0gdGhpcy5yZXNvbHZlQ3JlYXRpb25Nb2RlKG1JblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlLCBvRGF0YUxpc3RCaW5kaW5nLCBtSW5QYXJhbWV0ZXJzLmRhdGEpO1xuXG5cdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0ZXJQcm94eSgpLnJlbW92ZUlBcHBTdGF0ZUtleSgpO1xuXG5cdFx0aWYgKFxuXHRcdFx0KG1JblBhcmFtZXRlcnMuc2luZ2xlRHJhZnRGb3JDcmVhdGUgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IG1JblBhcmFtZXRlcnMuc2luZ2xlRHJhZnRGb3JDcmVhdGVcblx0XHRcdFx0OiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldE1hbmlmZXN0KClbXCJzYXAuZmVcIl0/LmFwcD8uc2luZ2xlRHJhZnRGb3JDcmVhdGUpICYmXG5cdFx0XHRvRGF0YUxpc3RCaW5kaW5nID09PSBvRGF0YUxpc3RCaW5kaW5nLmdldFJvb3RCaW5kaW5nKCkgJiZcblx0XHRcdG9EYXRhTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpICE9PSBudWxsXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBuZXdCaW5kaW5nID0gb0RhdGFMaXN0QmluZGluZy5nZXRNb2RlbCgpPy5iaW5kTGlzdChcblx0XHRcdFx0b0RhdGFMaXN0QmluZGluZy5nZXRQYXRoKCksXG5cdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLFxuXHRcdFx0XHRuZXcgU29ydGVyKFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvTGFzdENoYW5nZURhdGVUaW1lXCIsIHRydWUpLFxuXHRcdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRmaWx0ZXJzOiBbXG5cdFx0XHRcdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRcdFx0cGF0aDogXCJJc0FjdGl2ZUVudGl0eVwiLFxuXHRcdFx0XHRcdFx0XHRvcGVyYXRvcjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTE6IGZhbHNlXG5cdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdFx0XHRwYXRoOiBcIkhhc0FjdGl2ZUVudGl0eVwiLFxuXHRcdFx0XHRcdFx0XHRvcGVyYXRvcjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTE6IGZhbHNlXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0YW5kOiB0cnVlXG5cdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgbmV3QmluZGluZz8ucmVxdWVzdENvbnRleHRzKDAsIDEpO1xuXHRcdFx0aWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KHJlc3VsdFswXSwgeyBlZGl0YWJsZTogdHJ1ZSwgcmVjcmVhdGVDb250ZXh0OiBmYWxzZSB9KS50aGVuKCgpID0+IG5ld0JpbmRpbmc/LmRlc3Ryb3koKSk7XG5cdFx0XHR9XG5cdFx0XHRuZXdCaW5kaW5nPy5kZXN0cm95KCk7XG5cdFx0XHRyZXR1cm4gdGhpcy5faGFuZGxlQ3JlYXRpb25Nb2RlKHJlc29sdmVkQ3JlYXRpb25Nb2RlLCB2TGlzdEJpbmRpbmcsIG1JblBhcmFtZXRlcnMsIG9EYXRhTGlzdEJpbmRpbmcsIHBhcmVudENvbnRleHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5faGFuZGxlQ3JlYXRpb25Nb2RlKHJlc29sdmVkQ3JlYXRpb25Nb2RlLCB2TGlzdEJpbmRpbmcsIG1JblBhcmFtZXRlcnMsIG9EYXRhTGlzdEJpbmRpbmcsIHBhcmVudENvbnRleHQpO1xuXHR9XG5cblx0YXN5bmMgX2hhbmRsZUNyZWF0aW9uTW9kZShcblx0XHRyZXNvbHZlZENyZWF0aW9uTW9kZTogc3RyaW5nLFxuXHRcdHZMaXN0QmluZGluZzogc3RyaW5nIHwgT0RhdGFMaXN0QmluZGluZyxcblx0XHRwYXJhbWV0ZXJzOiBJbnRlcm5hbENyZWF0ZVBhcmFtZXRlcnMsXG5cdFx0b0RhdGFMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRwYXJlbnRDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KFtdKTtcblx0XHRzd2l0Y2ggKHJlc29sdmVkQ3JlYXRpb25Nb2RlKSB7XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5FeHRlcm5hbDpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXh0ZXJuYWxEb2N1bWVudCh2TGlzdEJpbmRpbmcsIHBhcmFtZXRlcnMub3V0Ym91bmQpO1xuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZURlZmVycmVkRG9jdW1lbnQob0RhdGFMaXN0QmluZGluZywgcGFyZW50Q29udGV4dCwgcGFyYW1ldGVycy5kYXRhKTtcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93OlxuXHRcdFx0XHRyZXR1cm4gcGFyYW1ldGVycy5jcmVhdGlvblJvd1xuXHRcdFx0XHRcdD8gdGhpcy5jcmVhdGVDcmVhdGVSb3dEb2N1bWVudCh7XG5cdFx0XHRcdFx0XHRcdGNyZWF0aW9uUm93OiBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93LFxuXHRcdFx0XHRcdFx0XHRza2lwU2lkZUVmZmVjdHM6IHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0XHRjcmVhdGVBdEVuZDogcGFyYW1ldGVycy5jcmVhdGVBdEVuZFxuXHRcdFx0XHRcdCAgfSlcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLklubGluZTpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlSW5saW5lRG9jdW1lbnQoXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dGFibGVJZDogcGFyYW1ldGVycy50YWJsZUlkLFxuXHRcdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdFx0XHRza2lwU2lkZUVmZmVjdHM6IHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0cGFyZW50Q29udGV4dCxcblx0XHRcdFx0XHRcdGRhdGE6IHBhcmFtZXRlcnMuZGF0YVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b0RhdGFMaXN0QmluZGluZ1xuXHRcdFx0XHQpO1xuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuU3luYzpcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkFzeW5jOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVTeW5jQXN5bmNEb2N1bWVudChcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjcmVhdGlvbk1vZGU6IHJlc29sdmVkQ3JlYXRpb25Nb2RlLFxuXHRcdFx0XHRcdFx0ZGF0YTogcGFyYW1ldGVycy5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0XHRcdFx0YkZyb21EZWZlcnJlZDogcGFyYW1ldGVycy5iRnJvbURlZmVycmVkLFxuXHRcdFx0XHRcdFx0c2tpcFNpZGVFZmZlY3RzOiBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdGNyZWF0ZUFjdGlvbjogcGFyYW1ldGVycy5jcmVhdGVBY3Rpb24sXG5cdFx0XHRcdFx0XHRwYXJlbnRDb250ZXh0XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nXG5cdFx0XHRcdCk7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBjcmVhdGlvbk1vZGUgJHtyZXNvbHZlZENyZWF0aW9uTW9kZX1gKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICpFeGVjdXRlcyB0aGUgbWFuZGF0b3J5IGNvbmZpZ3VyYXRpb24gYWZ0ZXIgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNyZWF0ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcmVyZXF1aXNpdGUgUHJvbWlzZSBvZiB0aGUgZG9jdW1lbnQgY3JlYXRpb24gYW5kIHRoZSBmb2xsb3dpbmcgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGNvbmZpZ3VyYXRpb24gaXMgZG9uZVxuXHQgKi9cblx0YXN5bmMgcG9zdERvY3VtZW50Q3JlYXRpb24ocHJlcmVxdWlzaXRlOiBQcm9taXNlPFtDb250ZXh0LCB1bmtub3duXT4sIGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGxpc3RCaW5kaW5nKTtcblx0XHRjb25zdCBtb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgcGFyYW1zID0gYXdhaXQgcHJlcmVxdWlzaXRlO1xuXHRcdGNvbnN0IG5ld0RvY3VtZW50Q29udGV4dCA9IHBhcmFtc1swXTtcblx0XHR0aGlzLl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWwsIG1vZGVsKTtcblx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckNyZWF0ZSh7IGNvbnRleHQ6IG5ld0RvY3VtZW50Q29udGV4dCB9KTtcblx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTsgLy8gVGhlIGNyZWF0ZU1vZGUgZmxhZyB3aWxsIGJlIHNldCBpbiBjb21wdXRlRWRpdE1vZGVcblx0XHRpZiAoIWxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdC8vIFdvcmthcm91bmQgdG8gdGVsbCB0aGUgT1AgdGhhdCB3ZSd2ZSBjcmVhdGVkIGEgbmV3IG9iamVjdCBmcm9tIHRoZSBMUlxuXHRcdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KGxpc3RCaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHRcdGNvbnN0IGVudGl0eVNldCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkuc3RhcnRpbmdFbnRpdHlTZXQgYXMgRW50aXR5U2V0O1xuXHRcdFx0XHRjb25zdCBuZXdBY3Rpb24gPSBlbnRpdHlTZXQ/LmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQ/Lk5ld0FjdGlvbjtcblx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoXCIvbGFzdEludm9rZWRBY3Rpb25cIiwgbmV3QWN0aW9uKTtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdC8vIENyZWF0aW5nIGEgbmV3IGl0ZW0gaW4gYSBoaWVyYXJjaHkgZnJvbSB0aGUgTGlzdFJlcG9ydCAoc2luY2UgdGhlIGxpc3RCaW5kaW5nIGlzIG5vdCByZWxhdGl2ZSlcblx0XHRcdFx0Ly8gLS0+IHdlIHdhbnQgdG8gZm9yY2UgdGhlIHVzZXIgdG8gZWl0aGVyIHNhdmUgb3IgZGlzY2FyZCB0aGUgZHJhZnQgYmVmb3JlIGxlYXZpbmcgdGhlIE9QXG5cdFx0XHRcdHRoaXMuZm9yY2VEcmFmdFNhdmVPckRpc2NhcmQodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChuZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlKGxpc3RCaW5kaW5nKTtcblx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQ3JlYXRlLCBuZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtb2RlbC5nZXRNZXRhTW9kZWwoKSkgJiZcblx0XHRcdFx0dGhpcy5pc0RyYWZ0Um9vdChuZXdEb2N1bWVudENvbnRleHQpICYmXG5cdFx0XHRcdCF0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBhY2NvcmRpbmcgdG8gVVggaW4gY2FzZSBvZiBlbmFibGVkIGNvbGxhYm9yYXRpb24gZHJhZnQgd2Ugc2hhcmUgdGhlIG9iamVjdCBpbW1lZGlhdGVseVxuXHRcdFx0XHRhd2FpdCBzaGFyZU9iamVjdChuZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IHZpYSB0aGUgY3JlYXRpb25Sb3cuXG5cdCAqXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgVGhlIG5ldyBkb2N1bWVudCBpcyBjcmVhdGVkIGF0IHRoZSBlbmQuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93IFRoZSBjcmVhdGlvbiByb3dcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFRoZSBzaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlQ3JlYXRlUm93RG9jdW1lbnQocGFyYW1ldGVyczoge1xuXHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHRjcmVhdGlvblJvdzogQ3JlYXRpb25Sb3c7XG5cdFx0c2tpcFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0fSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0Y29uc3QgY3JlYXRpb25Sb3cgPSBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93O1xuXHRcdGNvbnN0IHRhYmxlID0gcGFyYW1ldGVycy5jcmVhdGlvblJvdy5nZXRQYXJlbnQoKSBhcyBUYWJsZSB8IHVuZGVmaW5lZDtcblx0XHRsZXQgbmF2aWdhdGlvbiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdGlmICghdGFibGUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBtZXRhTW9kZWwgPSB0YWJsZS5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRjb25zdCBsaXN0QmluZGluZyA9IHRhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRpZiAodGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBjcmVhdGlvbk1vZGUgXCJDcmVhdGlvblJvd1wiIHdpdGggYSBUcmVlVGFibGVgKTtcblx0XHR9XG5cdFx0Y29uc3QgY3JlYXRpb25Sb3dDb250ZXh0ID0gY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdGNvbnN0IGRvY3VtZW50VmFsaWRhdGlvbiA9IHRoaXMuZ2V0Q3JlYXRpb25Sb3dWYWxpZGF0aW9uRnVuY3Rpb24odGFibGUpO1xuXHRcdC8vIGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGEgaXMgc2V0IHRvIGZhbHNlIGluIG1hbmlmZXN0IGNvbnZlcnRlciAoVGFibGUudHMpIGlmIGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiBleGlzdHNcblx0XHRpZiAoY3JlYXRpb25Sb3cuZGF0YShcImRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGFcIikgPT09IFwidHJ1ZVwiKSB7XG5cdFx0XHR0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5zZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiLCB7fSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdmFsaWRhdGlvbk1lc3NhZ2VzID0gYXdhaXQgdGhpcy5zeW5jVGFzayhkb2N1bWVudFZhbGlkYXRpb24pO1xuXHRcdGlmICh2YWxpZGF0aW9uTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0dGhpcy5jcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXModmFsaWRhdGlvbk1lc3NhZ2VzLCB0YWJsZSk7XG5cdFx0XHRMb2cuZXJyb3IoXCJDdXN0b20gVmFsaWRhdGlvbiBmYWlsZWRcIik7XG5cdFx0XHQvLyBpZiBjdXN0b20gdmFsaWRhdGlvbiBmYWlscywgd2UgbGVhdmUgdGhlIG1ldGhvZCBpbW1lZGlhdGVseVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBlbnRpdHlUeXBlID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjcmVhdGlvblJvd0NvbnRleHQuZ2V0UGF0aCgpKSkudGFyZ2V0RW50aXR5VHlwZTtcblx0XHRjb25zdCBjcmVhdGlvblJvd1BheWxvYWQgPSBjcmVhdGlvblJvd0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cblx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblxuXHRcdC8vbW92ZWQgYWZ0ZXIgX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycyB0byBhdm9pZCBcIidjcmVhdGlvbicgdXNlIGJlZm9yZSBpbml0aWFsaXphdGlvblwiIGNvbnNvbGUgZXJyb3JzXG5cdFx0Ly9hZnRlciB2YWxpZGF0aW9uIGVycm9ycyBvY2N1cnJlZFxuXHRcdGxpc3RCaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImNoYW5nZVwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRhd2FpdCBjcmVhdGlvbjtcblx0XHRcdHRhYmxlLnNjcm9sbFRvSW5kZXgocGFyYW1ldGVycy5jcmVhdGVBdEVuZCA/IHRhYmxlLmdldFJvd0JpbmRpbmcoKS5nZXRMZW5ndGgoKSA6IDApO1xuXHRcdH0pO1xuXG5cdFx0Ly8gdGFrZSBjYXJlIG9uIG1lc3NhZ2UgaGFuZGxpbmcsIGRyYWZ0IGluZGljYXRvciAoaW4gY2FzZSBvZiBkcmFmdClcblx0XHQvLyBBdHRhY2ggdGhlIGNyZWF0ZSBzZW50IGFuZCBjcmVhdGUgY29tcGxldGVkIGV2ZW50IHRvIHRoZSBvYmplY3QgcGFnZSBiaW5kaW5nIHNvIHRoYXQgd2UgY2FuIHJlYWN0XG5cdFx0dGhpcy5oYW5kbGVDcmVhdGVFdmVudHMobGlzdEJpbmRpbmcpO1xuXG5cdFx0Y29uc3QgY3JlYXRpb24gPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogT2JqZWN0LmFzc2lnbihcblx0XHRcdFx0XHR7fSxcblx0XHRcdFx0XHQuLi5PYmplY3Qua2V5cyhjcmVhdGlvblJvd1BheWxvYWQpXG5cdFx0XHRcdFx0XHQuZmlsdGVyKFxuXHRcdFx0XHRcdFx0XHQocHJvcGVydHlQYXRoOiBzdHJpbmcpID0+XG5cdFx0XHRcdFx0XHRcdFx0ZW50aXR5VHlwZS5uYXZpZ2F0aW9uUHJvcGVydGllcy5maW5kSW5kZXgoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lID09PSBwcm9wZXJ0eVBhdGgpID09PSAtMVxuXHRcdFx0XHRcdFx0KSAvLyBlbnN1cmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFyZSBub3QgcGFydCBvZiB0aGUgcGF5bG9hZCwgZGVlcCBjcmVhdGUgbm90IHN1cHBvcnRlZFxuXHRcdFx0XHRcdFx0Lm1hcCgocGF0aCkgPT4gKHsgW3BhdGhdOiBjcmVhdGlvblJvd1BheWxvYWRbcGF0aF0gfSkpXG5cdFx0XHRcdCksXG5cdFx0XHRcdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ6IGZhbHNlLCAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRidXN5TW9kZTogXCJMb2NhbFwiLCAvLyBidXN5IGhhbmRsaW5nIHNoYWxsIGJlIGRvbmUgbG9jYWxseSBvbmx5XG5cdFx0XHRcdGJ1c3lJZDogKHRhYmxlPy5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSB8IHVuZGVmaW5lZCk/LmdldFRhYmxlRGVmaW5pdGlvbigpPy5hbm5vdGF0aW9uLmlkLFxuXHRcdFx0XHRwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUNyZWF0ZSxcblx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogYXBwQ29tcG9uZW50LmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGUsIC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvd1xuXHRcdFx0fSxcblx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdGZhbHNlXG5cdFx0KTtcblx0XHQvLyBTaWRlRWZmZWN0cyBvbiBDcmVhdGVcblx0XHQvLyBpZiBTYXZlIGlzIHByZXNzZWQgZGlyZWN0bHkgYWZ0ZXIgZmlsbGluZyB0aGUgQ3JlYXRpb25Sb3csIG5vIFNpZGVFZmZlY3RzIHJlcXVlc3Rcblx0XHRpZiAoIXBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzKSB7XG5cdFx0XHR0aGlzLmhhbmRsZVNpZGVFZmZlY3RzKGxpc3RCaW5kaW5nLCBjcmVhdGlvbik7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGNyZWF0aW9uUm93TGlzdEJpbmRpbmcgPSBjcmVhdGlvblJvd0NvbnRleHQuZ2V0QmluZGluZygpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0XHRjb25zdCBuZXdUcmFuc2llbnRDb250ZXh0ID0gY3JlYXRpb25Sb3dMaXN0QmluZGluZy5jcmVhdGUoKTtcblx0XHRcdGNyZWF0aW9uUm93LnNldEJpbmRpbmdDb250ZXh0KG5ld1RyYW5zaWVudENvbnRleHQpO1xuXG5cdFx0XHQvLyB0aGlzIGlzIG5lZWRlZCB0byBhdm9pZCBjb25zb2xlIGVycm9ycyBUTyBiZSBjaGVja2VkIHdpdGggbW9kZWwgY29sbGVhZ3Vlc1xuXHRcdFx0bmV3VHJhbnNpZW50Q29udGV4dC5jcmVhdGVkKCk/LmNhdGNoKCgpID0+IHtcblx0XHRcdFx0TG9nLnRyYWNlKFwidHJhbnNpZW50IGZhc3QgY3JlYXRpb24gY29udGV4dCBkZWxldGVkXCIpO1xuXHRcdFx0fSk7XG5cdFx0XHRuYXZpZ2F0aW9uID0gY3JlYXRpb25Sb3dDb250ZXh0LmRlbGV0ZShcIiRkaXJlY3RcIik7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdC8vIFJlc2V0IGJ1c3kgaW5kaWNhdG9yIGFmdGVyIGEgdmFsaWRhdGlvbiBlcnJvclxuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpKSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikpO1xuXHRcdFx0fVxuXHRcdFx0TG9nLmVycm9yKFwiQ3JlYXRpb25Sb3cgbmF2aWdhdGlvbiBlcnJvcjogXCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLnBvc3REb2N1bWVudENyZWF0aW9uKFByb21pc2UuYWxsKFtjcmVhdGlvbiwgbmF2aWdhdGlvbl0pLCBsaXN0QmluZGluZyk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBpbmxpbmUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgVGhlIG5ldyBkb2N1bWVudCBpcyBjcmVhdGVkIGF0IHRoZSBlbmRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFRoZSBzaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnRhYmxlSWQgVGhlIGlkIG9mIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRhdGFcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVJbmxpbmVEb2N1bWVudChcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdFx0XHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0dGFibGVJZD86IHN0cmluZztcblx0XHRcdHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dDtcblx0XHRcdGRhdGE/OiBvYmplY3Q7XG5cdFx0fSxcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZ1xuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgdGFibGU6IFRhYmxlIHwgdW5kZWZpbmVkO1xuXHRcdGlmIChwYXJhbWV0ZXJzLnRhYmxlSWQpIHtcblx0XHRcdHRhYmxlID0gdGhpcy5nZXRWaWV3KCkuYnlJZChwYXJhbWV0ZXJzLnRhYmxlSWQpIGFzIFRhYmxlO1xuXHRcdH1cblx0XHRpZiAodGFibGU/LmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHR0YWJsZS5nZXRSb3dCaW5kaW5nKCkuYXR0YWNoRXZlbnRPbmNlKFwiY2hhbmdlXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdFx0Y29uc3QgbmV3Q29udGV4dCA9IGF3YWl0IGNyZWF0aW9uO1xuXHRcdFx0XHRjb25zdCBhbGxDdXJyZW50Q29udGV4dHMgPSBsaXN0QmluZGluZy5nZXRBbGxDdXJyZW50Q29udGV4dHMoKTtcblx0XHRcdFx0Y29uc3QgY29udGV4dEluZGV4ID0gYWxsQ3VycmVudENvbnRleHRzLmluZGV4T2YobmV3Q29udGV4dCk7XG5cdFx0XHRcdHRhYmxlPy5mb2N1c1Jvdyhjb250ZXh0SW5kZXgsIHRydWUpO1xuXHRcdFx0XHRpZiAodGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0Ly8gSW4gY2FzZSBvZiBhIHRyZWUgdGFibGUsIHdlIGFsc28gc2Nyb2xsIHRvIGtlZXAgdGhlIHBhcmVudCB2aXNpYmxlXG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50Q29udGV4dCA9IG5ld0NvbnRleHQuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50SW5kZXggPSBwYXJlbnRDb250ZXh0ID8gYWxsQ3VycmVudENvbnRleHRzLmluZGV4T2YocGFyZW50Q29udGV4dCkgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0aWYgKHBhcmVudEluZGV4ICE9PSB1bmRlZmluZWQgJiYgcGFyZW50SW5kZXggPj0gMCkge1xuXHRcdFx0XHRcdFx0dGFibGU/LnNjcm9sbFRvSW5kZXgocGFyZW50SW5kZXgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Ly8gdGFrZSBjYXJlIG9uIG1lc3NhZ2UgaGFuZGxpbmcsIGRyYWZ0IGluZGljYXRvciAoaW4gY2FzZSBvZiBkcmFmdClcblx0XHQvLyBBdHRhY2ggdGhlIGNyZWF0ZSBzZW50IGFuZCBjcmVhdGUgY29tcGxldGVkIGV2ZW50IHRvIHRoZSBvYmplY3QgcGFnZSBiaW5kaW5nIHNvIHRoYXQgd2UgY2FuIHJlYWN0XG5cdFx0dGhpcy5oYW5kbGVDcmVhdGVFdmVudHMobGlzdEJpbmRpbmcpO1xuXHRcdGNvbnN0IGNyZWF0aW9uID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHR7XG5cdFx0XHRcdC8vQ2hlY2sgaWYgQWxsIHBhcmFtZXRlcnMgYXJlIG5lZWRlZFxuXHRcdFx0XHRrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkOiBmYWxzZSwgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdFx0YnVzeU1vZGU6IFwiTG9jYWxcIiwgLy8gYnVzeSBoYW5kbGluZyBzaGFsbCBiZSBkb25lIGxvY2FsbHkgb25seVxuXHRcdFx0XHRidXN5SWQ6ICh0YWJsZT8uZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkgfCB1bmRlZmluZWQpPy5nZXRUYWJsZURlZmluaXRpb24oKT8uYW5ub3RhdGlvbi5pZCxcblx0XHRcdFx0cGFyZW50Q29udHJvbDogdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVDcmVhdGUsXG5cdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0U3RhcnR1cE1vZGUoKSA9PT0gU3RhcnR1cE1vZGUuQXV0b0NyZWF0ZSwgLy8gSW4gY2FzZSB0aGUgYXBwbGljYXRpb24gd2FzIGNhbGxlZCB3aXRoIHByZWZlcnJlZE1vZGU9YXV0b0NyZWF0ZVdpdGgsIHdlIHdhbnQgdG8gc2tpcCB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLklubGluZSxcblx0XHRcdFx0cGFyZW50Q29udGV4dDogcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblx0XHRcdH0sXG5cdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0ZmFsc2Vcblx0XHQpO1xuXG5cdFx0aWYgKCFwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cykge1xuXHRcdFx0dGhpcy5oYW5kbGVTaWRlRWZmZWN0cyhsaXN0QmluZGluZywgY3JlYXRpb24pO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5wb3N0RG9jdW1lbnRDcmVhdGlvbihQcm9taXNlLmFsbChbY3JlYXRpb24sIHRoaXMuc3luY1Rhc2soY3JlYXRpb24pXSksIGxpc3RCaW5kaW5nKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZGVmZmVyZWQgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBoYXMgdG8gYmUgY3JlYXRlZFxuXHQgKiBAcGFyYW0gcGFyZW50Q29udGV4dCBPcHRpb25hbCBwYXJlbnQgY29udGV4dCB3aGVuIGNyZWF0aW5nIGEgbm9kZSBpbiBUcmVlVGFibGVcblx0ICogQHBhcmFtIGRhdGFcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBuYXZpZ2F0aW9uIGlzIGRvbmVcblx0ICovXG5cdGFzeW5jIGNyZWF0ZURlZmVycmVkRG9jdW1lbnQobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dCwgZGF0YT86IG9iamVjdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRCdXN5TG9ja2VyLmxvY2sobG9ja09iamVjdCk7XG5cdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQobGlzdEJpbmRpbmcsIHtcblx0XHRcdGNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzOiB7IG1vZGU6IFwiRGVmZXJyZWRcIiwgcGFyZW50Q29udGV4dCwgbGlzdEJpbmRpbmcsIGRhdGEgfSxcblx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0Zm9yY2VGb2N1czogdHJ1ZVxuXHRcdH0pO1xuXHRcdEJ1c3lMb2NrZXIudW5sb2NrKGxvY2tPYmplY3QpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBzeW5jIG9yIGFzeW5jIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSBUaGUgc3luYyBvciBhc3luYyBjcmVhdGlvbiBtb2RlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWQgVGhpcyBkb2N1bWVudCBpcyBjcmVhdGVkIGFmdGVyIGEgZGVmZmVyZWQgY3JlYXRpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uICBUaGUgY3JlYXRlIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIGNyZWF0ZSBhY3Rpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZGF0YSAgRGF0YSB0byBzYXZlIG9uIHRoZSBuZXcgZG9jdW1lbnRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFRoZSBzaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHRcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVTeW5jQXN5bmNEb2N1bWVudChcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGlvbk1vZGU6IHN0cmluZztcblx0XHRcdGJGcm9tRGVmZXJyZWQ/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRcdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQ7XG5cdFx0fSxcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZ1xuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgbmF2aWdhdGlvbjogUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBsb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0Y29uc3Qgcm91dGluZ0xpc3RlbmVyID0gdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKTtcblx0XHRCdXN5TG9ja2VyLmxvY2sobG9ja09iamVjdCk7XG5cblx0XHRjb25zdCBjcmVhdGlvbiA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKVxuXHRcdFx0LmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC4uLnBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0Li4ue1xuXHRcdFx0XHRcdFx0cGFyZW50Q29udHJvbDogdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlQ3JlYXRlLFxuXHRcdFx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5BdXRvQ3JlYXRlIC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdGZhbHNlXG5cdFx0XHQpXG5cdFx0XHQudGhlbigobmV3RG9jdW1lbnRDb250ZXh0KSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSAmJiBuZXdEb2N1bWVudENvbnRleHQgJiYgbmV3RG9jdW1lbnRDb250ZXh0LmdldEJpbmRpbmcoKSAhPT0gbGlzdEJpbmRpbmcpIHtcblx0XHRcdFx0XHQvLyBJbiBGQ0wgY2FzZSwgaWYgdGhlIG5ldyBjb250ZXh0IGhhcyBiZWVuIGNyZWF0ZWQgd2l0aCBhbiBhY3Rpb24gKG5vdCB3aXRoIHRoZSBzdGFuZGFyZCBQT1NUIGNyZWF0ZSksIHdlIG5lZWQgdG8gcmVmcmVzaFxuXHRcdFx0XHRcdC8vIHRoZSBvcmlnaW5hbCBsaXN0QmluZGluZyBzbyB0aGF0IGl0IGNvbnRhaW5zIHRoZSBuZXdseSBjcmVhdGVkIG9iamVjdCAodGhpcyBpcyBkb25lIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGxpc3RCaW5kaW5nIGZvciBzdGFuZGFyZCBjcmVhdGUpXG5cdFx0XHRcdFx0bGlzdEJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG5ld0RvY3VtZW50Q29udGV4dDtcblx0XHRcdH0pO1xuXG5cdFx0Ly8gRG9uJ3QgZG8gdGhpcyBpZiB0aGUgaW52b2NhdGlvbiBjb21lcyBmcm9tIGEgZGVmZXJyZWQgY3JlYXRpb24gb3IgaWYgU2F2ZSBpcyBwcmVzc2VkIGRpcmVjdGx5IGFmdGVyIGZpbGxpbmcgdGhlIENyZWF0aW9uUm93XG5cdFx0aWYgKHBhcmFtZXRlcnMuYkZyb21EZWZlcnJlZCAhPT0gdHJ1ZSAmJiAhcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMpIHtcblx0XHRcdHRoaXMuaGFuZGxlU2lkZUVmZmVjdHMobGlzdEJpbmRpbmcsIGNyZWF0aW9uKTtcblx0XHR9XG5cblx0XHRpZiAocGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5Bc3luYykge1xuXHRcdFx0bmF2aWdhdGlvbiA9IHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQobGlzdEJpbmRpbmcsIHtcblx0XHRcdFx0Y3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM6IHsgbW9kZTogXCJBc3luY1wiLCBjcmVhdGVDb250ZXh0UHJvbWlzZTogY3JlYXRpb24gfSxcblx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdGZvcmNlRm9jdXM6IHRydWVcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRuYXZpZ2F0aW9uID0gY3JlYXRpb24udGhlbihhc3luYyAobmV3RG9jdW1lbnRDb250ZXh0KSA9PiB7XG5cdFx0XHRcdGlmICghbmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdFx0Y29uc3QgY29yZVJlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblx0XHRcdFx0XHRyZXR1cm4gcm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlVG9NZXNzYWdlUGFnZShjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIiksIHtcblx0XHRcdFx0XHRcdHRpdGxlOiBjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IGNvcmVSZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19FRElURkxPV19TQVBGRV9DUkVBVElPTl9GQUlMRURfREVTQ1JJUFRJT05cIilcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBTeW5jIGNyZWF0aW9uIHdhcyB0cmlnZ2VyZWQgZm9yIGEgZGVmZXJyZWQgY3JlYXRpb24sIHdlIGRvbid0IG5hdmlnYXRlIGZvcndhcmRcblx0XHRcdFx0XHQvLyBhcyB3ZSdyZSBhbHJlYWR5IG9uIHRoZSBjb3JyZXNwb25kaW5nIE9iamVjdFBhZ2Vcblx0XHRcdFx0XHRjb25zdCBuYXZQYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdGZvcmNlRm9jdXM6IHRydWUsXG5cdFx0XHRcdFx0XHR0cmFuc2llbnQ6XG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChsaXN0QmluZGluZykgPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgcGFyYW1ldGVycy5jcmVhdGVBY3Rpb24gPyB0cnVlIDogdW5kZWZpbmVkXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdHJldHVybiBwYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWRcblx0XHRcdFx0XHRcdD8gcm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlVG9Db250ZXh0KG5ld0RvY3VtZW50Q29udGV4dCwgbmF2UGFyYW1ldGVycylcblx0XHRcdFx0XHRcdDogcm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChuZXdEb2N1bWVudENvbnRleHQsIG5hdlBhcmFtZXRlcnMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMucG9zdERvY3VtZW50Q3JlYXRpb24oUHJvbWlzZS5hbGwoW2NyZWF0aW9uLCBuYXZpZ2F0aW9uXSksIGxpc3RCaW5kaW5nKTtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0Ly8gVE9ETzogY3VycmVudGx5LCB0aGUgb25seSBlcnJvcnMgaGFuZGxlZCBoZXJlIGFyZSByYWlzZWQgYXMgc3RyaW5nIC0gc2hvdWxkIGJlIGNoYW5nZWQgdG8gRXJyb3Igb2JqZWN0c1xuXHRcdFx0Ly8gY3JlYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkIGJ5IHVzZXIgb3IgZmFpbGVkIGluIGJhY2tlbmQgPT4gaW4gY2FzZSB3ZSBoYXZlIG5hdmlnYXRlZCB0byB0cmFuc2llbnQgY29udGV4dCBiZWZvcmUsIG5hdmlnYXRlIGJhY2tcblx0XHRcdC8vIHRoZSBzd2l0Y2gtc3RhdGVtZW50IGFib3ZlIHNlZW1zIHRvIGluZGljYXRlIHRoYXQgdGhpcyBoYXBwZW5zIGluIGNyZWF0aW9uTW9kZXMgZGVmZXJyZWQgYW5kIGFzeW5jLiBCdXQgaW4gZmFjdCwgaW4gdGhlc2UgY2FzZXMgYWZ0ZXIgdGhlIG5hdmlnYXRpb24gZnJvbSByb3V0ZU1hdGNoZWQgaW4gT1AgY29tcG9uZW50XG5cdFx0XHQvLyBjcmVhdGVEZWZlcnJlZERvY3VtZW50IGlzIHRyaWdnZXJlZCwgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QgKGNyZWF0ZURvY3VtZW50KSBhZ2FpbiAtIHRoaXMgdGltZSB3aXRoIGNyZWF0aW9uTW9kZSBzeW5jLiBUaGVyZWZvcmUsIGFsc28gaW4gdGhhdCBtb2RlIHdlIG5lZWQgdG8gdHJpZ2dlciBiYWNrIG5hdmlnYXRpb24uXG5cdFx0XHQvLyBUaGUgb3RoZXIgY2FzZXMgbWlnaHQgc3RpbGwgYmUgbmVlZGVkIGluIGNhc2UgdGhlIG5hdmlnYXRpb24gZmFpbHMuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdFtcblx0XHRcdFx0XHRDb25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nLFxuXHRcdFx0XHRcdENvbnN0YW50cy5BY3Rpb25FeGVjdXRpb25GYWlsZWQsXG5cdFx0XHRcdFx0Q29uc3RhbnRzLkNyZWF0aW9uRmFpbGVkLFxuXHRcdFx0XHRcdENvbnN0YW50cy5PbkJlZm9yZUNyZWF0ZUZhaWxlZFxuXHRcdFx0XHRdLmluY2x1ZGVzKGVycm9yKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlKCk7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYW4gZXh0ZXJuYWwgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBoYXMgdG8gYmUgY3JlYXRlZFxuXHQgKiBAcGFyYW0gb3V0Ym91bmQgVGhlIG91dGJvdW5kIGFjdGlvblxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVFeHRlcm5hbERvY3VtZW50KGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nIHwgc3RyaW5nLCBvdXRib3VuZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIFRPRE86IENhbGwgYXBwcm9wcmlhdGUgZnVuY3Rpb24gKGN1cnJlbnRseSB1c2luZyB0aGUgc2FtZSBhcyBmb3Igb3V0Ym91bmQgY2hldnJvbiBuYXYsIGFuZCB3aXRob3V0IGFueSBjb250ZXh0IC0gM3JkIHBhcmFtKVxuXHRcdGlmIChvdXRib3VuZCkge1xuXHRcdFx0aWYgKHR5cGVvZiBsaXN0QmluZGluZyAhPT0gXCJzdHJpbmdcIiAmJiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgY3JlYXRpb25Nb2RlIFwiRXh0ZXJuYWxcIiB3aXRoIGEgVHJlZVRhYmxlYCk7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IGNvbnRyb2xsZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXI7XG5cdFx0XHRjb25zdCBjcmVhdGVQYXRoID0gTW9kZWxIZWxwZXIuZ2V0QWJzb2x1dGVNZXRhUGF0aEZvckxpc3RCaW5kaW5nKHRoaXMuYmFzZS5nZXRWaWV3KCksIGxpc3RCaW5kaW5nKTtcblx0XHRcdGNvbnRyb2xsZXIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5vbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQoY29udHJvbGxlciwgb3V0Ym91bmQsIHVuZGVmaW5lZCwgY3JlYXRlUGF0aCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgdGhlIFNpZGVFZmZlY3RzIHRvIGV4ZWN1dGUgYWZ0ZXIgdGhlIGRvY3VtZW50IGNyZWF0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaGFzIHRvIGJlIGNyZWF0ZWRcblx0ICogQHBhcmFtIGNyZWF0aW9uUHJvbWlzZSBUaGUgcHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgU2lkZUVmZmVjdHMgaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRoYW5kbGVTaWRlRWZmZWN0cyA9IGFzeW5jIChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgY3JlYXRpb25Qcm9taXNlOiBQcm9taXNlPENvbnRleHQ+KTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHZpZXdCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRjb25zdCBuZXdDb250ZXh0ID0gYXdhaXQgY3JlYXRpb25Qcm9taXNlO1xuXHRcdFx0Ly8gdHJhbnNpZW50IGNvbnRleHRzIGFyZSByZWxpYWJseSByZW1vdmVkIG9uY2Ugb05ld0NvbnRleHQuY3JlYXRlZCgpIGlzIHJlc29sdmVkXG5cdFx0XHRhd2FpdCBuZXdDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQobGlzdEJpbmRpbmcpICYmIHZpZXdCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpXG5cdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShsaXN0QmluZGluZy5nZXRQYXRoKCksIHZpZXdCaW5kaW5nQ29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGZvciB0aGUgY3JlYXRpb25Sb3cuXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWxpZGF0aW9uTWVzc2FnZXMgVGhlIGVycm9yIG1lc3NhZ2VzIGZvcm0gdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB0YWJsZSBUaGUgdGFibGUgdGFyZ2V0ZWQgYnkgdGhlIG1lc3NhZ2VzXG5cdCAqL1xuXHRjcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXMgPSAodmFsaWRhdGlvbk1lc3NhZ2VzOiB7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdLCB0YWJsZTogVGFibGUpOiB2b2lkID0+IHtcblx0XHRjb25zdCBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPSB0YWJsZS5nZXRDcmVhdGlvblJvdygpLmRhdGEoXCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cIik7XG5cdFx0Y29uc3QgY3VzdG9tVmFsaWRpdHkgPSB0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5nZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93Q3VzdG9tVmFsaWRpdHlcIik7XG5cdFx0Y29uc3QgY3VzdG9tTWVzc2FnZXM6IEN1c3RvbU1lc3NhZ2VbXSA9IFtdO1xuXHRcdGxldCBmaWVsZENvbnRyb2w7XG5cdFx0bGV0IGZpbmFsVGFyZ2V0OiBzdHJpbmc7XG5cblx0XHQvLyBSZW1vdmUgZXhpc3RpbmcgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0Y29uc3Qgb2xkTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdC5nZXREYXRhKClcblx0XHRcdC5maWx0ZXIoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IG1lc3NhZ2UuZ2V0Q29kZSgpID09PSBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pO1xuXHRcdE1lc3NhZ2luZy5yZW1vdmVNZXNzYWdlcyhvbGRNZXNzYWdlcyk7XG5cblx0XHR2YWxpZGF0aW9uTWVzc2FnZXMuZm9yRWFjaCgodmFsaWRhdGlvbk1lc3NhZ2UpID0+IHtcblx0XHRcdC8vIEhhbmRsZSBCb3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdGlmICh2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0KSB7XG5cdFx0XHRcdGZpZWxkQ29udHJvbCA9IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQoY3VzdG9tVmFsaWRpdHlbdmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldF0uZmllbGRJZCkgYXMgQ29udHJvbDtcblx0XHRcdFx0ZmluYWxUYXJnZXQgPSBgJHtmaWVsZENvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpfS8ke2ZpZWxkQ29udHJvbC5nZXRCaW5kaW5nUGF0aChcInZhbHVlXCIpfWA7XG5cdFx0XHRcdC8vIEFkZCB2YWxpZGF0aW9uIG1lc3NhZ2UgaWYgc3RpbGwgbm90IGV4aXN0c1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0IU1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHRcdFx0LmZpbHRlcigobWVzc2FnZTogTWVzc2FnZSkgPT4gbWVzc2FnZS5nZXRUYXJnZXRzKCkuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQgPT09IGZpbmFsVGFyZ2V0KSkubGVuZ3RoXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdE1lc3NhZ2luZy5hZGRNZXNzYWdlcyhcblx0XHRcdFx0XHRcdG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZTogdmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRleHQsXG5cdFx0XHRcdFx0XHRcdHByb2Nlc3NvcjogdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFx0XHRcdFx0XHRcdGNvZGU6IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHRcdFx0dGVjaG5pY2FsOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0cGVyc2lzdGVudDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdHRhcmdldDogZmluYWxUYXJnZXRcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBBZGQgY29udHJvbElkIGluIG9yZGVyIHRvIGdldCB0aGUgZm9jdXMgaGFuZGxpbmcgb2YgdGhlIGVycm9yIHBvcG92ZXJcblx0XHRcdFx0Y29uc3QgZXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0LmZpbHRlcigobWVzc2FnZTogTWVzc2FnZSkgPT4gbWVzc2FnZS5nZXRUYXJnZXRzKCkuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQgPT09IGZpbmFsVGFyZ2V0KSk7XG5cdFx0XHRcdGV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzWzBdLmFkZENvbnRyb2xJZChjdXN0b21WYWxpZGl0eVt2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0XS5maWVsZElkKTtcblxuXHRcdFx0XHQvLyBIYW5kbGUgVW5ib3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGN1c3RvbU1lc3NhZ2VzLnB1c2goe1xuXHRcdFx0XHRcdGNvZGU6IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHR0ZXh0OiB2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRwZXJzaXN0ZW50OiB0cnVlLFxuXHRcdFx0XHRcdHR5cGU6IE1lc3NhZ2VUeXBlLkVycm9yXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aWYgKGN1c3RvbU1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHtcblx0XHRcdFx0Y3VzdG9tTWVzc2FnZXM6IGN1c3RvbU1lc3NhZ2VzXG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIFJlc29sdmVzIHRoZSBjcmVhdGlvbiBtb2RlXG5cdCAqIFByb3ZpZGVzIHRoZSBleHBlY3RlZCBjcmVhdGlvbiBtb2RlOlxuXHQgKiAgLSBwcmVzZXJ2ZXMgdGhlIHBhc3NlZCBjcmVhdGlvbiBtb2RlIHdoZW4gdGhpcyBvbmUgaXMgbm90IGEgTmV3UGFnZVxuXHQgKiAgLSBjYWxjdWxhdGVzIHRoZSBuZXcgb25lIGlmIHRoZSBjcmVhdGlvbiBtb2RlIGlzIGEgTmV3UGFnZS5cblx0ICpcblx0ICogQHBhcmFtIGluaXRpYWxDcmVhdGlvbk1vZGUgVGhlIGluaXRpYWwgY3JlYXRpb24gbW9kZVxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gY3JlYXRlRGF0YSBUaGUgaW5pdGlhbCBkYXRhIGZvciBvYmplY3QgY3JlYXRpb25cblx0ICogQHJldHVybnMgVGhlIG5ldyBjcmVhdGlvbiBtb2RlXG5cdCAqL1xuXHRyZXNvbHZlQ3JlYXRpb25Nb2RlID0gKGluaXRpYWxDcmVhdGlvbk1vZGU6IHN0cmluZywgbGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIGNyZWF0ZURhdGE6IG9iamVjdCB8IHVuZGVmaW5lZCk6IHN0cmluZyA9PiB7XG5cdFx0aWYgKGluaXRpYWxDcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5OZXdQYWdlKSB7XG5cdFx0XHQvLyB1c2UgdGhlIHBhc3NlZCBjcmVhdGlvbiBtb2RlXG5cdFx0XHRyZXR1cm4gaW5pdGlhbENyZWF0aW9uTW9kZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gbGlzdEJpbmRpbmcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWw6IHN0cmluZyA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChsaXN0QmluZGluZyk7XG5cdFx0XHQvLyBOZXdBY3Rpb24gaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIE5hdmlnYXRpb25Qcm9wZXJ0eSBjb2xsZWN0aW9uXG5cdFx0XHRpZiAoIWxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0XHRjb25zdCBkYXRhTW9kZWxMaXN0QmluZGluZ1BhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGxpc3RCaW5kaW5nLmdldFBhdGgoKSkpO1xuXHRcdFx0XHRjb25zdCBlbnRpdHlTZXQgPSBkYXRhTW9kZWxMaXN0QmluZGluZ1BhdGgudGFyZ2V0RW50aXR5U2V0IGFzIEVudGl0eVNldCB8IHVuZGVmaW5lZCxcblx0XHRcdFx0XHQvLyBpZiBOZXdBY3Rpb24gd2l0aCBwYXJhbWV0ZXJzIGlzIHByZXNlbnQsIHRoZW4gY3JlYXRpb24gaXMgJ0RlZmVycmVkJ1xuXHRcdFx0XHRcdC8vIGluIHRoZSBhYnNlbmNlIG9mIE5ld0FjdGlvbiBvciBOZXdBY3Rpb24gd2l0aCBwYXJhbWV0ZXJzLCBjcmVhdGlvbiBpcyBhc3luY1xuXHRcdFx0XHRcdG5ld0FjdGlvbiA9IChcblx0XHRcdFx0XHRcdHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnRcblx0XHRcdFx0XHRcdFx0PyBlbnRpdHlTZXQ/LmFubm90YXRpb25zLkNvbW1vbj8uRHJhZnRSb290XG5cdFx0XHRcdFx0XHRcdDogZW50aXR5U2V0Py5hbm5vdGF0aW9ucy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkXG5cdFx0XHRcdFx0KT8uTmV3QWN0aW9uPy50b1N0cmluZygpO1xuXG5cdFx0XHRcdGlmIChuZXdBY3Rpb24gJiYgZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoLnRhcmdldEVudGl0eVR5cGUuYWN0aW9uc1tuZXdBY3Rpb25dLnBhcmFtZXRlcnMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdC8vIGJpbmRpbmcgcGFyYW1ldGVyIChlZzogX2l0KSBpcyBub3QgY29uc2lkZXJlZFxuXHRcdFx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNvbnN0IGNyZWF0aW9uUGFyYW1ldGVycyA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5nZXRDcmVhdGlvblBhcmFtZXRlcnMobGlzdEJpbmRpbmcsIGNyZWF0ZURhdGEsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkpO1xuXHRcdFx0aWYgKGNyZWF0aW9uUGFyYW1ldGVycy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5EZWZlcnJlZDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuQXN5bmM7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBWYWxpZGF0ZXMgYSBkb2N1bWVudC5cblx0ICpcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiB0aGUgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0ICovXG5cblx0YXN5bmMgdmFsaWRhdGVEb2N1bWVudChcblx0XHRjb250ZXh0OiBDb250ZXh0LFxuXHRcdHBhcmFtZXRlcnM6IHsgY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uPzogc3RyaW5nOyBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9XG5cdCk6IFByb21pc2U8eyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXT4ge1xuXHRcdHJldHVybiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkudmFsaWRhdGVEb2N1bWVudChjb250ZXh0LCBwYXJhbWV0ZXJzLCB0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0aGF0IHByb3ZpZGVzIHRoZSByZXN1bHQgb2Zcblx0ICogYSBjcmVhdGlvbiByb3cncyBjdXN0b20gdmFsaWRhdGlvbiBhcyBhIHByb21pc2UuIElmIG5vIGNyZWF0aW9uIHJvdyBpcyBpbnZvbHZlZFxuXHQgKiB0aGUgcmVzdWx0aW5nIGZ1bmN0aW9uIHJldHVybnMgYSByZXNvbHZlZCBwcm9taXNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gdGFibGUgVGhlIHRhYmxlIHdpdGggdGhlIGNyZWF0aW9uUm93XG5cdCAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcHJvbWlzZVxuXHQgKi9cblx0Z2V0Q3JlYXRpb25Sb3dWYWxpZGF0aW9uRnVuY3Rpb24odGFibGU6IFRhYmxlIHwgdW5kZWZpbmVkKTogKCkgPT4gUHJvbWlzZTx7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdPiB7XG5cdFx0Y29uc3QgY3JlYXRpb25Sb3cgPSB0YWJsZT8uZ2V0Q3JlYXRpb25Sb3coKTtcblx0XHRpZiAoY3JlYXRpb25Sb3cgJiYgdGFibGUpIHtcblx0XHRcdHJldHVybiBhc3luYyAoKTogUHJvbWlzZTx7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdPiA9PiB7XG5cdFx0XHRcdGNvbnN0IGNyZWF0aW9uUm93T2JqZWN0cyA9IChjcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQpLmdldE9iamVjdCgpO1xuXHRcdFx0XHRkZWxldGUgY3JlYXRpb25Sb3dPYmplY3RzW1wiQCR1aTUuY29udGV4dC5pc1RyYW5zaWVudFwiXTtcblx0XHRcdFx0cmV0dXJuIHRoaXMudmFsaWRhdGVEb2N1bWVudCh0YWJsZS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQsIHtcblx0XHRcdFx0XHRkYXRhOiBjcmVhdGlvblJvd09iamVjdHMsXG5cdFx0XHRcdFx0Y3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uOiB0YWJsZS5nZXRDcmVhdGlvblJvdygpLmRhdGEoXCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cIilcblx0XHRcdFx0fSk7XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZXR1cm4gYXN5bmMgKCkgPT4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHNldmVyYWwgZG9jdW1lbnRzLlxuXHQgKlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3RCaW5kaW5nIHVzZWQgdG8gY3JlYXRlIHRoZSBkb2N1bWVudHNcblx0ICogQHBhcmFtIGRhdGFGb3JDcmVhdGUgVGhlIGluaXRpYWwgZGF0YSBmb3IgdGhlIG5ldyBkb2N1bWVudHNcblx0ICogQHBhcmFtIGNyZWF0ZUF0RW5kIFRydWUgaWYgdGhlIG5ldyBjb250ZXh0cyBuZWVkIHRvIGJlIGNyZWF0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBpc0Zyb21Db3B5UGFzdGUgVHJ1ZSBpZiB0aGUgY3JlYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkIGJ5IGEgcGFzdGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBiZWZvcmVDcmVhdGVDYWxsQmFjayBDYWxsYmFjayB0byBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjcmVhdGlvblxuXHQgKiBAcGFyYW0gY3JlYXRlQXNJbmFjdGl2ZSBUcnVlIGlmIHRoZSBjb250ZXh0cyBuZWVkIHRvIGJlIGNyZWF0ZWQgYXMgaW5hY3RpdmVcblx0ICogQHBhcmFtIHJlcXVlc3RTaWRlRWZmZWN0cyBUcnVlIGJ5IGRlZmF1bHQsIGZhbHNlIGlmIFNpZGVFZmZlY3RzIHNob3VsZCBub3QgYmUgcmVxdWVzdGVkXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSB3aXRoIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHRzLlxuXHQgKi9cblx0YXN5bmMgY3JlYXRlTXVsdGlwbGVEb2N1bWVudHMoXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0ZGF0YUZvckNyZWF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcblx0XHRjcmVhdGVBdEVuZDogYm9vbGVhbixcblx0XHRpc0Zyb21Db3B5UGFzdGU6IGJvb2xlYW4sXG5cdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbixcblx0XHRjcmVhdGVBc0luYWN0aXZlID0gZmFsc2UsXG5cdFx0cmVxdWVzdFNpZGVFZmZlY3RzPzogYm9vbGVhblxuXHQpOiBQcm9taXNlPENvbnRleHRbXT4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCB0YXJnZXRMaXN0QmluZGluZyA9IGxpc3RCaW5kaW5nO1xuXHRcdHJlcXVlc3RTaWRlRWZmZWN0cyA9IHJlcXVlc3RTaWRlRWZmZWN0cyAhPT0gZmFsc2U7XG5cdFx0aWYgKCFjcmVhdGVBc0luYWN0aXZlKSB7XG5cdFx0XHRCdXN5TG9ja2VyLmxvY2sobG9ja09iamVjdCk7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRpZiAoYmVmb3JlQ3JlYXRlQ2FsbEJhY2spIHtcblx0XHRcdFx0YXdhaXQgYmVmb3JlQ3JlYXRlQ2FsbEJhY2soeyBjb250ZXh0UGF0aDogdGFyZ2V0TGlzdEJpbmRpbmcuZ2V0UGF0aCgpIH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSB0YXJnZXRMaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0bGV0IG1ldGFQYXRoOiBzdHJpbmc7XG5cblx0XHRcdGlmICh0YXJnZXRMaXN0QmluZGluZy5nZXRDb250ZXh0KCkpIHtcblx0XHRcdFx0bWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgoYCR7dGFyZ2V0TGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLmdldFBhdGgoKX0vJHt0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCl9YCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aCh0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCkpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmhhbmRsZUNyZWF0ZUV2ZW50cyh0YXJnZXRMaXN0QmluZGluZyk7XG5cblx0XHRcdC8vIEl0ZXJhdGUgb24gYWxsIGl0ZW1zIGFuZCBzdG9yZSB0aGUgY29ycmVzcG9uZGluZyBjcmVhdGlvbiBwcm9taXNlXG5cdFx0XHRjb25zdCBjcmVhdGlvblByb21pc2VzID0gZGF0YUZvckNyZWF0ZS5tYXAoYXN5bmMgKHByb3BlcnR5VmFsdWVzKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGNyZWF0ZVBhcmFtZXRlcnM6IENyZWF0ZVBhcmFtZXRlcnMgPSB7IGRhdGE6IHt9LCBwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSB9O1xuXG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9IGZhbHNlOyAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdztcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA9IGNyZWF0ZUF0RW5kO1xuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmluYWN0aXZlID0gY3JlYXRlQXNJbmFjdGl2ZTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFzIHdlIGRvbid0IHN1cHBvcnQgZGVlcCBjcmVhdGVcblx0XHRcdFx0Zm9yIChjb25zdCBwcm9wZXJ0eVBhdGggaW4gcHJvcGVydHlWYWx1ZXMpIHtcblx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eSA9IG1ldGFNb2RlbC5nZXRPYmplY3QoYCR7bWV0YVBhdGh9LyR7cHJvcGVydHlQYXRofWApO1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdHByb3BlcnR5ICYmXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eS4ka2luZCAhPT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIiAmJlxuXHRcdFx0XHRcdFx0IXByb3BlcnR5UGF0aC5pbmNsdWRlcyhcIi9cIikgJiZcblx0XHRcdFx0XHRcdHByb3BlcnR5VmFsdWVzW3Byb3BlcnR5UGF0aF1cblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMuZGF0YSFbcHJvcGVydHlQYXRoXSA9IHByb3BlcnR5VmFsdWVzW3Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRcdHRhcmdldExpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdFx0aXNGcm9tQ29weVBhc3RlXG5cdFx0XHRcdCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3QgY3JlYXRlZENvbnRleHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoY3JlYXRpb25Qcm9taXNlcyk7XG5cdFx0XHRpZiAoIWNyZWF0ZUFzSW5hY3RpdmUpIHtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUodGFyZ2V0TGlzdEJpbmRpbmcpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gdHJhbnNpZW50IGNvbnRleHRzIGFyZSByZWxpYWJseSByZW1vdmVkIG9uY2Ugb05ld0NvbnRleHQuY3JlYXRlZCgpIGlzIHJlc29sdmVkXG5cdFx0XHRjb25zdCBhY3RpdmVDb250ZXh0cyA9IGNyZWF0ZWRDb250ZXh0cy5maWx0ZXIoKG5ld0NvbnRleHQpID0+ICFuZXdDb250ZXh0LmlzSW5hY3RpdmUoKSk7XG5cdFx0XHRhd2FpdCBQcm9taXNlLmFsbChhY3RpdmVDb250ZXh0cy5tYXAoYXN5bmMgKG5ld0NvbnRleHQpID0+IG5ld0NvbnRleHQuY3JlYXRlZCgpKSk7XG5cblx0XHRcdGNvbnN0IHZpZXdCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHRpZiAocmVxdWVzdFNpZGVFZmZlY3RzICYmICFDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KHRhcmdldExpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpXG5cdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSh0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCksIHZpZXdCaW5kaW5nQ29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKSAmJiBhY3RpdmVDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5DcmVhdGUsIGFjdGl2ZUNvbnRleHRzKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGNyZWF0ZWRDb250ZXh0cztcblx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIG11bHRpcGxlIGRvY3VtZW50cy5cIik7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmICghY3JlYXRlQXNJbmFjdGl2ZSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhsb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdDcmVhdGUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdDcmVhdGUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyBzdG9wcGVkLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUNyZWF0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRQYXRoIFBhdGggcG9pbnRpbmcgdG8gdGhlIGNvbnRleHQgb24gd2hpY2ggQ3JlYXRlIGFjdGlvbiBpcyB0cmlnZ2VyZWRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jcmVhdGVQYXJhbWV0ZXJzIEFycmF5IG9mIHZhbHVlcyB0aGF0IGFyZSBmaWxsZWQgaW4gdGhlIEFjdGlvbiBQYXJhbWV0ZXIgRGlhbG9nXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQmVmb3JlQ3JlYXRlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dFBhdGg/OiBzdHJpbmc7IGNyZWF0ZVBhcmFtZXRlcnM/OiB1bmtub3duW10gfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdFZGl0JyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRWRpdCcgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0VkaXQnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBkaXNwbGF5IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRWRpdFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgZWRpdGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShcIkFmdGVyQXN5bmNcIilcblx0YXN5bmMgb25CZWZvcmVFZGl0KF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdTYXZlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnU2F2ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlU2F2ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgc2F2ZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKFwiQWZ0ZXJBc3luY1wiKVxuXHRAaG9va2FibGUoXCJhZnRlclwiLCB0cnVlKVxuXHRhc3luYyBvbkJlZm9yZVNhdmUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdEaXNjYXJkJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEaXNjYXJkXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBkaXNjYXJkZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkJlZm9yZURpc2NhcmQoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0RlbGV0ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0RlbGV0ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRGVsZXRlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dHMgQW4gYXJyYXkgb2YgY29udGV4dHMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkJlZm9yZURlbGV0ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb2RlIGFmdGVyIHRoZSAnU2F2ZScgYWN0aW9uLlxuXHQgKiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZVNhdmVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFRoZSBjb250ZXh0IHdlIG9idGFpbmVkIGFmdGVyIHNhdmluZ1xuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGhvb2thYmxlKFwiYWZ0ZXJcIilcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJTYXZlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdDcmVhdGUnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVDcmVhdGVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHRcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMTYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyQ3JlYXRlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdFZGl0JyBhY3Rpb24uXG5cdCAqIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRWRpdFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgZWRpdGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJFZGl0KF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdEaXNjYXJkJyBhY3Rpb24uXG5cdCAqIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRGlzY2FyZFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgVGhlIGNvbnRleHQgb2J0YWluZWQgYWZ0ZXIgZGlzY2FyZGluZyB0aGUgb2JqZWN0LCBvciB1bmRlZmluZWQgaWYgd2UgZGlzY2FyZGVkIGEgbmV3IG9iamVjdFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJEaXNjYXJkKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdEZWxldGUnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEZWxldGVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0cyBBbiBhcnJheSBvZiBjb250ZXh0cyB0aGF0IGFyZSBnb2luZyB0byBiZSBkZWxldGVkXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuMTE2LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25BZnRlckRlbGV0ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gbVBhcmFtZXRlcnMuYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgSW5kaWNhdGVzIHdoZXRoZXIgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBpZ25vcmVkIHdoZW4gdXNlciBjbGlja3Mgb24gU2F2ZSBkdXJpbmcgYW4gSW5saW5lIGNyZWF0aW9uXG5cdC8vIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycy5iaW5kaW5ncyBMaXN0IGJpbmRpbmdzIG9mIHRoZSB0YWJsZXMgaW4gdGhlIHZpZXcuXG5cdC8vIEJvdGggb2YgdGhlIGFib3ZlIHBhcmFtZXRlcnMgYXJlIGZvciB0aGUgc2FtZSBwdXJwb3NlLiBVc2VyIGNhbiBlbnRlciBzb21lIGluZm9ybWF0aW9uIGluIHRoZSBjcmVhdGlvbiByb3cocykgYnV0IGRvZXMgbm90ICdBZGQgcm93JywgaW5zdGVhZCBjbGlja3MgU2F2ZS5cblx0Ly8gVGhlcmUgY2FuIGJlIG1vcmUgdGhhbiBvbmUgaW4gdGhlIHZpZXcuXG5cblx0LyoqXG5cdCAqIFNhdmVzIGEgbmV3IGRvY3VtZW50IGFmdGVyIGNoZWNraW5nIGl0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGVkaXRhYmxlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBQUklWQVRFXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBzYXZlIGlzIGNvbXBsZXRlXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHNhdmVEb2N1bWVudChvQ29udGV4dDogQ29udGV4dCwgbVBhcmFtZXRlcnM6IFNhdmVEb2N1bWVudFBhcmFtZXRlcnMpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdGNvbnN0IGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yID0gbVBhcmFtZXRlcnMuYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgfHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGFCaW5kaW5ncyA9IG1QYXJhbWV0ZXJzLmJpbmRpbmdzIGFzIE9EYXRhTGlzdEJpbmRpbmdbXTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHQvLyBpbiBjYXNlIG9mIHNhdmluZyAvIGFjdGl2YXRpbmcgdGhlIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgc2hhbGwgYmUgcmVtb3ZlZCBiZWZvcmUgdGhlIFBBVENIL1BPU1Rcblx0XHRcdC8vIGlzIHNlbnQgdG8gdGhlIGJhY2tlbmRcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5tZXJnZVBhdGNoRHJhZnQgIT09IHRydWUpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5fc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQpO1xuXHRcdFx0XHQvL3dlIG5lZWQgdG8gcmVxdWVzdCBmb3IgcmVjb21tZW5kYXRpb25zIGFuZCB0aGVuIGJyaW5nIHRoZSBkaWFsb2cgaGVyZVxuXHRcdFx0fVxuXHRcdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cblx0XHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3NlbiA9IGF3YWl0IHRoaXMuY2hlY2tSZWNvbW1lbmRhdGlvbk9wdGlvbigpO1xuXG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVTYXZlKHsgY29udGV4dDogb0NvbnRleHQgfSk7XG5cblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRcdGxldCBzaWJsaW5nSW5mbzogU2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5IHx8IG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpKSAmJlxuXHRcdFx0XHRvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gTm8gbmVlZCB0byB0cnkgdG8gZ2V0IHJpZ2h0bW9zdCBjb250ZXh0IGluIGNhc2Ugb2YgYSBuZXcgb2JqZWN0XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHRvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKSxcblx0XHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoZSAkYXV0byBxdWV1ZSBjYW4gb25seSBoYXZlIHBlbmRpbmcgY2hhbmdlcyBhdCB0aGlzIHBvaW50IHdoZW4gU0FWRSB3YXMgY2xpY2tlZCBpbW1lZGlhdGVseSBhZnRlciBjaGFuZ2luZyBhIGZpZWxkLlxuXHRcdFx0Ly8gSW4gdGhpcyBjYXNlIHRoZSAkYXV0byBxdWV1ZSBpcyBsb2NrZWQgdGhlcmVmb3JlIHRoZSBmb2xsb3dpbmcgc3VibWl0IGJhdGNoIHNob3VsZCBub3QgY3JlYXRlIGEgc2VwYXJhdGUgYmF0Y2ggcmVxdWVzdC5cblx0XHRcdC8vIEl0IGlzIGRvbmUgaW4gb3JkZXIgdG8gbWFrZSBzdXJlIHRoYXQgcGF0Y2gsIGRyYWZ0cHJlcGFyZSwgZHJhZnRhY3RpdmF0ZSBlYWNoIGhhdmUgdGhlaXIgb3duIGNoYW5nZXNldFxuXHRcdFx0aWYgKG9Db250ZXh0LmdldE1vZGVsKCkuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSAmJiBtUGFyYW1ldGVycy5tZXJnZVBhdGNoRHJhZnQpIHtcblx0XHRcdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChcIiRhdXRvXCIpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgYWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuc2F2ZURvY3VtZW50KFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciBhcyBib29sZWFuLFxuXHRcdFx0XHRhQmluZGluZ3MsXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0dGhpcy5nZXRDcmVhdGlvbk1vZGUoKVxuXHRcdFx0KTtcblx0XHRcdHRoaXMuX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwpO1xuXG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQWN0aXZhdGUsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmRpc2Nvbm5lY3QoKTtcblxuXHRcdFx0dGhpcy5fdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoU3RhbmRhcmRBY3Rpb25zLnNhdmUsIFRyaWdnZXJUeXBlLnN0YW5kYXJkQWN0aW9uKTtcblxuXHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKGZhbHNlKTtcblx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cblx0XHRcdHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyU2F2ZSh7XG5cdFx0XHRcdGNvbnRleHQ6IGFjdGl2ZURvY3VtZW50Q29udGV4dFxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIHVwZGF0ZSB0ZWxlbWV0cnkgZGF0YSBmb3IgaG93IHBhZ2Ugd2FzIHNhdmVkIGFuZCB0aGVuIGRvIHN0b3Jpbmcgb2YgdGhpcyBkYXRhIHRvIGJhY2tlbmQgdGhyb3VnaCB0aGUgc3RvcmVEYXRhIGZ1bmN0aW9uXG5cdFx0XHR0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLnN0b3JlRGF0YUZvclRlbGVtZXRyeShyZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4pO1xuXG5cdFx0XHRpZiAoYWN0aXZlRG9jdW1lbnRDb250ZXh0ICE9PSBvQ29udGV4dCkge1xuXHRcdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGUgPSBhY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cblx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdFx0Ly8gV2hlbiBzYXZpbmcsIHRoZSBzZW1hbnRpYyBrZXlzIG1heSBoYXZlIGNoYW5nZWQuXG5cdFx0XHRcdFx0Ly8gSW4gdGhpcyBjYXNlLCB3ZSBhbHNvIG5lZWQgdG8gbWFuYWdlIHRoZSBzZW1hbnRpYyBVUkwgY2hhbmdlIGluIHRoZSBoaXN0b3J5XG5cdFx0XHRcdFx0Y29uc3QgcHJldmlvdXNTZW1hbnRpY1BhdGggPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgob0NvbnRleHQsIHRydWUpO1xuXHRcdFx0XHRcdGNvbnN0IG5ld1NlbWFudGljUGF0aCA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljUGF0aChhY3RpdmVEb2N1bWVudENvbnRleHQsIHRydWUpO1xuXHRcdFx0XHRcdGlmIChwcmV2aW91c1NlbWFudGljUGF0aCAmJiBuZXdTZW1hbnRpY1BhdGggJiYgcHJldmlvdXNTZW1hbnRpY1BhdGggIT09IG5ld1NlbWFudGljUGF0aCkge1xuXHRcdFx0XHRcdFx0c2libGluZ0luZm8ucGF0aE1hcHBpbmcucHVzaCh7IG9sZFBhdGg6IHByZXZpb3VzU2VtYW50aWNQYXRoLCBuZXdQYXRoOiBuZXdTZW1hbnRpY1BhdGggfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gYWN0aXZlRG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIHsgZWRpdGFibGU6IGZhbHNlLCByZWNyZWF0ZUNvbnRleHQ6IGZhbHNlLCBmb3JjZUZvY3VzOiB0cnVlIH0pO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0aWYgKCEob0Vycm9yICYmIChvRXJyb3IgYXMgeyBjYW5jZWxlZD86IGJvb2xlYW4gfSkuY2FuY2VsZWQpKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHNhdmluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN3aXRjaGVzIHRoZSBVSSBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0byBzd2l0Y2ggZnJvbVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIHN3aXRjaCBpcyBkb25lXG5cdCAqL1xuXHRhc3luYyB0b2dnbGVEcmFmdEFjdGl2ZShvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdGxldCBlZGl0YWJsZTogYm9vbGVhbjtcblx0XHRjb25zdCBiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHQvL3RvZ2dsZSBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgZG9jdW1lbnQgaXMgb25seSBhdmFpbGFibGUgZm9yIGVkaXQgZHJhZnRzIGFuZCBhY3RpdmUgZG9jdW1lbnRzIHdpdGggZHJhZnQpXG5cdFx0aWYgKFxuXHRcdFx0IWJJc0RyYWZ0IHx8XG5cdFx0XHQhKFxuXHRcdFx0XHQoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB8fFxuXHRcdFx0XHQob0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNEcmFmdEVudGl0eSlcblx0XHRcdClcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHQvL3N0YXJ0IFBvaW50OiBlZGl0IGRyYWZ0XG5cdFx0XHRlZGl0YWJsZSA9IGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBzdGFydCBwb2ludCBhY3RpdmUgZG9jdW1lbnRcblx0XHRcdGVkaXRhYmxlID0gdHJ1ZTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdFx0Y29uc3Qgb1JpZ2h0bW9zdENvbnRleHQgPSBvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpID8gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCkgOiBvQ29udGV4dDtcblx0XHRcdGxldCBzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob0NvbnRleHQsIG9SaWdodG1vc3RDb250ZXh0LCBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0LCBmYWxzZSk7XG5cdFx0XHRpZiAoIXNpYmxpbmdJbmZvICYmIG9Db250ZXh0ICE9PSBvUmlnaHRtb3N0Q29udGV4dCkge1xuXHRcdFx0XHQvLyBUcnkgdG8gY29tcHV0ZSBzaWJsaW5nIGluZm8gZm9yIHRoZSByb290IGNvbnRleHQgaWYgaXQgZmFpbHMgZm9yIHRoZSByaWdodG1vc3QgY29udGV4dFxuXHRcdFx0XHQvLyAtLT4gSW4gY2FzZSBvZiBGQ0wsIGlmIHdlIHRyeSB0byBzd2l0Y2ggYmV0d2VlbiBkcmFmdCBhbmQgYWN0aXZlIGJ1dCBhIGNoaWxkIGVudGl0eSBoYXMgbm8gc2libGluZywgdGhlIHN3aXRjaCB3aWxsIGNsb3NlIHRoZSBjaGlsZCBjb2x1bW5cblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKG9Db250ZXh0LCBvQ29udGV4dCwgUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNpYmxpbmdJbmZvKSB7XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoZWRpdGFibGUgPyBFZGl0TW9kZS5FZGl0YWJsZSA6IEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTsgLy9zd2l0Y2ggdG8gZWRpdCBtb2RlIG9ubHkgaWYgYSBkcmFmdCBpcyBhdmFpbGFibGVcblxuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdGNvbnN0IGxhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRcdFx0XHRpZiAobGFzdFNlbWFudGljTWFwcGluZz8udGVjaG5pY2FsUGF0aCA9PT0gb0NvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB0YXJnZXRQYXRoID0gc2libGluZ0luZm8ucGF0aE1hcHBpbmdbc2libGluZ0luZm8ucGF0aE1hcHBpbmcubGVuZ3RoIC0gMV0ubmV3UGF0aDtcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nLnB1c2goeyBvbGRQYXRoOiBsYXN0U2VtYW50aWNNYXBwaW5nLnNlbWFudGljUGF0aCwgbmV3UGF0aDogdGFyZ2V0UGF0aCB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dCwgeyBlZGl0YWJsZSwgcmVjcmVhdGVDb250ZXh0OiB0cnVlLCBmb3JjZUZvY3VzOiB0cnVlIH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgaW4gRWRpdEZsb3cudG9nZ2xlRHJhZnRBY3RpdmUgLSBDYW5ub3QgZmluZCBzaWJsaW5nXCIpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBFZGl0Rmxvdy50b2dnbGVEcmFmdEFjdGl2ZToke29FcnJvcn1gKTtcblx0XHR9XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtzYXAubS5CdXR0b259IG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiAtIEN1cnJlbnRseSB0aGlzIGlzIHBhc3NlZCBhcyBjYW5jZWxCdXR0b24gaW50ZXJuYWxseSAocmVwbGFjZWQgYnkgbVBhcmFtZXRlcnMuY29udHJvbCBpbiB0aGUgSlNEb2MgYmVsb3cpLiBDdXJyZW50bHkgaXQgaXMgYWxzbyBtYW5kYXRvcnkuXG5cdC8vIFBsYW4gLSBUaGlzIHNob3VsZCBub3QgYmUgbWFuZGF0b3J5LiBJZiBub3QgcHJvdmlkZWQsIHdlIHNob3VsZCBoYXZlIGEgZGVmYXVsdCB0aGF0IGNhbiBhY3QgYXMgcmVmZXJlbmNlIGNvbnRyb2wgZm9yIHRoZSBkaXNjYXJkIHBvcG92ZXIgT1Igd2UgY2FuIHNob3cgYSBkaWFsb2cgaW5zdGVhZCBvZiBhIHBvcG92ZXIuXG5cblx0LyoqXG5cdCAqIERpc2NhcmQgdGhlIGVkaXRhYmxlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGVkaXRhYmxlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jb250cm9sIFRoaXMgaXMgdGhlIGNvbnRyb2wgdXNlZCB0byBvcGVuIHRoZSBkaXNjYXJkIHBvcG92ZXJcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiBQUklWQVRFXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIgT3B0aW9uYWwsIHN1cHJlc3NlcyB0aGUgZGlzY2FyZCBwb3BvdmVyIGFuZCBhbGxvd3MgY3VzdG9tIGhhbmRsaW5nXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5za2lwQmFja05hdmlnYXRpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnNraXBCaW5kaW5nVG9WaWV3XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBlZGl0YWJsZSBkb2N1bWVudCBoYXMgYmVlbiBkaXNjYXJkZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgY2FuY2VsRG9jdW1lbnQoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0bVBhcmFtZXRlcnM6IHtcblx0XHRcdGNvbnRyb2w/OiBCdXR0b247XG5cdFx0XHRjYW5jZWxCdXR0b24/OiBCdXR0b247XG5cdFx0XHRza2lwRGlzY2FyZFBvcG92ZXI/OiBib29sZWFuO1xuXHRcdFx0c2tpcEJhY2tOYXZpZ2F0aW9uPzogYm9vbGVhbjtcblx0XHRcdHNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbjtcblx0XHR9XG5cdCk6IFByb21pc2U8Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXG5cdFx0bGV0IHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cdFx0bGV0IGlzTmV3RG9jdW1lbnQgPSBmYWxzZTtcblx0XHRjb25zdCBjYW5jZWxQYXJhbWV0ZXJzOiBDYW5jZWxQYXJhbWV0ZXJzID0ge1xuXHRcdFx0c2tpcERpc2NhcmRQb3BvdmVyOiBtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIgPT09IHRydWUsXG5cdFx0XHRjYW5jZWxCdXR0b246IChtUGFyYW1ldGVycy5jb250cm9sIHx8IG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbikhLFxuXHRcdFx0YmVmb3JlQ2FuY2VsQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURpc2NhcmRcblx0XHR9O1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRcdGlmICgoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5IHx8IG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpKSAmJiB0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cblx0XHRcdFx0Ly8gTm8gbmVlZCB0byB0cnkgdG8gZ2V0IHJpZ2h0bW9zdCBjb250ZXh0IGluIGNhc2Ugb2YgYSBuZXcgb2JqZWN0XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHQob1Jvb3RWaWV3Q29udHJvbGxlciBhcyBGY2xDb250cm9sbGVyKS5nZXRSaWdodG1vc3RDb250ZXh0KCksXG5cdFx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjYW5jZWxSZXN1bHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5jYW5jZWxEb2N1bWVudChcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdGNhbmNlbFBhcmFtZXRlcnMsXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHR0aGlzLmdldENyZWF0aW9uTW9kZSgpLFxuXHRcdFx0XHR0aGlzLmlzRG9jdW1lbnRNb2RpZmllZCgpXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKClcblx0XHRcdFx0LmdldEluc3RhbmNlZFZpZXdzKClcblx0XHRcdFx0LmZvckVhY2goKHZpZXcpID0+IHtcblx0XHRcdFx0XHRjb25zdCBjb250ZXh0ID0gdmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0O1xuXHRcdFx0XHRcdGlmIChjb250ZXh0ICYmIGNvbnRleHQuaXNLZWVwQWxpdmUoKSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dC5zZXRLZWVwQWxpdmUoZmFsc2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsKTtcblxuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQoZmFsc2UpO1xuXHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyRGlzY2FyZCh7XG5cdFx0XHRcdGNvbnRleHQ6IHR5cGVvZiBjYW5jZWxSZXN1bHQgPT09IFwiYm9vbGVhblwiIHx8IGNhbmNlbFJlc3VsdCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGNhbmNlbFJlc3VsdFxuXHRcdFx0fSk7XG5cdFx0XHQvLyB3ZSBmb3JjZSB0aGUgZWRpdCBzdGF0ZSBldmVuIGZvciBGQ0wgYmVjYXVzZSB0aGUgZHJhZnQgZGlzY2FyZCBtaWdodCBub3QgYmUgaW1wbGVtZW50ZWRcblx0XHRcdC8vIGFuZCB3ZSBtYXkganVzdCBkZWxldGUgdGhlIGRyYWZ0XG5cdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdGlmICghY2FuY2VsUmVzdWx0KSB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EaXNjYXJkLCBvQ29udGV4dCk7XG5cdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHQvL2luIGNhc2Ugb2YgYSBuZXcgZG9jdW1lbnQsIG5vIGFjdGl2ZUNvbnRleHQgaXMgcmV0dXJuZWQgLS0+IG5hdmlnYXRlIGJhY2suXG5cdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuc2tpcEJhY2tOYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRcdFx0aXNOZXdEb2N1bWVudCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG9BY3RpdmVEb2N1bWVudENvbnRleHQgPSBjYW5jZWxSZXN1bHQ7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EaXNjYXJkLCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZSA9IG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gb0FjdGl2ZURvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0XHQvLyBXZSBuZWVkIHRvIGxvYWQgdGhlIHNlbWFudGljIGtleXMgb2YgdGhlIGFjdGl2ZSBjb250ZXh0LCBhcyB3ZSBuZWVkIHRoZW1cblx0XHRcdFx0XHQvLyBmb3IgdGhlIG5hdmlnYXRpb25cblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9mZXRjaFNlbWFudGljS2V5VmFsdWVzKG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdC8vIFdlIGZvcmNlIHRoZSByZWNyZWF0aW9uIG9mIHRoZSBjb250ZXh0LCBzbyB0aGF0IGl0J3MgY3JlYXRlZCBhbmQgYm91bmQgaW4gdGhlIHNhbWUgbWljcm90YXNrLFxuXHRcdFx0XHRcdC8vIHNvIHRoYXQgYWxsIHByb3BlcnRpZXMgYXJlIGxvYWRlZCB0b2dldGhlciBieSBhdXRvRXhwYW5kU2VsZWN0LCBzbyB0aGF0IHdoZW4gc3dpdGNoaW5nIGJhY2sgdG8gRWRpdCBtb2RlXG5cdFx0XHRcdFx0Ly8gJCRpbmhlcml0RXhwYW5kU2VsZWN0IHRha2VzIGFsbCBsb2FkZWQgcHJvcGVydGllcyBpbnRvIGFjY291bnQgKEJDUCAyMDcwNDYyMjY1KVxuXHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuc2tpcEJpbmRpbmdUb1ZpZXcpIHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIHsgZWRpdGFibGU6IGZhbHNlLCByZWNyZWF0ZUNvbnRleHQ6IHRydWUsIGZvcmNlRm9jdXM6IHRydWUgfSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBBY3RpdmUgY29udGV4dCBpcyByZXR1cm5lZCBpbiBjYXNlIG9mIGNhbmNlbCBvZiBleGlzdGluZyBkb2N1bWVudCwgYW5kIGl0J3MgdGhlIHNhbWUgYXMgdGhlIGVkaXRlZCBjb250ZXh0XG5cdFx0XHRcdFx0Ly8gU28sIHdlIGZvcmNlIHRoZSByZWNyZWF0aW9uIGFzIGl0IG1heSBoYXZlIGJlZW4gZGVzdHJveWVkIHdoZW4gY2FsbGluZyBzZXRLZWVwQWxpdmUoZmFsc2UpIG9uIGFsbCB2aWV3J3MgY29udGV4dHNcblx0XHRcdFx0XHQvLyBlYXJsaWVyIGluIHRoaXMgbWV0aG9kXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgeyBlZGl0YWJsZTogZmFsc2UsIHJlY3JlYXRlQ29udGV4dDogdHJ1ZSwgZm9yY2VGb2N1czogdHJ1ZSB9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdC8vc2hvdyBEcmFmdCBkaXNjYXJkZWQgbWVzc2FnZSB0b2FzdCBvbmx5IGZvciBkcmFmdCBlbmFibGVkIGFwcHNcblx0XHRcdFx0dGhpcy5zaG93RG9jdW1lbnREaXNjYXJkTWVzc2FnZShpc05ld0RvY3VtZW50KTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRpc2NhcmRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBCcmluZ3MgdXAgYSBtZXNzYWdlIHRvYXN0IHdoZW4gYSBkcmFmdCBpcyBkaXNjYXJkZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBpc05ld0RvY3VtZW50IFRoaXMgaXMgYSBCb29sZWFuIGZsYWcgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRvY3VtZW50IGlzIG5ldyBvciBhbHJlYWR5IGV4aXN0cy5cblx0ICovXG5cdHNob3dEb2N1bWVudERpc2NhcmRNZXNzYWdlKGlzTmV3RG9jdW1lbnQ/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IHRoaXMuX2dldFJlc291cmNlTW9kZWwoKTtcblx0XHRjb25zdCBtZXNzYWdlID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRElTQ0FSRF9EUkFGVF9UT0FTVFwiKTtcblx0XHRpZiAoaXNOZXdEb2N1bWVudCA9PSB0cnVlKSB7XG5cdFx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdFx0YXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuYXR0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQoe30sIHRoaXMuc2hvd01lc3NhZ2VXaGVuTm9Db250ZXh0LCB0aGlzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0TWVzc2FnZVRvYXN0LnNob3cobWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFdlIHVzZSB0aGlzIGZ1bmN0aW9uIGluIHNob3dEb2N1bWVudERpc2NhcmRNZXNzYWdlIHdoZW4gbm8gY29udGV4dCBpcyBwYXNzZWQuXG5cdCAqL1xuXHRzaG93TWVzc2FnZVdoZW5Ob0NvbnRleHQoKTogdm9pZCB7XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IHRoaXMuX2dldFJlc291cmNlTW9kZWwoKTtcblx0XHRjb25zdCBtZXNzYWdlID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRElTQ0FSRF9EUkFGVF9UT0FTVFwiKTtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdE1lc3NhZ2VUb2FzdC5zaG93KG1lc3NhZ2UpO1xuXHRcdGFwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmRldGFjaEFmdGVyUm91dGVNYXRjaGVkKHRoaXMuc2hvd01lc3NhZ2VXaGVuTm9Db250ZXh0LCB0aGlzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBjb250ZXh0IGNvcnJlc3BvbmRzIHRvIGEgZHJhZnQgcm9vdC5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gY2hlY2tcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY29udGV4dCBwb2ludHMgdG8gYSBkcmFmdCByb290XG5cdCAqL1xuXHRwcml2YXRlIGlzRHJhZnRSb290KGNvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdHJldHVybiBNb2RlbEhlbHBlci5pc0RyYWZ0Um9vdChnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnRhcmdldEVudGl0eVNldCk7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgTmFtZSBvZiB0aGUgRW50aXR5U2V0IHRvIHdoaWNoIHRoZSBvYmplY3QgYmVsb25nc1xuXG5cdC8qKlxuXHQgKiBEZWxldGVzIHRoZSBkb2N1bWVudC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnRpdGxlIFRpdGxlIG9mIHRoZSBvYmplY3QgYmVpbmcgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5kZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlbGV0ZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSBQUklWQVRFXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBkb2N1bWVudCBoYXMgYmVlbiBkZWxldGVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGRlbGV0ZURvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0LCBtSW5QYXJhbWV0ZXJzPzogeyBlbnRpdHlTZXROYW1lOiBzdHJpbmc7IHRpdGxlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRiZWZvcmVEZWxldGVDYWxsQmFjaz86IEZ1bmN0aW9uO1xuXHRcdFx0cmVxdWVzdFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdGNvbnRyb2xJZD86IHN0cmluZztcblx0XHRcdHBhcmVudENvbnRyb2w/OiBDb250cm9sO1xuXHRcdFx0YkZpbmRBY3RpdmVDb250ZXh0czogYm9vbGVhbjtcblx0XHRcdHNlbGVjdGVkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0XHR0aXRsZT86IHN0cmluZztcblx0XHRcdGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXHRcdH0gPSB7IC4uLm1JblBhcmFtZXRlcnMsIGJGaW5kQWN0aXZlQ29udGV4dHM6IGZhbHNlLCBiZWZvcmVEZWxldGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlIH07XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHR0aGlzLl9pc0ZjbEVuYWJsZWQoKSAmJlxuXHRcdFx0XHR0aGlzLmlzRHJhZnRSb290KG9Db250ZXh0KSAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRJbmRleCgpID09PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0b0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0RyYWZ0RW50aXR5XCIpID09PSB0cnVlXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gRGVsZXRpbmcgYW4gYWN0aXZlIGVudGl0eSB3aGljaCBoYXMgYSBkcmFmdCB0aGF0IGNvdWxkIHBvdGVudGlhbGx5IGJlIGRpc3BsYXllZCBpbiB0aGUgTGlzdFJlcG9ydCAoRkNMIGNhc2UpXG5cdFx0XHRcdC8vIC0tPiBuZWVkIHRvIHJlbW92ZSB0aGUgZHJhZnQgZnJvbSB0aGUgTFIgYW5kIHJlcGxhY2UgaXQgd2l0aCB0aGUgYWN0aXZlIHZlcnNpb24sIHNvIHRoYXQgdGhlIExpc3RCaW5kaW5nIGlzIHByb3Blcmx5IHJlZnJlc2hlZFxuXHRcdFx0XHQvLyBUaGUgY29uZGl0aW9uICdvQ29udGV4dC5nZXRJbmRleCgpID09PSB1bmRlZmluZWQnIG1ha2VzIHN1cmUgdGhlIGFjdGl2ZSB2ZXJzaW9uIGlzbid0IGFscmVhZHkgZGlzcGxheWVkIGluIHRoZSBMUlxuXHRcdFx0XHRtUGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IGFzeW5jIChwYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlKHBhcmFtZXRlcnMpO1xuXG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNvbnN0IG1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRcdFx0XHRcdGNvbnN0IHNpYmxpbmdDb250ZXh0ID0gbW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9TaWJsaW5nRW50aXR5YCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRjb25zdCBkcmFmdFBhdGggPSBhd2FpdCBzaWJsaW5nQ29udGV4dC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgZHJhZnRDb250ZXh0VG9SZW1vdmUgPSBtb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KGRyYWZ0UGF0aCk7XG5cdFx0XHRcdFx0XHRkcmFmdENvbnRleHRUb1JlbW92ZS5yZXBsYWNlV2l0aChvQ29udGV4dCk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcGxhY2luZyB0aGUgZHJhZnQgaW5zdGFuY2UgaW4gdGhlIExSIE9ETEJcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRoaXMuZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXG5cdFx0XHQvLyBTaW5nbGUgb2JqZXQgZGVsZXRpb24gaXMgdHJpZ2dlcmVkIGZyb20gYW4gT1AgaGVhZGVyIGJ1dHRvbiAobm90IGZyb20gYSBsaXN0KVxuXHRcdFx0Ly8gLS0+IE1hcmsgVUkgZGlydHkgYW5kIG5hdmlnYXRlIGJhY2sgdG8gZGlzbWlzcyB0aGUgT1Bcblx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBjb250ZXh0QmluZGluZyA9IG9Db250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRcdFx0Y29uc3QgcGFyZW50TGlzdEJpbmRpbmcgPSBjb250ZXh0QmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKVxuXHRcdFx0XHRcdD8gY29udGV4dEJpbmRpbmdcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblxuXHRcdFx0XHR0aGlzLnJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlKHBhcmVudExpc3RCaW5kaW5nLCBwYXJlbnRMaXN0QmluZGluZz8uZ2V0Q29udGV4dCgpKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRlbGV0ZSwgb0NvbnRleHQpO1xuXG5cdFx0XHQvLyBBZnRlciBkZWxldGUgaXMgc3VjY2Vzc2Z1bGwsIHdlIG5lZWQgdG8gZGV0YWNoIHRoZSBzZXRCYWNrTmF2aWdhdGlvbiBNZXRob2RzXG5cdFx0XHRvQXBwQ29tcG9uZW50Py5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24oKTtcblx0XHRcdGNvbnN0IGlzUmVjb21tZW5kYXRpb25FbmFibGVkID0gdGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5pc1JlY29tbWVuZGF0aW9uRW5hYmxlZCgpO1xuXHRcdFx0Ly8gV2UgY2xlYXIgcmVjb21tZW5kYXRpb24gZGF0YSBhbmQgY29udGV4dHMgZnJvbSBpbnRlcm5hbCBtb2RlbCBmb3IgdGhlIGRlbGV0ZWQgY29udGV4dHNcblx0XHRcdGlmIChpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCkge1xuXHRcdFx0XHR0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLmlnbm9yZVJlY29tbWVuZGF0aW9uRm9yQ29udGV4dHMoW29Db250ZXh0XSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBOb3RpZnkgY29uc3VtZXJzIG9mIHdoaWNoIGNvbnRleHRzIHdlcmUgZGVsZXRlZFxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJEZWxldGUoeyBjb250ZXh0czogW29Db250ZXh0XSB9KTtcblxuXHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRpZiAob0FwcENvbXBvbmVudD8uZ2V0U3RhcnR1cE1vZGUoKSA9PT0gU3RhcnR1cE1vZGUuRGVlcGxpbmspIHtcblx0XHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBhcHAgaGFzIGJlZW4gbGF1bmNoZWQgd2l0aCBzZW1hbnRpYyBrZXlzLCBkZWxldGluZyB0aGUgb2JqZWN0IHdlJ3ZlIGxhbmRlZCBvbiBzaGFsbCBuYXZpZ2F0ZSBiYWNrXG5cdFx0XHRcdFx0Ly8gdG8gdGhlIGFwcCB3ZSBjYW1lIGZyb20gKGV4Y2VwdCBmb3IgRkNMLCB3aGVyZSB3ZSBuYXZpZ2F0ZSB0byBMUiBhcyB1c3VhbClcblx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZXhpdEZyb21BcHAoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBFbHNlIG5hdmlnYXRlIGJhY2sgZnJvbSB0aGUgcGFnZS4gSW4gRkNMLCB0aGlzIGlzIGRvbmUgd2hlbiB0aGUga2VwdC1hbGl2ZSBjb250ZXh0IGlzIGRlc3Ryb3llZCAoY2FsbGJhY2spXG5cdFx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlcygpO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZWxldGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3VibWl0IHRoZSBjdXJyZW50IHNldCBvZiBjaGFuZ2VzIGFuZCBuYXZpZ2F0ZSBiYWNrLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGRvY3VtZW50XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgY2hhbmdlcyBoYXZlIGJlZW4gc2F2ZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgYXBwbHlEb2N1bWVudChvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0aWYgKG9Db250ZXh0LmdldE1vZGVsKCkuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0XHRhd2FpdCB0aGlzLl9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dCk7XG5cdFx0XHRcdC8vd2UgbmVlZCB0byByZXF1ZXN0IGZvciByZWNvbW1lbmRhdGlvbnMgYW5kIHRoZW4gYnJpbmcgdGhlIGRpYWxvZyBoZXJlXG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5jaGVja0lmUmVjb21tZW5kYXRpb25zRXhpc3QoKSkge1xuXHRcdFx0XHRjb25zdCBpc0NvbnRpbnVlID0gYXdhaXQgdGhpcy5zaG93Q29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyhmYWxzZSk7XG5cdFx0XHRcdGlmIChpc0NvbnRpbnVlID09PSBSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uLkNvbnRpbnVlKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblx0XHRcdGF3YWl0IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb25dIEJvb2xlYW4gdmFsdWUgZm9yIHN0YXRpYyBhY3Rpb24sIHVuZGVmaW5lZCBmb3Igb3RoZXIgYWN0aW9uc1xuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5pc05hdmlnYWJsZV0gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgbmF2aWdhdGlvbiBpcyByZXF1aXJlZCBhZnRlciB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkXG5cdC8vIEN1cnJlbnRseSB0aGUgcGFyYW1ldGVyIGlzTmF2aWdhYmxlIGlzIHVzZWQgaW50ZXJuYWxseSBhbmQgc2hvdWxkIGJlIGNoYW5nZWQgdG8gcmVxdWlyZXNOYXZpZ2F0aW9uIGFzIGl0IGlzIGEgbW9yZSBhcHQgbmFtZSBmb3IgdGhpcyBwYXJhbVxuXG5cdC8qKlxuXHQgKiBJbnZva2VzIGFuIGFjdGlvbiAoYm91bmQgb3IgdW5ib3VuZCkgYW5kIHRyYWNrcyB0aGUgY2hhbmdlcyBzbyB0aGF0IG90aGVyIHBhZ2VzIGNhbiBiZSByZWZyZXNoZWQgYW5kIHNob3cgdGhlIHVwZGF0ZWQgZGF0YSB1cG9uIG5hdmlnYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlcyBBIG1hcCBvZiBhY3Rpb24gcGFyYW1ldGVyIG5hbWVzIGFuZCBwcm92aWRlZCB2YWx1ZXNcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyBTa2lwcyB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2cgaWYgdmFsdWVzIGFyZSBwcm92aWRlZCBmb3IgYWxsIG9mIHRoZW0gaW4gcGFyYW1ldGVyVmFsdWVzXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNvbnRleHRzIEZvciBhIGJvdW5kIGFjdGlvbiwgYSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgdG8gYmUgY2FsbGVkIG11c3QgYmUgcHJvdmlkZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMubW9kZWwgRm9yIGFuIHVuYm91bmQgYWN0aW9uLCBhbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbCBtdXN0IGJlIHByb3ZpZGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnJlcXVpcmVzTmF2aWdhdGlvbiBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBuYXZpZ2F0aW9uIGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBhY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWQuIE5hdmlnYXRpb24gdGFrZXMgcGxhY2UgdG8gdGhlIGNvbnRleHQgcmV0dXJuZWQgYnkgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5sYWJlbCBBIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUgYWN0aW9uLiBUaGlzIGlzIG5lZWRlZCBpbiBjYXNlIHRoZSBhY3Rpb24gaGFzIGEgcGFyYW1ldGVyIGFuZCBhIHBhcmFtZXRlciBkaWFsb2cgaXMgc2hvd24gdG8gdGhlIHVzZXIuIFRoZSBsYWJlbCB3aWxsIGJlIHVzZWQgZm9yIHRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nIGFuZCBmb3IgdGhlIGNvbmZpcm1hdGlvbiBidXR0b25cblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nIE1vZGUgaG93IGFjdGlvbnMgYXJlIHRvIGJlIGNhbGxlZDogJ0NoYW5nZVNldCcgdG8gcHV0IGFsbCBhY3Rpb24gY2FsbHMgaW50byBvbmUgY2hhbmdlc2V0LCAnSXNvbGF0ZWQnIHRvIHB1dCB0aGVtIGludG8gc2VwYXJhdGUgY2hhbmdlc2V0c1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5pc05hdmlnYWJsZSBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXAgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jb250cm9sSWQgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuYXBwbGljYWJsZUNvbnRleHRzIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRzIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZW5hYmxlQXV0b1Njcm9sbCBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiBQUklWQVRFXG5cdCAqIEBwYXJhbSBtRXh0cmFQYXJhbXMgUFJJVkFURVxuXHQgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgb25jZSB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLCBwcm92aWRpbmcgdGhlIHJlc3BvbnNlXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKiBAZmluYWxcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBpbnZva2VBY3Rpb24oXG5cdFx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0XHRtSW5QYXJhbWV0ZXJzPzoge1xuXHRcdFx0cGFyYW1ldGVyVmFsdWVzPzogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXTtcblx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0Y29udGV4dHM/OiBDb250ZXh0IHwgQ29udGV4dFtdO1xuXHRcdFx0bW9kZWw/OiBPRGF0YU1vZGVsO1xuXHRcdFx0cmVxdWlyZXNOYXZpZ2F0aW9uPzogYm9vbGVhbjtcblx0XHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdFx0aXNOYXZpZ2FibGU/OiBib29sZWFuO1xuXHRcdFx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0XHRcdGludm9jYXRpb25Hcm91cGluZz86IHN0cmluZztcblx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcD86IHN0cmluZztcblx0XHRcdGNvbnRyb2xJZD86IHN0cmluZztcblx0XHRcdGJTdGF0aWNBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0YXBwbGljYWJsZUNvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0bm90QXBwbGljYWJsZUNvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0ZW5hYmxlQXV0b1Njcm9sbD86IGJvb2xlYW47XG5cdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24/OiBzdHJpbmc7XG5cdFx0fSxcblx0XHRtRXh0cmFQYXJhbXM/OiB7fVxuXHQpOiBQcm9taXNlPHVua25vd24+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRsZXQgYVBhcnRzO1xuXHRcdGxldCBzT3ZlcmxvYWRFbnRpdHlUeXBlO1xuXHRcdGxldCBvQ3VycmVudEFjdGlvbkNhbGxCYWNrczpcblx0XHRcdHwge1xuXHRcdFx0XHRcdGZSZXNvbHZlcjogRnVuY3Rpb247XG5cdFx0XHRcdFx0ZlJlamVjdG9yOiBGdW5jdGlvbjtcblx0XHRcdCAgfVxuXHRcdFx0fCB1bmRlZmluZWQ7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXG5cdFx0Ly8gRHVlIHRvIGEgbWlzdGFrZSB0aGUgaW52b2tlQWN0aW9uIGluIHRoZSBleHRlbnNpb25BUEkgaGFkIGEgZGlmZmVyZW50IEFQSSB0aGFuIHRoaXMgb25lLlxuXHRcdC8vIFRoZSBvbmUgZnJvbSB0aGUgZXh0ZW5zaW9uQVBJIGRvZXNuJ3QgZXhpc3QgYW55bW9yZSBhcyB3ZSBleHBvc2UgdGhlIGZ1bGwgZWRpdCBmbG93IG5vdyBidXRcblx0XHQvLyBkdWUgdG8gY29tcGF0aWJpbGl0eSByZWFzb25zIHdlIHN0aWxsIG5lZWQgdG8gc3VwcG9ydCB0aGUgb2xkIHNpZ25hdHVyZVxuXHRcdGlmIChcblx0XHRcdCgobUluUGFyYW1ldGVycyBhcyBDb250ZXh0KT8uaXNBICYmIChtSW5QYXJhbWV0ZXJzIGFzIENvbnRleHQpPy5pc0E8Q29udGV4dD4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiKSkgfHxcblx0XHRcdEFycmF5LmlzQXJyYXkobUluUGFyYW1ldGVycykgfHxcblx0XHRcdG1FeHRyYVBhcmFtcyAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBjb250ZXh0czogT0RhdGFWNENvbnRleHQgfCBPRGF0YVY0Q29udGV4dFtdIHwgdW5kZWZpbmVkID0gbUluUGFyYW1ldGVycyBhcyBPRGF0YVY0Q29udGV4dCB8IE9EYXRhVjRDb250ZXh0W10gfCB1bmRlZmluZWQ7XG5cdFx0XHRtSW5QYXJhbWV0ZXJzID0gbUV4dHJhUGFyYW1zIHx8IHt9O1xuXHRcdFx0aWYgKGNvbnRleHRzKSB7XG5cdFx0XHRcdG1JblBhcmFtZXRlcnMuY29udGV4dHMgPSBjb250ZXh0cztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1JblBhcmFtZXRlcnMubW9kZWwgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgbVBhcmFtZXRlcnM6IHtcblx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzPzogQmluZENvbnRleHRQYXJhbWV0ZXJzO1xuXHRcdFx0YlN0YXRpY0FjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRwYXJhbWV0ZXJWYWx1ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xuXHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdFx0YkdldEJvdW5kQ29udGV4dD86IGJvb2xlYW47XG5cdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc/OiBzdHJpbmc7XG5cdFx0XHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRcdFx0Y29udGV4dHM/OiBPRGF0YVY0Q29udGV4dCB8IE9EYXRhVjRDb250ZXh0W10gfCBudWxsO1xuXHRcdFx0bW9kZWw/OiBPRGF0YU1vZGVsO1xuXHRcdFx0cGFyZW50Q29udHJvbDogRkVWaWV3O1xuXHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0aXNOYXZpZ2FibGU/OiBib29sZWFuO1xuXHRcdFx0YXBwbGljYWJsZUNvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0cmVxdWlyZXNOYXZpZ2F0aW9uPzogYm9vbGVhbjtcblx0XHRcdGJPYmplY3RQYWdlPzogYm9vbGVhbjtcblx0XHRcdGJJc0NyZWF0ZUFjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA/OiBzdHJpbmc7XG5cdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHRcdGdyb3VwSWQ/OiBzdHJpbmc7XG5cdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24/OiBzdHJpbmc7XG5cdFx0XHRlbmFibGVBdXRvU2Nyb2xsPzogYm9vbGVhbjtcblx0XHRcdGlzQm91bmQ/OiBib29sZWFuO1xuXHRcdFx0aWdub3JlRVRhZz86IGJvb2xlYW47XG5cdFx0fSA9IHsgLi4ubUluUGFyYW1ldGVycywgcGFyZW50Q29udHJvbDogdGhpcy5iYXNlLmdldFZpZXcoKSB9IHx8IHsgcGFyZW50Q29udHJvbDogdGhpcy5iYXNlLmdldFZpZXcoKSB9O1xuXG5cdFx0bVBhcmFtZXRlcnMuaXNOYXZpZ2FibGUgPSBtUGFyYW1ldGVycy5yZXF1aXJlc05hdmlnYXRpb24gfHwgbVBhcmFtZXRlcnMuaXNOYXZpZ2FibGU7XG5cblx0XHQvLyBEZXRlcm1pbmUgaWYgdGhlIHJlZmVyZW5jZWQgYWN0aW9uIGlzIGJvdW5kIG9yIHVuYm91bmRcblx0XHRjb25zdCBjb252ZXJ0ZWRNZXRhZGF0YSA9IGNvbnZlcnRUeXBlcyh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCk7XG5cdFx0Ly8gVGhlIEVudGl0eUNvbnRhaW5lciBtYXkgTk9UIGJlIG1pc3NpbmcsIHNvIGl0IHNob3VsZCBub3QgYmUgYWJsZSB0byBiZSB1bmRlZmluZWQsIGJ1dCBzaW5jZSBpbiBvdXIgY29udmVydGVkIE1ldGFkYXRhXG5cdFx0Ly8gaXQgY2FuIGJlIHVuZGVmaW5lZCwgSSBuZWVkIHRoaXMgd29ya2Fyb3VuZCBoZXJlIG9mIGFkZGluZyBcIlwiIHNpbmNlIGluZGV4T2YgZG9lcyBub3QgYWNjZXB0IHNvbWV0aGluZyB0aGF0J3Ncblx0XHQvLyB1bmRlZmluZWQuXG5cdFx0aWYgKHNBY3Rpb25OYW1lLmluY2x1ZGVzKFwiXCIgKyBjb252ZXJ0ZWRNZXRhZGF0YS5lbnRpdHlDb250YWluZXIubmFtZSkpIHtcblx0XHRcdC8vIFVuYm91bmQgYWN0aW9ucyBhcmUgYWx3YXlzIHJlZmVyZW5jZWQgdmlhIHRoZSBhY3Rpb24gaW1wb3J0IGFuZCB3ZSBmb3VuZCB0aGUgRW50aXR5Q29udGFpbmVyIGluIHRoZSBzQWN0aW9uTmFtZSBzb1xuXHRcdFx0Ly8gYW4gdW5ib3VuZCBhY3Rpb24gaXMgcmVmZXJlbmNlZCFcblx0XHRcdG1QYXJhbWV0ZXJzLmlzQm91bmQgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTm8gZW50aXR5IGNvbnRhaW5lciBpbiB0aGUgc0FjdGlvbk5hbWUsIHNvIGVpdGhlciBhIGJvdW5kIG9yIHN0YXRpYyBhY3Rpb24gaXMgcmVmZXJlbmNlZCB3aGljaCBpcyBhbHNvIGJvdW5kIVxuXHRcdFx0bVBhcmFtZXRlcnMuaXNCb3VuZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCFtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lICYmIG1QYXJhbWV0ZXJzLmNvbnRleHRzICYmIG1QYXJhbWV0ZXJzLm1vZGVsKSB7XG5cdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lID0gbVBhcmFtZXRlcnMubW9kZWxcblx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdC5nZXRNZXRhQ29udGV4dCgobVBhcmFtZXRlcnMuY29udGV4dHMgYXMgQ29udGV4dCkuZ2V0UGF0aCgpKVxuXHRcdFx0XHQuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIik7XG5cdFx0fVxuXHRcdGxldCBvQ29udHJvbDogQ29udHJvbCB8IHVuZGVmaW5lZDtcblx0XHRpZiAobVBhcmFtZXRlcnMuY29udHJvbElkKSB7XG5cdFx0XHRvQ29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKSBhcyBDb250cm9sO1xuXHRcdFx0aWYgKG9Db250cm9sKSB7XG5cdFx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSB0aGlzIHNlbGVjdGVkIGNvbnRleHRzIHVwZGF0ZSBpcyBkb25lIHdpdGhpbiB0aGUgb3BlcmF0aW9uLCBzaG91bGQgYmUgbW92ZWQgb3V0XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb0NvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0fVxuXG5cdFx0Ly8gaWYgc3RpY2t5IHNlc3Npb24gaXMgZW5hYmxlZCB3ZSB0cmlnZ2VyIGFjdGlvbnMgd2l0aG91dCBlVGFnXG5cdFx0bVBhcmFtZXRlcnMuaWdub3JlRVRhZyA9IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0Py5nZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIik7XG5cblx0XHRpZiAoc0FjdGlvbk5hbWUgJiYgc0FjdGlvbk5hbWUuaW5jbHVkZXMoXCIoXCIpKSB7XG5cdFx0XHQvLyBnZXQgZW50aXR5IHR5cGUgb2YgYWN0aW9uIG92ZXJsb2FkIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgYWN0aW9uIHBhdGhcblx0XHRcdC8vIEV4YW1wbGUgc0FjdGlvbk5hbWUgPSBcIjxBY3Rpb25OYW1lPihDb2xsZWN0aW9uKDxPdmVybG9hZEVudGl0eVR5cGU+KSlcIlxuXHRcdFx0Ly8gc0FjdGlvbk5hbWUgPSBhUGFydHNbMF0gLS0+IDxBY3Rpb25OYW1lPlxuXHRcdFx0Ly8gc092ZXJsb2FkRW50aXR5VHlwZSA9IGFQYXJ0c1syXSAtLT4gPE92ZXJsb2FkRW50aXR5VHlwZT5cblx0XHRcdGFQYXJ0cyA9IHNBY3Rpb25OYW1lLnNwbGl0KFwiKFwiKTtcblx0XHRcdHNBY3Rpb25OYW1lID0gYVBhcnRzWzBdO1xuXHRcdFx0c092ZXJsb2FkRW50aXR5VHlwZSA9IGFQYXJ0c1thUGFydHMubGVuZ3RoIC0gMV0ucmVwbGFjZUFsbChcIilcIiwgXCJcIik7XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb24gJiYgb0NvbnRyb2wpIHtcblx0XHRcdGlmIChvQ29udHJvbC5pc0EgJiYgb0NvbnRyb2wuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikgJiYgb0NvbnRyb2wuaXNUYWJsZUJvdW5kKCkpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSAoXG5cdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKT8uYmluZExpc3Qob0NvbnRyb2wuZ2V0Um93QmluZGluZygpLmdldEhlYWRlckNvbnRleHQoKSEuZ2V0UGF0aCgpKSBhcyBPRGF0YUxpc3RCaW5kaW5nXG5cdFx0XHRcdCkuZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgc0JpbmRpbmdQYXRoID0gb0NvbnRyb2wuZGF0YShcInJvd3NCaW5kaW5nSW5mb1wiKS5wYXRoLFxuXHRcdFx0XHRcdG9MaXN0QmluZGluZyA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoKS5iaW5kTGlzdChzQmluZGluZ1BhdGgpO1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IG9MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzT3ZlcmxvYWRFbnRpdHlUeXBlICYmIG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KCkgJiYgb0NvbnRyb2wuaXNBICYmIG9Db250cm9sLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gdGhpcy5fZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbU1ldGFkYXRhUGF0aChcblx0XHRcdFx0XHRvQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0LFxuXHRcdFx0XHRcdG9Db250cm9sLmdldFJvd0JpbmRpbmcoKSxcblx0XHRcdFx0XHRzT3ZlcmxvYWRFbnRpdHlUeXBlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtUGFyYW1ldGVycy5lbmFibGVBdXRvU2Nyb2xsKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzID0gdGhpcy5jcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lLCBvQ29udHJvbC5nZXRJZCgpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0bVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dCA9IHRoaXMuX2dldEJvdW5kQ29udGV4dChvVmlldywgbVBhcmFtZXRlcnMpO1xuXHRcdC8vIE5lZWQgdG8ga25vdyB0aGF0IHRoZSBhY3Rpb24gaXMgY2FsbGVkIGZyb20gT2JqZWN0UGFnZSBmb3IgY2hhbmdlU2V0IElzb2xhdGVkIHdvcmthcm91bmRcblx0XHRtUGFyYW1ldGVycy5iT2JqZWN0UGFnZSA9IG9WaWV3LmdldFZpZXdEYXRhKCkuY29udmVydGVyVHlwZSA9PT0gXCJPYmplY3RQYWdlXCI7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0bGV0IG9SZXNwb25zZSA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmNhbGxBY3Rpb24oXG5cdFx0XHRcdHNBY3Rpb25OYW1lLFxuXHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKVxuXHRcdFx0KTtcblx0XHRcdGxldCBsaXN0UmVmcmVzaGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzICYmIEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpICYmIG1QYXJhbWV0ZXJzLmlzQm91bmQgPT09IHRydWUpIHtcblx0XHRcdFx0bGlzdFJlZnJlc2hlZCA9IGF3YWl0IHRoaXMuX3JlZnJlc2hMaXN0SWZSZXF1aXJlZChcblx0XHRcdFx0XHR0aGlzLmdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWUsIG9SZXNwb25zZSksXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHNbMF1cblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkpIHtcblx0XHRcdFx0bGV0IGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRcdGlmIChvUmVzcG9uc2UpIHtcblx0XHRcdFx0XHRhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzID0gQXJyYXkuaXNBcnJheShvUmVzcG9uc2UpXG5cdFx0XHRcdFx0XHQ/IE9iamVjdC5rZXlzKChvUmVzcG9uc2VbMF0gYXMgUHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD4pLnZhbHVlPy5nZXRPYmplY3QoKSlcblx0XHRcdFx0XHRcdDogT2JqZWN0LmtleXMob1Jlc3BvbnNlLmdldE9iamVjdCgpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQWN0aW9uLCBtUGFyYW1ldGVycy5jb250ZXh0cywgc0FjdGlvbk5hbWUsIGxpc3RSZWZyZXNoZWQsIGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXMpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoc0FjdGlvbk5hbWUsIFRyaWdnZXJUeXBlLmFjdGlvbik7XG5cblx0XHRcdGlmIChvQ3VycmVudEFjdGlvbkNhbGxCYWNrcykge1xuXHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcy5mUmVzb2x2ZXIob1Jlc3BvbnNlKTtcblx0XHRcdH1cblx0XHRcdC8qXG5cdFx0XHRcdFx0V2Ugc2V0IHRoZSAodXBwZXIpIHBhZ2VzIHRvIGRpcnR5IGFmdGVyIGFuIGV4ZWN1dGlvbiBvZiBhbiBhY3Rpb25cblx0XHRcdFx0XHRUT0RPOiBnZXQgcmlkIG9mIHRoaXMgd29ya2Fyb3VuZFxuXHRcdFx0XHRcdFRoaXMgd29ya2Fyb3VuZCBpcyBvbmx5IG5lZWRlZCBhcyBsb25nIGFzIHRoZSBtb2RlbCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzeW5jaHJvbml6YXRpb24uXG5cdFx0XHRcdFx0T25jZSB0aGlzIGlzIHN1cHBvcnRlZCB3ZSBkb24ndCBuZWVkIHRvIHNldCB0aGUgcGFnZXMgdG8gZGlydHkgYW55bW9yZSBhcyB0aGUgY29udGV4dCBpdHNlbGZcblx0XHRcdFx0XHRpcyBhbHJlYWR5IHJlZnJlc2hlZCAoaXQncyBqdXN0IG5vdCByZWZsZWN0ZWQgaW4gdGhlIG9iamVjdCBwYWdlKVxuXHRcdFx0XHRcdHdlIGV4cGxpY2l0bHkgZG9uJ3QgY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHRoZSBsaXN0IHJlcG9ydCBidXQgb25seSBjYWxsIGl0IGZyb20gdGhlIG9iamVjdCBwYWdlXG5cdFx0XHRcdFx0YXMgaWYgaXQgaXMgY2FsbGVkIGluIHRoZSBsaXN0IHJlcG9ydCBpdCdzIG5vdCBuZWVkZWQgLSBhcyB3ZSBhbnl3YXkgd2lsbCByZW1vdmUgdGhpcyBsb2dpY1xuXHRcdFx0XHRcdHdlIGNhbiBsaXZlIHdpdGggdGhpc1xuXHRcdFx0XHRcdHdlIG5lZWQgYSBjb250ZXh0IHRvIHNldCB0aGUgdXBwZXIgcGFnZXMgdG8gZGlydHkgLSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSB3ZSB1c2UgdGhlXG5cdFx0XHRcdFx0Zmlyc3Qgb25lIGFzIHRoZXkgYXJlIGFueXdheSBzaWJsaW5nc1xuXHRcdFx0XHRcdCovXG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuY29udGV4dHMpIHtcblx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSAmJiB0aGlzLmJhc2UuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkuY29udmVydGVyVHlwZSAhPT0gXCJMaXN0UmVwb3J0XCIpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCBzQWN0aW9uTmFtZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuaXNOYXZpZ2FibGUpIHtcblx0XHRcdFx0bGV0IHZDb250ZXh0ID0gb1Jlc3BvbnNlO1xuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh2Q29udGV4dCkgJiYgdkNvbnRleHQubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0dkNvbnRleHQgPSAodkNvbnRleHRbMF0gYXMgUHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD4pLnZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh2Q29udGV4dCAmJiAhQXJyYXkuaXNBcnJheSh2Q29udGV4dCkpIHtcblx0XHRcdFx0XHRjb25zdCBjb250ZXh0ID0gdkNvbnRleHQ7XG5cdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdFx0Y29uc3Qgc0NvbnRleHRNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdGNvbnN0IF9mblZhbGlkQ29udGV4dHMgPSAoY29udGV4dHM6IENvbnRleHRbXSwgYXBwbGljYWJsZUNvbnRleHRzPzogQ29udGV4dFtdKTogQ29udGV4dFtdID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBjb250ZXh0cy5maWx0ZXIoKGVsZW1lbnQpID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKGFwcGxpY2FibGVDb250ZXh0cykge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBhcHBsaWNhYmxlQ29udGV4dHMuaW5jbHVkZXMoZWxlbWVudCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGNvbnN0IG9BY3Rpb25Db250ZXh0ID0gQXJyYXkuaXNBcnJheShtUGFyYW1ldGVycy5jb250ZXh0cylcblx0XHRcdFx0XHRcdD8gX2ZuVmFsaWRDb250ZXh0cyhtUGFyYW1ldGVycy5jb250ZXh0cywgbVBhcmFtZXRlcnMuYXBwbGljYWJsZUNvbnRleHRzKVswXVxuXHRcdFx0XHRcdFx0OiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHRcdFx0XHRjb25zdCBzQWN0aW9uQ29udGV4dE1ldGFQYXRoID0gb0FjdGlvbkNvbnRleHQgJiYgb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQWN0aW9uQ29udGV4dC5nZXRQYXRoKCkpO1xuXG5cdFx0XHRcdFx0aWYgKHNDb250ZXh0TWV0YVBhdGggIT0gdW5kZWZpbmVkICYmIHNDb250ZXh0TWV0YVBhdGggPT09IHNBY3Rpb25Db250ZXh0TWV0YVBhdGgpIHtcblx0XHRcdFx0XHRcdGlmIChvQWN0aW9uQ29udGV4dD8uZ2V0UGF0aCgpICE9PSBjb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChjb250ZXh0LCB7XG5cdFx0XHRcdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IHRydWVcblx0XHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIGFjdGlvbiByZXR1cm5zIGEgZHJhZnQgY29udGV4dCwgd2UgYWxyZWFkeSB0YWtlIGNhcmUgZHVyaW5nIG5hdmlnYXRpb24gdG8gZWl0aGVyIGNyZWF0ZSBhIG5ld1xuXHRcdFx0XHRcdFx0XHQvLyAoZnVsbCBzY3JlZW4pIG9yIHRvIHVzZSB0aGUgbGlzdCBiaW5kaW5nIGNvbnRleHQgYWZ0ZXIgcmVmcmVzaCAoYW5kIG5vdCB0aGUgcmV0dXJuIHZhbHVlIGNvbnRleHQpLlxuXHRcdFx0XHRcdFx0XHQvLyBJZiB0aGUgZHJhZnQgaXMgZGlzY2FyZGVkIG9yIGFjdGl2YXRlZCwgaGF2aW5nIHRoZSBjb250ZXh0IHN0aWxsIGFzIGRlcGVuZGVudCBjb250ZXh0IGNhdXNlIGlzc3Vlc1xuXHRcdFx0XHRcdFx0XHQvLyAoZS5nLiBpZiBhIHNpZGUgZWZmZWN0IGlzIHRyaWdnZXJlZCkuIFRoZXJlZm9yZSwgd2UgZGVzdHJveSB0aGUgcmV0dXJuIHZhbHVlIGNvbnRleHQgaGVyZSxcblx0XHRcdFx0XHRcdFx0Ly8gYW5kIHRvIGJlIGNvbXBhdGlibGUgd2UgcmV0dXJuIGEgbmV3IGNvbnRleHQgd2l0aCB0aGUgc2FtZSBwYXRoLlxuXHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmXG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSBmYWxzZVxuXHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCByZXR1cm5Db250ZXh0ID0gY29udGV4dC5nZXRNb2RlbCgpLmJpbmRDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShvUmVzcG9uc2UpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQob1Jlc3BvbnNlWzBdIGFzIFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQ+KS52YWx1ZSA9IHJldHVybkNvbnRleHQ7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9SZXNwb25zZSA9IHJldHVybkNvbnRleHQ7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHQuZ2V0QmluZGluZygpLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0TG9nLmluZm8oXCJOYXZpZ2F0aW9uIHRvIHRoZSBzYW1lIGNvbnRleHQgaXMgbm90IGFsbG93ZWRcIik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckFjdGlvbkV4ZWN1dGlvbihzQWN0aW9uTmFtZSk7XG5cdFx0XHRyZXR1cm4gb1Jlc3BvbnNlO1xuXHRcdH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuXHRcdFx0aWYgKG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzLmZSZWplY3RvcigpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZXJyUHJvbWlzZSA9IGVyciBhcyB7IGNhbmNlbGVkPzogYm9vbGVhbjsgcmVqZWN0ZWRJdGVtcz86IHsgY2FuY2VsZWQ6IGJvb2xlYW4gfVtdIH07XG5cdFx0XHQvLyBGSVhNRTogaW4gbW9zdCBzaXR1YXRpb25zIHRoZXJlIGlzIG5vIGhhbmRsZXIgZm9yIHRoZSByZWplY3RlZCBwcm9taXNlcyByZXR1cm5lZHFcblx0XHRcdGlmIChlcnIgPT09IENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpIHtcblx0XHRcdFx0Ly8gVGhpcyBsZWFkcyB0byBjb25zb2xlIGVycm9yLiBBY3R1YWxseSB0aGUgZXJyb3IgaXMgYWxyZWFkeSBoYW5kbGVkIChjdXJyZW50bHkgZGlyZWN0bHkgaW4gcHJlc3MgaGFuZGxlciBvZiBlbmQgYnV0dG9uIGluIGRpYWxvZyksIHNvIGl0IHNob3VsZCBub3QgYmUgZm9yd2FyZGVkXG5cdFx0XHRcdC8vIHVwIHRvIGhlcmUuIEhvd2V2ZXIsIHdoZW4gZGlhbG9nIGhhbmRsaW5nIGFuZCBiYWNrZW5kIGV4ZWN1dGlvbiBhcmUgc2VwYXJhdGVkLCBpbmZvcm1hdGlvbiB3aGV0aGVyIGRpYWxvZyB3YXMgY2FuY2VsbGVkLCBvciBiYWNrZW5kIGV4ZWN1dGlvbiBoYXMgZmFpbGVkIG5lZWRzXG5cdFx0XHRcdC8vIHRvIGJlIHRyYW5zcG9ydGVkIHRvIHRoZSBwbGFjZSByZXNwb25zaWJsZSBmb3IgY29ubmVjdGluZyB0aGVzZSB0d28gdGhpbmdzLlxuXHRcdFx0XHQvLyBUT0RPOiByZW1vdmUgc3BlY2lhbCBoYW5kbGluZyBvbmUgZGlhbG9nIGhhbmRsaW5nIGFuZCBiYWNrZW5kIGV4ZWN1dGlvbiBhcmUgc2VwYXJhdGVkXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkRpYWxvZyBjYW5jZWxsZWRcIik7XG5cdFx0XHR9IGVsc2UgaWYgKCEoZXJyICYmIChlcnJQcm9taXNlLmNhbmNlbGVkIHx8IChlcnJQcm9taXNlLnJlamVjdGVkSXRlbXMgJiYgZXJyUHJvbWlzZS5yZWplY3RlZEl0ZW1zWzBdLmNhbmNlbGVkKSkpKSB7XG5cdFx0XHRcdC8vIFRPRE86IGFuYWx5emUsIHdoZXRoZXIgdGhpcyBpcyBvZiB0aGUgc2FtZSBjYXRlZ29yeSBhcyBhYm92ZVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIEVkaXRGbG93Lmludm9rZUFjdGlvbjoke2Vycn1gKTtcblx0XHRcdH1cblx0XHRcdC8vIFRPRE86IEFueSB1bmV4cGVjdGVkIGVycm9ycyBwcm9iYWJseSBzaG91bGQgbm90IGJlIGlnbm9yZWQhXG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhvb2sgd2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gYWZ0ZXIgdGhlIGFjdGlvbiBleGVjdXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBfYWN0aW9uTmFtZSBOYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHNpbmNlIDEuMTE0LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25BZnRlckFjdGlvbkV4ZWN1dGlvbihfYWN0aW9uTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly90byBiZSBvdmVycmlkZGVuXG5cdH1cblxuXHQvKipcblx0ICogU2VjdXJlZCBleGVjdXRpb24gb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLiBFbnN1cmVzIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgd2hlbiBjZXJ0YWluIGNvbmRpdGlvbnMgYXJlIGZ1bGZpbGxlZC5cblx0ICpcblx0ICogQHBhcmFtIGZuRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkLiBTaG91bGQgcmV0dXJuIGEgcHJvbWlzZSB0aGF0IGlzIHNldHRsZWQgYWZ0ZXIgY29tcGxldGlvbiBvZiB0aGUgZXhlY3V0aW9uLiBJZiBub3RoaW5nIGlzIHJldHVybmVkLCBpbW1lZGlhdGUgY29tcGxldGlvbiBpcyBhc3N1bWVkLlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgRGVmaW5pdGlvbnMgb2YgdGhlIHByZWNvbmRpdGlvbnMgdG8gYmUgY2hlY2tlZCBiZWZvcmUgZXhlY3V0aW9uXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5idXN5IERlZmluZXMgdGhlIGJ1c3kgaW5kaWNhdG9yXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5idXN5LnNldCBUcmlnZ2VycyBhIGJ1c3kgaW5kaWNhdG9yIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeS5jaGVjayBFeGVjdXRlcyBmdW5jdGlvbiBvbmx5IGlmIGFwcGxpY2F0aW9uIGlzbid0IGJ1c3kuXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy51cGRhdGVzRG9jdW1lbnQgVGhpcyBvcGVyYXRpb24gdXBkYXRlcyB0aGUgY3VycmVudCBkb2N1bWVudCB3aXRob3V0IHVzaW5nIHRoZSBib3VuZCBtb2RlbCBhbmQgY29udGV4dC4gQXMgYSByZXN1bHQsIHRoZSBkcmFmdCBzdGF0dXMgaXMgdXBkYXRlZCBpZiBhIGRyYWZ0IGRvY3VtZW50IGV4aXN0cywgYW5kIHRoZSB1c2VyIGhhcyB0byBjb25maXJtIHRoZSBjYW5jZWxsYXRpb24gb2YgdGhlIGVkaXRpbmcgcHJvY2Vzcy5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgaXMgcmVqZWN0ZWQgaWYgdGhlIGV4ZWN1dGlvbiBpcyBwcm9oaWJpdGVkIGFuZCByZXNvbHZlZCBieSB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSB0aGUgZm5GdW5jdGlvbi5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgc2VjdXJlZEV4ZWN1dGlvbihcblx0XHRmbkZ1bmN0aW9uOiBGdW5jdGlvbixcblx0XHRtUGFyYW1ldGVycz86IHtcblx0XHRcdGJ1c3k/OiB7XG5cdFx0XHRcdHNldD86IGJvb2xlYW47XG5cdFx0XHRcdGNoZWNrPzogYm9vbGVhbjtcblx0XHRcdH07XG5cdFx0XHR1cGRhdGVzRG9jdW1lbnQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYkJ1c3lTZXQgPSBtUGFyYW1ldGVycz8uYnVzeT8uc2V0ID8/IHRydWUsXG5cdFx0XHRiQnVzeUNoZWNrID0gbVBhcmFtZXRlcnM/LmJ1c3k/LmNoZWNrID8/IHRydWUsXG5cdFx0XHRiVXBkYXRlc0RvY3VtZW50ID0gbVBhcmFtZXRlcnM/LnVwZGF0ZXNEb2N1bWVudCA/PyBmYWxzZSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCksXG5cdFx0XHRvQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCBhcyBDb250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdGlmIChiQnVzeUNoZWNrICYmIEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJBcHBsaWNhdGlvbiBhbHJlYWR5IGJ1c3kgdGhlcmVmb3JlIGV4ZWN1dGlvbiByZWplY3RlZFwiKTtcblx0XHR9XG5cblx0XHQvLyB3ZSBoYXZlIHRvIHNldCBidXN5IGFuZCBkcmFmdCBpbmRpY2F0b3IgaW1tZWRpYXRlbHkgYWxzbyB0aGUgZnVuY3Rpb24gbWlnaHQgYmUgZXhlY3V0ZWQgbGF0ZXIgaW4gcXVldWVcblx0XHRpZiAoYkJ1c3lTZXQpIHtcblx0XHRcdEJ1c3lMb2NrZXIubG9jayhvTG9ja09iamVjdCk7XG5cdFx0fVxuXHRcdGlmIChiVXBkYXRlc0RvY3VtZW50ICYmIGJJc0RyYWZ0KSB7XG5cdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soZm5GdW5jdGlvbiBhcyAoKSA9PiB1bmtub3duIHwgUHJvbWlzZTx1bmtub3duPilcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChiSXNEcmFmdCkge1xuXHRcdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKG9FcnJvcjogdW5rbm93bik6IHZvaWQgPT4ge1xuXHRcdFx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCAmJiBiSXNEcmFmdCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRocm93IG9FcnJvcjtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdGlmIChiQnVzeVNldCkge1xuXHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIHBhdGNoU2VudCBldmVudDogcmVnaXN0ZXIgZG9jdW1lbnQgbW9kaWZpY2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0V2ZW50IFRoZSBldmVudCBzZW50IGJ5IHRoZSBiaW5kaW5nXG5cdCAqL1xuXHRoYW5kbGVQYXRjaFNlbnQob0V2ZW50OiBPRGF0YUNvbnRleHRCaW5kaW5nJFBhdGNoU2VudEV2ZW50KTogdm9pZCB7XG5cdFx0Ly8gSW4gY29sbGFib3JhdGl2ZSBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiwgZGlzYWJsZSBFVGFnIGNoZWNrIGZvciBQQVRDSCByZXF1ZXN0c1xuXHRcdGNvbnN0IGludGVybmFsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdGNvbnN0IGlnbm9yZUVUYWcgPSB0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkgfHwgaW50ZXJuYWxDb250ZXh0LmdldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiKTtcblxuXHRcdGlmIChpZ25vcmVFVGFnKSB7XG5cdFx0XHQoKG9FdmVudC5nZXRTb3VyY2UoKSBhcyBCaW5kaW5nKS5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLnNldElnbm9yZUVUYWcodHJ1ZSk7XG5cdFx0fVxuXHRcdGlmICghaW50ZXJuYWxDb250ZXh0Py5nZXRQcm9wZXJ0eShcInNraXBQYXRjaEhhbmRsZXJzXCIpKSB7XG5cdFx0XHRjb25zdCBzb3VyY2VCaW5kaW5nID0gb0V2ZW50LmdldFNvdXJjZSgpIGFzIHVua25vd24gYXMgT0RhdGFMaXN0QmluZGluZzsgLy8gRklYTUU6IFVJNSB0eXBlIHNheXMgdGhpcyBzaG91bGQgYmUgYW4gT0RhdGFDb250ZXh0QmluZGluZ1xuXHRcdFx0Ly8gQ3JlYXRlIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiB0aGUgcGF0aCBpcyBjb21wbGV0ZWRcblx0XHRcdGNvbnN0IG9QYXRjaFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdG9FdmVudC5nZXRTb3VyY2UoKS5hdHRhY2hFdmVudE9uY2UoXCJwYXRjaENvbXBsZXRlZFwiLCAocGF0Y2hDb21wbGV0ZWRFdmVudDogVUk1RXZlbnQ8eyBzdWNjZXNzOiBib29sZWFuIH0+KSA9PiB7XG5cdFx0XHRcdFx0Ly8gUmUtZW5hYmxlIEVUYWcgY2hlY2tzXG5cdFx0XHRcdFx0aWYgKGlnbm9yZUVUYWcpIHtcblx0XHRcdFx0XHRcdCgob0V2ZW50LmdldFNvdXJjZSgpIGFzIEJpbmRpbmcpLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuc2V0SWdub3JlRVRhZyhmYWxzZSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG9FdmVudC5nZXRTb3VyY2UoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRcdFx0QWN0aW9uUnVudGltZS5zZXRBY3Rpb25FbmFibGVtZW50QWZ0ZXJQYXRjaChcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdFx0XHRcdHNvdXJjZUJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBiU3VjY2VzcyA9IHBhdGNoQ29tcGxldGVkRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdFx0XHRpZiAoYlN1Y2Nlc3MpIHtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy51cGRhdGVEb2N1bWVudChzb3VyY2VCaW5kaW5nLCBvUGF0Y2hQcm9taXNlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgY3JlYXRlU2VudCBldmVudDogcmVnaXN0ZXIgZG9jdW1lbnQgbW9kaWZpY2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHNlbnQgYnkgdGhlIGJpbmRpbmdcblx0ICovXG5cdGhhbmRsZUNyZWF0ZVNlbnQoZXZlbnQ6IFVJNUV2ZW50PHsgY29udGV4dDogQ29udGV4dCB9Pik6IHZvaWQge1xuXHRcdGNvbnN0IGNvbnRleHQgPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJjb250ZXh0XCIpO1xuXHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoZmFsc2UsIGZhbHNlLCBjb250ZXh0LmdldFBhdGgoKSk7XG5cdH1cblxuXHQvKipcblx0ICogUGVyZm9ybXMgYSB0YXNrIGluIHN5bmMgd2l0aCBvdGhlciB0YXNrcyBjcmVhdGVkIHZpYSB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBSZXR1cm5zIHRoZSBwcm9taXNlIGNoYWluIG9mIHRoZSB0YXNrLlxuXHQgKlxuXHQgKiBAcGFyYW0gW25ld1Rhc2tdIE9wdGlvbmFsLCBhIHByb21pc2Ugb3IgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgc3luY2hyb25vdXNseVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIHRhc2sgaXMgY29tcGxldGVkXG5cdCAqL1xuXHRhc3luYyBzeW5jVGFzazxUPihuZXdUYXNrPzogKCgpID0+IFQpIHwgUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuXHRcdGlmIChuZXdUYXNrKSB7XG5cdFx0XHRpZiAodHlwZW9mIG5ld1Rhc2sgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHR0aGlzLnN5bmNUYXNrcyA9IHRoaXMuc3luY1Rhc2tzLnRoZW4obmV3VGFzaykuY2F0Y2goZnVuY3Rpb24gKGVycjogdW5rbm93bikge1xuXHRcdFx0XHRcdExvZy5kZWJ1ZyhlcnIgYXMgc3RyaW5nKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLnN5bmNUYXNrcyA9IHRoaXMuc3luY1Rhc2tzXG5cdFx0XHRcdFx0LnRoZW4oYXN5bmMgKCkgPT4gbmV3VGFzaylcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0TG9nLmRlYnVnKGVyciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnN5bmNUYXNrcyBhcyBQcm9taXNlPFQ+O1xuXHR9XG5cblx0LyoqXG5cdCAqIERlY2lkZXMgaWYgYSBkb2N1bWVudCBpcyB0byBiZSBzaG93biBpbiBkaXNwbGF5IG9yIGVkaXQgbW9kZS5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIGRpc3BsYXllZCBvciBlZGl0ZWRcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZWRpdCBtb2RlIGlzIGNvbXB1dGVkXG5cdCAqL1xuXG5cdGFzeW5jIGNvbXB1dGVFZGl0TW9kZShjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KTtcblxuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0Y29uc3QgZ2xvYmFsTW9kZWwgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVBlbmRpbmdcIiwgdHJ1ZSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdFx0Y29uc3QgaXNBY3RpdmVFbnRpdHkgPSBhd2FpdCBjb250ZXh0LnJlcXVlc3RPYmplY3QoXCJJc0FjdGl2ZUVudGl0eVwiKTtcblx0XHRcdFx0aWYgKGlzQWN0aXZlRW50aXR5ID09PSBmYWxzZSkge1xuXHRcdFx0XHRcdC8vIGluIGNhc2UgdGhlIGRvY3VtZW50IGlzIGRyYWZ0IHNldCBpdCBpbiBlZGl0IG1vZGVcblx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTtcblx0XHRcdFx0XHRjb25zdCBoYXNBY3RpdmVFbnRpdHkgPSBhd2FpdCBjb250ZXh0LnJlcXVlc3RPYmplY3QoXCJIYXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZSh1bmRlZmluZWQsICFoYXNBY3RpdmVFbnRpdHkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGFjdGl2ZSBkb2N1bWVudCwgc3RheSBvbiBkaXNwbGF5IG1vZGVcblx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRnbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlUGVuZGluZ1wiLCBmYWxzZSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRldGVybWluaW5nIHRoZSBlZGl0TW9kZSBmb3IgZHJhZnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgbGFzdEludm9rZWRBY3Rpb25OYW1lID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuZ2V0UHJvcGVydHkoXCIvbGFzdEludm9rZWRBY3Rpb25cIik7XG5cdFx0XHRpZiAobGFzdEludm9rZWRBY3Rpb25OYW1lICYmIHRoaXMuaXNOZXdBY3Rpb25Gb3JTdGlja3kobGFzdEludm9rZWRBY3Rpb25OYW1lLCBjb250ZXh0KSkge1xuXHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlLCB0cnVlKTtcblx0XHRcdFx0aWYgKCF0aGlzLmdldEFwcENvbXBvbmVudCgpLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuaGFuZGxlU3RpY2t5T24oY29udGV4dCk7XG5cdFx0XHRcdHRoaXMuX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXModGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpLCBjb250ZXh0LmdldE1vZGVsKCkpO1xuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCB1bmRlZmluZWQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFByaXZhdGUgbWV0aG9kc1xuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBJbnRlcm5hbCBtZXRob2QgdG8gZGVsZXRlIGEgY29udGV4dCBvciBhbiBhcnJheSBvZiBjb250ZXh0cy5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHRzIFRoZSBjb250ZXh0KHMpIHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgUGFyYW1ldGVycyBmb3IgZGVsZXRpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2tcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNvbnRyb2xJZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250cm9sXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5ub0RpYWxvZ1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy50aXRsZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kZXNjcmlwdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy51blNhdmVkQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMubG9ja2VkQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24oXG5cdFx0Y29udGV4dHM6IENvbnRleHQgfCBDb250ZXh0W10sXG5cdFx0cGFyYW1ldGVyczoge1xuXHRcdFx0YmVmb3JlRGVsZXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0XHRcdHJlcXVlc3RTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRwYXJlbnRDb250cm9sPzogQ29udHJvbDtcblx0XHRcdGJGaW5kQWN0aXZlQ29udGV4dHM/OiBib29sZWFuO1xuXHRcdFx0bm9EaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdFx0dGl0bGU/OiBzdHJpbmc7XG5cdFx0XHRkZXNjcmlwdGlvbj86IHN0cmluZyB8IHsgcGF0aDogc3RyaW5nIH07XG5cdFx0XHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRcdFx0bnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzPzogbnVtYmVyO1xuXHRcdFx0dW5TYXZlZENvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0bG9ja2VkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlPzogRHJhZnRTaWJsaW5nUGFpcltdO1xuXHRcdFx0ZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZT86IENvbnRleHRbXTtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmIChwYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMpIHtcblx0XHRcdC8vIGFzIHNlbGVjdGVkIGNvbnRleHRzIG1heSBpbmNsdWRlIGluYWN0aXZlIGNvbnRleHQgd2UgbmVlZCB0byBjb21wdXRlIHRoaXMgcGFyYW1ldGVyIGFnYWluIHRvIGVuc3VyZSBkZWxldGUgaGVscGVyIHdvcmtzIHByb3Blcmx5XG5cdFx0XHRwYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9IHBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cy5sZW5ndGg7XG5cdFx0fVxuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSB0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCk7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cblx0XHQvLyBUT0RPOiB0aGlzIHNldHRpbmcgYW5kIHJlbW92aW5nIG9mIGNvbnRleHRzIHNob3VsZG4ndCBiZSBpbiB0aGUgdHJhbnNhY3Rpb24gaGVscGVyIGF0IGFsbFxuXHRcdC8vIGZvciB0aGUgdGltZSBiZWluZyBJIGtlcHQgaXQgYW5kIHByb3ZpZGUgdGhlIGludGVybmFsIG1vZGVsIGNvbnRleHQgdG8gbm90IGJyZWFrIHNvbWV0aGluZ1xuXHRcdHBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgPSBwYXJhbWV0ZXJzLmNvbnRyb2xJZFxuXHRcdFx0PyAoRWxlbWVudC5nZXRFbGVtZW50QnlJZChwYXJhbWV0ZXJzLmNvbnRyb2xJZCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQgfCB1bmRlZmluZWQpXG5cdFx0XHQ6IG51bGw7XG5cblx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0YXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuZGVsZXRlRG9jdW1lbnQoY29udGV4dHMsIHBhcmFtZXRlcnMsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksIHJlc291cmNlTW9kZWwsIHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSk7XG5cdH1cblxuXHRfZ2V0UmVzb3VyY2VNb2RlbCgpOiBSZXNvdXJjZU1vZGVsIHtcblx0XHRyZXR1cm4gZ2V0UmVzb3VyY2VNb2RlbCh0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHRwcml2YXRlIGdldFRyYW5zYWN0aW9uSGVscGVyKCk6IHR5cGVvZiBUcmFuc2FjdGlvbkhlbHBlciB7XG5cdFx0cmV0dXJuIFRyYW5zYWN0aW9uSGVscGVyO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRNZXNzYWdlSGFuZGxlcigpOiBNZXNzYWdlSGFuZGxlciB7XG5cdFx0aWYgKHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcikge1xuXHRcdFx0cmV0dXJuIHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWRpdCBGbG93IHdvcmtzIG9ubHkgd2l0aCBhIGdpdmVuIG1lc3NhZ2UgaGFuZGxlclwiKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdldEludGVybmFsTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHRwcml2YXRlIGdldEdsb2JhbFVJTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGF0IHRoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgYSBuZXdseSBjcmVhdGVkIG9iamVjdC5cblx0ICpcblx0ICogQHBhcmFtIGJDcmVhdGlvbk1vZGUgVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIG5ld1xuXHQgKi9cblx0cHJpdmF0ZSBzZXRDcmVhdGlvbk1vZGUoYkNyZWF0aW9uTW9kZTogYm9vbGVhbik6IHZvaWQge1xuXHRcdGNvbnN0IHVpTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJ1aVwiKSBhcyBDb250ZXh0O1xuXHRcdHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLnNldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuQ3JlYXRlTW9kZSwgYkNyZWF0aW9uTW9kZSwgdWlNb2RlbENvbnRleHQsIHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgYSBuZXdseSBjcmVhdGVkIG9iamVjdCBvciBub3QuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG9iamVjdCBpcyBuZXdcblx0ICovXG5cdGdldENyZWF0aW9uTW9kZSgpOiBib29sZWFuIHtcblx0XHRjb25zdCB1aU1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwidWlcIikgYXMgQ29udGV4dDtcblx0XHRyZXR1cm4gISF0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5nZXRQcm9wZXJ0eShVaU1vZGVsQ29uc3RhbnRzLkNyZWF0ZU1vZGUsIHVpTW9kZWxDb250ZXh0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCAob3Igb25lIG9mIGl0cyBzdWItb2JqZWN0cykgaGFzIGJlZW4gbW9kaWZpZWQgb3Igbm90LlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWRcblx0ICovXG5cdHByaXZhdGUgaXNEb2N1bWVudE1vZGlmaWVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAhIXRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLmdldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuRG9jdW1lbnRNb2RpZmllZCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGF0IHRoZSBvYmplY3QgYmVpbmcgZWRpdGVkIChvciBvbmUgb2YgaXRzIHN1Yi1vYmplY3RzKSBoYXMgYmVlbiBtb2RpZmllZC5cblx0ICpcblx0ICogQHBhcmFtIG1vZGlmaWVkIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBtb2RpZmllZFxuXHQgKi9cblx0cHJpdmF0ZSBzZXREb2N1bWVudE1vZGlmaWVkKG1vZGlmaWVkOiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuc2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5Eb2N1bWVudE1vZGlmaWVkLCBtb2RpZmllZCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGF0IHRoZSBvYmplY3QgYmVpbmcgZWRpdGVkIGhhcyBiZWVuIG1vZGlmaWVkIGJ5IGNyZWF0aW5nIGEgc3ViLW9iamVjdC5cblx0ICpcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmcgb24gd2hpY2ggdGhlIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRwcml2YXRlIHNldERvY3VtZW50TW9kaWZpZWRPbkNyZWF0ZShsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyk6IHZvaWQge1xuXHRcdC8vIFNldCB0aGUgbW9kaWZpZWQgZmxhZyBvbmx5IG9uIHJlbGF0aXZlIGxpc3RCaW5kaW5ncywgaS5lLiB3aGVuIGNyZWF0aW5nIGEgc3ViLW9iamVjdFxuXHRcdC8vIElmIHRoZSBsaXN0QmluZGluZyBpcyBub3QgcmVsYXRpdmUsIHRoZW4gaXQncyBhIGNyZWF0aW9uIGZyb20gdGhlIExpc3RSZXBvcnQsIGFuZCBieSBkZWZhdWx0IGEgbmV3bHkgY3JlYXRlZCByb290IG9iamVjdCBpc24ndCBjb25zaWRlcmVkIGFzIG1vZGlmaWVkXG5cdFx0aWYgKGxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBjcmVhdGUgZXZlbnQ6IHNob3dzIG1lc3NhZ2VzIGFuZCBpbiBjYXNlIG9mIGEgZHJhZnQsIHVwZGF0ZXMgdGhlIGRyYWZ0IGluZGljYXRvci5cblx0ICpcblx0ICogQHBhcmFtIGJpbmRpbmcgT0RhdGEgbGlzdCBiaW5kaW5nIG9iamVjdFxuXHQgKi9cblx0cHJpdmF0ZSBoYW5kbGVDcmVhdGVFdmVudHMoYmluZGluZzogT0RhdGFMaXN0QmluZGluZyk6IHZvaWQge1xuXHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChiaW5kaW5nKTtcblxuXHRcdGJpbmRpbmcuYXR0YWNoRXZlbnQoXCJjcmVhdGVTZW50XCIsICgpID0+IHtcblx0XHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2aW5nKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRiaW5kaW5nLmF0dGFjaEV2ZW50KFwiY3JlYXRlQ29tcGxldGVkXCIsIChvRXZlbnQ6IFVJNUV2ZW50PHsgc3VjY2VzczogYm9vbGVhbiB9Pik6IHZvaWQgPT4ge1xuXHRcdFx0Y29uc3Qgc3VjY2VzcyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhzdWNjZXNzID8gRHJhZnRTdGF0dXMuU2F2ZWQgOiBEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBkcmFmdCBzdGF0dXMgbWVzc2FnZSAoZGlzcGxheWVkIGF0IHRoZSBib3R0b20gb2YgdGhlIHBhZ2UpLlxuXHQgKlxuXHQgKiBAcGFyYW0gZHJhZnRTdGF0dXMgVGhlIGRyYWZ0IHN0YXR1cyBtZXNzYWdlXG5cdCAqL1xuXHRzZXREcmFmdFN0YXR1cyhkcmFmdFN0YXR1czogc3RyaW5nKTogdm9pZCB7XG5cdFx0KHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikgYXMgSlNPTk1vZGVsKS5zZXRQcm9wZXJ0eShcIi9kcmFmdFN0YXR1c1wiLCBkcmFmdFN0YXR1cywgdW5kZWZpbmVkLCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9ncmFtbWluZyBtb2RlbCBmcm9tIGEgYmluZGluZyBvciBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBzb3VyY2UgVGhlIGJpbmRpbmcgb3IgY29udGV4dFxuXHQgKiBAcmV0dXJucyBUaGUgcHJvZ3JhbW1pbmcgbW9kZWxcblx0ICovXG5cdHByaXZhdGUgZ2V0UHJvZ3JhbW1pbmdNb2RlbChzb3VyY2U6IENvbnRleHQgfCBCaW5kaW5nKTogdHlwZW9mIFByb2dyYW1taW5nTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuZ2V0UHJvZ3JhbW1pbmdNb2RlbChzb3VyY2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGVkaXQgbW9kZS5cblx0ICpcblx0ICogQHBhcmFtIGVkaXRNb2RlIFRoZSBlZGl0IG1vZGVcblx0ICogQHBhcmFtIGlzQ3JlYXRpb24gVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIG5ld2x5IGNyZWF0ZWRcblx0ICovXG5cdHByaXZhdGUgc2V0RWRpdE1vZGUoZWRpdE1vZGU/OiBzdHJpbmcsIGlzQ3JlYXRpb24/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0Ly8gYXQgdGhpcyBwb2ludCBvZiB0aW1lIGl0J3Mgbm90IG1lYW50IHRvIHJlbGVhc2UgdGhlIGVkaXQgZmxvdyBmb3IgZnJlZXN0eWxlIHVzYWdlIHRoZXJlZm9yZSB3ZSBjYW5cblx0XHQvLyByZWx5IG9uIHRoZSBnbG9iYWwgVUkgbW9kZWwgdG8gZXhpc3Rcblx0XHRjb25zdCBnbG9iYWxNb2RlbCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0aWYgKGVkaXRNb2RlKSB7XG5cdFx0XHRnbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIsIGVkaXRNb2RlID09PSBcIkVkaXRhYmxlXCIsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHRpZiAoZWRpdE1vZGUgIT09IFwiRWRpdGFibGVcIikge1xuXHRcdFx0XHR0aGlzLmZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkKGZhbHNlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaXNDcmVhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBTaW5jZSBzZXRDcmVhdGlvbk1vZGUgaXMgcHVibGljIGluIEVkaXRGbG93IGFuZCBjYW4gYmUgb3ZlcnJpZGVuLCBtYWtlIHN1cmUgdG8gY2FsbCBpdCB2aWEgdGhlIGNvbnRyb2xsZXJcblx0XHRcdC8vIHRvIGVuc3VyZSBhbnkgb3ZlcnJpZGVzIGFyZSB0YWtlbiBpbnRvIGFjY291bnRcblx0XHRcdHRoaXMuc2V0Q3JlYXRpb25Nb2RlKGlzQ3JlYXRpb24pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBmbGFnIHRvIGZvcmNlIFNhdmUgb3IgRGlzY2FyZCB3aGVuIGxlYXZpbmcgYSBkcmFmdC5cblx0ICogQHBhcmFtIGZvcmNlZFxuXHQgKi9cblx0cHJpdmF0ZSBmb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZChmb3JjZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9mb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZFwiLCBmb3JjZWQsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHdlIHNob3VsZCBmb3JjZSB0aGUgdXNlciB0byBTYXZlIG9yIERpc2NhcmQgd2hlbiBsZWF2aW5nIGEgZHJhZnQsIG9yIGlmIGtlZXBpbmcgdGhlIGRyYWZ0IGlzIGFsbG93ZWQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRydWUgaWYga2VlcGluZyB0aGUgZHJhZnQgaXMgbm90IGFsbG93ZWRcblx0ICovXG5cdHNoYWxsRm9yY2VEcmFmdFNhdmVPckRpc2NhcmQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLmdldFByb3BlcnR5KFwiL2ZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkXCIpID09PSB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhbiBhY3Rpb24gY29ycmVzcG9uZHMgdG8gYSBjcmVhdGUgYWN0aW9uIGZvciBhIHN0aWNreSBzZXNzaW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gYWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgZm9yIHRoZSBzdGlja3kgc2Vzc2lvblxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBhY3Rpb24gaXMgYSBjcmVhdGUgYWN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGlzTmV3QWN0aW9uRm9yU3RpY2t5KGFjdGlvbk5hbWU6IHN0cmluZywgY29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRjb25zdCBlbnRpdHlTZXQgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnN0YXJ0aW5nRW50aXR5U2V0IGFzIEVudGl0eVNldDtcblx0XHRcdGNvbnN0IHN0aWNreVNlc3Npb24gPSBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZDtcblx0XHRcdGlmIChzdGlja3lTZXNzaW9uPy5OZXdBY3Rpb24gPT09IGFjdGlvbk5hbWUpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc3RpY2t5U2Vzc2lvbj8uQWRkaXRpb25hbE5ld0FjdGlvbnMgJiYgc3RpY2t5U2Vzc2lvbj8uQWRkaXRpb25hbE5ld0FjdGlvbnMuaW5jbHVkZXMoYWN0aW9uTmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0Ly8gVE9ETyBNb3ZlIGFsbCBzdGlja3ktcmVsYXRlZCBiZWxvdyB0byBhIHN0aWNreSBzZXNzaW9uIG1hbmFnZXIgY2xhc3NcblxuXHQvKipcblx0ICogRW5hYmxlcyB0aGUgc3RpY2t5IGVkaXQgc2Vzc2lvbi5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYmVpbmcgZWRpdGVkXG5cdCAqIEByZXR1cm5zIFRydWUgaW4gY2FzZSBvZiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgaGFuZGxlU3RpY2t5T24oY29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKGFwcENvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuZGVmaW5lZCBBcHBDb21wb25lbnQgZm9yIGZ1bmN0aW9uIGhhbmRsZVN0aWNreU9uXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmhhc05hdmlnYXRpb25HdWFyZCgpKSB7XG5cdFx0XHRcdGNvbnN0IGhhc2hUcmFja2VyID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpO1xuXHRcdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cblx0XHRcdFx0Ly8gU2V0IGEgZ3VhcmQgaW4gdGhlIFJvdXRlclByb3h5XG5cdFx0XHRcdC8vIEEgdGltZW91dCBpcyBuZWNlc3NhcnksIGFzIHdpdGggZGVmZXJyZWQgY3JlYXRpb24gdGhlIGhhc2hDaGFuZ2VyIGlzIG5vdCB1cGRhdGVkIHlldCB3aXRoXG5cdFx0XHRcdC8vIHRoZSBuZXcgaGFzaCwgYW5kIHRoZSBndWFyZCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeSBvZiB0aGUgcm91dGVyIHByb3h5XG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnNldE5hdmlnYXRpb25HdWFyZChjb250ZXh0LmdldFBhdGgoKS5zdWJzdHJpbmcoMSkpO1xuXHRcdFx0XHR9LCAwKTtcblxuXHRcdFx0XHQvLyBTZXR0aW5nIGJhY2sgbmF2aWdhdGlvbiBvbiBzaGVsbCBzZXJ2aWNlLCB0byBnZXQgdGhlIGRpY2FyZCBtZXNzYWdlIGJveCBpbiBjYXNlIG9mIHN0aWNreVxuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKHRoaXMub25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbi5iaW5kKHRoaXMsIGNvbnRleHQpKTtcblxuXHRcdFx0XHR0aGlzLmRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uID0gdGhpcy5nZXREaXJ0eVN0YXRlUHJvdmlkZXIoYXBwQ29tcG9uZW50LCBpbnRlcm5hbE1vZGVsLCBoYXNoVHJhY2tlcik7XG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkucmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIodGhpcy5kaXJ0eVN0YXRlUHJvdmlkZXJGdW5jdGlvbik7XG5cblx0XHRcdFx0Ly8gaGFuZGxlIHNlc3Npb24gdGltZW91dFxuXHRcdFx0XHRjb25zdCBpMThuTW9kZWwgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKFwic2FwLmZlLmkxOG5cIik7XG5cdFx0XHRcdHRoaXMuc2Vzc2lvblRpbWVvdXRGdW5jdGlvbiA9IHRoaXMuZ2V0U2Vzc2lvblRpbWVvdXRGdW5jdGlvbihjb250ZXh0LCBpMThuTW9kZWwpO1xuXHRcdFx0XHR0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKCkuYXR0YWNoU2Vzc2lvblRpbWVvdXQodGhpcy5zZXNzaW9uVGltZW91dEZ1bmN0aW9uKTtcblxuXHRcdFx0XHR0aGlzLnN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb25GdW5jdGlvbiA9IHRoaXMuZ2V0Um91dGVNYXRjaGVkRnVuY3Rpb24oY29udGV4dCwgYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuYXR0YWNoUm91dGVNYXRjaGVkKHt9LCB0aGlzLnN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb25GdW5jdGlvbik7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogRGlzYWJsZXMgdGhlIHN0aWNreSBlZGl0IHNlc3Npb24uXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRydWUgaW4gY2FzZSBvZiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgaGFuZGxlU3RpY2t5T2ZmKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChhcHBDb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1bmRlZmluZWQgQXBwQ29tcG9uZW50IGZvciBmdW5jdGlvbiBoYW5kbGVTdGlja3lPZmZcIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkpIHtcblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBleGl0ZWQgZnJvbSB0aGUgYXBwLCBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQgZG9lc24ndCByZXR1cm4gYVxuXHRcdFx0XHQvLyBzYXAuZmUuY29yZS5BcHBDb21wb25lbnQsIGhlbmNlIHRoZSAnaWYnIGFib3ZlXG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmRpc2NhcmROYXZpZ2F0aW9uR3VhcmQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24pIHtcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5kZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKHRoaXMuZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24pO1xuXHRcdFx0XHR0aGlzLmRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBtb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbDtcblx0XHRcdGlmIChtb2RlbCAmJiB0aGlzLnNlc3Npb25UaW1lb3V0RnVuY3Rpb24pIHtcblx0XHRcdFx0bW9kZWwuZGV0YWNoU2Vzc2lvblRpbWVvdXQodGhpcy5zZXNzaW9uVGltZW91dEZ1bmN0aW9uKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuc3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbkZ1bmN0aW9uKSB7XG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmRldGFjaFJvdXRlTWF0Y2hlZCh0aGlzLnN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb25GdW5jdGlvbik7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuc3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbkZ1bmN0aW9uID0gdW5kZWZpbmVkO1xuXG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblxuXHRcdFx0aWYgKGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRfc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsKTogdm9pZCB7XG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCB0cnVlKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc3RpY2t5U2Vzc2lvblRva2VuXCIsIG1vZGVsLmdldEh0dHBIZWFkZXJzKHRydWUpW1wiU0FQLUNvbnRleHRJZFwiXSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSB1c2VkIGFzIGEgRGlydHlTdGF0ZVByb3ZpZGVyIGluIHRoZSBTaGVsbC5cblx0ICpcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAcGFyYW0gaW50ZXJuYWxNb2RlbCBUaGUgbW9kZWwgXCJpbnRlcm5hbFwiXG5cdCAqIEBwYXJhbSBoYXNoVHJhY2tlciBIYXNoIHRyYWNrZXJcblx0ICogQHJldHVybnMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldERpcnR5U3RhdGVQcm92aWRlcihhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgaW50ZXJuYWxNb2RlbDogSlNPTk1vZGVsLCBoYXNoVHJhY2tlcjogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIChuYXZpZ2F0aW9uQ29udGV4dDogeyBpbm5lckFwcFJvdXRlOiBzdHJpbmcgfSk6IGJvb2xlYW4gfCB1bmRlZmluZWQgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKG5hdmlnYXRpb25Db250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMgZm9yIERpcnR5U3RhdGVQcm92aWRlciBmdW5jdGlvblwiKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHRhcmdldEhhc2ggPSBuYXZpZ2F0aW9uQ29udGV4dC5pbm5lckFwcFJvdXRlO1xuXHRcdFx0XHRjb25zdCByb3V0ZXJQcm94eSA9IGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpO1xuXHRcdFx0XHRsZXQgbGNsSGFzaFRyYWNrZXIgPSBcIlwiO1xuXHRcdFx0XHRsZXQgaXNEaXJ0eTogYm9vbGVhbjtcblx0XHRcdFx0Y29uc3QgaXNTZXNzaW9uT24gPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiKTtcblxuXHRcdFx0XHRpZiAoIWlzU2Vzc2lvbk9uKSB7XG5cdFx0XHRcdFx0Ly8gSWYgdGhlIHN0aWNreSBzZXNzaW9uIHdhcyB0ZXJtaW5hdGVkIGJlZm9yZSBoYW5kLlxuXHRcdFx0XHRcdC8vIEV4YW1wbGUgaW4gY2FzZSBvZiBuYXZpZ2F0aW5nIGF3YXkgZnJvbSBhcHBsaWNhdGlvbiB1c2luZyBJQk4uXG5cdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICghcm91dGVyUHJveHkuaXNOYXZpZ2F0aW9uRmluYWxpemVkKCkpIHtcblx0XHRcdFx0XHQvLyBJZiBuYXZpZ2F0aW9uIGlzIGN1cnJlbnRseSBoYXBwZW5pbmcgaW4gUm91dGVyUHJveHksIGl0J3MgYSB0cmFuc2llbnQgc3RhdGVcblx0XHRcdFx0XHQvLyAobm90IGRpcnR5KVxuXHRcdFx0XHRcdGlzRGlydHkgPSBmYWxzZTtcblx0XHRcdFx0XHRsY2xIYXNoVHJhY2tlciA9IHRhcmdldEhhc2g7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaGFzaFRyYWNrZXIgPT09IHRhcmdldEhhc2gpIHtcblx0XHRcdFx0XHQvLyB0aGUgaGFzaCBkaWRuJ3QgY2hhbmdlIHNvIGVpdGhlciB0aGUgdXNlciBhdHRlbXB0cyB0byByZWZyZXNoIG9yIHRvIGxlYXZlIHRoZSBhcHBcblx0XHRcdFx0XHRpc0RpcnR5ID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIGlmIChyb3V0ZXJQcm94eS5jaGVja0hhc2hXaXRoR3VhcmQodGFyZ2V0SGFzaCkgfHwgcm91dGVyUHJveHkuaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlcigpKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIHVzZXIgYXR0ZW1wdHMgdG8gbmF2aWdhdGUgd2l0aGluIHRoZSByb290IG9iamVjdFxuXHRcdFx0XHRcdC8vIG9yIGNyb3NzaW5nIHRoZSBndWFyZCBoYXMgYWxyZWFkeSBiZWVuIGFsbG93ZWQgYnkgdGhlIFJvdXRlclByb3h5XG5cdFx0XHRcdFx0bGNsSGFzaFRyYWNrZXIgPSB0YXJnZXRIYXNoO1xuXHRcdFx0XHRcdGlzRGlydHkgPSBmYWxzZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB0aGUgdXNlciBhdHRlbXB0cyB0byBuYXZpZ2F0ZSB3aXRoaW4gdGhlIGFwcCwgZm9yIGV4YW1wbGUgYmFjayB0byB0aGUgbGlzdCByZXBvcnRcblx0XHRcdFx0XHRpc0RpcnR5ID0gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChpc0RpcnR5KSB7XG5cdFx0XHRcdFx0Ly8gdGhlIEZMUCBkb2Vzbid0IGNhbGwgdGhlIGRpcnR5IHN0YXRlIHByb3ZpZGVyIGFueW1vcmUgb25jZSBpdCdzIGRpcnR5LCBhcyB0aGV5IGNhbid0XG5cdFx0XHRcdFx0Ly8gY2hhbmdlIHRoaXMgZHVlIHRvIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3ZSBzZXQgaXQgYmFjayB0byBub3QtZGlydHlcblx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0RGlydHlGbGFnKGZhbHNlKTtcblx0XHRcdFx0XHR9LCAwKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRoYXNoVHJhY2tlciA9IGxjbEhhc2hUcmFja2VyO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGlzRGlydHk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIHVzZWQgd2hlbiBhIHN0aWNreSBzZXNzaW9uIHRpbWVzIG91dC5cblx0ICpcblx0ICogQHBhcmFtIHN0aWNreUNvbnRleHQgVGhlIGNvbnRleHQgZm9yIHRoZSBzdGlja3kgc2Vzc2lvblxuXHQgKiBAcGFyYW0gaTE4bk1vZGVsXG5cdCAqIEByZXR1cm5zIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXRTZXNzaW9uVGltZW91dEZ1bmN0aW9uKHN0aWNreUNvbnRleHQ6IENvbnRleHQsIGkxOG5Nb2RlbDogTW9kZWwpIHtcblx0XHRyZXR1cm4gKCk6IHVuZGVmaW5lZCB8IGJvb2xlYW4gPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKHN0aWNreUNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNvbnRleHQgbWlzc2luZyBmb3IgU2Vzc2lvblRpbWVvdXQgZnVuY3Rpb25cIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gcmVtb3ZlIHRyYW5zaWVudCBtZXNzYWdlcyBzaW5jZSB3ZSB3aWxsIHNob3dpbmcgb3VyIG93biBtZXNzYWdlXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdFx0XHRjb25zdCB3YXJuaW5nRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRcdFx0dGl0bGU6IFwie3NhcC5mZS5pMThuPkNfRURJVEZMT1dfT0JKRUNUX1BBR0VfU0VTU0lPTl9FWFBJUkVEX0RJQUxPR19USVRMRX1cIixcblx0XHRcdFx0XHRzdGF0ZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRcdFx0Y29udGVudDogbmV3IFRleHQoeyB0ZXh0OiBcIntzYXAuZmUuaTE4bj5DX0VESVRGTE9XX09CSkVDVF9QQUdFX1NFU1NJT05fRVhQSVJFRF9ESUFMT0dfTUVTU0FHRX1cIiB9KSxcblx0XHRcdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHR0ZXh0OiBcIntzYXAuZmUuaTE4bj5DX0NPTU1PTl9ESUFMT0dfT0t9XCIsXG5cdFx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRcdHByZXNzOiAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRcdC8vIHJlbW92ZSBzdGlja3kgaGFuZGxpbmcgYWZ0ZXIgbmF2aWdhdGlvbiBzaW5jZSBzZXNzaW9uIGhhcyBhbHJlYWR5IGJlZW4gdGVybWluYXRlZFxuXHRcdFx0XHRcdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KHN0aWNreUNvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRcdHdhcm5pbmdEaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdhcm5pbmdEaWFsb2cuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHRcdHdhcm5pbmdEaWFsb2cuc2V0TW9kZWwoaTE4bk1vZGVsLCBcInNhcC5mZS5pMThuXCIpO1xuXHRcdFx0XHR0aGlzLmdldFZpZXcoKS5hZGREZXBlbmRlbnQod2FybmluZ0RpYWxvZyk7XG5cdFx0XHRcdHdhcm5pbmdEaWFsb2cub3BlbigpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgb25Sb3V0ZU1hdGNoZWQgZXZlbnQgaW4gY2FzZSBvZiBzdGlja3kgZWRpdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYmVpbmcgZWRpdGVkIChyb290IG9mIHRoZSBzdGlja3kgc2Vzc2lvbilcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAcmV0dXJucyBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0Um91dGVNYXRjaGVkRnVuY3Rpb24oY29udGV4dDogQ29udGV4dCwgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpIHtcblx0XHRyZXR1cm4gKCk6IHZvaWQgPT4ge1xuXHRcdFx0Y29uc3QgY3VycmVudEhhc2ggPSBhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5nZXRIYXNoKCk7XG5cdFx0XHQvLyBlaXRoZXIgY3VycmVudCBoYXNoIGlzIGVtcHR5IHNvIHRoZSB1c2VyIGxlZnQgdGhlIGFwcCBvciBoZSBuYXZpZ2F0ZWQgYXdheSBmcm9tIHRoZSBvYmplY3Rcblx0XHRcdGlmICghY3VycmVudEhhc2ggfHwgIWFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmNoZWNrSGFzaFdpdGhHdWFyZChjdXJyZW50SGFzaCkpIHtcblx0XHRcdFx0dGhpcy5kaXNjYXJkU3RpY2t5U2Vzc2lvbihjb250ZXh0KTtcblx0XHRcdFx0Y29udGV4dC5nZXRNb2RlbCgpLmNsZWFyU2Vzc2lvbkNvbnRleHQoKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEVuZHMgYSBzdGlja3kgc2Vzc2lvbiBieSBkaXNjYXJkaW5nIGNoYW5nZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGVkaXRlZCAocm9vdCBvZiB0aGUgc3RpY2t5IHNlc3Npb24pXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGRpc2NhcmRTdGlja3lTZXNzaW9uKGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBkaXNjYXJkZWRDb250ZXh0ID0gYXdhaXQgc3RpY2t5LmRpc2NhcmREb2N1bWVudChjb250ZXh0KTtcblx0XHRpZiAoZGlzY2FyZGVkQ29udGV4dD8uaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0ZGlzY2FyZGVkQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5nZXRDcmVhdGlvbk1vZGUoKSkge1xuXHRcdFx0ZGlzY2FyZGVkQ29udGV4dD8ucmVmcmVzaCgpO1xuXHRcdH1cblxuXHRcdHRoaXMuaGFuZGxlU3RpY2t5T2ZmKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgaW50ZXJuYWwgcm91dGluZyBleHRlbnNpb24uXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBpbnRlcm5hbCByb3V0aW5nIGV4dGVuc2lvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXRJbnRlcm5hbFJvdXRpbmcoKTogSW50ZXJuYWxSb3V0aW5nIHtcblx0XHRpZiAodGhpcy5iYXNlLl9yb3V0aW5nKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlLl9yb3V0aW5nO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IEZsb3cgd29ya3Mgb25seSB3aXRoIGEgZ2l2ZW4gcm91dGluZyBsaXN0ZW5lclwiKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk6IFJvb3RWaWV3QmFzZUNvbnRyb2xsZXIge1xuXHRcdHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHR9XG5cblx0X2dldFNlbWFudGljTWFwcGluZygpOiBTZW1hbnRpY01hcHBpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRpbmdTZXJ2aWNlKCkuZ2V0TGFzdFNlbWFudGljTWFwcGluZygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgcHJvbWlzZSB0byB3YWl0IGZvciBhbiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIGNvbnRyb2xJZCBUaGUgSUQgb2YgdGhlIGNvbnRyb2xcblx0ICogQHJldHVybnMgVGhlIHJlc29sdmVyIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGV4dGVybmFsbHkgcmVzb2x2ZSB0aGUgcHJvbWlzZVxuXHQgKi9cblx0cHJpdmF0ZSBjcmVhdGVBY3Rpb25Qcm9taXNlKGFjdGlvbk5hbWU6IHN0cmluZywgY29udHJvbElkOiBzdHJpbmcpOiB7IGZSZXNvbHZlcjogRnVuY3Rpb247IGZSZWplY3RvcjogRnVuY3Rpb24gfSB7XG5cdFx0bGV0IHJlc29sdmVGdW5jdGlvbjogRnVuY3Rpb24sIHJlamVjdEZ1bmN0aW9uOiBGdW5jdGlvbjtcblx0XHR0aGlzLmFjdGlvblByb21pc2UgPSBuZXcgUHJvbWlzZTx7IGNvbnRyb2xJZD86IHN0cmluZzsgb0RhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzOiBzdHJpbmdbXSB9PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRyZXNvbHZlRnVuY3Rpb24gPSByZXNvbHZlO1xuXHRcdFx0cmVqZWN0RnVuY3Rpb24gPSByZWplY3Q7XG5cdFx0fSkudGhlbigob1Jlc3BvbnNlOiB1bmtub3duKSA9PiB7XG5cdFx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbihcblx0XHRcdFx0eyBjb250cm9sSWQgfSxcblx0XHRcdFx0dGhpcy5nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKFxuXHRcdFx0XHRcdGFjdGlvbk5hbWUsXG5cdFx0XHRcdFx0b1Jlc3BvbnNlIGFzIHVuZGVmaW5lZCB8IE9EYXRhVjRDb250ZXh0IHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W11cblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHR9KTtcblx0XHRyZXR1cm4geyBmUmVzb2x2ZXI6IHJlc29sdmVGdW5jdGlvbiEsIGZSZWplY3RvcjogcmVqZWN0RnVuY3Rpb24hIH07XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIGFjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0aGF0IGlzIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSByZXNwb25zZSBUaGUgYm91bmQgYWN0aW9uJ3MgcmVzcG9uc2UgZGF0YSBvciByZXNwb25zZSBjb250ZXh0XG5cdCAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGRhdGEgYW5kIG5hbWVzIG9mIHRoZSBrZXkgZmllbGRzIG9mIHRoZSByZXNwb25zZVxuXHQgKi9cblx0cHJpdmF0ZSBnZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKFxuXHRcdGFjdGlvbk5hbWU6IHN0cmluZyxcblx0XHRyZXNwb25zZT86ICh1bmRlZmluZWQgfCBPRGF0YVY0Q29udGV4dCB8IFByb21pc2VTZXR0bGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPltdKSB8IG51bGxcblx0KTogeyBvRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGtleXM6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHJlc3BvbnNlKSkge1xuXHRcdFx0aWYgKHJlc3BvbnNlLmxlbmd0aCA+PSAxKSB7XG5cdFx0XHRcdHJlc3BvbnNlID0gKHJlc3BvbnNlWzBdIGFzIFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+KS52YWx1ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICghcmVzcG9uc2UpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGNvbnN0IGN1cnJlbnRWaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCBtZXRhTW9kZWxEYXRhID0gKGN1cnJlbnRWaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkuZ2V0RGF0YSgpID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRjb25zdCBtZXRhTW9kZWxBY3Rpb24gPSBtZXRhTW9kZWxEYXRhW2FjdGlvbk5hbWVdIGFzIE1ldGFNb2RlbEFjdGlvbltdIHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGFjdGlvblJldHVyblR5cGUgPSBtZXRhTW9kZWxBY3Rpb24/LlswXS4kUmV0dXJuVHlwZSA/IG1ldGFNb2RlbEFjdGlvbj8uWzBdLiRSZXR1cm5UeXBlLiRUeXBlIDogbnVsbDtcblx0XHRjb25zdCBrZXlzID1cblx0XHRcdGFjdGlvblJldHVyblR5cGUgJiYgKG1ldGFNb2RlbERhdGFbYWN0aW9uUmV0dXJuVHlwZV0gYXMgTWV0YU1vZGVsRW50aXR5VHlwZSlcblx0XHRcdFx0PyAobWV0YU1vZGVsRGF0YVthY3Rpb25SZXR1cm5UeXBlXSBhcyBNZXRhTW9kZWxFbnRpdHlUeXBlKS4kS2V5XG5cdFx0XHRcdDogW107XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0b0RhdGE6IHJlc3BvbnNlLmdldE9iamVjdCgpLFxuXHRcdFx0a2V5c1xuXHRcdH07XG5cdH1cblxuXHRhc3luYyBnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpOiBQcm9taXNlPHsgY29udHJvbElkPzogc3RyaW5nOyBvRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGtleXM6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5hY3Rpb25Qcm9taXNlO1xuXHR9XG5cblx0ZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UoKTogdm9pZCB7XG5cdFx0dGhpcy5hY3Rpb25Qcm9taXNlID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0YXN5bmMgc2hvd0NvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2coaXNTYXZlOiBib29sZWFuKTogUHJvbWlzZTxSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uPiB7XG5cdFx0aWYgKCF0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2cpIHtcblx0XHRcdHRoaXMuY29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyA9IG5ldyBDb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2dCbG9jayh7XG5cdFx0XHRcdHZpZXc6IHRoaXMuZ2V0VmlldygpXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuY29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZz8ub3Blbihpc1NhdmUpO1xuXHR9XG5cblx0X3Njcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyh0YWJsZTogVGFibGUpOiB2b2lkIHtcblx0XHRjb25zdCByb3dCaW5kaW5nID0gdGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdGNvbnN0IGFjdGl2ZVJvd0luZGV4OiBudW1iZXIgPSByb3dCaW5kaW5nLmdldENvdW50KCkgfHwgMDtcblx0XHRpZiAodGFibGUuZGF0YShcInRhYmxlVHlwZVwiKSAhPT0gXCJSZXNwb25zaXZlVGFibGVcIikge1xuXHRcdFx0aWYgKGFjdGl2ZVJvd0luZGV4ID4gMCkge1xuXHRcdFx0XHR0YWJsZS5zY3JvbGxUb0luZGV4KGFjdGl2ZVJvd0luZGV4IC0gMSk7XG5cdFx0XHR9XG5cdFx0XHR0YWJsZS5mb2N1c1JvdyhhY3RpdmVSb3dJbmRleCwgdHJ1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8qIEluIGEgcmVzcG9uc2l2ZSB0YWJsZSwgdGhlIGVtcHR5IHJvd3MgYXBwZWFyIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRhYmxlLiBCdXQgd2hlbiB3ZSBjcmVhdGUgbW9yZSwgdGhleSBhcHBlYXIgYmVsb3cgdGhlIG5ldyBsaW5lLlxuXHRcdFx0ICogU28gd2UgY2hlY2sgdGhlIGZpcnN0IGluYWN0aXZlIHJvdyBmaXJzdCwgdGhlbiB3ZSBzZXQgdGhlIGZvY3VzIG9uIGl0IHdoZW4gd2UgcHJlc3MgdGhlIGJ1dHRvbi5cblx0XHRcdCAqIFRoaXMgZG9lc24ndCBpbXBhY3QgdGhlIEdyaWRUYWJsZSBiZWNhdXNlIHRoZXkgYXBwZWFyIGF0IHRoZSBlbmQsIGFuZCB3ZSBhbHJlYWR5IGZvY3VzIHRoZSBiZWZvcmUtdGhlLWxhc3Qgcm93IChiZWNhdXNlIDIgZW1wdHkgcm93cyBleGlzdClcblx0XHRcdCAqL1xuXHRcdFx0Y29uc3QgYWxsUm93Q29udGV4dHMgPSByb3dCaW5kaW5nLmdldENvbnRleHRzKCk7XG5cdFx0XHRpZiAoIWFsbFJvd0NvbnRleHRzPy5sZW5ndGgpIHtcblx0XHRcdFx0dGFibGUuZm9jdXNSb3coYWN0aXZlUm93SW5kZXgsIHRydWUpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRsZXQgZm9jdXNSb3cgPSBhY3RpdmVSb3dJbmRleCxcblx0XHRcdFx0aW5kZXggPSAwO1xuXHRcdFx0Zm9yIChjb25zdCBzaW5nbGVDb250ZXh0IG9mIGFsbFJvd0NvbnRleHRzKSB7XG5cdFx0XHRcdGlmIChzaW5nbGVDb250ZXh0LmlzSW5hY3RpdmUoKSAmJiBpbmRleCA8IGZvY3VzUm93KSB7XG5cdFx0XHRcdFx0Zm9jdXNSb3cgPSBpbmRleDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGZvY3VzUm93ID4gMCkge1xuXHRcdFx0XHR0YWJsZS5zY3JvbGxUb0luZGV4KGZvY3VzUm93KTtcblx0XHRcdH1cblx0XHRcdHRhYmxlLmZvY3VzUm93KGZvY3VzUm93LCB0cnVlKTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBjcmVhdGVFbXB0eVJvd3NBbmRGb2N1cyh0YWJsZTogVGFibGUpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCB0YWJsZUFQSSA9IHRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJO1xuXHRcdGlmIChcblx0XHRcdHRhYmxlQVBJPy50YWJsZURlZmluaXRpb24/LmNvbnRyb2w/LmlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGUgJiZcblx0XHRcdCF0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcInVpXCIpPy5nZXRQcm9wZXJ0eShcImNyZWF0ZU1vZGVcIilcblx0XHQpIHtcblx0XHRcdC8vIFdpdGggdGhlIHBhcmFtZXRlciwgd2UgZG9uJ3QgaGF2ZSBlbXB0eSByb3dzIGluIEVkaXQgbW9kZSwgc28gd2UgbmVlZCB0byBjcmVhdGUgdGhlbSBiZWZvcmUgc2V0dGluZyB0aGUgZm9jdXMgb24gdGhlbVxuXHRcdFx0YXdhaXQgdGFibGVBUEkuc2V0VXBFbXB0eVJvd3ModGFibGUsIHRydWUpO1xuXHRcdH1cblx0XHR0aGlzLl9zY3JvbGxBbmRGb2N1c09uSW5hY3RpdmVSb3codGFibGUpO1xuXHR9XG5cblx0X3NlbmRBY3Rpdml0eShcblx0XHRhY3Rpb246IEFjdGl2aXR5LFxuXHRcdHJlbGF0ZWRDb250ZXh0czogQ29udGV4dCB8IENvbnRleHRbXSB8IG51bGwgfCB1bmRlZmluZWQsXG5cdFx0dHJpZ2dlcmVkQWN0aW9uTmFtZT86IHN0cmluZyxcblx0XHRyZWZyZXNoTGlzdEJpbmRpbmc/OiBib29sZWFuLFxuXHRcdGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXM/OiBzdHJpbmdbXVxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBjb250ZW50ID0gQXJyYXkuaXNBcnJheShyZWxhdGVkQ29udGV4dHMpID8gcmVsYXRlZENvbnRleHRzLm1hcCgoY29udGV4dCkgPT4gY29udGV4dC5nZXRQYXRoKCkpIDogcmVsYXRlZENvbnRleHRzPy5nZXRQYXRoKCk7XG5cdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5zZW5kKHsgYWN0aW9uLCBjb250ZW50LCB0cmlnZ2VyZWRBY3Rpb25OYW1lLCByZWZyZXNoTGlzdEJpbmRpbmcsIGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXMgfSk7XG5cdH1cblxuXHRfdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoc0FjdGlvbk5hbWU6IHN0cmluZywgdHJpZ2dlclR5cGU6IFRyaWdnZXJUeXBlKTogdm9pZCB7XG5cdFx0dHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkodGhpcy5iYXNlLmdldFZpZXcoKSwgc0FjdGlvbk5hbWUsIHRyaWdnZXJUeXBlKTtcblx0fVxuXG5cdGFzeW5jIF9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIFN1Ym1pdCBhbnkgbGVmdG92ZXIgY2hhbmdlcyB0aGF0IGFyZSBub3QgeWV0IHN1Ym1pdHRlZFxuXHRcdFx0Ly8gQ3VycmVudGx5IHdlIGFyZSB1c2luZyBvbmx5IDEgdXBkYXRlR3JvdXBJZCwgaGVuY2Ugc3VibWl0dGluZyB0aGUgYmF0Y2ggZGlyZWN0bHkgaGVyZVxuXHRcdFx0YXdhaXQgb01vZGVsLnN1Ym1pdEJhdGNoKFwiJGF1dG9cIik7XG5cblx0XHRcdC8vIFdhaXQgZm9yIGFsbCBjdXJyZW50bHkgcnVubmluZyBjaGFuZ2VzXG5cdFx0XHQvLyBGb3IgdGhlIHRpbWUgYmVpbmcgd2UgYWdyZWVkIHdpdGggdGhlIHY0IG1vZGVsIHRlYW0gdG8gdXNlIGFuIGludGVybmFsIG1ldGhvZC4gV2UnbGwgcmVwbGFjZSBpdCBvbmNlXG5cdFx0XHQvLyBhIHB1YmxpYyBvciByZXN0cmljdGVkIG1ldGhvZCB3YXMgcHJvdmlkZWRcblx0XHRcdGF3YWl0IChvTW9kZWwub1JlcXVlc3RvciBhcyB1bmtub3duIGFzIHsgd2FpdEZvclJ1bm5pbmdDaGFuZ2VSZXF1ZXN0czogRnVuY3Rpb24gfSkud2FpdEZvclJ1bm5pbmdDaGFuZ2VSZXF1ZXN0cyhcIiRhdXRvXCIpO1xuXG5cdFx0XHQvLyBDaGVjayBpZiBhbGwgY2hhbmdlcyB3ZXJlIHN1Ym1pdHRlZCBzdWNjZXNzZnVsbHlcblx0XHRcdGlmIChvTW9kZWwuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJzdWJtaXQgb2Ygb3BlbiBjaGFuZ2VzIGZhaWxlZFwiKTtcblx0XHRcdH1cblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIsIGZhbHNlKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc3RpY2t5U2Vzc2lvblRva2VuXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGlzcGxheSBhICdkaXNjYXJkJyBwb3BvdmVyIHdoZW4gZXhpdGluZyBhIHN0aWNreSBzZXNzaW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dFxuXHQgKi9cblx0cHJpdmF0ZSBvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uKGNvbnRleHQ6IENvbnRleHQpOiB2b2lkIHtcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCByb3V0ZXJQcm94eSA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGVyUHJveHkoKTtcblxuXHRcdGlmIChyb3V0ZXJQcm94eS5jaGVja0lmQmFja0lzT3V0T2ZHdWFyZCgpKSB7XG5cdFx0XHRzdGlja3kucHJvY2Vzc0RhdGFMb3NzQ29uZmlybWF0aW9uKFxuXHRcdFx0XHRhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5kaXNjYXJkU3RpY2t5U2Vzc2lvbihjb250ZXh0KTtcblx0XHRcdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KTtcblx0XHRcdFx0XHRoaXN0b3J5LmJhY2soKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dmlldyxcblx0XHRcdFx0UHJvZ3JhbW1pbmdNb2RlbC5TdGlja3lcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aGlzdG9yeS5iYWNrKCk7XG5cdH1cblxuXHRhc3luYyBfaGFuZGxlTmV3Q29udGV4dChcblx0XHRvQ29udGV4dDogQ29udGV4dCxcblx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVyczogeyBlZGl0YWJsZTogYm9vbGVhbjsgcmVjcmVhdGVDb250ZXh0OiBib29sZWFuOyBmb3JjZUZvY3VzPzogYm9vbGVhbiB9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdH1cblxuXHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIHtcblx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiB0cnVlLFxuXHRcdFx0ZWRpdGFibGU6IG5hdmlnYXRpb25QYXJhbWV0ZXJzLmVkaXRhYmxlLFxuXHRcdFx0cGVyc2lzdE9QU2Nyb2xsOiB0cnVlLFxuXHRcdFx0cmVjcmVhdGVDb250ZXh0OiBuYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWNyZWF0ZUNvbnRleHQsXG5cdFx0XHRyZWFzb246IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24sXG5cdFx0XHRzaG93UGxhY2Vob2xkZXI6IGZhbHNlLFxuXHRcdFx0Zm9yY2VGb2N1czogbmF2aWdhdGlvblBhcmFtZXRlcnMuZm9yY2VGb2N1cyA/PyBmYWxzZSxcblx0XHRcdGtlZXBDdXJyZW50TGF5b3V0OiB0cnVlXG5cdFx0fSk7XG5cdH1cblxuXHRfZ2V0Qm91bmRDb250ZXh0KHZpZXc6IEZFVmlldywgcGFyYW1zOiB7IGNvbnRyb2xJZD86IHN0cmluZzsgaXNOYXZpZ2FibGU/OiBib29sZWFuIH0pOiBib29sZWFuIHtcblx0XHRjb25zdCB2aWV3TGV2ZWwgPSB2aWV3LmdldFZpZXdEYXRhKCkudmlld0xldmVsO1xuXHRcdGNvbnN0IGJSZWZyZXNoQWZ0ZXJBY3Rpb24gPSB2aWV3TGV2ZWwgPiAxIHx8ICh2aWV3TGV2ZWwgPT09IDEgJiYgcGFyYW1zLmNvbnRyb2xJZCk7XG5cdFx0cmV0dXJuICFwYXJhbXMuaXNOYXZpZ2FibGUgfHwgISFiUmVmcmVzaEFmdGVyQWN0aW9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGVyZSBhcmUgdmFsaWRhdGlvbiAocGFyc2UpIGVycm9ycyBmb3IgY29udHJvbHMgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0XG5cdCAqXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIGlmIHRoZXJlIGFyZSBubyB2YWxpZGF0aW9uIGVycm9ycywgYW5kIHJlamVjdHMgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gZXJyb3JzXG5cdCAqL1xuXG5cdGFzeW5jIF9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQgfCB2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soKS50aGVuKCgpID0+IHtcblx0XHRcdGNvbnN0IHNWaWV3SWQgPSB0aGlzLmdldFZpZXcoKS5nZXRJZCgpO1xuXHRcdFx0Y29uc3QgYU1lc3NhZ2VzID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0XHRcdGxldCBvQ29udHJvbDtcblxuXHRcdFx0aWYgKCFhTWVzc2FnZXMubGVuZ3RoKSB7XG5cdFx0XHRcdExvZy5pbmZvKFwiTm8gdmFsaWRhdGlvbiBlcnJvcnMgZm91bmRcIik7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChjb25zdCBtZXNzYWdlIG9mIGFNZXNzYWdlcykge1xuXHRcdFx0XHRpZiAobWVzc2FnZS52YWxpZGF0aW9uKSB7XG5cdFx0XHRcdFx0b0NvbnRyb2wgPSBFbGVtZW50LmdldEVsZW1lbnRCeUlkKG1lc3NhZ2UuZ2V0Q29udHJvbElkKCkpO1xuXHRcdFx0XHRcdHdoaWxlIChvQ29udHJvbCkge1xuXHRcdFx0XHRcdFx0aWYgKG9Db250cm9sLmdldElkKCkgPT09IHNWaWV3SWQpIHtcblx0XHRcdFx0XHRcdFx0dGhyb3cgXCJ2YWxpZGF0aW9uIGVycm9ycyBleGlzdFwiO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b0NvbnRyb2wgPSBvQ29udHJvbC5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0gb1Jlc3BvbnNlIFRoZSByZXNwb25zZSBvZiB0aGUgYm91bmQgYWN0aW9uIGFuZCB0aGUgbmFtZXMgb2YgdGhlIGtleSBmaWVsZHNcblx0ICogQHBhcmFtIG9SZXNwb25zZS5vRGF0YVxuXHQgKiBAcGFyYW0gb1Jlc3BvbnNlLmtleXNcblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBib3VuZCBjb250ZXh0IG9uIHdoaWNoIHRoZSBhY3Rpb24gd2FzIGV4ZWN1dGVkXG5cdCAqIEByZXR1cm5zIEFsd2F5cyByZXNvbHZlcyB0byBwYXJhbSBvUmVzcG9uc2Vcblx0ICovXG5cdGFzeW5jIF9yZWZyZXNoTGlzdElmUmVxdWlyZWQoXG5cdFx0b1Jlc3BvbnNlPzogeyBvRGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzPzogc3RyaW5nW10gfCBudWxsIH0sXG5cdFx0b0NvbnRleHQ/OiBDb250ZXh0XG5cdCk6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuXHRcdGlmICghb0NvbnRleHQgfHwgIW9SZXNwb25zZSB8fCAhb1Jlc3BvbnNlLm9EYXRhIHx8ICFvUmVzcG9uc2Uua2V5cykge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuXHRcdH1cblx0XHRjb25zdCBvQmluZGluZyA9IG9Db250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHQvLyByZWZyZXNoIG9ubHkgbGlzdHNcblx0XHRpZiAob0JpbmRpbmcgJiYgb0JpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9SZXNwb25zZS5vRGF0YTtcblx0XHRcdGNvbnN0IGFLZXlzID0gb1Jlc3BvbnNlLmtleXM7XG5cdFx0XHRjb25zdCBvQ3VycmVudERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdGxldCBiUmV0dXJuZWRDb250ZXh0SXNTYW1lID0gdHJ1ZTtcblx0XHRcdC8vIGVuc3VyZSBjb250ZXh0IGlzIGluIHRoZSByZXNwb25zZVxuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9Db250ZXh0RGF0YSkubGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGNoZWNrIGlmIGNvbnRleHQgaW4gcmVzcG9uc2UgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGJvdW5kIGNvbnRleHRcblx0XHRcdFx0YlJldHVybmVkQ29udGV4dElzU2FtZSA9IGFLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChzS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRcdFx0XHRyZXR1cm4gb0N1cnJlbnREYXRhW3NLZXldID09PSBvQ29udGV4dERhdGFbc0tleV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoIWJSZXR1cm5lZENvbnRleHRJc1NhbWUpIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0XHRcdFx0XHRpZiAob0JpbmRpbmcuaXNSb290KCkpIHtcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKG9CaW5kaW5nKSkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFdlIHVzZSBhIHNpZGUtZWZmZWN0IHJlZnJlc2ggZm9yIGEgVHJlZVRhYmxlLCB0byBwcmVzZXJ2ZSBleHBhbnNpb24gc3RhdGVzXG5cdFx0XHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHMoW3sgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IFwiXCIgfV0sIG9CaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSEpXG5cdFx0XHRcdFx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goKGU6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVmcmVzaGluZyB0aGUgdGFibGVcIiwgZSBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0b0JpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlY2VpdmVkXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0b0JpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRhcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBvQmluZGluZy5nZXRQYXRoKCkgfV0sIG9CaW5kaW5nLmdldENvbnRleHQoKSlcblx0XHRcdFx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0LmNhdGNoKChlOiB1bmtub3duKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZWZyZXNoaW5nIHRoZSB0YWJsZVwiLCBlIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIHJlc29sdmUgd2l0aCBvUmVzcG9uc2UgdG8gbm90IGRpc3R1cmIgdGhlIHByb21pc2UgY2hhaW4gYWZ0ZXJ3YXJkc1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcblx0fVxuXG5cdGFzeW5jIF9mZXRjaFNlbWFudGljS2V5VmFsdWVzKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx1bmtub3duPiB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRzRW50aXR5U2V0TmFtZSA9IG9NZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCJAc2FwdWkubmFtZVwiKSxcblx0XHRcdGFTZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMob01ldGFNb2RlbCwgc0VudGl0eVNldE5hbWUpO1xuXG5cdFx0aWYgKGFTZW1hbnRpY0tleXMgJiYgYVNlbWFudGljS2V5cy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGFSZXF1ZXN0UHJvbWlzZXMgPSBhU2VtYW50aWNLZXlzLm1hcChhc3luYyBmdW5jdGlvbiAob0tleTogeyAkUHJvcGVydHlQYXRoOiBzdHJpbmcgfSk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0XHRcdHJldHVybiBvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KG9LZXkuJFByb3BlcnR5UGF0aCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKGFSZXF1ZXN0UHJvbWlzZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFByb3ZpZGVzIHRoZSBsYXRlc3QgY29udGV4dCBpbiB0aGUgbWV0YWRhdGEgaGllcmFyY2h5IGZyb20gcm9vdEJpbmRpbmcgdG8gZ2l2ZW4gY29udGV4dCBwb2ludGluZyB0byBnaXZlbiBlbnRpdHlUeXBlXG5cdCAqIGlmIGFueSBzdWNoIGNvbnRleHQgZXhpc3RzLiBPdGhlcndpc2UsIGl0IHJldHVybnMgdGhlIG9yaWdpbmFsIGNvbnRleHQuXG5cdCAqIE5vdGU6IEl0IGlzIG9ubHkgbmVlZGVkIGFzIHdvcmstYXJvdW5kIGZvciBpbmNvcnJlY3QgbW9kZWxsaW5nLiBDb3JyZWN0IG1vZGVsbGluZyB3b3VsZCBpbXBseSBhIERhdGFGaWVsZEZvckFjdGlvbiBpbiBhIExpbmVJdGVtXG5cdCAqIHRvIHBvaW50IHRvIGFuIG92ZXJsb2FkIGRlZmluZWQgZWl0aGVyIG9uIHRoZSBjb3JyZXNwb25kaW5nIEVudGl0eVR5cGUgb3IgYSBjb2xsZWN0aW9uIG9mIHRoZSBzYW1lLlxuXHQgKlxuXHQgKiBAcGFyYW0gcm9vdENvbnRleHQgVGhlIGNvbnRleHQgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb21cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0QmluZGluZyBvZiB0aGUgdGFibGVcblx0ICogQHBhcmFtIG92ZXJsb2FkRW50aXR5VHlwZSBUaGUgQWN0aW9uT3ZlcmxvYWQgZW50aXR5IHR5cGUgdG8gc2VhcmNoIGZvclxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBBY3Rpb25PdmVybG9hZCBlbnRpdHlcblx0ICovXG5cdF9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tTWV0YWRhdGFQYXRoKHJvb3RDb250ZXh0OiBDb250ZXh0LCBsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgb3ZlcmxvYWRFbnRpdHlUeXBlOiBzdHJpbmcpOiBDb250ZXh0IHtcblx0XHRjb25zdCBtb2RlbDogT0RhdGFNb2RlbCA9IHJvb3RDb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBjb250ZXh0U2VnbWVudHM6IHN0cmluZ1tdID0gbGlzdEJpbmRpbmcuZ2V0UGF0aCgpLnNwbGl0KFwiL1wiKTtcblx0XHRsZXQgY3VycmVudENvbnRleHQ6IENvbnRleHQgPSByb290Q29udGV4dDtcblxuXHRcdC8vIFdlIGV4cGVjdCB0aGF0IHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIGxpc3RCaW5kaW5nIGlzIHRoZSBMaXN0QmluZGluZyBvZiB0aGUgdGFibGUuIFJlbW92ZSB0aGlzIGZyb20gY29udGV4dFNlZ21lbnRzXG5cdFx0Ly8gYmVjYXVzZSBpdCBpcyBpbmNvcnJlY3QgdG8gZXhlY3V0ZSBiaW5kQ29udGV4dCBvbiBhIGxpc3QuIFdlIGRvIG5vdCBhbnl3YXkgbmVlZCB0byBzZWFyY2ggdGhpcyBjb250ZXh0IGZvciB0aGUgb3ZlcmxvYWQuXG5cdFx0Y29udGV4dFNlZ21lbnRzLnBvcCgpO1xuXHRcdGlmIChjb250ZXh0U2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRjb250ZXh0U2VnbWVudHMgPSBbXCJcIl07IC8vIERvbid0IGxlYXZlIGNvbnRleHRTZWdtZW50cyB1bmRlZmluZWRcblx0XHR9XG5cblx0XHRpZiAoY29udGV4dFNlZ21lbnRzWzBdICE9PSBcIlwiKSB7XG5cdFx0XHRjb250ZXh0U2VnbWVudHMudW5zaGlmdChcIlwiKTsgLy8gdG8gYWxzbyBnZXQgdGhlIHJvb3QgY29udGV4dCwgaS5lLiB0aGUgYmluZGluZ0NvbnRleHQgb2YgdGhlIHRhYmxlXG5cdFx0fVxuXHRcdC8vIGxvYWQgYWxsIHRoZSBwYXJlbnQgY29udGV4dHMgaW50byBhbiBhcnJheVxuXHRcdGNvbnN0IHBhcmVudENvbnRleHRzOiBDb250ZXh0W10gPSBjb250ZXh0U2VnbWVudHNcblx0XHRcdC5tYXAoKHBhdGhTZWdtZW50OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0aWYgKHBhdGhTZWdtZW50ICE9PSBcIlwiKSB7XG5cdFx0XHRcdFx0Y3VycmVudENvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChwYXRoU2VnbWVudCwgY3VycmVudENvbnRleHQpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIENyZWF0aW5nIGEgbmV3IGNvbnRleHQgdXNpbmcgYmluZENvbnRleHQoLi4uKS5nZXRCb3VuZENvbnRleHQoKSBkb2VzIG5vdCB3b3JrIGlmIHRoZSBldGFnIGlzIG5lZWRlZC4gQWNjb3JkaW5nIHRvIG1vZGVsIGNvbGxlYWd1ZXMsXG5cdFx0XHRcdFx0Ly8gd2Ugc2hvdWxkIGFsd2F5cyB1c2UgYW4gZXhpc3RpbmcgY29udGV4dCBpZiBwb3NzaWJsZS5cblx0XHRcdFx0XHQvLyBDdXJyZW50bHksIHRoZSBvbmx5IGV4YW1wbGUgd2Uga25vdyBhYm91dCBpcyB1c2luZyB0aGUgcm9vdENvbnRleHQgLSBhbmQgaW4gdGhpcyBjYXNlLCB3ZSBjYW4gb2J2aW91c2x5IHJldXNlIHRoYXQgZXhpc3RpbmcgY29udGV4dC5cblx0XHRcdFx0XHQvLyBJZiBvdGhlciBleGFtcGxlcyBzaG91bGQgY29tZSB1cCwgdGhlIGJlc3QgcG9zc2libGUgd29yayBhcm91bmQgd291bGQgYmUgdG8gcmVxdWVzdCBzb21lIGRhdGEgdG8gZ2V0IGFuIGV4aXN0aW5nIGNvbnRleHQuIFRvIGtlZXAgdGhlXG5cdFx0XHRcdFx0Ly8gcmVxdWVzdCBhcyBzbWFsbCBhbmQgZmFzdCBhcyBwb3NzaWJsZSwgd2Ugc2hvdWxkIHJlcXVlc3Qgb25seSB0aGUgZmlyc3Qga2V5IHByb3BlcnR5LiBBcyB0aGlzIHdvdWxkIGludHJvZHVjZSBhc3luY2hyb25pc20sIGFuZCBhbnl3YXlcblx0XHRcdFx0XHQvLyB0aGUgd2hvbGUgbG9naWMgaXMgb25seSBwYXJ0IG9mIHdvcmstYXJvdW5kIGZvciBpbmNvcnJlY3QgbW9kZWxsaW5nLCB3ZSB3YWl0IHVudGlsIHdlIGhhdmUgYW4gZXhhbXBsZSBuZWVkaW5nIGl0IGJlZm9yZSBpbXBsZW1lbnRpbmcgdGhpcy5cblx0XHRcdFx0XHRjdXJyZW50Q29udGV4dCA9IHJvb3RDb250ZXh0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBjdXJyZW50Q29udGV4dDtcblx0XHRcdH0pXG5cdFx0XHQucmV2ZXJzZSgpO1xuXHRcdC8vIHNlYXJjaCBmb3IgY29udGV4dCBiYWNrd2FyZHNcblx0XHRjb25zdCBvdmVybG9hZENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQgPSBwYXJlbnRDb250ZXh0cy5maW5kKFxuXHRcdFx0KHBhcmVudENvbnRleHQ6IENvbnRleHQpID0+XG5cdFx0XHRcdChtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQocGFyZW50Q29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIiRUeXBlXCIpIGFzIHVua25vd24gYXMgc3RyaW5nKSA9PT0gb3ZlcmxvYWRFbnRpdHlUeXBlXG5cdFx0KTtcblx0XHRyZXR1cm4gb3ZlcmxvYWRDb250ZXh0IHx8IGxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSE7XG5cdH1cblxuXHRfY3JlYXRlU2libGluZ0luZm8oY3VycmVudENvbnRleHQ6IENvbnRleHQsIG5ld0NvbnRleHQ6IENvbnRleHQpOiBTaWJsaW5nSW5mb3JtYXRpb24ge1xuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXRDb250ZXh0OiBuZXdDb250ZXh0LFxuXHRcdFx0cGF0aE1hcHBpbmc6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG9sZFBhdGg6IGN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0XHRuZXdQYXRoOiBuZXdDb250ZXh0LmdldFBhdGgoKVxuXHRcdFx0XHR9XG5cdFx0XHRdXG5cdFx0fTtcblx0fVxuXG5cdF91cGRhdGVQYXRoc0luSGlzdG9yeShtYXBwaW5nczogeyBvbGRQYXRoOiBzdHJpbmc7IG5ld1BhdGg6IHN0cmluZyB9W10pOiB2b2lkIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuc2V0UGF0aE1hcHBpbmcobWFwcGluZ3MpO1xuXG5cdFx0Ly8gQWxzbyB1cGRhdGUgdGhlIHNlbWFudGljIG1hcHBpbmcgaW4gdGhlIHJvdXRpbmcgc2VydmljZVxuXHRcdGNvbnN0IGxhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRpZiAobWFwcGluZ3MubGVuZ3RoICYmIGxhc3RTZW1hbnRpY01hcHBpbmc/LnRlY2huaWNhbFBhdGggPT09IG1hcHBpbmdzW21hcHBpbmdzLmxlbmd0aCAtIDFdLm9sZFBhdGgpIHtcblx0XHRcdGxhc3RTZW1hbnRpY01hcHBpbmcudGVjaG5pY2FsUGF0aCA9IG1hcHBpbmdzW21hcHBpbmdzLmxlbmd0aCAtIDFdLm5ld1BhdGg7XG5cdFx0fVxuXHR9XG5cblx0X2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0KFxuXHRcdGNvbnRleHQ6IENvbnRleHQsXG5cdFx0bmV3RG9jdW1lbnRDb250ZXh0OiBDb250ZXh0LFxuXHRcdHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWRcblx0KTogQ29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlOiBDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8oY29udGV4dCwgbmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0aWYgKHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQuZ2V0UGF0aCgpICE9IG5ld0RvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbnRleHRUb05hdmlnYXRlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzaWJsaW5nIGNvbnRleHQgZm9yIGEgc3Vib2JqZWN0IHBhZ2UsIGFuZCBjYWxjdWxhdGVzIGEgc2libGluZyBwYXRoXG5cdCAqIGZvciBhbGwgaW50ZXJtZWRpYXRlIHBhdGhzIGJldHdlZW4gdGhlIG9iamVjdCBwYWdlIGFuZCB0aGUgc3Vib2JqZWN0IHBhZ2UuXG5cdCAqXG5cdCAqIEBwYXJhbSByb290Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgZm9yIHRoZSByb290IG9mIHRoZSBkcmFmdFxuXHQgKiBAcGFyYW0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIHN1Ym9iamVjdFxuXHQgKiBAcGFyYW0gc1Byb2dyYW1taW5nTW9kZWwgVGhlIHByb2dyYW1taW5nIG1vZGVsXG5cdCAqIEBwYXJhbSBkb05vdENvbXB1dGVJZlJvb3QgSWYgdHJ1ZSwgd2UgZG9uJ3QgY29tcHV0ZSBzaWJsaW5nSW5mbyBpZiB0aGUgcm9vdCBhbmQgdGhlIHJpZ2h0bW9zdCBjb250ZXh0cyBhcmUgdGhlIHNhbWVcblx0ICogQHBhcmFtIHJvb3RDb250ZXh0SW5mbyBUaGUgcm9vdCBjb250ZXh0IGluZm9ybWF0aW9uIG9mIHJvb3Qgb2YgdGhlIGRyYWZ0XG5cdCAqIEBwYXJhbSBncm91cElkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHNpYmxpbmdJbmZvcm1hdGlvbiBvYmplY3Rcblx0ICovXG5cdGFzeW5jIF9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdHJvb3RDdXJyZW50Q29udGV4dDogQ29udGV4dCxcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dDogQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQsXG5cdFx0c1Byb2dyYW1taW5nTW9kZWw6IHN0cmluZyxcblx0XHRkb05vdENvbXB1dGVJZlJvb3Q6IGJvb2xlYW4sXG5cdFx0cm9vdENvbnRleHRJbmZvPzogUm9vdENvbnRleHRJbmZvLFxuXHRcdGdyb3VwSWQ/OiBzdHJpbmdcblx0KTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dCA9IHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0ID8/IHJvb3RDdXJyZW50Q29udGV4dDtcblx0XHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0XHQvLyBXcm9uZyB1c2FnZSAhIVxuXHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0fVxuXHRcdGlmIChkb05vdENvbXB1dGVJZlJvb3QgJiYgcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpID09PSByb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kZWwgPSByb290Q3VycmVudENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHJldHVybiBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKHJvb3RDdXJyZW50Q29udGV4dCwgcmlnaHRtb3N0Q3VycmVudENvbnRleHQsIHJvb3RDb250ZXh0SW5mbywgZ3JvdXBJZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIElmIG5vdCBpbiBkcmFmdCBtb2RlLCB3ZSBqdXN0IHJlY3JlYXRlIGEgY29udGV4dCBmcm9tIHRoZSBwYXRoIG9mIHRoZSByaWdodG1vc3QgY29udGV4dFxuXHRcdFx0Ly8gTm8gcGF0aCBtYXBwaW5nIGlzIG5lZWRlZFxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dGFyZ2V0Q29udGV4dDogbW9kZWwuYmluZENvbnRleHQocmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKS5nZXRCb3VuZENvbnRleHQoKSxcblx0XHRcdFx0cGF0aE1hcHBpbmc6IFtdXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXG5cdF9pc0ZjbEVuYWJsZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuX2lzRmNsRW5hYmxlZCgpO1xuXHR9XG5cblx0YXN5bmMgY2hlY2tSZWNvbW1lbmRhdGlvbk9wdGlvbigpOiBQcm9taXNlPFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24gfCB1bmRlZmluZWQ+IHtcblx0XHRsZXQgcmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuO1xuXHRcdGlmICh0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLmNoZWNrSWZSZWNvbW1lbmRhdGlvbnNFeGlzdCgpKSB7XG5cdFx0XHRyZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4gPSBhd2FpdCB0aGlzLnNob3dDb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nKHRydWUpO1xuXHRcdFx0aWYgKHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3NlbiA9PT0gUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbi5Db250aW51ZSkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbi5Db250aW51ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW47XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRWRpdEZsb3c7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBcUVBLE1BQU1BLFlBQVksR0FBR0MsU0FBUyxDQUFDRCxZQUFZO0lBQzFDRSxnQkFBZ0IsR0FBR0QsU0FBUyxDQUFDQyxnQkFBZ0I7SUFDN0NDLFNBQVMsR0FBR0YsU0FBUyxDQUFDRSxTQUFTO0lBQy9CQyxXQUFXLEdBQUdILFNBQVMsQ0FBQ0csV0FBVztJQUNuQ0MsUUFBUSxHQUFHSixTQUFTLENBQUNJLFFBQVE7SUFDN0JDLFdBQVcsR0FBR0wsU0FBUyxDQUFDSyxXQUFXO0lBQ25DQyxXQUFXLEdBQUdDLFdBQVcsQ0FBQ0QsV0FBVztFQXdCdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFOQSxJQVFNRSxRQUFRLFdBRGJDLGNBQWMsQ0FBQywyQ0FBMkMsQ0FBQyxVQW9D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
|
|
2899
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiQ29uc3RhbnRzIiwiRHJhZnRTdGF0dXMiLCJFZGl0TW9kZSIsIlN0YXJ0dXBNb2RlIiwiTWVzc2FnZVR5cGUiLCJjb3JlTGlicmFyeSIsIkVkaXRGbG93IiwiZGVmaW5lVUk1Q2xhc3MiLCJwdWJsaWNFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiaG9va2FibGUiLCJzeW5jVGFza3MiLCJQcm9taXNlIiwicmVzb2x2ZSIsImhhbmRsZVNpZGVFZmZlY3RzIiwibGlzdEJpbmRpbmciLCJjcmVhdGlvblByb21pc2UiLCJ2aWV3QmluZGluZ0NvbnRleHQiLCJnZXRWaWV3IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJuZXdDb250ZXh0IiwiY3JlYXRlZCIsIkNvbW1vblV0aWxzIiwiaGFzVHJhbnNpZW50Q29udGV4dCIsImdldEFwcENvbXBvbmVudCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSIsImdldFBhdGgiLCJlcnJvciIsIkxvZyIsImNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyIsInZhbGlkYXRpb25NZXNzYWdlcyIsInRhYmxlIiwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwiZ2V0Q3JlYXRpb25Sb3ciLCJkYXRhIiwiY3VzdG9tVmFsaWRpdHkiLCJnZXRQcm9wZXJ0eSIsImN1c3RvbU1lc3NhZ2VzIiwiZmllbGRDb250cm9sIiwiZmluYWxUYXJnZXQiLCJvbGRNZXNzYWdlcyIsIk1lc3NhZ2luZyIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJmaWx0ZXIiLCJtZXNzYWdlIiwiZ2V0Q29kZSIsInJlbW92ZU1lc3NhZ2VzIiwiZm9yRWFjaCIsInZhbGlkYXRpb25NZXNzYWdlIiwibWVzc2FnZVRhcmdldCIsIkVsZW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImZpZWxkSWQiLCJnZXRCaW5kaW5nUGF0aCIsImdldFRhcmdldHMiLCJzb21lIiwidGFyZ2V0IiwibGVuZ3RoIiwiYWRkTWVzc2FnZXMiLCJNZXNzYWdlIiwibWVzc2FnZVRleHQiLCJwcm9jZXNzb3IiLCJnZXRNb2RlbCIsInR5cGUiLCJFcnJvciIsImNvZGUiLCJ0ZWNobmljYWwiLCJwZXJzaXN0ZW50IiwiZXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMiLCJhZGRDb250cm9sSWQiLCJwdXNoIiwidGV4dCIsImdldE1lc3NhZ2VIYW5kbGVyIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJyZXNvbHZlQ3JlYXRpb25Nb2RlIiwiaW5pdGlhbENyZWF0aW9uTW9kZSIsImNyZWF0ZURhdGEiLCJOZXdQYWdlIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwicHJvZ3JhbW1pbmdNb2RlbCIsImdldFByb2dyYW1taW5nTW9kZWwiLCJpc1JlbGF0aXZlIiwiZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiZ2V0TWV0YUNvbnRleHQiLCJlbnRpdHlTZXQiLCJ0YXJnZXRFbnRpdHlTZXQiLCJuZXdBY3Rpb24iLCJEcmFmdCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiRHJhZnRSb290IiwiU2Vzc2lvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJOZXdBY3Rpb24iLCJ0b1N0cmluZyIsInRhcmdldEVudGl0eVR5cGUiLCJhY3Rpb25zIiwicGFyYW1ldGVycyIsIkRlZmVycmVkIiwiY3JlYXRpb25QYXJhbWV0ZXJzIiwiZ2V0VHJhbnNhY3Rpb25IZWxwZXIiLCJnZXRDcmVhdGlvblBhcmFtZXRlcnMiLCJBc3luYyIsImdldEludGVyZmFjZSIsImJhc2UiLCJlZGl0RG9jdW1lbnQiLCJjb250ZXh0IiwidHJhbnNhY3Rpb25IZWxwZXIiLCJyb290Vmlld0NvbnRyb2xsZXIiLCJfZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwibW9kZWwiLCJ2aWV3RGF0YSIsImdldFZpZXdEYXRhIiwicm9vdENvbnRleHQiLCJ2aWV3IiwiZ3JvdXBJZCIsInZpZXdMZXZlbCIsIlN0aWNreSIsImNyZWF0ZVJvb3RDb250ZXh0IiwiZWRpdEZsb3ciLCJvbkJlZm9yZUVkaXQiLCJyaWdodG1vc3RDb250ZXh0IiwiX2lzRmNsRW5hYmxlZCIsImdldFJpZ2h0bW9zdENvbnRleHQiLCJuZXdEb2N1bWVudENvbnRleHRQcm9taXNlIiwicm9vdENvbnRleHRJbmZvIiwicm9vdFNpYmxpbmdQYXRoUHJvbWlzZSIsIl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzIiwic2libGluZ0luZm9Qcm9taXNlIiwiY29tcHV0ZVNpYmxpbmdJbmZvIiwiX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJzdWJtaXRCYXRjaCIsInNpYmxpbmdJbmZvIiwibmV3RG9jdW1lbnRDb250ZXh0IiwiY29udGV4dFRvTmF2aWdhdGUiLCJ1bmRlZmluZWQiLCJfZ2V0TmF2aWdhdGlvblRhcmdldEZvckVkaXQiLCJfdXBkYXRlUGF0aHNJbkhpc3RvcnkiLCJzZXRFZGl0TW9kZSIsIkVkaXRhYmxlIiwic2V0RG9jdW1lbnRNb2RpZmllZCIsIm9uQWZ0ZXJFZGl0IiwiX2hhbmRsZU5ld0NvbnRleHQiLCJlZGl0YWJsZSIsInJlY3JlYXRlQ29udGV4dCIsImZvcmNlRm9jdXMiLCJzdGlja3lDb250ZXh0IiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsImhhbmRsZVN0aWNreU9uIiwiTW9kZWxIZWxwZXIiLCJpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZCIsInNoYXJlT2JqZWN0IiwicmVqZWN0IiwicmVxdWVzdFNpZGVFZmZlY3RzT25EZWxldGUiLCJwYXJlbnRDb250ZXh0Iiwic2lkZUVmZmVjdFNlcnZpY2UiLCJzdGF0ZU1lc3NhZ2VzUGF0aCIsImdldE1lc3NhZ2VzUGF0aCIsImlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJkZWxldGVNdWx0aXBsZURvY3VtZW50cyIsImNvbnRleHRzVG9EZWxldGUiLCJiZWZvcmVEZWxldGVDYWxsQmFjayIsIm9uQmVmb3JlRGVsZXRlIiwibG9ja09iamVjdCIsImdldEdsb2JhbFVJTW9kZWwiLCJwYXJlbnRDb250cm9sIiwiYnlJZCIsImNvbnRyb2xJZCIsImluYWN0aXZlQ29udGV4dHNUb0RlbGV0ZSIsImlzQSIsImlzSW5hY3RpdmUiLCJnZXRCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsImJGaW5kQWN0aXZlQ29udGV4dHMiLCJCdXN5TG9ja2VyIiwibG9jayIsInNlbGVjdGVkQ29udGV4dHMiLCJkZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uIiwicmVzdWx0IiwiY2xlYXJTZWxlY3Rpb24iLCJpc1Jvb3QiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImdldEhlYWRlckNvbnRleHQiLCJhdHRhY2hFdmVudE9uY2UiLCJyZWZyZXNoIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCIsInJlY29tbWVuZGF0aW9ucyIsImlnbm9yZVJlY29tbWVuZGF0aW9uRm9yQ29udGV4dHMiLCJvbkFmdGVyRGVsZXRlIiwiY29udGV4dHMiLCJ0YWJsZUFQSSIsImdldFBhcmVudCIsInRhYmxlRGVmaW5pdGlvbiIsImNvbnRyb2wiLCJjcmVhdGlvbk1vZGUiLCJJbmxpbmVDcmVhdGlvblJvd3MiLCJyZW1vdmVFbXB0eVJvd3NNZXNzYWdlcyIsInNldFVwRW1wdHlSb3dzIiwiX3NlbmRBY3Rpdml0eSIsIkFjdGl2aXR5IiwiRGVsZXRlIiwidW5sb2NrIiwidXBkYXRlRG9jdW1lbnQiLCJ1cGRhdGVkQ29udGV4dCIsInVwZGF0ZVByb21pc2UiLCJvcmlnaW5hbEJpbmRpbmdDb250ZXh0IiwiaXNEcmFmdCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsInN5bmNUYXNrIiwic2V0RHJhZnRTdGF0dXMiLCJTYXZpbmciLCJjdXJyZW50QmluZGluZ0NvbnRleHQiLCJlbnRpdHlTZXROYW1lIiwiZ2V0T2JqZWN0Iiwic2VtYW50aWNLZXlzIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY0tleXMiLCJjdXJyZW50U2VtYW50aWNNYXBwaW5nIiwiX2dldFNlbWFudGljTWFwcGluZyIsImN1cnJlbnRTZW1hbnRpY1BhdGgiLCJzZW1hbnRpY1BhdGgiLCJzQ2hhbmdlZFBhdGgiLCJnZXRTZW1hbnRpY1BhdGgiLCJTYXZlZCIsIkNsZWFyIiwic2hvd01lc3NhZ2VzIiwiZ2V0UGFyZW50Q29udGV4dEZyb21TZWxlY3Rpb24iLCJjcmVhdGVEb2N1bWVudCIsInZMaXN0QmluZGluZyIsIm1JblBhcmFtZXRlcnMiLCJvRGF0YUxpc3RCaW5kaW5nIiwiRXh0ZXJuYWwiLCJvRGF0YU1vZGVsIiwiYmluZExpc3QiLCJTeW5jIiwiY3JlYXRlQXRFbmQiLCJyZXNvbHZlZENyZWF0aW9uTW9kZSIsImdldFJvdXRlclByb3h5IiwicmVtb3ZlSUFwcFN0YXRlS2V5Iiwic2luZ2xlRHJhZnRGb3JDcmVhdGUiLCJnZXRNYW5pZmVzdCIsImFwcCIsImdldFJvb3RCaW5kaW5nIiwibmV3QmluZGluZyIsImdldENvbnRleHQiLCJTb3J0ZXIiLCJGaWx0ZXIiLCJmaWx0ZXJzIiwicGF0aCIsIm9wZXJhdG9yIiwidmFsdWUxIiwiYW5kIiwicmVxdWVzdENvbnRleHRzIiwidGhlbiIsImRlc3Ryb3kiLCJfaGFuZGxlQ3JlYXRpb25Nb2RlIiwiY3JlYXRlRXh0ZXJuYWxEb2N1bWVudCIsIm91dGJvdW5kIiwiY3JlYXRlRGVmZXJyZWREb2N1bWVudCIsIkNyZWF0aW9uUm93IiwiY3JlYXRpb25Sb3ciLCJjcmVhdGVDcmVhdGVSb3dEb2N1bWVudCIsInNraXBTaWRlRWZmZWN0cyIsIklubGluZSIsImNyZWF0ZUlubGluZURvY3VtZW50IiwidGFibGVJZCIsImNyZWF0ZVN5bmNBc3luY0RvY3VtZW50IiwiYkZyb21EZWZlcnJlZCIsImNyZWF0ZUFjdGlvbiIsInBvc3REb2N1bWVudENyZWF0aW9uIiwicHJlcmVxdWlzaXRlIiwicGFyYW1zIiwib25BZnRlckNyZWF0ZSIsIm1ldGFDb250ZXh0Iiwic3RhcnRpbmdFbnRpdHlTZXQiLCJnZXRJbnRlcm5hbE1vZGVsIiwic2V0UHJvcGVydHkiLCJmb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZCIsInNldERvY3VtZW50TW9kaWZpZWRPbkNyZWF0ZSIsIkNyZWF0ZSIsImlzRHJhZnRSb290IiwiY29sbGFib3JhdGl2ZURyYWZ0IiwiaXNDb25uZWN0ZWQiLCJhcHBDb21wb25lbnQiLCJuYXZpZ2F0aW9uIiwiY3JlYXRpb25Sb3dDb250ZXh0IiwiZG9jdW1lbnRWYWxpZGF0aW9uIiwiZ2V0Q3JlYXRpb25Sb3dWYWxpZGF0aW9uRnVuY3Rpb24iLCJlbnRpdHlUeXBlIiwiY3JlYXRpb25Sb3dQYXlsb2FkIiwiX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycyIsImNyZWF0aW9uIiwic2Nyb2xsVG9JbmRleCIsImdldExlbmd0aCIsImhhbmRsZUNyZWF0ZUV2ZW50cyIsIk9iamVjdCIsImFzc2lnbiIsImtleXMiLCJwcm9wZXJ0eVBhdGgiLCJuYXZpZ2F0aW9uUHJvcGVydGllcyIsImZpbmRJbmRleCIsInByb3BlcnR5IiwibmFtZSIsIm1hcCIsImtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQiLCJidXN5TW9kZSIsImJ1c3lJZCIsImdldFRhYmxlRGVmaW5pdGlvbiIsImFubm90YXRpb24iLCJpZCIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwib25CZWZvcmVDcmVhdGUiLCJza2lwUGFyYW1ldGVyRGlhbG9nIiwiZ2V0U3RhcnR1cE1vZGUiLCJBdXRvQ3JlYXRlIiwiY3JlYXRpb25Sb3dMaXN0QmluZGluZyIsIm5ld1RyYW5zaWVudENvbnRleHQiLCJjcmVhdGUiLCJzZXRCaW5kaW5nQ29udGV4dCIsImNhdGNoIiwidHJhY2UiLCJkZWxldGUiLCJpc0xvY2tlZCIsImFsbCIsImFsbEN1cnJlbnRDb250ZXh0cyIsImdldEFsbEN1cnJlbnRDb250ZXh0cyIsImNvbnRleHRJbmRleCIsImluZGV4T2YiLCJmb2N1c1JvdyIsInBhcmVudEluZGV4IiwiZ2V0SW50ZXJuYWxSb3V0aW5nIiwibmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0IiwiY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMiLCJtb2RlIiwicm91dGluZ0xpc3RlbmVyIiwiY3JlYXRlQ29udGV4dFByb21pc2UiLCJjb3JlUmVzb3VyY2VCdW5kbGUiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJnZXRUZXh0IiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsIm5hdlBhcmFtZXRlcnMiLCJ0cmFuc2llbnQiLCJuYXZpZ2F0ZVRvQ29udGV4dCIsIkNhbmNlbEFjdGlvbkRpYWxvZyIsIkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCIsIkNyZWF0aW9uRmFpbGVkIiwiT25CZWZvcmVDcmVhdGVGYWlsZWQiLCJpbmNsdWRlcyIsIm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSIsImNvbnRyb2xsZXIiLCJnZXRDb250cm9sbGVyIiwiY3JlYXRlUGF0aCIsImdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZyIsIl9pbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQiLCJ2YWxpZGF0ZURvY3VtZW50IiwiY3JlYXRpb25Sb3dPYmplY3RzIiwiY3JlYXRlTXVsdGlwbGVEb2N1bWVudHMiLCJkYXRhRm9yQ3JlYXRlIiwiaXNGcm9tQ29weVBhc3RlIiwiY3JlYXRlQXNJbmFjdGl2ZSIsInRhcmdldExpc3RCaW5kaW5nIiwiY29udGV4dFBhdGgiLCJtZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiY3JlYXRpb25Qcm9taXNlcyIsInByb3BlcnR5VmFsdWVzIiwiY3JlYXRlUGFyYW1ldGVycyIsImluYWN0aXZlIiwiJGtpbmQiLCJjcmVhdGVkQ29udGV4dHMiLCJhY3RpdmVDb250ZXh0cyIsImVyciIsIl9tUGFyYW1ldGVycyIsIm9uQmVmb3JlU2F2ZSIsIm9uQmVmb3JlRGlzY2FyZCIsIm9uQWZ0ZXJTYXZlIiwib25BZnRlckRpc2NhcmQiLCJzYXZlRG9jdW1lbnQiLCJvQ29udGV4dCIsIm1QYXJhbWV0ZXJzIiwiYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IiLCJhQmluZGluZ3MiLCJiaW5kaW5ncyIsIm1lcmdlUGF0Y2hEcmFmdCIsIl9zdWJtaXRPcGVuQ2hhbmdlcyIsInJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3NlbiIsImNoZWNrUmVjb21tZW5kYXRpb25PcHRpb24iLCJzUHJvZ3JhbW1pbmdNb2RlbCIsImlzRmNsRW5hYmxlZCIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiYWN0aXZlRG9jdW1lbnRDb250ZXh0IiwiX2dldFJlc291cmNlTW9kZWwiLCJnZXRDcmVhdGlvbk1vZGUiLCJfcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsIkFjdGl2YXRlIiwiZGlzY29ubmVjdCIsIl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleSIsIlN0YW5kYXJkQWN0aW9ucyIsInNhdmUiLCJUcmlnZ2VyVHlwZSIsInN0YW5kYXJkQWN0aW9uIiwiRGlzcGxheSIsInN0b3JlRGF0YUZvclRlbGVtZXRyeSIsIl9jcmVhdGVTaWJsaW5nSW5mbyIsInByZXZpb3VzU2VtYW50aWNQYXRoIiwibmV3U2VtYW50aWNQYXRoIiwicGF0aE1hcHBpbmciLCJvbGRQYXRoIiwibmV3UGF0aCIsInRhcmdldENvbnRleHQiLCJvRXJyb3IiLCJjYW5jZWxlZCIsInRvZ2dsZURyYWZ0QWN0aXZlIiwib0NvbnRleHREYXRhIiwiYklzRHJhZnQiLCJJc0FjdGl2ZUVudGl0eSIsIkhhc0FjdGl2ZUVudGl0eSIsIkhhc0RyYWZ0RW50aXR5Iiwib1Jvb3RWaWV3Q29udHJvbGxlciIsIm9SaWdodG1vc3RDb250ZXh0IiwibGFzdFNlbWFudGljTWFwcGluZyIsInRlY2huaWNhbFBhdGgiLCJ0YXJnZXRQYXRoIiwiY2FuY2VsRG9jdW1lbnQiLCJpc05ld0RvY3VtZW50IiwiY2FuY2VsUGFyYW1ldGVycyIsInNraXBEaXNjYXJkUG9wb3ZlciIsImNhbmNlbEJ1dHRvbiIsImJlZm9yZUNhbmNlbENhbGxCYWNrIiwiY2FuY2VsUmVzdWx0IiwiaXNEb2N1bWVudE1vZGlmaWVkIiwiZ2V0SW5zdGFuY2VkVmlld3MiLCJpc0tlZXBBbGl2ZSIsInNldEtlZXBBbGl2ZSIsIkRpc2NhcmQiLCJza2lwQmFja05hdmlnYXRpb24iLCJuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCIsIm9BY3RpdmVEb2N1bWVudENvbnRleHQiLCJfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyIsInNraXBCaW5kaW5nVG9WaWV3Iiwic2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2UiLCJyZXNvdXJjZU1vZGVsIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJhdHRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsInNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCIsIk1lc3NhZ2VUb2FzdCIsInNob3ciLCJkZXRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsImRlbGV0ZURvY3VtZW50Iiwib0FwcENvbXBvbmVudCIsImdldEluZGV4Iiwic2libGluZ0NvbnRleHQiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsImRyYWZ0UGF0aCIsInJlcXVlc3RDYW5vbmljYWxQYXRoIiwiZHJhZnRDb250ZXh0VG9SZW1vdmUiLCJyZXBsYWNlV2l0aCIsImNvbnRleHRCaW5kaW5nIiwicGFyZW50TGlzdEJpbmRpbmciLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJEZWVwbGluayIsImV4aXRGcm9tQXBwIiwiYXBwbHlEb2N1bWVudCIsIm9Mb2NrT2JqZWN0IiwiY2hlY2tJZlJlY29tbWVuZGF0aW9uc0V4aXN0IiwiaXNDb250aW51ZSIsInNob3dDb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nIiwiUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiIsIkNvbnRpbnVlIiwiaW52b2tlQWN0aW9uIiwic0FjdGlvbk5hbWUiLCJtRXh0cmFQYXJhbXMiLCJhUGFydHMiLCJzT3ZlcmxvYWRFbnRpdHlUeXBlIiwib0N1cnJlbnRBY3Rpb25DYWxsQmFja3MiLCJvVmlldyIsIkFycmF5IiwiaXNBcnJheSIsImlzTmF2aWdhYmxlIiwicmVxdWlyZXNOYXZpZ2F0aW9uIiwiY29udmVydGVkTWV0YWRhdGEiLCJjb252ZXJ0VHlwZXMiLCJlbnRpdHlDb250YWluZXIiLCJpc0JvdW5kIiwib0NvbnRyb2wiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsImlnbm9yZUVUYWciLCJzcGxpdCIsInJlcGxhY2VBbGwiLCJiU3RhdGljQWN0aW9uIiwiaXNUYWJsZUJvdW5kIiwic0JpbmRpbmdQYXRoIiwib0xpc3RCaW5kaW5nIiwiX2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21NZXRhZGF0YVBhdGgiLCJlbmFibGVBdXRvU2Nyb2xsIiwiY3JlYXRlQWN0aW9uUHJvbWlzZSIsImdldElkIiwiYkdldEJvdW5kQ29udGV4dCIsIl9nZXRCb3VuZENvbnRleHQiLCJiT2JqZWN0UGFnZSIsImNvbnZlcnRlclR5cGUiLCJvUmVzcG9uc2UiLCJjYWxsQWN0aW9uIiwibGlzdFJlZnJlc2hlZCIsIl9yZWZyZXNoTGlzdElmUmVxdWlyZWQiLCJnZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzIiwiYWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcyIsInZhbHVlIiwiQWN0aW9uIiwiYWN0aW9uIiwiZlJlc29sdmVyIiwidkNvbnRleHQiLCJvTWV0YU1vZGVsIiwic0NvbnRleHRNZXRhUGF0aCIsIl9mblZhbGlkQ29udGV4dHMiLCJhcHBsaWNhYmxlQ29udGV4dHMiLCJlbGVtZW50Iiwib0FjdGlvbkNvbnRleHQiLCJzQWN0aW9uQ29udGV4dE1ldGFQYXRoIiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJyZXR1cm5Db250ZXh0IiwiaW5mbyIsIm9uQWZ0ZXJBY3Rpb25FeGVjdXRpb24iLCJmUmVqZWN0b3IiLCJlcnJQcm9taXNlIiwicmVqZWN0ZWRJdGVtcyIsIl9hY3Rpb25OYW1lIiwic2VjdXJlZEV4ZWN1dGlvbiIsImZuRnVuY3Rpb24iLCJiQnVzeVNldCIsImJ1c3kiLCJzZXQiLCJiQnVzeUNoZWNrIiwiY2hlY2siLCJiVXBkYXRlc0RvY3VtZW50IiwidXBkYXRlc0RvY3VtZW50IiwiZmluYWxseSIsImhhbmRsZVBhdGNoU2VudCIsIm9FdmVudCIsImludGVybmFsQ29udGV4dCIsImdldFNvdXJjZSIsInNldElnbm9yZUVUYWciLCJzb3VyY2VCaW5kaW5nIiwib1BhdGNoUHJvbWlzZSIsInBhdGNoQ29tcGxldGVkRXZlbnQiLCJBY3Rpb25SdW50aW1lIiwic2V0QWN0aW9uRW5hYmxlbWVudEFmdGVyUGF0Y2giLCJiU3VjY2VzcyIsImdldFBhcmFtZXRlciIsImhhbmRsZUNyZWF0ZVNlbnQiLCJldmVudCIsIm5ld1Rhc2siLCJkZWJ1ZyIsImNvbXB1dGVFZGl0TW9kZSIsImdsb2JhbE1vZGVsIiwiaXNBY3RpdmVFbnRpdHkiLCJyZXF1ZXN0T2JqZWN0IiwiaGFzQWN0aXZlRW50aXR5IiwibGFzdEludm9rZWRBY3Rpb25OYW1lIiwiaXNOZXdBY3Rpb25Gb3JTdGlja3kiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMiLCJnZXRSZXNvdXJjZU1vZGVsIiwiVHJhbnNhY3Rpb25IZWxwZXIiLCJtZXNzYWdlSGFuZGxlciIsInNldENyZWF0aW9uTW9kZSIsImJDcmVhdGlvbk1vZGUiLCJ1aU1vZGVsQ29udGV4dCIsIlVpTW9kZWxDb25zdGFudHMiLCJDcmVhdGVNb2RlIiwiRG9jdW1lbnRNb2RpZmllZCIsIm1vZGlmaWVkIiwiYmluZGluZyIsImF0dGFjaEV2ZW50Iiwic3VjY2VzcyIsImRyYWZ0U3RhdHVzIiwic291cmNlIiwiZWRpdE1vZGUiLCJpc0NyZWF0aW9uIiwiZm9yY2VkIiwic2hhbGxGb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZCIsImFjdGlvbk5hbWUiLCJzdGlja3lTZXNzaW9uIiwiQWRkaXRpb25hbE5ld0FjdGlvbnMiLCJoYXNOYXZpZ2F0aW9uR3VhcmQiLCJoYXNoVHJhY2tlciIsImdldEhhc2giLCJpbnRlcm5hbE1vZGVsIiwic2V0VGltZW91dCIsInNldE5hdmlnYXRpb25HdWFyZCIsInN1YnN0cmluZyIsIm9uQmFja05hdmlnYXRpb25JblNlc3Npb24iLCJiaW5kIiwiZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24iLCJnZXREaXJ0eVN0YXRlUHJvdmlkZXIiLCJyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciIsImkxOG5Nb2RlbCIsInNlc3Npb25UaW1lb3V0RnVuY3Rpb24iLCJnZXRTZXNzaW9uVGltZW91dEZ1bmN0aW9uIiwiYXR0YWNoU2Vzc2lvblRpbWVvdXQiLCJzdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24iLCJnZXRSb3V0ZU1hdGNoZWRGdW5jdGlvbiIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsImhhbmRsZVN0aWNreU9mZiIsImRpc2NhcmROYXZpZ2F0aW9uR3VhcmQiLCJkZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyIiwiZGV0YWNoU2Vzc2lvblRpbWVvdXQiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJnZXRIdHRwSGVhZGVycyIsIm5hdmlnYXRpb25Db250ZXh0IiwidGFyZ2V0SGFzaCIsImlubmVyQXBwUm91dGUiLCJyb3V0ZXJQcm94eSIsImxjbEhhc2hUcmFja2VyIiwiaXNEaXJ0eSIsImlzU2Vzc2lvbk9uIiwiaXNOYXZpZ2F0aW9uRmluYWxpemVkIiwiY2hlY2tIYXNoV2l0aEd1YXJkIiwiaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlciIsInNldERpcnR5RmxhZyIsIndhcm5pbmdEaWFsb2ciLCJEaWFsb2ciLCJzdGF0ZSIsImNvbnRlbnQiLCJUZXh0IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJwcmVzcyIsImFmdGVyQ2xvc2UiLCJhZGRTdHlsZUNsYXNzIiwic2V0TW9kZWwiLCJhZGREZXBlbmRlbnQiLCJvcGVuIiwiY3VycmVudEhhc2giLCJkaXNjYXJkU3RpY2t5U2Vzc2lvbiIsImNsZWFyU2Vzc2lvbkNvbnRleHQiLCJkaXNjYXJkZWRDb250ZXh0Iiwic3RpY2t5IiwiZGlzY2FyZERvY3VtZW50IiwicmVzZXRDaGFuZ2VzIiwiX3JvdXRpbmciLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJnZXRMYXN0U2VtYW50aWNNYXBwaW5nIiwicmVzb2x2ZUZ1bmN0aW9uIiwicmVqZWN0RnVuY3Rpb24iLCJhY3Rpb25Qcm9taXNlIiwicmVzcG9uc2UiLCJjdXJyZW50VmlldyIsIm1ldGFNb2RlbERhdGEiLCJtZXRhTW9kZWxBY3Rpb24iLCJhY3Rpb25SZXR1cm5UeXBlIiwiJFJldHVyblR5cGUiLCIkVHlwZSIsIiRLZXkiLCJvRGF0YSIsImdldEN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UiLCJpc1NhdmUiLCJjb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nIiwiQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nQmxvY2siLCJfc2Nyb2xsQW5kRm9jdXNPbkluYWN0aXZlUm93Iiwicm93QmluZGluZyIsImFjdGl2ZVJvd0luZGV4IiwiZ2V0Q291bnQiLCJhbGxSb3dDb250ZXh0cyIsImdldENvbnRleHRzIiwiaW5kZXgiLCJzaW5nbGVDb250ZXh0IiwiY3JlYXRlRW1wdHlSb3dzQW5kRm9jdXMiLCJpbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlIiwicmVsYXRlZENvbnRleHRzIiwidHJpZ2dlcmVkQWN0aW9uTmFtZSIsInJlZnJlc2hMaXN0QmluZGluZyIsInNlbmQiLCJ0cmlnZ2VyVHlwZSIsInRyaWdnZXJDb25maWd1cmVkU3VydmV5Iiwib01vZGVsIiwib1JlcXVlc3RvciIsIndhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHMiLCJjaGVja0lmQmFja0lzT3V0T2ZHdWFyZCIsInByb2Nlc3NEYXRhTG9zc0NvbmZpcm1hdGlvbiIsImhpc3RvcnkiLCJiYWNrIiwibmF2aWdhdGlvblBhcmFtZXRlcnMiLCJwZXJzaXN0T1BTY3JvbGwiLCJyZWFzb24iLCJOYXZpZ2F0aW9uUmVhc29uIiwiRWRpdEZsb3dBY3Rpb24iLCJzaG93UGxhY2Vob2xkZXIiLCJrZWVwQ3VycmVudExheW91dCIsImJSZWZyZXNoQWZ0ZXJBY3Rpb24iLCJzVmlld0lkIiwiYU1lc3NhZ2VzIiwidmFsaWRhdGlvbiIsImdldENvbnRyb2xJZCIsIm9CaW5kaW5nIiwiYUtleXMiLCJvQ3VycmVudERhdGEiLCJiUmV0dXJuZWRDb250ZXh0SXNTYW1lIiwiZXZlcnkiLCJzS2V5IiwiZSIsInNFbnRpdHlTZXROYW1lIiwiYVNlbWFudGljS2V5cyIsImFSZXF1ZXN0UHJvbWlzZXMiLCJvS2V5IiwiJFByb3BlcnR5UGF0aCIsIm92ZXJsb2FkRW50aXR5VHlwZSIsImNvbnRleHRTZWdtZW50cyIsImN1cnJlbnRDb250ZXh0IiwicG9wIiwidW5zaGlmdCIsInBhcmVudENvbnRleHRzIiwicGF0aFNlZ21lbnQiLCJyZXZlcnNlIiwib3ZlcmxvYWRDb250ZXh0IiwiZmluZCIsIm1hcHBpbmdzIiwic2V0UGF0aE1hcHBpbmciLCJyb290Q3VycmVudENvbnRleHQiLCJyaWdodG1vc3RDdXJyZW50Q29udGV4dCIsImRvTm90Q29tcHV0ZUlmUm9vdCIsInN0YXJ0c1dpdGgiLCJkcmFmdCIsImNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJCYXNlQ29udHJvbGxlckV4dGVuc2lvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRWRpdEZsb3cudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBCYXNlQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQmFzZUNvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBTdGFuZGFyZEFjdGlvbnMsIFRyaWdnZXJUeXBlLCB0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9GZWVkYmFja1wiO1xuaW1wb3J0IHsgaG9va2FibGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSG9va1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIEludGVybmFsUm91dGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZXJuYWxSb3V0aW5nXCI7XG5pbXBvcnQgdHlwZSBNZXNzYWdlSGFuZGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB0eXBlIHsgQ3VzdG9tTWVzc2FnZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHsgQWN0aXZpdHksIHNoYXJlT2JqZWN0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBDYW5jZWxQYXJhbWV0ZXJzLCBDcmVhdGVQYXJhbWV0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L1RyYW5zYWN0aW9uSGVscGVyXCI7XG5pbXBvcnQgVHJhbnNhY3Rpb25IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L1RyYW5zYWN0aW9uSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRDb250ZXh0UGFyYW1ldGVycywgUm9vdENvbnRleHRJbmZvLCBTaWJsaW5nSW5mb3JtYXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBVaU1vZGVsQ29uc3RhbnRzIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9lZGl0Rmxvd0NvbnN0YW50c1wiO1xuaW1wb3J0IHN0aWNreSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvc3RpY2t5XCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbEFjdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSB7IERyYWZ0U2libGluZ1BhaXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9EZWxldGVIZWxwZXJcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2VNb2RlbCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Jlc291cmNlTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBTZW1hbnRpY0tleUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TZW1hbnRpY0tleUhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgRmNsQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvcm9vdFZpZXcvRmNsLmNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFJvb3RWaWV3QmFzZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL3Jvb3RWaWV3L1Jvb3RWaWV3QmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzLCBTZW1hbnRpY01hcHBpbmcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvUm91dGluZ1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBUYWJsZUFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUFQSVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlVG9hc3QgZnJvbSBcInNhcC9tL01lc3NhZ2VUb2FzdFwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCB0eXBlIFVJNUV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IHR5cGUgQmFzZU9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgRWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IE1lc3NhZ2luZyBmcm9tIFwic2FwL3VpL2NvcmUvTWVzc2FnaW5nXCI7XG5pbXBvcnQgY29yZUxpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQ3JlYXRpb25Sb3cgZnJvbSBcInNhcC91aS9tZGMvdGFibGUvQ3JlYXRpb25Sb3dcIjtcbmltcG9ydCB0eXBlIEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nXCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyXCI7XG5pbXBvcnQgdHlwZSBNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgU29ydGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvU29ydGVyXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIENvbnRleHQsIGRlZmF1bHQgYXMgT0RhdGFWNENvbnRleHQgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgT0RhdGFDb250ZXh0QmluZGluZyRQYXRjaFNlbnRFdmVudCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbEVudGl0eVR5cGUgfSBmcm9tIFwidHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5pbXBvcnQgQWN0aW9uUnVudGltZSBmcm9tIFwiLi4vQWN0aW9uUnVudGltZVwiO1xuaW1wb3J0IHtcblx0Q29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nQmxvY2ssXG5cdFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb25cbn0gZnJvbSBcIi4uL2NvbnRyb2xzL1JlY29tbWVuZGF0aW9ucy9Db25maXJtUmVjb21tZW5kYXRpb25EaWFsb2cuYmxvY2tcIjtcbmltcG9ydCB0eXBlIHsgQmFzZU1hbmlmZXN0U2V0dGluZ3MgfSBmcm9tIFwiLi4vY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgTmF2aWdhdGlvblJlYXNvbiBmcm9tIFwiLi9yb3V0aW5nL05hdmlnYXRpb25SZWFzb25cIjtcblxuY29uc3QgQ3JlYXRpb25Nb2RlID0gRkVMaWJyYXJ5LkNyZWF0aW9uTW9kZSxcblx0UHJvZ3JhbW1pbmdNb2RlbCA9IEZFTGlicmFyeS5Qcm9ncmFtbWluZ01vZGVsLFxuXHRDb25zdGFudHMgPSBGRUxpYnJhcnkuQ29uc3RhbnRzLFxuXHREcmFmdFN0YXR1cyA9IEZFTGlicmFyeS5EcmFmdFN0YXR1cyxcblx0RWRpdE1vZGUgPSBGRUxpYnJhcnkuRWRpdE1vZGUsXG5cdFN0YXJ0dXBNb2RlID0gRkVMaWJyYXJ5LlN0YXJ0dXBNb2RlLFxuXHRNZXNzYWdlVHlwZSA9IGNvcmVMaWJyYXJ5Lk1lc3NhZ2VUeXBlO1xuXG50eXBlIFNhdmVEb2N1bWVudFBhcmFtZXRlcnMgPSB7XG5cdGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yPzogYm9vbGVhbjtcblx0bWVyZ2VQYXRjaERyYWZ0PzogYm9vbGVhbjtcblx0YmluZGluZ3M/OiBPRGF0YUxpc3RCaW5kaW5nW107XG59O1xuXG50eXBlIEludGVybmFsQ3JlYXRlUGFyYW1ldGVycyA9IHtcblx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0YkZyb21EZWZlcnJlZD86IGJvb2xlYW47XG5cdGJ1c3lNb2RlPzogc3RyaW5nO1xuXHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRjcmVhdGlvblJvdz86IENyZWF0aW9uUm93O1xuXHRkYXRhPzogb2JqZWN0O1xuXHR0YWJsZUlkPzogc3RyaW5nO1xuXHRvdXRib3VuZD86IHN0cmluZztcblx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdHNlbGVjdGVkQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xufTtcblxuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIGhvb2tzIGludG8gdGhlIGVkaXQgZmxvdyBvZiB0aGUgYXBwbGljYXRpb25cbiAqXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKiBAc2luY2UgMS45MC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XCIpXG5jbGFzcyBFZGl0RmxvdyBleHRlbmRzIEJhc2VDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJvdGVjdGVkIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblxuXHRwcml2YXRlIGRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uPzogRnVuY3Rpb247XG5cblx0cHJpdmF0ZSBzZXNzaW9uVGltZW91dEZ1bmN0aW9uPzogRnVuY3Rpb247XG5cblx0cHJpdmF0ZSBzdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24/OiBGdW5jdGlvbjtcblxuXHRwcml2YXRlIHN5bmNUYXNrczogUHJvbWlzZTx1bmtub3duPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG5cdHByaXZhdGUgYWN0aW9uUHJvbWlzZT86IFByb21pc2U8eyBjb250cm9sSWQ/OiBzdHJpbmc7IG9EYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsga2V5czogc3RyaW5nW10gfT47XG5cblx0cHJpdmF0ZSBjb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nPzogQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nQmxvY2s7XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gUHVibGljIG1ldGhvZHNcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHRnZXRJbnRlcmZhY2UoKTogQmFzZU9iamVjdCB7XG5cdFx0cmV0dXJuIHN1cGVyLmdldEludGVyZmFjZSgpO1xuXHR9XG5cblx0Z2V0QXBwQ29tcG9uZW50KCk6IEFwcENvbXBvbmVudCB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZHJhZnQgZG9jdW1lbnQgZm9yIHRoZSBleGlzdGluZyBhY3RpdmUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGVkaXRhYmxlIGRvY3VtZW50IGlzIGF2YWlsYWJsZSB3aXRoIHRoZSBlZGl0YWJsZSBjb250ZXh0XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGVkaXREb2N1bWVudChjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IHZvaWQ+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCByb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRjb25zdCBtb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCB2aWV3RGF0YSA9IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgQmFzZU1hbmlmZXN0U2V0dGluZ3M7XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KTtcblx0XHRsZXQgcm9vdENvbnRleHQ6IENvbnRleHQgPSBjb250ZXh0O1xuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdGNvbnN0IGdyb3VwSWQgPSBcImVkaXRHcm91cFwiO1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAoKHZpZXdEYXRhPy52aWV3TGV2ZWwgYXMgbnVtYmVyKSA+IDEpIHtcblx0XHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgfHwgcHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0XHRyb290Q29udGV4dCA9IChhd2FpdCBDb21tb25VdGlscy5jcmVhdGVSb290Q29udGV4dChwcm9ncmFtbWluZ01vZGVsLCB2aWV3LCB0aGlzLmdldEFwcENvbXBvbmVudCgpKSkgYXMgQ29udGV4dDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRWRpdCh7IGNvbnRleHQ6IHJvb3RDb250ZXh0IH0pO1xuXG5cdFx0XHRjb25zdCByaWdodG1vc3RDb250ZXh0ID0gdGhpcy5faXNGY2xFbmFibGVkKCkgPyAocm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSA6IGNvbnRleHQ7XG5cdFx0XHRjb25zdCBuZXdEb2N1bWVudENvbnRleHRQcm9taXNlID0gdHJhbnNhY3Rpb25IZWxwZXIuZWRpdERvY3VtZW50KFxuXHRcdFx0XHRyb290Q29udGV4dCxcblx0XHRcdFx0dGhpcy5iYXNlLmdldFZpZXcoKSxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRncm91cElkXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3Qgcm9vdENvbnRleHRJbmZvID0ge1xuXHRcdFx0XHRyb290U2libGluZ1BhdGhQcm9taXNlOiBuZXdEb2N1bWVudENvbnRleHRQcm9taXNlXG5cdFx0XHR9O1xuXHRcdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsLCBtb2RlbCk7XG5cblx0XHRcdGxldCBzaWJsaW5nSW5mb1Byb21pc2U7XG5cdFx0XHQvLyByaWdodG1vc3RDb250ZXh0ID09PSByb290Q29udGV4dCA9PiB3ZSdyZSBpbiBPUC4gSWYgbm90LCB3ZSdyZSBpbiBtdWx0aS1jb2x1bW4gbGF5b3V0IG9mIEZDTFxuXHRcdFx0Y29uc3QgY29tcHV0ZVNpYmxpbmdJbmZvID0gcmlnaHRtb3N0Q29udGV4dCAhPT0gcm9vdENvbnRleHQgfHwgKHZpZXdEYXRhPy52aWV3TGV2ZWwgYXMgbnVtYmVyKSA+IDE7XG5cdFx0XHRpZiAoY29tcHV0ZVNpYmxpbmdJbmZvKSB7XG5cdFx0XHRcdHNpYmxpbmdJbmZvUHJvbWlzZSA9IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0cm9vdENvbnRleHQsXG5cdFx0XHRcdFx0cmlnaHRtb3N0Q29udGV4dCxcblx0XHRcdFx0XHRwcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0cm9vdENvbnRleHRJbmZvLFxuXHRcdFx0XHRcdGdyb3VwSWRcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdGNvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChncm91cElkKTtcblxuXHRcdFx0bGV0IHNpYmxpbmdJbmZvID0gYXdhaXQgc2libGluZ0luZm9Qcm9taXNlO1xuXHRcdFx0Y29uc3QgbmV3RG9jdW1lbnRDb250ZXh0ID0gKGF3YWl0IG5ld0RvY3VtZW50Q29udGV4dFByb21pc2UpIGFzIENvbnRleHQ7XG5cdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGU6IENvbnRleHQgfCB1bmRlZmluZWQgPSBuZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRpZiAoY29tcHV0ZVNpYmxpbmdJbmZvKSB7XG5cdFx0XHRcdGlmIChzaWJsaW5nSW5mbyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdFx0cm9vdENvbnRleHQsXG5cdFx0XHRcdFx0XHRyaWdodG1vc3RDb250ZXh0LFxuXHRcdFx0XHRcdFx0cHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0XHRyb290Q29udGV4dEluZm8sXG5cdFx0XHRcdFx0XHRcIiRhdXRvXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gdGhpcy5fZ2V0TmF2aWdhdGlvblRhcmdldEZvckVkaXQoY29udGV4dCwgbmV3RG9jdW1lbnRDb250ZXh0LCBzaWJsaW5nSW5mbyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShbXSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChuZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSwgZmFsc2UpO1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQoZmFsc2UpO1xuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblxuXHRcdFx0XHRpZiAobmV3RG9jdW1lbnRDb250ZXh0ICE9PSByb290Q29udGV4dCkge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyRWRpdCh7IGNvbnRleHQ6IGNvbnRleHRUb05hdmlnYXRlIH0pO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUgYXMgQ29udGV4dCwge1xuXHRcdFx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRyZWNyZWF0ZUNvbnRleHQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0Zm9yY2VGb2N1czogdHJ1ZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhlIHN0aWNreU9uIGhhbmRsZXIgbXVzdCBiZSBzZXQgYWZ0ZXIgdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gZG9uZSxcblx0XHRcdFx0XHRcdC8vIGFzIHRoZSBVUkwgbWF5IGNoYW5nZSBpbiB0aGUgY2FzZSBvZiBGQ0xcblx0XHRcdFx0XHRcdGxldCBzdGlja3lDb250ZXh0OiBDb250ZXh0O1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFdlIG5lZWQgdG8gdXNlIHRoZSBrZXB0LWFsaXZlIGNvbnRleHQgdXNlZCB0byBiaW5kIHRoZSBwYWdlXG5cdFx0XHRcdFx0XHRcdHN0aWNreUNvbnRleHQgPSBuZXdEb2N1bWVudENvbnRleHQ/LmdldE1vZGVsKCkuZ2V0S2VlcEFsaXZlQ29udGV4dChuZXdEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHN0aWNreUNvbnRleHQgPSBuZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9uKHN0aWNreUNvbnRleHQpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoTW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobW9kZWwuZ2V0TWV0YU1vZGVsKCkpKSB7XG5cdFx0XHRcdFx0XHQvLyBhY2NvcmRpbmcgdG8gVVggaW4gY2FzZSBvZiBlbmFibGVkIGNvbGxhYm9yYXRpb24gZHJhZnQgd2Ugc2hhcmUgdGhlIG9iamVjdCBpbW1lZGlhdGVseVxuXHRcdFx0XHRcdFx0YXdhaXQgc2hhcmVPYmplY3QobmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIGNvbnRleHRUb05hdmlnYXRlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGVkaXRpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyB0aGUgc2lkZSBlZmZlY3RzIHJlcXVpcmVkIGFmdGVyIGRlbGV0aW5nIGFuIG9iamVjdC5cblx0ICpcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmcgdGhlIGRlbGV0ZWQgb2JqZWN0IGJlbG9uZ3MgdG9cblx0ICogQHBhcmFtIHBhcmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgcGFyZW50IG9iamVjdCBvZiB0aGUgZGVsZXRlZCBvYmplY3Rcblx0ICovXG5cdHByaXZhdGUgcmVxdWVzdFNpZGVFZmZlY3RzT25EZWxldGUobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcgfCB1bmRlZmluZWQsIHBhcmVudENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQpOiB2b2lkIHtcblx0XHRpZiAoIWxpc3RCaW5kaW5nIHx8ICFwYXJlbnRDb250ZXh0IHx8IENvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHNpZGVFZmZlY3RTZXJ2aWNlID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHRzaWRlRWZmZWN0U2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBwYXJlbnRDb250ZXh0KTtcblxuXHRcdGNvbnN0IHN0YXRlTWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKGxpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksIHBhcmVudENvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHQvLyBJbiBjYXNlIG9mIGEgVHJlZVRhYmxlLCB3ZSBuZWVkIHRvIHJlZnJlc2ggc3RhdGUgbWVzc2FnZXMgZm9yIHRoZSBPYmplY3RQYWdlLCBhcyBzb21lIG9mIHRoZXNlIG1lc3NhZ2VzIG1pZ2h0IGJlIGF0dGFjaGVkXG5cdFx0Ly8gdG8gY2hpbGRyZW4gb2YgYSBkZWxldGVkIHJvdyB3aGljaCBtYXkgbm90IGhhdmUgYmVlbiBsb2FkZWQgeWV0LCBhbmQgdGhlcmVmb3JlIHRoZSBtb2RlbCB3b3VsZG4ndCBjbGVhbiB1cCB0aGVzZSBtZXNzYWdlc1xuXHRcdGlmIChzdGF0ZU1lc3NhZ2VzUGF0aCAmJiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdHNpZGVFZmZlY3RTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhbc3RhdGVNZXNzYWdlc1BhdGhdLCBwYXJlbnRDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGVsZXRlcyBzZXZlcmFsIGRvY3VtZW50cy5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHRzVG9EZWxldGUgVGhlIGNvbnRleHRzIG9mIHRoZSBkb2N1bWVudHMgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBUaGUgcGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFja1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY29udHJvbElkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2xcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLm5vRGlhbG9nXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgZG9jdW1lbnRzIGFyZSBkZWxldGVkXG5cdCAqL1xuXHRhc3luYyBkZWxldGVNdWx0aXBsZURvY3VtZW50cyhcblx0XHRjb250ZXh0c1RvRGVsZXRlOiBDb250ZXh0W10sXG5cdFx0cGFyYW1ldGVyczoge1xuXHRcdFx0YmVmb3JlRGVsZXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0XHRcdHJlcXVlc3RTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRjb250cm9sSWQ6IHN0cmluZztcblx0XHRcdG5vRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdHBhcmVudENvbnRyb2w/OiBDb250cm9sO1xuXHRcdFx0YkZpbmRBY3RpdmVDb250ZXh0cz86IGJvb2xlYW47XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0cGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZTtcblx0XHRwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cyA9IHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzICE9PSBmYWxzZTtcblxuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCBwYXJlbnRDb250cm9sID0gdGhpcy5nZXRWaWV3KCkuYnlJZChwYXJhbWV0ZXJzLmNvbnRyb2xJZCkgPz8gRWxlbWVudC5nZXRFbGVtZW50QnlJZChwYXJhbWV0ZXJzLmNvbnRyb2xJZCk7XG5cdFx0bGV0IGluYWN0aXZlQ29udGV4dHNUb0RlbGV0ZTogQ29udGV4dFtdID0gW107XG5cdFx0aWYgKHBhcmVudENvbnRyb2w/LmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRpbmFjdGl2ZUNvbnRleHRzVG9EZWxldGUgPSBjb250ZXh0c1RvRGVsZXRlLmZpbHRlcigoY29udGV4dCkgPT4gY29udGV4dC5pc0luYWN0aXZlKCkpO1xuXHRcdH1cblx0XHRpZiAoIXBhcmVudENvbnRyb2wpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInBhcmFtZXRlciBjb250cm9sSWQgbWlzc2luZyBvciBpbmNvcnJlY3RcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCA9IHBhcmVudENvbnRyb2wgYXMgQ29udHJvbDtcblx0XHR9XG5cdFx0Y29uc3QgbGlzdEJpbmRpbmcgPSAocGFyZW50Q29udHJvbC5nZXRCaW5kaW5nKFwiaXRlbXNcIikgfHwgKHBhcmVudENvbnRyb2wgYXMgVGFibGUpLmdldFJvd0JpbmRpbmcoKSkgYXMgT0RhdGFMaXN0QmluZGluZztcblx0XHRwYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHMgPSB0cnVlO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhsb2NrT2JqZWN0KTtcblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAodGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKHBhcmFtZXRlcnM/LnNlbGVjdGVkQ29udGV4dHM/LlswXSA/PyBjb250ZXh0c1RvRGVsZXRlWzBdKSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdFx0fVxuXHRcdFx0YXdhaXQgdGhpcy5kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKGNvbnRleHRzVG9EZWxldGUsIHBhcmFtZXRlcnMpO1xuXG5cdFx0XHRsZXQgcmVzdWx0O1xuXG5cdFx0XHQvLyBNdWx0aXBsZSBvYmplY3QgZGVsZXRpb24gaXMgdHJpZ2dlcmVkIGZyb20gYSBsaXN0XG5cdFx0XHQvLyBGaXJzdCBjbGVhciB0aGUgc2VsZWN0aW9uIGluIHRoZSB0YWJsZSBhcyBpdCdzIG5vdCB2YWxpZCBhbnkgbW9yZVxuXHRcdFx0aWYgKHBhcmVudENvbnRyb2wuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0cGFyZW50Q29udHJvbC5jbGVhclNlbGVjdGlvbigpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaGVuIHJlZnJlc2ggdGhlIGxpc3QtYmluZGluZyAoTFIpLCBvciByZXF1aXJlIHNpZGUtZWZmZWN0cyAoT1ApXG5cdFx0XHRjb25zdCB2aWV3QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRpZiAobGlzdEJpbmRpbmcuaXNSb290KCkpIHtcblx0XHRcdFx0Ly8ga2VlcCBwcm9taXNlIGNoYWluIHBlbmRpbmcgdW50aWwgcmVmcmVzaCBvZiBsaXN0YmluZGluZyBpcyBjb21wbGV0ZWRcblx0XHRcdFx0aWYgKHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHRcdC8vIFdlIHVzZSBhIHNpZGUtZWZmZWN0IHJlZnJlc2ggZm9yIGEgVHJlZVRhYmxlLCB0byBwcmVzZXJ2ZSBleHBhbnNpb24gc3RhdGVzXG5cdFx0XHRcdFx0cmVzdWx0ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKVxuXHRcdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBcIlwiIH1dLCBsaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkhKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXN1bHQgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuXHRcdFx0XHRcdFx0bGlzdEJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlY2VpdmVkXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0bGlzdEJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzT25EZWxldGUobGlzdEJpbmRpbmcsIHZpZXdCaW5kaW5nQ29udGV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGRlbGV0aW5nIGF0IGxlYXN0IG9uZSBvYmplY3Qgc2hvdWxkIGFsc28gc2V0IHRoZSBVSSB0byBkaXJ0eVxuXHRcdFx0aWYgKCF0aGlzLmdldEFwcENvbXBvbmVudCgpLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGlzUmVjb21tZW5kYXRpb25FbmFibGVkID0gdGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5pc1JlY29tbWVuZGF0aW9uRW5hYmxlZCgpO1xuXHRcdFx0Ly8gV2UgY2xlYXIgcmVjb21tZW5kYXRpb24gZGF0YSBhbmQgY29udGV4dHMgZnJvbSBpbnRlcm5hbCBtb2RlbCBmb3IgdGhlIGRlbGV0ZWQgY29udGV4dHNcblx0XHRcdGlmIChpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCkge1xuXHRcdFx0XHR0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLmlnbm9yZVJlY29tbWVuZGF0aW9uRm9yQ29udGV4dHMoY29udGV4dHNUb0RlbGV0ZSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBOb3RpZnkgY29uc3VtZXJzIG9mIHdoaWNoIGNvbnRleHRzIHdlcmUgZGVsZXRlZFxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJEZWxldGUoeyBjb250ZXh0czogY29udGV4dHNUb0RlbGV0ZSB9KTtcblxuXHRcdFx0aWYgKHBhcmVudENvbnRyb2wuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0Y29uc3QgdGFibGVBUEkgPSBwYXJlbnRDb250cm9sLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0dGFibGVBUEk/LnRhYmxlRGVmaW5pdGlvbj8uY29udHJvbD8uY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzICYmXG5cdFx0XHRcdFx0aW5hY3RpdmVDb250ZXh0c1RvRGVsZXRlLmxlbmd0aCA+IDBcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0dGFibGVBUEkucmVtb3ZlRW1wdHlSb3dzTWVzc2FnZXMoaW5hY3RpdmVDb250ZXh0c1RvRGVsZXRlKTtcblx0XHRcdFx0XHRhd2FpdCB0YWJsZUFQSS5zZXRVcEVtcHR5Um93cyhwYXJlbnRDb250cm9sLCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRlbGV0ZSwgY29udGV4dHNUb0RlbGV0ZSk7XG5cblx0XHRcdHJldHVybiBhd2FpdCByZXN1bHQ7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRlbGV0aW5nIHRoZSBkb2N1bWVudChzKVwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayhsb2NrT2JqZWN0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgZHJhZnQgc3RhdHVzIGFuZCBkaXNwbGF5cyB0aGUgZXJyb3IgbWVzc2FnZXMgaWYgdGhlcmUgYXJlIGVycm9ycyBkdXJpbmcgYW4gdXBkYXRlLlxuXHQgKlxuXHQgKiBAcGFyYW0gdXBkYXRlZENvbnRleHQgQ29udGV4dCBvZiB0aGUgdXBkYXRlZCBmaWVsZFxuXHQgKiBAcGFyYW0gdXBkYXRlUHJvbWlzZSBQcm9taXNlIHRvIGRldGVybWluZSB3aGVuIHRoZSB1cGRhdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZC4gVGhlIHByb21pc2Ugc2hvdWxkIGJlIHJlc29sdmVkIHdoZW4gdGhlIHVwZGF0ZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBzbyB0aGUgZHJhZnQgc3RhdHVzIGNhbiBiZSB1cGRhdGVkLlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZHJhZnQgc3RhdHVzIGhhcyBiZWVuIHVwZGF0ZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgdXBkYXRlRG9jdW1lbnQodXBkYXRlZENvbnRleHQ6IG9iamVjdCwgdXBkYXRlUHJvbWlzZTogUHJvbWlzZTx1bmtub3duPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9yaWdpbmFsQmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IGlzRHJhZnQgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwodXBkYXRlZENvbnRleHQgYXMgQmluZGluZyB8IENvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXG5cdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdHJldHVybiB0aGlzLnN5bmNUYXNrKGFzeW5jICgpID0+IHtcblx0XHRcdGlmIChvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGlzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgdXBkYXRlUHJvbWlzZTtcblx0XHRcdFx0Y29uc3QgY3VycmVudEJpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmICghaXNEcmFmdCB8fCAhY3VycmVudEJpbmRpbmdDb250ZXh0IHx8IGN1cnJlbnRCaW5kaW5nQ29udGV4dCAhPT0gb3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHRcdC8vIElmIGEgbmF2aWdhdGlvbiBoYXBwZW5lZCB3aGlsZSBvUHJvbWlzZSB3YXMgYmVpbmcgcmVzb2x2ZWQsIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2UgY2hhbmdlZFxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFdlJ3JlIHN0aWxsIG9uIHRoZSBzYW1lIGNvbnRleHRcblx0XHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gY3VycmVudEJpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IGVudGl0eVNldE5hbWUgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY3VycmVudEJpbmRpbmdDb250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIik7XG5cdFx0XHRcdGNvbnN0IHNlbWFudGljS2V5cyA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljS2V5cyhtZXRhTW9kZWwsIGVudGl0eVNldE5hbWUpO1xuXHRcdFx0XHRpZiAoc2VtYW50aWNLZXlzPy5sZW5ndGgpIHtcblx0XHRcdFx0XHRjb25zdCBjdXJyZW50U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudFNlbWFudGljUGF0aCA9IGN1cnJlbnRTZW1hbnRpY01hcHBpbmc/LnNlbWFudGljUGF0aCxcblx0XHRcdFx0XHRcdHNDaGFuZ2VkUGF0aCA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljUGF0aChjdXJyZW50QmluZGluZ0NvbnRleHQsIHRydWUpO1xuXHRcdFx0XHRcdC8vIGN1cnJlbnRTZW1hbnRpY1BhdGggY291bGQgYmUgbnVsbCBpZiB3ZSBoYXZlIG5hdmlnYXRlZCB2aWEgZGVlcCBsaW5rIHRoZW4gdGhlcmUgYXJlIG5vIHNlbWFudGljTWFwcGluZ3MgdG8gY2FsY3VsYXRlIGl0IGZyb21cblx0XHRcdFx0XHRpZiAoY3VycmVudFNlbWFudGljUGF0aCAmJiBjdXJyZW50U2VtYW50aWNQYXRoICE9PSBzQ2hhbmdlZFBhdGgpIHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY3VycmVudEJpbmRpbmdDb250ZXh0LCB7IGVkaXRhYmxlOiB0cnVlLCByZWNyZWF0ZUNvbnRleHQ6IGZhbHNlIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgdXBkYXRpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdGlmIChpc0RyYWZ0ICYmIG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0YXdhaXQgdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRQYXJlbnRDb250ZXh0RnJvbVNlbGVjdGlvbihzZWxlY3RlZENvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdIHwgdW5kZWZpbmVkKTogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQge1xuXHRcdGlmIChzZWxlY3RlZENvbnRleHRzICYmIHNlbGVjdGVkQ29udGV4dHMubGVuZ3RoID4gMSkge1xuXHRcdFx0Ly8gT25lIHBhcmVudCBhdCBtb3N0ICEhXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUgYSBuZXcgZG9jdW1lbnQgaW4gYSBUcmVlVGFibGUgd2l0aCAke3NlbGVjdGVkQ29udGV4dHMubGVuZ3RofSBwYXJlbnRzYCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNlbGVjdGVkQ29udGV4dHM/Lmxlbmd0aCA9PT0gMSA/IHNlbGVjdGVkQ29udGV4dHNbMF0gOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gKiBAcGFyYW0ge3N0cmluZ30gbVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBTeW5jIC0gdGhlIGNyZWF0aW9uIGlzIHRyaWdnZXJlZCBhbmQgb25jZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZCwgdGhlIG5hdmlnYXRpb24gaXMgZG9uZVxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBBc3luYyAtIHRoZSBjcmVhdGlvbiBhbmQgdGhlIG5hdmlnYXRpb24gdG8gdGhlIGluc3RhbmNlIGFyZSBkb25lIGluIHBhcmFsbGVsXG5cdC8vICogICAgICAgICAgICAgICAgICAgIERlZmVycmVkIC0gdGhlIGNyZWF0aW9uIGlzIGRvbmUgb24gdGhlIHRhcmdldCBwYWdlXG5cdC8vICogICAgICAgICAgICAgICAgICAgIENyZWF0aW9uUm93IC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW5saW5lIGFzeW5jIHNvIHRoZSB1c2VyIGlzIG5vdCBibG9ja2VkXG5cdC8vIG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93IEluc3RhbmNlIG9mIHRoZSBjcmVhdGlvbiByb3cgLSAoVE9ETzogZ2V0IHJpZCBidXQgdXNlIGxpc3QgYmluZGluZ3Mgb25seSlcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudC5cblx0ICpcblx0ICogQHBhcmFtIHZMaXN0QmluZGluZyAgT0RhdGFMaXN0QmluZGluZyBvYmplY3Qgb3IgdGhlIGJpbmRpbmcgcGF0aCBmb3IgYSB0ZW1wb3JhcnkgbGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nOjxici8+XG5cdCAqICAgICAgICAgICAgICAgICAgICBOZXdQYWdlIC0gdGhlIGNyZWF0ZWQgZG9jdW1lbnQgaXMgc2hvd24gaW4gYSBuZXcgcGFnZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgbWV0YWRhdGEgJ1N5bmMnLCAnQXN5bmMnIG9yICdEZWZlcnJlZCcgaXMgdXNlZDxici8+XG5cdCAqICAgICAgICAgICAgICAgICAgICBJbmxpbmUgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbmxpbmUgKGluIGEgdGFibGUpPGJyLz5cblx0ICogICAgICAgICAgICAgICAgICAgIEV4dGVybmFsIC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW4gYSBkaWZmZXJlbnQgYXBwbGljYXRpb24gc3BlY2lmaWVkIHZpYSB0aGUgcGFyYW1ldGVyICdvdXRib3VuZCdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMudGFibGVJZCBJRCBvZiB0aGUgdGFibGVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMub3V0Ym91bmQgVGhlIG5hdmlnYXRpb24gdGFyZ2V0IHdoZXJlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkIGluIGNhc2Ugb2YgY3JlYXRpb25Nb2RlICdFeHRlcm5hbCdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgU3BlY2lmaWVzIGlmIHRoZSBuZXcgZW50cnkgc2hvdWxkIGJlIGNyZWF0ZWQgYXQgdGhlIHRvcCBvciBib3R0b20gb2YgYSB0YWJsZSBpbiBjYXNlIG9mIGNyZWF0aW9uTW9kZSAnSW5saW5lJ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5kYXRhIFRoZSBpbml0aWFsIGRhdGEgZm9yIHRoZSBjcmVhdGVkIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuYkZyb21EZWZlcnJlZCBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmJ1c3lNb2RlIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY3JlYXRpb25Sb3cgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cyBUaGUgY29udGV4dHMgdGhhdCBhcmUgc2VsZWN0ZWQgaW4gdGhlIHRhYmxlIGluaXRpYXRpbmcgdGhlIGNyZWF0aW9uLiBVc2VkIGluIGNhc2Ugb2YgYSBUcmVlVGFibGUgdG8gZGV0ZXJtaW5lIHRoZSBwYXJlbnQgY29udGV4dCBvZiB0aGUgY3JlYXRlZCBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5zaW5nbGVEcmFmdEZvckNyZWF0ZSBXaGVuIGVuYWJsZWQsIGFuIGV4dHJhIHJlcXVlc3QgY2hlY2tzIGlmIGFueSBkcmFmdHMgZXhpc3QgdGhhdCB3ZXJlIG5ldmVyIHNhdmVkLiBJZiB1bnNhdmVkIGRyYWZ0cyBhcmUgZm91bmQsIHRoZSBuZXdlc3Qgb25lIGlzIG9wZW5lZC4gSWYgbm8gdW5zYXZlZCBkcmFmdHMgYXJlIGZvdW5kLCBhIG5ldyBlbnRpdHkgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGNyZWF0ZURvY3VtZW50KFxuXHRcdHZMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHN0cmluZyxcblx0XHRtSW5QYXJhbWV0ZXJzOiB7XG5cdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjaz86IEZ1bmN0aW9uO1xuXHRcdFx0YkZyb21EZWZlcnJlZD86IGJvb2xlYW47XG5cdFx0XHRidXN5TW9kZT86IHN0cmluZztcblx0XHRcdGNyZWF0ZUFjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdFx0XHRjcmVhdGlvbk1vZGU6IHN0cmluZztcblx0XHRcdGNyZWF0aW9uUm93PzogQ3JlYXRpb25Sb3c7XG5cdFx0XHRkYXRhPzogb2JqZWN0O1xuXHRcdFx0dGFibGVJZD86IHN0cmluZztcblx0XHRcdG91dGJvdW5kPzogc3RyaW5nO1xuXHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cz86IE9EYXRhVjRDb250ZXh0W107XG5cdFx0XHRzaW5nbGVEcmFmdEZvckNyZWF0ZT86IGJvb2xlYW47XG5cdFx0fVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgb0RhdGFMaXN0QmluZGluZyE6IE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0bGV0IHBhcmVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkO1xuXG5cdFx0aWYgKG1JblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWwpIHtcblx0XHRcdGlmICh0eXBlb2Ygdkxpc3RCaW5kaW5nID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdGNvbnN0IG9EYXRhTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpO1xuXHRcdFx0XHRpZiAoIW9EYXRhTW9kZWwpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0b0RhdGFMaXN0QmluZGluZyA9IG9EYXRhTW9kZWwuYmluZExpc3Qodkxpc3RCaW5kaW5nKSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdFx0XHRtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9IENyZWF0aW9uTW9kZS5TeW5jO1xuXHRcdFx0XHRkZWxldGUgbUluUGFyYW1ldGVycy5jcmVhdGVBdEVuZDtcblx0XHRcdH0gZWxzZSBpZiAodkxpc3RCaW5kaW5nLmlzQTxPRGF0YUxpc3RCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmcgPSB2TGlzdEJpbmRpbmc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIG9iamVjdCBvciBwYXRoIGV4cGVjdGVkXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwob0RhdGFMaXN0QmluZGluZykpIHtcblx0XHRcdFx0cGFyZW50Q29udGV4dCA9IHRoaXMuZ2V0UGFyZW50Q29udGV4dEZyb21TZWxlY3Rpb24obUluUGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCByZXNvbHZlZENyZWF0aW9uTW9kZSA9IHRoaXMucmVzb2x2ZUNyZWF0aW9uTW9kZShtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSwgb0RhdGFMaXN0QmluZGluZywgbUluUGFyYW1ldGVycy5kYXRhKTtcblxuXHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGVyUHJveHkoKS5yZW1vdmVJQXBwU3RhdGVLZXkoKTtcblxuXHRcdGlmIChcblx0XHRcdChtSW5QYXJhbWV0ZXJzLnNpbmdsZURyYWZ0Rm9yQ3JlYXRlICE9PSB1bmRlZmluZWRcblx0XHRcdFx0PyBtSW5QYXJhbWV0ZXJzLnNpbmdsZURyYWZ0Rm9yQ3JlYXRlXG5cdFx0XHRcdDogdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRNYW5pZmVzdCgpW1wic2FwLmZlXCJdPy5hcHA/LnNpbmdsZURyYWZ0Rm9yQ3JlYXRlKSAmJlxuXHRcdFx0b0RhdGFMaXN0QmluZGluZyA9PT0gb0RhdGFMaXN0QmluZGluZy5nZXRSb290QmluZGluZygpICYmXG5cdFx0XHRvRGF0YUxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSAhPT0gbnVsbFxuXHRcdCkge1xuXHRcdFx0Y29uc3QgbmV3QmluZGluZyA9IG9EYXRhTGlzdEJpbmRpbmcuZ2V0TW9kZWwoKT8uYmluZExpc3QoXG5cdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nLmdldENvbnRleHQoKSxcblx0XHRcdFx0bmV3IFNvcnRlcihcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0xhc3RDaGFuZ2VEYXRlVGltZVwiLCB0cnVlKSxcblx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0ZmlsdGVyczogW1xuXHRcdFx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRcdHBhdGg6IFwiSXNBY3RpdmVFbnRpdHlcIixcblx0XHRcdFx0XHRcdFx0b3BlcmF0b3I6IFwiRVFcIixcblx0XHRcdFx0XHRcdFx0dmFsdWUxOiBmYWxzZVxuXHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRcdFx0cGF0aDogXCJIYXNBY3RpdmVFbnRpdHlcIixcblx0XHRcdFx0XHRcdFx0b3BlcmF0b3I6IFwiRVFcIixcblx0XHRcdFx0XHRcdFx0dmFsdWUxOiBmYWxzZVxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdGFuZDogdHJ1ZVxuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5ld0JpbmRpbmc/LnJlcXVlc3RDb250ZXh0cygwLCAxKTtcblx0XHRcdGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5faGFuZGxlTmV3Q29udGV4dChyZXN1bHRbMF0sIHsgZWRpdGFibGU6IHRydWUsIHJlY3JlYXRlQ29udGV4dDogZmFsc2UgfSkudGhlbigoKSA9PiBuZXdCaW5kaW5nPy5kZXN0cm95KCkpO1xuXHRcdFx0fVxuXHRcdFx0bmV3QmluZGluZz8uZGVzdHJveSgpO1xuXHRcdFx0cmV0dXJuIHRoaXMuX2hhbmRsZUNyZWF0aW9uTW9kZShyZXNvbHZlZENyZWF0aW9uTW9kZSwgdkxpc3RCaW5kaW5nLCBtSW5QYXJhbWV0ZXJzLCBvRGF0YUxpc3RCaW5kaW5nLCBwYXJlbnRDb250ZXh0KTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuX2hhbmRsZUNyZWF0aW9uTW9kZShyZXNvbHZlZENyZWF0aW9uTW9kZSwgdkxpc3RCaW5kaW5nLCBtSW5QYXJhbWV0ZXJzLCBvRGF0YUxpc3RCaW5kaW5nLCBwYXJlbnRDb250ZXh0KTtcblx0fVxuXG5cdGFzeW5jIF9oYW5kbGVDcmVhdGlvbk1vZGUoXG5cdFx0cmVzb2x2ZWRDcmVhdGlvbk1vZGU6IHN0cmluZyxcblx0XHR2TGlzdEJpbmRpbmc6IHN0cmluZyB8IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0cGFyYW1ldGVyczogSW50ZXJuYWxDcmVhdGVQYXJhbWV0ZXJzLFxuXHRcdG9EYXRhTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0cGFyZW50Q29udGV4dDogQ29udGV4dCB8IHVuZGVmaW5lZFxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShbXSk7XG5cdFx0c3dpdGNoIChyZXNvbHZlZENyZWF0aW9uTW9kZSkge1xuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWw6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUV4dGVybmFsRG9jdW1lbnQodkxpc3RCaW5kaW5nLCBwYXJhbWV0ZXJzLm91dGJvdW5kKTtcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkRlZmVycmVkOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVEZWZlcnJlZERvY3VtZW50KG9EYXRhTGlzdEJpbmRpbmcsIHBhcmVudENvbnRleHQsIHBhcmFtZXRlcnMuZGF0YSk7XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdzpcblx0XHRcdFx0cmV0dXJuIHBhcmFtZXRlcnMuY3JlYXRpb25Sb3dcblx0XHRcdFx0XHQ/IHRoaXMuY3JlYXRlQ3JlYXRlUm93RG9jdW1lbnQoe1xuXHRcdFx0XHRcdFx0XHRjcmVhdGlvblJvdzogcGFyYW1ldGVycy5jcmVhdGlvblJvdyxcblx0XHRcdFx0XHRcdFx0c2tpcFNpZGVFZmZlY3RzOiBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmRcblx0XHRcdFx0XHQgIH0pXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5JbmxpbmU6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUlubGluZURvY3VtZW50KFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHRhYmxlSWQ6IHBhcmFtZXRlcnMudGFibGVJZCxcblx0XHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRcdFx0c2tpcFNpZGVFZmZlY3RzOiBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdHBhcmVudENvbnRleHQsXG5cdFx0XHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGFcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmdcblx0XHRcdFx0KTtcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLlN5bmM6XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5Bc3luYzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlU3luY0FzeW5jRG9jdW1lbnQoXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y3JlYXRpb25Nb2RlOiByZXNvbHZlZENyZWF0aW9uTW9kZSxcblx0XHRcdFx0XHRcdGRhdGE6IHBhcmFtZXRlcnMuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0XHRcdFx0XHRcdGJGcm9tRGVmZXJyZWQ6IHBhcmFtZXRlcnMuYkZyb21EZWZlcnJlZCxcblx0XHRcdFx0XHRcdHNraXBTaWRlRWZmZWN0czogcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRjcmVhdGVBY3Rpb246IHBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uLFxuXHRcdFx0XHRcdFx0cGFyZW50Q29udGV4dFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b0RhdGFMaXN0QmluZGluZ1xuXHRcdFx0XHQpO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgY3JlYXRpb25Nb2RlICR7cmVzb2x2ZWRDcmVhdGlvbk1vZGV9YCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqRXhlY3V0ZXMgdGhlIG1hbmRhdG9yeSBjb25maWd1cmF0aW9uIGFmdGVyIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBjcmVhdGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gcHJlcmVxdWlzaXRlIFByb21pc2Ugb2YgdGhlIGRvY3VtZW50IGNyZWF0aW9uIGFuZCB0aGUgZm9sbG93aW5nIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBjb25maWd1cmF0aW9uIGlzIGRvbmVcblx0ICovXG5cdGFzeW5jIHBvc3REb2N1bWVudENyZWF0aW9uKHByZXJlcXVpc2l0ZTogUHJvbWlzZTxbQ29udGV4dCwgdW5rbm93bl0+LCBsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWw6IHN0cmluZyA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChsaXN0QmluZGluZyk7XG5cdFx0Y29uc3QgbW9kZWwgPSBsaXN0QmluZGluZy5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IHBhcmFtcyA9IGF3YWl0IHByZXJlcXVpc2l0ZTtcblx0XHRjb25zdCBuZXdEb2N1bWVudENvbnRleHQgPSBwYXJhbXNbMF07XG5cdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsLCBtb2RlbCk7XG5cdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJDcmVhdGUoeyBjb250ZXh0OiBuZXdEb2N1bWVudENvbnRleHQgfSk7XG5cdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSk7IC8vIFRoZSBjcmVhdGVNb2RlIGZsYWcgd2lsbCBiZSBzZXQgaW4gY29tcHV0ZUVkaXRNb2RlXG5cdFx0aWYgKCFsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHQvLyBXb3JrYXJvdW5kIHRvIHRlbGwgdGhlIE9QIHRoYXQgd2UndmUgY3JlYXRlZCBhIG5ldyBvYmplY3QgZnJvbSB0aGUgTFJcblx0XHRcdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChsaXN0QmluZGluZy5nZXRQYXRoKCkpO1xuXHRcdFx0XHRjb25zdCBlbnRpdHlTZXQgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnN0YXJ0aW5nRW50aXR5U2V0IGFzIEVudGl0eVNldDtcblx0XHRcdFx0Y29uc3QgbmV3QWN0aW9uID0gZW50aXR5U2V0Py5hbm5vdGF0aW9ucy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkPy5OZXdBY3Rpb247XG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL2xhc3RJbnZva2VkQWN0aW9uXCIsIG5ld0FjdGlvbik7XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHQvLyBDcmVhdGluZyBhIG5ldyBpdGVtIGluIGEgaGllcmFyY2h5IGZyb20gdGhlIExpc3RSZXBvcnQgKHNpbmNlIHRoZSBsaXN0QmluZGluZyBpcyBub3QgcmVsYXRpdmUpXG5cdFx0XHRcdC8vIC0tPiB3ZSB3YW50IHRvIGZvcmNlIHRoZSB1c2VyIHRvIGVpdGhlciBzYXZlIG9yIGRpc2NhcmQgdGhlIGRyYWZ0IGJlZm9yZSBsZWF2aW5nIHRoZSBPUFxuXHRcdFx0XHR0aGlzLmZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkKHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAobmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWRPbkNyZWF0ZShsaXN0QmluZGluZyk7XG5cdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkNyZWF0ZSwgbmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdGlmIChcblx0XHRcdFx0TW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobW9kZWwuZ2V0TWV0YU1vZGVsKCkpICYmXG5cdFx0XHRcdHRoaXMuaXNEcmFmdFJvb3QobmV3RG9jdW1lbnRDb250ZXh0KSAmJlxuXHRcdFx0XHQhdGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gYWNjb3JkaW5nIHRvIFVYIGluIGNhc2Ugb2YgZW5hYmxlZCBjb2xsYWJvcmF0aW9uIGRyYWZ0IHdlIHNoYXJlIHRoZSBvYmplY3QgaW1tZWRpYXRlbHlcblx0XHRcdFx0YXdhaXQgc2hhcmVPYmplY3QobmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCB2aWEgdGhlIGNyZWF0aW9uUm93LlxuXHQgKlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kIFRoZSBuZXcgZG9jdW1lbnQgaXMgY3JlYXRlZCBhdCB0aGUgZW5kLlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGlvblJvdyBUaGUgY3JlYXRpb24gcm93XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyBUaGUgc2lkZUVmZmVjdHMgYXJlIHJlcXVlc3RlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICovXG5cdGFzeW5jIGNyZWF0ZUNyZWF0ZVJvd0RvY3VtZW50KHBhcmFtZXRlcnM6IHtcblx0XHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdFx0Y3JlYXRpb25Sb3c6IENyZWF0aW9uUm93O1xuXHRcdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdGNvbnN0IGNyZWF0aW9uUm93ID0gcGFyYW1ldGVycy5jcmVhdGlvblJvdztcblx0XHRjb25zdCB0YWJsZSA9IHBhcmFtZXRlcnMuY3JlYXRpb25Sb3cuZ2V0UGFyZW50KCkgYXMgVGFibGUgfCB1bmRlZmluZWQ7XG5cdFx0bGV0IG5hdmlnYXRpb24gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRpZiAoIXRhYmxlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gdGFibGUuZ2V0TW9kZWwoKT8uZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdFx0Y29uc3QgbGlzdEJpbmRpbmcgPSB0YWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cdFx0aWYgKHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgY3JlYXRpb25Nb2RlIFwiQ3JlYXRpb25Sb3dcIiB3aXRoIGEgVHJlZVRhYmxlYCk7XG5cdFx0fVxuXHRcdGNvbnN0IGNyZWF0aW9uUm93Q29udGV4dCA9IGNyZWF0aW9uUm93LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRjb25zdCBkb2N1bWVudFZhbGlkYXRpb24gPSB0aGlzLmdldENyZWF0aW9uUm93VmFsaWRhdGlvbkZ1bmN0aW9uKHRhYmxlKTtcblx0XHQvLyBkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIGlzIHNldCB0byBmYWxzZSBpbiBtYW5pZmVzdCBjb252ZXJ0ZXIgKFRhYmxlLnRzKSBpZiBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gZXhpc3RzXG5cdFx0aWYgKGNyZWF0aW9uUm93LmRhdGEoXCJkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhXCIpID09PSBcInRydWVcIikge1xuXHRcdFx0dGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0ZpZWxkVmFsaWRpdHlcIiwge30pO1xuXHRcdH1cblxuXHRcdGNvbnN0IHZhbGlkYXRpb25NZXNzYWdlcyA9IGF3YWl0IHRoaXMuc3luY1Rhc2soZG9jdW1lbnRWYWxpZGF0aW9uKTtcblx0XHRpZiAodmFsaWRhdGlvbk1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdHRoaXMuY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzKHZhbGlkYXRpb25NZXNzYWdlcywgdGFibGUpO1xuXHRcdFx0TG9nLmVycm9yKFwiQ3VzdG9tIFZhbGlkYXRpb24gZmFpbGVkXCIpO1xuXHRcdFx0Ly8gaWYgY3VzdG9tIHZhbGlkYXRpb24gZmFpbHMsIHdlIGxlYXZlIHRoZSBtZXRob2QgaW1tZWRpYXRlbHlcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgZW50aXR5VHlwZSA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY3JlYXRpb25Sb3dDb250ZXh0LmdldFBhdGgoKSkpLnRhcmdldEVudGl0eVR5cGU7XG5cdFx0Y29uc3QgY3JlYXRpb25Sb3dQYXlsb2FkID0gY3JlYXRpb25Sb3dDb250ZXh0LmdldE9iamVjdCgpO1xuXG5cdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cblx0XHQvL21vdmVkIGFmdGVyIF9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMgdG8gYXZvaWQgXCInY3JlYXRpb24nIHVzZSBiZWZvcmUgaW5pdGlhbGl6YXRpb25cIiBjb25zb2xlIGVycm9yc1xuXHRcdC8vYWZ0ZXIgdmFsaWRhdGlvbiBlcnJvcnMgb2NjdXJyZWRcblx0XHRsaXN0QmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJjaGFuZ2VcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0YXdhaXQgY3JlYXRpb247XG5cdFx0XHR0YWJsZS5zY3JvbGxUb0luZGV4KHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgPyB0YWJsZS5nZXRSb3dCaW5kaW5nKCkuZ2V0TGVuZ3RoKCkgOiAwKTtcblx0XHR9KTtcblxuXHRcdC8vIHRha2UgY2FyZSBvbiBtZXNzYWdlIGhhbmRsaW5nLCBkcmFmdCBpbmRpY2F0b3IgKGluIGNhc2Ugb2YgZHJhZnQpXG5cdFx0Ly8gQXR0YWNoIHRoZSBjcmVhdGUgc2VudCBhbmQgY3JlYXRlIGNvbXBsZXRlZCBldmVudCB0byB0aGUgb2JqZWN0IHBhZ2UgYmluZGluZyBzbyB0aGF0IHdlIGNhbiByZWFjdFxuXHRcdHRoaXMuaGFuZGxlQ3JlYXRlRXZlbnRzKGxpc3RCaW5kaW5nKTtcblxuXHRcdGNvbnN0IGNyZWF0aW9uID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IE9iamVjdC5hc3NpZ24oXG5cdFx0XHRcdFx0e30sXG5cdFx0XHRcdFx0Li4uT2JqZWN0LmtleXMoY3JlYXRpb25Sb3dQYXlsb2FkKVxuXHRcdFx0XHRcdFx0LmZpbHRlcihcblx0XHRcdFx0XHRcdFx0KHByb3BlcnR5UGF0aDogc3RyaW5nKSA9PlxuXHRcdFx0XHRcdFx0XHRcdGVudGl0eVR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMuZmluZEluZGV4KChwcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZSA9PT0gcHJvcGVydHlQYXRoKSA9PT0gLTFcblx0XHRcdFx0XHRcdCkgLy8gZW5zdXJlIG5hdmlnYXRpb24gcHJvcGVydGllcyBhcmUgbm90IHBhcnQgb2YgdGhlIHBheWxvYWQsIGRlZXAgY3JlYXRlIG5vdCBzdXBwb3J0ZWRcblx0XHRcdFx0XHRcdC5tYXAoKHBhdGgpID0+ICh7IFtwYXRoXTogY3JlYXRpb25Sb3dQYXlsb2FkW3BhdGhdIH0pKVxuXHRcdFx0XHQpLFxuXHRcdFx0XHRrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkOiBmYWxzZSwgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdFx0YnVzeU1vZGU6IFwiTG9jYWxcIiwgLy8gYnVzeSBoYW5kbGluZyBzaGFsbCBiZSBkb25lIGxvY2FsbHkgb25seVxuXHRcdFx0XHRidXN5SWQ6ICh0YWJsZT8uZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkgfCB1bmRlZmluZWQpPy5nZXRUYWJsZURlZmluaXRpb24oKT8uYW5ub3RhdGlvbi5pZCxcblx0XHRcdFx0cGFyZW50Q29udHJvbDogdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVDcmVhdGUsXG5cdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IGFwcENvbXBvbmVudC5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5BdXRvQ3JlYXRlLCAvLyBJbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiB3YXMgY2FsbGVkIHdpdGggcHJlZmVycmVkTW9kZT1hdXRvQ3JlYXRlV2l0aCwgd2Ugd2FudCB0byBza2lwIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHRcdFx0XHRjcmVhdGVBdEVuZDogcGFyYW1ldGVycy5jcmVhdGVBdEVuZCxcblx0XHRcdFx0Y3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3dcblx0XHRcdH0sXG5cdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRmYWxzZVxuXHRcdCk7XG5cdFx0Ly8gU2lkZUVmZmVjdHMgb24gQ3JlYXRlXG5cdFx0Ly8gaWYgU2F2ZSBpcyBwcmVzc2VkIGRpcmVjdGx5IGFmdGVyIGZpbGxpbmcgdGhlIENyZWF0aW9uUm93LCBubyBTaWRlRWZmZWN0cyByZXF1ZXN0XG5cdFx0aWYgKCFwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cykge1xuXHRcdFx0dGhpcy5oYW5kbGVTaWRlRWZmZWN0cyhsaXN0QmluZGluZywgY3JlYXRpb24pO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBjcmVhdGlvblJvd0xpc3RCaW5kaW5nID0gY3JlYXRpb25Sb3dDb250ZXh0LmdldEJpbmRpbmcoKSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdFx0Y29uc3QgbmV3VHJhbnNpZW50Q29udGV4dCA9IGNyZWF0aW9uUm93TGlzdEJpbmRpbmcuY3JlYXRlKCk7XG5cdFx0XHRjcmVhdGlvblJvdy5zZXRCaW5kaW5nQ29udGV4dChuZXdUcmFuc2llbnRDb250ZXh0KTtcblxuXHRcdFx0Ly8gdGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgY29uc29sZSBlcnJvcnMgVE8gYmUgY2hlY2tlZCB3aXRoIG1vZGVsIGNvbGxlYWd1ZXNcblx0XHRcdG5ld1RyYW5zaWVudENvbnRleHQuY3JlYXRlZCgpPy5jYXRjaCgoKSA9PiB7XG5cdFx0XHRcdExvZy50cmFjZShcInRyYW5zaWVudCBmYXN0IGNyZWF0aW9uIGNvbnRleHQgZGVsZXRlZFwiKTtcblx0XHRcdH0pO1xuXHRcdFx0bmF2aWdhdGlvbiA9IGNyZWF0aW9uUm93Q29udGV4dC5kZWxldGUoXCIkZGlyZWN0XCIpO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHQvLyBSZXNldCBidXN5IGluZGljYXRvciBhZnRlciBhIHZhbGlkYXRpb24gZXJyb3Jcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSkpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpKTtcblx0XHRcdH1cblx0XHRcdExvZy5lcnJvcihcIkNyZWF0aW9uUm93IG5hdmlnYXRpb24gZXJyb3I6IFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5wb3N0RG9jdW1lbnRDcmVhdGlvbihQcm9taXNlLmFsbChbY3JlYXRpb24sIG5hdmlnYXRpb25dKSwgbGlzdEJpbmRpbmcpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgaW5saW5lIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kIFRoZSBuZXcgZG9jdW1lbnQgaXMgY3JlYXRlZCBhdCB0aGUgZW5kXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyBUaGUgc2lkZUVmZmVjdHMgYXJlIHJlcXVlc3RlZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy50YWJsZUlkIFRoZSBpZCBvZiB0aGUgdGFibGVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udGV4dFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kYXRhXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlSW5saW5lRG9jdW1lbnQoXG5cdFx0cGFyYW1ldGVyczoge1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdFx0c2tpcFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdHRhYmxlSWQ/OiBzdHJpbmc7XG5cdFx0XHRwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRkYXRhPzogb2JqZWN0O1xuXHRcdH0sXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmdcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IHRhYmxlOiBUYWJsZSB8IHVuZGVmaW5lZDtcblx0XHRpZiAocGFyYW1ldGVycy50YWJsZUlkKSB7XG5cdFx0XHR0YWJsZSA9IHRoaXMuZ2V0VmlldygpLmJ5SWQocGFyYW1ldGVycy50YWJsZUlkKSBhcyBUYWJsZTtcblx0XHR9XG5cdFx0aWYgKHRhYmxlPy5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0dGFibGUuZ2V0Um93QmluZGluZygpLmF0dGFjaEV2ZW50T25jZShcImNoYW5nZVwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG5ld0NvbnRleHQgPSBhd2FpdCBjcmVhdGlvbjtcblx0XHRcdFx0Y29uc3QgYWxsQ3VycmVudENvbnRleHRzID0gbGlzdEJpbmRpbmcuZ2V0QWxsQ3VycmVudENvbnRleHRzKCk7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRJbmRleCA9IGFsbEN1cnJlbnRDb250ZXh0cy5pbmRleE9mKG5ld0NvbnRleHQpO1xuXHRcdFx0XHR0YWJsZT8uZm9jdXNSb3coY29udGV4dEluZGV4LCB0cnVlKTtcblx0XHRcdFx0aWYgKHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHRcdC8vIEluIGNhc2Ugb2YgYSB0cmVlIHRhYmxlLCB3ZSBhbHNvIHNjcm9sbCB0byBrZWVwIHRoZSBwYXJlbnQgdmlzaWJsZVxuXHRcdFx0XHRcdGNvbnN0IHBhcmVudENvbnRleHQgPSBuZXdDb250ZXh0LmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdGNvbnN0IHBhcmVudEluZGV4ID0gcGFyZW50Q29udGV4dCA/IGFsbEN1cnJlbnRDb250ZXh0cy5pbmRleE9mKHBhcmVudENvbnRleHQpIDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGlmIChwYXJlbnRJbmRleCAhPT0gdW5kZWZpbmVkICYmIHBhcmVudEluZGV4ID49IDApIHtcblx0XHRcdFx0XHRcdHRhYmxlPy5zY3JvbGxUb0luZGV4KHBhcmVudEluZGV4KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8vIHRha2UgY2FyZSBvbiBtZXNzYWdlIGhhbmRsaW5nLCBkcmFmdCBpbmRpY2F0b3IgKGluIGNhc2Ugb2YgZHJhZnQpXG5cdFx0Ly8gQXR0YWNoIHRoZSBjcmVhdGUgc2VudCBhbmQgY3JlYXRlIGNvbXBsZXRlZCBldmVudCB0byB0aGUgb2JqZWN0IHBhZ2UgYmluZGluZyBzbyB0aGF0IHdlIGNhbiByZWFjdFxuXHRcdHRoaXMuaGFuZGxlQ3JlYXRlRXZlbnRzKGxpc3RCaW5kaW5nKTtcblx0XHRjb25zdCBjcmVhdGlvbiA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5jcmVhdGVEb2N1bWVudChcblx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0e1xuXHRcdFx0XHQvL0NoZWNrIGlmIEFsbCBwYXJhbWV0ZXJzIGFyZSBuZWVkZWRcblx0XHRcdFx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZDogZmFsc2UsIC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRcdGJ1c3lNb2RlOiBcIkxvY2FsXCIsIC8vIGJ1c3kgaGFuZGxpbmcgc2hhbGwgYmUgZG9uZSBsb2NhbGx5IG9ubHlcblx0XHRcdFx0YnVzeUlkOiAodGFibGU/LmdldFBhcmVudCgpIGFzIFRhYmxlQVBJIHwgdW5kZWZpbmVkKT8uZ2V0VGFibGVEZWZpbml0aW9uKCk/LmFubm90YXRpb24uaWQsXG5cdFx0XHRcdHBhcmVudENvbnRyb2w6IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlQ3JlYXRlLFxuXHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGUsIC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5JbmxpbmUsXG5cdFx0XHRcdHBhcmVudENvbnRleHQ6IHBhcmFtZXRlcnMucGFyZW50Q29udGV4dCxcblx0XHRcdFx0ZGF0YTogcGFyYW1ldGVycy5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cdFx0XHR9LFxuXHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdGZhbHNlXG5cdFx0KTtcblxuXHRcdGlmICghcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMpIHtcblx0XHRcdHRoaXMuaGFuZGxlU2lkZUVmZmVjdHMobGlzdEJpbmRpbmcsIGNyZWF0aW9uKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMucG9zdERvY3VtZW50Q3JlYXRpb24oUHJvbWlzZS5hbGwoW2NyZWF0aW9uLCB0aGlzLnN5bmNUYXNrKGNyZWF0aW9uKV0pLCBsaXN0QmluZGluZyk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIGRlZmZlcmVkIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaGFzIHRvIGJlIGNyZWF0ZWRcblx0ICogQHBhcmFtIHBhcmVudENvbnRleHQgT3B0aW9uYWwgcGFyZW50IGNvbnRleHQgd2hlbiBjcmVhdGluZyBhIG5vZGUgaW4gVHJlZVRhYmxlXG5cdCAqIEBwYXJhbSBkYXRhXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgbmF2aWdhdGlvbiBpcyBkb25lXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVEZWZlcnJlZERvY3VtZW50KGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQsIGRhdGE/OiBvYmplY3QpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBsb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0QnVzeUxvY2tlci5sb2NrKGxvY2tPYmplY3QpO1xuXHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KGxpc3RCaW5kaW5nLCB7XG5cdFx0XHRjcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVyczogeyBtb2RlOiBcIkRlZmVycmVkXCIsIHBhcmVudENvbnRleHQsIGxpc3RCaW5kaW5nLCBkYXRhIH0sXG5cdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdGZvcmNlRm9jdXM6IHRydWVcblx0XHR9KTtcblx0XHRCdXN5TG9ja2VyLnVubG9jayhsb2NrT2JqZWN0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgc3luYyBvciBhc3luYyBkb2N1bWVudC5cblx0ICpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIHN5bmMgb3IgYXN5bmMgY3JlYXRpb24gbW9kZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iRnJvbURlZmVycmVkIFRoaXMgZG9jdW1lbnQgaXMgY3JlYXRlZCBhZnRlciBhIGRlZmZlcmVkIGNyZWF0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbiAgVGhlIGNyZWF0ZSBoYXMgYmVlbiB0cmlnZ2VyZWQgYnkgYSBjcmVhdGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRhdGEgIERhdGEgdG8gc2F2ZSBvbiB0aGUgbmV3IGRvY3VtZW50XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyBUaGUgc2lkZUVmZmVjdHMgYXJlIHJlcXVlc3RlZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0XG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlU3luY0FzeW5jRG9jdW1lbnQoXG5cdFx0cGFyYW1ldGVyczoge1xuXHRcdFx0Y3JlYXRpb25Nb2RlOiBzdHJpbmc7XG5cdFx0XHRiRnJvbURlZmVycmVkPzogYm9vbGVhbjtcblx0XHRcdGNyZWF0ZUFjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0XHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0cGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0O1xuXHRcdH0sXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmdcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IG5hdmlnYXRpb246IFByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgbG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGNvbnN0IHJvdXRpbmdMaXN0ZW5lciA9IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCk7XG5cdFx0QnVzeUxvY2tlci5sb2NrKGxvY2tPYmplY3QpO1xuXG5cdFx0Y29uc3QgY3JlYXRpb24gPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKClcblx0XHRcdC5jcmVhdGVEb2N1bWVudChcblx0XHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQuLi5wYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdC4uLntcblx0XHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRcdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUNyZWF0ZSxcblx0XHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0U3RhcnR1cE1vZGUoKSA9PT0gU3RhcnR1cE1vZGUuQXV0b0NyZWF0ZSAvLyBJbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiB3YXMgY2FsbGVkIHdpdGggcHJlZmVycmVkTW9kZT1hdXRvQ3JlYXRlV2l0aCwgd2Ugd2FudCB0byBza2lwIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRmYWxzZVxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oKG5ld0RvY3VtZW50Q29udGV4dCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5faXNGY2xFbmFibGVkKCkgJiYgbmV3RG9jdW1lbnRDb250ZXh0ICYmIG5ld0RvY3VtZW50Q29udGV4dC5nZXRCaW5kaW5nKCkgIT09IGxpc3RCaW5kaW5nKSB7XG5cdFx0XHRcdFx0Ly8gSW4gRkNMIGNhc2UsIGlmIHRoZSBuZXcgY29udGV4dCBoYXMgYmVlbiBjcmVhdGVkIHdpdGggYW4gYWN0aW9uIChub3Qgd2l0aCB0aGUgc3RhbmRhcmQgUE9TVCBjcmVhdGUpLCB3ZSBuZWVkIHRvIHJlZnJlc2hcblx0XHRcdFx0XHQvLyB0aGUgb3JpZ2luYWwgbGlzdEJpbmRpbmcgc28gdGhhdCBpdCBjb250YWlucyB0aGUgbmV3bHkgY3JlYXRlZCBvYmplY3QgKHRoaXMgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBsaXN0QmluZGluZyBmb3Igc3RhbmRhcmQgY3JlYXRlKVxuXHRcdFx0XHRcdGxpc3RCaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBuZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0XHR9KTtcblxuXHRcdC8vIERvbid0IGRvIHRoaXMgaWYgdGhlIGludm9jYXRpb24gY29tZXMgZnJvbSBhIGRlZmVycmVkIGNyZWF0aW9uIG9yIGlmIFNhdmUgaXMgcHJlc3NlZCBkaXJlY3RseSBhZnRlciBmaWxsaW5nIHRoZSBDcmVhdGlvblJvd1xuXHRcdGlmIChwYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWQgIT09IHRydWUgJiYgIXBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzKSB7XG5cdFx0XHR0aGlzLmhhbmRsZVNpZGVFZmZlY3RzKGxpc3RCaW5kaW5nLCBjcmVhdGlvbik7XG5cdFx0fVxuXG5cdFx0aWYgKHBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQXN5bmMpIHtcblx0XHRcdG5hdmlnYXRpb24gPSByb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KGxpc3RCaW5kaW5nLCB7XG5cdFx0XHRcdGNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzOiB7IG1vZGU6IFwiQXN5bmNcIiwgY3JlYXRlQ29udGV4dFByb21pc2U6IGNyZWF0aW9uIH0sXG5cdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRmb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bmF2aWdhdGlvbiA9IGNyZWF0aW9uLnRoZW4oYXN5bmMgKG5ld0RvY3VtZW50Q29udGV4dCkgPT4ge1xuXHRcdFx0XHRpZiAoIW5ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdGNvbnN0IGNvcmVSZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cdFx0XHRcdFx0cmV0dXJuIHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UoY29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLCB7XG5cdFx0XHRcdFx0XHR0aXRsZTogY29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfRURJVEZMT1dfU0FQRkVfQ1JFQVRJT05fRkFJTEVEX0RFU0NSSVBUSU9OXCIpXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gSW4gY2FzZSB0aGUgU3luYyBjcmVhdGlvbiB3YXMgdHJpZ2dlcmVkIGZvciBhIGRlZmVycmVkIGNyZWF0aW9uLCB3ZSBkb24ndCBuYXZpZ2F0ZSBmb3J3YXJkXG5cdFx0XHRcdFx0Ly8gYXMgd2UncmUgYWxyZWFkeSBvbiB0aGUgY29ycmVzcG9uZGluZyBPYmplY3RQYWdlXG5cdFx0XHRcdFx0Y29uc3QgbmF2UGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRmb3JjZUZvY3VzOiB0cnVlLFxuXHRcdFx0XHRcdFx0dHJhbnNpZW50OlxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldFByb2dyYW1taW5nTW9kZWwobGlzdEJpbmRpbmcpID09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5IHx8IHBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uID8gdHJ1ZSA6IHVuZGVmaW5lZFxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRyZXR1cm4gcGFyYW1ldGVycy5iRnJvbURlZmVycmVkXG5cdFx0XHRcdFx0XHQ/IHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZVRvQ29udGV4dChuZXdEb2N1bWVudENvbnRleHQsIG5hdlBhcmFtZXRlcnMpXG5cdFx0XHRcdFx0XHQ6IHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQobmV3RG9jdW1lbnRDb250ZXh0LCBuYXZQYXJhbWV0ZXJzKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnBvc3REb2N1bWVudENyZWF0aW9uKFByb21pc2UuYWxsKFtjcmVhdGlvbiwgbmF2aWdhdGlvbl0pLCBsaXN0QmluZGluZyk7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSwgdGhlIG9ubHkgZXJyb3JzIGhhbmRsZWQgaGVyZSBhcmUgcmFpc2VkIGFzIHN0cmluZyAtIHNob3VsZCBiZSBjaGFuZ2VkIHRvIEVycm9yIG9iamVjdHNcblx0XHRcdC8vIGNyZWF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZCBieSB1c2VyIG9yIGZhaWxlZCBpbiBiYWNrZW5kID0+IGluIGNhc2Ugd2UgaGF2ZSBuYXZpZ2F0ZWQgdG8gdHJhbnNpZW50IGNvbnRleHQgYmVmb3JlLCBuYXZpZ2F0ZSBiYWNrXG5cdFx0XHQvLyB0aGUgc3dpdGNoLXN0YXRlbWVudCBhYm92ZSBzZWVtcyB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaGFwcGVucyBpbiBjcmVhdGlvbk1vZGVzIGRlZmVycmVkIGFuZCBhc3luYy4gQnV0IGluIGZhY3QsIGluIHRoZXNlIGNhc2VzIGFmdGVyIHRoZSBuYXZpZ2F0aW9uIGZyb20gcm91dGVNYXRjaGVkIGluIE9QIGNvbXBvbmVudFxuXHRcdFx0Ly8gY3JlYXRlRGVmZXJyZWREb2N1bWVudCBpcyB0cmlnZ2VyZWQsIHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kIChjcmVhdGVEb2N1bWVudCkgYWdhaW4gLSB0aGlzIHRpbWUgd2l0aCBjcmVhdGlvbk1vZGUgc3luYy4gVGhlcmVmb3JlLCBhbHNvIGluIHRoYXQgbW9kZSB3ZSBuZWVkIHRvIHRyaWdnZXIgYmFjayBuYXZpZ2F0aW9uLlxuXHRcdFx0Ly8gVGhlIG90aGVyIGNhc2VzIG1pZ2h0IHN0aWxsIGJlIG5lZWRlZCBpbiBjYXNlIHRoZSBuYXZpZ2F0aW9uIGZhaWxzLlxuXHRcdFx0aWYgKFxuXHRcdFx0XHRbXG5cdFx0XHRcdFx0Q29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZyxcblx0XHRcdFx0XHRDb25zdGFudHMuQWN0aW9uRXhlY3V0aW9uRmFpbGVkLFxuXHRcdFx0XHRcdENvbnN0YW50cy5DcmVhdGlvbkZhaWxlZCxcblx0XHRcdFx0XHRDb25zdGFudHMuT25CZWZvcmVDcmVhdGVGYWlsZWRcblx0XHRcdFx0XS5pbmNsdWRlcyhlcnJvcilcblx0XHRcdCkge1xuXHRcdFx0XHR0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKGxvY2tPYmplY3QpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGFuIGV4dGVybmFsIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaGFzIHRvIGJlIGNyZWF0ZWRcblx0ICogQHBhcmFtIG91dGJvdW5kIFRoZSBvdXRib3VuZCBhY3Rpb25cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlRXh0ZXJuYWxEb2N1bWVudChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHN0cmluZywgb3V0Ym91bmQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyBUT0RPOiBDYWxsIGFwcHJvcHJpYXRlIGZ1bmN0aW9uIChjdXJyZW50bHkgdXNpbmcgdGhlIHNhbWUgYXMgZm9yIG91dGJvdW5kIGNoZXZyb24gbmF2LCBhbmQgd2l0aG91dCBhbnkgY29udGV4dCAtIDNyZCBwYXJhbSlcblx0XHRpZiAob3V0Ym91bmQpIHtcblx0XHRcdGlmICh0eXBlb2YgbGlzdEJpbmRpbmcgIT09IFwic3RyaW5nXCIgJiYgdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5oYW5kbGVkIGNyZWF0aW9uTW9kZSBcIkV4dGVybmFsXCIgd2l0aCBhIFRyZWVUYWJsZWApO1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRjb25zdCBjb250cm9sbGVyID0gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyO1xuXHRcdFx0Y29uc3QgY3JlYXRlUGF0aCA9IE1vZGVsSGVscGVyLmdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZyh0aGlzLmJhc2UuZ2V0VmlldygpLCBsaXN0QmluZGluZyk7XG5cdFx0XHRjb250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKGNvbnRyb2xsZXIsIG91dGJvdW5kLCB1bmRlZmluZWQsIGNyZWF0ZVBhdGgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIHRoZSBTaWRlRWZmZWN0cyB0byBleGVjdXRlIGFmdGVyIHRoZSBkb2N1bWVudCBjcmVhdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGhhcyB0byBiZSBjcmVhdGVkXG5cdCAqIEBwYXJhbSBjcmVhdGlvblByb21pc2UgVGhlIHByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIFNpZGVFZmZlY3RzIGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKi9cblx0aGFuZGxlU2lkZUVmZmVjdHMgPSBhc3luYyAobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIGNyZWF0aW9uUHJvbWlzZTogUHJvbWlzZTxDb250ZXh0Pik6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB2aWV3QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0Y29uc3QgbmV3Q29udGV4dCA9IGF3YWl0IGNyZWF0aW9uUHJvbWlzZTtcblx0XHRcdC8vIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgcmVsaWFibHkgcmVtb3ZlZCBvbmNlIG9OZXdDb250ZXh0LmNyZWF0ZWQoKSBpcyByZXNvbHZlZFxuXHRcdFx0YXdhaXQgbmV3Q29udGV4dC5jcmVhdGVkKCk7XG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0aWYgKCFDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KGxpc3RCaW5kaW5nKSAmJiB2aWV3QmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKVxuXHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCB2aWV3QmluZGluZ0NvbnRleHQgYXMgQ29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogR2VuZXJhdGVzIHRoZSBjdXN0b20gdmFsaWRhdGlvbiBtZXNzYWdlcyBmb3IgdGhlIGNyZWF0aW9uUm93LlxuXHQgKlxuXHQgKiBAcGFyYW0gdmFsaWRhdGlvbk1lc3NhZ2VzIFRoZSBlcnJvciBtZXNzYWdlcyBmb3JtIHRoZSBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvblxuXHQgKiBAcGFyYW0gdGFibGUgVGhlIHRhYmxlIHRhcmdldGVkIGJ5IHRoZSBtZXNzYWdlc1xuXHQgKi9cblx0Y3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzID0gKHZhbGlkYXRpb25NZXNzYWdlczogeyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXSwgdGFibGU6IFRhYmxlKTogdm9pZCA9PiB7XG5cdFx0Y29uc3QgY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uID0gdGFibGUuZ2V0Q3JlYXRpb25Sb3coKS5kYXRhKFwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXCIpO1xuXHRcdGNvbnN0IGN1c3RvbVZhbGlkaXR5ID0gdGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uZ2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0N1c3RvbVZhbGlkaXR5XCIpO1xuXHRcdGNvbnN0IGN1c3RvbU1lc3NhZ2VzOiBDdXN0b21NZXNzYWdlW10gPSBbXTtcblx0XHRsZXQgZmllbGRDb250cm9sO1xuXHRcdGxldCBmaW5hbFRhcmdldDogc3RyaW5nO1xuXG5cdFx0Ly8gUmVtb3ZlIGV4aXN0aW5nIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdGNvbnN0IG9sZE1lc3NhZ2VzID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHQuZmlsdGVyKChtZXNzYWdlOiBNZXNzYWdlKSA9PiBtZXNzYWdlLmdldENvZGUoKSA9PT0gY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uKTtcblx0XHRNZXNzYWdpbmcucmVtb3ZlTWVzc2FnZXMob2xkTWVzc2FnZXMpO1xuXG5cdFx0dmFsaWRhdGlvbk1lc3NhZ2VzLmZvckVhY2goKHZhbGlkYXRpb25NZXNzYWdlKSA9PiB7XG5cdFx0XHQvLyBIYW5kbGUgQm91bmQgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHRpZiAodmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldCkge1xuXHRcdFx0XHRmaWVsZENvbnRyb2wgPSBFbGVtZW50LmdldEVsZW1lbnRCeUlkKGN1c3RvbVZhbGlkaXR5W3ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUYXJnZXRdLmZpZWxkSWQpIGFzIENvbnRyb2w7XG5cdFx0XHRcdGZpbmFsVGFyZ2V0ID0gYCR7ZmllbGRDb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKX0vJHtmaWVsZENvbnRyb2wuZ2V0QmluZGluZ1BhdGgoXCJ2YWx1ZVwiKX1gO1xuXHRcdFx0XHQvLyBBZGQgdmFsaWRhdGlvbiBtZXNzYWdlIGlmIHN0aWxsIG5vdCBleGlzdHNcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdCFNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0XHRcdC5maWx0ZXIoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IG1lc3NhZ2UuZ2V0VGFyZ2V0cygpLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0ID09PSBmaW5hbFRhcmdldCkpLmxlbmd0aFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRNZXNzYWdpbmcuYWRkTWVzc2FnZXMoXG5cdFx0XHRcdFx0XHRuZXcgTWVzc2FnZSh7XG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2U6IHZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUZXh0LFxuXHRcdFx0XHRcdFx0XHRwcm9jZXNzb3I6IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdHR5cGU6IE1lc3NhZ2VUeXBlLkVycm9yLFxuXHRcdFx0XHRcdFx0XHRjb2RlOiBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24sXG5cdFx0XHRcdFx0XHRcdHRlY2huaWNhbDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdHBlcnNpc3RlbnQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHR0YXJnZXQ6IGZpbmFsVGFyZ2V0XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gQWRkIGNvbnRyb2xJZCBpbiBvcmRlciB0byBnZXQgdGhlIGZvY3VzIGhhbmRsaW5nIG9mIHRoZSBlcnJvciBwb3BvdmVyXG5cdFx0XHRcdGNvbnN0IGV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHRcdC5maWx0ZXIoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IG1lc3NhZ2UuZ2V0VGFyZ2V0cygpLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0ID09PSBmaW5hbFRhcmdldCkpO1xuXHRcdFx0XHRleGlzdGluZ1ZhbGlkYXRpb25NZXNzYWdlc1swXS5hZGRDb250cm9sSWQoY3VzdG9tVmFsaWRpdHlbdmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldF0uZmllbGRJZCk7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIFVuYm91bmQgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjdXN0b21NZXNzYWdlcy5wdXNoKHtcblx0XHRcdFx0XHRjb2RlOiBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24sXG5cdFx0XHRcdFx0dGV4dDogdmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRleHQsXG5cdFx0XHRcdFx0cGVyc2lzdGVudDogdHJ1ZSxcblx0XHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvclxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGlmIChjdXN0b21NZXNzYWdlcy5sZW5ndGgpIHtcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7XG5cdFx0XHRcdGN1c3RvbU1lc3NhZ2VzOiBjdXN0b21NZXNzYWdlc1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZXNvbHZlcyB0aGUgY3JlYXRpb24gbW9kZVxuXHQgKiBQcm92aWRlcyB0aGUgZXhwZWN0ZWQgY3JlYXRpb24gbW9kZTpcblx0ICogIC0gcHJlc2VydmVzIHRoZSBwYXNzZWQgY3JlYXRpb24gbW9kZSB3aGVuIHRoaXMgb25lIGlzIG5vdCBhIE5ld1BhZ2Vcblx0ICogIC0gY2FsY3VsYXRlcyB0aGUgbmV3IG9uZSBpZiB0aGUgY3JlYXRpb24gbW9kZSBpcyBhIE5ld1BhZ2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBpbml0aWFsQ3JlYXRpb25Nb2RlIFRoZSBpbml0aWFsIGNyZWF0aW9uIG1vZGVcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIGNyZWF0ZURhdGEgVGhlIGluaXRpYWwgZGF0YSBmb3Igb2JqZWN0IGNyZWF0aW9uXG5cdCAqIEByZXR1cm5zIFRoZSBuZXcgY3JlYXRpb24gbW9kZVxuXHQgKi9cblx0cmVzb2x2ZUNyZWF0aW9uTW9kZSA9IChpbml0aWFsQ3JlYXRpb25Nb2RlOiBzdHJpbmcsIGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBjcmVhdGVEYXRhOiBvYmplY3QgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xuXHRcdGlmIChpbml0aWFsQ3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuTmV3UGFnZSkge1xuXHRcdFx0Ly8gdXNlIHRoZSBwYXNzZWQgY3JlYXRpb24gbW9kZVxuXHRcdFx0cmV0dXJuIGluaXRpYWxDcmVhdGlvbk1vZGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwobGlzdEJpbmRpbmcpO1xuXHRcdFx0Ly8gTmV3QWN0aW9uIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBOYXZpZ2F0aW9uUHJvcGVydHkgY29sbGVjdGlvblxuXHRcdFx0aWYgKCFsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0Y29uc3QgZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChsaXN0QmluZGluZy5nZXRQYXRoKCkpKTtcblx0XHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoLnRhcmdldEVudGl0eVNldCBhcyBFbnRpdHlTZXQgfCB1bmRlZmluZWQsXG5cdFx0XHRcdFx0Ly8gaWYgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycyBpcyBwcmVzZW50LCB0aGVuIGNyZWF0aW9uIGlzICdEZWZlcnJlZCdcblx0XHRcdFx0XHQvLyBpbiB0aGUgYWJzZW5jZSBvZiBOZXdBY3Rpb24gb3IgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycywgY3JlYXRpb24gaXMgYXN5bmNcblx0XHRcdFx0XHRuZXdBY3Rpb24gPSAoXG5cdFx0XHRcdFx0XHRwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0XG5cdFx0XHRcdFx0XHRcdD8gZW50aXR5U2V0Py5hbm5vdGF0aW9ucy5Db21tb24/LkRyYWZ0Um9vdFxuXHRcdFx0XHRcdFx0XHQ6IGVudGl0eVNldD8uYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFxuXHRcdFx0XHRcdCk/Lk5ld0FjdGlvbj8udG9TdHJpbmcoKTtcblxuXHRcdFx0XHRpZiAobmV3QWN0aW9uICYmIGRhdGFNb2RlbExpc3RCaW5kaW5nUGF0aC50YXJnZXRFbnRpdHlUeXBlLmFjdGlvbnNbbmV3QWN0aW9uXS5wYXJhbWV0ZXJzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHQvLyBiaW5kaW5nIHBhcmFtZXRlciAoZWc6IF9pdCkgaXMgbm90IGNvbnNpZGVyZWRcblx0XHRcdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkRlZmVycmVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBjcmVhdGlvblBhcmFtZXRlcnMgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuZ2V0Q3JlYXRpb25QYXJhbWV0ZXJzKGxpc3RCaW5kaW5nLCBjcmVhdGVEYXRhLCB0aGlzLmdldEFwcENvbXBvbmVudCgpKTtcblx0XHRcdGlmIChjcmVhdGlvblBhcmFtZXRlcnMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkFzeW5jO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogVmFsaWRhdGVzIGEgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCByZXN1bHQgb2YgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqL1xuXG5cdGFzeW5jIHZhbGlkYXRlRG9jdW1lbnQoXG5cdFx0Y29udGV4dDogQ29udGV4dCxcblx0XHRwYXJhbWV0ZXJzOiB7IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbj86IHN0cmluZzsgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfVxuXHQpOiBQcm9taXNlPHsgbWVzc2FnZVRhcmdldD86IHN0cmluZzsgbWVzc2FnZVRleHQ6IHN0cmluZyB9W10+IHtcblx0XHRyZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLnZhbGlkYXRlRG9jdW1lbnQoY29udGV4dCwgcGFyYW1ldGVycywgdGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyB0aGUgcmVzdWx0IG9mXG5cdCAqIGEgY3JlYXRpb24gcm93J3MgY3VzdG9tIHZhbGlkYXRpb24gYXMgYSBwcm9taXNlLiBJZiBubyBjcmVhdGlvbiByb3cgaXMgaW52b2x2ZWRcblx0ICogdGhlIHJlc3VsdGluZyBmdW5jdGlvbiByZXR1cm5zIGEgcmVzb2x2ZWQgcHJvbWlzZS5cblx0ICpcblx0ICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB3aXRoIHRoZSBjcmVhdGlvblJvd1xuXHQgKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHByb21pc2Vcblx0ICovXG5cdGdldENyZWF0aW9uUm93VmFsaWRhdGlvbkZ1bmN0aW9uKHRhYmxlOiBUYWJsZSB8IHVuZGVmaW5lZCk6ICgpID0+IFByb21pc2U8eyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXT4ge1xuXHRcdGNvbnN0IGNyZWF0aW9uUm93ID0gdGFibGU/LmdldENyZWF0aW9uUm93KCk7XG5cdFx0aWYgKGNyZWF0aW9uUm93ICYmIHRhYmxlKSB7XG5cdFx0XHRyZXR1cm4gYXN5bmMgKCk6IFByb21pc2U8eyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXT4gPT4ge1xuXHRcdFx0XHRjb25zdCBjcmVhdGlvblJvd09iamVjdHMgPSAoY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KS5nZXRPYmplY3QoKTtcblx0XHRcdFx0ZGVsZXRlIGNyZWF0aW9uUm93T2JqZWN0c1tcIkAkdWk1LmNvbnRleHQuaXNUcmFuc2llbnRcIl07XG5cdFx0XHRcdHJldHVybiB0aGlzLnZhbGlkYXRlRG9jdW1lbnQodGFibGUuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0LCB7XG5cdFx0XHRcdFx0ZGF0YTogY3JlYXRpb25Sb3dPYmplY3RzLFxuXHRcdFx0XHRcdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjogdGFibGUuZ2V0Q3JlYXRpb25Sb3coKS5kYXRhKFwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXCIpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIGFzeW5jICgpID0+IFByb21pc2UucmVzb2x2ZShbXSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBzZXZlcmFsIGRvY3VtZW50cy5cblx0ICpcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0QmluZGluZyB1c2VkIHRvIGNyZWF0ZSB0aGUgZG9jdW1lbnRzXG5cdCAqIEBwYXJhbSBkYXRhRm9yQ3JlYXRlIFRoZSBpbml0aWFsIGRhdGEgZm9yIHRoZSBuZXcgZG9jdW1lbnRzXG5cdCAqIEBwYXJhbSBjcmVhdGVBdEVuZCBUcnVlIGlmIHRoZSBuZXcgY29udGV4dHMgbmVlZCB0byBiZSBjcmVhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gaXNGcm9tQ29weVBhc3RlIFRydWUgaWYgdGhlIGNyZWF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIHBhc3RlIGFjdGlvblxuXHQgKiBAcGFyYW0gYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY3JlYXRpb25cblx0ICogQHBhcmFtIGNyZWF0ZUFzSW5hY3RpdmUgVHJ1ZSBpZiB0aGUgY29udGV4dHMgbmVlZCB0byBiZSBjcmVhdGVkIGFzIGluYWN0aXZlXG5cdCAqIEBwYXJhbSByZXF1ZXN0U2lkZUVmZmVjdHMgVHJ1ZSBieSBkZWZhdWx0LCBmYWxzZSBpZiBTaWRlRWZmZWN0cyBzaG91bGQgbm90IGJlIHJlcXVlc3RlZFxuXHQgKiBAcmV0dXJucyBBIFByb21pc2Ugd2l0aCB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0cy5cblx0ICovXG5cdGFzeW5jIGNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzKFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdGRhdGFGb3JDcmVhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sXG5cdFx0Y3JlYXRlQXRFbmQ6IGJvb2xlYW4sXG5cdFx0aXNGcm9tQ29weVBhc3RlOiBib29sZWFuLFxuXHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrPzogRnVuY3Rpb24sXG5cdFx0Y3JlYXRlQXNJbmFjdGl2ZSA9IGZhbHNlLFxuXHRcdHJlcXVlc3RTaWRlRWZmZWN0cz86IGJvb2xlYW5cblx0KTogUHJvbWlzZTxDb250ZXh0W10+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBsb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0Y29uc3QgdGFyZ2V0TGlzdEJpbmRpbmcgPSBsaXN0QmluZGluZztcblx0XHRyZXF1ZXN0U2lkZUVmZmVjdHMgPSByZXF1ZXN0U2lkZUVmZmVjdHMgIT09IGZhbHNlO1xuXHRcdGlmICghY3JlYXRlQXNJbmFjdGl2ZSkge1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKGxvY2tPYmplY3QpO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0aWYgKGJlZm9yZUNyZWF0ZUNhbGxCYWNrKSB7XG5cdFx0XHRcdGF3YWl0IGJlZm9yZUNyZWF0ZUNhbGxCYWNrKHsgY29udGV4dFBhdGg6IHRhcmdldExpc3RCaW5kaW5nLmdldFBhdGgoKSB9KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gdGFyZ2V0TGlzdEJpbmRpbmcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGxldCBtZXRhUGF0aDogc3RyaW5nO1xuXG5cdFx0XHRpZiAodGFyZ2V0TGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpKSB7XG5cdFx0XHRcdG1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGAke3RhcmdldExpc3RCaW5kaW5nLmdldENvbnRleHQoKS5nZXRQYXRoKCl9LyR7dGFyZ2V0TGlzdEJpbmRpbmcuZ2V0UGF0aCgpfWApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgodGFyZ2V0TGlzdEJpbmRpbmcuZ2V0UGF0aCgpKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5oYW5kbGVDcmVhdGVFdmVudHModGFyZ2V0TGlzdEJpbmRpbmcpO1xuXG5cdFx0XHQvLyBJdGVyYXRlIG9uIGFsbCBpdGVtcyBhbmQgc3RvcmUgdGhlIGNvcnJlc3BvbmRpbmcgY3JlYXRpb24gcHJvbWlzZVxuXHRcdFx0Y29uc3QgY3JlYXRpb25Qcm9taXNlcyA9IGRhdGFGb3JDcmVhdGUubWFwKGFzeW5jIChwcm9wZXJ0eVZhbHVlcykgPT4ge1xuXHRcdFx0XHRjb25zdCBjcmVhdGVQYXJhbWV0ZXJzOiBDcmVhdGVQYXJhbWV0ZXJzID0geyBkYXRhOiB7fSwgcGFyZW50Q29udHJvbDogdGhpcy5nZXRWaWV3KCkgfTtcblxuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQgPSBmYWxzZTsgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3c7XG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgPSBjcmVhdGVBdEVuZDtcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5pbmFjdGl2ZSA9IGNyZWF0ZUFzSW5hY3RpdmU7XG5cblx0XHRcdFx0Ly8gUmVtb3ZlIG5hdmlnYXRpb24gcHJvcGVydGllcyBhcyB3ZSBkb24ndCBzdXBwb3J0IGRlZXAgY3JlYXRlXG5cdFx0XHRcdGZvciAoY29uc3QgcHJvcGVydHlQYXRoIGluIHByb3BlcnR5VmFsdWVzKSB7XG5cdFx0XHRcdFx0Y29uc3QgcHJvcGVydHkgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KGAke21ldGFQYXRofS8ke3Byb3BlcnR5UGF0aH1gKTtcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eSAmJlxuXHRcdFx0XHRcdFx0cHJvcGVydHkuJGtpbmQgIT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiZcblx0XHRcdFx0XHRcdCFwcm9wZXJ0eVBhdGguaW5jbHVkZXMoXCIvXCIpICYmXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eVBhdGhdXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmRhdGEhW3Byb3BlcnR5UGF0aF0gPSBwcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0cmFuc2FjdGlvbkhlbHBlci5jcmVhdGVEb2N1bWVudChcblx0XHRcdFx0XHR0YXJnZXRMaXN0QmluZGluZyxcblx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRcdGlzRnJvbUNvcHlQYXN0ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IGNyZWF0ZWRDb250ZXh0cyA9IGF3YWl0IFByb21pc2UuYWxsKGNyZWF0aW9uUHJvbWlzZXMpO1xuXHRcdFx0aWYgKCFjcmVhdGVBc0luYWN0aXZlKSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlKHRhcmdldExpc3RCaW5kaW5nKTtcblx0XHRcdH1cblx0XHRcdC8vIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgcmVsaWFibHkgcmVtb3ZlZCBvbmNlIG9OZXdDb250ZXh0LmNyZWF0ZWQoKSBpcyByZXNvbHZlZFxuXHRcdFx0Y29uc3QgYWN0aXZlQ29udGV4dHMgPSBjcmVhdGVkQ29udGV4dHMuZmlsdGVyKChuZXdDb250ZXh0KSA9PiAhbmV3Q29udGV4dC5pc0luYWN0aXZlKCkpO1xuXHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwoYWN0aXZlQ29udGV4dHMubWFwKGFzeW5jIChuZXdDb250ZXh0KSA9PiBuZXdDb250ZXh0LmNyZWF0ZWQoKSkpO1xuXG5cdFx0XHRjb25zdCB2aWV3QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0aWYgKHJlcXVlc3RTaWRlRWZmZWN0cyAmJiAhQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dCh0YXJnZXRMaXN0QmluZGluZykpIHtcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKVxuXHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkodGFyZ2V0TGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCB2aWV3QmluZGluZ0NvbnRleHQgYXMgQ29udGV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkgJiYgYWN0aXZlQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQ3JlYXRlLCBhY3RpdmVDb250ZXh0cyk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBjcmVhdGVkQ29udGV4dHM7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyBtdWx0aXBsZSBkb2N1bWVudHMuXCIpO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoIWNyZWF0ZUFzSW5hY3RpdmUpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnQ3JlYXRlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnQ3JlYXRlJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgc3RvcHBlZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVDcmVhdGVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0UGF0aCBQYXRoIHBvaW50aW5nIHRvIHRoZSBjb250ZXh0IG9uIHdoaWNoIENyZWF0ZSBhY3Rpb24gaXMgdHJpZ2dlcmVkXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY3JlYXRlUGFyYW1ldGVycyBBcnJheSBvZiB2YWx1ZXMgdGhhdCBhcmUgZmlsbGVkIGluIHRoZSBBY3Rpb24gUGFyYW1ldGVyIERpYWxvZ1xuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkJlZm9yZUNyZWF0ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHRQYXRoPzogc3RyaW5nOyBjcmVhdGVQYXJhbWV0ZXJzPzogdW5rbm93bltdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRWRpdCcgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0VkaXQnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdFZGl0JyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUVkaXRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGVkaXRlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGRpc3BsYXkgbW9kZS5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoXCJBZnRlckFzeW5jXCIpXG5cdGFzeW5jIG9uQmVmb3JlRWRpdChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnU2F2ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ1NhdmUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdTYXZlJyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZVNhdmVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIHNhdmVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShcIkFmdGVyQXN5bmNcIilcblx0QGhvb2thYmxlKFwiYWZ0ZXJcIiwgdHJ1ZSlcblx0YXN5bmMgb25CZWZvcmVTYXZlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdEaXNjYXJkJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRGlzY2FyZCcgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRGlzY2FyZFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgZGlzY2FyZGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25CZWZvcmVEaXNjYXJkKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdEZWxldGUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdEZWxldGUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyBzdG9wcGVkLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZURlbGV0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRzIEFuIGFycmF5IG9mIGNvbnRleHRzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIGRlbGV0ZWRcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25CZWZvcmVEZWxldGUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgY29kZSBhZnRlciB0aGUgJ1NhdmUnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVTYXZlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBUaGUgY29udGV4dCB3ZSBvYnRhaW5lZCBhZnRlciBzYXZpbmdcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMTYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBob29rYWJsZShcImFmdGVyXCIpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyU2F2ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb2RlIGFmdGVyIHRoZSAnQ3JlYXRlJyBhY3Rpb24uXG5cdCAqIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlQ3JlYXRlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBUaGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0XG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuMTE2LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25BZnRlckNyZWF0ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb2RlIGFmdGVyIHRoZSAnRWRpdCcgYWN0aW9uLlxuXHQgKiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUVkaXRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGVkaXRlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMTYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyRWRpdChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb2RlIGFmdGVyIHRoZSAnRGlzY2FyZCcgYWN0aW9uLlxuXHQgKiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZURpc2NhcmRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFRoZSBjb250ZXh0IG9idGFpbmVkIGFmdGVyIGRpc2NhcmRpbmcgdGhlIG9iamVjdCwgb3IgdW5kZWZpbmVkIGlmIHdlIGRpc2NhcmRlZCBhIG5ldyBvYmplY3Rcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMTYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyRGlzY2FyZChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb2RlIGFmdGVyIHRoZSAnRGVsZXRlJyBhY3Rpb24uXG5cdCAqIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRGVsZXRlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dHMgQW4gYXJyYXkgb2YgY29udGV4dHMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJEZWxldGUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIEluZGljYXRlcyB3aGV0aGVyIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgaWdub3JlZCB3aGVuIHVzZXIgY2xpY2tzIG9uIFNhdmUgZHVyaW5nIGFuIElubGluZSBjcmVhdGlvblxuXHQvLyBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMuYmluZGluZ3MgTGlzdCBiaW5kaW5ncyBvZiB0aGUgdGFibGVzIGluIHRoZSB2aWV3LlxuXHQvLyBCb3RoIG9mIHRoZSBhYm92ZSBwYXJhbWV0ZXJzIGFyZSBmb3IgdGhlIHNhbWUgcHVycG9zZS4gVXNlciBjYW4gZW50ZXIgc29tZSBpbmZvcm1hdGlvbiBpbiB0aGUgY3JlYXRpb24gcm93KHMpIGJ1dCBkb2VzIG5vdCAnQWRkIHJvdycsIGluc3RlYWQgY2xpY2tzIFNhdmUuXG5cdC8vIFRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIGluIHRoZSB2aWV3LlxuXG5cdC8qKlxuXHQgKiBTYXZlcyBhIG5ldyBkb2N1bWVudCBhZnRlciBjaGVja2luZyBpdC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBlZGl0YWJsZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgUFJJVkFURVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2Ugc2F2ZSBpcyBjb21wbGV0ZVxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBzYXZlRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1QYXJhbWV0ZXJzOiBTYXZlRG9jdW1lbnRQYXJhbWV0ZXJzKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRjb25zdCBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciA9IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIHx8IHVuZGVmaW5lZDtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBhQmluZGluZ3MgPSBtUGFyYW1ldGVycy5iaW5kaW5ncyBhcyBPRGF0YUxpc3RCaW5kaW5nW107XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0Ly8gaW4gY2FzZSBvZiBzYXZpbmcgLyBhY3RpdmF0aW5nIHRoZSBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzIHNoYWxsIGJlIHJlbW92ZWQgYmVmb3JlIHRoZSBQQVRDSC9QT1NUXG5cdFx0XHQvLyBpcyBzZW50IHRvIHRoZSBiYWNrZW5kXG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMubWVyZ2VQYXRjaERyYWZ0ICE9PSB0cnVlKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0KTtcblx0XHRcdFx0Ly93ZSBuZWVkIHRvIHJlcXVlc3QgZm9yIHJlY29tbWVuZGF0aW9ucyBhbmQgdGhlbiBicmluZyB0aGUgZGlhbG9nIGhlcmVcblx0XHRcdH1cblx0XHRcdGF3YWl0IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpO1xuXG5cdFx0XHRjb25zdCByZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4gPSBhd2FpdCB0aGlzLmNoZWNrUmVjb21tZW5kYXRpb25PcHRpb24oKTtcblxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlU2F2ZSh7IGNvbnRleHQ6IG9Db250ZXh0IH0pO1xuXG5cdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0XHRjb25zdCByb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRcdGxldCBzaWJsaW5nSW5mbzogU2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5IHx8IG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpKSAmJlxuXHRcdFx0XHRyb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBObyBuZWVkIHRvIHRyeSB0byBnZXQgcmlnaHRtb3N0IGNvbnRleHQgaW4gY2FzZSBvZiBhIG5ldyBvYmplY3Rcblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRcdHJvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCksXG5cdFx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaGUgJGF1dG8gcXVldWUgY2FuIG9ubHkgaGF2ZSBwZW5kaW5nIGNoYW5nZXMgYXQgdGhpcyBwb2ludCB3aGVuIFNBVkUgd2FzIGNsaWNrZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgY2hhbmdpbmcgYSBmaWVsZC5cblx0XHRcdC8vIEluIHRoaXMgY2FzZSB0aGUgJGF1dG8gcXVldWUgaXMgbG9ja2VkIHRoZXJlZm9yZSB0aGUgZm9sbG93aW5nIHN1Ym1pdCBiYXRjaCBzaG91bGQgbm90IGNyZWF0ZSBhIHNlcGFyYXRlIGJhdGNoIHJlcXVlc3QuXG5cdFx0XHQvLyBJdCBpcyBkb25lIGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0aGF0IHBhdGNoLCBkcmFmdHByZXBhcmUsIGRyYWZ0YWN0aXZhdGUgZWFjaCBoYXZlIHRoZWlyIG93biBjaGFuZ2VzZXRcblx0XHRcdGlmIChvQ29udGV4dC5nZXRNb2RlbCgpLmhhc1BlbmRpbmdDaGFuZ2VzKFwiJGF1dG9cIikgJiYgbVBhcmFtZXRlcnMubWVyZ2VQYXRjaERyYWZ0KSB7XG5cdFx0XHRcdG9Db250ZXh0LmdldE1vZGVsKCkuc3VibWl0QmF0Y2goXCIkYXV0b1wiKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGFjdGl2ZURvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLnNhdmVEb2N1bWVudChcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdFx0YkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgYXMgYm9vbGVhbixcblx0XHRcdFx0YUJpbmRpbmdzLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdHRoaXMuZ2V0Q3JlYXRpb25Nb2RlKClcblx0XHRcdCk7XG5cdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsKTtcblxuXHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkFjdGl2YXRlLCBhY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cblx0XHRcdHRoaXMuX3RyaWdnZXJDb25maWd1cmVkU3VydmV5KFN0YW5kYXJkQWN0aW9ucy5zYXZlLCBUcmlnZ2VyVHlwZS5zdGFuZGFyZEFjdGlvbik7XG5cblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZChmYWxzZSk7XG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXG5cdFx0XHR0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlclNhdmUoe1xuXHRcdFx0XHRjb250ZXh0OiBhY3RpdmVEb2N1bWVudENvbnRleHRcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyB1cGRhdGUgdGVsZW1ldHJ5IGRhdGEgZm9yIGhvdyBwYWdlIHdhcyBzYXZlZCBhbmQgdGhlbiBkbyBzdG9yaW5nIG9mIHRoaXMgZGF0YSB0byBiYWNrZW5kIHRocm91Z2ggdGhlIHN0b3JlRGF0YSBmdW5jdGlvblxuXHRcdFx0dGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5zdG9yZURhdGFGb3JUZWxlbWV0cnkocmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuKTtcblxuXHRcdFx0aWYgKGFjdGl2ZURvY3VtZW50Q29udGV4dCAhPT0gb0NvbnRleHQpIHtcblx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gYWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKG9Db250ZXh0LCBhY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXG5cdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRcdC8vIFdoZW4gc2F2aW5nLCB0aGUgc2VtYW50aWMga2V5cyBtYXkgaGF2ZSBjaGFuZ2VkLlxuXHRcdFx0XHRcdC8vIEluIHRoaXMgY2FzZSwgd2UgYWxzbyBuZWVkIHRvIG1hbmFnZSB0aGUgc2VtYW50aWMgVVJMIGNoYW5nZSBpbiB0aGUgaGlzdG9yeVxuXHRcdFx0XHRcdGNvbnN0IHByZXZpb3VzU2VtYW50aWNQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKG9Db250ZXh0LCB0cnVlKTtcblx0XHRcdFx0XHRjb25zdCBuZXdTZW1hbnRpY1BhdGggPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgoYWN0aXZlRG9jdW1lbnRDb250ZXh0LCB0cnVlKTtcblx0XHRcdFx0XHRpZiAocHJldmlvdXNTZW1hbnRpY1BhdGggJiYgbmV3U2VtYW50aWNQYXRoICYmIHByZXZpb3VzU2VtYW50aWNQYXRoICE9PSBuZXdTZW1hbnRpY1BhdGgpIHtcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nLnB1c2goeyBvbGRQYXRoOiBwcmV2aW91c1NlbWFudGljUGF0aCwgbmV3UGF0aDogbmV3U2VtYW50aWNQYXRoIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0aWYgKHJvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gYWN0aXZlRG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIHsgZWRpdGFibGU6IGZhbHNlLCByZWNyZWF0ZUNvbnRleHQ6IGZhbHNlLCBmb3JjZUZvY3VzOiB0cnVlIH0pO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0aWYgKCEob0Vycm9yICYmIChvRXJyb3IgYXMgeyBjYW5jZWxlZD86IGJvb2xlYW4gfSkuY2FuY2VsZWQpKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHNhdmluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN3aXRjaGVzIHRoZSBVSSBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0byBzd2l0Y2ggZnJvbVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIHN3aXRjaCBpcyBkb25lXG5cdCAqL1xuXHRhc3luYyB0b2dnbGVEcmFmdEFjdGl2ZShvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdGxldCBlZGl0YWJsZTogYm9vbGVhbjtcblx0XHRjb25zdCBiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHQvL3RvZ2dsZSBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgZG9jdW1lbnQgaXMgb25seSBhdmFpbGFibGUgZm9yIGVkaXQgZHJhZnRzIGFuZCBhY3RpdmUgZG9jdW1lbnRzIHdpdGggZHJhZnQpXG5cdFx0aWYgKFxuXHRcdFx0IWJJc0RyYWZ0IHx8XG5cdFx0XHQhKFxuXHRcdFx0XHQoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB8fFxuXHRcdFx0XHQob0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNEcmFmdEVudGl0eSlcblx0XHRcdClcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHQvL3N0YXJ0IFBvaW50OiBlZGl0IGRyYWZ0XG5cdFx0XHRlZGl0YWJsZSA9IGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBzdGFydCBwb2ludCBhY3RpdmUgZG9jdW1lbnRcblx0XHRcdGVkaXRhYmxlID0gdHJ1ZTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdFx0Y29uc3Qgb1JpZ2h0bW9zdENvbnRleHQgPSBvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpID8gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCkgOiBvQ29udGV4dDtcblx0XHRcdGxldCBzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob0NvbnRleHQsIG9SaWdodG1vc3RDb250ZXh0LCBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0LCBmYWxzZSk7XG5cdFx0XHRpZiAoIXNpYmxpbmdJbmZvICYmIG9Db250ZXh0ICE9PSBvUmlnaHRtb3N0Q29udGV4dCkge1xuXHRcdFx0XHQvLyBUcnkgdG8gY29tcHV0ZSBzaWJsaW5nIGluZm8gZm9yIHRoZSByb290IGNvbnRleHQgaWYgaXQgZmFpbHMgZm9yIHRoZSByaWdodG1vc3QgY29udGV4dFxuXHRcdFx0XHQvLyAtLT4gSW4gY2FzZSBvZiBGQ0wsIGlmIHdlIHRyeSB0byBzd2l0Y2ggYmV0d2VlbiBkcmFmdCBhbmQgYWN0aXZlIGJ1dCBhIGNoaWxkIGVudGl0eSBoYXMgbm8gc2libGluZywgdGhlIHN3aXRjaCB3aWxsIGNsb3NlIHRoZSBjaGlsZCBjb2x1bW5cblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKG9Db250ZXh0LCBvQ29udGV4dCwgUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNpYmxpbmdJbmZvKSB7XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoZWRpdGFibGUgPyBFZGl0TW9kZS5FZGl0YWJsZSA6IEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTsgLy9zd2l0Y2ggdG8gZWRpdCBtb2RlIG9ubHkgaWYgYSBkcmFmdCBpcyBhdmFpbGFibGVcblxuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdGNvbnN0IGxhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRcdFx0XHRpZiAobGFzdFNlbWFudGljTWFwcGluZz8udGVjaG5pY2FsUGF0aCA9PT0gb0NvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB0YXJnZXRQYXRoID0gc2libGluZ0luZm8ucGF0aE1hcHBpbmdbc2libGluZ0luZm8ucGF0aE1hcHBpbmcubGVuZ3RoIC0gMV0ubmV3UGF0aDtcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nLnB1c2goeyBvbGRQYXRoOiBsYXN0U2VtYW50aWNNYXBwaW5nLnNlbWFudGljUGF0aCwgbmV3UGF0aDogdGFyZ2V0UGF0aCB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dCwgeyBlZGl0YWJsZSwgcmVjcmVhdGVDb250ZXh0OiB0cnVlLCBmb3JjZUZvY3VzOiB0cnVlIH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgaW4gRWRpdEZsb3cudG9nZ2xlRHJhZnRBY3RpdmUgLSBDYW5ub3QgZmluZCBzaWJsaW5nXCIpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBFZGl0Rmxvdy50b2dnbGVEcmFmdEFjdGl2ZToke29FcnJvcn1gKTtcblx0XHR9XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtzYXAubS5CdXR0b259IG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiAtIEN1cnJlbnRseSB0aGlzIGlzIHBhc3NlZCBhcyBjYW5jZWxCdXR0b24gaW50ZXJuYWxseSAocmVwbGFjZWQgYnkgbVBhcmFtZXRlcnMuY29udHJvbCBpbiB0aGUgSlNEb2MgYmVsb3cpLiBDdXJyZW50bHkgaXQgaXMgYWxzbyBtYW5kYXRvcnkuXG5cdC8vIFBsYW4gLSBUaGlzIHNob3VsZCBub3QgYmUgbWFuZGF0b3J5LiBJZiBub3QgcHJvdmlkZWQsIHdlIHNob3VsZCBoYXZlIGEgZGVmYXVsdCB0aGF0IGNhbiBhY3QgYXMgcmVmZXJlbmNlIGNvbnRyb2wgZm9yIHRoZSBkaXNjYXJkIHBvcG92ZXIgT1Igd2UgY2FuIHNob3cgYSBkaWFsb2cgaW5zdGVhZCBvZiBhIHBvcG92ZXIuXG5cblx0LyoqXG5cdCAqIERpc2NhcmQgdGhlIGVkaXRhYmxlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGVkaXRhYmxlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jb250cm9sIFRoaXMgaXMgdGhlIGNvbnRyb2wgdXNlZCB0byBvcGVuIHRoZSBkaXNjYXJkIHBvcG92ZXJcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiBQUklWQVRFXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIgT3B0aW9uYWwsIHN1cHJlc3NlcyB0aGUgZGlzY2FyZCBwb3BvdmVyIGFuZCBhbGxvd3MgY3VzdG9tIGhhbmRsaW5nXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5za2lwQmFja05hdmlnYXRpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnNraXBCaW5kaW5nVG9WaWV3XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBlZGl0YWJsZSBkb2N1bWVudCBoYXMgYmVlbiBkaXNjYXJkZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgY2FuY2VsRG9jdW1lbnQoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0bVBhcmFtZXRlcnM6IHtcblx0XHRcdGNvbnRyb2w/OiBCdXR0b247XG5cdFx0XHRjYW5jZWxCdXR0b24/OiBCdXR0b247XG5cdFx0XHRza2lwRGlzY2FyZFBvcG92ZXI/OiBib29sZWFuO1xuXHRcdFx0c2tpcEJhY2tOYXZpZ2F0aW9uPzogYm9vbGVhbjtcblx0XHRcdHNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbjtcblx0XHR9XG5cdCk6IFByb21pc2U8Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXG5cdFx0bGV0IHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cdFx0bGV0IGlzTmV3RG9jdW1lbnQgPSBmYWxzZTtcblx0XHRjb25zdCBjYW5jZWxQYXJhbWV0ZXJzOiBDYW5jZWxQYXJhbWV0ZXJzID0ge1xuXHRcdFx0c2tpcERpc2NhcmRQb3BvdmVyOiBtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIgPT09IHRydWUsXG5cdFx0XHRjYW5jZWxCdXR0b246IChtUGFyYW1ldGVycy5jb250cm9sIHx8IG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbikhLFxuXHRcdFx0YmVmb3JlQ2FuY2VsQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURpc2NhcmRcblx0XHR9O1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRcdGlmICgoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5IHx8IG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpKSAmJiB0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cblx0XHRcdFx0Ly8gTm8gbmVlZCB0byB0cnkgdG8gZ2V0IHJpZ2h0bW9zdCBjb250ZXh0IGluIGNhc2Ugb2YgYSBuZXcgb2JqZWN0XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHQob1Jvb3RWaWV3Q29udHJvbGxlciBhcyBGY2xDb250cm9sbGVyKS5nZXRSaWdodG1vc3RDb250ZXh0KCksXG5cdFx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjYW5jZWxSZXN1bHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5jYW5jZWxEb2N1bWVudChcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdGNhbmNlbFBhcmFtZXRlcnMsXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHR0aGlzLmdldENyZWF0aW9uTW9kZSgpLFxuXHRcdFx0XHR0aGlzLmlzRG9jdW1lbnRNb2RpZmllZCgpXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKClcblx0XHRcdFx0LmdldEluc3RhbmNlZFZpZXdzKClcblx0XHRcdFx0LmZvckVhY2goKHZpZXcpID0+IHtcblx0XHRcdFx0XHRjb25zdCBjb250ZXh0ID0gdmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0O1xuXHRcdFx0XHRcdGlmIChjb250ZXh0ICYmIGNvbnRleHQuaXNLZWVwQWxpdmUoKSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dC5zZXRLZWVwQWxpdmUoZmFsc2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsKTtcblxuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQoZmFsc2UpO1xuXHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyRGlzY2FyZCh7XG5cdFx0XHRcdGNvbnRleHQ6IHR5cGVvZiBjYW5jZWxSZXN1bHQgPT09IFwiYm9vbGVhblwiIHx8IGNhbmNlbFJlc3VsdCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGNhbmNlbFJlc3VsdFxuXHRcdFx0fSk7XG5cdFx0XHQvLyB3ZSBmb3JjZSB0aGUgZWRpdCBzdGF0ZSBldmVuIGZvciBGQ0wgYmVjYXVzZSB0aGUgZHJhZnQgZGlzY2FyZCBtaWdodCBub3QgYmUgaW1wbGVtZW50ZWRcblx0XHRcdC8vIGFuZCB3ZSBtYXkganVzdCBkZWxldGUgdGhlIGRyYWZ0XG5cdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdGlmICghY2FuY2VsUmVzdWx0KSB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EaXNjYXJkLCBvQ29udGV4dCk7XG5cdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHQvL2luIGNhc2Ugb2YgYSBuZXcgZG9jdW1lbnQsIG5vIGFjdGl2ZUNvbnRleHQgaXMgcmV0dXJuZWQgLS0+IG5hdmlnYXRlIGJhY2suXG5cdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuc2tpcEJhY2tOYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRcdFx0aXNOZXdEb2N1bWVudCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG9BY3RpdmVEb2N1bWVudENvbnRleHQgPSBjYW5jZWxSZXN1bHQ7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EaXNjYXJkLCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZSA9IG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gb0FjdGl2ZURvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0XHQvLyBXZSBuZWVkIHRvIGxvYWQgdGhlIHNlbWFudGljIGtleXMgb2YgdGhlIGFjdGl2ZSBjb250ZXh0LCBhcyB3ZSBuZWVkIHRoZW1cblx0XHRcdFx0XHQvLyBmb3IgdGhlIG5hdmlnYXRpb25cblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9mZXRjaFNlbWFudGljS2V5VmFsdWVzKG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdC8vIFdlIGZvcmNlIHRoZSByZWNyZWF0aW9uIG9mIHRoZSBjb250ZXh0LCBzbyB0aGF0IGl0J3MgY3JlYXRlZCBhbmQgYm91bmQgaW4gdGhlIHNhbWUgbWljcm90YXNrLFxuXHRcdFx0XHRcdC8vIHNvIHRoYXQgYWxsIHByb3BlcnRpZXMgYXJlIGxvYWRlZCB0b2dldGhlciBieSBhdXRvRXhwYW5kU2VsZWN0LCBzbyB0aGF0IHdoZW4gc3dpdGNoaW5nIGJhY2sgdG8gRWRpdCBtb2RlXG5cdFx0XHRcdFx0Ly8gJCRpbmhlcml0RXhwYW5kU2VsZWN0IHRha2VzIGFsbCBsb2FkZWQgcHJvcGVydGllcyBpbnRvIGFjY291bnQgKEJDUCAyMDcwNDYyMjY1KVxuXHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuc2tpcEJpbmRpbmdUb1ZpZXcpIHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIHsgZWRpdGFibGU6IGZhbHNlLCByZWNyZWF0ZUNvbnRleHQ6IHRydWUsIGZvcmNlRm9jdXM6IHRydWUgfSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBBY3RpdmUgY29udGV4dCBpcyByZXR1cm5lZCBpbiBjYXNlIG9mIGNhbmNlbCBvZiBleGlzdGluZyBkb2N1bWVudCwgYW5kIGl0J3MgdGhlIHNhbWUgYXMgdGhlIGVkaXRlZCBjb250ZXh0XG5cdFx0XHRcdFx0Ly8gU28sIHdlIGZvcmNlIHRoZSByZWNyZWF0aW9uIGFzIGl0IG1heSBoYXZlIGJlZW4gZGVzdHJveWVkIHdoZW4gY2FsbGluZyBzZXRLZWVwQWxpdmUoZmFsc2UpIG9uIGFsbCB2aWV3J3MgY29udGV4dHNcblx0XHRcdFx0XHQvLyBlYXJsaWVyIGluIHRoaXMgbWV0aG9kXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgeyBlZGl0YWJsZTogZmFsc2UsIHJlY3JlYXRlQ29udGV4dDogdHJ1ZSwgZm9yY2VGb2N1czogdHJ1ZSB9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdC8vc2hvdyBEcmFmdCBkaXNjYXJkZWQgbWVzc2FnZSB0b2FzdCBvbmx5IGZvciBkcmFmdCBlbmFibGVkIGFwcHNcblx0XHRcdFx0dGhpcy5zaG93RG9jdW1lbnREaXNjYXJkTWVzc2FnZShpc05ld0RvY3VtZW50KTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRpc2NhcmRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBCcmluZ3MgdXAgYSBtZXNzYWdlIHRvYXN0IHdoZW4gYSBkcmFmdCBpcyBkaXNjYXJkZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBpc05ld0RvY3VtZW50IFRoaXMgaXMgYSBCb29sZWFuIGZsYWcgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRvY3VtZW50IGlzIG5ldyBvciBhbHJlYWR5IGV4aXN0cy5cblx0ICovXG5cdHNob3dEb2N1bWVudERpc2NhcmRNZXNzYWdlKGlzTmV3RG9jdW1lbnQ/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IHRoaXMuX2dldFJlc291cmNlTW9kZWwoKTtcblx0XHRjb25zdCBtZXNzYWdlID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRElTQ0FSRF9EUkFGVF9UT0FTVFwiKTtcblx0XHRpZiAoaXNOZXdEb2N1bWVudCA9PSB0cnVlKSB7XG5cdFx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdFx0YXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuYXR0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQoe30sIHRoaXMuc2hvd01lc3NhZ2VXaGVuTm9Db250ZXh0LCB0aGlzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0TWVzc2FnZVRvYXN0LnNob3cobWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFdlIHVzZSB0aGlzIGZ1bmN0aW9uIGluIHNob3dEb2N1bWVudERpc2NhcmRNZXNzYWdlIHdoZW4gbm8gY29udGV4dCBpcyBwYXNzZWQuXG5cdCAqL1xuXHRzaG93TWVzc2FnZVdoZW5Ob0NvbnRleHQoKTogdm9pZCB7XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IHRoaXMuX2dldFJlc291cmNlTW9kZWwoKTtcblx0XHRjb25zdCBtZXNzYWdlID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRElTQ0FSRF9EUkFGVF9UT0FTVFwiKTtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdE1lc3NhZ2VUb2FzdC5zaG93KG1lc3NhZ2UpO1xuXHRcdGFwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmRldGFjaEFmdGVyUm91dGVNYXRjaGVkKHRoaXMuc2hvd01lc3NhZ2VXaGVuTm9Db250ZXh0LCB0aGlzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBjb250ZXh0IGNvcnJlc3BvbmRzIHRvIGEgZHJhZnQgcm9vdC5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gY2hlY2tcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY29udGV4dCBwb2ludHMgdG8gYSBkcmFmdCByb290XG5cdCAqL1xuXHRwcml2YXRlIGlzRHJhZnRSb290KGNvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdHJldHVybiBNb2RlbEhlbHBlci5pc0RyYWZ0Um9vdChnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnRhcmdldEVudGl0eVNldCk7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgTmFtZSBvZiB0aGUgRW50aXR5U2V0IHRvIHdoaWNoIHRoZSBvYmplY3QgYmVsb25nc1xuXG5cdC8qKlxuXHQgKiBEZWxldGVzIHRoZSBkb2N1bWVudC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnRpdGxlIFRpdGxlIG9mIHRoZSBvYmplY3QgYmVpbmcgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5kZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlbGV0ZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSBQUklWQVRFXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBkb2N1bWVudCBoYXMgYmVlbiBkZWxldGVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGRlbGV0ZURvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0LCBtSW5QYXJhbWV0ZXJzPzogeyBlbnRpdHlTZXROYW1lOiBzdHJpbmc7IHRpdGxlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRiZWZvcmVEZWxldGVDYWxsQmFjaz86IEZ1bmN0aW9uO1xuXHRcdFx0cmVxdWVzdFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdGNvbnRyb2xJZD86IHN0cmluZztcblx0XHRcdHBhcmVudENvbnRyb2w/OiBDb250cm9sO1xuXHRcdFx0YkZpbmRBY3RpdmVDb250ZXh0czogYm9vbGVhbjtcblx0XHRcdHNlbGVjdGVkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0XHR0aXRsZT86IHN0cmluZztcblx0XHRcdGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXHRcdH0gPSB7IC4uLm1JblBhcmFtZXRlcnMsIGJGaW5kQWN0aXZlQ29udGV4dHM6IGZhbHNlLCBiZWZvcmVEZWxldGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlIH07XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHR0aGlzLl9pc0ZjbEVuYWJsZWQoKSAmJlxuXHRcdFx0XHR0aGlzLmlzRHJhZnRSb290KG9Db250ZXh0KSAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRJbmRleCgpID09PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0b0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0RyYWZ0RW50aXR5XCIpID09PSB0cnVlXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gRGVsZXRpbmcgYW4gYWN0aXZlIGVudGl0eSB3aGljaCBoYXMgYSBkcmFmdCB0aGF0IGNvdWxkIHBvdGVudGlhbGx5IGJlIGRpc3BsYXllZCBpbiB0aGUgTGlzdFJlcG9ydCAoRkNMIGNhc2UpXG5cdFx0XHRcdC8vIC0tPiBuZWVkIHRvIHJlbW92ZSB0aGUgZHJhZnQgZnJvbSB0aGUgTFIgYW5kIHJlcGxhY2UgaXQgd2l0aCB0aGUgYWN0aXZlIHZlcnNpb24sIHNvIHRoYXQgdGhlIExpc3RCaW5kaW5nIGlzIHByb3Blcmx5IHJlZnJlc2hlZFxuXHRcdFx0XHQvLyBUaGUgY29uZGl0aW9uICdvQ29udGV4dC5nZXRJbmRleCgpID09PSB1bmRlZmluZWQnIG1ha2VzIHN1cmUgdGhlIGFjdGl2ZSB2ZXJzaW9uIGlzbid0IGFscmVhZHkgZGlzcGxheWVkIGluIHRoZSBMUlxuXHRcdFx0XHRtUGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IGFzeW5jIChwYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlKHBhcmFtZXRlcnMpO1xuXG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNvbnN0IG1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRcdFx0XHRcdGNvbnN0IHNpYmxpbmdDb250ZXh0ID0gbW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9TaWJsaW5nRW50aXR5YCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRjb25zdCBkcmFmdFBhdGggPSBhd2FpdCBzaWJsaW5nQ29udGV4dC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgZHJhZnRDb250ZXh0VG9SZW1vdmUgPSBtb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KGRyYWZ0UGF0aCk7XG5cdFx0XHRcdFx0XHRkcmFmdENvbnRleHRUb1JlbW92ZS5yZXBsYWNlV2l0aChvQ29udGV4dCk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcGxhY2luZyB0aGUgZHJhZnQgaW5zdGFuY2UgaW4gdGhlIExSIE9ETEJcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRoaXMuZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXG5cdFx0XHQvLyBTaW5nbGUgb2JqZXQgZGVsZXRpb24gaXMgdHJpZ2dlcmVkIGZyb20gYW4gT1AgaGVhZGVyIGJ1dHRvbiAobm90IGZyb20gYSBsaXN0KVxuXHRcdFx0Ly8gLS0+IE1hcmsgVUkgZGlydHkgYW5kIG5hdmlnYXRlIGJhY2sgdG8gZGlzbWlzcyB0aGUgT1Bcblx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBjb250ZXh0QmluZGluZyA9IG9Db250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRcdFx0Y29uc3QgcGFyZW50TGlzdEJpbmRpbmcgPSBjb250ZXh0QmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKVxuXHRcdFx0XHRcdD8gY29udGV4dEJpbmRpbmdcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblxuXHRcdFx0XHR0aGlzLnJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlKHBhcmVudExpc3RCaW5kaW5nLCBwYXJlbnRMaXN0QmluZGluZz8uZ2V0Q29udGV4dCgpKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRlbGV0ZSwgb0NvbnRleHQpO1xuXG5cdFx0XHQvLyBBZnRlciBkZWxldGUgaXMgc3VjY2Vzc2Z1bGwsIHdlIG5lZWQgdG8gZGV0YWNoIHRoZSBzZXRCYWNrTmF2aWdhdGlvbiBNZXRob2RzXG5cdFx0XHRvQXBwQ29tcG9uZW50Py5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24oKTtcblx0XHRcdGNvbnN0IGlzUmVjb21tZW5kYXRpb25FbmFibGVkID0gdGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5pc1JlY29tbWVuZGF0aW9uRW5hYmxlZCgpO1xuXHRcdFx0Ly8gV2UgY2xlYXIgcmVjb21tZW5kYXRpb24gZGF0YSBhbmQgY29udGV4dHMgZnJvbSBpbnRlcm5hbCBtb2RlbCBmb3IgdGhlIGRlbGV0ZWQgY29udGV4dHNcblx0XHRcdGlmIChpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCkge1xuXHRcdFx0XHR0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLmlnbm9yZVJlY29tbWVuZGF0aW9uRm9yQ29udGV4dHMoW29Db250ZXh0XSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBOb3RpZnkgY29uc3VtZXJzIG9mIHdoaWNoIGNvbnRleHRzIHdlcmUgZGVsZXRlZFxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJEZWxldGUoeyBjb250ZXh0czogW29Db250ZXh0XSB9KTtcblxuXHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRpZiAob0FwcENvbXBvbmVudD8uZ2V0U3RhcnR1cE1vZGUoKSA9PT0gU3RhcnR1cE1vZGUuRGVlcGxpbmspIHtcblx0XHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBhcHAgaGFzIGJlZW4gbGF1bmNoZWQgd2l0aCBzZW1hbnRpYyBrZXlzLCBkZWxldGluZyB0aGUgb2JqZWN0IHdlJ3ZlIGxhbmRlZCBvbiBzaGFsbCBuYXZpZ2F0ZSBiYWNrXG5cdFx0XHRcdFx0Ly8gdG8gdGhlIGFwcCB3ZSBjYW1lIGZyb20gKGV4Y2VwdCBmb3IgRkNMLCB3aGVyZSB3ZSBuYXZpZ2F0ZSB0byBMUiBhcyB1c3VhbClcblx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZXhpdEZyb21BcHAoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBFbHNlIG5hdmlnYXRlIGJhY2sgZnJvbSB0aGUgcGFnZS4gSW4gRkNMLCB0aGlzIGlzIGRvbmUgd2hlbiB0aGUga2VwdC1hbGl2ZSBjb250ZXh0IGlzIGRlc3Ryb3llZCAoY2FsbGJhY2spXG5cdFx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlcygpO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZWxldGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3VibWl0IHRoZSBjdXJyZW50IHNldCBvZiBjaGFuZ2VzIGFuZCBuYXZpZ2F0ZSBiYWNrLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGRvY3VtZW50XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgY2hhbmdlcyBoYXZlIGJlZW4gc2F2ZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgYXBwbHlEb2N1bWVudChvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0aWYgKG9Db250ZXh0LmdldE1vZGVsKCkuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0XHRhd2FpdCB0aGlzLl9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dCk7XG5cdFx0XHRcdC8vd2UgbmVlZCB0byByZXF1ZXN0IGZvciByZWNvbW1lbmRhdGlvbnMgYW5kIHRoZW4gYnJpbmcgdGhlIGRpYWxvZyBoZXJlXG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5jaGVja0lmUmVjb21tZW5kYXRpb25zRXhpc3QoKSkge1xuXHRcdFx0XHRjb25zdCBpc0NvbnRpbnVlID0gYXdhaXQgdGhpcy5zaG93Q29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyhmYWxzZSk7XG5cdFx0XHRcdGlmIChpc0NvbnRpbnVlID09PSBSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uLkNvbnRpbnVlKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblx0XHRcdGF3YWl0IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb25dIEJvb2xlYW4gdmFsdWUgZm9yIHN0YXRpYyBhY3Rpb24sIHVuZGVmaW5lZCBmb3Igb3RoZXIgYWN0aW9uc1xuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5pc05hdmlnYWJsZV0gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgbmF2aWdhdGlvbiBpcyByZXF1aXJlZCBhZnRlciB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkXG5cdC8vIEN1cnJlbnRseSB0aGUgcGFyYW1ldGVyIGlzTmF2aWdhYmxlIGlzIHVzZWQgaW50ZXJuYWxseSBhbmQgc2hvdWxkIGJlIGNoYW5nZWQgdG8gcmVxdWlyZXNOYXZpZ2F0aW9uIGFzIGl0IGlzIGEgbW9yZSBhcHQgbmFtZSBmb3IgdGhpcyBwYXJhbVxuXG5cdC8qKlxuXHQgKiBJbnZva2VzIGFuIGFjdGlvbiAoYm91bmQgb3IgdW5ib3VuZCkgYW5kIHRyYWNrcyB0aGUgY2hhbmdlcyBzbyB0aGF0IG90aGVyIHBhZ2VzIGNhbiBiZSByZWZyZXNoZWQgYW5kIHNob3cgdGhlIHVwZGF0ZWQgZGF0YSB1cG9uIG5hdmlnYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlcyBBIG1hcCBvZiBhY3Rpb24gcGFyYW1ldGVyIG5hbWVzIGFuZCBwcm92aWRlZCB2YWx1ZXNcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyBTa2lwcyB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2cgaWYgdmFsdWVzIGFyZSBwcm92aWRlZCBmb3IgYWxsIG9mIHRoZW0gaW4gcGFyYW1ldGVyVmFsdWVzXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNvbnRleHRzIEZvciBhIGJvdW5kIGFjdGlvbiwgYSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgdG8gYmUgY2FsbGVkIG11c3QgYmUgcHJvdmlkZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMubW9kZWwgRm9yIGFuIHVuYm91bmQgYWN0aW9uLCBhbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbCBtdXN0IGJlIHByb3ZpZGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnJlcXVpcmVzTmF2aWdhdGlvbiBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBuYXZpZ2F0aW9uIGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBhY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWQuIE5hdmlnYXRpb24gdGFrZXMgcGxhY2UgdG8gdGhlIGNvbnRleHQgcmV0dXJuZWQgYnkgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5sYWJlbCBBIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUgYWN0aW9uLiBUaGlzIGlzIG5lZWRlZCBpbiBjYXNlIHRoZSBhY3Rpb24gaGFzIGEgcGFyYW1ldGVyIGFuZCBhIHBhcmFtZXRlciBkaWFsb2cgaXMgc2hvd24gdG8gdGhlIHVzZXIuIFRoZSBsYWJlbCB3aWxsIGJlIHVzZWQgZm9yIHRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nIGFuZCBmb3IgdGhlIGNvbmZpcm1hdGlvbiBidXR0b25cblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nIE1vZGUgaG93IGFjdGlvbnMgYXJlIHRvIGJlIGNhbGxlZDogJ0NoYW5nZVNldCcgdG8gcHV0IGFsbCBhY3Rpb24gY2FsbHMgaW50byBvbmUgY2hhbmdlc2V0LCAnSXNvbGF0ZWQnIHRvIHB1dCB0aGVtIGludG8gc2VwYXJhdGUgY2hhbmdlc2V0c1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5pc05hdmlnYWJsZSBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXAgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jb250cm9sSWQgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuYXBwbGljYWJsZUNvbnRleHRzIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRzIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZW5hYmxlQXV0b1Njcm9sbCBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiBQUklWQVRFXG5cdCAqIEBwYXJhbSBtRXh0cmFQYXJhbXMgUFJJVkFURVxuXHQgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgb25jZSB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLCBwcm92aWRpbmcgdGhlIHJlc3BvbnNlXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKiBAZmluYWxcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBpbnZva2VBY3Rpb24oXG5cdFx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0XHRtSW5QYXJhbWV0ZXJzPzoge1xuXHRcdFx0cGFyYW1ldGVyVmFsdWVzPzogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXTtcblx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0Y29udGV4dHM/OiBDb250ZXh0IHwgQ29udGV4dFtdO1xuXHRcdFx0bW9kZWw/OiBPRGF0YU1vZGVsO1xuXHRcdFx0cmVxdWlyZXNOYXZpZ2F0aW9uPzogYm9vbGVhbjtcblx0XHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdFx0aXNOYXZpZ2FibGU/OiBib29sZWFuO1xuXHRcdFx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0XHRcdGludm9jYXRpb25Hcm91cGluZz86IHN0cmluZztcblx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcD86IHN0cmluZztcblx0XHRcdGNvbnRyb2xJZD86IHN0cmluZztcblx0XHRcdGJTdGF0aWNBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0YXBwbGljYWJsZUNvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0bm90QXBwbGljYWJsZUNvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0ZW5hYmxlQXV0b1Njcm9sbD86IGJvb2xlYW47XG5cdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24/OiBzdHJpbmc7XG5cdFx0fSxcblx0XHRtRXh0cmFQYXJhbXM/OiB7fVxuXHQpOiBQcm9taXNlPHVua25vd24+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRsZXQgYVBhcnRzO1xuXHRcdGxldCBzT3ZlcmxvYWRFbnRpdHlUeXBlO1xuXHRcdGxldCBvQ3VycmVudEFjdGlvbkNhbGxCYWNrczpcblx0XHRcdHwge1xuXHRcdFx0XHRcdGZSZXNvbHZlcjogRnVuY3Rpb247XG5cdFx0XHRcdFx0ZlJlamVjdG9yOiBGdW5jdGlvbjtcblx0XHRcdCAgfVxuXHRcdFx0fCB1bmRlZmluZWQ7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXG5cdFx0Ly8gRHVlIHRvIGEgbWlzdGFrZSB0aGUgaW52b2tlQWN0aW9uIGluIHRoZSBleHRlbnNpb25BUEkgaGFkIGEgZGlmZmVyZW50IEFQSSB0aGFuIHRoaXMgb25lLlxuXHRcdC8vIFRoZSBvbmUgZnJvbSB0aGUgZXh0ZW5zaW9uQVBJIGRvZXNuJ3QgZXhpc3QgYW55bW9yZSBhcyB3ZSBleHBvc2UgdGhlIGZ1bGwgZWRpdCBmbG93IG5vdyBidXRcblx0XHQvLyBkdWUgdG8gY29tcGF0aWJpbGl0eSByZWFzb25zIHdlIHN0aWxsIG5lZWQgdG8gc3VwcG9ydCB0aGUgb2xkIHNpZ25hdHVyZVxuXHRcdGlmIChcblx0XHRcdCgobUluUGFyYW1ldGVycyBhcyBDb250ZXh0KT8uaXNBICYmIChtSW5QYXJhbWV0ZXJzIGFzIENvbnRleHQpPy5pc0E8Q29udGV4dD4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiKSkgfHxcblx0XHRcdEFycmF5LmlzQXJyYXkobUluUGFyYW1ldGVycykgfHxcblx0XHRcdG1FeHRyYVBhcmFtcyAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBjb250ZXh0czogT0RhdGFWNENvbnRleHQgfCBPRGF0YVY0Q29udGV4dFtdIHwgdW5kZWZpbmVkID0gbUluUGFyYW1ldGVycyBhcyBPRGF0YVY0Q29udGV4dCB8IE9EYXRhVjRDb250ZXh0W10gfCB1bmRlZmluZWQ7XG5cdFx0XHRtSW5QYXJhbWV0ZXJzID0gbUV4dHJhUGFyYW1zIHx8IHt9O1xuXHRcdFx0aWYgKGNvbnRleHRzKSB7XG5cdFx0XHRcdG1JblBhcmFtZXRlcnMuY29udGV4dHMgPSBjb250ZXh0cztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1JblBhcmFtZXRlcnMubW9kZWwgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgbVBhcmFtZXRlcnM6IHtcblx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzPzogQmluZENvbnRleHRQYXJhbWV0ZXJzO1xuXHRcdFx0YlN0YXRpY0FjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRwYXJhbWV0ZXJWYWx1ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xuXHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdFx0YkdldEJvdW5kQ29udGV4dD86IGJvb2xlYW47XG5cdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc/OiBzdHJpbmc7XG5cdFx0XHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRcdFx0Y29udGV4dHM/OiBPRGF0YVY0Q29udGV4dCB8IE9EYXRhVjRDb250ZXh0W10gfCBudWxsO1xuXHRcdFx0bW9kZWw/OiBPRGF0YU1vZGVsO1xuXHRcdFx0cGFyZW50Q29udHJvbDogRkVWaWV3O1xuXHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0aXNOYXZpZ2FibGU/OiBib29sZWFuO1xuXHRcdFx0YXBwbGljYWJsZUNvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0cmVxdWlyZXNOYXZpZ2F0aW9uPzogYm9vbGVhbjtcblx0XHRcdGJPYmplY3RQYWdlPzogYm9vbGVhbjtcblx0XHRcdGJJc0NyZWF0ZUFjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA/OiBzdHJpbmc7XG5cdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHRcdGdyb3VwSWQ/OiBzdHJpbmc7XG5cdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24/OiBzdHJpbmc7XG5cdFx0XHRlbmFibGVBdXRvU2Nyb2xsPzogYm9vbGVhbjtcblx0XHRcdGlzQm91bmQ/OiBib29sZWFuO1xuXHRcdFx0aWdub3JlRVRhZz86IGJvb2xlYW47XG5cdFx0fSA9IHsgLi4ubUluUGFyYW1ldGVycywgcGFyZW50Q29udHJvbDogdGhpcy5iYXNlLmdldFZpZXcoKSB9IHx8IHsgcGFyZW50Q29udHJvbDogdGhpcy5iYXNlLmdldFZpZXcoKSB9O1xuXG5cdFx0bVBhcmFtZXRlcnMuaXNOYXZpZ2FibGUgPSBtUGFyYW1ldGVycy5yZXF1aXJlc05hdmlnYXRpb24gfHwgbVBhcmFtZXRlcnMuaXNOYXZpZ2FibGU7XG5cblx0XHQvLyBEZXRlcm1pbmUgaWYgdGhlIHJlZmVyZW5jZWQgYWN0aW9uIGlzIGJvdW5kIG9yIHVuYm91bmRcblx0XHRjb25zdCBjb252ZXJ0ZWRNZXRhZGF0YSA9IGNvbnZlcnRUeXBlcyh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCk7XG5cdFx0Ly8gVGhlIEVudGl0eUNvbnRhaW5lciBtYXkgTk9UIGJlIG1pc3NpbmcsIHNvIGl0IHNob3VsZCBub3QgYmUgYWJsZSB0byBiZSB1bmRlZmluZWQsIGJ1dCBzaW5jZSBpbiBvdXIgY29udmVydGVkIE1ldGFkYXRhXG5cdFx0Ly8gaXQgY2FuIGJlIHVuZGVmaW5lZCwgSSBuZWVkIHRoaXMgd29ya2Fyb3VuZCBoZXJlIG9mIGFkZGluZyBcIlwiIHNpbmNlIGluZGV4T2YgZG9lcyBub3QgYWNjZXB0IHNvbWV0aGluZyB0aGF0J3Ncblx0XHQvLyB1bmRlZmluZWQuXG5cdFx0aWYgKHNBY3Rpb25OYW1lLmluY2x1ZGVzKFwiXCIgKyBjb252ZXJ0ZWRNZXRhZGF0YS5lbnRpdHlDb250YWluZXIubmFtZSkpIHtcblx0XHRcdC8vIFVuYm91bmQgYWN0aW9ucyBhcmUgYWx3YXlzIHJlZmVyZW5jZWQgdmlhIHRoZSBhY3Rpb24gaW1wb3J0IGFuZCB3ZSBmb3VuZCB0aGUgRW50aXR5Q29udGFpbmVyIGluIHRoZSBzQWN0aW9uTmFtZSBzb1xuXHRcdFx0Ly8gYW4gdW5ib3VuZCBhY3Rpb24gaXMgcmVmZXJlbmNlZCFcblx0XHRcdG1QYXJhbWV0ZXJzLmlzQm91bmQgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTm8gZW50aXR5IGNvbnRhaW5lciBpbiB0aGUgc0FjdGlvbk5hbWUsIHNvIGVpdGhlciBhIGJvdW5kIG9yIHN0YXRpYyBhY3Rpb24gaXMgcmVmZXJlbmNlZCB3aGljaCBpcyBhbHNvIGJvdW5kIVxuXHRcdFx0bVBhcmFtZXRlcnMuaXNCb3VuZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCFtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lICYmIG1QYXJhbWV0ZXJzLmNvbnRleHRzICYmIG1QYXJhbWV0ZXJzLm1vZGVsKSB7XG5cdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lID0gbVBhcmFtZXRlcnMubW9kZWxcblx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdC5nZXRNZXRhQ29udGV4dCgobVBhcmFtZXRlcnMuY29udGV4dHMgYXMgQ29udGV4dCkuZ2V0UGF0aCgpKVxuXHRcdFx0XHQuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIik7XG5cdFx0fVxuXHRcdGxldCBvQ29udHJvbDogQ29udHJvbCB8IHVuZGVmaW5lZDtcblx0XHRpZiAobVBhcmFtZXRlcnMuY29udHJvbElkKSB7XG5cdFx0XHRvQ29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKSBhcyBDb250cm9sO1xuXHRcdFx0aWYgKG9Db250cm9sKSB7XG5cdFx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSB0aGlzIHNlbGVjdGVkIGNvbnRleHRzIHVwZGF0ZSBpcyBkb25lIHdpdGhpbiB0aGUgb3BlcmF0aW9uLCBzaG91bGQgYmUgbW92ZWQgb3V0XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb0NvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0fVxuXG5cdFx0Ly8gaWYgc3RpY2t5IHNlc3Npb24gaXMgZW5hYmxlZCB3ZSB0cmlnZ2VyIGFjdGlvbnMgd2l0aG91dCBlVGFnXG5cdFx0bVBhcmFtZXRlcnMuaWdub3JlRVRhZyA9IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0Py5nZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIik7XG5cblx0XHRpZiAoc0FjdGlvbk5hbWUgJiYgc0FjdGlvbk5hbWUuaW5jbHVkZXMoXCIoXCIpKSB7XG5cdFx0XHQvLyBnZXQgZW50aXR5IHR5cGUgb2YgYWN0aW9uIG92ZXJsb2FkIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgYWN0aW9uIHBhdGhcblx0XHRcdC8vIEV4YW1wbGUgc0FjdGlvbk5hbWUgPSBcIjxBY3Rpb25OYW1lPihDb2xsZWN0aW9uKDxPdmVybG9hZEVudGl0eVR5cGU+KSlcIlxuXHRcdFx0Ly8gc0FjdGlvbk5hbWUgPSBhUGFydHNbMF0gLS0+IDxBY3Rpb25OYW1lPlxuXHRcdFx0Ly8gc092ZXJsb2FkRW50aXR5VHlwZSA9IGFQYXJ0c1syXSAtLT4gPE92ZXJsb2FkRW50aXR5VHlwZT5cblx0XHRcdGFQYXJ0cyA9IHNBY3Rpb25OYW1lLnNwbGl0KFwiKFwiKTtcblx0XHRcdHNBY3Rpb25OYW1lID0gYVBhcnRzWzBdO1xuXHRcdFx0c092ZXJsb2FkRW50aXR5VHlwZSA9IGFQYXJ0c1thUGFydHMubGVuZ3RoIC0gMV0ucmVwbGFjZUFsbChcIilcIiwgXCJcIik7XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb24gJiYgb0NvbnRyb2wpIHtcblx0XHRcdGlmIChvQ29udHJvbC5pc0EgJiYgb0NvbnRyb2wuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikgJiYgb0NvbnRyb2wuaXNUYWJsZUJvdW5kKCkpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSAoXG5cdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKT8uYmluZExpc3Qob0NvbnRyb2wuZ2V0Um93QmluZGluZygpLmdldEhlYWRlckNvbnRleHQoKSEuZ2V0UGF0aCgpKSBhcyBPRGF0YUxpc3RCaW5kaW5nXG5cdFx0XHRcdCkuZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgc0JpbmRpbmdQYXRoID0gb0NvbnRyb2wuZGF0YShcInJvd3NCaW5kaW5nSW5mb1wiKS5wYXRoLFxuXHRcdFx0XHRcdG9MaXN0QmluZGluZyA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoKS5iaW5kTGlzdChzQmluZGluZ1BhdGgpO1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IG9MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzT3ZlcmxvYWRFbnRpdHlUeXBlICYmIG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KCkgJiYgb0NvbnRyb2wuaXNBICYmIG9Db250cm9sLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gdGhpcy5fZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbU1ldGFkYXRhUGF0aChcblx0XHRcdFx0XHRvQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0LFxuXHRcdFx0XHRcdG9Db250cm9sLmdldFJvd0JpbmRpbmcoKSxcblx0XHRcdFx0XHRzT3ZlcmxvYWRFbnRpdHlUeXBlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtUGFyYW1ldGVycy5lbmFibGVBdXRvU2Nyb2xsKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzID0gdGhpcy5jcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lLCBvQ29udHJvbC5nZXRJZCgpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0bVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dCA9IHRoaXMuX2dldEJvdW5kQ29udGV4dChvVmlldywgbVBhcmFtZXRlcnMpO1xuXHRcdC8vIE5lZWQgdG8ga25vdyB0aGF0IHRoZSBhY3Rpb24gaXMgY2FsbGVkIGZyb20gT2JqZWN0UGFnZSBmb3IgY2hhbmdlU2V0IElzb2xhdGVkIHdvcmthcm91bmRcblx0XHRtUGFyYW1ldGVycy5iT2JqZWN0UGFnZSA9IG9WaWV3LmdldFZpZXdEYXRhKCkuY29udmVydGVyVHlwZSA9PT0gXCJPYmplY3RQYWdlXCI7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0bGV0IG9SZXNwb25zZSA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmNhbGxBY3Rpb24oXG5cdFx0XHRcdHNBY3Rpb25OYW1lLFxuXHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKVxuXHRcdFx0KTtcblx0XHRcdGxldCBsaXN0UmVmcmVzaGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzICYmIEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpICYmIG1QYXJhbWV0ZXJzLmlzQm91bmQgPT09IHRydWUpIHtcblx0XHRcdFx0bGlzdFJlZnJlc2hlZCA9IGF3YWl0IHRoaXMuX3JlZnJlc2hMaXN0SWZSZXF1aXJlZChcblx0XHRcdFx0XHR0aGlzLmdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWUsIG9SZXNwb25zZSksXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHNbMF1cblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkpIHtcblx0XHRcdFx0bGV0IGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRcdGlmIChvUmVzcG9uc2UpIHtcblx0XHRcdFx0XHRhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzID0gQXJyYXkuaXNBcnJheShvUmVzcG9uc2UpXG5cdFx0XHRcdFx0XHQ/IE9iamVjdC5rZXlzKChvUmVzcG9uc2VbMF0gYXMgUHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD4pLnZhbHVlPy5nZXRPYmplY3QoKSlcblx0XHRcdFx0XHRcdDogT2JqZWN0LmtleXMob1Jlc3BvbnNlLmdldE9iamVjdCgpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQWN0aW9uLCBtUGFyYW1ldGVycy5jb250ZXh0cywgc0FjdGlvbk5hbWUsIGxpc3RSZWZyZXNoZWQsIGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXMpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoc0FjdGlvbk5hbWUsIFRyaWdnZXJUeXBlLmFjdGlvbik7XG5cblx0XHRcdGlmIChvQ3VycmVudEFjdGlvbkNhbGxCYWNrcykge1xuXHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcy5mUmVzb2x2ZXIob1Jlc3BvbnNlKTtcblx0XHRcdH1cblx0XHRcdC8qXG5cdFx0XHRcdFx0V2Ugc2V0IHRoZSAodXBwZXIpIHBhZ2VzIHRvIGRpcnR5IGFmdGVyIGFuIGV4ZWN1dGlvbiBvZiBhbiBhY3Rpb25cblx0XHRcdFx0XHRUT0RPOiBnZXQgcmlkIG9mIHRoaXMgd29ya2Fyb3VuZFxuXHRcdFx0XHRcdFRoaXMgd29ya2Fyb3VuZCBpcyBvbmx5IG5lZWRlZCBhcyBsb25nIGFzIHRoZSBtb2RlbCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzeW5jaHJvbml6YXRpb24uXG5cdFx0XHRcdFx0T25jZSB0aGlzIGlzIHN1cHBvcnRlZCB3ZSBkb24ndCBuZWVkIHRvIHNldCB0aGUgcGFnZXMgdG8gZGlydHkgYW55bW9yZSBhcyB0aGUgY29udGV4dCBpdHNlbGZcblx0XHRcdFx0XHRpcyBhbHJlYWR5IHJlZnJlc2hlZCAoaXQncyBqdXN0IG5vdCByZWZsZWN0ZWQgaW4gdGhlIG9iamVjdCBwYWdlKVxuXHRcdFx0XHRcdHdlIGV4cGxpY2l0bHkgZG9uJ3QgY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHRoZSBsaXN0IHJlcG9ydCBidXQgb25seSBjYWxsIGl0IGZyb20gdGhlIG9iamVjdCBwYWdlXG5cdFx0XHRcdFx0YXMgaWYgaXQgaXMgY2FsbGVkIGluIHRoZSBsaXN0IHJlcG9ydCBpdCdzIG5vdCBuZWVkZWQgLSBhcyB3ZSBhbnl3YXkgd2lsbCByZW1vdmUgdGhpcyBsb2dpY1xuXHRcdFx0XHRcdHdlIGNhbiBsaXZlIHdpdGggdGhpc1xuXHRcdFx0XHRcdHdlIG5lZWQgYSBjb250ZXh0IHRvIHNldCB0aGUgdXBwZXIgcGFnZXMgdG8gZGlydHkgLSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSB3ZSB1c2UgdGhlXG5cdFx0XHRcdFx0Zmlyc3Qgb25lIGFzIHRoZXkgYXJlIGFueXdheSBzaWJsaW5nc1xuXHRcdFx0XHRcdCovXG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuY29udGV4dHMpIHtcblx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSAmJiB0aGlzLmJhc2UuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkuY29udmVydGVyVHlwZSAhPT0gXCJMaXN0UmVwb3J0XCIpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCBzQWN0aW9uTmFtZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuaXNOYXZpZ2FibGUpIHtcblx0XHRcdFx0bGV0IHZDb250ZXh0ID0gb1Jlc3BvbnNlO1xuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh2Q29udGV4dCkgJiYgdkNvbnRleHQubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0dkNvbnRleHQgPSAodkNvbnRleHRbMF0gYXMgUHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD4pLnZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh2Q29udGV4dCAmJiAhQXJyYXkuaXNBcnJheSh2Q29udGV4dCkpIHtcblx0XHRcdFx0XHRjb25zdCBjb250ZXh0ID0gdkNvbnRleHQ7XG5cdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdFx0Y29uc3Qgc0NvbnRleHRNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdGNvbnN0IF9mblZhbGlkQ29udGV4dHMgPSAoY29udGV4dHM6IENvbnRleHRbXSwgYXBwbGljYWJsZUNvbnRleHRzPzogQ29udGV4dFtdKTogQ29udGV4dFtdID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBjb250ZXh0cy5maWx0ZXIoKGVsZW1lbnQpID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKGFwcGxpY2FibGVDb250ZXh0cykge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBhcHBsaWNhYmxlQ29udGV4dHMuaW5jbHVkZXMoZWxlbWVudCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGNvbnN0IG9BY3Rpb25Db250ZXh0ID0gQXJyYXkuaXNBcnJheShtUGFyYW1ldGVycy5jb250ZXh0cylcblx0XHRcdFx0XHRcdD8gX2ZuVmFsaWRDb250ZXh0cyhtUGFyYW1ldGVycy5jb250ZXh0cywgbVBhcmFtZXRlcnMuYXBwbGljYWJsZUNvbnRleHRzKVswXVxuXHRcdFx0XHRcdFx0OiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHRcdFx0XHRjb25zdCBzQWN0aW9uQ29udGV4dE1ldGFQYXRoID0gb0FjdGlvbkNvbnRleHQgJiYgb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQWN0aW9uQ29udGV4dC5nZXRQYXRoKCkpO1xuXG5cdFx0XHRcdFx0aWYgKHNDb250ZXh0TWV0YVBhdGggIT0gdW5kZWZpbmVkICYmIHNDb250ZXh0TWV0YVBhdGggPT09IHNBY3Rpb25Db250ZXh0TWV0YVBhdGgpIHtcblx0XHRcdFx0XHRcdGlmIChvQWN0aW9uQ29udGV4dD8uZ2V0UGF0aCgpICE9PSBjb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChjb250ZXh0LCB7XG5cdFx0XHRcdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IHRydWVcblx0XHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIGFjdGlvbiByZXR1cm5zIGEgZHJhZnQgY29udGV4dCwgd2UgYWxyZWFkeSB0YWtlIGNhcmUgZHVyaW5nIG5hdmlnYXRpb24gdG8gZWl0aGVyIGNyZWF0ZSBhIG5ld1xuXHRcdFx0XHRcdFx0XHQvLyAoZnVsbCBzY3JlZW4pIG9yIHRvIHVzZSB0aGUgbGlzdCBiaW5kaW5nIGNvbnRleHQgYWZ0ZXIgcmVmcmVzaCAoYW5kIG5vdCB0aGUgcmV0dXJuIHZhbHVlIGNvbnRleHQpLlxuXHRcdFx0XHRcdFx0XHQvLyBJZiB0aGUgZHJhZnQgaXMgZGlzY2FyZGVkIG9yIGFjdGl2YXRlZCwgaGF2aW5nIHRoZSBjb250ZXh0IHN0aWxsIGFzIGRlcGVuZGVudCBjb250ZXh0IGNhdXNlIGlzc3Vlc1xuXHRcdFx0XHRcdFx0XHQvLyAoZS5nLiBpZiBhIHNpZGUgZWZmZWN0IGlzIHRyaWdnZXJlZCkuIFRoZXJlZm9yZSwgd2UgZGVzdHJveSB0aGUgcmV0dXJuIHZhbHVlIGNvbnRleHQgaGVyZSxcblx0XHRcdFx0XHRcdFx0Ly8gYW5kIHRvIGJlIGNvbXBhdGlibGUgd2UgcmV0dXJuIGEgbmV3IGNvbnRleHQgd2l0aCB0aGUgc2FtZSBwYXRoLlxuXHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmXG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSBmYWxzZVxuXHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCByZXR1cm5Db250ZXh0ID0gY29udGV4dC5nZXRNb2RlbCgpLmJpbmRDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShvUmVzcG9uc2UpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQob1Jlc3BvbnNlWzBdIGFzIFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQ+KS52YWx1ZSA9IHJldHVybkNvbnRleHQ7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9SZXNwb25zZSA9IHJldHVybkNvbnRleHQ7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHQuZ2V0QmluZGluZygpLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0TG9nLmluZm8oXCJOYXZpZ2F0aW9uIHRvIHRoZSBzYW1lIGNvbnRleHQgaXMgbm90IGFsbG93ZWRcIik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckFjdGlvbkV4ZWN1dGlvbihzQWN0aW9uTmFtZSk7XG5cdFx0XHRyZXR1cm4gb1Jlc3BvbnNlO1xuXHRcdH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuXHRcdFx0aWYgKG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzLmZSZWplY3RvcigpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZXJyUHJvbWlzZSA9IGVyciBhcyB7IGNhbmNlbGVkPzogYm9vbGVhbjsgcmVqZWN0ZWRJdGVtcz86IHsgY2FuY2VsZWQ6IGJvb2xlYW4gfVtdIH07XG5cdFx0XHQvLyBGSVhNRTogaW4gbW9zdCBzaXR1YXRpb25zIHRoZXJlIGlzIG5vIGhhbmRsZXIgZm9yIHRoZSByZWplY3RlZCBwcm9taXNlcyByZXR1cm5lZHFcblx0XHRcdGlmIChlcnIgPT09IENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpIHtcblx0XHRcdFx0Ly8gVGhpcyBsZWFkcyB0byBjb25zb2xlIGVycm9yLiBBY3R1YWxseSB0aGUgZXJyb3IgaXMgYWxyZWFkeSBoYW5kbGVkIChjdXJyZW50bHkgZGlyZWN0bHkgaW4gcHJlc3MgaGFuZGxlciBvZiBlbmQgYnV0dG9uIGluIGRpYWxvZyksIHNvIGl0IHNob3VsZCBub3QgYmUgZm9yd2FyZGVkXG5cdFx0XHRcdC8vIHVwIHRvIGhlcmUuIEhvd2V2ZXIsIHdoZW4gZGlhbG9nIGhhbmRsaW5nIGFuZCBiYWNrZW5kIGV4ZWN1dGlvbiBhcmUgc2VwYXJhdGVkLCBpbmZvcm1hdGlvbiB3aGV0aGVyIGRpYWxvZyB3YXMgY2FuY2VsbGVkLCBvciBiYWNrZW5kIGV4ZWN1dGlvbiBoYXMgZmFpbGVkIG5lZWRzXG5cdFx0XHRcdC8vIHRvIGJlIHRyYW5zcG9ydGVkIHRvIHRoZSBwbGFjZSByZXNwb25zaWJsZSBmb3IgY29ubmVjdGluZyB0aGVzZSB0d28gdGhpbmdzLlxuXHRcdFx0XHQvLyBUT0RPOiByZW1vdmUgc3BlY2lhbCBoYW5kbGluZyBvbmUgZGlhbG9nIGhhbmRsaW5nIGFuZCBiYWNrZW5kIGV4ZWN1dGlvbiBhcmUgc2VwYXJhdGVkXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkRpYWxvZyBjYW5jZWxsZWRcIik7XG5cdFx0XHR9IGVsc2UgaWYgKCEoZXJyICYmIChlcnJQcm9taXNlLmNhbmNlbGVkIHx8IChlcnJQcm9taXNlLnJlamVjdGVkSXRlbXMgJiYgZXJyUHJvbWlzZS5yZWplY3RlZEl0ZW1zWzBdLmNhbmNlbGVkKSkpKSB7XG5cdFx0XHRcdC8vIFRPRE86IGFuYWx5emUsIHdoZXRoZXIgdGhpcyBpcyBvZiB0aGUgc2FtZSBjYXRlZ29yeSBhcyBhYm92ZVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIEVkaXRGbG93Lmludm9rZUFjdGlvbjoke2Vycn1gKTtcblx0XHRcdH1cblx0XHRcdC8vIFRPRE86IEFueSB1bmV4cGVjdGVkIGVycm9ycyBwcm9iYWJseSBzaG91bGQgbm90IGJlIGlnbm9yZWQhXG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhvb2sgd2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gYWZ0ZXIgdGhlIGFjdGlvbiBleGVjdXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBfYWN0aW9uTmFtZSBOYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHNpbmNlIDEuMTE0LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25BZnRlckFjdGlvbkV4ZWN1dGlvbihfYWN0aW9uTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly90byBiZSBvdmVycmlkZGVuXG5cdH1cblxuXHQvKipcblx0ICogU2VjdXJlZCBleGVjdXRpb24gb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLiBFbnN1cmVzIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgd2hlbiBjZXJ0YWluIGNvbmRpdGlvbnMgYXJlIGZ1bGZpbGxlZC5cblx0ICpcblx0ICogQHBhcmFtIGZuRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkLiBTaG91bGQgcmV0dXJuIGEgcHJvbWlzZSB0aGF0IGlzIHNldHRsZWQgYWZ0ZXIgY29tcGxldGlvbiBvZiB0aGUgZXhlY3V0aW9uLiBJZiBub3RoaW5nIGlzIHJldHVybmVkLCBpbW1lZGlhdGUgY29tcGxldGlvbiBpcyBhc3N1bWVkLlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgRGVmaW5pdGlvbnMgb2YgdGhlIHByZWNvbmRpdGlvbnMgdG8gYmUgY2hlY2tlZCBiZWZvcmUgZXhlY3V0aW9uXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5idXN5IERlZmluZXMgdGhlIGJ1c3kgaW5kaWNhdG9yXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5idXN5LnNldCBUcmlnZ2VycyBhIGJ1c3kgaW5kaWNhdG9yIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeS5jaGVjayBFeGVjdXRlcyBmdW5jdGlvbiBvbmx5IGlmIGFwcGxpY2F0aW9uIGlzbid0IGJ1c3kuXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy51cGRhdGVzRG9jdW1lbnQgVGhpcyBvcGVyYXRpb24gdXBkYXRlcyB0aGUgY3VycmVudCBkb2N1bWVudCB3aXRob3V0IHVzaW5nIHRoZSBib3VuZCBtb2RlbCBhbmQgY29udGV4dC4gQXMgYSByZXN1bHQsIHRoZSBkcmFmdCBzdGF0dXMgaXMgdXBkYXRlZCBpZiBhIGRyYWZ0IGRvY3VtZW50IGV4aXN0cywgYW5kIHRoZSB1c2VyIGhhcyB0byBjb25maXJtIHRoZSBjYW5jZWxsYXRpb24gb2YgdGhlIGVkaXRpbmcgcHJvY2Vzcy5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgaXMgcmVqZWN0ZWQgaWYgdGhlIGV4ZWN1dGlvbiBpcyBwcm9oaWJpdGVkIGFuZCByZXNvbHZlZCBieSB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSB0aGUgZm5GdW5jdGlvbi5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgc2VjdXJlZEV4ZWN1dGlvbihcblx0XHRmbkZ1bmN0aW9uOiBGdW5jdGlvbixcblx0XHRtUGFyYW1ldGVycz86IHtcblx0XHRcdGJ1c3k/OiB7XG5cdFx0XHRcdHNldD86IGJvb2xlYW47XG5cdFx0XHRcdGNoZWNrPzogYm9vbGVhbjtcblx0XHRcdH07XG5cdFx0XHR1cGRhdGVzRG9jdW1lbnQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYkJ1c3lTZXQgPSBtUGFyYW1ldGVycz8uYnVzeT8uc2V0ID8/IHRydWUsXG5cdFx0XHRiQnVzeUNoZWNrID0gbVBhcmFtZXRlcnM/LmJ1c3k/LmNoZWNrID8/IHRydWUsXG5cdFx0XHRiVXBkYXRlc0RvY3VtZW50ID0gbVBhcmFtZXRlcnM/LnVwZGF0ZXNEb2N1bWVudCA/PyBmYWxzZSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCksXG5cdFx0XHRvQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCBhcyBDb250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdGlmIChiQnVzeUNoZWNrICYmIEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJBcHBsaWNhdGlvbiBhbHJlYWR5IGJ1c3kgdGhlcmVmb3JlIGV4ZWN1dGlvbiByZWplY3RlZFwiKTtcblx0XHR9XG5cblx0XHQvLyB3ZSBoYXZlIHRvIHNldCBidXN5IGFuZCBkcmFmdCBpbmRpY2F0b3IgaW1tZWRpYXRlbHkgYWxzbyB0aGUgZnVuY3Rpb24gbWlnaHQgYmUgZXhlY3V0ZWQgbGF0ZXIgaW4gcXVldWVcblx0XHRpZiAoYkJ1c3lTZXQpIHtcblx0XHRcdEJ1c3lMb2NrZXIubG9jayhvTG9ja09iamVjdCk7XG5cdFx0fVxuXHRcdGlmIChiVXBkYXRlc0RvY3VtZW50ICYmIGJJc0RyYWZ0KSB7XG5cdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soZm5GdW5jdGlvbiBhcyAoKSA9PiB1bmtub3duIHwgUHJvbWlzZTx1bmtub3duPilcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChiSXNEcmFmdCkge1xuXHRcdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKG9FcnJvcjogdW5rbm93bik6IHZvaWQgPT4ge1xuXHRcdFx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCAmJiBiSXNEcmFmdCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRocm93IG9FcnJvcjtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdGlmIChiQnVzeVNldCkge1xuXHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIHBhdGNoU2VudCBldmVudDogcmVnaXN0ZXIgZG9jdW1lbnQgbW9kaWZpY2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0V2ZW50IFRoZSBldmVudCBzZW50IGJ5IHRoZSBiaW5kaW5nXG5cdCAqL1xuXHRoYW5kbGVQYXRjaFNlbnQob0V2ZW50OiBPRGF0YUNvbnRleHRCaW5kaW5nJFBhdGNoU2VudEV2ZW50KTogdm9pZCB7XG5cdFx0Ly8gSW4gY29sbGFib3JhdGl2ZSBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiwgZGlzYWJsZSBFVGFnIGNoZWNrIGZvciBQQVRDSCByZXF1ZXN0c1xuXHRcdGNvbnN0IGludGVybmFsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdGNvbnN0IGlnbm9yZUVUYWcgPSB0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkgfHwgaW50ZXJuYWxDb250ZXh0LmdldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiKTtcblxuXHRcdGlmIChpZ25vcmVFVGFnKSB7XG5cdFx0XHQoKG9FdmVudC5nZXRTb3VyY2UoKSBhcyBCaW5kaW5nKS5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLnNldElnbm9yZUVUYWcodHJ1ZSk7XG5cdFx0fVxuXHRcdGlmICghaW50ZXJuYWxDb250ZXh0Py5nZXRQcm9wZXJ0eShcInNraXBQYXRjaEhhbmRsZXJzXCIpKSB7XG5cdFx0XHRjb25zdCBzb3VyY2VCaW5kaW5nID0gb0V2ZW50LmdldFNvdXJjZSgpIGFzIHVua25vd24gYXMgT0RhdGFMaXN0QmluZGluZzsgLy8gRklYTUU6IFVJNSB0eXBlIHNheXMgdGhpcyBzaG91bGQgYmUgYW4gT0RhdGFDb250ZXh0QmluZGluZ1xuXHRcdFx0Ly8gQ3JlYXRlIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiB0aGUgcGF0aCBpcyBjb21wbGV0ZWRcblx0XHRcdGNvbnN0IG9QYXRjaFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdG9FdmVudC5nZXRTb3VyY2UoKS5hdHRhY2hFdmVudE9uY2UoXCJwYXRjaENvbXBsZXRlZFwiLCAocGF0Y2hDb21wbGV0ZWRFdmVudDogVUk1RXZlbnQ8eyBzdWNjZXNzOiBib29sZWFuIH0+KSA9PiB7XG5cdFx0XHRcdFx0Ly8gUmUtZW5hYmxlIEVUYWcgY2hlY2tzXG5cdFx0XHRcdFx0aWYgKGlnbm9yZUVUYWcpIHtcblx0XHRcdFx0XHRcdCgob0V2ZW50LmdldFNvdXJjZSgpIGFzIEJpbmRpbmcpLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuc2V0SWdub3JlRVRhZyhmYWxzZSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG9FdmVudC5nZXRTb3VyY2UoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRcdFx0QWN0aW9uUnVudGltZS5zZXRBY3Rpb25FbmFibGVtZW50QWZ0ZXJQYXRjaChcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdFx0XHRcdHNvdXJjZUJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBiU3VjY2VzcyA9IHBhdGNoQ29tcGxldGVkRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdFx0XHRpZiAoYlN1Y2Nlc3MpIHtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy51cGRhdGVEb2N1bWVudChzb3VyY2VCaW5kaW5nLCBvUGF0Y2hQcm9taXNlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgY3JlYXRlU2VudCBldmVudDogcmVnaXN0ZXIgZG9jdW1lbnQgbW9kaWZpY2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHNlbnQgYnkgdGhlIGJpbmRpbmdcblx0ICovXG5cdGhhbmRsZUNyZWF0ZVNlbnQoZXZlbnQ6IFVJNUV2ZW50PHsgY29udGV4dDogQ29udGV4dCB9Pik6IHZvaWQge1xuXHRcdGNvbnN0IGNvbnRleHQgPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJjb250ZXh0XCIpO1xuXHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoZmFsc2UsIGZhbHNlLCBjb250ZXh0LmdldFBhdGgoKSk7XG5cdH1cblxuXHQvKipcblx0ICogUGVyZm9ybXMgYSB0YXNrIGluIHN5bmMgd2l0aCBvdGhlciB0YXNrcyBjcmVhdGVkIHZpYSB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBSZXR1cm5zIHRoZSBwcm9taXNlIGNoYWluIG9mIHRoZSB0YXNrLlxuXHQgKlxuXHQgKiBAcGFyYW0gW25ld1Rhc2tdIE9wdGlvbmFsLCBhIHByb21pc2Ugb3IgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgc3luY2hyb25vdXNseVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIHRhc2sgaXMgY29tcGxldGVkXG5cdCAqL1xuXHRhc3luYyBzeW5jVGFzazxUPihuZXdUYXNrPzogKCgpID0+IFQpIHwgUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuXHRcdGlmIChuZXdUYXNrKSB7XG5cdFx0XHRpZiAodHlwZW9mIG5ld1Rhc2sgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHR0aGlzLnN5bmNUYXNrcyA9IHRoaXMuc3luY1Rhc2tzLnRoZW4obmV3VGFzaykuY2F0Y2goZnVuY3Rpb24gKGVycjogdW5rbm93bikge1xuXHRcdFx0XHRcdExvZy5kZWJ1ZyhlcnIgYXMgc3RyaW5nKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLnN5bmNUYXNrcyA9IHRoaXMuc3luY1Rhc2tzXG5cdFx0XHRcdFx0LnRoZW4oYXN5bmMgKCkgPT4gbmV3VGFzaylcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0TG9nLmRlYnVnKGVyciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnN5bmNUYXNrcyBhcyBQcm9taXNlPFQ+O1xuXHR9XG5cblx0LyoqXG5cdCAqIERlY2lkZXMgaWYgYSBkb2N1bWVudCBpcyB0byBiZSBzaG93biBpbiBkaXNwbGF5IG9yIGVkaXQgbW9kZS5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIGRpc3BsYXllZCBvciBlZGl0ZWRcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZWRpdCBtb2RlIGlzIGNvbXB1dGVkXG5cdCAqL1xuXG5cdGFzeW5jIGNvbXB1dGVFZGl0TW9kZShjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KTtcblxuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0Y29uc3QgZ2xvYmFsTW9kZWwgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVBlbmRpbmdcIiwgdHJ1ZSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdFx0Y29uc3QgaXNBY3RpdmVFbnRpdHkgPSBhd2FpdCBjb250ZXh0LnJlcXVlc3RPYmplY3QoXCJJc0FjdGl2ZUVudGl0eVwiKTtcblx0XHRcdFx0aWYgKGlzQWN0aXZlRW50aXR5ID09PSBmYWxzZSkge1xuXHRcdFx0XHRcdC8vIGluIGNhc2UgdGhlIGRvY3VtZW50IGlzIGRyYWZ0IHNldCBpdCBpbiBlZGl0IG1vZGVcblx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTtcblx0XHRcdFx0XHRjb25zdCBoYXNBY3RpdmVFbnRpdHkgPSBhd2FpdCBjb250ZXh0LnJlcXVlc3RPYmplY3QoXCJIYXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZSh1bmRlZmluZWQsICFoYXNBY3RpdmVFbnRpdHkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGFjdGl2ZSBkb2N1bWVudCwgc3RheSBvbiBkaXNwbGF5IG1vZGVcblx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRnbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlUGVuZGluZ1wiLCBmYWxzZSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRldGVybWluaW5nIHRoZSBlZGl0TW9kZSBmb3IgZHJhZnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgbGFzdEludm9rZWRBY3Rpb25OYW1lID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuZ2V0UHJvcGVydHkoXCIvbGFzdEludm9rZWRBY3Rpb25cIik7XG5cdFx0XHRpZiAobGFzdEludm9rZWRBY3Rpb25OYW1lICYmIHRoaXMuaXNOZXdBY3Rpb25Gb3JTdGlja3kobGFzdEludm9rZWRBY3Rpb25OYW1lLCBjb250ZXh0KSkge1xuXHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlLCB0cnVlKTtcblx0XHRcdFx0aWYgKCF0aGlzLmdldEFwcENvbXBvbmVudCgpLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuaGFuZGxlU3RpY2t5T24oY29udGV4dCk7XG5cdFx0XHRcdHRoaXMuX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXModGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpLCBjb250ZXh0LmdldE1vZGVsKCkpO1xuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCB1bmRlZmluZWQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFByaXZhdGUgbWV0aG9kc1xuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBJbnRlcm5hbCBtZXRob2QgdG8gZGVsZXRlIGEgY29udGV4dCBvciBhbiBhcnJheSBvZiBjb250ZXh0cy5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHRzIFRoZSBjb250ZXh0KHMpIHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgUGFyYW1ldGVycyBmb3IgZGVsZXRpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2tcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNvbnRyb2xJZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250cm9sXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5ub0RpYWxvZ1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy50aXRsZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kZXNjcmlwdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy51blNhdmVkQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMubG9ja2VkQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24oXG5cdFx0Y29udGV4dHM6IENvbnRleHQgfCBDb250ZXh0W10sXG5cdFx0cGFyYW1ldGVyczoge1xuXHRcdFx0YmVmb3JlRGVsZXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0XHRcdHJlcXVlc3RTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRwYXJlbnRDb250cm9sPzogQ29udHJvbDtcblx0XHRcdGJGaW5kQWN0aXZlQ29udGV4dHM/OiBib29sZWFuO1xuXHRcdFx0bm9EaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdFx0dGl0bGU/OiBzdHJpbmc7XG5cdFx0XHRkZXNjcmlwdGlvbj86IHN0cmluZyB8IHsgcGF0aDogc3RyaW5nIH07XG5cdFx0XHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRcdFx0bnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzPzogbnVtYmVyO1xuXHRcdFx0dW5TYXZlZENvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0bG9ja2VkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlPzogRHJhZnRTaWJsaW5nUGFpcltdO1xuXHRcdFx0ZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZT86IENvbnRleHRbXTtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmIChwYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMpIHtcblx0XHRcdC8vIGFzIHNlbGVjdGVkIGNvbnRleHRzIG1heSBpbmNsdWRlIGluYWN0aXZlIGNvbnRleHQgd2UgbmVlZCB0byBjb21wdXRlIHRoaXMgcGFyYW1ldGVyIGFnYWluIHRvIGVuc3VyZSBkZWxldGUgaGVscGVyIHdvcmtzIHByb3Blcmx5XG5cdFx0XHRwYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9IHBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cy5sZW5ndGg7XG5cdFx0fVxuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSB0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCk7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cblx0XHQvLyBUT0RPOiB0aGlzIHNldHRpbmcgYW5kIHJlbW92aW5nIG9mIGNvbnRleHRzIHNob3VsZG4ndCBiZSBpbiB0aGUgdHJhbnNhY3Rpb24gaGVscGVyIGF0IGFsbFxuXHRcdC8vIGZvciB0aGUgdGltZSBiZWluZyBJIGtlcHQgaXQgYW5kIHByb3ZpZGUgdGhlIGludGVybmFsIG1vZGVsIGNvbnRleHQgdG8gbm90IGJyZWFrIHNvbWV0aGluZ1xuXHRcdHBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgPSBwYXJhbWV0ZXJzLmNvbnRyb2xJZFxuXHRcdFx0PyAoRWxlbWVudC5nZXRFbGVtZW50QnlJZChwYXJhbWV0ZXJzLmNvbnRyb2xJZCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQgfCB1bmRlZmluZWQpXG5cdFx0XHQ6IG51bGw7XG5cblx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0YXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuZGVsZXRlRG9jdW1lbnQoY29udGV4dHMsIHBhcmFtZXRlcnMsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksIHJlc291cmNlTW9kZWwsIHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSk7XG5cdH1cblxuXHRfZ2V0UmVzb3VyY2VNb2RlbCgpOiBSZXNvdXJjZU1vZGVsIHtcblx0XHRyZXR1cm4gZ2V0UmVzb3VyY2VNb2RlbCh0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHRwcml2YXRlIGdldFRyYW5zYWN0aW9uSGVscGVyKCk6IHR5cGVvZiBUcmFuc2FjdGlvbkhlbHBlciB7XG5cdFx0cmV0dXJuIFRyYW5zYWN0aW9uSGVscGVyO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRNZXNzYWdlSGFuZGxlcigpOiBNZXNzYWdlSGFuZGxlciB7XG5cdFx0aWYgKHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcikge1xuXHRcdFx0cmV0dXJuIHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWRpdCBGbG93IHdvcmtzIG9ubHkgd2l0aCBhIGdpdmVuIG1lc3NhZ2UgaGFuZGxlclwiKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdldEludGVybmFsTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHRwcml2YXRlIGdldEdsb2JhbFVJTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGF0IHRoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgYSBuZXdseSBjcmVhdGVkIG9iamVjdC5cblx0ICpcblx0ICogQHBhcmFtIGJDcmVhdGlvbk1vZGUgVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIG5ld1xuXHQgKi9cblx0cHJpdmF0ZSBzZXRDcmVhdGlvbk1vZGUoYkNyZWF0aW9uTW9kZTogYm9vbGVhbik6IHZvaWQge1xuXHRcdGNvbnN0IHVpTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJ1aVwiKSBhcyBDb250ZXh0O1xuXHRcdHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLnNldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuQ3JlYXRlTW9kZSwgYkNyZWF0aW9uTW9kZSwgdWlNb2RlbENvbnRleHQsIHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgYSBuZXdseSBjcmVhdGVkIG9iamVjdCBvciBub3QuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG9iamVjdCBpcyBuZXdcblx0ICovXG5cdGdldENyZWF0aW9uTW9kZSgpOiBib29sZWFuIHtcblx0XHRjb25zdCB1aU1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwidWlcIikgYXMgQ29udGV4dDtcblx0XHRyZXR1cm4gISF0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5nZXRQcm9wZXJ0eShVaU1vZGVsQ29uc3RhbnRzLkNyZWF0ZU1vZGUsIHVpTW9kZWxDb250ZXh0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCAob3Igb25lIG9mIGl0cyBzdWItb2JqZWN0cykgaGFzIGJlZW4gbW9kaWZpZWQgb3Igbm90LlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWRcblx0ICovXG5cdHByaXZhdGUgaXNEb2N1bWVudE1vZGlmaWVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAhIXRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLmdldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuRG9jdW1lbnRNb2RpZmllZCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGF0IHRoZSBvYmplY3QgYmVpbmcgZWRpdGVkIChvciBvbmUgb2YgaXRzIHN1Yi1vYmplY3RzKSBoYXMgYmVlbiBtb2RpZmllZC5cblx0ICpcblx0ICogQHBhcmFtIG1vZGlmaWVkIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBtb2RpZmllZFxuXHQgKi9cblx0cHJpdmF0ZSBzZXREb2N1bWVudE1vZGlmaWVkKG1vZGlmaWVkOiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuc2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5Eb2N1bWVudE1vZGlmaWVkLCBtb2RpZmllZCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGF0IHRoZSBvYmplY3QgYmVpbmcgZWRpdGVkIGhhcyBiZWVuIG1vZGlmaWVkIGJ5IGNyZWF0aW5nIGEgc3ViLW9iamVjdC5cblx0ICpcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmcgb24gd2hpY2ggdGhlIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRwcml2YXRlIHNldERvY3VtZW50TW9kaWZpZWRPbkNyZWF0ZShsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyk6IHZvaWQge1xuXHRcdC8vIFNldCB0aGUgbW9kaWZpZWQgZmxhZyBvbmx5IG9uIHJlbGF0aXZlIGxpc3RCaW5kaW5ncywgaS5lLiB3aGVuIGNyZWF0aW5nIGEgc3ViLW9iamVjdFxuXHRcdC8vIElmIHRoZSBsaXN0QmluZGluZyBpcyBub3QgcmVsYXRpdmUsIHRoZW4gaXQncyBhIGNyZWF0aW9uIGZyb20gdGhlIExpc3RSZXBvcnQsIGFuZCBieSBkZWZhdWx0IGEgbmV3bHkgY3JlYXRlZCByb290IG9iamVjdCBpc24ndCBjb25zaWRlcmVkIGFzIG1vZGlmaWVkXG5cdFx0aWYgKGxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBjcmVhdGUgZXZlbnQ6IHNob3dzIG1lc3NhZ2VzIGFuZCBpbiBjYXNlIG9mIGEgZHJhZnQsIHVwZGF0ZXMgdGhlIGRyYWZ0IGluZGljYXRvci5cblx0ICpcblx0ICogQHBhcmFtIGJpbmRpbmcgT0RhdGEgbGlzdCBiaW5kaW5nIG9iamVjdFxuXHQgKi9cblx0cHJpdmF0ZSBoYW5kbGVDcmVhdGVFdmVudHMoYmluZGluZzogT0RhdGFMaXN0QmluZGluZyk6IHZvaWQge1xuXHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChiaW5kaW5nKTtcblxuXHRcdGJpbmRpbmcuYXR0YWNoRXZlbnQoXCJjcmVhdGVTZW50XCIsICgpID0+IHtcblx0XHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2aW5nKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRiaW5kaW5nLmF0dGFjaEV2ZW50KFwiY3JlYXRlQ29tcGxldGVkXCIsIChvRXZlbnQ6IFVJNUV2ZW50PHsgc3VjY2VzczogYm9vbGVhbiB9Pik6IHZvaWQgPT4ge1xuXHRcdFx0Y29uc3Qgc3VjY2VzcyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhzdWNjZXNzID8gRHJhZnRTdGF0dXMuU2F2ZWQgOiBEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBkcmFmdCBzdGF0dXMgbWVzc2FnZSAoZGlzcGxheWVkIGF0IHRoZSBib3R0b20gb2YgdGhlIHBhZ2UpLlxuXHQgKlxuXHQgKiBAcGFyYW0gZHJhZnRTdGF0dXMgVGhlIGRyYWZ0IHN0YXR1cyBtZXNzYWdlXG5cdCAqL1xuXHRzZXREcmFmdFN0YXR1cyhkcmFmdFN0YXR1czogc3RyaW5nKTogdm9pZCB7XG5cdFx0KHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikgYXMgSlNPTk1vZGVsKS5zZXRQcm9wZXJ0eShcIi9kcmFmdFN0YXR1c1wiLCBkcmFmdFN0YXR1cywgdW5kZWZpbmVkLCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9ncmFtbWluZyBtb2RlbCBmcm9tIGEgYmluZGluZyBvciBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBzb3VyY2UgVGhlIGJpbmRpbmcgb3IgY29udGV4dFxuXHQgKiBAcmV0dXJucyBUaGUgcHJvZ3JhbW1pbmcgbW9kZWxcblx0ICovXG5cdHByaXZhdGUgZ2V0UHJvZ3JhbW1pbmdNb2RlbChzb3VyY2U6IENvbnRleHQgfCBCaW5kaW5nKTogdHlwZW9mIFByb2dyYW1taW5nTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuZ2V0UHJvZ3JhbW1pbmdNb2RlbChzb3VyY2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGVkaXQgbW9kZS5cblx0ICpcblx0ICogQHBhcmFtIGVkaXRNb2RlIFRoZSBlZGl0IG1vZGVcblx0ICogQHBhcmFtIGlzQ3JlYXRpb24gVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIG5ld2x5IGNyZWF0ZWRcblx0ICovXG5cdHByaXZhdGUgc2V0RWRpdE1vZGUoZWRpdE1vZGU/OiBzdHJpbmcsIGlzQ3JlYXRpb24/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0Ly8gYXQgdGhpcyBwb2ludCBvZiB0aW1lIGl0J3Mgbm90IG1lYW50IHRvIHJlbGVhc2UgdGhlIGVkaXQgZmxvdyBmb3IgZnJlZXN0eWxlIHVzYWdlIHRoZXJlZm9yZSB3ZSBjYW5cblx0XHQvLyByZWx5IG9uIHRoZSBnbG9iYWwgVUkgbW9kZWwgdG8gZXhpc3Rcblx0XHRjb25zdCBnbG9iYWxNb2RlbCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0aWYgKGVkaXRNb2RlKSB7XG5cdFx0XHRnbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIsIGVkaXRNb2RlID09PSBcIkVkaXRhYmxlXCIsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHRpZiAoZWRpdE1vZGUgIT09IFwiRWRpdGFibGVcIikge1xuXHRcdFx0XHR0aGlzLmZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkKGZhbHNlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaXNDcmVhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBTaW5jZSBzZXRDcmVhdGlvbk1vZGUgaXMgcHVibGljIGluIEVkaXRGbG93IGFuZCBjYW4gYmUgb3ZlcnJpZGVuLCBtYWtlIHN1cmUgdG8gY2FsbCBpdCB2aWEgdGhlIGNvbnRyb2xsZXJcblx0XHRcdC8vIHRvIGVuc3VyZSBhbnkgb3ZlcnJpZGVzIGFyZSB0YWtlbiBpbnRvIGFjY291bnRcblx0XHRcdHRoaXMuc2V0Q3JlYXRpb25Nb2RlKGlzQ3JlYXRpb24pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBmbGFnIHRvIGZvcmNlIFNhdmUgb3IgRGlzY2FyZCB3aGVuIGxlYXZpbmcgYSBkcmFmdC5cblx0ICogQHBhcmFtIGZvcmNlZFxuXHQgKi9cblx0cHJpdmF0ZSBmb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZChmb3JjZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9mb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZFwiLCBmb3JjZWQsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHdlIHNob3VsZCBmb3JjZSB0aGUgdXNlciB0byBTYXZlIG9yIERpc2NhcmQgd2hlbiBsZWF2aW5nIGEgZHJhZnQsIG9yIGlmIGtlZXBpbmcgdGhlIGRyYWZ0IGlzIGFsbG93ZWQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRydWUgaWYga2VlcGluZyB0aGUgZHJhZnQgaXMgbm90IGFsbG93ZWRcblx0ICovXG5cdHNoYWxsRm9yY2VEcmFmdFNhdmVPckRpc2NhcmQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLmdldFByb3BlcnR5KFwiL2ZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkXCIpID09PSB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhbiBhY3Rpb24gY29ycmVzcG9uZHMgdG8gYSBjcmVhdGUgYWN0aW9uIGZvciBhIHN0aWNreSBzZXNzaW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gYWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgZm9yIHRoZSBzdGlja3kgc2Vzc2lvblxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBhY3Rpb24gaXMgYSBjcmVhdGUgYWN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGlzTmV3QWN0aW9uRm9yU3RpY2t5KGFjdGlvbk5hbWU6IHN0cmluZywgY29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRjb25zdCBlbnRpdHlTZXQgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnN0YXJ0aW5nRW50aXR5U2V0IGFzIEVudGl0eVNldDtcblx0XHRcdGNvbnN0IHN0aWNreVNlc3Npb24gPSBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZDtcblx0XHRcdGlmIChzdGlja3lTZXNzaW9uPy5OZXdBY3Rpb24gPT09IGFjdGlvbk5hbWUpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc3RpY2t5U2Vzc2lvbj8uQWRkaXRpb25hbE5ld0FjdGlvbnMgJiYgc3RpY2t5U2Vzc2lvbj8uQWRkaXRpb25hbE5ld0FjdGlvbnMuaW5jbHVkZXMoYWN0aW9uTmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0Ly8gVE9ETyBNb3ZlIGFsbCBzdGlja3ktcmVsYXRlZCBiZWxvdyB0byBhIHN0aWNreSBzZXNzaW9uIG1hbmFnZXIgY2xhc3NcblxuXHQvKipcblx0ICogRW5hYmxlcyB0aGUgc3RpY2t5IGVkaXQgc2Vzc2lvbi5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYmVpbmcgZWRpdGVkXG5cdCAqIEByZXR1cm5zIFRydWUgaW4gY2FzZSBvZiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgaGFuZGxlU3RpY2t5T24oY29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKGFwcENvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuZGVmaW5lZCBBcHBDb21wb25lbnQgZm9yIGZ1bmN0aW9uIGhhbmRsZVN0aWNreU9uXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmhhc05hdmlnYXRpb25HdWFyZCgpKSB7XG5cdFx0XHRcdGNvbnN0IGhhc2hUcmFja2VyID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpO1xuXHRcdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cblx0XHRcdFx0Ly8gU2V0IGEgZ3VhcmQgaW4gdGhlIFJvdXRlclByb3h5XG5cdFx0XHRcdC8vIEEgdGltZW91dCBpcyBuZWNlc3NhcnksIGFzIHdpdGggZGVmZXJyZWQgY3JlYXRpb24gdGhlIGhhc2hDaGFuZ2VyIGlzIG5vdCB1cGRhdGVkIHlldCB3aXRoXG5cdFx0XHRcdC8vIHRoZSBuZXcgaGFzaCwgYW5kIHRoZSBndWFyZCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeSBvZiB0aGUgcm91dGVyIHByb3h5XG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnNldE5hdmlnYXRpb25HdWFyZChjb250ZXh0LmdldFBhdGgoKS5zdWJzdHJpbmcoMSkpO1xuXHRcdFx0XHR9LCAwKTtcblxuXHRcdFx0XHQvLyBTZXR0aW5nIGJhY2sgbmF2aWdhdGlvbiBvbiBzaGVsbCBzZXJ2aWNlLCB0byBnZXQgdGhlIGRpY2FyZCBtZXNzYWdlIGJveCBpbiBjYXNlIG9mIHN0aWNreVxuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKHRoaXMub25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbi5iaW5kKHRoaXMsIGNvbnRleHQpKTtcblxuXHRcdFx0XHR0aGlzLmRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uID0gdGhpcy5nZXREaXJ0eVN0YXRlUHJvdmlkZXIoYXBwQ29tcG9uZW50LCBpbnRlcm5hbE1vZGVsLCBoYXNoVHJhY2tlcik7XG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkucmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIodGhpcy5kaXJ0eVN0YXRlUHJvdmlkZXJGdW5jdGlvbik7XG5cblx0XHRcdFx0Ly8gaGFuZGxlIHNlc3Npb24gdGltZW91dFxuXHRcdFx0XHRjb25zdCBpMThuTW9kZWwgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKFwic2FwLmZlLmkxOG5cIik7XG5cdFx0XHRcdHRoaXMuc2Vzc2lvblRpbWVvdXRGdW5jdGlvbiA9IHRoaXMuZ2V0U2Vzc2lvblRpbWVvdXRGdW5jdGlvbihjb250ZXh0LCBpMThuTW9kZWwpO1xuXHRcdFx0XHR0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKCkuYXR0YWNoU2Vzc2lvblRpbWVvdXQodGhpcy5zZXNzaW9uVGltZW91dEZ1bmN0aW9uKTtcblxuXHRcdFx0XHR0aGlzLnN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb25GdW5jdGlvbiA9IHRoaXMuZ2V0Um91dGVNYXRjaGVkRnVuY3Rpb24oY29udGV4dCwgYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuYXR0YWNoUm91dGVNYXRjaGVkKHt9LCB0aGlzLnN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb25GdW5jdGlvbik7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogRGlzYWJsZXMgdGhlIHN0aWNreSBlZGl0IHNlc3Npb24uXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRydWUgaW4gY2FzZSBvZiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgaGFuZGxlU3RpY2t5T2ZmKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChhcHBDb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1bmRlZmluZWQgQXBwQ29tcG9uZW50IGZvciBmdW5jdGlvbiBoYW5kbGVTdGlja3lPZmZcIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkpIHtcblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBleGl0ZWQgZnJvbSB0aGUgYXBwLCBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQgZG9lc24ndCByZXR1cm4gYVxuXHRcdFx0XHQvLyBzYXAuZmUuY29yZS5BcHBDb21wb25lbnQsIGhlbmNlIHRoZSAnaWYnIGFib3ZlXG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmRpc2NhcmROYXZpZ2F0aW9uR3VhcmQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24pIHtcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5kZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKHRoaXMuZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24pO1xuXHRcdFx0XHR0aGlzLmRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBtb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbDtcblx0XHRcdGlmIChtb2RlbCAmJiB0aGlzLnNlc3Npb25UaW1lb3V0RnVuY3Rpb24pIHtcblx0XHRcdFx0bW9kZWwuZGV0YWNoU2Vzc2lvblRpbWVvdXQodGhpcy5zZXNzaW9uVGltZW91dEZ1bmN0aW9uKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuc3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbkZ1bmN0aW9uKSB7XG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmRldGFjaFJvdXRlTWF0Y2hlZCh0aGlzLnN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb25GdW5jdGlvbik7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuc3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbkZ1bmN0aW9uID0gdW5kZWZpbmVkO1xuXG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblxuXHRcdFx0aWYgKGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRfc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsKTogdm9pZCB7XG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCB0cnVlKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc3RpY2t5U2Vzc2lvblRva2VuXCIsIG1vZGVsLmdldEh0dHBIZWFkZXJzKHRydWUpW1wiU0FQLUNvbnRleHRJZFwiXSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSB1c2VkIGFzIGEgRGlydHlTdGF0ZVByb3ZpZGVyIGluIHRoZSBTaGVsbC5cblx0ICpcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAcGFyYW0gaW50ZXJuYWxNb2RlbCBUaGUgbW9kZWwgXCJpbnRlcm5hbFwiXG5cdCAqIEBwYXJhbSBoYXNoVHJhY2tlciBIYXNoIHRyYWNrZXJcblx0ICogQHJldHVybnMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldERpcnR5U3RhdGVQcm92aWRlcihhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgaW50ZXJuYWxNb2RlbDogSlNPTk1vZGVsLCBoYXNoVHJhY2tlcjogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIChuYXZpZ2F0aW9uQ29udGV4dDogeyBpbm5lckFwcFJvdXRlOiBzdHJpbmcgfSk6IGJvb2xlYW4gfCB1bmRlZmluZWQgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKG5hdmlnYXRpb25Db250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMgZm9yIERpcnR5U3RhdGVQcm92aWRlciBmdW5jdGlvblwiKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHRhcmdldEhhc2ggPSBuYXZpZ2F0aW9uQ29udGV4dC5pbm5lckFwcFJvdXRlO1xuXHRcdFx0XHRjb25zdCByb3V0ZXJQcm94eSA9IGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpO1xuXHRcdFx0XHRsZXQgbGNsSGFzaFRyYWNrZXIgPSBcIlwiO1xuXHRcdFx0XHRsZXQgaXNEaXJ0eTogYm9vbGVhbjtcblx0XHRcdFx0Y29uc3QgaXNTZXNzaW9uT24gPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiKTtcblxuXHRcdFx0XHRpZiAoIWlzU2Vzc2lvbk9uKSB7XG5cdFx0XHRcdFx0Ly8gSWYgdGhlIHN0aWNreSBzZXNzaW9uIHdhcyB0ZXJtaW5hdGVkIGJlZm9yZSBoYW5kLlxuXHRcdFx0XHRcdC8vIEV4YW1wbGUgaW4gY2FzZSBvZiBuYXZpZ2F0aW5nIGF3YXkgZnJvbSBhcHBsaWNhdGlvbiB1c2luZyBJQk4uXG5cdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICghcm91dGVyUHJveHkuaXNOYXZpZ2F0aW9uRmluYWxpemVkKCkpIHtcblx0XHRcdFx0XHQvLyBJZiBuYXZpZ2F0aW9uIGlzIGN1cnJlbnRseSBoYXBwZW5pbmcgaW4gUm91dGVyUHJveHksIGl0J3MgYSB0cmFuc2llbnQgc3RhdGVcblx0XHRcdFx0XHQvLyAobm90IGRpcnR5KVxuXHRcdFx0XHRcdGlzRGlydHkgPSBmYWxzZTtcblx0XHRcdFx0XHRsY2xIYXNoVHJhY2tlciA9IHRhcmdldEhhc2g7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaGFzaFRyYWNrZXIgPT09IHRhcmdldEhhc2gpIHtcblx0XHRcdFx0XHQvLyB0aGUgaGFzaCBkaWRuJ3QgY2hhbmdlIHNvIGVpdGhlciB0aGUgdXNlciBhdHRlbXB0cyB0byByZWZyZXNoIG9yIHRvIGxlYXZlIHRoZSBhcHBcblx0XHRcdFx0XHRpc0RpcnR5ID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIGlmIChyb3V0ZXJQcm94eS5jaGVja0hhc2hXaXRoR3VhcmQodGFyZ2V0SGFzaCkgfHwgcm91dGVyUHJveHkuaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlcigpKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIHVzZXIgYXR0ZW1wdHMgdG8gbmF2aWdhdGUgd2l0aGluIHRoZSByb290IG9iamVjdFxuXHRcdFx0XHRcdC8vIG9yIGNyb3NzaW5nIHRoZSBndWFyZCBoYXMgYWxyZWFkeSBiZWVuIGFsbG93ZWQgYnkgdGhlIFJvdXRlclByb3h5XG5cdFx0XHRcdFx0bGNsSGFzaFRyYWNrZXIgPSB0YXJnZXRIYXNoO1xuXHRcdFx0XHRcdGlzRGlydHkgPSBmYWxzZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB0aGUgdXNlciBhdHRlbXB0cyB0byBuYXZpZ2F0ZSB3aXRoaW4gdGhlIGFwcCwgZm9yIGV4YW1wbGUgYmFjayB0byB0aGUgbGlzdCByZXBvcnRcblx0XHRcdFx0XHRpc0RpcnR5ID0gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChpc0RpcnR5KSB7XG5cdFx0XHRcdFx0Ly8gdGhlIEZMUCBkb2Vzbid0IGNhbGwgdGhlIGRpcnR5IHN0YXRlIHByb3ZpZGVyIGFueW1vcmUgb25jZSBpdCdzIGRpcnR5LCBhcyB0aGV5IGNhbid0XG5cdFx0XHRcdFx0Ly8gY2hhbmdlIHRoaXMgZHVlIHRvIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3ZSBzZXQgaXQgYmFjayB0byBub3QtZGlydHlcblx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0RGlydHlGbGFnKGZhbHNlKTtcblx0XHRcdFx0XHR9LCAwKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRoYXNoVHJhY2tlciA9IGxjbEhhc2hUcmFja2VyO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGlzRGlydHk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIHVzZWQgd2hlbiBhIHN0aWNreSBzZXNzaW9uIHRpbWVzIG91dC5cblx0ICpcblx0ICogQHBhcmFtIHN0aWNreUNvbnRleHQgVGhlIGNvbnRleHQgZm9yIHRoZSBzdGlja3kgc2Vzc2lvblxuXHQgKiBAcGFyYW0gaTE4bk1vZGVsXG5cdCAqIEByZXR1cm5zIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXRTZXNzaW9uVGltZW91dEZ1bmN0aW9uKHN0aWNreUNvbnRleHQ6IENvbnRleHQsIGkxOG5Nb2RlbDogTW9kZWwpIHtcblx0XHRyZXR1cm4gKCk6IHVuZGVmaW5lZCB8IGJvb2xlYW4gPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKHN0aWNreUNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNvbnRleHQgbWlzc2luZyBmb3IgU2Vzc2lvblRpbWVvdXQgZnVuY3Rpb25cIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gcmVtb3ZlIHRyYW5zaWVudCBtZXNzYWdlcyBzaW5jZSB3ZSB3aWxsIHNob3dpbmcgb3VyIG93biBtZXNzYWdlXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdFx0XHRjb25zdCB3YXJuaW5nRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRcdFx0dGl0bGU6IFwie3NhcC5mZS5pMThuPkNfRURJVEZMT1dfT0JKRUNUX1BBR0VfU0VTU0lPTl9FWFBJUkVEX0RJQUxPR19USVRMRX1cIixcblx0XHRcdFx0XHRzdGF0ZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRcdFx0Y29udGVudDogbmV3IFRleHQoeyB0ZXh0OiBcIntzYXAuZmUuaTE4bj5DX0VESVRGTE9XX09CSkVDVF9QQUdFX1NFU1NJT05fRVhQSVJFRF9ESUFMT0dfTUVTU0FHRX1cIiB9KSxcblx0XHRcdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHR0ZXh0OiBcIntzYXAuZmUuaTE4bj5DX0NPTU1PTl9ESUFMT0dfT0t9XCIsXG5cdFx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRcdHByZXNzOiAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRcdC8vIHJlbW92ZSBzdGlja3kgaGFuZGxpbmcgYWZ0ZXIgbmF2aWdhdGlvbiBzaW5jZSBzZXNzaW9uIGhhcyBhbHJlYWR5IGJlZW4gdGVybWluYXRlZFxuXHRcdFx0XHRcdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KHN0aWNreUNvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRcdHdhcm5pbmdEaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdhcm5pbmdEaWFsb2cuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHRcdHdhcm5pbmdEaWFsb2cuc2V0TW9kZWwoaTE4bk1vZGVsLCBcInNhcC5mZS5pMThuXCIpO1xuXHRcdFx0XHR0aGlzLmdldFZpZXcoKS5hZGREZXBlbmRlbnQod2FybmluZ0RpYWxvZyk7XG5cdFx0XHRcdHdhcm5pbmdEaWFsb2cub3BlbigpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgb25Sb3V0ZU1hdGNoZWQgZXZlbnQgaW4gY2FzZSBvZiBzdGlja3kgZWRpdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYmVpbmcgZWRpdGVkIChyb290IG9mIHRoZSBzdGlja3kgc2Vzc2lvbilcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAcmV0dXJucyBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0Um91dGVNYXRjaGVkRnVuY3Rpb24oY29udGV4dDogQ29udGV4dCwgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpIHtcblx0XHRyZXR1cm4gKCk6IHZvaWQgPT4ge1xuXHRcdFx0Y29uc3QgY3VycmVudEhhc2ggPSBhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5nZXRIYXNoKCk7XG5cdFx0XHQvLyBlaXRoZXIgY3VycmVudCBoYXNoIGlzIGVtcHR5IHNvIHRoZSB1c2VyIGxlZnQgdGhlIGFwcCBvciBoZSBuYXZpZ2F0ZWQgYXdheSBmcm9tIHRoZSBvYmplY3Rcblx0XHRcdGlmICghY3VycmVudEhhc2ggfHwgIWFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmNoZWNrSGFzaFdpdGhHdWFyZChjdXJyZW50SGFzaCkpIHtcblx0XHRcdFx0dGhpcy5kaXNjYXJkU3RpY2t5U2Vzc2lvbihjb250ZXh0KTtcblx0XHRcdFx0Y29udGV4dC5nZXRNb2RlbCgpLmNsZWFyU2Vzc2lvbkNvbnRleHQoKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEVuZHMgYSBzdGlja3kgc2Vzc2lvbiBieSBkaXNjYXJkaW5nIGNoYW5nZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGVkaXRlZCAocm9vdCBvZiB0aGUgc3RpY2t5IHNlc3Npb24pXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGRpc2NhcmRTdGlja3lTZXNzaW9uKGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBkaXNjYXJkZWRDb250ZXh0ID0gYXdhaXQgc3RpY2t5LmRpc2NhcmREb2N1bWVudChjb250ZXh0KTtcblx0XHRpZiAoZGlzY2FyZGVkQ29udGV4dD8uaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0ZGlzY2FyZGVkQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5nZXRDcmVhdGlvbk1vZGUoKSkge1xuXHRcdFx0ZGlzY2FyZGVkQ29udGV4dD8ucmVmcmVzaCgpO1xuXHRcdH1cblxuXHRcdHRoaXMuaGFuZGxlU3RpY2t5T2ZmKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgaW50ZXJuYWwgcm91dGluZyBleHRlbnNpb24uXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBpbnRlcm5hbCByb3V0aW5nIGV4dGVuc2lvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXRJbnRlcm5hbFJvdXRpbmcoKTogSW50ZXJuYWxSb3V0aW5nIHtcblx0XHRpZiAodGhpcy5iYXNlLl9yb3V0aW5nKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlLl9yb3V0aW5nO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IEZsb3cgd29ya3Mgb25seSB3aXRoIGEgZ2l2ZW4gcm91dGluZyBsaXN0ZW5lclwiKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk6IFJvb3RWaWV3QmFzZUNvbnRyb2xsZXIge1xuXHRcdHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHR9XG5cblx0X2dldFNlbWFudGljTWFwcGluZygpOiBTZW1hbnRpY01hcHBpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRpbmdTZXJ2aWNlKCkuZ2V0TGFzdFNlbWFudGljTWFwcGluZygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgcHJvbWlzZSB0byB3YWl0IGZvciBhbiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIGNvbnRyb2xJZCBUaGUgSUQgb2YgdGhlIGNvbnRyb2xcblx0ICogQHJldHVybnMgVGhlIHJlc29sdmVyIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGV4dGVybmFsbHkgcmVzb2x2ZSB0aGUgcHJvbWlzZVxuXHQgKi9cblx0cHJpdmF0ZSBjcmVhdGVBY3Rpb25Qcm9taXNlKGFjdGlvbk5hbWU6IHN0cmluZywgY29udHJvbElkOiBzdHJpbmcpOiB7IGZSZXNvbHZlcjogRnVuY3Rpb247IGZSZWplY3RvcjogRnVuY3Rpb24gfSB7XG5cdFx0bGV0IHJlc29sdmVGdW5jdGlvbjogRnVuY3Rpb24sIHJlamVjdEZ1bmN0aW9uOiBGdW5jdGlvbjtcblx0XHR0aGlzLmFjdGlvblByb21pc2UgPSBuZXcgUHJvbWlzZTx7IGNvbnRyb2xJZD86IHN0cmluZzsgb0RhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzOiBzdHJpbmdbXSB9PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRyZXNvbHZlRnVuY3Rpb24gPSByZXNvbHZlO1xuXHRcdFx0cmVqZWN0RnVuY3Rpb24gPSByZWplY3Q7XG5cdFx0fSkudGhlbigob1Jlc3BvbnNlOiB1bmtub3duKSA9PiB7XG5cdFx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbihcblx0XHRcdFx0eyBjb250cm9sSWQgfSxcblx0XHRcdFx0dGhpcy5nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKFxuXHRcdFx0XHRcdGFjdGlvbk5hbWUsXG5cdFx0XHRcdFx0b1Jlc3BvbnNlIGFzIHVuZGVmaW5lZCB8IE9EYXRhVjRDb250ZXh0IHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W11cblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHR9KTtcblx0XHRyZXR1cm4geyBmUmVzb2x2ZXI6IHJlc29sdmVGdW5jdGlvbiEsIGZSZWplY3RvcjogcmVqZWN0RnVuY3Rpb24hIH07XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIGFjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0aGF0IGlzIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSByZXNwb25zZSBUaGUgYm91bmQgYWN0aW9uJ3MgcmVzcG9uc2UgZGF0YSBvciByZXNwb25zZSBjb250ZXh0XG5cdCAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGRhdGEgYW5kIG5hbWVzIG9mIHRoZSBrZXkgZmllbGRzIG9mIHRoZSByZXNwb25zZVxuXHQgKi9cblx0cHJpdmF0ZSBnZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKFxuXHRcdGFjdGlvbk5hbWU6IHN0cmluZyxcblx0XHRyZXNwb25zZT86ICh1bmRlZmluZWQgfCBPRGF0YVY0Q29udGV4dCB8IFByb21pc2VTZXR0bGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPltdKSB8IG51bGxcblx0KTogeyBvRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGtleXM6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHJlc3BvbnNlKSkge1xuXHRcdFx0aWYgKHJlc3BvbnNlLmxlbmd0aCA+PSAxKSB7XG5cdFx0XHRcdHJlc3BvbnNlID0gKHJlc3BvbnNlWzBdIGFzIFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+KS52YWx1ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICghcmVzcG9uc2UpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGNvbnN0IGN1cnJlbnRWaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCBtZXRhTW9kZWxEYXRhID0gKGN1cnJlbnRWaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkuZ2V0RGF0YSgpID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRjb25zdCBtZXRhTW9kZWxBY3Rpb24gPSBtZXRhTW9kZWxEYXRhW2FjdGlvbk5hbWVdIGFzIE1ldGFNb2RlbEFjdGlvbltdIHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGFjdGlvblJldHVyblR5cGUgPSBtZXRhTW9kZWxBY3Rpb24/LlswXS4kUmV0dXJuVHlwZSA/IG1ldGFNb2RlbEFjdGlvbj8uWzBdLiRSZXR1cm5UeXBlLiRUeXBlIDogbnVsbDtcblx0XHRjb25zdCBrZXlzID1cblx0XHRcdGFjdGlvblJldHVyblR5cGUgJiYgKG1ldGFNb2RlbERhdGFbYWN0aW9uUmV0dXJuVHlwZV0gYXMgTWV0YU1vZGVsRW50aXR5VHlwZSlcblx0XHRcdFx0PyAobWV0YU1vZGVsRGF0YVthY3Rpb25SZXR1cm5UeXBlXSBhcyBNZXRhTW9kZWxFbnRpdHlUeXBlKS4kS2V5XG5cdFx0XHRcdDogW107XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0b0RhdGE6IHJlc3BvbnNlLmdldE9iamVjdCgpLFxuXHRcdFx0a2V5c1xuXHRcdH07XG5cdH1cblxuXHRhc3luYyBnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpOiBQcm9taXNlPHsgY29udHJvbElkPzogc3RyaW5nOyBvRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGtleXM6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5hY3Rpb25Qcm9taXNlO1xuXHR9XG5cblx0ZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UoKTogdm9pZCB7XG5cdFx0dGhpcy5hY3Rpb25Qcm9taXNlID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0YXN5bmMgc2hvd0NvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2coaXNTYXZlOiBib29sZWFuKTogUHJvbWlzZTxSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uPiB7XG5cdFx0aWYgKCF0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2cpIHtcblx0XHRcdHRoaXMuY29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyA9IG5ldyBDb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2dCbG9jayh7XG5cdFx0XHRcdHZpZXc6IHRoaXMuZ2V0VmlldygpXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuY29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZz8ub3Blbihpc1NhdmUpO1xuXHR9XG5cblx0X3Njcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyh0YWJsZTogVGFibGUpOiB2b2lkIHtcblx0XHRjb25zdCByb3dCaW5kaW5nID0gdGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdGNvbnN0IGFjdGl2ZVJvd0luZGV4OiBudW1iZXIgPSByb3dCaW5kaW5nLmdldENvdW50KCkgfHwgMDtcblx0XHRpZiAodGFibGUuZGF0YShcInRhYmxlVHlwZVwiKSAhPT0gXCJSZXNwb25zaXZlVGFibGVcIikge1xuXHRcdFx0aWYgKGFjdGl2ZVJvd0luZGV4ID4gMCkge1xuXHRcdFx0XHR0YWJsZS5zY3JvbGxUb0luZGV4KGFjdGl2ZVJvd0luZGV4IC0gMSk7XG5cdFx0XHR9XG5cdFx0XHR0YWJsZS5mb2N1c1JvdyhhY3RpdmVSb3dJbmRleCwgdHJ1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8qIEluIGEgcmVzcG9uc2l2ZSB0YWJsZSwgdGhlIGVtcHR5IHJvd3MgYXBwZWFyIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRhYmxlLiBCdXQgd2hlbiB3ZSBjcmVhdGUgbW9yZSwgdGhleSBhcHBlYXIgYmVsb3cgdGhlIG5ldyBsaW5lLlxuXHRcdFx0ICogU28gd2UgY2hlY2sgdGhlIGZpcnN0IGluYWN0aXZlIHJvdyBmaXJzdCwgdGhlbiB3ZSBzZXQgdGhlIGZvY3VzIG9uIGl0IHdoZW4gd2UgcHJlc3MgdGhlIGJ1dHRvbi5cblx0XHRcdCAqIFRoaXMgZG9lc24ndCBpbXBhY3QgdGhlIEdyaWRUYWJsZSBiZWNhdXNlIHRoZXkgYXBwZWFyIGF0IHRoZSBlbmQsIGFuZCB3ZSBhbHJlYWR5IGZvY3VzIHRoZSBiZWZvcmUtdGhlLWxhc3Qgcm93IChiZWNhdXNlIDIgZW1wdHkgcm93cyBleGlzdClcblx0XHRcdCAqL1xuXHRcdFx0Y29uc3QgYWxsUm93Q29udGV4dHMgPSByb3dCaW5kaW5nLmdldENvbnRleHRzKCk7XG5cdFx0XHRpZiAoIWFsbFJvd0NvbnRleHRzPy5sZW5ndGgpIHtcblx0XHRcdFx0dGFibGUuZm9jdXNSb3coYWN0aXZlUm93SW5kZXgsIHRydWUpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRsZXQgZm9jdXNSb3cgPSBhY3RpdmVSb3dJbmRleCxcblx0XHRcdFx0aW5kZXggPSAwO1xuXHRcdFx0Zm9yIChjb25zdCBzaW5nbGVDb250ZXh0IG9mIGFsbFJvd0NvbnRleHRzKSB7XG5cdFx0XHRcdGlmIChzaW5nbGVDb250ZXh0LmlzSW5hY3RpdmUoKSAmJiBpbmRleCA8IGZvY3VzUm93KSB7XG5cdFx0XHRcdFx0Zm9jdXNSb3cgPSBpbmRleDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGZvY3VzUm93ID4gMCkge1xuXHRcdFx0XHR0YWJsZS5zY3JvbGxUb0luZGV4KGZvY3VzUm93KTtcblx0XHRcdH1cblx0XHRcdHRhYmxlLmZvY3VzUm93KGZvY3VzUm93LCB0cnVlKTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBjcmVhdGVFbXB0eVJvd3NBbmRGb2N1cyh0YWJsZTogVGFibGUpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCB0YWJsZUFQSSA9IHRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJO1xuXHRcdGlmIChcblx0XHRcdHRhYmxlQVBJPy50YWJsZURlZmluaXRpb24/LmNvbnRyb2w/LmlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGUgJiZcblx0XHRcdCF0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcInVpXCIpPy5nZXRQcm9wZXJ0eShcImNyZWF0ZU1vZGVcIilcblx0XHQpIHtcblx0XHRcdC8vIFdpdGggdGhlIHBhcmFtZXRlciwgd2UgZG9uJ3QgaGF2ZSBlbXB0eSByb3dzIGluIEVkaXQgbW9kZSwgc28gd2UgbmVlZCB0byBjcmVhdGUgdGhlbSBiZWZvcmUgc2V0dGluZyB0aGUgZm9jdXMgb24gdGhlbVxuXHRcdFx0YXdhaXQgdGFibGVBUEkuc2V0VXBFbXB0eVJvd3ModGFibGUsIHRydWUpO1xuXHRcdH1cblx0XHR0aGlzLl9zY3JvbGxBbmRGb2N1c09uSW5hY3RpdmVSb3codGFibGUpO1xuXHR9XG5cblx0X3NlbmRBY3Rpdml0eShcblx0XHRhY3Rpb246IEFjdGl2aXR5LFxuXHRcdHJlbGF0ZWRDb250ZXh0czogQ29udGV4dCB8IENvbnRleHRbXSB8IG51bGwgfCB1bmRlZmluZWQsXG5cdFx0dHJpZ2dlcmVkQWN0aW9uTmFtZT86IHN0cmluZyxcblx0XHRyZWZyZXNoTGlzdEJpbmRpbmc/OiBib29sZWFuLFxuXHRcdGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXM/OiBzdHJpbmdbXVxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBjb250ZW50ID0gQXJyYXkuaXNBcnJheShyZWxhdGVkQ29udGV4dHMpID8gcmVsYXRlZENvbnRleHRzLm1hcCgoY29udGV4dCkgPT4gY29udGV4dC5nZXRQYXRoKCkpIDogcmVsYXRlZENvbnRleHRzPy5nZXRQYXRoKCk7XG5cdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5zZW5kKHsgYWN0aW9uLCBjb250ZW50LCB0cmlnZ2VyZWRBY3Rpb25OYW1lLCByZWZyZXNoTGlzdEJpbmRpbmcsIGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXMgfSk7XG5cdH1cblxuXHRfdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoc0FjdGlvbk5hbWU6IHN0cmluZywgdHJpZ2dlclR5cGU6IFRyaWdnZXJUeXBlKTogdm9pZCB7XG5cdFx0dHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkodGhpcy5iYXNlLmdldFZpZXcoKSwgc0FjdGlvbk5hbWUsIHRyaWdnZXJUeXBlKTtcblx0fVxuXG5cdGFzeW5jIF9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIFN1Ym1pdCBhbnkgbGVmdG92ZXIgY2hhbmdlcyB0aGF0IGFyZSBub3QgeWV0IHN1Ym1pdHRlZFxuXHRcdFx0Ly8gQ3VycmVudGx5IHdlIGFyZSB1c2luZyBvbmx5IDEgdXBkYXRlR3JvdXBJZCwgaGVuY2Ugc3VibWl0dGluZyB0aGUgYmF0Y2ggZGlyZWN0bHkgaGVyZVxuXHRcdFx0YXdhaXQgb01vZGVsLnN1Ym1pdEJhdGNoKFwiJGF1dG9cIik7XG5cblx0XHRcdC8vIFdhaXQgZm9yIGFsbCBjdXJyZW50bHkgcnVubmluZyBjaGFuZ2VzXG5cdFx0XHQvLyBGb3IgdGhlIHRpbWUgYmVpbmcgd2UgYWdyZWVkIHdpdGggdGhlIHY0IG1vZGVsIHRlYW0gdG8gdXNlIGFuIGludGVybmFsIG1ldGhvZC4gV2UnbGwgcmVwbGFjZSBpdCBvbmNlXG5cdFx0XHQvLyBhIHB1YmxpYyBvciByZXN0cmljdGVkIG1ldGhvZCB3YXMgcHJvdmlkZWRcblx0XHRcdGF3YWl0IChvTW9kZWwub1JlcXVlc3RvciBhcyB1bmtub3duIGFzIHsgd2FpdEZvclJ1bm5pbmdDaGFuZ2VSZXF1ZXN0czogRnVuY3Rpb24gfSkud2FpdEZvclJ1bm5pbmdDaGFuZ2VSZXF1ZXN0cyhcIiRhdXRvXCIpO1xuXG5cdFx0XHQvLyBDaGVjayBpZiBhbGwgY2hhbmdlcyB3ZXJlIHN1Ym1pdHRlZCBzdWNjZXNzZnVsbHlcblx0XHRcdGlmIChvTW9kZWwuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJzdWJtaXQgb2Ygb3BlbiBjaGFuZ2VzIGZhaWxlZFwiKTtcblx0XHRcdH1cblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIsIGZhbHNlKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc3RpY2t5U2Vzc2lvblRva2VuXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGlzcGxheSBhICdkaXNjYXJkJyBwb3BvdmVyIHdoZW4gZXhpdGluZyBhIHN0aWNreSBzZXNzaW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dFxuXHQgKi9cblx0cHJpdmF0ZSBvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uKGNvbnRleHQ6IENvbnRleHQpOiB2b2lkIHtcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCByb3V0ZXJQcm94eSA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGVyUHJveHkoKTtcblxuXHRcdGlmIChyb3V0ZXJQcm94eS5jaGVja0lmQmFja0lzT3V0T2ZHdWFyZCgpKSB7XG5cdFx0XHRzdGlja3kucHJvY2Vzc0RhdGFMb3NzQ29uZmlybWF0aW9uKFxuXHRcdFx0XHRhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5kaXNjYXJkU3RpY2t5U2Vzc2lvbihjb250ZXh0KTtcblx0XHRcdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KTtcblx0XHRcdFx0XHRoaXN0b3J5LmJhY2soKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dmlldyxcblx0XHRcdFx0UHJvZ3JhbW1pbmdNb2RlbC5TdGlja3lcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aGlzdG9yeS5iYWNrKCk7XG5cdH1cblxuXHRhc3luYyBfaGFuZGxlTmV3Q29udGV4dChcblx0XHRvQ29udGV4dDogQ29udGV4dCxcblx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVyczogeyBlZGl0YWJsZTogYm9vbGVhbjsgcmVjcmVhdGVDb250ZXh0OiBib29sZWFuOyBmb3JjZUZvY3VzPzogYm9vbGVhbiB9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdH1cblxuXHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIHtcblx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiB0cnVlLFxuXHRcdFx0ZWRpdGFibGU6IG5hdmlnYXRpb25QYXJhbWV0ZXJzLmVkaXRhYmxlLFxuXHRcdFx0cGVyc2lzdE9QU2Nyb2xsOiB0cnVlLFxuXHRcdFx0cmVjcmVhdGVDb250ZXh0OiBuYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWNyZWF0ZUNvbnRleHQsXG5cdFx0XHRyZWFzb246IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24sXG5cdFx0XHRzaG93UGxhY2Vob2xkZXI6IGZhbHNlLFxuXHRcdFx0Zm9yY2VGb2N1czogbmF2aWdhdGlvblBhcmFtZXRlcnMuZm9yY2VGb2N1cyA/PyBmYWxzZSxcblx0XHRcdGtlZXBDdXJyZW50TGF5b3V0OiB0cnVlXG5cdFx0fSk7XG5cdH1cblxuXHRfZ2V0Qm91bmRDb250ZXh0KHZpZXc6IEZFVmlldywgcGFyYW1zOiB7IGNvbnRyb2xJZD86IHN0cmluZzsgaXNOYXZpZ2FibGU/OiBib29sZWFuIH0pOiBib29sZWFuIHtcblx0XHRjb25zdCB2aWV3TGV2ZWwgPSB2aWV3LmdldFZpZXdEYXRhKCkudmlld0xldmVsO1xuXHRcdGNvbnN0IGJSZWZyZXNoQWZ0ZXJBY3Rpb24gPSB2aWV3TGV2ZWwgPiAxIHx8ICh2aWV3TGV2ZWwgPT09IDEgJiYgcGFyYW1zLmNvbnRyb2xJZCk7XG5cdFx0cmV0dXJuICFwYXJhbXMuaXNOYXZpZ2FibGUgfHwgISFiUmVmcmVzaEFmdGVyQWN0aW9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGVyZSBhcmUgdmFsaWRhdGlvbiAocGFyc2UpIGVycm9ycyBmb3IgY29udHJvbHMgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0XG5cdCAqXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIGlmIHRoZXJlIGFyZSBubyB2YWxpZGF0aW9uIGVycm9ycywgYW5kIHJlamVjdHMgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gZXJyb3JzXG5cdCAqL1xuXG5cdGFzeW5jIF9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQgfCB2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soKS50aGVuKCgpID0+IHtcblx0XHRcdGNvbnN0IHNWaWV3SWQgPSB0aGlzLmdldFZpZXcoKS5nZXRJZCgpO1xuXHRcdFx0Y29uc3QgYU1lc3NhZ2VzID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0XHRcdGxldCBvQ29udHJvbDtcblxuXHRcdFx0aWYgKCFhTWVzc2FnZXMubGVuZ3RoKSB7XG5cdFx0XHRcdExvZy5pbmZvKFwiTm8gdmFsaWRhdGlvbiBlcnJvcnMgZm91bmRcIik7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChjb25zdCBtZXNzYWdlIG9mIGFNZXNzYWdlcykge1xuXHRcdFx0XHRpZiAobWVzc2FnZS52YWxpZGF0aW9uKSB7XG5cdFx0XHRcdFx0b0NvbnRyb2wgPSBFbGVtZW50LmdldEVsZW1lbnRCeUlkKG1lc3NhZ2UuZ2V0Q29udHJvbElkKCkpO1xuXHRcdFx0XHRcdHdoaWxlIChvQ29udHJvbCkge1xuXHRcdFx0XHRcdFx0aWYgKG9Db250cm9sLmdldElkKCkgPT09IHNWaWV3SWQpIHtcblx0XHRcdFx0XHRcdFx0dGhyb3cgXCJ2YWxpZGF0aW9uIGVycm9ycyBleGlzdFwiO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b0NvbnRyb2wgPSBvQ29udHJvbC5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0gb1Jlc3BvbnNlIFRoZSByZXNwb25zZSBvZiB0aGUgYm91bmQgYWN0aW9uIGFuZCB0aGUgbmFtZXMgb2YgdGhlIGtleSBmaWVsZHNcblx0ICogQHBhcmFtIG9SZXNwb25zZS5vRGF0YVxuXHQgKiBAcGFyYW0gb1Jlc3BvbnNlLmtleXNcblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBib3VuZCBjb250ZXh0IG9uIHdoaWNoIHRoZSBhY3Rpb24gd2FzIGV4ZWN1dGVkXG5cdCAqIEByZXR1cm5zIEFsd2F5cyByZXNvbHZlcyB0byBwYXJhbSBvUmVzcG9uc2Vcblx0ICovXG5cdGFzeW5jIF9yZWZyZXNoTGlzdElmUmVxdWlyZWQoXG5cdFx0b1Jlc3BvbnNlPzogeyBvRGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzPzogc3RyaW5nW10gfCBudWxsIH0sXG5cdFx0b0NvbnRleHQ/OiBDb250ZXh0XG5cdCk6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuXHRcdGlmICghb0NvbnRleHQgfHwgIW9SZXNwb25zZSB8fCAhb1Jlc3BvbnNlLm9EYXRhIHx8ICFvUmVzcG9uc2Uua2V5cykge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuXHRcdH1cblx0XHRjb25zdCBvQmluZGluZyA9IG9Db250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHQvLyByZWZyZXNoIG9ubHkgbGlzdHNcblx0XHRpZiAob0JpbmRpbmcgJiYgb0JpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9SZXNwb25zZS5vRGF0YTtcblx0XHRcdGNvbnN0IGFLZXlzID0gb1Jlc3BvbnNlLmtleXM7XG5cdFx0XHRjb25zdCBvQ3VycmVudERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdGxldCBiUmV0dXJuZWRDb250ZXh0SXNTYW1lID0gdHJ1ZTtcblx0XHRcdC8vIGVuc3VyZSBjb250ZXh0IGlzIGluIHRoZSByZXNwb25zZVxuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9Db250ZXh0RGF0YSkubGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGNoZWNrIGlmIGNvbnRleHQgaW4gcmVzcG9uc2UgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGJvdW5kIGNvbnRleHRcblx0XHRcdFx0YlJldHVybmVkQ29udGV4dElzU2FtZSA9IGFLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChzS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRcdFx0XHRyZXR1cm4gb0N1cnJlbnREYXRhW3NLZXldID09PSBvQ29udGV4dERhdGFbc0tleV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoIWJSZXR1cm5lZENvbnRleHRJc1NhbWUpIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0XHRcdFx0XHRpZiAob0JpbmRpbmcuaXNSb290KCkpIHtcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKG9CaW5kaW5nKSkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFdlIHVzZSBhIHNpZGUtZWZmZWN0IHJlZnJlc2ggZm9yIGEgVHJlZVRhYmxlLCB0byBwcmVzZXJ2ZSBleHBhbnNpb24gc3RhdGVzXG5cdFx0XHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHMoW3sgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IFwiXCIgfV0sIG9CaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSEpXG5cdFx0XHRcdFx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goKGU6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVmcmVzaGluZyB0aGUgdGFibGVcIiwgZSBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0b0JpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlY2VpdmVkXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0b0JpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRhcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBvQmluZGluZy5nZXRQYXRoKCkgfV0sIG9CaW5kaW5nLmdldENvbnRleHQoKSlcblx0XHRcdFx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0LmNhdGNoKChlOiB1bmtub3duKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZWZyZXNoaW5nIHRoZSB0YWJsZVwiLCBlIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIHJlc29sdmUgd2l0aCBvUmVzcG9uc2UgdG8gbm90IGRpc3R1cmIgdGhlIHByb21pc2UgY2hhaW4gYWZ0ZXJ3YXJkc1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcblx0fVxuXG5cdGFzeW5jIF9mZXRjaFNlbWFudGljS2V5VmFsdWVzKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx1bmtub3duPiB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRzRW50aXR5U2V0TmFtZSA9IG9NZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCJAc2FwdWkubmFtZVwiKSxcblx0XHRcdGFTZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMob01ldGFNb2RlbCwgc0VudGl0eVNldE5hbWUpO1xuXG5cdFx0aWYgKGFTZW1hbnRpY0tleXMgJiYgYVNlbWFudGljS2V5cy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGFSZXF1ZXN0UHJvbWlzZXMgPSBhU2VtYW50aWNLZXlzLm1hcChhc3luYyBmdW5jdGlvbiAob0tleTogeyAkUHJvcGVydHlQYXRoOiBzdHJpbmcgfSk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0XHRcdHJldHVybiBvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KG9LZXkuJFByb3BlcnR5UGF0aCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKGFSZXF1ZXN0UHJvbWlzZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFByb3ZpZGVzIHRoZSBsYXRlc3QgY29udGV4dCBpbiB0aGUgbWV0YWRhdGEgaGllcmFyY2h5IGZyb20gcm9vdEJpbmRpbmcgdG8gZ2l2ZW4gY29udGV4dCBwb2ludGluZyB0byBnaXZlbiBlbnRpdHlUeXBlXG5cdCAqIGlmIGFueSBzdWNoIGNvbnRleHQgZXhpc3RzLiBPdGhlcndpc2UsIGl0IHJldHVybnMgdGhlIG9yaWdpbmFsIGNvbnRleHQuXG5cdCAqIE5vdGU6IEl0IGlzIG9ubHkgbmVlZGVkIGFzIHdvcmstYXJvdW5kIGZvciBpbmNvcnJlY3QgbW9kZWxsaW5nLiBDb3JyZWN0IG1vZGVsbGluZyB3b3VsZCBpbXBseSBhIERhdGFGaWVsZEZvckFjdGlvbiBpbiBhIExpbmVJdGVtXG5cdCAqIHRvIHBvaW50IHRvIGFuIG92ZXJsb2FkIGRlZmluZWQgZWl0aGVyIG9uIHRoZSBjb3JyZXNwb25kaW5nIEVudGl0eVR5cGUgb3IgYSBjb2xsZWN0aW9uIG9mIHRoZSBzYW1lLlxuXHQgKlxuXHQgKiBAcGFyYW0gcm9vdENvbnRleHQgVGhlIGNvbnRleHQgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb21cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0QmluZGluZyBvZiB0aGUgdGFibGVcblx0ICogQHBhcmFtIG92ZXJsb2FkRW50aXR5VHlwZSBUaGUgQWN0aW9uT3ZlcmxvYWQgZW50aXR5IHR5cGUgdG8gc2VhcmNoIGZvclxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBBY3Rpb25PdmVybG9hZCBlbnRpdHlcblx0ICovXG5cdF9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tTWV0YWRhdGFQYXRoKHJvb3RDb250ZXh0OiBDb250ZXh0LCBsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgb3ZlcmxvYWRFbnRpdHlUeXBlOiBzdHJpbmcpOiBDb250ZXh0IHtcblx0XHRjb25zdCBtb2RlbDogT0RhdGFNb2RlbCA9IHJvb3RDb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBjb250ZXh0U2VnbWVudHM6IHN0cmluZ1tdID0gbGlzdEJpbmRpbmcuZ2V0UGF0aCgpLnNwbGl0KFwiL1wiKTtcblx0XHRsZXQgY3VycmVudENvbnRleHQ6IENvbnRleHQgPSByb290Q29udGV4dDtcblxuXHRcdC8vIFdlIGV4cGVjdCB0aGF0IHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIGxpc3RCaW5kaW5nIGlzIHRoZSBMaXN0QmluZGluZyBvZiB0aGUgdGFibGUuIFJlbW92ZSB0aGlzIGZyb20gY29udGV4dFNlZ21lbnRzXG5cdFx0Ly8gYmVjYXVzZSBpdCBpcyBpbmNvcnJlY3QgdG8gZXhlY3V0ZSBiaW5kQ29udGV4dCBvbiBhIGxpc3QuIFdlIGRvIG5vdCBhbnl3YXkgbmVlZCB0byBzZWFyY2ggdGhpcyBjb250ZXh0IGZvciB0aGUgb3ZlcmxvYWQuXG5cdFx0Y29udGV4dFNlZ21lbnRzLnBvcCgpO1xuXHRcdGlmIChjb250ZXh0U2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRjb250ZXh0U2VnbWVudHMgPSBbXCJcIl07IC8vIERvbid0IGxlYXZlIGNvbnRleHRTZWdtZW50cyB1bmRlZmluZWRcblx0XHR9XG5cblx0XHRpZiAoY29udGV4dFNlZ21lbnRzWzBdICE9PSBcIlwiKSB7XG5cdFx0XHRjb250ZXh0U2VnbWVudHMudW5zaGlmdChcIlwiKTsgLy8gdG8gYWxzbyBnZXQgdGhlIHJvb3QgY29udGV4dCwgaS5lLiB0aGUgYmluZGluZ0NvbnRleHQgb2YgdGhlIHRhYmxlXG5cdFx0fVxuXHRcdC8vIGxvYWQgYWxsIHRoZSBwYXJlbnQgY29udGV4dHMgaW50byBhbiBhcnJheVxuXHRcdGNvbnN0IHBhcmVudENvbnRleHRzOiBDb250ZXh0W10gPSBjb250ZXh0U2VnbWVudHNcblx0XHRcdC5tYXAoKHBhdGhTZWdtZW50OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0aWYgKHBhdGhTZWdtZW50ICE9PSBcIlwiKSB7XG5cdFx0XHRcdFx0Y3VycmVudENvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChwYXRoU2VnbWVudCwgY3VycmVudENvbnRleHQpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIENyZWF0aW5nIGEgbmV3IGNvbnRleHQgdXNpbmcgYmluZENvbnRleHQoLi4uKS5nZXRCb3VuZENvbnRleHQoKSBkb2VzIG5vdCB3b3JrIGlmIHRoZSBldGFnIGlzIG5lZWRlZC4gQWNjb3JkaW5nIHRvIG1vZGVsIGNvbGxlYWd1ZXMsXG5cdFx0XHRcdFx0Ly8gd2Ugc2hvdWxkIGFsd2F5cyB1c2UgYW4gZXhpc3RpbmcgY29udGV4dCBpZiBwb3NzaWJsZS5cblx0XHRcdFx0XHQvLyBDdXJyZW50bHksIHRoZSBvbmx5IGV4YW1wbGUgd2Uga25vdyBhYm91dCBpcyB1c2luZyB0aGUgcm9vdENvbnRleHQgLSBhbmQgaW4gdGhpcyBjYXNlLCB3ZSBjYW4gb2J2aW91c2x5IHJldXNlIHRoYXQgZXhpc3RpbmcgY29udGV4dC5cblx0XHRcdFx0XHQvLyBJZiBvdGhlciBleGFtcGxlcyBzaG91bGQgY29tZSB1cCwgdGhlIGJlc3QgcG9zc2libGUgd29yayBhcm91bmQgd291bGQgYmUgdG8gcmVxdWVzdCBzb21lIGRhdGEgdG8gZ2V0IGFuIGV4aXN0aW5nIGNvbnRleHQuIFRvIGtlZXAgdGhlXG5cdFx0XHRcdFx0Ly8gcmVxdWVzdCBhcyBzbWFsbCBhbmQgZmFzdCBhcyBwb3NzaWJsZSwgd2Ugc2hvdWxkIHJlcXVlc3Qgb25seSB0aGUgZmlyc3Qga2V5IHByb3BlcnR5LiBBcyB0aGlzIHdvdWxkIGludHJvZHVjZSBhc3luY2hyb25pc20sIGFuZCBhbnl3YXlcblx0XHRcdFx0XHQvLyB0aGUgd2hvbGUgbG9naWMgaXMgb25seSBwYXJ0IG9mIHdvcmstYXJvdW5kIGZvciBpbmNvcnJlY3QgbW9kZWxsaW5nLCB3ZSB3YWl0IHVudGlsIHdlIGhhdmUgYW4gZXhhbXBsZSBuZWVkaW5nIGl0IGJlZm9yZSBpbXBsZW1lbnRpbmcgdGhpcy5cblx0XHRcdFx0XHRjdXJyZW50Q29udGV4dCA9IHJvb3RDb250ZXh0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBjdXJyZW50Q29udGV4dDtcblx0XHRcdH0pXG5cdFx0XHQucmV2ZXJzZSgpO1xuXHRcdC8vIHNlYXJjaCBmb3IgY29udGV4dCBiYWNrd2FyZHNcblx0XHRjb25zdCBvdmVybG9hZENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQgPSBwYXJlbnRDb250ZXh0cy5maW5kKFxuXHRcdFx0KHBhcmVudENvbnRleHQ6IENvbnRleHQpID0+XG5cdFx0XHRcdChtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQocGFyZW50Q29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIiRUeXBlXCIpIGFzIHVua25vd24gYXMgc3RyaW5nKSA9PT0gb3ZlcmxvYWRFbnRpdHlUeXBlXG5cdFx0KTtcblx0XHRyZXR1cm4gb3ZlcmxvYWRDb250ZXh0IHx8IGxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSE7XG5cdH1cblxuXHRfY3JlYXRlU2libGluZ0luZm8oY3VycmVudENvbnRleHQ6IENvbnRleHQsIG5ld0NvbnRleHQ6IENvbnRleHQpOiBTaWJsaW5nSW5mb3JtYXRpb24ge1xuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXRDb250ZXh0OiBuZXdDb250ZXh0LFxuXHRcdFx0cGF0aE1hcHBpbmc6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG9sZFBhdGg6IGN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0XHRuZXdQYXRoOiBuZXdDb250ZXh0LmdldFBhdGgoKVxuXHRcdFx0XHR9XG5cdFx0XHRdXG5cdFx0fTtcblx0fVxuXG5cdF91cGRhdGVQYXRoc0luSGlzdG9yeShtYXBwaW5nczogeyBvbGRQYXRoOiBzdHJpbmc7IG5ld1BhdGg6IHN0cmluZyB9W10pOiB2b2lkIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuc2V0UGF0aE1hcHBpbmcobWFwcGluZ3MpO1xuXG5cdFx0Ly8gQWxzbyB1cGRhdGUgdGhlIHNlbWFudGljIG1hcHBpbmcgaW4gdGhlIHJvdXRpbmcgc2VydmljZVxuXHRcdGNvbnN0IGxhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRpZiAobWFwcGluZ3MubGVuZ3RoICYmIGxhc3RTZW1hbnRpY01hcHBpbmc/LnRlY2huaWNhbFBhdGggPT09IG1hcHBpbmdzW21hcHBpbmdzLmxlbmd0aCAtIDFdLm9sZFBhdGgpIHtcblx0XHRcdGxhc3RTZW1hbnRpY01hcHBpbmcudGVjaG5pY2FsUGF0aCA9IG1hcHBpbmdzW21hcHBpbmdzLmxlbmd0aCAtIDFdLm5ld1BhdGg7XG5cdFx0fVxuXHR9XG5cblx0X2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0KFxuXHRcdGNvbnRleHQ6IENvbnRleHQsXG5cdFx0bmV3RG9jdW1lbnRDb250ZXh0OiBDb250ZXh0LFxuXHRcdHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWRcblx0KTogQ29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlOiBDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8oY29udGV4dCwgbmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0aWYgKHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQuZ2V0UGF0aCgpICE9IG5ld0RvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbnRleHRUb05hdmlnYXRlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzaWJsaW5nIGNvbnRleHQgZm9yIGEgc3Vib2JqZWN0IHBhZ2UsIGFuZCBjYWxjdWxhdGVzIGEgc2libGluZyBwYXRoXG5cdCAqIGZvciBhbGwgaW50ZXJtZWRpYXRlIHBhdGhzIGJldHdlZW4gdGhlIG9iamVjdCBwYWdlIGFuZCB0aGUgc3Vib2JqZWN0IHBhZ2UuXG5cdCAqXG5cdCAqIEBwYXJhbSByb290Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgZm9yIHRoZSByb290IG9mIHRoZSBkcmFmdFxuXHQgKiBAcGFyYW0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIHN1Ym9iamVjdFxuXHQgKiBAcGFyYW0gc1Byb2dyYW1taW5nTW9kZWwgVGhlIHByb2dyYW1taW5nIG1vZGVsXG5cdCAqIEBwYXJhbSBkb05vdENvbXB1dGVJZlJvb3QgSWYgdHJ1ZSwgd2UgZG9uJ3QgY29tcHV0ZSBzaWJsaW5nSW5mbyBpZiB0aGUgcm9vdCBhbmQgdGhlIHJpZ2h0bW9zdCBjb250ZXh0cyBhcmUgdGhlIHNhbWVcblx0ICogQHBhcmFtIHJvb3RDb250ZXh0SW5mbyBUaGUgcm9vdCBjb250ZXh0IGluZm9ybWF0aW9uIG9mIHJvb3Qgb2YgdGhlIGRyYWZ0XG5cdCAqIEBwYXJhbSBncm91cElkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHNpYmxpbmdJbmZvcm1hdGlvbiBvYmplY3Rcblx0ICovXG5cdGFzeW5jIF9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdHJvb3RDdXJyZW50Q29udGV4dDogQ29udGV4dCxcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dDogQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQsXG5cdFx0c1Byb2dyYW1taW5nTW9kZWw6IHN0cmluZyxcblx0XHRkb05vdENvbXB1dGVJZlJvb3Q6IGJvb2xlYW4sXG5cdFx0cm9vdENvbnRleHRJbmZvPzogUm9vdENvbnRleHRJbmZvLFxuXHRcdGdyb3VwSWQ/OiBzdHJpbmdcblx0KTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dCA9IHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0ID8/IHJvb3RDdXJyZW50Q29udGV4dDtcblx0XHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0XHQvLyBXcm9uZyB1c2FnZSAhIVxuXHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0fVxuXHRcdGlmIChkb05vdENvbXB1dGVJZlJvb3QgJiYgcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpID09PSByb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kZWwgPSByb290Q3VycmVudENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHJldHVybiBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKHJvb3RDdXJyZW50Q29udGV4dCwgcmlnaHRtb3N0Q3VycmVudENvbnRleHQsIHJvb3RDb250ZXh0SW5mbywgZ3JvdXBJZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIElmIG5vdCBpbiBkcmFmdCBtb2RlLCB3ZSBqdXN0IHJlY3JlYXRlIGEgY29udGV4dCBmcm9tIHRoZSBwYXRoIG9mIHRoZSByaWdodG1vc3QgY29udGV4dFxuXHRcdFx0Ly8gTm8gcGF0aCBtYXBwaW5nIGlzIG5lZWRlZFxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dGFyZ2V0Q29udGV4dDogbW9kZWwuYmluZENvbnRleHQocmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKS5nZXRCb3VuZENvbnRleHQoKSxcblx0XHRcdFx0cGF0aE1hcHBpbmc6IFtdXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXG5cdF9pc0ZjbEVuYWJsZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuX2lzRmNsRW5hYmxlZCgpO1xuXHR9XG5cblx0YXN5bmMgY2hlY2tSZWNvbW1lbmRhdGlvbk9wdGlvbigpOiBQcm9taXNlPFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24gfCB1bmRlZmluZWQ+IHtcblx0XHRsZXQgcmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuO1xuXHRcdGlmICh0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLmNoZWNrSWZSZWNvbW1lbmRhdGlvbnNFeGlzdCgpKSB7XG5cdFx0XHRyZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4gPSBhd2FpdCB0aGlzLnNob3dDb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nKHRydWUpO1xuXHRcdFx0aWYgKHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3NlbiA9PT0gUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbi5Db250aW51ZSkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbi5Db250aW51ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW47XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRWRpdEZsb3c7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBcUVBLE1BQU1BLFlBQVksR0FBR0MsU0FBUyxDQUFDRCxZQUFZO0lBQzFDRSxnQkFBZ0IsR0FBR0QsU0FBUyxDQUFDQyxnQkFBZ0I7SUFDN0NDLFNBQVMsR0FBR0YsU0FBUyxDQUFDRSxTQUFTO0lBQy9CQyxXQUFXLEdBQUdILFNBQVMsQ0FBQ0csV0FBVztJQUNuQ0MsUUFBUSxHQUFHSixTQUFTLENBQUNJLFFBQVE7SUFDN0JDLFdBQVcsR0FBR0wsU0FBUyxDQUFDSyxXQUFXO0lBQ25DQyxXQUFXLEdBQUdDLFdBQVcsQ0FBQ0QsV0FBVztFQXdCdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFOQSxJQVFNRSxRQUFRLFdBRGJDLGNBQWMsQ0FBQywyQ0FBMkMsQ0FBQyxVQW9DMURDLGVBQWUsRUFBRSxVQUNqQkMsY0FBYyxFQUFF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
|