From 88f8bd66c768bd8d7ed61af9e09c4c6fae983f09 Mon Sep 17 00:00:00 2001 From: Darren Ethier Date: Tue, 12 Mar 2019 08:02:54 +0200 Subject: [PATCH] update build files (dev) --- assets/dist/build-manifest.json | 2 +- ...-data-stores.b9c742685b104fe37411.dist.js} | 236 ++++++++++++++++-- 2 files changed, 223 insertions(+), 15 deletions(-) rename assets/dist/{ee-data-stores.fc604083647264add736.dist.js => ee-data-stores.b9c742685b104fe37411.dist.js} (56%) diff --git a/assets/dist/build-manifest.json b/assets/dist/build-manifest.json index abe6271c46c..80d010128b9 100644 --- a/assets/dist/build-manifest.json +++ b/assets/dist/build-manifest.json @@ -1,7 +1,7 @@ { "components.css": "ee-components.997177945b17ee98a639.dist.css", "components.js": "ee-components.cf0aaacfef0cb46b08ec.dist.js", - "data-stores.js": "ee-data-stores.fc604083647264add736.dist.js", + "data-stores.js": "ee-data-stores.b9c742685b104fe37411.dist.js", "editor-hocs.js": "ee-editor-hocs.15a813aac7a51b5473cb.dist.js", "eejs.js": "ee-eejs.4bd48b02f85a875e3121.dist.js", "eventespresso-core-blocks-frontend.css": "ee-eventespresso-core-blocks-frontend.f0ea9ad96d720bc8dc9b.dist.css", diff --git a/assets/dist/ee-data-stores.fc604083647264add736.dist.js b/assets/dist/ee-data-stores.b9c742685b104fe37411.dist.js similarity index 56% rename from assets/dist/ee-data-stores.fc604083647264add736.dist.js rename to assets/dist/ee-data-stores.b9c742685b104fe37411.dist.js index 16ff22c5e28..0ffc1dd75d9 100644 --- a/assets/dist/ee-data-stores.fc604083647264add736.dist.js +++ b/assets/dist/ee-data-stores.b9c742685b104fe37411.dist.js @@ -594,13 +594,20 @@ var relations = { RECEIVE_DIRTY_RELATION_DELETION: 'RECEIVE_DIRTY_RELATION_DELETION', RECEIVE_UPDATED_ENTITY_ID_FOR_RELATIONS: 'RECEIVE_UPDATED_ENTITY_ID_FOR_RELATIONS' }; +var resets = { + RESET_ALL_STATE: 'RESET_ALL_STATE', + RESET_STATE_FOR_MODEL: 'RESET_STATE_FOR_MODEL', + RESET_ALL_MODEL_SPECIFIC: 'RESET_ALL_MODEL_SPECIFIC_STATE', + RESET_MODEL_SPECIFIC_FOR_SELECTOR: 'RESET_MODEL_SPECIFIC_FOR_SELECTOR' +}; var modelSpecific = { RECEIVE_SELECTOR_VALUE: 'RECEIVE_SELECTOR_VALUE' }; var ACTION_TYPES = { entities: entities, relations: relations, - modelSpecific: modelSpecific + modelSpecific: modelSpecific, + resets: resets }; /***/ }), @@ -4073,7 +4080,8 @@ __webpack_require__.r(__webpack_exports__); */ -var types = _actions_action_types__WEBPACK_IMPORTED_MODULE_5__["ACTION_TYPES"].entities; +var types = _actions_action_types__WEBPACK_IMPORTED_MODULE_5__["ACTION_TYPES"].entities, + resetTypes = _actions_action_types__WEBPACK_IMPORTED_MODULE_5__["ACTION_TYPES"].resets; /** * Handle adding incoming data to state. * @@ -4149,7 +4157,20 @@ var processAction = function processAction(state, action) { function deleteEntity() { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Object(immutable__WEBPACK_IMPORTED_MODULE_3__["fromJS"])(_eventespresso_model__WEBPACK_IMPORTED_MODULE_2__["DEFAULT_CORE_STATE"].dirty.delete); var action = arguments.length > 1 ? arguments[1] : undefined; - return action.type === types.RECEIVE_DELETE_ENTITY_ID || action.type === types.REMOVE_DELETE_ENTITY_ID ? processAction(state, action) : state; + + switch (action.type) { + case types.RECEIVE_DELETE_ENTITY_ID: + case types.REMOVE_DELETE_ENTITY_ID: + return processAction(state, action); + + case resetTypes.RESET_ALL_STATE: + return Object(immutable__WEBPACK_IMPORTED_MODULE_3__["fromJS"])(_eventespresso_model__WEBPACK_IMPORTED_MODULE_2__["DEFAULT_CORE_STATE"].dirty.delete); + + case resetTypes.RESET_STATE_FOR_MODEL: + return state.delete(Object(_eventespresso_model__WEBPACK_IMPORTED_MODULE_2__["singularModelName"])(action.modelName)); + } + + return state; } /** * Reducer for queueing the entity for trashing in the state. @@ -4162,7 +4183,20 @@ function deleteEntity() { function trashEntity() { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Object(immutable__WEBPACK_IMPORTED_MODULE_3__["fromJS"])(_eventespresso_model__WEBPACK_IMPORTED_MODULE_2__["DEFAULT_CORE_STATE"].dirty.trash); var action = arguments.length > 1 ? arguments[1] : undefined; - return action.type === types.RECEIVE_TRASH_ENTITY_ID || action.type === types.REMOVE_TRASH_ENTITY_ID ? processAction(state, action) : state; + + switch (action.type) { + case types.RECEIVE_TRASH_ENTITY_ID: + case types.REMOVE_TRASH_ENTITY_ID: + return processAction(state, action); + + case resetTypes.RESET_ALL_STATE: + return Object(immutable__WEBPACK_IMPORTED_MODULE_3__["fromJS"])(_eventespresso_model__WEBPACK_IMPORTED_MODULE_2__["DEFAULT_CORE_STATE"].dirty.trash); + + case resetTypes.RESET_STATE_FOR_MODEL: + return state.delete(Object(_eventespresso_model__WEBPACK_IMPORTED_MODULE_2__["singularModelName"])(action.modelName)); + } + + return state; } /***/ }), @@ -4215,7 +4249,8 @@ __webpack_require__.r(__webpack_exports__); */ -var types = _actions_action_types__WEBPACK_IMPORTED_MODULE_9__["ACTION_TYPES"].relations; +var types = _actions_action_types__WEBPACK_IMPORTED_MODULE_9__["ACTION_TYPES"].relations, + resetTypes = _actions_action_types__WEBPACK_IMPORTED_MODULE_9__["ACTION_TYPES"].resets; /** * Used to determine whether the relation exists in the provided map. * @@ -4694,6 +4729,54 @@ function removeRelatedEntitiesForEntity(state, action) { }); return state; } +/** + * Handles clearing the given model from the state. + * + * @param {Immutable.Map} state + * @param {Object} action + * + * @return {Immutable.Map} New state. + */ + + +var clearStateForModel = function clearStateForModel(state, action) { + var singularName = Object(_eventespresso_model__WEBPACK_IMPORTED_MODULE_5__["singularModelName"])(action.modelName); + var pluralName = Object(_eventespresso_model__WEBPACK_IMPORTED_MODULE_5__["pluralModelName"])(action.modelName); // index record path + + state = clearModelFromSubstate(state, 'index', pluralName, singularName); // delete record path + + state = clearModelFromSubstate(state, 'delete', singularName, pluralName); // add record path + + state = clearModelFromSubstate(state, 'add', singularName, pluralName); + return state; +}; +/** + * For the given arguments clears the model from the substate on the given state + * for the given substate key. + * + * @param {Immutable.Map} state + * @param {string} subStateKey + * @param {string} modelName + * @param {string} modelNameAsRelation + * @return {Immutable.Map} The new state. + */ + + +var clearModelFromSubstate = function clearModelFromSubstate(state, subStateKey, modelName, modelNameAsRelation) { + state = state.deleteIn([subStateKey, modelName]); + var subState = state.get(subStateKey); + subState = subState.withMutations(function (mutatedState) { + state.get(subStateKey).forEach(function (entityMaps, relationName) { + entityMaps.forEach(function (modelMap, relationEntityId) { + var deletePath = [relationName, relationEntityId, modelNameAsRelation]; + mutatedState.deleteIn(deletePath); + Object(_eventespresso_helpers__WEBPACK_IMPORTED_MODULE_7__["removeEmptyFromState"])(mutatedState, deletePath, 1, false); + }); + }); + }); + state = state.set(subStateKey, subState); + return state; +}; /** * exports useful for testing. */ @@ -4719,9 +4802,20 @@ function removeRelatedEntitiesForEntity(state, action) { case types.REMOVE_RELATED_ENTITIES_FOR_ENTITY: return removeRelatedEntitiesForEntity(state, action); - default: + case resetTypes.RESET_ALL_STATE: + return Object(immutable__WEBPACK_IMPORTED_MODULE_6__["fromJS"])(_eventespresso_model__WEBPACK_IMPORTED_MODULE_5__["DEFAULT_CORE_STATE"].dirty.relations); + + case resetTypes.RESET_STATE_FOR_MODEL: + return clearStateForModel(state, action); + + case types.RECEIVE_DIRTY_RELATION_ADDITION: + case types.REMOVE_DIRTY_RELATION_ADDITION: + case types.RECEIVE_DIRTY_RELATION_DELETION: + case types.REMOVE_DIRTY_RELATION_DELETION: return dirtyRelations(state, action); } + + return state; }); /***/ }), @@ -5032,7 +5126,8 @@ __webpack_require__.r(__webpack_exports__); */ -var types = _actions_action_types__WEBPACK_IMPORTED_MODULE_2__["ACTION_TYPES"].modelSpecific; +var types = _actions_action_types__WEBPACK_IMPORTED_MODULE_2__["ACTION_TYPES"].modelSpecific, + resetTypes = _actions_action_types__WEBPACK_IMPORTED_MODULE_2__["ACTION_TYPES"].resets; /** * Handle receiving a model specific selector record into the state. * @@ -5049,8 +5144,15 @@ function handleReceiveSelector() { args = action.args, value = action.value; - if (type === types.RECEIVE_SELECTOR_VALUE) { - return state.setIn([selector, _babel_runtime_corejs2_core_js_json_stringify__WEBPACK_IMPORTED_MODULE_0___default()(args)], value); + switch (type) { + case types.RECEIVE_SELECTOR_VALUE: + return state.setIn([selector, _babel_runtime_corejs2_core_js_json_stringify__WEBPACK_IMPORTED_MODULE_0___default()(args)], value); + + case resetTypes.RESET_ALL_MODEL_SPECIFIC: + return Object(immutable__WEBPACK_IMPORTED_MODULE_1__["Map"])(); + + case resetTypes.RESET_MODEL_SPECIFIC_FOR_SELECTOR: + return state.deleteIn([selector, _babel_runtime_corejs2_core_js_json_stringify__WEBPACK_IMPORTED_MODULE_0___default()(args)]); } return state; @@ -5098,7 +5200,8 @@ __webpack_require__.r(__webpack_exports__); */ -var types = _actions_action_types__WEBPACK_IMPORTED_MODULE_6__["ACTION_TYPES"].relations; +var types = _actions_action_types__WEBPACK_IMPORTED_MODULE_6__["ACTION_TYPES"].relations, + resetTypes = _actions_action_types__WEBPACK_IMPORTED_MODULE_6__["ACTION_TYPES"].resets; /** * Handles normalizing the incoming action so that we're always only receiving * relation data in the state oriented from one direction. @@ -5358,6 +5461,75 @@ var removeRelatedEntitiesForEntity = function removeRelatedEntitiesForEntity(sta return state; }; +/** + * Handles resetting the state for the given modelName in the action. + * + * @param {Immutable.Map} state + * @param {Object} action + * + * @return {Immutable.Map} The new (or existing if no changes) state. + */ + + +var resetStateForModel = function resetStateForModel(state, action) { + var singularName = Object(_eventespresso_model__WEBPACK_IMPORTED_MODULE_3__["singularModelName"])(action.modelName); + var pluralName = Object(_eventespresso_model__WEBPACK_IMPORTED_MODULE_3__["pluralModelName"])(action.modelName); + var indexPath = ['index', pluralName]; + var entityMapPath = ['entityMap', singularName]; + + if (state.hasIn(indexPath)) { + state = clearModelNamesFromPath(state, indexPath, 'entityMap', pluralName); + } + + if (state.hasIn(entityMapPath)) { + state = clearModelNamesFromPath(state, entityMapPath, 'index', singularName); + } + + return state; +}; +/** + * Helper for clearing the entries in the dirty relations state for the given + * modelName. + * + * This clears entries in both the `index` and `entityMap` maps. + * + * "Main state" is used in this function to represent the top level state the + * model's entries are being deleted from (i.e. entityMap or index). + * + * "Opposite state" is used in this function to represent the opposite top level + * state. So if the main state path points to entries in the entityMap, then + * the opposite state will be entries in the index. + * + * @param {Immutable.Map} state + * @param {Array} path The path for the main state being cleared. + * @param {string} mapProperty The property for the opposite state index being + * cleared. + * @param {string} relationModelName The modelName string for the model being + * cleared from the opposite state map. + * + * @return {Immutable.Map} The new (or existing if no changes) state. + */ + + +var clearModelNamesFromPath = function clearModelNamesFromPath(state, path, mapProperty, relationModelName) { + var mainState = state.getIn(path); + var oppositeState = state.get(mapProperty); + oppositeState = oppositeState.withMutations(function (subState) { + mainState.forEach(function (relationMap) { + relationMap.forEach(function (relationIds, relationName) { + relationIds.forEach(function (relationId) { + subState.deleteIn([relationName, relationId, relationModelName]); + + if (subState.hasIn([relationName, relationId]) && subState.getIn([relationName, relationId]).count() < 1) { + Object(_eventespresso_helpers__WEBPACK_IMPORTED_MODULE_4__["removeEmptyFromState"])(subState, [relationName, relationId], 0, false); + } + }); + }); + }); + }); + state = state.set(mapProperty, oppositeState); + return state.deleteIn(path); +}; /** * export for tests */ @@ -5385,6 +5557,12 @@ function relations() { case types.REMOVE_RELATED_ENTITIES_FOR_ENTITY: return removeRelatedEntitiesForEntity(state, action); + + case resetTypes.RESET_ALL_STATE: + return Object(immutable__WEBPACK_IMPORTED_MODULE_5__["fromJS"])(_eventespresso_model__WEBPACK_IMPORTED_MODULE_3__["DEFAULT_CORE_STATE"].relations); + + case resetTypes.RESET_STATE_FOR_MODEL: + return resetStateForModel(state, action); } return state; @@ -5898,7 +6076,7 @@ var getModelNameForRequest = function getModelNameForRequest(modelName) { /*!******************************************************************!*\ !*** ./assets/src/data/eventespresso/core/selectors/entities.js ***! \******************************************************************/ -/*! exports provided: getEntityRecordsForModel, getEntitiesForModel, getEntityById, getEntitiesByIds, getEntityIdsQueuedForTrash, getEntityIdsQueuedForDelete, getModelsQueuedForDelete, getModelsQueuedForTrash */ +/*! exports provided: getEntityRecordsForModel, getEntitiesForModel, getEntityById, getEntitiesByIds, getEntityIdsQueuedForTrash, getEntityIdsQueuedForDelete, getModelsQueuedForDelete, getModelsQueuedForTrash, getAllEntitiesInState */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -5911,6 +6089,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getEntityIdsQueuedForDelete", function() { return getEntityIdsQueuedForDelete; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getModelsQueuedForDelete", function() { return getModelsQueuedForDelete; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getModelsQueuedForTrash", function() { return getModelsQueuedForTrash; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getAllEntitiesInState", function() { return getAllEntitiesInState; }); /* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/web.dom.iterable */ "./node_modules/core-js/modules/web.dom.iterable.js"); /* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var core_js_modules_es6_regexp_split__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es6.regexp.split */ "./node_modules/core-js/modules/es6.regexp.split.js"); @@ -6080,6 +6259,18 @@ var getModelsQueuedForDelete = Object(rememo__WEBPACK_IMPORTED_MODULE_2__["defau }, function (state) { return [state.dirty.delete]; }); +/** + * Returns the state.entities value. + * + * @param {Object} state + * + * @return {Map} The entities state immutable map. + */ + +var getAllEntitiesInState = function getAllEntitiesInState(state) { + return state.entities; +}; + /***/ }), @@ -6088,7 +6279,7 @@ var getModelsQueuedForDelete = Object(rememo__WEBPACK_IMPORTED_MODULE_2__["defau /*!***************************************************************!*\ !*** ./assets/src/data/eventespresso/core/selectors/index.js ***! \***************************************************************/ -/*! exports provided: getEntityRecordsForModel, getEntitiesForModel, getEntityById, getEntitiesByIds, getEntityIdsQueuedForTrash, getEntityIdsQueuedForDelete, getModelsQueuedForDelete, getModelsQueuedForTrash, getRelatedEntitiesForIds, getRelatedEntities, getRelationIdsForEntityRelation, getRelationAdditionsQueuedForModel, getRelationDeletionsQueuedForModel, countRelationModelsIndexedForEntity */ +/*! exports provided: getEntityRecordsForModel, getEntitiesForModel, getEntityById, getEntitiesByIds, getEntityIdsQueuedForTrash, getEntityIdsQueuedForDelete, getModelsQueuedForDelete, getModelsQueuedForTrash, getAllEntitiesInState, getRelatedEntitiesForIds, getRelatedEntities, getRelationIdsForEntityRelation, getRelationAdditionsQueuedForModel, getRelationDeletionsQueuedForModel, countRelationModelsIndexedForEntity, getAllRelationsInState */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -6110,6 +6301,8 @@ __webpack_require__.r(__webpack_exports__); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getModelsQueuedForTrash", function() { return _entities__WEBPACK_IMPORTED_MODULE_0__["getModelsQueuedForTrash"]; }); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getAllEntitiesInState", function() { return _entities__WEBPACK_IMPORTED_MODULE_0__["getAllEntitiesInState"]; }); + /* harmony import */ var _relations__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./relations */ "./assets/src/data/eventespresso/core/selectors/relations.js"); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getRelatedEntitiesForIds", function() { return _relations__WEBPACK_IMPORTED_MODULE_1__["getRelatedEntitiesForIds"]; }); @@ -6123,6 +6316,8 @@ __webpack_require__.r(__webpack_exports__); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "countRelationModelsIndexedForEntity", function() { return _relations__WEBPACK_IMPORTED_MODULE_1__["countRelationModelsIndexedForEntity"]; }); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getAllRelationsInState", function() { return _relations__WEBPACK_IMPORTED_MODULE_1__["getAllRelationsInState"]; }); + @@ -6132,7 +6327,7 @@ __webpack_require__.r(__webpack_exports__); /*!*******************************************************************!*\ !*** ./assets/src/data/eventespresso/core/selectors/relations.js ***! \*******************************************************************/ -/*! exports provided: getRelatedEntitiesForIds, getRelatedEntities, getRelationIdsForEntityRelation, getRelationAdditionsQueuedForModel, getRelationDeletionsQueuedForModel, countRelationModelsIndexedForEntity */ +/*! exports provided: getRelatedEntitiesForIds, getRelatedEntities, getRelationIdsForEntityRelation, getRelationAdditionsQueuedForModel, getRelationDeletionsQueuedForModel, countRelationModelsIndexedForEntity, getAllRelationsInState */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -6143,6 +6338,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getRelationAdditionsQueuedForModel", function() { return getRelationAdditionsQueuedForModel; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getRelationDeletionsQueuedForModel", function() { return getRelationDeletionsQueuedForModel; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "countRelationModelsIndexedForEntity", function() { return countRelationModelsIndexedForEntity; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getAllRelationsInState", function() { return getAllRelationsInState; }); /* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/web.dom.iterable */ "./node_modules/core-js/modules/web.dom.iterable.js"); /* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_corejs2_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs2/helpers/toConsumableArray */ "./node_modules/@babel/runtime-corejs2/helpers/toConsumableArray.js"); @@ -6383,6 +6579,18 @@ var countRelationModelsIndexedForEntity = Object(rememo__WEBPACK_IMPORTED_MODULE entityId = Object(_eventespresso_helpers__WEBPACK_IMPORTED_MODULE_6__["normalizeEntityId"])(entityId); return [state.relations.getIn(['entityMap', singleName, entityId]), state.relations.getIn(['index', pluralName, entityId])]; }); +/** + * Return the contents of the state.relations map. + * + * @param {Object} state + * + * @return {Map} The state.relations map. + */ + +var getAllRelationsInState = function getAllRelationsInState(state) { + return state.relations; +}; + /***/ }), @@ -28292,4 +28500,4 @@ module.exports = eejs.vendor.moment; /***/ }) },[[1,"manifest"]]]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9iYXNlLWNvbnRyb2xzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2Jhc2UtbW9kZWwuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vYmFzZS1zZWxlY3RvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9hY3Rpb25zL2FjdGlvbi1jcmVhdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL2FjdGlvbnMvYWN0aW9uLWdlbmVyYXRvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9hY3Rpb25zL2FjdGlvbi10eXBlcy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL2FjdGlvbnMvY3JlYXRlLWVudGl0aWVzLWdlbmVyYXRvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9hY3Rpb25zL2NyZWF0ZS1yZWxhdGlvbnMtZ2VuZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL2FjdGlvbnMvZGVsZXRlLWVudGl0eS1nZW5lcmF0b3JzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvYWN0aW9ucy9kZWxldGUtcmVsYXRpb25zLWdlbmVyYXRvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9hY3Rpb25zL2luZGV4LmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvYWN0aW9ucy9wZXJzaXN0LWVudGl0eS1nZW5lcmF0b3JzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvYWN0aW9ucy9wZXJzaXN0LXJlbGF0aW9ucy1nZW5lcmF0b3JzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvYWN0aW9ucy9yZWNlaXZlLWVudGl0aWVzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvYWN0aW9ucy9yZWNlaXZlLXJlbGF0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL2FjdGlvbnMvcmVtb3ZlLWVudGl0aWVzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvYWN0aW9ucy9yZW1vdmUtcmVsYXRpb25zLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvY29uc3RhbnRzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9tb2RlbC9jaGVja2luL2FjdGlvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9tb2RlbC9jaGVja2luL3Jlc29sdmVycy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL21vZGVsL2NoZWNraW4vc2VsZWN0b3JzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvbW9kZWwvZW50aXR5LWFjdGlvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9tb2RlbC9lbnRpdHktcmVzb2x2ZXJzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvbW9kZWwvZW50aXR5LXNlbGVjdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL21vZGVsL2luZGV4LmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvbW9kZWwvbW9kZWwtYWN0aW9ucy1pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL21vZGVsL21vZGVsLXJlc29sdmVycy1pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL21vZGVsL21vZGVsLXNlbGVjdG9ycy1pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL21vZGVsL21vZGVsLXNwZWNpZmljLWFjdGlvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9tb2RlbC9tb2RlbC1zcGVjaWZpYy1zZWxlY3RvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9tb2RlbC9yZWxhdGlvbi1hY3Rpb25zLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvbW9kZWwvcmVsYXRpb24tc2VsZWN0b3JzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvcmVkdWNlcnMvZGlydHktZW50aXRpZXMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9yZWR1Y2Vycy9kaXJ0eS1yZWxhdGlvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9yZWR1Y2Vycy9kaXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL3JlZHVjZXJzL2VudGl0aWVzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvcmVkdWNlcnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9yZWR1Y2Vycy9tb2RlbC1zcGVjaWZpYy1yZWR1Y2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL3JlZHVjZXJzL3JlbGF0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL3Jlc29sdmVycy9lbnRpdGllcy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL3Jlc29sdmVycy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL3Jlc29sdmVycy9yZWxhdGlvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9zZWxlY3RvcnMvZW50aXRpZXMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9zZWxlY3RvcnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9zZWxlY3RvcnMvcmVsYXRpb25zLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2xpc3RzL2FjdGlvbi10eXBlcy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9saXN0cy9hY3Rpb25zLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2xpc3RzL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9saXN0cy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9saXN0cy9tb2RlbC5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9saXN0cy9yZWR1Y2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9saXN0cy9yZXNvbHZlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vbGlzdHMvc2VsZWN0b3JzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL3NjaGVtYS9hY3Rpb24tdHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vc2NoZW1hL2FjdGlvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vc2NoZW1hL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9zY2hlbWEvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vc2NoZW1hL21vZGVsLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL3NjaGVtYS9yZWR1Y2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9zY2hlbWEvcmVzb2x2ZXJzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL3NjaGVtYS9zZWxlY3RvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2luZGV4LmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9tb2RlbC9hc3NlcnRpb25zLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9tb2RlbC9hdHRlbmRlZS9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL2F0dGVuZGVlL2luZGV4LmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9tb2RlbC9hdHRlbmRlZS9xdWVyeS5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvYmFzZS1kYXRlLWZvcm1hdHRlci5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvYmFzZS5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvY2hlY2tpbi9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL2NoZWNraW4vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL2NoZWNraW4vcXVlcnkuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL2RhdGV0aW1lL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvZGF0ZXRpbWUvZm9ybWF0dGVyLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9tb2RlbC9kYXRldGltZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvZGF0ZXRpbWUvcXVlcnkuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL2RlZmF1bHQtbW9kZWwtc3RhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL2VuZHBvaW50cy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvZW50aXR5LWZhY3RvcnkvYXNzZXJ0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvZW50aXR5LWZhY3RvcnkvYmFzZS1lbnRpdHkuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL2VudGl0eS1mYWN0b3J5L2Jvb2xlYW5zLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9tb2RlbC9lbnRpdHktZmFjdG9yeS9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL2VudGl0eS1mYWN0b3J5L2NyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvZW50aXR5LWZhY3RvcnkvZXh0cmFjdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvZW50aXR5LWZhY3RvcnkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL2VudGl0eS1mYWN0b3J5L3ZhbGlkYXRvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL2V2ZW50L2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvZXZlbnQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL2V2ZW50L3F1ZXJ5LmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9tb2RlbC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvbW9kZWwtbmFtZXMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL21vZGVscy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvcHJpbWFyeS1rZXlzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9tb2RlbC9yZWdpc3RyYXRpb24vY29uc3RhbnRzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9tb2RlbC9yZWdpc3RyYXRpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL3JlZ2lzdHJhdGlvbi9xdWVyeS5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvc3RhdHVzL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvc3RhdHVzL2hlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL3N0YXR1cy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvc3RhdHVzL3F1ZXJ5LmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9tb2RlbC90aWNrZXQvY29uc3RhbnRzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9tb2RlbC90aWNrZXQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL3RpY2tldC9xdWVyeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9jb3JlLWpzL2FycmF5L2Zyb20uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvY29yZS1qcy9hcnJheS9pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9jb3JlLWpzL2dldC1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9jb3JlLWpzL2lzLWl0ZXJhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMyL2NvcmUtanMvanNvbi9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvY29yZS1qcy9tYXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvY29yZS1qcy9vYmplY3QvY3JlYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMyL2NvcmUtanMvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9jb3JlLWpzL29iamVjdC9nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvY29yZS1qcy9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMyL2NvcmUtanMvb2JqZWN0L2dldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvY29yZS1qcy9vYmplY3Qva2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9jb3JlLWpzL29iamVjdC9zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMyL2NvcmUtanMvcGFyc2UtaW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMyL2NvcmUtanMvcHJvbWlzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9jb3JlLWpzL3NldC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9jb3JlLWpzL3N5bWJvbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9jb3JlLWpzL3N5bWJvbC9pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9oZWxwZXJzL2FycmF5V2l0aEhvbGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMyL2hlbHBlcnMvYXJyYXlXaXRob3V0SG9sZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvaGVscGVycy9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMyL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvaGVscGVycy9jcmVhdGVDbGFzcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMyL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvaGVscGVycy9pbmhlcml0cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9oZWxwZXJzL2l0ZXJhYmxlVG9BcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9oZWxwZXJzL2l0ZXJhYmxlVG9BcnJheUxpbWl0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMyL2hlbHBlcnMvbm9uSXRlcmFibGVSZXN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMyL2hlbHBlcnMvbm9uSXRlcmFibGVTcHJlYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvaGVscGVycy9vYmplY3RTcHJlYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMyL2hlbHBlcnMvc2V0UHJvdG90eXBlT2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvaGVscGVycy9zbGljZWRUb0FycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMyL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvaGVscGVycy90eXBlb2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS1tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9yZWdlbmVyYXRvci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHdvcmRwcmVzcy9pcy1zaGFsbG93LWVxdWFsL2FycmF5cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHdvcmRwcmVzcy9pcy1zaGFsbG93LWVxdWFsL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ad29yZHByZXNzL2lzLXNoYWxsb3ctZXF1YWwvb2JqZWN0cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL2FycmF5L2Zyb20uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9hcnJheS9pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL2dldC1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL2lzLWl0ZXJhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vanNvbi9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9tYXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvY3JlYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2dldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3Qva2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vcGFyc2UtaW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vcHJvbWlzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL3NldC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbC9pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2EtZnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hZGQtdG8tdW5zY29wYWJsZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hbi1pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FuLW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FycmF5LWZyb20taXRlcmFibGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FycmF5LW1ldGhvZHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYXJyYXktc3BlY2llcy1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jbGFzc29mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29sbGVjdGlvbi1zdHJvbmcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb2xsZWN0aW9uLXRvLWpzb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb2xsZWN0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29yZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NyZWF0ZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2N0eC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2RlZmluZWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZW51bS1rZXlzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZXhwb3J0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZmFpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19mb3Itb2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oYXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oaWRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faHRtbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2llOC1kb20tZGVmaW5lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faW52b2tlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2lzLWFycmF5LWl0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2lzLW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItY2FsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWRldGVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItc3RlcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2xpYnJhcnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19tZXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbWljcm90YXNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHBzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcGQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ29wbi1leHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ29wbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdwby5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1rZXlzLWludGVybmFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtcGllLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LXNhcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3BhcnNlLWludC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3BlcmZvcm0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19wcm9taXNlLXJlc29sdmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcmVkZWZpbmUtYWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcmVkZWZpbmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtY29sbGVjdGlvbi1mcm9tLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LWNvbGxlY3Rpb24tb2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtcHJvdG8uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtc3BlY2llcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NldC10by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2hhcmVkLWtleS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NoYXJlZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NwZWNpZXMtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zdHJpbmctYXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zdHJpbmctdHJpbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3N0cmluZy13cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3Rhc2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1hYnNvbHV0ZS1pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1pb2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tb2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdWlkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdXNlci1hZ2VudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3ZhbGlkYXRlLWNvbGxlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MtZGVmaW5lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fd2tzLWV4dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3drcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvY29yZS5pcy1pdGVyYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LmFycmF5LmZyb20uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5hcnJheS5pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYubWFwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmNyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3Qua2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYucGFyc2UtaW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYucHJvbWlzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnNldC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnN5bWJvbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3Lm1hcC5mcm9tLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcubWFwLm9mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcubWFwLnRvLWpzb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5wcm9taXNlLmZpbmFsbHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5wcm9taXNlLnRyeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3LnNldC5mcm9tLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcuc2V0Lm9mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcuc2V0LnRvLWpzb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5zeW1ib2wuYXN5bmMtaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5zeW1ib2wub2JzZXJ2YWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FkZC10by11bnNjb3BhYmxlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hbi1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NvcmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY3R4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RlZmluZWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZG9tLWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2V4cG9ydC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mYWlscy1pcy1yZWdleHAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZmFpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZml4LXJlLXdrcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faGFzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2hpZGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faHRtbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pb2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1yZWdleHAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1zdGVwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19saWJyYXJ5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWRwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdwby5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3JlZGVmaW5lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC10by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NoYXJlZC1rZXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1jb250ZXh0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWFic29sdXRlLWluZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8taW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1sZW5ndGguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tb2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL191aWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fd2tzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5yZXBsYWNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5zcGxpdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuYXJyYXkuaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pbW11dGFibGUvZGlzdC9pbW11dGFibGUuZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL21lbWl6ZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGx1cmFsaXplL3BsdXJhbGl6ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9jaGVja1Byb3BUeXBlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVtZW1vL2VzL3JlbWVtby5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvd2FybmluZy93YXJuaW5nLmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcImVlanNcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJlZWpzLmhlbHBlcnNcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJlZWpzLmkxOG5cIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJlZWpzLm1vZGVsXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiZWVqcy52YWxpZGF0b3JzXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiZWVqcy52YWx1ZU9iamVjdHNcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJ3cC5hcGlGZXRjaFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcIndwLmRhdGFcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJ3cC5ob29rc1wiIiwid2VicGFjazovLy9leHRlcm5hbCBcImVlanMudmVuZG9yLmN1aWRcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2hcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJlZWpzLnZlbmRvci5tb21lbnRcIiJdLCJuYW1lcyI6WyJmZXRjaCIsInJlcXVlc3QiLCJ0eXBlIiwic2VsZWN0IiwicmVkdWNlcktleSIsInNlbGVjdG9yTmFtZSIsImFyZ3MiLCJyZXNvbHZlU2VsZWN0IiwiZGlzcGF0Y2giLCJkaXNwYXRjaE5hbWUiLCJyZXNvbHZlRGlzcGF0Y2giLCJyZXNvbHZlR2V0RW50aXR5QnlJZEZvcklkcyIsIm1vZGVsTmFtZSIsImVudGl0eUlkcyIsInJlc29sdmVHZXRSZWxhdGVkRW50aXRpZXMiLCJlbnRpdHkiLCJyZWxhdGlvbkVudGl0aWVzIiwicmVsYXRpb25JZHMiLCJjb250cm9scyIsIkZFVENIX0ZST01fQVBJIiwiYXBpRmV0Y2giLCJTRUxFQ1QiLCJzZWxlY3REYXRhIiwiRElTUEFUQ0giLCJkaXNwYXRjaERhdGEiLCJSRVNPTFZFX0RJU1BBVENIIiwiUkVTT0xWRV9TRUxFQ1QiLCJyZXNvbHZlIiwiaGFzRmluaXNoZWQiLCJoYXNGaW5pc2hlZFJlc29sdXRpb24iLCJnZXRSZXN1bHQiLCJhcHBseSIsInJlc3VsdCIsInVuc3Vic2NyaWJlIiwic3Vic2NyaWJlIiwiUkVTT0xWRV9HRVRfRU5USVRZX0JZX0lEX0ZPUl9JRFMiLCJsZW5ndGgiLCJDT1JFX1JFRFVDRVJfS0VZIiwicG9wIiwiUkVTT0xWRV9HRVRfUkVMQVRFRF9FTlRJVElFUyIsInJlbGF0aW9uRW50aXR5IiwiZ2V0IiwicGx1cmFsTW9kZWxOYW1lIiwiZ2V0TWV0aG9kTmFtZSIsInN1ZmZpeCIsInByZWZpeCIsInVzZVBsdXJhbCIsInBsdXJhbGl6ZSIsInVwcGVyRmlyc3QiLCJjYW1lbENhc2UiLCJrZWVwRXhpc3RpbmdFbnRpdGllc0luT2JqZWN0IiwiZXhpc3RpbmdFbnRpdGllcyIsImluY29taW5nRW50aXRpZXMiLCJnZXRFeGlzdGluZ09yRGVmYXVsdEVudGl0eSIsImRlZmF1bHRFbnRpdHkiLCJlbnRpdHlJZCIsImlzTWFwIiwiaGFzIiwicmVkdWNlQ2FsbGJhY2siLCJtYXBwZWQiLCJub3JtYWxpemVFbnRpdHlJZCIsInNldCIsIm1hcFJlZHVjZXIiLCJyZWR1Y2UiLCJvcmlnaW5hbElkIiwiaXNOYU4iLCJpc1Jlc29sdmluZyIsImhhc0ZpbmlzaGVkUmVzb2x2aW5nIiwiZW50aXRpZXMiLCJSRUNFSVZFX0VOVElUWV9SRUNPUkRTIiwiUkVDRUlWRV9BTkRfUkVQTEFDRV9FTlRJVFlfUkVDT1JEUyIsIlJFQ0VJVkVfRU5USVRZIiwiUkVNT1ZFX0VOVElUWV9CWV9JRCIsIlJFTU9WRV9ERUxFVEVfRU5USVRZX0lEIiwiUkVNT1ZFX1RSQVNIX0VOVElUWV9JRCIsIlJFQ0VJVkVfVFJBU0hfRU5USVRZX0lEIiwiUkVDRUlWRV9ERUxFVEVfRU5USVRZX0lEIiwicmVsYXRpb25zIiwiUkVNT1ZFX0RJUlRZX1JFTEFUSU9OX0FERElUSU9OIiwiUkVNT1ZFX0RJUlRZX1JFTEFUSU9OX0RFTEVUSU9OIiwiUkVDRUlWRV9SRUxBVEVEX0VOVElUWV9JRFMiLCJSRU1PVkVfUkVMQVRFRF9FTlRJVFlfSURTIiwiUkVNT1ZFX1JFTEFURURfRU5USVRJRVNfRk9SX0VOVElUWSIsIlJFQ0VJVkVfRElSVFlfUkVMQVRJT05fQURESVRJT04iLCJSRUNFSVZFX0RJUlRZX1JFTEFUSU9OX0RFTEVUSU9OIiwiUkVDRUlWRV9VUERBVEVEX0VOVElUWV9JRF9GT1JfUkVMQVRJT05TIiwibW9kZWxTcGVjaWZpYyIsIlJFQ0VJVkVfU0VMRUNUT1JfVkFMVUUiLCJBQ1RJT05fVFlQRVMiLCJjcmVhdGVFbnRpdHkiLCJyZWNlaXZlRW50aXR5QW5kUmVzb2x2ZSIsInJlY2VpdmVFbnRpdGllc0FuZFJlc29sdmUiLCJTQ0hFTUFfUkVEVUNFUl9LRVkiLCJmYWN0b3J5IiwiaXNNb2RlbEVudGl0eUZhY3RvcnlPZk1vZGVsIiwiZW50aXR5SW5zdGFuY2UiLCJjcmVhdGVOZXciLCJhc3NlcnRJc01vZGVsRW50aXR5IiwidG9Mb3dlckNhc2UiLCJpZCIsIm1hcCIsImlzTW9kZWxFbnRpdHkiLCJJbnZhbGlkTW9kZWxFbnRpdHkiLCJjcmVhdGVSZWxhdGlvbiIsImNyZWF0ZVJlbGF0aW9ucyIsInJlc29sdmVSZWxhdGlvblJlY29yZEZvclJlbGF0aW9uIiwicmVsYXRpb25OYW1lIiwic2luZ3VsYXJSZWxhdGlvbk5hbWUiLCJzaW5ndWxhck1vZGVsTmFtZSIsImlzTW9kZWxFbnRpdHlPZk1vZGVsIiwid2FybmluZyIsIlJFRFVDRVJfS0VZIiwicGx1cmFsUmVsYXRpb25OYW1lIiwiYXNzZXJ0QXJyYXlIYXNFbnRpdGllc0Zvck1vZGVsIiwiZ2V0SWRzRnJvbUJhc2VFbnRpdHlBcnJheSIsIm1vZGVsRW50aXR5IiwicmVsYXRpb25zVG9SZXNvbHZlIiwibW9kZWxJZCIsImhhc0VudGl0eSIsInJlbGF0aW9uTW9kZWxOYW1lIiwiZGVsZXRlRW50aXR5QnlJZCIsInRyYXNoRW50aXR5QnlJZCIsInJlbW92ZUVudGl0eUJ5SWQiLCJyZW1vdmVBbGxSZWxhdGVkRW50aXRpZXNGb3JNb2RlbEVudGl0eSIsInJlY2VpdmVEZWxldGVFbnRpdHlJZCIsInJlY2VpdmVUcmFzaEVudGl0eUlkIiwicmVtb3ZlRGlydHlSZWxhdGlvbkZvckFkZGl0aW9uIiwicmVtb3ZlUmVsYXRpb25Gb3JFbnRpdHkiLCJyZWxhdGlvbkVudGl0eUlkIiwicmVtb3ZlRGlydHlSZWxhdGlvbkFkZGl0aW9uIiwicmVtb3ZlUmVsYXRlZEVudGl0aWVzIiwicmVjZWl2ZURpcnR5UmVsYXRpb25EZWxldGlvbiIsInBlcnNpc3RFbnRpdHlSZWNvcmQiLCJwZXJzaXN0Rm9yRW50aXR5SWQiLCJwZXJzaXN0Rm9yRW50aXR5SWRzIiwicGVyc2lzdERlbGV0ZXNGb3JNb2RlbCIsInBlcnNpc3RUcmFzaGVzRm9yTW9kZWwiLCJwZXJzaXN0QWxsRGVsZXRlcyIsIkRFRkFVTFRfRU1QVFlfT0JKRUNUIiwiREVGQVVMVF9FTVBUWV9BUlJBWSIsImlzQ2xlYW4iLCJwYXRoIiwiYXBwbHlRdWVyeVN0cmluZyIsImlzTmV3IiwibWV0aG9kIiwiZGF0YSIsImZvclBlcnNpc3QiLCJ1cGRhdGVkRW50aXR5IiwiaXNFbXB0eSIsInVwZGF0ZWRFbnRpdHlSZWNvcmQiLCJmcm9tRXhpc3RpbmciLCJuZXdJZCIsInJlY2VpdmVVcGRhdGVkRW50aXR5SWRGb3JSZWxhdGlvbnMiLCJyZWNlaXZlQW5kUmVwbGFjZUVudGl0eVJlY29yZHMiLCJwZXJzaXN0ZWRFbnRpdHkiLCJyZXRyaWV2ZWRFbnRpdGllcyIsImlzQXJyYXkiLCJrZXlFbnRpdGllc0J5UHJpbWFyeUtleVZhbHVlIiwicmV0cmlldmVkSWRzIiwia2V5cyIsInBlcnNpc3RlZEVudGl0aWVzIiwiZGVsZXRlZElkcyIsImZvcmNlIiwicmVzcG9uc2UiLCJkZWxldGVkIiwicHVzaCIsInJlbW92ZURlbGV0ZUVudGl0eUlkIiwidHJhc2hlZElkcyIsInN1Y2Nlc3MiLCJyZW1vdmVUcmFzaEVudGl0eUlkIiwibW9kZWxzRm9yRGVsZXRlIiwibW9kZWxGb3JEZWxldGUiLCJpZHNEZWxldGVkIiwibW9kZWxzRm9yVHJhc2giLCJtb2RlbEZvclRyYXNoIiwiaWRzVHJhc2hlZCIsInRyYXNoZWQiLCJwZXJzaXN0QWRkUmVsYXRpb25zRm9yTW9kZWwiLCJwZXJzaXN0RGVsZXRlUmVsYXRpb25zRm9yTW9kZWwiLCJwZXJzaXN0UmVsYXRpb25zRm9yTW9kZWwiLCJwZXJzaXN0UmVsYXRpb25zRm9yRW50aXR5SWQiLCJwZXJzaXN0UmVsYXRpb25zRm9yRW50aXR5SWRBbmRSZWxhdGlvbiIsInBlcnNpc3RSZWxhdGlvbnNGb3JFbnRpdHlJZEFuZFJlbGF0aW9uSWQiLCJwZXJzaXN0TmV3RW50aXR5QW5kUmVtb3ZlRGlydHlSZWxhdGlvbnMiLCJnZXRSZWxhdGlvblN0YXRlIiwiYWRkUmVsYXRpb24iLCJyZWxhdGlvblN0YXRlIiwicmVsYXRpb25zUGVyc2lzdGVkIiwicGVyc2lzdGVkUmVsYXRpb25zIiwicmVsYXRpb25OYW1lcyIsInBlcnNpc3RlZFJlbGF0aW9uSWRzIiwicmVsYXRpb25FbnRpdHlJZHMiLCJwZXJzaXN0ZWRSZWxhdGlvbklkIiwicmVsYXRpb25JZCIsImVudGl0eUlkQ2hhbmdlZCIsImN1aWQiLCJpc0N1aWQiLCJlbmRwb2ludCIsInJlbW92ZURpcnR5UmVsYXRpb25Gb3JUeXBlIiwicGVyc2lzdGluZ0FyZ3VtZW50cyIsImRvUmVsYXRpb25SZW1vdmFsIiwic2VsZWN0b3IiLCJ0eXBlcyIsInJlY2VpdmVFbnRpdHlSZWNvcmRzIiwicmVjZWl2ZUVudGl0eSIsInJlY2VpdmVSZWxhdGVkRW50aXRpZXMiLCJyZWxhdGVkRW50aXR5SWRzIiwicmVjZWl2ZURpcnR5UmVsYXRpb25BZGRpdGlvbiIsInF1ZXVlVHlwZSIsIlRZUEVfUVVFVUVfUkVMQVRJT05fQUREIiwiVFlQRV9RVUVVRV9SRUxBVElPTl9ERUxFVEUiLCJvbGRFbnRpdHlJZCIsIm5ld0VudGl0eUlkIiwicmVtb3ZlRGlydHlSZWxhdGlvbkRlbGV0aW9uIiwicmVnaXN0ZXJTdG9yZSIsInJlZHVjZXIiLCJhY3Rpb25zIiwibW9kZWxBY3Rpb25zIiwic2VsZWN0b3JzIiwibW9kZWxTZWxlY3RvcnMiLCJyZXNvbHZlcnMiLCJtb2RlbFJlc29sdmVycyIsInJlY2VpdmVMYXRlc3RDaGVja2luIiwidG9nZ2xlQ2hlY2tpbiIsImNoZWNraW5FbnRpdHkiLCJyZWdpc3RyYXRpb25JZCIsImRhdGVUaW1lSWQiLCJnZXRFbmRwb2ludCIsImNoZWNrSW5SZXNwb25zZSIsIl9fIiwibmV3Q2hlY2tpbiIsImdldExhdGVzdENoZWNraW4iLCJpc1VuZGVmaW5lZCIsInN0YXRlIiwiY2hlY2tpbklkIiwiZ2V0U2VsZWN0b3JWYWx1ZSIsImdldEVudGl0eUJ5SWQiLCJjcmVhdGVBY3Rpb25zIiwiYWN0aW9uIiwiTU9ERUxfTkFNRVMiLCJjcmVhdGVSZXNvbHZlcnMiLCJyZXNvbHZlciIsImNyZWF0ZVNlbGVjdG9ycyIsImdldEVudGl0eVJlY29yZHNGb3JNb2RlbCIsImdldEVudGl0aWVzRm9yTW9kZWwiLCJnZXRFbnRpdGllc0J5SWRzIiwiZ2V0RW50aXR5SWRzUXVldWVkRm9yVHJhc2giLCJnZXRFbnRpdHlJZHNRdWV1ZWRGb3JEZWxldGUiLCJlbnRpdHlTZWxlY3RvcnMiLCJiYXNlU2VsZWN0b3JzIiwicmVsYXRpb25TZWxlY3RvcnMiLCJlbnRpdHlBY3Rpb25zIiwiYmFzZUFjdGlvbnMiLCJyZWxhdGlvbkFjdGlvbnMiLCJlbnRpdHlSZXNvbHZlcnMiLCJiYXNlUmVzb2x2ZXJzIiwicmVjZWl2ZVNlbGVjdG9yVmFsdWUiLCJ2YWx1ZSIsImNyZWF0ZVNlbGVjdG9yIiwiZ2V0SW4iLCJvbGRJZCIsImdldFJlbGF0aW9uQWRkaXRpb25zUXVldWVkRm9yTW9kZWwiLCJnZXRSZWxhdGlvbkRlbGV0aW9uc1F1ZXVlZEZvck1vZGVsIiwiY291bnRSZWxhdGlvbk1vZGVsc0luZGV4ZWRGb3JFbnRpdHkiLCJhZGRUb1N0YXRlIiwiYWRkIiwicmVtb3ZlRnJvbVN0YXRlIiwiU2V0IiwiaW5jbHVkZXMiLCJkZWxldGUiLCJwcm9jZXNzQWN0aW9uIiwiZGVsZXRlRW50aXR5IiwiZnJvbUpTIiwiREVGQVVMVF9DT1JFX1NUQVRFIiwiZGlydHkiLCJ0cmFzaEVudGl0eSIsInRyYXNoIiwicmVsYXRpb25FeGlzdHNJbk1hcCIsInJlbGF0aW9uTWFwIiwiaGFzUmVsYXRpb24iLCJnZXRSZWxhdGlvbk1hcCIsIk1hcCIsImlkRXhpc3RzSW5TZXQiLCJpZFNldCIsImluZGV4UmVsYXRpb25zIiwic2V0SW4iLCJyZW1vdmVFbXB0eUZyb21TdGF0ZSIsImdldFJlbGF0aW9uSWRzRnJvbVN0YXRlIiwiaGFzSW4iLCJyZXF1aXJlc1VwZGF0ZSIsInVwZGF0ZVJlbGF0aW9uU3RhdGUiLCJpZHMiLCJyZXBsYWNlT2xkUmVsYXRpb25JZFdpdGhOZXdSZWxhdGlvbklkIiwibmV3U3RhdGUiLCJyZXBsYWNlSWRzIiwic3RhdGVQcm9wZXJ0eSIsInBsdXJhbE5hbWUiLCJzaW5ndWxhck5hbWUiLCJ0b3BMZXZlbE5hbWUiLCJtYWluUGF0aCIsIm1haW5SZWNvcmQiLCJkZWxldGVJbiIsImZvckVhY2giLCJtYXBPcklkcyIsInVwZGF0ZUlkcyIsInJlbGF0aW9uUGF0aCIsImluZGV4UmVjb3JkIiwibm9ybWFsaXplQWN0aW9uRm9yU3RhdGUiLCJpbmRleCIsImRpcnR5UmVsYXRpb25zIiwiY2xlYXJSZWxhdGVkRW50aXRpZXNGb3JFbnRpdHkiLCJtb2RlbERhdGEiLCJtb2RlbFJlbW92ZWQiLCJlbnRpdHlJZFJlbW92ZWQiLCJpbmRleFR5cGUiLCJyZWxhdGlvblR5cGVzIiwicmVjb3JkUGF0aCIsImNsZWFyRW50aXR5SWRzSW5QYXRoIiwic3ViU3RhdGUiLCJ3aXRoTXV0YXRpb25zIiwicmVsYXRpb25SZWNvcmQiLCJyZWxhdGlvblR5cGUiLCJyZW1vdmVSZWxhdGVkRW50aXRpZXNGb3JFbnRpdHkiLCJzaW5nbGVOYW1lIiwiY29tYmluZVJlZHVjZXJzIiwicmVwbGFjZUV4aXN0aW5nRW50aXRpZXNGcm9tU3RhdGUiLCJlbnRpdHlSZWNvcmRzIiwibWVyZ2UiLCJ1cGRhdGVTdGF0ZSIsImRpZmZlcmVuY2UiLCJoYW5kbGVSZWNlaXZlU2VsZWN0b3IiLCJub3JtYWxpemVkUmVjZWl2ZUFuZFJlbW92ZVJlbGF0aW9ucyIsInJlY2VpdmVBbmRSZW1vdmVSZWxhdGlvbnMiLCJuZXdBY3Rpb24iLCJzZXRSZWxhdGlvbkluZGV4IiwicmVsYXRpb25EYXRhIiwicmVtb3ZhbCIsImV4aXN0aW5nSWRzIiwiY29uY2F0IiwiaWRzQWZ0ZXJSZW1vdmFsIiwiZmlsdGVyIiwia2V5T2YiLCJjb3VudCIsInVwZGF0ZUVudGl0eUlkRm9yUmVsYXRpb25zIiwibW9kZWxBc1JlbGF0aW9uTmFtZSIsIm9sZEluZGV4UGF0aCIsImluZGV4UmVjb3JkVG9SZXBsYWNlIiwicmVwbGFjZVJlbGF0aW9uUmVjb3JkcyIsIm1haW5SZWNvcmRUb1JlcGxhY2UiLCJvbGRFbnRpdHlNYXBQYXRoIiwibWFwRW50aXR5UmVjb3JkVG9SZXBsYWNlIiwic3RhdGVQcm9wZXJ0eU5hbWUiLCJyZW1vdmVPbmx5IiwibG9vcFByb3BlcnR5Iiwib2xkRW50aXR5UGF0aCIsInRvQXJyYXkiLCJlbnRpdHlNYXBSZWNvcmRUb1JlcGxhY2UiLCJmdWxsRW50aXR5IiwiZ2V0UmVsYXRlZEVudGl0aWVzIiwiZ2V0UmVsYXRlZEVudGl0aWVzRm9ySWRzIiwicmVsYXRpb25SZXNvdXJjZVByb3BlcnR5IiwicmVsYXRpb25FbmRwb2ludCIsInN0cmlwQmFzZVJvdXRlRnJvbVVybCIsInJlc291cmNlTGluayIsImZ1bGxFbnRpdGllcyIsImNyZWF0ZUFuZEtleUVudGl0aWVzQnlQcmltYXJ5S2V5VmFsdWUiLCJlbnRpdGllc09iamVjdCIsImVudGl0eU9iaiIsImVudGl0eUFycmF5IiwidmFsdWVzIiwiaGFzSm9pblRhYmxlIiwicmVsYXRpb25TY2hlbWEiLCJyZWxhdGlvblByaW1hcnlLZXkiLCJnZXRQcmltYXJ5S2V5IiwibW9kZWxQcmltYXJ5S2V5IiwiaGFzU2V0TWFwIiwiSW1tdXRhYmxlTWFwIiwiam9pbmluZ19tb2RlbF9uYW1lIiwiZ2V0UHJpbWFyeUtleVF1ZXJ5U3RyaW5nIiwiZ2V0TW9kZWxOYW1lRm9yUmVxdWVzdCIsInJlY29yZHMiLCJyZWNvcmQiLCJyZWxhdGlvblJlY29yZHMiLCJyZXBsYWNlIiwic3RhcnRDYXNlIiwidG9KUyIsInZhbHVlU2VxIiwicmV0cmlldmVFbnRpdGllc0J5SWRzIiwiam9pbiIsImNsZWFyIiwiZ2V0RGVwZW5kYW50cyIsInNwbGl0IiwiZ2V0TW9kZWxzUXVldWVkRm9yVHJhc2giLCJrZXlTZXEiLCJnZXRNb2RlbHNRdWV1ZWRGb3JEZWxldGUiLCJERUZBVUxUX0VNUFRZX1NFVCIsImdldFJlbGF0aW9uSWRzRm9yRW50aXR5UmVsYXRpb24iLCJzaW5ndWxhck1vZGVsIiwicGx1cmFsTW9kZWwiLCJyZWxhdGVkRW50aXRpZXMiLCJsb29rdXBSZWxhdGlvbnNRdWV1ZWRGb3JNb2RlbCIsImZvckluZGV4TG9va3VwIiwiZm9yQWRkTG9va3VwIiwibW9kZWwiLCJjb3VudFJlbGF0aW9ucyIsIlJFQ0VJVkVfTElTVCIsIlJFQ0VJVkVfRU5USVRZX0xJU1QiLCJyZWNlaXZlUmVzcG9uc2UiLCJpZGVudGlmaWVyIiwicXVlcnlTdHJpbmciLCJpdGVtcyIsInJlY2VpdmVFbnRpdHlSZXNwb25zZSIsImNyZWF0ZUVudGl0eVNlbGVjdG9ycyIsImNyZWF0ZUVudGl0eVJlc29sdmVycyIsInNvdXJjZSIsIm1ldGhvZE5hbWVGb3JHZXQiLCJnZXRFbnRpdGllcyIsInJlY2VpdmVMaXN0SXRlbXMiLCJERUZBVUxUX0xJU1RTX1NUQVRFIiwiZG9VcGRhdGUiLCJleGlzdGluZ1ZhbHVlcyIsIk9yZGVyZWRNYXAiLCJnZXRJdGVtcyIsImJ1aWxkQW5kRGlzcGF0Y2hFbnRpdGllc0Zyb21SZXNwb25zZSIsImZpbmQiLCJleGlzdGluZ0VudGl0eSIsInJldHJpZXZlSXRlbXMiLCJkZWZhdWx0RW1wdHkiLCJlIiwiaXNSZXF1ZXN0aW5nIiwiYXNzZXJ0SW1tdXRhYmxlT2JqZWN0SGFzUGF0aCIsInNwcmludGYiLCJpc1JlcXVlc3RpbmdJdGVtcyIsImlzUmVxdWVzdGluZ0VudGl0aWVzIiwiUkVDRUlWRV9TQ0hFTUFfUkVDT1JEIiwiUkVDRUlWRV9GQUNUT1JZX0ZPUl9NT0RFTCIsIlJFQ0VJVkVfUkVMQVRJT05fRU5EUE9JTlRfRk9SX01PREVMX0VOVElUWSIsIlJFQ0VJVkVfUkVMQVRJT05fU0NIRU1BIiwicmVjZWl2ZVNjaGVtYUZvck1vZGVsIiwic2NoZW1hIiwicmVjZWl2ZUZhY3RvcnlGb3JNb2RlbCIsInJlY2VpdmVSZWxhdGlvbkVuZHBvaW50Rm9yTW9kZWxFbnRpdHkiLCJyZWNlaXZlUmVsYXRpb25TY2hlbWEiLCJKT0lOX1JFTEFUSU9OX1RZUEVTIiwiU0NIRU1BX0tFWSIsInNjaGVtYU1ldGhvZE5hbWUiLCJmYWN0b3J5TWV0aG9kTmFtZSIsImdldFNjaGVtYUZvck1vZGVsIiwiZ2V0RmFjdG9yeUZvck1vZGVsIiwicmVjZWl2ZVNjaGVtYSIsIkRFRkFVTFRfU0NIRU1BX1NUQVRFIiwiaXNTY2hlbWFSZXNwb25zZU9mTW9kZWwiLCJyZWNlaXZlRmFjdG9yeSIsInJlY2VpdmVSZWxhdGlvbkVuZHBvaW50Rm9yRW50aXR5IiwicmVsYXRpb25FbmRwb2ludHMiLCJpc1NoYWxsb3dFcXVhbCIsImdldFJlbGF0aW9uRW5kcG9pbnRGb3JFbnRpdHlJZCIsImhhc0pvaW5UYWJsZVJlbGF0aW9uIiwiZ2V0UmVsYXRpb25UeXBlIiwiZ2V0UmVsYXRpb25TY2hlbWEiLCJjcmVhdGVFbnRpdHlGYWN0b3J5IiwiTU9ERUxfUFJFRklYRVMiLCJfbGlua3MiLCJsaW5rcyIsImJhc2VSZWxhdGlvblBhdGgiLCJpbmRleE9mIiwicmVsYXRpb25fdHlwZSIsIkVycm9yIiwidHlwZVNjaGVtYSIsInByb3BlcnRpZXMiLCJpc1JlcXVlc3RpbmdTY2hlbWFGb3JNb2RlbCIsImhhc1Jlc29sdmVkU2NoZW1hRm9yTW9kZWwiLCJpc1JlcXVlc3RpbmdGYWN0b3J5Rm9yTW9kZWwiLCJoYXNSZXNvbHZlZEZhY3RvcnlGb3JNb2RlbCIsImlzUmVxdWVzdGluZ1JlbGF0aW9uRW5kcG9pbnRGb3JFbnRpdHlJZCIsImFzc2VydEVudGl0eUhhc0tleSIsImtleSIsIm1lc3NhZ2UiLCJoYXNPd25Qcm9wZXJ0eSIsIkV4Y2VwdGlvbiIsImltbXV0YWJsZSIsImFzc2VydElzQXJyYXkiLCJhc3NlcnRJc05vdEVtcHR5IiwiYXNzZXJ0SXNNYXAiLCJpdGVtIiwiTU9ERUxfTkFNRSIsIm9yZGVyQnlNYXAiLCJsYXN0TmFtZU9ubHkiLCJmaXJzdE5hbWVPbmx5IiwiZmlyc3RUaGVuTGFzdE5hbWUiLCJsYXN0VGhlbkZpcnN0TmFtZSIsInF1ZXJ5RGF0YVR5cGVzIiwiZm9yRXZlbnRJZCIsIlByb3BUeXBlcyIsIm51bWJlciIsImZvckRhdGV0aW1lSWQiLCJmb3JUaWNrZXRJZCIsImZvclN0YXR1c0lkIiwib25lT2YiLCJSRUdJU1RSQVRJT05fU1RBVFVTX0lEUyIsImZvclJlZ2lzdHJhdGlvbklkIiwic2hvd0dyYXZhdGFyIiwiYm9vbCIsInF1ZXJ5RGF0YSIsInNoYXBlIiwibGltaXQiLCJvcmRlckJ5Iiwib3JkZXIiLCJBTExPV0VEX09SREVSX1ZBTFVFUyIsImRlZmF1bHRRdWVyeURhdGEiLCJRVUVSWV9PUkRFUl9BU0MiLCJtYXBPcmRlckJ5Iiwid2hlcmVDb25kaXRpb25zIiwid2hlcmUiLCJnZXRRdWVyeVN0cmluZyIsImJhc2VHZXRRdWVyeVN0cmluZyIsImZvcm1hdERhdGVzT25FbnRpdGllcyIsImVudGl0eURhdGVGaWVsZHMiLCJmb3JtYXQiLCJkYXRlRm9ybWF0cyIsImxvY2FsIiwiZm9ybWF0dGVkRW50aXRpZXMiLCJmb3JtYXREYXRlc09uRW50aXR5IiwibmV3RW50aXR5IiwiZGF0ZUZpZWxkIiwiZm9ybWF0RW50aXRpZXNEYXRlc1RvTXlzcWwiLCJmb3JtYXRFbnRpdHlEYXRlc1RvTXlzcWwiLCJmb3JtYXRFbnRpdGllc0RhdGVzVG9TaXRlIiwiZm9ybWF0RW50aXR5RGF0ZXNUb1NpdGUiLCJjb252ZXJ0RW50aXRpZXNEYXRlc1RvTW9tZW50IiwiY29udmVydEVudGl0eURhdGVzVG9Nb21lbnQiLCJRVUVSWV9PUkRFUl9ERVNDIiwiR1JFQVRFUl9USEFOIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiTEVTU19USEFOIiwiR1JFQVRFUl9USEFOX0FORF9FUVVBTCIsIkxFU1NfVEhBTl9BTkRfRVFVQUwiLCJkZWZhdWx0V2hlcmVDb25kaXRpb25zIiwicXVlcnlQYXJhbXMiLCJmaWVsZCIsIkNIRUNLSU5fU1RBVFVTX0lEIiwiU1RBVFVTX0NIRUNLRURfT1VUIiwiU1RBVFVTX0NIRUNLRURfSU4iLCJTVEFUVVNfQ0hFQ0tFRF9ORVZFUiIsIkNIRUNLSU5fU1RBVFVTX0lEUyIsImNoZWNraW5TdGF0dXMiLCJvcHRpb25zRW50aXR5TWFwIiwiZGVmYXVsdCIsImxhYmVsIiwicHJldHR5U3RhdHVzIiwidGltZXN0YW1wIiwiREFURVRJTUVfU1RBVFVTX0lEIiwiU09MRF9PVVQiLCJBQ1RJVkUiLCJVUENPTUlORyIsIlBPU1RQT05FRCIsIkNBTkNFTExFRCIsIkVYUElSRUQiLCJJTkFDVElWRSIsIkRBVEVUSU1FX1NUQVRVU19JRFMiLCJEQVRFX0ZJRUxEUyIsImZvcm1hdHRlcnMiLCJmb3JPd24iLCJiYXNlRm9ybWF0dGVyIiwiaW1wbGVtZW50YXRpb24iLCJmdW5jdGlvbk5hbWUiLCJpbmNvbWluZ0FyZ3MiLCJmaXJzdEFyZyIsInB1bGxBdCIsInByZXR0eURhdGVGcm9tRGF0ZVRpbWUiLCJEYXRlVGltZUVudGl0eSIsImNvbnRlbnQiLCJEVFRfRVZUX3N0YXJ0IiwiaGFzU2FtZSIsIkRUVF9FVlRfZW5kIiwiYWxsRGF0ZVRpbWVzQXNTdHJpbmciLCJTRVBBUkFUT1JfU1BBQ0VfREFTSF9TUEFDRSIsInRvRm9ybWF0IiwiREFURV9USU1FX0ZPUk1BVF9TSVRFIiwiVElNRV9GT1JNQVRfU0lURSIsIkRUVF9uYW1lIiwibm93RGF0ZUFuZFRpbWUiLCJtb21lbnQiLCJzaG93RXhwaXJlZCIsIm1vbnRoIiwic3RhcnRfZGF0ZSIsImVuZF9kYXRlIiwic3RhcnRPZiIsImVuZE9mIiwibWFwVG9PYmplY3RWYWx1ZXMiLCJtb2RlbE5hbWVFbmRwb2ludHMiLCJtYXBWYWx1ZXMiLCJnZXREZWZhdWx0TW9kZWxFbnRpdGllc09iamVjdCIsIm1lbW9pemUiLCJlbmRwb2ludHMiLCJlbnRpdHlNYXAiLCJwYXRocyIsImNvbGxlY3Rpb25fZW5kcG9pbnRzIiwiYmFzZVJlc3RSb3V0ZSIsImJhc2VfcmVzdF9yb3V0ZSIsInVybCIsIm1heWJlQXNzZXJ0VmFsdWVPYmplY3QiLCJmaWVsZE5hbWUiLCJmaWVsZFZhbHVlIiwiaXNEYXRlVGltZUZpZWxkIiwiRGF0ZVRpbWUiLCJhc3NlcnRJc0RhdGVUaW1lIiwiaXNNb25leUZpZWxkIiwiTW9uZXkiLCJhc3NlcnRNb25leSIsImFzc2VydFZhbGlkU2NoZW1hIiwiaXNTY2hlbWEiLCJJbnZhbGlkU2NoZW1hIiwiYXNzZXJ0VmFsaWRTY2hlbWFGaWVsZFByb3BlcnRpZXMiLCJUeXBlRXJyb3IiLCJyYXciLCJhc3NlcnRWYWxpZFZhbHVlRm9yUHJlcGFyZWRGaWVsZCIsImluc3RhbmNlIiwiaXNWYWxpZCIsImlzU2hhbGxvd1ZhbGlkVmFsdWVGb3JGaWVsZCIsImVudW0iLCJ2YWxpZGF0ZUVudW1UeXBlIiwidmFsaWRhdGVUeXBlIiwibWF5YmVDb252ZXJ0RnJvbVZhbHVlT2JqZWN0V2l0aEFzc2VydGlvbnMiLCJhc3NlcnRWYWxpZEZpZWxkQW5kVmFsdWVBZ2FpbnN0U2NoZW1hIiwidmFsaWRhdGlvblR5cGUiLCJ2YWxpZGF0ZVR5cGVGb3JGaWVsZCIsIlBSSVZBVEVfUFJPUEVSVElFUyIsIlNBVkVfU1RBVEUiLCJWQUxJREFURV9UWVBFUyIsIkJhc2VFbnRpdHkiLCJlbnRpdHlGaWVsZHNBbmRWYWx1ZXMiLCJmaWVsZFByZWZpeGVzIiwiQ0xFQU4iLCJjcmVhdGVHZXR0ZXIiLCJzZXRTYXZlU3RhdGUiLCJORVciLCJjcmVhdGVFbnRpdHlHZXR0ZXJzQW5kU2V0dGVycyIsImNyZWF0ZVBlcnNpc3RpbmdHZXR0ZXJzQW5kU2V0dGVycyIsInNhdmVTdGF0ZSIsIkRJUlRZIiwicHJvdGVjdGVkRmllbGRzIiwiZm9yQ2xvbmUiLCIkc2NoZW1hIiwibmFtZUNsYXNzIiwibmFtZSIsImV4dGVuZGVkQ2xhc3MiLCJFbnRpdHkiLCJjbGFzc0RlZiIsImZpZWxkc0FuZFZhbHVlcyIsImhhc1Jhd1Byb3BlcnR5IiwiaXNQbGFpbk9iamVjdCIsImhhc1ByZXR0eVByb3BlcnR5IiwicHJldHR5IiwiaGFzUmVuZGVyZWRQcm9wZXJ0eSIsInJlbmRlcmVkIiwiaGFzRm9ybWF0UHJvcGVydHkiLCJoYXNFbnVtUHJvcGVydHkiLCJpc1ZhbHVlT2JqZWN0RmllbGQiLCJpc1VUQ0RhdGVUaW1lRmllbGQiLCJkYXRlVGltZUZpZWxkTmFtZSIsImlzUHJpbWFyeUtleUZpZWxkIiwicHJpbWFyeV9rZXkiLCJpc1JlYWRPbmx5IiwicmVhZG9ubHkiLCJpc0VudGl0eUZpZWxkIiwiaXNFbnVtRmllbGQiLCJWQUxJREFURV9UWVBFIiwiUkFXIiwiUkVOREVSRUQiLCJQUkVUVFkiLCJwcmVmaXhNYXAiLCJhcHBseUZpbHRlcnMiLCJhbnN3ZXIiLCJhdHRlbmRlZSIsImNoYW5nZV9sb2ciLCJjaGVja2luIiwiY291bnRyeSIsImN1cnJlbmN5IiwiY3VycmVuY3lfcGF5bWVudF9tZXRob2QiLCJkYXRldGltZSIsImRhdGV0aW1lX3RpY2tldCIsImV2ZW50IiwiZXZlbnRfbWVzc2FnZV90ZW1wbGF0ZSIsImV2ZW50X3F1ZXN0aW9uX2dyb3VwIiwiZXZlbnRfdmVudWUiLCJleHRyYV9qb2luIiwiZXh0cmFfbWV0YSIsImxpbmVfaXRlbSIsIm1lc3NhZ2VfdGVtcGxhdGUiLCJtZXNzYWdlX3RlbXBsYXRlX2dyb3VwIiwicGF5bWVudCIsInBheW1lbnRfbWV0aG9kIiwicG9zdF9tZXRhIiwicHJpY2UiLCJwcmljZV90eXBlIiwicXVlc3Rpb24iLCJxdWVzdGlvbl9ncm91cCIsInF1ZXN0aW9uX2dyb3VwX3F1ZXN0aW9uIiwicXVlc3Rpb25fb3B0aW9uIiwicmVnaXN0cmF0aW9uIiwicmVnaXN0cmF0aW9uX3BheW1lbnQiLCJzdGF0dXMiLCJ0ZXJtIiwidGVybV9yZWxhdGlvbnNoaXAiLCJ0ZXJtX3RheG9ub215IiwidGlja2V0IiwidGlja2V0X3ByaWNlIiwidGlja2V0X3RlbXBsYXRlIiwidHJhbnNhY3Rpb24iLCJ2ZW51ZSIsIndwX3VzZXIiLCJvcHRzIiwiY3JlYXRlQ2FsbGJhY2tHZXR0ZXIiLCJwcm9wZXJ0eU5hbWUiLCJjYWxsQmFjayIsImNyZWF0ZUdldHRlckFuZFNldHRlciIsImluaXRpYWxGaWVsZFZhbHVlIiwicHJvcGVydHlWYWx1ZSIsInJlY2VpdmVkVmFsdWUiLCJzZXRGaWVsZFRvUGVyc2lzdCIsImNyZWF0ZUFsaWFzR2V0dGVyQW5kU2V0dGVyIiwib3JpZ2luYWxGaWVsZE5hbWUiLCJhbGlhc0ZpZWxkTmFtZSIsImNyZWF0ZUFsaWFzR2V0dGVyIiwiY3JlYXRlRmx1ZW50U2V0dGVyIiwicHJpbWFyeUtleXMiLCJvcmlnaW5hbEZpZWxkc0FuZFZhbHVlcyIsImlzUHJpbWFyeUtleSIsInNldFZhbGlkYXRlVHlwZUZvckZpZWxkIiwic2V0SW5pdGlhbEVudGl0eUZpZWxkc0FuZFZhbHVlcyIsInNldENhbGN1bGF0ZWRGaWVsZEFuZFZhbHVlcyIsInBvcHVsYXRlUHJvdGVjdGVkRmllbGRzUHJvcGVydHkiLCJzZXRSZXNvdXJjZXMiLCJjcmVhdGVQcmltYXJ5S2V5RmllbGRHZXR0ZXJzIiwicG9wdWxhdGVQcmltYXJ5S2V5cyIsInBvcHVsYXRlTWlzc2luZ0ZpZWxkcyIsImNhbGN1bGF0ZWRGaWVsZHMiLCJfY2FsY3VsYXRlZF9maWVsZHMiLCJfcHJvdGVjdGVkIiwiZ2V0UHJpbWFyeUtleUZpZWxkc0Zyb21TY2hlbWEiLCJzY2hlbWFQcm9wZXJ0aWVzIiwic2NoZW1hRmllbGQiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwiY3JlYXRlQWxpYXNHZXR0ZXJGb3JGaWVsZCIsImRlcml2ZVZhbGlkYXRlVHlwZUZvckZpZWxkIiwiZ2V0RW50aXR5RmllbGRzRnJvbVNjaGVtYSIsInVuZGVmaW5lZCIsImdldEJhc2VGaWVsZHNBbmRWYWx1ZXNGb3JDbG9uaW5nIiwiZm9yVXBkYXRlIiwiZ2V0QmFzZUZpZWxkc0FuZFZhbHVlc0ZvclBlcnNpc3RpbmciLCJmb3JJbnNlcnQiLCJlbnRpdHlWYWx1ZXMiLCJwcmltYXJ5S2V5IiwiZ2V0RGVmYXVsdFZhbHVlRm9yRmllbGQiLCJjcmVhdGVSYXdFbnRpdHlHZXR0ZXJzU2V0dGVycyIsImRlcml2ZVByZXBhcmVkVmFsdWVGb3JGaWVsZCIsImNyZWF0ZVJlbmRlcmVkR2V0dGVycyIsImRlcml2ZVJlbmRlcmVkVmFsdWUiLCJjcmVhdGVBbGlhc0dldHRlckFuZFNldHRlckZvckZpZWxkIiwiY3JlYXRlQWxpYXNlc0Zvck1ldGhvZCIsIm5ld0ZpZWxkTmFtZSIsImZpZWxkUHJlZml4IiwiZ2V0UmVuZGVyZWRDYWxsYmFjayIsInJlcXVlc3RlZEZpZWxkTmFtZSIsInJlbW92ZVByZWZpeGVzRnJvbUZpZWxkIiwicHJlZml4ZXNUb1JlbW92ZSIsInNvcnRCeSIsImdldFJlbmRlcmVkIiwiaGFzTXVsdGlwbGVQcmltYXJ5S2V5c0NhbGxiYWNrIiwiaGFzQ2FsY3VsYXRlZEZpZWxkQ2FsbGJhY2siLCJmaWVsZE5hbWVUb0NoZWNrIiwiY2FsY3VsYXRlZEZpZWxkVmFsdWUiLCJjYWxjdWxhdGVkRmllbGROYW1lIiwicmVzb3VyY2VWYWx1ZSIsInJlc291cmNlTmFtZSIsImhyZWYiLCJnZXRSZWxhdGlvbk5hbWVGcm9tTGluayIsInNldFJlbGF0aW9uc1Jlc291cmNlIiwiZ2V0UmVsYXRpb25SZXNvdXJjZUNhbGxiYWNrIiwicmVzb3VyY2VJbmZvIiwic2luZ2xlIiwiZ2V0UmVsYXRpb25SZXNvdXJjZSIsImN1cnJlbnRTdGF0ZSIsIkludmFsaWRBcmd1bWVudCIsImZpZWxkc1RvUGVyc2lzdE9uSW5zZXJ0IiwibWF5YmVDb252ZXJ0VG9WYWx1ZU9iamVjdCIsInZhbGlkYXRlSXNEYXRlVGltZSIsImZyb21JU08iLCJpbnN0YW5jZU9mIiwiU2l0ZUN1cnJlbmN5IiwidG9JU08iLCJ0b051bWJlciIsIm1heWJlQ29udmVydEZyb21WYWx1ZU9iamVjdCIsImxhc3QiLCJpdGVyYXRvciIsImdldFByaW1hcnlLZXlWYWx1ZXMiLCJwaWNrIiwicGlja0J5IiwiZGVyaXZlRGVmYXVsdFZhbHVlRm9yVHlwZSIsIkRhdGUiLCJ0b0lTT1N0cmluZyIsImRlcml2ZVR5cGVGb3JGaWVsZCIsInZhbGlkIiwic2luZ2xlVHlwZSIsImlzSW50ZWdlciIsImlzTnVtYmVyIiwiaXNTdHJpbmciLCJpc0Jvb2xlYW4iLCJlbnVtVmFsdWVzIiwiZXhwZWN0VmFsdWVPYmplY3RzIiwiaXNFbnVtIiwiaXNWYWx1ZU9iamVjdCIsIkVWRU5UX1NUQVRVU19JRCIsIkVWRU5UX1NUQVRVU19JRFMiLCJjYXRlZ29yeVNsdWciLCJzdHJpbmciLCJ0aWNrZXRfc3RhcnQiLCJ0aWNrZXRfZW5kIiwic2luZ3VsYXIiLCJwcmltYXJ5X2tleXMiLCJ2YWx1ZXNGb3JDb21iaW5lZFByaW1hcnlLZXlzIiwidHJpbUVuZCIsInZhbHVlRm9yUHJpbWFyeUtleSIsImtleVZhbHVlcyIsImdldEVudGl0eVByaW1hcnlLZXlWYWx1ZXMiLCJtYXBwZWRFbnRpdGllcyIsInN0YXR1c01vZGVsIiwiZm9yQXR0ZW5kZWVJZCIsImZvclRyYW5zYWN0aW9uSWQiLCJyZWdfaWQiLCJyZWdfZGF0ZSIsIlNUQVRVU19UWVBFX0VNQUlMIiwiU1RBVFVTX1RZUEVfRVZFTlQiLCJTVEFUVVNfVFlQRV9NRVNTQUdFIiwiU1RBVFVTX1RZUEVfUEFZTUVOVCIsIlNUQVRVU19UWVBFX1JFR0lTVFJBVElPTiIsIlNUQVRVU19UWVBFX1RSQU5TQUNUSU9OIiwiRU1BSUxfU1RBVFVTX0lEIiwiRFJBRlQiLCJTRU5UIiwiUkVHSVNUUkFUSU9OX0NMT1NFRCIsIkRFTEVURUQiLCJERU5JRUQiLCJOT1RfQUNUSVZFIiwiTk9UX09QRU4iLCJPTkdPSU5HIiwiUkVHSVNUUkFUSU9OX09QRU4iLCJQRU5ESU5HIiwiU0VDT05EQVJZIiwiTUVTU0FHRV9TVEFUVVNfSUQiLCJERUJVRyIsIkVYRUNVVElORyIsIkZBSUwiLCJJTkNPTVBMRVRFIiwiSURMRSIsIlJFU0VORCIsIlJFVFJZIiwiUEFZTUVOVF9TVEFUVVNfSUQiLCJBUFBST1ZFRCIsIkRFQ0xJTkVEIiwiRkFJTEVEIiwiUkVHSVNUUkFUSU9OX1NUQVRVU19JRCIsIk5PVF9BUFBST1ZFRCIsIlBFTkRJTkdfUEFZTUVOVCIsIldBSVRfTElTVCIsIlRSQU5TQUNUSU9OX1NUQVRVU19JRCIsIkFCQU5ET05FRCIsIkNPTVBMRVRFIiwiT1ZFUlBBSUQiLCJDUFRfU1RBVFVTX0lEIiwiUFVCTElTSCIsIkZVVFVSRSIsIlBSSVZBVEUiLCJUUkFTSEVEIiwiVU5LTk9XTl9TVEFUVVNfSUQiLCJBTExfU1RBVFVTX0lEUyIsIlNUQVRVU19UUkFOU0xBVElPTl9NQVBfUkVHSVNUUkFUSU9OIiwiTGFiZWwiLCJmcm9tU2FtZVNpbmdsZUFuZFBsdXJhbCIsIlNUQVRVU19UUkFOU0xBVElPTl9NQVBfVFJBTlNBQ1RJT04iLCJTVEFUVVNfVFJBTlNMQVRJT05fTUFQX1BBWU1FTlQiLCJTVEFUVVNfVFJBTlNMQVRJT05fTUFQX01FU1NBR0UiLCJTVEFUVVNfVFJBTlNMQVRJT05fTUFQX0NQVCIsIlNUQVRVU19UUkFOU0xBVElPTl9NQVBfRVZFTlQiLCJTVEFUVVNfVFJBTlNMQVRJT05fTUFQX1RJQ0tFVCIsIlRJQ0tFVF9TVEFUVVNfSUQiLCJBUkNISVZFRCIsIk9OU0FMRSIsIlNUQVRVU19UUkFOU0xBVElPTl9NQVBfREFURVRJTUUiLCJTVEFUVVNfVFJBTlNMQVRJT05fTUFQX0NIRUNLSU4iLCJTVEFUVVNfVFJBTlNMQVRJT05fTUFQX0FMTCIsInN0YXR1c0NvZGUiLCJGT1JNQVRfU0VOVEVOQ0VfQ0FTRSIsImFzRm9ybWF0dGVkIiwicHJldHR5U3RhdHVzZXMiLCJzdGF0dXNDb2RlcyIsIm1hcHBlZFN0YXR1c2VzIiwic3RhdHVzVHlwZSIsIlRJQ0tFVF9TVEFUVVNfSURTIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7QUFHQTtBQUNBO0FBS0E7QUFFQTs7OztBQUdBO0FBRUE7Ozs7OztBQUtPLFNBQVNBLEtBQVQsQ0FBZ0JDLE9BQWhCLEVBQTBCO0FBQ2hDLFNBQU87QUFDTkMsUUFBSSxFQUFFLGdCQURBO0FBRU5ELFdBQU8sRUFBUEE7QUFGTSxHQUFQO0FBSUE7QUFFRDs7Ozs7Ozs7O0FBUU8sU0FBU0UsTUFBVCxDQUFpQkMsVUFBakIsRUFBNkJDLFlBQTdCLEVBQXFEO0FBQUEsb0NBQVBDLElBQU87QUFBUEEsUUFBTztB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZCxLQUFLO0FBQ0wsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0Esd0NBQXdDLFdBQVc7QUFDbkQ7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW9DLGNBQWM7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlDQUFpQyxrQkFBa0I7QUFDbkQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGlCQUFpQjtBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsOENBQThDLFFBQVE7QUFDdEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztB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QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFVBQVU7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQyxLQUFLO0FBQ3RDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSxDQUFDOztBQUVEOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSwrRUFBK0U7QUFDL0U7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLG9CQUFvQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsU0FBUztBQUNyQztBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Q2hHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw0RUFBNEUsY0FBYyxFQUFFO0FBQzVGLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiw2REFBNkQ7QUFDakY7QUFDQSxHQUFHO0FBQ0g7QUFDQSxvQ0FBb0MsdUNBQXVDLEVBQUU7QUFDN0U7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsNkVBQTZFO0FBQ3ZHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCwwQkFBMEIscUJBQXFCLEVBQUU7O0FBRWpEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxT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O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCLHNCQUFzQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsaUNBQWlDLEtBQUs7QUFDdEM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EseUNBQXlDLHdCQUF3QixFQUFFO0FBQ25FLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0NBQXdDLFVBQVU7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUSxXQUFXO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdDQUF3QyxVQUFVO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsV0FBVztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsZ0JBQWdCO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxnQkFBZ0I7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixxQkFBcUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxVQUFVO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGNBQWM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixhQUFhO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsYUFBYTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsdUJBQXVCLEVBQUU7QUFDN0QsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isb0JBQW9CO0FBQzFDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLG9CQUFvQjtBQUMxQztBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLHNCQUFzQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLHNDQUFzQyx5QkFBeUIsRUFBRSxFQUFFLEVBQUU7QUFDeEcsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCLGlCQUFpQjtBQUN0QztBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLGVBQWU7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxzQkFBc0IsRUFBRTtBQUNsRSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdDQUF3QyxLQUFLO0FBQzdDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLGdEQUFnRCxFQUFFO0FBQzFFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQseUNBQXlDLEVBQUU7QUFDOUY7QUFDQTtBQUNBLCtCQUErQixpQkFBaUIsRUFBRTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsU0FBUztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5QkFBeUIseUJBQXlCLEVBQUU7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0EsdUNBQXVDLCtCQUErQixFQUFFO0FBQ3hFLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLCtFQUErRSxhQUFhLEVBQUU7QUFDOUYsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsMkJBQTJCO0FBQzNFO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLHdDQUF3QywyQkFBMkIsRUFBRTtBQUNyRSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQSx3Q0FBd0MsNkJBQTZCLEVBQUU7QUFDdkUsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsMENBQTBDLCtCQUErQixFQUFFO0FBQzNFLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLDJEQUEyRCxFQUFFO0FBQzNGO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsMkNBQTJDLEVBQUU7QUFDM0U7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZELCtDQUErQzs7QUFFNUc7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsc0JBQXNCLEVBQUU7QUFDN0QsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwREFBMEQ7QUFDMUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLG1CQUFtQixFQUFFO0FBQzVELFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdDQUF3QyxLQUFLO0FBQzdDOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixpQkFBaUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQSxrQ0FBa0MsU0FBUztBQUMzQztBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMERBQTBELDJCQUEyQixFQUFFO0FBQ3ZGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0EsMkVBQTJFO0FBQzNFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsMkRBQTJEO0FBQ25HO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRWUsd0VBQVMsRUFBQztBQUNtVjs7Ozs7Ozs7Ozs7O0FDenJMNVc7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7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O0FBQzVCLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRLElBQXFDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsVUFBVSxLQUFxQztBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixzQkFBc0I7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZCxLQUFLO0FBQ0wsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0Esd0NBQXdDLFdBQVc7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsU0FBUztBQUNUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQ0FBb0MsY0FBYztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUNBQWlDLGtCQUFrQjtBQUNuRDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCOztBQUVqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsaUJBQWlCO0FBQ3pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQSxZQUFZO0FBQ1o7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUEsV0FBVztBQUNYO0FB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dGEtc3RvcmVzLmZjNjA0MDgzNjQ3MjY0YWRkNzM2LmRpc3QuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IGFwaUZldGNoIGZyb20gJ0B3b3JkcHJlc3MvYXBpLWZldGNoJztcbmltcG9ydCB7XG5cdHNlbGVjdCBhcyBzZWxlY3REYXRhLFxuXHRkaXNwYXRjaCBhcyBkaXNwYXRjaERhdGEsXG5cdHN1YnNjcmliZSxcbn0gZnJvbSAnQHdvcmRwcmVzcy9kYXRhJztcbmltcG9ydCB7IHBsdXJhbE1vZGVsTmFtZSB9IGZyb20gJ0BldmVudGVzcHJlc3NvL21vZGVsJztcblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IFJFRFVDRVJfS0VZIGFzIENPUkVfUkVEVUNFUl9LRVkgfSBmcm9tICcuL2NvcmUvY29uc3RhbnRzJztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhY3Rpb24gb2JqZWN0IGZvciBhIGZldGNoIGNvbnRyb2wuXG4gKiBAcGFyYW0ge09iamVjdH0gcmVxdWVzdFxuICogQHJldHVybiB7e3R5cGU6IHN0cmluZywgcmVxdWVzdDogT2JqZWN0fX0gQW4gYWN0aW9uIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmV0Y2goIHJlcXVlc3QgKSB7XG5cdHJldHVybiB7XG5cdFx0dHlwZTogJ0ZFVENIX0ZST01fQVBJJyxcblx0XHRyZXF1ZXN0LFxuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGFjdGlvbiBvYmplY3QgZm9yIGEgc2VsZWN0IGNvbnRyb2wuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVkdWNlcktleVxuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yTmFtZVxuICogQHBhcmFtIHsqW119IGFyZ3NcbiAqIEByZXR1cm4ge3t0eXBlOiBzdHJpbmcsIHJlZHVjZXJLZXk6IHN0cmluZywgc2VsZWN0b3JOYW1lOiBzdHJpbmcsIGFyZ3M6ICpbXX19XG4gKiBSZXR1cm5zIGFuIGFjdGlvbiBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3QoIHJlZHVjZXJLZXksIHNlbGVjdG9yTmFtZSwgLi4uYXJncyApIHtcblx0cmV0dXJuIHtcblx0XHR0eXBlOiAnU0VMRUNUJyxcblx0XHRyZWR1Y2VyS2V5LFxuXHRcdHNlbGVjdG9yTmFtZSxcblx0XHRhcmdzLFxuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGFjdGlvbiBvYmplY3QgZm9yIHJlc29sdmluZyBhIHNlbGVjdG9yIHRoYXQgaGFzIGEgcmVzb2x2ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVkdWNlcktleVxuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yTmFtZVxuICogQHBhcmFtIHtBcnJheX0gYXJnc1xuICogQHJldHVybiB7T2JqZWN0fSBBbiBhY3Rpb24gb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVNlbGVjdCggcmVkdWNlcktleSwgc2VsZWN0b3JOYW1lLCAuLi5hcmdzICkge1xuXHRyZXR1cm4ge1xuXHRcdHR5cGU6ICdSRVNPTFZFX1NFTEVDVCcsXG5cdFx0cmVkdWNlcktleSxcblx0XHRzZWxlY3Rvck5hbWUsXG5cdFx0YXJncyxcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhY3Rpb24gb2JqZWN0IGZvciBhIGRpc3BhdGNoIGNvbnRyb2wuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVkdWNlcktleVxuICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTmFtZVxuICogQHBhcmFtIHsqW119IGFyZ3NcbiAqIEByZXR1cm4ge3t0eXBlOiBzdHJpbmcsIHJlZHVjZXJLZXk6IHN0cmluZywgZGlzcGF0Y2hOYW1lOiBzdHJpbmcsIGFyZ3M6ICpbXX19XG4gKiBBbiBhY3Rpb24gb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXNwYXRjaCggcmVkdWNlcktleSwgZGlzcGF0Y2hOYW1lLCAuLi5hcmdzICkge1xuXHRyZXR1cm4ge1xuXHRcdHR5cGU6ICdESVNQQVRDSCcsXG5cdFx0cmVkdWNlcktleSxcblx0XHRkaXNwYXRjaE5hbWUsXG5cdFx0YXJncyxcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhY3Rpb24gb2JqZWN0IGZvciBhIHJlc29sdmUgZGlzcGF0Y2ggY29udHJvbFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWR1Y2VyS2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hOYW1lXG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBhY3Rpb24gb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURpc3BhdGNoKCByZWR1Y2VyS2V5LCBkaXNwYXRjaE5hbWUsIC4uLmFyZ3MgKSB7XG5cdHJldHVybiB7XG5cdFx0dHlwZTogJ1JFU09MVkVfRElTUEFUQ0gnLFxuXHRcdHJlZHVjZXJLZXksXG5cdFx0ZGlzcGF0Y2hOYW1lLFxuXHRcdGFyZ3MsXG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYWN0aW9uIG9iamVjdCBmb3IgcmVzb2x2aW5nIHRoZSBnZXRFbnRpdHlCeUlkIHNlbGVjdG9yXG4gKiBmb3IgYWxsIHRoZSBnaXZlbiBpZHMgb24gdGhlIGdpdmVuIG1vZGVsXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtBcnJheX0gZW50aXR5SWRzXG4gKiBAcmV0dXJuIHtPYmplY3R9IEFuIGFjdGlvbiBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVHZXRFbnRpdHlCeUlkRm9ySWRzKCBtb2RlbE5hbWUsIGVudGl0eUlkcyApIHtcblx0cmV0dXJuIHtcblx0XHR0eXBlOiAnUkVTT0xWRV9HRVRfRU5USVRZX0JZX0lEX0ZPUl9JRFMnLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHlJZHMsXG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYWN0aW9uIG9iamVjdCBmb3IgcmVzb2x2aW5nIHRoZSBnZXRSZWxhdGVkRW50aXRpZXMgc2VsZWN0b3JcbiAqIG9uIHRoZSBldmVudGVzcHJlc3NvL2NvcmUgc3RvcmUgZm9yIHRoZSBnaXZlbiBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHtCYXNlRW50aXR5fSBlbnRpdHlcbiAqIEBwYXJhbSB7TWFwfSByZWxhdGlvbkVudGl0aWVzXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHJlbGF0aW9uSWRzXG4gKiBAcmV0dXJuIHtPYmplY3R9IEFuIGFjdGlvbiBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVHZXRSZWxhdGVkRW50aXRpZXMoXG5cdGVudGl0eSxcblx0cmVsYXRpb25FbnRpdGllcyxcblx0cmVsYXRpb25JZHNcbikge1xuXHRyZXR1cm4ge1xuXHRcdHR5cGU6ICdSRVNPTFZFX0dFVF9SRUxBVEVEX0VOVElUSUVTJyxcblx0XHRlbnRpdHksXG5cdFx0cmVsYXRpb25FbnRpdGllcyxcblx0XHRyZWxhdGlvbklkcyxcblx0fTtcbn1cblxuY29uc3QgY29udHJvbHMgPSB7XG5cdEZFVENIX0ZST01fQVBJKCB7IHJlcXVlc3QgfSApIHtcblx0XHRyZXR1cm4gYXBpRmV0Y2goIHJlcXVlc3QgKTtcblx0fSxcblx0U0VMRUNUKCB7IHJlZHVjZXJLZXksIHNlbGVjdG9yTmFtZSwgYXJncyB9ICkge1xuXHRcdHJldHVybiBzZWxlY3REYXRhKCByZWR1Y2VyS2V5IClbIHNlbGVjdG9yTmFtZSBdKCAuLi5hcmdzICk7XG5cdH0sXG5cdERJU1BBVENIKCB7IHJlZHVjZXJLZXksIGRpc3BhdGNoTmFtZSwgYXJncyB9ICkge1xuXHRcdHJldHVybiBkaXNwYXRjaERhdGEoIHJlZHVjZXJLZXkgKVsgZGlzcGF0Y2hOYW1lIF0oIC4uLmFyZ3MgKTtcblx0fSxcblx0YXN5bmMgUkVTT0xWRV9ESVNQQVRDSCggeyByZWR1Y2VyS2V5LCBkaXNwYXRjaE5hbWUsIGFyZ3MgfSApIHtcblx0XHRyZXR1cm4gYXdhaXQgZGlzcGF0Y2hEYXRhKCByZWR1Y2VyS2V5IClbIGRpc3BhdGNoTmFtZSBdKCAuLi5hcmdzICk7XG5cdH0sXG5cdFJFU09MVkVfU0VMRUNUKCB7IHJlZHVjZXJLZXksIHNlbGVjdG9yTmFtZSwgYXJncyB9ICkge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZSggKCByZXNvbHZlICkgPT4ge1xuXHRcdFx0Y29uc3QgaGFzRmluaXNoZWQgPSAoKSA9PiBzZWxlY3REYXRhKCAnY29yZS9kYXRhJyApXG5cdFx0XHRcdC5oYXNGaW5pc2hlZFJlc29sdXRpb24oIHJlZHVjZXJLZXksIHNlbGVjdG9yTmFtZSwgYXJncyApO1xuXHRcdFx0Y29uc3QgZ2V0UmVzdWx0ID0gKCkgPT4gc2VsZWN0RGF0YSggcmVkdWNlcktleSApWyBzZWxlY3Rvck5hbWUgXVxuXHRcdFx0XHQuYXBwbHkoIG51bGwsIGFyZ3MgKTtcblxuXHRcdFx0Ly8gdHJpZ2dlciB0aGUgc2VsZWN0b3IgKHRvIHRyaWdnZXIgdGhlIHJlc29sdmVyKVxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gZ2V0UmVzdWx0KCk7XG5cdFx0XHRpZiAoIGhhc0ZpbmlzaGVkKCkgKSB7XG5cdFx0XHRcdHJldHVybiByZXNvbHZlKCByZXN1bHQgKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgdW5zdWJzY3JpYmUgPSBzdWJzY3JpYmUoICgpID0+IHtcblx0XHRcdFx0aWYgKCBoYXNGaW5pc2hlZCgpICkge1xuXHRcdFx0XHRcdHVuc3Vic2NyaWJlKCk7XG5cdFx0XHRcdFx0cmVzb2x2ZSggZ2V0UmVzdWx0KCkgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fSxcblx0UkVTT0xWRV9HRVRfRU5USVRZX0JZX0lEX0ZPUl9JRFMoIHsgbW9kZWxOYW1lLCBlbnRpdHlJZHMgfSApIHtcblx0XHR3aGlsZSAoIGVudGl0eUlkcy5sZW5ndGggPiAwICkge1xuXHRcdFx0ZGlzcGF0Y2hEYXRhKFxuXHRcdFx0XHQnY29yZS9kYXRhJyxcblx0XHRcdFx0J2ZpbmlzaFJlc29sdXRpb24nLFxuXHRcdFx0XHRDT1JFX1JFRFVDRVJfS0VZLFxuXHRcdFx0XHQnZ2V0RW50aXR5QnlJZCcsXG5cdFx0XHRcdFsgbW9kZWxOYW1lLCBlbnRpdHlJZHMucG9wKCkgXVxuXHRcdFx0KTtcblx0XHR9XG5cdFx0Ly8gaWYgY29udHJvbHMgcmV0dXJuIHVuZGVmaW5lZCB0aGVuIGZsb3cgZXhlY3V0aW9uIHN0b3BzLiAgVGhpcyBlbnN1cmVzXG5cdFx0Ly8gdGhlIGZsb3cgY29udGludWVzLlxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXHRSRVNPTFZFX0dFVF9SRUxBVEVEX0VOVElUSUVTKCB7IGVudGl0eSwgcmVsYXRpb25FbnRpdGllcywgcmVsYXRpb25JZHMgfSApIHtcblx0XHRjb25zdCByZWxhdGlvbkVudGl0eSA9IHJlbGF0aW9uRW50aXRpZXMuZ2V0KCByZWxhdGlvbklkcy5wb3AoKSApO1xuXHRcdGlmICggcmVsYXRpb25FbnRpdHkgKSB7XG5cdFx0XHRkaXNwYXRjaERhdGEoXG5cdFx0XHRcdCdjb3JlL2RhdGEnLFxuXHRcdFx0XHQnZmluaXNoUmVzb2x1dGlvbicsXG5cdFx0XHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0XHRcdCdnZXRSZWxhdGVkRW50aXRpZXMnLFxuXHRcdFx0XHRbIHJlbGF0aW9uRW50aXR5LCBwbHVyYWxNb2RlbE5hbWUoIGVudGl0eS5tb2RlbE5hbWUgKSBdXG5cdFx0XHQpO1xuXHRcdH1cblx0XHQvLyBpZiBjb250cm9scyByZXR1cm4gdW5kZWZpbmVkIHRoZW4gZmxvdyBleGVjdXRpb24gc3RvcHMuICBUaGlzIGVuc3VyZXNcblx0XHQvLyB0aGUgZmxvdyBjb250aW51ZXMuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb250cm9scztcbiIsIi8qKlxuICogRXh0ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cbmltcG9ydCB7IHVwcGVyRmlyc3QsIGNhbWVsQ2FzZSwgcmVkdWNlLCBpc01hcCwgaXNOYU4gfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBsdXJhbGl6ZSBmcm9tICdwbHVyYWxpemUnO1xuaW1wb3J0IHsgbWFwUmVkdWNlciB9IGZyb20gJ0BldmVudGVzcHJlc3NvL2hlbHBlcnMnO1xuXG4vKipcbiAqIEEgaGVscGVyIGZvciBnZXR0aW5nIGEgbWV0aG9kIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gc3VmZml4XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gKiBAcGFyYW0ge2Jvb2xlYW59IHVzZVBsdXJhbFxuICogQHJldHVybiB7c3RyaW5nfSBSZXR1cm5zIGEgbmFtZSBmb3IgYSBtZXRob2QuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRNZXRob2ROYW1lID0gKFxuXHRtb2RlbE5hbWUsXG5cdHN1ZmZpeCA9ICcnLFxuXHRwcmVmaXggPSAnZ2V0Jyxcblx0dXNlUGx1cmFsID0gZmFsc2VcbikgPT4ge1xuXHRtb2RlbE5hbWUgPSB1c2VQbHVyYWwgPyBwbHVyYWxpemUoIG1vZGVsTmFtZSApIDogbW9kZWxOYW1lO1xuXHRyZXR1cm4gcHJlZml4ICsgdXBwZXJGaXJzdCggY2FtZWxDYXNlKCBtb2RlbE5hbWUgKyB1cHBlckZpcnN0KCBzdWZmaXggKSApICk7XG59O1xuXG4vKipcbiAqIEdpdmVuIGEgY29sbGVjdGlvbiBvZiBleGlzdGluZyBlbnRpdGllcyBhbmQgYSBjb2xsZWN0aW9uIG9mIGluY29taW5nXG4gKiBlbnRpdGllcywgdGhpcyByZXR1cm5zIGEgbWVyZ2VkIG9iamVjdCB3aXRoIHByZWZlcmVuY2UgZ2l2ZW4gdG8gY29tbW9uXG4gKiBlbnRpdGllcyBmcm9tIHRoZSBleGlzdGluZ0VudGl0aWVzIGNvbGxlY3Rpb24uXG4gKlxuICogSW5jb21pbmcgY29sbGVjdGlvbnMgY2FuIGJlIE1hcHMgb3IgcGxhaW4gb2JqZWN0cy5cbiAqXG4gKiBOb3RlIGlmIGluY29taW5nRW50aXRpZXMgaXMgYSBNYXAsIHRoZSBPUkRFUiBvZiB0aGUgbWFwIHdpbGwgYmUgcHJlc2VydmVkXG4gKiBldmVuIGlmIHRoZSB2YWx1ZXMgb2YgZW50aXRpZXMgaW4gdGhlIG1hcCBhcmUgcmVwbGFjZWQgYnkgdmFsdWVzIGZyb21cbiAqIGV4aXN0aW5nIGVudGl0aWVzLlxuICpcbiAqIEBwYXJhbSB7TWFwfE9iamVjdH0gZXhpc3RpbmdFbnRpdGllc1xuICogQHBhcmFtIHtNYXB8T2JqZWN0fSBpbmNvbWluZ0VudGl0aWVzXG4gKiBAcmV0dXJuIHtNYXB9IEEgbmV3IGNvbGxlY3Rpb24gb2YgZW50aXRpZXMuIE5vdGUgaWYgZXhpc3RpbmcgZW50aXRpZXMgY2FtZSBpblxuICogYXMgYSBwbGFpbiBvYmplY3QsIHRoaXMgcmV0dXJucyBhIE1hcC5cbiAqL1xuZXhwb3J0IGNvbnN0IGtlZXBFeGlzdGluZ0VudGl0aWVzSW5PYmplY3QgPSAoXG5cdGV4aXN0aW5nRW50aXRpZXMsXG5cdGluY29taW5nRW50aXRpZXMsXG4pID0+IHtcblx0Y29uc3QgZ2V0RXhpc3RpbmdPckRlZmF1bHRFbnRpdHkgPSAoIGRlZmF1bHRFbnRpdHksIGVudGl0eUlkICkgPT4ge1xuXHRcdGlmICggaXNNYXAoIGV4aXN0aW5nRW50aXRpZXMgKSAmJiBleGlzdGluZ0VudGl0aWVzLmhhcyggZW50aXR5SWQgKSApIHtcblx0XHRcdHJldHVybiBleGlzdGluZ0VudGl0aWVzLmdldCggZW50aXR5SWQgKTtcblx0XHR9XG5cdFx0cmV0dXJuIGV4aXN0aW5nRW50aXRpZXNbIGVudGl0eUlkIF0gfHwgZGVmYXVsdEVudGl0eTtcblx0fTtcblx0Y29uc3QgcmVkdWNlQ2FsbGJhY2sgPSAoIG1hcHBlZCwgZW50aXR5LCBlbnRpdHlJZCApID0+IHtcblx0XHRlbnRpdHlJZCA9IG5vcm1hbGl6ZUVudGl0eUlkKCBlbnRpdHlJZCApO1xuXHRcdG1hcHBlZC5zZXQoIGVudGl0eUlkLCBnZXRFeGlzdGluZ09yRGVmYXVsdEVudGl0eSggZW50aXR5LCBlbnRpdHlJZCApICk7XG5cdFx0cmV0dXJuIG1hcHBlZDtcblx0fTtcblx0cmV0dXJuIGlzTWFwKCBpbmNvbWluZ0VudGl0aWVzICkgP1xuXHRcdG1hcFJlZHVjZXIoIGluY29taW5nRW50aXRpZXMsIHJlZHVjZUNhbGxiYWNrLCBuZXcgTWFwKCkgKSA6XG5cdFx0cmVkdWNlKCBpbmNvbWluZ0VudGl0aWVzLCByZWR1Y2VDYWxsYmFjaywgbmV3IE1hcCgpICk7XG59O1xuXG4vKipcbiAqIFRoaXMgbm9ybWFsaXplcyBudW1lcmljIHZhbHVlcyB0byBpbnRlZ2VyIG51bWJlcnMgYW5kIGxlYXZlcyBub24gbnVtZXJpY1xuICogdmFsdWVzIGFsb25lLlxuICpcbiAqIEBwYXJhbSB7Kn0gZW50aXR5SWRcbiAqIEByZXR1cm4geyp9IE5vcm1hbGl6ZWQgdmFsdWVcbiAqL1xuY29uc3Qgbm9ybWFsaXplRW50aXR5SWQgPSAoIGVudGl0eUlkICkgPT4ge1xuXHRjb25zdCBvcmlnaW5hbElkID0gZW50aXR5SWQ7XG5cdGVudGl0eUlkID0gcGFyc2VJbnQoIGVudGl0eUlkLCAxMCApO1xuXHRyZXR1cm4gaXNOYU4oIGVudGl0eUlkICkgPyBvcmlnaW5hbElkIDogZW50aXR5SWQ7XG59O1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqL1xuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnQHdvcmRwcmVzcy9kYXRhJztcblxuLyoqXG4gKiBJbnZva2VzIHRoZSBzZWxlY3RvciBmb3Igd2hldGhlciBhIGdpdmVuIHNlbGVjdG9yTmFtZSBpbiBhIGdpdmVuIHJlZ2lzdGVyZWRcbiAqIHJlZHVjZXIgc3RvcmUgaXMgaW4gdGhlIG1pZHN0IG9mIHJlc29sdmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZWR1Y2VyS2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JOYW1lXG4gKiBAcGFyYW0geypbXX0gYXJnc1xuICogQHJldHVybiB7Ym9vbGVhbn0gIFdoZXRoZXIgcmVzb2x1dGlvbiBpcyBpbiBwcm9ncmVzcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzUmVzb2x2aW5nID0gKCByZWR1Y2VyS2V5LCBzZWxlY3Rvck5hbWUsIC4uLmFyZ3MgKSA9PiB7XG5cdHJldHVybiBzZWxlY3QoICdjb3JlL2RhdGEnICkuaXNSZXNvbHZpbmcoIHJlZHVjZXJLZXksIHNlbGVjdG9yTmFtZSwgYXJncyApO1xufTtcblxuLyoqXG4gKiBJbnZva2VzIHRoZSBzZWxlY3RvciBmb3Igd2hldGhlciBhIGdpdmVuIHNlbGVjdG9yTmFtZSBpbiBhIGdpdmVuIHJlZ2lzdGVyZWRcbiAqIHJlZHVjZXIgc3RvcmUgaGFzIGZpbmlzaGVkIHJlc29sdmluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVkdWNlcktleVxuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yTmFtZVxuICogQHBhcmFtIHsqW119IGFyZ3NcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgcmVzb2x1dGlvbiBoYXMgY29tcGxldGVkLlxuICovXG5leHBvcnQgY29uc3QgaGFzRmluaXNoZWRSZXNvbHZpbmcgPSAoIHJlZHVjZXJLZXksIHNlbGVjdG9yTmFtZSwgLi4uYXJncyApID0+IHtcblx0cmV0dXJuIHNlbGVjdCggJ2NvcmUvZGF0YScgKVxuXHRcdC5oYXNGaW5pc2hlZFJlc29sdXRpb24oIHJlZHVjZXJLZXksIHNlbGVjdG9yTmFtZSwgYXJncyApO1xufTtcbiIsImV4cG9ydCAqIGZyb20gJy4vcmVjZWl2ZS1lbnRpdGllcyc7XG5leHBvcnQgKiBmcm9tICcuL3JlY2VpdmUtcmVsYXRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vcmVtb3ZlLWVudGl0aWVzJztcbmV4cG9ydCAqIGZyb20gJy4vcmVtb3ZlLXJlbGF0aW9ucyc7XG4iLCJleHBvcnQgKiBmcm9tICcuL2NyZWF0ZS1lbnRpdGllcy1nZW5lcmF0b3JzJztcbmV4cG9ydCAqIGZyb20gJy4vY3JlYXRlLXJlbGF0aW9ucy1nZW5lcmF0b3JzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZGVsZXRlLWVudGl0eS1nZW5lcmF0b3JzJztcbmV4cG9ydCAqIGZyb20gJy4vZGVsZXRlLXJlbGF0aW9ucy1nZW5lcmF0b3JzJztcbmV4cG9ydCAqIGZyb20gJy4vcGVyc2lzdC1lbnRpdHktZ2VuZXJhdG9ycyc7XG5leHBvcnQgKiBmcm9tICcuL3BlcnNpc3QtcmVsYXRpb25zLWdlbmVyYXRvcnMnO1xuIiwiY29uc3QgZW50aXRpZXMgPSB7XG5cdFJFQ0VJVkVfRU5USVRZX1JFQ09SRFM6ICdSRUNFSVZFX0VOVElUWV9SRUNPUkRTJyxcblx0UkVDRUlWRV9BTkRfUkVQTEFDRV9FTlRJVFlfUkVDT1JEUzogJ1JFQ0VJVkVfQU5EX1JFUExBQ0VfRU5USVRZX1JFQ09SRFMnLFxuXHRSRUNFSVZFX0VOVElUWTogJ1JFQ0VJVkVfRU5USVRZJyxcblx0UkVNT1ZFX0VOVElUWV9CWV9JRDogJ1JFTU9WRV9FTlRJVFlfQllfSUQnLFxuXHRSRU1PVkVfREVMRVRFX0VOVElUWV9JRDogJ1JFTU9WRV9ERUxFVEVfRU5USVRZX0lEJyxcblx0UkVNT1ZFX1RSQVNIX0VOVElUWV9JRDogJ1JFTU9WRV9UUkFTSF9FTlRJVFlfSUQnLFxuXHRSRUNFSVZFX1RSQVNIX0VOVElUWV9JRDogJ1JFQ0VJVkVfVFJBU0hfRU5USVRZX0lEJyxcblx0UkVDRUlWRV9ERUxFVEVfRU5USVRZX0lEOiAnUkVDRUlWRV9ERUxFVEVfRU5USVRZX0lEJyxcbn07XG5jb25zdCByZWxhdGlvbnMgPSB7XG5cdFJFTU9WRV9ESVJUWV9SRUxBVElPTl9BRERJVElPTjogJ1JFTU9WRV9ESVJUWV9SRUxBVElPTl9BRERJVElPTicsXG5cdFJFTU9WRV9ESVJUWV9SRUxBVElPTl9ERUxFVElPTjogJ1JFTU9WRV9ESVJUWV9SRUxBVElPTl9ERUxFVElPTicsXG5cdFJFQ0VJVkVfUkVMQVRFRF9FTlRJVFlfSURTOiAnUkVDRUlWRV9SRUxBVEVEX0VOVElUWV9JRFMnLFxuXHRSRU1PVkVfUkVMQVRFRF9FTlRJVFlfSURTOiAnUkVNT1ZFX1JFTEFURURfRU5USVRZX0lEUycsXG5cdFJFTU9WRV9SRUxBVEVEX0VOVElUSUVTX0ZPUl9FTlRJVFk6ICdSRU1PVkVfUkVMQVRFRF9FTlRJVElFU19GT1JfRU5USVRZJyxcblx0UkVDRUlWRV9ESVJUWV9SRUxBVElPTl9BRERJVElPTjogJ1JFQ0VJVkVfRElSVFlfUkVMQVRJT05fQURESVRJT04nLFxuXHRSRUNFSVZFX0RJUlRZX1JFTEFUSU9OX0RFTEVUSU9OOiAnUkVDRUlWRV9ESVJUWV9SRUxBVElPTl9ERUxFVElPTicsXG5cdFJFQ0VJVkVfVVBEQVRFRF9FTlRJVFlfSURfRk9SX1JFTEFUSU9OUzpcblx0XHQnUkVDRUlWRV9VUERBVEVEX0VOVElUWV9JRF9GT1JfUkVMQVRJT05TJyxcbn07XG5cbmNvbnN0IG1vZGVsU3BlY2lmaWMgPSB7XG5cdFJFQ0VJVkVfU0VMRUNUT1JfVkFMVUU6ICdSRUNFSVZFX1NFTEVDVE9SX1ZBTFVFJyxcbn07XG5cbmV4cG9ydCBjb25zdCBBQ1RJT05fVFlQRVMgPSB7IGVudGl0aWVzLCByZWxhdGlvbnMsIG1vZGVsU3BlY2lmaWMgfTtcbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQge1xuXHRpc01vZGVsRW50aXR5RmFjdG9yeU9mTW9kZWwsXG5cdGlzTW9kZWxFbnRpdHksXG59IGZyb20gJ0BldmVudGVzcHJlc3NvL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHsgSW52YWxpZE1vZGVsRW50aXR5IH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vZWVqcyc7XG5cbi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyByZXNvbHZlU2VsZWN0LCBkaXNwYXRjaCB9IGZyb20gJy4uLy4uL2Jhc2UtY29udHJvbHMnO1xuaW1wb3J0IHsgUkVEVUNFUl9LRVkgYXMgU0NIRU1BX1JFRFVDRVJfS0VZIH0gZnJvbSAnLi4vLi4vc2NoZW1hL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBSRURVQ0VSX0tFWSBhcyBDT1JFX1JFRFVDRVJfS0VZIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFjdGlvbiBnZW5lcmF0b3IgZm9yIGNyZWF0aW5nIGEgbW9kZWwgZW50aXR5IGluc3RhbmNlIGFuZFxuICogaW5jbHVkaW5nIGl0IGluIGFuIGFjdGlvbiBvYmplY3QgZm9yIGFkZGluZyB0byBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lICBUaGUgbmFtZSBvZiB0aGUgbW9kZWwgdGhlIGluY29taW5nIG9iamVjdCBpcyBmb3IuXG4gKiBAcGFyYW0ge09iamVjdH0gZW50aXR5ICBBIHBsYWluIG9iamVjdCBjb250YWluaW5nIHRoZSBlbnRpdHkgcHJvcGVydGllcyBhbmRcbiAqIHZhbHVlc1xuICogQHJldHVybiB7bnVsbHxPYmplY3R9ICBJZiB0aGUgZW50aXR5IGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHRoZSBtb2RlbCBlbnRpdHlcbiAqIGluc3RhbmNlIGlzIHJldHVybmVkLCBvdGhlcndpc2UgbnVsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uKiBjcmVhdGVFbnRpdHkoIG1vZGVsTmFtZSwgZW50aXR5ICkge1xuXHRjb25zdCBmYWN0b3J5ID0geWllbGQgcmVzb2x2ZVNlbGVjdChcblx0XHRTQ0hFTUFfUkVEVUNFUl9LRVksXG5cdFx0J2dldEZhY3RvcnlGb3JNb2RlbCcsXG5cdFx0bW9kZWxOYW1lXG5cdCk7XG5cdGlmICggISBpc01vZGVsRW50aXR5RmFjdG9yeU9mTW9kZWwoIGZhY3RvcnksIG1vZGVsTmFtZSApICkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cdGNvbnN0IGVudGl0eUluc3RhbmNlID0gZmFjdG9yeS5jcmVhdGVOZXcoIGVudGl0eSApO1xuXHR5aWVsZCBkaXNwYXRjaChcblx0XHRDT1JFX1JFRFVDRVJfS0VZLFxuXHRcdCdyZWNlaXZlRW50aXR5QW5kUmVzb2x2ZScsXG5cdFx0ZW50aXR5SW5zdGFuY2Vcblx0KTtcblx0cmV0dXJuIGVudGl0eUluc3RhbmNlO1xufVxuXG4vKipcbiAqIEdlbmVyYXRvciBmb3IgeWllbGRpbmcgYWN0aW9ucyBmb3IgYm90aCByZWNlaXZpbmcgYVxuICogQmFzZUVudGl0eSBpbnN0YW5jZSBhbmQgcmVzb2x2aW5nIHRoZSByZWxhdGVkIHNlbGVjdG9yIGZvciByZXRyaWV2aW5nIHRoYXRcbiAqIGVudGl0eSBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge0Jhc2VFbnRpdHl9IGVudGl0eVxuICovXG5leHBvcnQgZnVuY3Rpb24qIHJlY2VpdmVFbnRpdHlBbmRSZXNvbHZlKCBlbnRpdHkgKSB7XG5cdGFzc2VydElzTW9kZWxFbnRpdHkoIGVudGl0eSApO1xuXHR5aWVsZCBkaXNwYXRjaChcblx0XHRDT1JFX1JFRFVDRVJfS0VZLFxuXHRcdCdyZWNlaXZlRW50aXR5Jyxcblx0XHRlbnRpdHlcblx0KTtcblx0eWllbGQgZGlzcGF0Y2goXG5cdFx0J2NvcmUvZGF0YScsXG5cdFx0J2ZpbmlzaFJlc29sdXRpb24nLFxuXHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0J2dldEVudGl0eUJ5SWQnLFxuXHRcdFsgZW50aXR5Lm1vZGVsTmFtZS50b0xvd2VyQ2FzZSgpLCBlbnRpdHkuaWQgXVxuXHQpO1xufVxuXG4vKipcbiAqIFNhbWUgYXMgcmVjZWl2ZXNFbnRpdHlBbmRSZXNvbHZlIGV4Y2VwdCB0aGlzIGhhbmRsZXMgbXVsdGlwbGUgZW50aXRpZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge0FycmF5PEJhc2VFbnRpdHk+fWVudGl0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiogcmVjZWl2ZUVudGl0aWVzQW5kUmVzb2x2ZSggbW9kZWxOYW1lLCBlbnRpdGllcyApIHtcblx0Y29uc3QgZW50aXR5SWRzID0gZW50aXRpZXMubWFwKFxuXHRcdCggZW50aXR5ICkgPT4ge1xuXHRcdFx0YXNzZXJ0SXNNb2RlbEVudGl0eSggZW50aXR5ICk7XG5cdFx0XHRyZXR1cm4gZW50aXR5LmlkO1xuXHRcdH1cblx0KTtcblx0d2hpbGUgKCBlbnRpdHlJZHMubGVuZ3RoID4gMCApIHtcblx0XHR5aWVsZCBkaXNwYXRjaChcblx0XHRcdCdjb3JlL2RhdGEnLFxuXHRcdFx0J2ZpbmlzaFJlc29sdXRpb24nLFxuXHRcdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHRcdCdnZXRFbnRpdHlCeUlkJyxcblx0XHRcdFsgbW9kZWxOYW1lLCBlbnRpdHlJZHMucG9wKCkgXVxuXHRcdCk7XG5cdH1cblx0eWllbGQgZGlzcGF0Y2goXG5cdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHQncmVjZWl2ZUVudGl0eVJlY29yZHMnLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdGllcyxcblx0KTtcbn1cblxuLyoqXG4gKiBBc3NlcnRzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgbW9kZWwgZW50aXR5IGFuZCB0aHJvd3NcbiAqIEludmFsaWRNb2RlbEVudGl0eSBpZiBpdCBpcyBub3QuXG4gKlxuICogQHBhcmFtIHtCYXNlRW50aXR5fSBlbnRpdHlcbiAqIEB0aHJvd3MgSW52YWxpZE1vZGVsRW50aXR5XG4gKi9cbmZ1bmN0aW9uIGFzc2VydElzTW9kZWxFbnRpdHkoIGVudGl0eSApIHtcblx0aWYgKCAhIGlzTW9kZWxFbnRpdHkoIGVudGl0eSApICkge1xuXHRcdHRocm93IG5ldyBJbnZhbGlkTW9kZWxFbnRpdHkoXG5cdFx0XHQncmVjZWl2ZUVudGl0eUlkQW5kUmVzb2x2ZSBleHBlY3RzIGFuIGluc3RhbmNlIG9mIEJhc2VFbnRpdHknLFxuXHRcdFx0ZW50aXR5LFxuXHRcdCk7XG5cdH1cbn1cbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBpc01vZGVsRW50aXR5T2ZNb2RlbCB9IGZyb20gJ0BldmVudGVzcHJlc3NvL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHtcblx0c2luZ3VsYXJNb2RlbE5hbWUsXG5cdHBsdXJhbE1vZGVsTmFtZSxcbn0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vbW9kZWwnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnd2FybmluZyc7XG5pbXBvcnQgeyBJbnZhbGlkTW9kZWxFbnRpdHkgfSBmcm9tICdAZXZlbnRlc3ByZXNzby9lZWpzJztcbmltcG9ydCB7IGdldElkc0Zyb21CYXNlRW50aXR5QXJyYXkgfSBmcm9tICdAZXZlbnRlc3ByZXNzby9oZWxwZXJzJztcblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IGRpc3BhdGNoLCBzZWxlY3QsIHJlc29sdmVTZWxlY3QgfSBmcm9tICcuLi8uLi9iYXNlLWNvbnRyb2xzJztcbmltcG9ydCB7IFJFRFVDRVJfS0VZIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBBY3Rpb24gZ2VuZXJhdG9yIHlpZWxkaW5nIGFjdGlvbnMgdGhhdCBhZGQgdGhlIHJlbGF0aW9uIHRvIHRoZSBzdGF0ZSBmb3IgYVxuICogc2luZ2xlIHJlbGF0aW9uIGVudGl0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gZW50aXR5SWRcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbk5hbWVcbiAqIEBwYXJhbSB7QmFzZUVudGl0eX0gcmVsYXRpb25FbnRpdHlcbiAqL1xuZnVuY3Rpb24qIGNyZWF0ZVJlbGF0aW9uKFxuXHRtb2RlbE5hbWUsXG5cdGVudGl0eUlkLFxuXHRyZWxhdGlvbk5hbWUsXG5cdHJlbGF0aW9uRW50aXR5XG4pIHtcblx0cmVsYXRpb25OYW1lID0gcGx1cmFsTW9kZWxOYW1lKCByZWxhdGlvbk5hbWUgKTtcblx0Y29uc3Qgc2luZ3VsYXJSZWxhdGlvbk5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggcmVsYXRpb25OYW1lICk7XG5cdGlmICggISBpc01vZGVsRW50aXR5T2ZNb2RlbCggcmVsYXRpb25FbnRpdHksIHNpbmd1bGFyUmVsYXRpb25OYW1lICkgKSB7XG5cdFx0d2FybmluZyhcblx0XHRcdGZhbHNlLFxuXHRcdFx0J1RoZSBwcm92aWRlZCByZWxhdGlvbiBlbnRpdHkgKCVzKSBpcyBub3QgYSBiYXNlIGVudGl0eSBpbnN0YW5jZScgK1xuXHRcdFx0JyBmb3IgdGhlICVzIHJlbGF0aW9uIG1vZGVsJyxcblx0XHRcdHJlbGF0aW9uRW50aXR5LFxuXHRcdFx0cmVsYXRpb25OYW1lXG5cdFx0KTtcblx0XHRyZXR1cm47XG5cdH1cblx0eWllbGQgZGlzcGF0Y2goXG5cdFx0UkVEVUNFUl9LRVksXG5cdFx0J3JlY2VpdmVFbnRpdHlBbmRSZXNvbHZlJyxcblx0XHRyZWxhdGlvbkVudGl0eVxuXHQpO1xuXHR5aWVsZCBkaXNwYXRjaChcblx0XHRSRURVQ0VSX0tFWSxcblx0XHQncmVjZWl2ZVJlbGF0ZWRFbnRpdGllcycsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkLFxuXHRcdHJlbGF0aW9uTmFtZSxcblx0XHRbIHJlbGF0aW9uRW50aXR5LmlkIF1cblx0KTtcblx0eWllbGQgZGlzcGF0Y2goXG5cdFx0UkVEVUNFUl9LRVksXG5cdFx0J3JlY2VpdmVEaXJ0eVJlbGF0aW9uQWRkaXRpb24nLFxuXHRcdHJlbGF0aW9uTmFtZSxcblx0XHRyZWxhdGlvbkVudGl0eS5pZCxcblx0XHRtb2RlbE5hbWUsXG5cdFx0ZW50aXR5SWQsXG5cdCk7XG59XG5cbi8qKlxuICogQWN0aW9uIGdlbmVyYXRvciB5aWVsZGluZyBhY3Rpb25zIHRoYXQgYWRkIHRoZSByZWxhdGlvbiB0byB0aGUgc3RhdGUgZm9yXG4gKiBtdWx0aXBsZSByZWxhdGlvbiBlbnRpdGllcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gZW50aXR5SWRcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbk5hbWVcbiAqIEBwYXJhbSB7QXJyYXk8QmFzZUVudGl0eT59IHJlbGF0aW9uRW50aXRpZXNcbiAqL1xuZnVuY3Rpb24qIGNyZWF0ZVJlbGF0aW9ucyhcblx0bW9kZWxOYW1lLFxuXHRlbnRpdHlJZCxcblx0cmVsYXRpb25OYW1lLFxuXHRyZWxhdGlvbkVudGl0aWVzLFxuKSB7XG5cdHJlbGF0aW9uTmFtZSA9IHBsdXJhbE1vZGVsTmFtZSggcmVsYXRpb25OYW1lICk7XG5cdGNvbnN0IHNpbmd1bGFyUmVsYXRpb25OYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIHJlbGF0aW9uTmFtZSApO1xuXHRjb25zdCBwbHVyYWxSZWxhdGlvbk5hbWUgPSBwbHVyYWxNb2RlbE5hbWUoIHJlbGF0aW9uTmFtZSApO1xuXG5cdHRyeSB7XG5cdFx0YXNzZXJ0QXJyYXlIYXNFbnRpdGllc0Zvck1vZGVsKCByZWxhdGlvbkVudGl0aWVzLCBzaW5ndWxhclJlbGF0aW9uTmFtZSApO1xuXHR9IGNhdGNoICggZXhjZXB0aW9uICkge1xuXHRcdHdhcm5pbmcoXG5cdFx0XHRmYWxzZSxcblx0XHRcdCdJbmNvbWluZyByZWxhdGlvbiBFbnRpdGllcyBkbyBub3QgY29udGFpbiBCYXNlRW50aXR5IGluc3RhbmNlcyAnICtcblx0XHRcdCdmb3IgdGhlIGdpdmVuIHJlbGF0aW9uIG1vZGVsICglcyknLFxuXHRcdFx0JycsXG5cdFx0XHRzaW5ndWxhclJlbGF0aW9uTmFtZSxcblx0XHQpO1xuXHRcdHJldHVybjtcblx0fVxuXHRjb25zdCByZWxhdGlvbklkcyA9IGdldElkc0Zyb21CYXNlRW50aXR5QXJyYXkoIHJlbGF0aW9uRW50aXRpZXMgKTtcblx0eWllbGQgZGlzcGF0Y2goXG5cdFx0UkVEVUNFUl9LRVksXG5cdFx0J3JlY2VpdmVFbnRpdGllc0FuZFJlc29sdmUnLFxuXHRcdHNpbmd1bGFyUmVsYXRpb25OYW1lLFxuXHRcdHJlbGF0aW9uRW50aXRpZXNcblx0KTtcblx0eWllbGQgZGlzcGF0Y2goXG5cdFx0UkVEVUNFUl9LRVksXG5cdFx0J3JlY2VpdmVSZWxhdGVkRW50aXRpZXMnLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHlJZCxcblx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0cmVsYXRpb25JZHMsXG5cdCk7XG5cdGNvbnN0IG1vZGVsRW50aXR5ID0geWllbGQgcmVzb2x2ZVNlbGVjdChcblx0XHRSRURVQ0VSX0tFWSxcblx0XHQnZ2V0RW50aXR5QnlJZCcsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkLFxuXHQpO1xuXHR5aWVsZCBkaXNwYXRjaChcblx0XHQnY29yZS9kYXRhJyxcblx0XHQnZmluaXNoUmVzb2x1dGlvbicsXG5cdFx0UkVEVUNFUl9LRVksXG5cdFx0J2dldFJlbGF0ZWRFbnRpdGllcycsXG5cdFx0WyBtb2RlbEVudGl0eSwgcGx1cmFsUmVsYXRpb25OYW1lIF1cblx0KTtcblx0Y29uc3QgcmVsYXRpb25zVG9SZXNvbHZlID0gWyAuLi5yZWxhdGlvbkVudGl0aWVzIF07XG5cdHdoaWxlICggcmVsYXRpb25zVG9SZXNvbHZlLmxlbmd0aCA+IDAgKSB7XG5cdFx0Y29uc3QgcmVsYXRpb25FbnRpdHkgPSByZWxhdGlvbnNUb1Jlc29sdmUucG9wKCk7XG5cdFx0eWllbGQgZGlzcGF0Y2goXG5cdFx0XHRSRURVQ0VSX0tFWSxcblx0XHRcdCdyZWNlaXZlRGlydHlSZWxhdGlvbkFkZGl0aW9uJyxcblx0XHRcdHJlbGF0aW9uTmFtZSxcblx0XHRcdHJlbGF0aW9uRW50aXR5LmlkLFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0ZW50aXR5SWQsXG5cdFx0KTtcblx0XHR5aWVsZCBkaXNwYXRjaChcblx0XHRcdCdjb3JlL2RhdGEnLFxuXHRcdFx0J2ZpbmlzaFJlc29sdXRpb24nLFxuXHRcdFx0UkVEVUNFUl9LRVksXG5cdFx0XHQnZ2V0UmVsYXRlZEVudGl0aWVzJyxcblx0XHRcdFsgcmVsYXRpb25FbnRpdHksIHBsdXJhbE1vZGVsTmFtZSggbW9kZWxOYW1lICkgXVxuXHRcdCk7XG5cdH1cbn1cblxuLyoqXG4gKiBUaGlzIGFjdGlvbiBpcyB1c2VkIHRvIGVuc3VyZSBhIHJlbGF0aW9uIEVudGl0eSByZWxhdGVkIHRvIHRoZSBnaXZlblxuICogbW9kZWwgZW50aXR5IGlkIGlzIGJvdGggYWRkZWQgdG8gdGhlIHN0YXRlIGFuZCB2YXJpb3VzIHNlbGVjdG9ycyBmb3IgdGhlc2VcbiAqIGFyZSByZXNvbHZlZCBzbyBubyBhZGRpdGlvbmFsIHJlc29sdXRpb24gaGFwcGVucyBmb3IgdGhlc2UuXG4gKlxuICogVGhlIHB1cnBvc2UgZm9yIHRoaXMgYWN0aW9uIGlzIHRvIGFsbG93IGZvciBkb2luZyBtb3JlIGVmZmljaWVudCBiYXRjaFxuICogcXVlcmllcyBvZiBlbnRpdGllcyBmcm9tIGFuIGFwaSByZXF1ZXN0IGFuZCB0aGVuIHRyaWdnZXJpbmcgdGhlIHJlc29sdXRpb24gb2ZcbiAqIGFueSBtb3JlIGdyYW51bGFyIHNlbGVjdG9ycyB0aGF0IGhhdmUgcmVzb2x2ZXJzLiAgVGhpcyBiYXNpY2FsbHkgYWxsb3dzIG9uZVxuICogdG8gaHlkcmF0ZSB0aGUgYGV2ZW50ZXNwcmVzc28vY29yZWAgc3RhdGUgd2l0aCBtb3JlIGVmZmljaWVudCBxdWVyaWVzLlxuICpcbiAqIEBwYXJhbSB7QmFzZUVudGl0eX0gcmVsYXRpb25FbnRpdHlcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gbW9kZWxJZFxuICovXG5mdW5jdGlvbiogcmVzb2x2ZVJlbGF0aW9uUmVjb3JkRm9yUmVsYXRpb24oXG5cdHJlbGF0aW9uRW50aXR5LFxuXHRtb2RlbE5hbWUsXG5cdG1vZGVsSWRcbikge1xuXHRjb25zdCBzaW5ndWxhclJlbGF0aW9uTmFtZSA9IHNpbmd1bGFyTW9kZWxOYW1lKCByZWxhdGlvbkVudGl0eS5tb2RlbE5hbWUgKTtcblx0Y29uc3QgcGx1cmFsUmVsYXRpb25OYW1lID0gcGx1cmFsTW9kZWxOYW1lKCByZWxhdGlvbkVudGl0eS5tb2RlbE5hbWUgKTtcblx0Y29uc3QgaGFzRW50aXR5ID0geWllbGQgc2VsZWN0KFxuXHRcdCdjb3JlL2RhdGEnLFxuXHRcdCdoYXNGaW5pc2hlZFJlc29sdXRpb24nLFxuXHRcdFJFRFVDRVJfS0VZLFxuXHRcdCdnZXRFbnRpdHlCeUlkJyxcblx0XHRbIHNpbmd1bGFyUmVsYXRpb25OYW1lLCByZWxhdGlvbkVudGl0eS5pZCBdXG5cdCk7XG5cdHJlbGF0aW9uRW50aXR5ID0gaGFzRW50aXR5ID9cblx0XHR5aWVsZCBzZWxlY3QoXG5cdFx0XHRSRURVQ0VSX0tFWSxcblx0XHRcdCdnZXRFbnRpdHlCeUlkJyxcblx0XHRcdHNpbmd1bGFyUmVsYXRpb25OYW1lLFxuXHRcdFx0cmVsYXRpb25FbnRpdHkuaWRcblx0XHQpIDpcblx0XHRyZWxhdGlvbkVudGl0eTtcblx0aWYgKCAhIGhhc0VudGl0eSApIHtcblx0XHR5aWVsZCBkaXNwYXRjaChcblx0XHRcdFJFRFVDRVJfS0VZLFxuXHRcdFx0J3JlY2VpdmVFbnRpdHlBbmRSZXNvbHZlJyxcblx0XHRcdHJlbGF0aW9uRW50aXR5XG5cdFx0KTtcblx0fVxuXHR5aWVsZCBkaXNwYXRjaChcblx0XHRSRURVQ0VSX0tFWSxcblx0XHQncmVjZWl2ZVJlbGF0ZWRFbnRpdGllcycsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdG1vZGVsSWQsXG5cdFx0cGx1cmFsUmVsYXRpb25OYW1lLFxuXHRcdFsgcmVsYXRpb25FbnRpdHkuaWQgXVxuXHQpO1xuXHRjb25zdCBtb2RlbEVudGl0eSA9IHlpZWxkIHJlc29sdmVTZWxlY3QoXG5cdFx0UkVEVUNFUl9LRVksXG5cdFx0J2dldEVudGl0eUJ5SWQnLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRtb2RlbElkXG5cdCk7XG5cdHlpZWxkIGRpc3BhdGNoKFxuXHRcdCdjb3JlL2RhdGEnLFxuXHRcdCdmaW5pc2hSZXNvbHV0aW9uJyxcblx0XHRSRURVQ0VSX0tFWSxcblx0XHQnZ2V0UmVsYXRlZEVudGl0aWVzJyxcblx0XHRbIG1vZGVsRW50aXR5LCBwbHVyYWxSZWxhdGlvbk5hbWUgXVxuXHQpO1xuXHR5aWVsZCBkaXNwYXRjaChcblx0XHQnY29yZS9kYXRhJyxcblx0XHQnZmluaXNoUmVzb2x1dGlvbicsXG5cdFx0UkVEVUNFUl9LRVksXG5cdFx0J2dldFJlbGF0ZWRFbnRpdGllcycsXG5cdFx0WyByZWxhdGlvbkVudGl0eSwgcGx1cmFsTW9kZWxOYW1lKCBtb2RlbE5hbWUgKSBdXG5cdCk7XG59XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IHRoZSBwcm92aWRlZCBtYXAgaGFzIEJhc2VFbnRpdHkgaW5zdGFuY2VzIGZvciB0aGUgZXhwZWN0ZWRcbiAqIG1vZGVsIG5hbWUuXG4gKlxuICogQHBhcmFtIHtBcnJheTxCYXNlRW50aXR5Pn0gZW50aXRpZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbk1vZGVsTmFtZSBFeHBlY3RlZCB0byBiZSB0aGUgc2luZ3VsYXIgZm9ybSBmb3IgdGhlXG4gKiBtb2RlbE5hbWUuXG4gKiBAdGhyb3dzIEludmFsaWRNb2RlbEVudGl0eVxuICovXG5jb25zdCBhc3NlcnRBcnJheUhhc0VudGl0aWVzRm9yTW9kZWwgPSAoIGVudGl0aWVzLCByZWxhdGlvbk1vZGVsTmFtZSApID0+IHtcblx0Zm9yICggY29uc3QgZW50aXR5IG9mIGVudGl0aWVzICkge1xuXHRcdGlmICggISBpc01vZGVsRW50aXR5T2ZNb2RlbCggZW50aXR5LCByZWxhdGlvbk1vZGVsTmFtZSApICkge1xuXHRcdFx0dGhyb3cgbmV3IEludmFsaWRNb2RlbEVudGl0eSggJycsIGVudGl0eSApO1xuXHRcdH1cblx0fVxufTtcblxuZXhwb3J0IHsgY3JlYXRlUmVsYXRpb24sIGNyZWF0ZVJlbGF0aW9ucywgcmVzb2x2ZVJlbGF0aW9uUmVjb3JkRm9yUmVsYXRpb24gfTtcbiIsIi8qKlxuICogSW50ZXJuYWwgSW1wb3J0c1xuICovXG5pbXBvcnQgeyByZW1vdmVFbnRpdHlCeUlkIH0gZnJvbSAnLi9yZW1vdmUtZW50aXRpZXMnO1xuaW1wb3J0IHtcblx0cmVjZWl2ZVRyYXNoRW50aXR5SWQsXG5cdHJlY2VpdmVEZWxldGVFbnRpdHlJZCxcbn0gZnJvbSAnLi9yZWNlaXZlLWVudGl0aWVzJztcbmltcG9ydCB7IHJlbW92ZUFsbFJlbGF0ZWRFbnRpdGllc0Zvck1vZGVsRW50aXR5IH0gZnJvbSAnLi9yZW1vdmUtcmVsYXRpb25zJztcblxuLyoqXG4gKiBBY3Rpb24gZ2VuZXJhdG9yIHlpZWxkaW5nIGFjdGlvbnMgZm9yIHF1ZXVpbmcgYW4gZW50aXR5IGRlbGV0ZSByZWNvcmRcbiAqIGluIHRoZSBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gZW50aXR5SWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uKiBkZWxldGVFbnRpdHlCeUlkKCBtb2RlbE5hbWUsIGVudGl0eUlkICkge1xuXHR5aWVsZCByZW1vdmVFbnRpdHlCeUlkKCBtb2RlbE5hbWUsIGVudGl0eUlkICk7XG5cdC8vIHJlbW92ZSBhbnkgcmVsYXRpb24gcmVjb3JkcyBmb3IgdGhpcyBlbnRpdHlcblx0eWllbGQgcmVtb3ZlQWxsUmVsYXRlZEVudGl0aWVzRm9yTW9kZWxFbnRpdHkoIG1vZGVsTmFtZSwgZW50aXR5SWQgKTtcblx0eWllbGQgcmVjZWl2ZURlbGV0ZUVudGl0eUlkKCBtb2RlbE5hbWUsIGVudGl0eUlkICk7XG59XG5cbi8qKlxuICogQWN0aW9uIGdlbmVyYXRvciB5aWVsZGluZyBhY3Rpb25zIGZvciBxdWV1ZWluZyBhbiBlbnRpdHkgdHJhc2ggcmVjb3JkIGluIHRoZVxuICogc3RhdGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IGVudGl0eUlkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiogdHJhc2hFbnRpdHlCeUlkKCBtb2RlbE5hbWUsIGVudGl0eUlkICkge1xuXHR5aWVsZCByZW1vdmVFbnRpdHlCeUlkKCBtb2RlbE5hbWUsIGVudGl0eUlkICk7XG5cdHlpZWxkIHJlbW92ZUFsbFJlbGF0ZWRFbnRpdGllc0Zvck1vZGVsRW50aXR5KCBtb2RlbE5hbWUsIGVudGl0eUlkICk7XG5cdHlpZWxkIHJlY2VpdmVUcmFzaEVudGl0eUlkKCBtb2RlbE5hbWUsIGVudGl0eUlkICk7XG59XG4iLCIvKipcbiAqIEludGVybmFsIEltcG9ydHNcbiAqL1xuaW1wb3J0IHsgcmVtb3ZlRW50aXR5QnlJZCB9IGZyb20gJy4vcmVtb3ZlLWVudGl0aWVzJztcbmltcG9ydCB7XG5cdHJlY2VpdmVEaXJ0eVJlbGF0aW9uRGVsZXRpb24sXG59IGZyb20gJy4vcmVjZWl2ZS1yZWxhdGlvbnMnO1xuaW1wb3J0IHtcblx0cmVtb3ZlRGlydHlSZWxhdGlvbkFkZGl0aW9uLFxuXHRyZW1vdmVSZWxhdGVkRW50aXRpZXMsXG59IGZyb20gJy4vcmVtb3ZlLXJlbGF0aW9ucyc7XG4vKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHtcblx0c2luZ3VsYXJNb2RlbE5hbWUsXG5cdHBsdXJhbE1vZGVsTmFtZSxcbn0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vbW9kZWwnO1xuXG4vKipcbiAqIEFjdGlvbiBnZW5lcmF0b3IgeWllbGRpbmcgYWN0aW9ucyBmb3IgaGFuZGxpbmcgcmVtb3ZpbmcgdGhlIHF1ZXVlZCByZWxhdGlvbnNcbiAqIGZvciBhZGRpdGlvbiBpbiB0aGUgc3RhdGVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gZW50aXR5SWRcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbk5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSByZWxhdGlvbkVudGl0eUlkXG4gKi9cbmZ1bmN0aW9uKiByZW1vdmVEaXJ0eVJlbGF0aW9uRm9yQWRkaXRpb24oXG5cdG1vZGVsTmFtZSxcblx0ZW50aXR5SWQsXG5cdHJlbGF0aW9uTmFtZSxcblx0cmVsYXRpb25FbnRpdHlJZCxcbikge1xuXHR5aWVsZCByZW1vdmVEaXJ0eVJlbGF0aW9uQWRkaXRpb24oXG5cdFx0cmVsYXRpb25OYW1lLFxuXHRcdHJlbGF0aW9uRW50aXR5SWQsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkLFxuXHQpO1xufVxuXG4vKipcbiAqIEFjdGlvbiBnZW5lcmF0b3IgeWllbGRpbmcgYWN0aW9ucyBmb3IgYWN0aW9ucyBmb3IgcXVldWluZyB0aGUgcmVtb3ZhbCBvZiBhXG4gKiByZWxhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gZW50aXR5SWRcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbk5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSByZWxhdGlvbkVudGl0eUlkXG4gKi9cbmZ1bmN0aW9uKiByZW1vdmVSZWxhdGlvbkZvckVudGl0eShcblx0bW9kZWxOYW1lLFxuXHRlbnRpdHlJZCxcblx0cmVsYXRpb25OYW1lLFxuXHRyZWxhdGlvbkVudGl0eUlkXG4pIHtcblx0Y29uc3Qgc2luZ3VsYXJSZWxhdGlvbk5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggcmVsYXRpb25OYW1lICk7XG5cdGNvbnN0IHBsdXJhbFJlbGF0aW9uTmFtZSA9IHBsdXJhbE1vZGVsTmFtZSggcmVsYXRpb25OYW1lICk7XG5cdHlpZWxkIHJlbW92ZUVudGl0eUJ5SWQoIHNpbmd1bGFyUmVsYXRpb25OYW1lLCByZWxhdGlvbkVudGl0eUlkICk7XG5cdHlpZWxkIHJlbW92ZVJlbGF0ZWRFbnRpdGllcyhcblx0XHRtb2RlbE5hbWUsXG5cdFx0ZW50aXR5SWQsXG5cdFx0cmVsYXRpb25OYW1lLFxuXHRcdFsgcmVsYXRpb25FbnRpdHlJZCBdLFxuXHQpO1xuXHR5aWVsZCByZW1vdmVEaXJ0eVJlbGF0aW9uQWRkaXRpb24oXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkLFxuXHRcdHJlbGF0aW9uTmFtZSxcblx0XHRyZWxhdGlvbkVudGl0eUlkLFxuXHQpO1xuXHR5aWVsZCByZWNlaXZlRGlydHlSZWxhdGlvbkRlbGV0aW9uKFxuXHRcdHBsdXJhbFJlbGF0aW9uTmFtZSxcblx0XHRyZWxhdGlvbkVudGl0eUlkLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHlJZFxuXHQpO1xufVxuXG5leHBvcnQgeyByZW1vdmVEaXJ0eVJlbGF0aW9uRm9yQWRkaXRpb24sIHJlbW92ZVJlbGF0aW9uRm9yRW50aXR5IH07XG4iLCJleHBvcnQgKiBmcm9tICcuL2FjdGlvbi1jcmVhdG9ycyc7XG5leHBvcnQgKiBmcm9tICcuL2FjdGlvbi1nZW5lcmF0b3JzJztcbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0cy5cbiAqL1xuaW1wb3J0IHtcblx0aXNNb2RlbEVudGl0eU9mTW9kZWwsXG5cdGlzTW9kZWxFbnRpdHlGYWN0b3J5T2ZNb2RlbCxcbn0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vdmFsaWRhdG9ycyc7XG5pbXBvcnQge1xuXHRhcHBseVF1ZXJ5U3RyaW5nLFxuXHRrZXlFbnRpdGllc0J5UHJpbWFyeUtleVZhbHVlLFxufSBmcm9tICdAZXZlbnRlc3ByZXNzby9tb2RlbCc7XG5pbXBvcnQgeyBpc0VtcHR5LCBpc0FycmF5IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJ3dhcm5pbmcnO1xuXG4vKipcbiAqIEludGVybmFsIGltcG9ydHMuXG4gKi9cbmltcG9ydCB7XG5cdGZldGNoLFxuXHRzZWxlY3QsXG5cdGRpc3BhdGNoLFxuXHRyZXNvbHZlU2VsZWN0LFxuXHRyZXNvbHZlRGlzcGF0Y2gsXG59IGZyb20gJy4uLy4uL2Jhc2UtY29udHJvbHMnO1xuaW1wb3J0IHtcblx0cmVtb3ZlRW50aXR5QnlJZCxcblx0cmVtb3ZlRGVsZXRlRW50aXR5SWQsXG5cdHJlbW92ZVRyYXNoRW50aXR5SWQsXG59IGZyb20gJy4vcmVtb3ZlLWVudGl0aWVzJztcbmltcG9ydCB7IHJlY2VpdmVBbmRSZXBsYWNlRW50aXR5UmVjb3JkcyB9IGZyb20gJy4vcmVjZWl2ZS1lbnRpdGllcyc7XG5pbXBvcnQgeyByZWNlaXZlVXBkYXRlZEVudGl0eUlkRm9yUmVsYXRpb25zIH0gZnJvbSAnLi9yZWNlaXZlLXJlbGF0aW9ucyc7XG5pbXBvcnQgeyBSRURVQ0VSX0tFWSBhcyBDT1JFX1JFRFVDRVJfS0VZIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFJFRFVDRVJfS0VZIGFzIFNDSEVNQV9SRURVQ0VSX0tFWSB9IGZyb20gJy4uLy4uL3NjaGVtYS9jb25zdGFudHMnO1xuXG5jb25zdCBERUZBVUxUX0VNUFRZX09CSkVDVCA9IHt9O1xuY29uc3QgREVGQVVMVF9FTVBUWV9BUlJBWSA9IFtdO1xuXG4vKipcbiAqIEFjdGlvbiBnZW5lcmF0b3IgZm9yIHBlcnNpc3RpbmcgYW4gZW50aXR5IHJlY29yZCAoaW5zZXJ0L3VwZGF0ZSlcbiAqIHRvIHRoZSBzZXJ2ZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtCYXNlRW50aXR5fSBlbnRpdHlcbiAqIEByZXR1cm4ge251bGx8QmFzZUVudGl0eX0gSWYgc3VjY2Vzc2Z1bGx5IHBlcnNpc3RlZCB0aGUgcGVyc2lzdGVkIGVudGl0eSBpc1xuICogcmV0dXJuZWQuICBPdGhlcndpc2UgbnVsbC5cbiAqL1xuZnVuY3Rpb24qIHBlcnNpc3RFbnRpdHlSZWNvcmQoIG1vZGVsTmFtZSwgZW50aXR5ICkge1xuXHQvLyBjaGVjayBpZiBpcyBhbiBpbnN0YW5jZSBvZiBCYXNlRW50aXR5XG5cdGlmICggISBpc01vZGVsRW50aXR5T2ZNb2RlbCggZW50aXR5LCBtb2RlbE5hbWUgKSApIHtcblx0XHR3YXJuaW5nKFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHQnVGhlIHByb3ZpZGVkIGVudGl0eSBpcyBub3QgYSBCYXNlRW50aXR5IGNoaWxkIGZvciB0aGUgJyArXG5cdFx0XHQncHJvdmlkZWQgbW9kZWwuJ1xuXHRcdCk7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0Ly8gY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBjaGFuZ2VzIGluIHRoZSBlbnRpdHlcblx0aWYgKCBlbnRpdHkuaXNDbGVhbiApIHtcblx0XHR3YXJuaW5nKFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHQnVGhlIGVudGl0eSBwcm92aWRlZCBoYXMgbm8gY2hhbmdlcyB0byBwZXJzaXN0Lidcblx0XHQpO1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cdGNvbnN0IGZhY3RvcnkgPSB5aWVsZCByZXNvbHZlU2VsZWN0KFxuXHRcdFNDSEVNQV9SRURVQ0VSX0tFWSxcblx0XHQnZ2V0RmFjdG9yeUZvck1vZGVsJyxcblx0XHRtb2RlbE5hbWVcblx0KTtcblx0aWYgKCAhIGlzTW9kZWxFbnRpdHlGYWN0b3J5T2ZNb2RlbCggZmFjdG9yeSwgbW9kZWxOYW1lICkgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0Y29uc3QgcGF0aCA9IGFwcGx5UXVlcnlTdHJpbmcoIG1vZGVsTmFtZSApO1xuXHRjb25zdCB1cGRhdGVkRW50aXR5ID0geWllbGQgZmV0Y2goIHtcblx0XHRwYXRoOiBlbnRpdHkuaXNOZXcgPyBwYXRoIDogcGF0aCArICcvJyArIGVudGl0eS5pZCxcblx0XHRtZXRob2Q6IGVudGl0eS5pc05ldyA/ICdQT1NUJyA6ICdQVVQnLFxuXHRcdGRhdGE6IGVudGl0eS5mb3JQZXJzaXN0LFxuXHR9ICk7XG5cdGlmICggaXNFbXB0eSggdXBkYXRlZEVudGl0eSApICkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cdGNvbnN0IHVwZGF0ZWRFbnRpdHlSZWNvcmQgPSBmYWN0b3J5LmZyb21FeGlzdGluZyggdXBkYXRlZEVudGl0eSApO1xuXHRjb25zdCBuZXdJZCA9IHVwZGF0ZWRFbnRpdHlSZWNvcmQuaWQ7XG5cdGlmICggZW50aXR5LmlzTmV3ICkge1xuXHRcdHlpZWxkIHJlbW92ZUVudGl0eUJ5SWQoIG1vZGVsTmFtZSwgZW50aXR5LmlkICk7XG5cdFx0eWllbGQgZGlzcGF0Y2goXG5cdFx0XHQnY29yZS9kYXRhJyxcblx0XHRcdCdmaW5pc2hSZXNvbHV0aW9uJyxcblx0XHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0XHQnZ2V0RW50aXR5QnlJZCcsXG5cdFx0XHRbIG1vZGVsTmFtZSwgbmV3SWQgXVxuXHRcdCk7XG5cdFx0eWllbGQgcmVjZWl2ZVVwZGF0ZWRFbnRpdHlJZEZvclJlbGF0aW9ucyggbW9kZWxOYW1lLCBlbnRpdHkuaWQsIG5ld0lkICk7XG5cdH1cblx0eWllbGQgcmVjZWl2ZUFuZFJlcGxhY2VFbnRpdHlSZWNvcmRzKFxuXHRcdG1vZGVsTmFtZSxcblx0XHRbIHVwZGF0ZWRFbnRpdHlSZWNvcmQgXVxuXHQpO1xuXHRyZXR1cm4gdXBkYXRlZEVudGl0eVJlY29yZDtcbn1cblxuLyoqXG4gKiBBY3Rpb24gZ2VuZXJhdG9yIGZvciBwZXJzaXN0aW5nIGVudGl0aWVzIHdpdGggdGhlIGdpdmVuIGlkIHRvIHRoZSBzZXJ2ZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IGVudGl0eUlkXG4gKiBAcmV0dXJuIHtCYXNlRW50aXR5fG51bGx9IElmIHRoZSBlbnRpdHkgaXMgc3VjY2Vzc2Z1bGx5IHBlcnNpc3RlZCBpdCBpc1xuICogcmV0dXJuZWQgKG1heSBoYXZlIGEgbmV3IGlkISksIG90aGVyd2lzZSBudWxsIGlzIHJldHVybmVkLlxuICovXG5mdW5jdGlvbiogcGVyc2lzdEZvckVudGl0eUlkKCBtb2RlbE5hbWUsIGVudGl0eUlkICkge1xuXHRjb25zdCBlbnRpdHkgPSB5aWVsZCByZXNvbHZlU2VsZWN0KFxuXHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0J2dldEVudGl0eUJ5SWQnLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHlJZCxcblx0KTtcblx0aWYgKCBpc01vZGVsRW50aXR5T2ZNb2RlbCggZW50aXR5LCBtb2RlbE5hbWUgKSApIHtcblx0XHRjb25zdCBwZXJzaXN0ZWRFbnRpdHkgPSB5aWVsZCBkaXNwYXRjaChcblx0XHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0XHQncGVyc2lzdEVudGl0eVJlY29yZCcsXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRlbnRpdHlcblx0XHQpO1xuXHRcdHJldHVybiBpc01vZGVsRW50aXR5T2ZNb2RlbCggcGVyc2lzdGVkRW50aXR5LCBtb2RlbE5hbWUgKSA/XG5cdFx0XHRwZXJzaXN0ZWRFbnRpdHkgOlxuXHRcdFx0bnVsbDtcblx0fVxuXHRyZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBBY3Rpb24gZ2VuZXJhdG9yIGZvciBwZXJzaXN0aW5nIGVudGl0aWVzIHdpdGggdGhlIGdpdmVuIGlkcyB0byB0aGUgc2VydmVyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7QXJyYXl9IGVudGl0eUlkc1xuICogQHJldHVybiB7T2JqZWN0fSBFbnRpdGllcyBwZXJzaXN0ZWQgaW5kZXhlZCBieSBJRC5cbiAqL1xuZnVuY3Rpb24qIHBlcnNpc3RGb3JFbnRpdHlJZHMoIG1vZGVsTmFtZSwgZW50aXR5SWRzID0gW10gKSB7XG5cdGNvbnN0IGVudGl0aWVzID0geWllbGQgc2VsZWN0KFxuXHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0J2dldEVudGl0aWVzQnlJZHMnLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHlJZHMsXG5cdCk7XG5cdGNvbnN0IHJldHJpZXZlZEVudGl0aWVzID0gaXNBcnJheSggZW50aXRpZXMgKSA/XG5cdFx0a2V5RW50aXRpZXNCeVByaW1hcnlLZXlWYWx1ZSggJ2V2ZW50JywgZW50aXRpZXMgKSA6XG5cdFx0bmV3IE1hcCgpO1xuXHRjb25zdCByZXRyaWV2ZWRJZHMgPSBBcnJheS5mcm9tKCByZXRyaWV2ZWRFbnRpdGllcy5rZXlzKCkgKTtcblx0aWYgKCByZXRyaWV2ZWRJZHMubGVuZ3RoIDwgMSApIHtcblx0XHRyZXR1cm4gREVGQVVMVF9FTVBUWV9PQkpFQ1Q7XG5cdH1cblx0Y29uc3QgcGVyc2lzdGVkRW50aXRpZXMgPSB7fTtcblx0d2hpbGUgKCByZXRyaWV2ZWRJZHMubGVuZ3RoID4gMCApIHtcblx0XHRjb25zdCBwZXJzaXN0ZWRFbnRpdHkgPSB5aWVsZCBkaXNwYXRjaChcblx0XHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0XHQncGVyc2lzdEVudGl0eVJlY29yZCcsXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRyZXRyaWV2ZWRFbnRpdGllcy5nZXQoIHJldHJpZXZlZElkcy5wb3AoKSApXG5cdFx0KTtcblx0XHRpZiAoIGlzTW9kZWxFbnRpdHlPZk1vZGVsKCBwZXJzaXN0ZWRFbnRpdHksIG1vZGVsTmFtZSApICkge1xuXHRcdFx0cGVyc2lzdGVkRW50aXRpZXNbIHBlcnNpc3RlZEVudGl0eS5pZCBdID0gcGVyc2lzdGVkRW50aXR5O1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcGVyc2lzdGVkRW50aXRpZXM7XG59XG5cbi8qKlxuICogQWN0aW9uIGdlbmVyYXRvciBmb3IgcGVyc2lzdGluZyBhbnkgcXVldWVkIGRlbGV0ZXMgZm9yIHRoZSBnaXZlbiBtb2RlbC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgZW50aXR5IGlkcyBmb3IgZW50aXRpZXMgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQuXG4gKi9cbmZ1bmN0aW9uKiBwZXJzaXN0RGVsZXRlc0Zvck1vZGVsKCBtb2RlbE5hbWUgKSB7XG5cdGNvbnN0IGVudGl0eUlkcyA9IHlpZWxkIHNlbGVjdChcblx0XHRDT1JFX1JFRFVDRVJfS0VZLFxuXHRcdCdnZXRFbnRpdHlJZHNRdWV1ZWRGb3JEZWxldGUnLFxuXHRcdG1vZGVsTmFtZVxuXHQpO1xuXHRpZiAoIGVudGl0eUlkcy5sZW5ndGggPCAwICkge1xuXHRcdHJldHVybiBERUZBVUxUX0VNUFRZX0FSUkFZO1xuXHR9XG5cdGNvbnN0IGRlbGV0ZWRJZHMgPSBbXTtcblx0d2hpbGUgKCBlbnRpdHlJZHMubGVuZ3RoID4gMCApIHtcblx0XHRjb25zdCBlbnRpdHlJZCA9IGVudGl0eUlkcy5wb3AoKTtcblx0XHRjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKCB7XG5cdFx0XHRwYXRoOiBhcHBseVF1ZXJ5U3RyaW5nKCBtb2RlbE5hbWUgKSArICcvJyArIGVudGl0eUlkLFxuXHRcdFx0ZGF0YTogeyBmb3JjZTogdHJ1ZSB9LFxuXHRcdFx0bWV0aG9kOiAnREVMRVRFJyxcblx0XHR9ICk7XG5cdFx0aWYgKCByZXNwb25zZS5kZWxldGVkICkge1xuXHRcdFx0ZGVsZXRlZElkcy5wdXNoKCBlbnRpdHlJZCApO1xuXHRcdFx0eWllbGQgcmVtb3ZlRGVsZXRlRW50aXR5SWQoIG1vZGVsTmFtZSwgZW50aXR5SWQgKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGRlbGV0ZWRJZHM7XG59XG5cbi8qKlxuICogQWN0aW9uIGdlbmVyYXRvciBmb3IgcGVyc2lzdGluZyBhbnkgcXVldWVkIHRyYXNoZXMgZm9yIHRoZSBnaXZlbiBtb2RlbC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgZW50aXR5IGlkcyBmb3IgZW50aXRpZXMgc3VjY2Vzc2Z1bGx5IHRyYXNoZWQuXG4gKi9cbmZ1bmN0aW9uKiBwZXJzaXN0VHJhc2hlc0Zvck1vZGVsKCBtb2RlbE5hbWUgKSB7XG5cdGNvbnN0IGVudGl0eUlkcyA9IHlpZWxkIHNlbGVjdChcblx0XHRDT1JFX1JFRFVDRVJfS0VZLFxuXHRcdCdnZXRFbnRpdHlJZHNRdWV1ZWRGb3JUcmFzaCcsXG5cdFx0bW9kZWxOYW1lXG5cdCk7XG5cdGlmICggZW50aXR5SWRzLmxlbmd0aCA8IDEgKSB7XG5cdFx0cmV0dXJuIERFRkFVTFRfRU1QVFlfQVJSQVk7XG5cdH1cblx0Y29uc3QgdHJhc2hlZElkcyA9IFtdO1xuXHR3aGlsZSAoIGVudGl0eUlkcy5sZW5ndGggPiAwICkge1xuXHRcdGNvbnN0IGVudGl0eUlkID0gZW50aXR5SWRzLnBvcCgpO1xuXHRcdGNvbnN0IHN1Y2Nlc3MgPSB5aWVsZCBmZXRjaCgge1xuXHRcdFx0cGF0aDogYXBwbHlRdWVyeVN0cmluZyggbW9kZWxOYW1lICkgKyAnLycgKyBlbnRpdHlJZCxcblx0XHRcdG1ldGhvZDogJ0RFTEVURScsXG5cdFx0fSApO1xuXHRcdGlmICggc3VjY2VzcyApIHtcblx0XHRcdHRyYXNoZWRJZHMucHVzaCggZW50aXR5SWQgKTtcblx0XHRcdHlpZWxkIHJlbW92ZVRyYXNoRW50aXR5SWQoIG1vZGVsTmFtZSwgZW50aXR5SWQgKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHRyYXNoZWRJZHM7XG59XG5cbi8qKlxuICogQWN0aW9uIGdlbmVyYXRvciBmb3IgcGVyc2lzdGluZyBxdWV1ZWQgZGVsZXRlIGFuZCB0cmFzaCBhY3Rpb25zIGZvciBhbGxcbiAqIG1vZGVscyBpbiB0aGUgc3RhdGUuXG4gKlxuICogQHJldHVybiB7T2JqZWN0fSBBbiBvYmplY3QgaW5kZXhlZCBieSBkZWxldGUvdHJhc2ggY29udGFpbmluZyBhbiBhcnJheSBvZlxuICogZW50aXR5IGlkcyB0aGF0IHdlcmUgcGVyc2lzdGVkLlxuICovXG5mdW5jdGlvbiogcGVyc2lzdEFsbERlbGV0ZXMoKSB7XG5cdGNvbnN0IG1vZGVsc0ZvckRlbGV0ZSA9IHlpZWxkIHNlbGVjdChcblx0XHRDT1JFX1JFRFVDRVJfS0VZLFxuXHRcdCdnZXRNb2RlbHNRdWV1ZWRGb3JEZWxldGUnXG5cdCk7XG5cdGlmICggbW9kZWxzRm9yRGVsZXRlLmxlbmd0aCA8IDEgKSB7XG5cdFx0cmV0dXJuIERFRkFVTFRfRU1QVFlfT0JKRUNUO1xuXHR9XG5cdGNvbnN0IGRlbGV0ZWRJZHMgPSB7fTtcblx0d2hpbGUgKCBtb2RlbHNGb3JEZWxldGUubGVuZ3RoID4gMCApIHtcblx0XHRjb25zdCBtb2RlbEZvckRlbGV0ZSA9IG1vZGVsc0ZvckRlbGV0ZS5wb3AoKTtcblx0XHRjb25zdCBpZHNEZWxldGVkID0geWllbGQgcmVzb2x2ZURpc3BhdGNoKFxuXHRcdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHRcdCdwZXJzaXN0RGVsZXRlc0Zvck1vZGVsJyxcblx0XHRcdG1vZGVsRm9yRGVsZXRlXG5cdFx0KTtcblx0XHRpZiAoICEgaXNFbXB0eSggaWRzRGVsZXRlZCApICkge1xuXHRcdFx0ZGVsZXRlZElkc1sgbW9kZWxGb3JEZWxldGUgXSA9IGlkc0RlbGV0ZWQ7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IG1vZGVsc0ZvclRyYXNoID0geWllbGQgc2VsZWN0KFxuXHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0J2dldE1vZGVsc1F1ZXVlZEZvclRyYXNoJ1xuXHQpO1xuXHRpZiAoIG1vZGVsc0ZvclRyYXNoLmxlbmd0aCA8IDEgKSB7XG5cdFx0cmV0dXJuIERFRkFVTFRfRU1QVFlfT0JKRUNUO1xuXHR9XG5cdGNvbnN0IHRyYXNoZWRJZHMgPSB7fTtcblx0d2hpbGUgKCBtb2RlbHNGb3JUcmFzaC5sZW5ndGggPiAwICkge1xuXHRcdGNvbnN0IG1vZGVsRm9yVHJhc2ggPSBtb2RlbHNGb3JUcmFzaC5wb3AoKTtcblx0XHRjb25zdCBpZHNUcmFzaGVkID0geWllbGQgcmVzb2x2ZURpc3BhdGNoKFxuXHRcdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHRcdCdwZXJzaXN0VHJhc2hlc0Zvck1vZGVsJyxcblx0XHRcdG1vZGVsRm9yVHJhc2hcblx0XHQpO1xuXHRcdGlmICggISBpc0VtcHR5KCBpZHNUcmFzaGVkICkgKSB7XG5cdFx0XHR0cmFzaGVkSWRzWyBtb2RlbEZvclRyYXNoIF0gPSBpZHNUcmFzaGVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4geyBkZWxldGVkOiBkZWxldGVkSWRzLCB0cmFzaGVkOiB0cmFzaGVkSWRzIH07XG59XG5cbmV4cG9ydCB7XG5cdHBlcnNpc3RFbnRpdHlSZWNvcmQsXG5cdHBlcnNpc3RGb3JFbnRpdHlJZCxcblx0cGVyc2lzdEZvckVudGl0eUlkcyxcblx0cGVyc2lzdERlbGV0ZXNGb3JNb2RlbCxcblx0cGVyc2lzdFRyYXNoZXNGb3JNb2RlbCxcblx0cGVyc2lzdEFsbERlbGV0ZXMsXG59O1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzLlxuICovXG5pbXBvcnQgeyBpc0VtcHR5LCBrZXlzIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBjdWlkIGZyb20gJ2N1aWQnO1xuaW1wb3J0IHsgaXNNb2RlbEVudGl0eU9mTW9kZWwgfSBmcm9tICdAZXZlbnRlc3ByZXNzby92YWxpZGF0b3JzJztcbmltcG9ydCB7IHNpbmd1bGFyTW9kZWxOYW1lLCBwbHVyYWxNb2RlbE5hbWUgfSBmcm9tICdAZXZlbnRlc3ByZXNzby9tb2RlbCc7XG5cbi8qKlxuICogSW50ZXJuYWwgaW1wb3J0cy5cbiAqL1xuaW1wb3J0IHtcblx0ZmV0Y2gsXG5cdHNlbGVjdCxcblx0cmVzb2x2ZURpc3BhdGNoLFxuXHRyZXNvbHZlU2VsZWN0LFxufSBmcm9tICcuLi8uLi9iYXNlLWNvbnRyb2xzJztcbmltcG9ydCB7IHJlbW92ZURpcnR5UmVsYXRpb25Gb3JUeXBlIH0gZnJvbSAnLi9yZW1vdmUtcmVsYXRpb25zJztcbmltcG9ydCB7IFJFRFVDRVJfS0VZIGFzIENPUkVfUkVEVUNFUl9LRVkgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgUkVEVUNFUl9LRVkgYXMgU0NIRU1BX1JFRFVDRVJfS0VZIH0gZnJvbSAnLi4vLi4vc2NoZW1hL2NvbnN0YW50cyc7XG5cbmNvbnN0IERFRkFVTFRfRU1QVFlfT0JKRUNUID0ge307XG5jb25zdCBERUZBVUxUX0VNUFRZX0FSUkFZID0gW107XG5cbi8qKlxuICogQWN0aW9uIGdlbmVyYXRvciBmb3IgcGVyc2lzdGluZyBhbnkgcXVldWVkIGFkZCByZWxhdGlvbnMgdG8gdGhlIHNlcnZlclxuICogc3BlY2lmaWMgdG8gdGhlIGdpdmVuIG1vZGVsIG5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHJldHVybiB7T2JqZWN0fSByZXR1cm5zIGFuIG9iamVjdCBpbmRleGVkIGJ5IHRoZSBvcmlnaW5hdGluZyBlbnRpdHkgaWQgZm9yXG4gKiB0aGUgcmVxdWVzdGVkIG1vZGVsIGFuZCB3aXRoIHZhbHVlcyB0aGF0IGFyZSBhbiBPYmplY3QgaW5kZXhlZCBieSByZWxhdGlvblxuICogbmFtZXMgd2l0aCB2YWx1ZXMgb2YgcmVsYXRpb24gSWRzIHBlcnNpc3RlZC5cbiAqL1xuZnVuY3Rpb24qIHBlcnNpc3RBZGRSZWxhdGlvbnNGb3JNb2RlbCggbW9kZWxOYW1lICkge1xuXHRtb2RlbE5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lICk7XG5cdHJldHVybiB5aWVsZCByZXNvbHZlRGlzcGF0Y2goXG5cdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHQncGVyc2lzdFJlbGF0aW9uc0Zvck1vZGVsJyxcblx0XHRtb2RlbE5hbWVcblx0KTtcbn1cblxuLyoqXG4gKiBBY3Rpb24gZ2VuZXJhdG9yIGZvciBwZXJzaXN0aW5nIGFueSBxdWV1ZWQgZGVsZXRlIHJlbGF0aW9ucyB0byB0aGUgc2VydmVyXG4gKiBzcGVjaWZpYyB0byB0aGUgZ2l2ZW4gbW9kZWwgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcmV0dXJuIHtPYmplY3R9IHJldHVybnMgYW4gb2JqZWN0IGluZGV4ZWQgYnkgdGhlIG9yaWdpbmF0aW5nIGVudGl0eSBpZCBmb3JcbiAqIHRoZSByZXF1ZXN0ZWQgbW9kZWwgYW5kIHdpdGggdmFsdWVzIHRoYXQgYXJlIGFuIE9iamVjdCBpbmRleGVkIGJ5IHJlbGF0aW9uXG4gKiBuYW1lcyB3aXRoIHZhbHVlcyBvZiByZWxhdGlvbiBJZHMgcGVyc2lzdGVkLlxuICovXG5mdW5jdGlvbiogcGVyc2lzdERlbGV0ZVJlbGF0aW9uc0Zvck1vZGVsKCBtb2RlbE5hbWUgKSB7XG5cdG1vZGVsTmFtZSA9IHNpbmd1bGFyTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0cmV0dXJuIHlpZWxkIHJlc29sdmVEaXNwYXRjaChcblx0XHRDT1JFX1JFRFVDRVJfS0VZLFxuXHRcdCdwZXJzaXN0UmVsYXRpb25zRm9yTW9kZWwnLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRmYWxzZVxuXHQpO1xufVxuXG4vKipcbiAqIEFjdGlvbiBnZW5lcmF0b3IgZm9yIHBlcnNpc3RpbmcgYW55IHF1ZXVlZCByZWxhdGlvbnMgdG8gdGhlIHNlcnZlciBzcGVjaWZpY1xuICogdG8gdGhlIGdpdmVuIG1vZGVsIG5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtib29sZWFufSBhZGRSZWxhdGlvbiAgV2hldGhlciB0aGlzIHBlcnNpc3QgcmVxdWVzdCBpcyBmb3IgcXVldWVkXG4gKiByZWxhdGlvbnMgdG8gYWRkIGZvciB0aGUgbW9kZWwgb3IgcXVldWVkIHJlbGF0aW9ucyB0byBkZWxldGUgZm9yIHRoZSBtb2RlbC5cbiAqIEByZXR1cm4ge09iamVjdH0gcmV0dXJucyBhbiBvYmplY3QgaW5kZXhlZCBieSB0aGUgb3JpZ2luYXRpbmcgZW50aXR5IGlkIGZvclxuICogdGhlIHJlcXVlc3RlZCBtb2RlbCBhbmQgd2l0aCB2YWx1ZXMgdGhhdCBhcmUgYW4gT2JqZWN0IGluZGV4ZWQgYnkgcmVsYXRpb25cbiAqIG5hbWVzIHdpdGggdmFsdWVzIG9mIHJlbGF0aW9uIElkcyBwZXJzaXN0ZWQuXG4gKi9cbmZ1bmN0aW9uKiBwZXJzaXN0UmVsYXRpb25zRm9yTW9kZWwoIG1vZGVsTmFtZSwgYWRkUmVsYXRpb24gPSB0cnVlICkge1xuXHRtb2RlbE5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lICk7XG5cdGNvbnN0IHJlbGF0aW9uU3RhdGUgPSB5aWVsZCByZXNvbHZlRGlzcGF0Y2goXG5cdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHQnZ2V0UmVsYXRpb25TdGF0ZScsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGFkZFJlbGF0aW9uXG5cdCk7XG5cdGlmICggaXNFbXB0eSggcmVsYXRpb25TdGF0ZSApICkge1xuXHRcdHJldHVybiBERUZBVUxUX0VNUFRZX09CSkVDVDtcblx0fVxuXHRjb25zdCBlbnRpdHlJZHMgPSBrZXlzKCByZWxhdGlvblN0YXRlICk7XG5cdGNvbnN0IHJlbGF0aW9uc1BlcnNpc3RlZCA9IGVudGl0eUlkcy5sZW5ndGggPiAwID9cblx0XHR7fSA6XG5cdFx0REVGQVVMVF9FTVBUWV9PQkpFQ1Q7XG5cdHdoaWxlICggZW50aXR5SWRzLmxlbmd0aCA+IDAgKSB7XG5cdFx0Y29uc3QgZW50aXR5SWQgPSBlbnRpdHlJZHMucG9wKCk7XG5cblx0XHRjb25zdCBwZXJzaXN0ZWRSZWxhdGlvbnMgPSB5aWVsZCByZXNvbHZlRGlzcGF0Y2goXG5cdFx0XHRDT1JFX1JFRFVDRVJfS0VZLFxuXHRcdFx0J3BlcnNpc3RSZWxhdGlvbnNGb3JFbnRpdHlJZCcsXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRlbnRpdHlJZCxcblx0XHRcdGFkZFJlbGF0aW9uLFxuXHRcdFx0cmVsYXRpb25TdGF0ZVxuXHRcdCk7XG5cdFx0aWYgKCAhIGlzRW1wdHkoIHBlcnNpc3RlZFJlbGF0aW9ucyApICkge1xuXHRcdFx0cmVsYXRpb25zUGVyc2lzdGVkWyBlbnRpdHlJZCBdID0gcGVyc2lzdGVkUmVsYXRpb25zO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVsYXRpb25zUGVyc2lzdGVkO1xufVxuXG4vKipcbiAqIEFjdGlvbiBnZW5lcmF0b3IgZm9yIHBlcnNpc3RpbmcgYW55IHF1ZXVlZCByZWxhdGlvbnMgdG8gdGhlIHNlcnZlciBzcGVjaWZpY1xuICogdG8gdGhlIGdpdmVuIGVudGl0eSBpZCBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIG1vZGVsIG5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IGVudGl0eUlkXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFkZFJlbGF0aW9uIFdoZXRoZXIgdGhpcyBwZXJzaXN0IHJlcXVlc3QgaXMgZm9yIHF1ZXVlZFxuICogcmVsYXRpb25zIHRvIGFkZCBmb3IgdGhlIG1vZGVsIG9yIHF1ZXVlZCByZWxhdGlvbnMgdG8gZGVsZXRlIGZvciB0aGUgbW9kZWwuXG4gKiBAcGFyYW0ge09iamVjdH0gcmVsYXRpb25TdGF0ZSBPcHRpb25hbCwgaWYgdGhlIGN1cnJlbnQgcmVsYXRpb24gc3RhdGUgaXMga25vd25cbiAqIGl0IGNhbiBiZSBwYXNzZWQgaW4uICBUeXBpY2FsbHkgY2xpZW50IGNvZGUgd29uJ3Qga25vdyB0aGlzIHNvIHNob3VsZCBub3QgYmVcbiAqIHBhc3NlZCBpbi5cbiAqIEByZXR1cm4ge09iamVjdH0gQW4gb2JqZWN0IGluZGV4ZWQgYnkgcmVsYXRpb24gbmFtZXMgd2l0aCB0aGUgdmFsdWVzIGFuIGFycmF5XG4gKiBvZiByZWxhdGlvbiBpZHMgZm9yIGVhY2ggcmVsYXRpb24gdGhhdCB3ZXJlIHBlcnNpc3RlZC5cbiAqL1xuZnVuY3Rpb24qIHBlcnNpc3RSZWxhdGlvbnNGb3JFbnRpdHlJZChcblx0bW9kZWxOYW1lLFxuXHRlbnRpdHlJZCxcblx0YWRkUmVsYXRpb24gPSB0cnVlLFxuXHRyZWxhdGlvblN0YXRlID0gREVGQVVMVF9FTVBUWV9PQkpFQ1Rcbikge1xuXHRtb2RlbE5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lICk7XG5cdHJlbGF0aW9uU3RhdGUgPSB5aWVsZCByZXNvbHZlRGlzcGF0Y2goXG5cdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHQnZ2V0UmVsYXRpb25TdGF0ZScsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGFkZFJlbGF0aW9uLFxuXHRcdHJlbGF0aW9uU3RhdGVcblx0KTtcblx0aWYgKCBpc0VtcHR5KCByZWxhdGlvblN0YXRlICkgKSB7XG5cdFx0cmV0dXJuIERFRkFVTFRfRU1QVFlfT0JKRUNUO1xuXHR9XG5cdGNvbnN0IHJlbGF0aW9uTmFtZXMgPSByZWxhdGlvblN0YXRlWyBlbnRpdHlJZCBdID9cblx0XHRrZXlzKCByZWxhdGlvblN0YXRlWyBlbnRpdHlJZCBdICkgOlxuXHRcdERFRkFVTFRfRU1QVFlfQVJSQVk7XG5cdGlmICggaXNFbXB0eSggcmVsYXRpb25OYW1lcyApICkge1xuXHRcdHJldHVybiBERUZBVUxUX0VNUFRZX09CSkVDVDtcblx0fVxuXHRjb25zdCBwZXJzaXN0ZWRSZWxhdGlvbnMgPSB7fTtcblx0d2hpbGUgKCByZWxhdGlvbk5hbWVzLmxlbmd0aCA+IDAgKSB7XG5cdFx0Y29uc3QgcmVsYXRpb25OYW1lID0gcmVsYXRpb25OYW1lcy5wb3AoKTtcblx0XHRjb25zdCBwZXJzaXN0ZWRSZWxhdGlvbklkcyA9XG5cdFx0XHR5aWVsZCByZXNvbHZlRGlzcGF0Y2goXG5cdFx0XHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0XHRcdCdwZXJzaXN0UmVsYXRpb25zRm9yRW50aXR5SWRBbmRSZWxhdGlvbicsXG5cdFx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdFx0ZW50aXR5SWQsXG5cdFx0XHRcdHJlbGF0aW9uTmFtZSxcblx0XHRcdFx0YWRkUmVsYXRpb24sXG5cdFx0XHRcdHJlbGF0aW9uU3RhdGVcblx0XHRcdCk7XG5cdFx0aWYgKCBwZXJzaXN0ZWRSZWxhdGlvbklkcy5sZW5ndGggPiAwICkge1xuXHRcdFx0cGVyc2lzdGVkUmVsYXRpb25zWyByZWxhdGlvbk5hbWUgXSA9IHBlcnNpc3RlZFJlbGF0aW9uSWRzO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcGVyc2lzdGVkUmVsYXRpb25zO1xufVxuXG4vKipcbiAqIEFjdGlvbiBnZW5lcmF0b3IgZm9yIHBlcnNpc3RpbmcgYW55IHF1ZXVlZCByZWxhdGlvbnMgdG8gdGhlIHNlcnZlciBzcGVjaWZpY1xuICogdG8gdGhlIGdpdmVuIGVudGl0eSBpZCBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIG1vZGVsIG5hbWUgYW5kIGZvciB0aGUgZ2l2ZW5cbiAqIHJlbGF0aW9uIHRvIHRoYXQgbW9kZWwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IGVudGl0eUlkXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25OYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFkZFJlbGF0aW9uIFdoZXRoZXIgdGhpcyBwZXJzaXN0IHJlcXVlc3QgaXMgZm9yIHF1ZXVlZFxuICogcmVsYXRpb25zIHRvIGFkZCBmb3IgdGhlIG1vZGVsIG9yIHF1ZXVlZCByZWxhdGlvbnMgdG8gZGVsZXRlIGZvciB0aGUgbW9kZWwuXG4gKiBAcGFyYW0ge09iamVjdH0gcmVsYXRpb25TdGF0ZSBPcHRpb25hbCwgaWYgdGhlIGN1cnJlbnQgcmVsYXRpb24gc3RhdGUgaXMga25vd25cbiAqIGl0IGNhbiBiZSBwYXNzZWQgaW4uICBUeXBpY2FsbHkgY2xpZW50IGNvZGUgd29uJ3Qga25vdyB0aGlzIHNvIHNob3VsZCBub3QgYmVcbiAqIHBhc3NlZCBpbi5cbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiByZWxhdGlvbiBpZHMgcGVyc2lzdGVkIGZvciB0aGF0IHJlbGF0aW9uLlxuICovXG5mdW5jdGlvbiogcGVyc2lzdFJlbGF0aW9uc0ZvckVudGl0eUlkQW5kUmVsYXRpb24oXG5cdG1vZGVsTmFtZSxcblx0ZW50aXR5SWQsXG5cdHJlbGF0aW9uTmFtZSxcblx0YWRkUmVsYXRpb24gPSB0cnVlLFxuXHRyZWxhdGlvblN0YXRlID0gREVGQVVMVF9FTVBUWV9PQkpFQ1Rcbikge1xuXHRtb2RlbE5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lICk7XG5cdHJlbGF0aW9uTmFtZSA9IHBsdXJhbE1vZGVsTmFtZSggcmVsYXRpb25OYW1lICk7XG5cdHJlbGF0aW9uU3RhdGUgPSB5aWVsZCByZXNvbHZlRGlzcGF0Y2goXG5cdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHQnZ2V0UmVsYXRpb25TdGF0ZScsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGFkZFJlbGF0aW9uLFxuXHRcdHJlbGF0aW9uU3RhdGVcblx0KTtcblx0aWYgKCBpc0VtcHR5KCByZWxhdGlvblN0YXRlICkgKSB7XG5cdFx0cmV0dXJuIERFRkFVTFRfRU1QVFlfQVJSQVk7XG5cdH1cblx0Y29uc3QgcmVsYXRpb25FbnRpdHlJZHMgPSByZWxhdGlvblN0YXRlWyBlbnRpdHlJZCBdICYmXG5cdHJlbGF0aW9uU3RhdGVbIGVudGl0eUlkIF1bIHJlbGF0aW9uTmFtZSBdID9cblx0XHRbIC4uLnJlbGF0aW9uU3RhdGVbIGVudGl0eUlkIF1bIHJlbGF0aW9uTmFtZSBdIF0gOlxuXHRcdERFRkFVTFRfRU1QVFlfQVJSQVk7XG5cdGlmICggcmVsYXRpb25FbnRpdHlJZHMubGVuZ3RoIDwgMSApIHtcblx0XHRyZXR1cm4gREVGQVVMVF9FTVBUWV9BUlJBWTtcblx0fVxuXHRjb25zdCBwZXJzaXN0ZWRSZWxhdGlvbklkcyA9IFtdO1xuXHR3aGlsZSAoIHJlbGF0aW9uRW50aXR5SWRzLmxlbmd0aCA+IDAgKSB7XG5cdFx0Y29uc3QgcGVyc2lzdGVkUmVsYXRpb25JZCA9XG5cdFx0XHR5aWVsZCByZXNvbHZlRGlzcGF0Y2goXG5cdFx0XHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0XHRcdCdwZXJzaXN0UmVsYXRpb25zRm9yRW50aXR5SWRBbmRSZWxhdGlvbklkJyxcblx0XHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0XHRlbnRpdHlJZCxcblx0XHRcdFx0cmVsYXRpb25OYW1lLFxuXHRcdFx0XHRyZWxhdGlvbkVudGl0eUlkcy5wb3AoKSxcblx0XHRcdFx0YWRkUmVsYXRpb24sXG5cdFx0XHRcdHJlbGF0aW9uU3RhdGVcblx0XHRcdCk7XG5cdFx0aWYgKCBwZXJzaXN0ZWRSZWxhdGlvbklkICkge1xuXHRcdFx0cGVyc2lzdGVkUmVsYXRpb25JZHMucHVzaCggcGVyc2lzdGVkUmVsYXRpb25JZCApO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcGVyc2lzdGVkUmVsYXRpb25JZHM7XG59XG5cbi8qKlxuICogQWN0aW9uIGdlbmVyYXRvciBmb3IgcGVyc2lzdGluZyBhbnkgcXVldWVkIHJlbGF0aW9ucyB0byB0aGUgc2VydmVyIHNwZWNpZmljXG4gKiB0byB0aGUgZ2l2ZW4gZW50aXR5IGlkIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gbW9kZWwgbmFtZSwgZm9yIHRoZSBnaXZlblxuICogcmVsYXRpb24gdG8gdGhhdCBtb2RlbCBhbmQgdGhlIGdpdmVuIHJlbGF0aW9uIGlkIGZvciB0aGF0IHJlbGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbnRpdHlJZFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IHJlbGF0aW9uSWRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYWRkUmVsYXRpb24gV2hldGhlciB0aGlzIHBlcnNpc3QgcmVxdWVzdCBpcyBmb3IgcXVldWVkXG4gKiByZWxhdGlvbnMgdG8gYWRkIGZvciB0aGUgbW9kZWwgb3IgcXVldWVkIHJlbGF0aW9ucyB0byBkZWxldGUgZm9yIHRoZSBtb2RlbC5cbiAqIEBwYXJhbSB7T2JqZWN0fSByZWxhdGlvblN0YXRlIE9wdGlvbmFsLCBpZiB0aGUgY3VycmVudCByZWxhdGlvbiBzdGF0ZSBpcyBrbm93blxuICogaXQgY2FuIGJlIHBhc3NlZCBpbi4gIFR5cGljYWxseSBjbGllbnQgY29kZSB3b24ndCBrbm93IHRoaXMgc28gc2hvdWxkIG5vdCBiZVxuICogcGFzc2VkIGluLlxuICogQHJldHVybiB7bnVtYmVyfSBJZiAwIGlzIHJldHVybmVkIHRoZW4gdGhlIGVudGl0eSB3YXMgbm90IHBlcnNpc3RlZCxcbiAqIG90aGVyd2lzZSB0aGUgdmFsdWUgcmV0dXJuZWQgd2lsbCBiZSB0aGUgaWQgcGVyc2lzdGVkLlxuICovXG5mdW5jdGlvbiogcGVyc2lzdFJlbGF0aW9uc0ZvckVudGl0eUlkQW5kUmVsYXRpb25JZChcblx0bW9kZWxOYW1lLFxuXHRlbnRpdHlJZCxcblx0cmVsYXRpb25OYW1lLFxuXHRyZWxhdGlvbklkLFxuXHRhZGRSZWxhdGlvbiA9IHRydWUsXG5cdHJlbGF0aW9uU3RhdGUgPSBERUZBVUxUX0VNUFRZX09CSkVDVFxuKSB7XG5cdG1vZGVsTmFtZSA9IHNpbmd1bGFyTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0cmVsYXRpb25OYW1lID0gcGx1cmFsTW9kZWxOYW1lKCByZWxhdGlvbk5hbWUgKTtcblx0cmVsYXRpb25TdGF0ZSA9IHlpZWxkIHJlc29sdmVEaXNwYXRjaChcblx0XHRDT1JFX1JFRFVDRVJfS0VZLFxuXHRcdCdnZXRSZWxhdGlvblN0YXRlJyxcblx0XHRtb2RlbE5hbWUsXG5cdFx0YWRkUmVsYXRpb24sXG5cdFx0cmVsYXRpb25TdGF0ZVxuXHQpO1xuXHRsZXQgZW50aXR5SWRDaGFuZ2VkID0gZmFsc2U7XG5cdGlmICggaXNFbXB0eSggcmVsYXRpb25TdGF0ZSApICkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cdC8vIGlzIHRoZSBlbnRpdHlJZCBhIGN1aWQ/ICBJZiBzbywgdGhlbiBsZXQncyBwZXJzaXN0LlxuXHRpZiAoIGN1aWQuaXNDdWlkKCBlbnRpdHlJZCApICkge1xuXHRcdGVudGl0eUlkID0geWllbGQgcmVzb2x2ZURpc3BhdGNoKFxuXHRcdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHRcdCdwZXJzaXN0TmV3RW50aXR5QW5kUmVtb3ZlRGlydHlSZWxhdGlvbnMnLFxuXHRcdFx0cmVsYXRpb25OYW1lLFxuXHRcdFx0cmVsYXRpb25JZCxcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdGVudGl0eUlkLFxuXHRcdFx0YWRkUmVsYXRpb24sXG5cdFx0XHRbIG1vZGVsTmFtZSwgZW50aXR5SWQgXSxcblx0XHQpO1xuXHRcdC8vIGlmIGVudGl0eUlkIGlzIDAgYmFpbCBiZWNhdXNlIGl0IGRpZG4ndCBnZXQgcGVyc2lzdGVkIHNvIHJlbGF0aW9uc1xuXHRcdC8vIGNhbid0IGJlIHBlcnNpc3RlZCBlaXRoZXIuXG5cdFx0aWYgKCBlbnRpdHlJZCA9PT0gMCApIHtcblx0XHRcdHJldHVybiBlbnRpdHlJZDtcblx0XHR9XG5cdFx0ZW50aXR5SWRDaGFuZ2VkID0gdHJ1ZTtcblx0fVxuXG5cdC8vIGlzIHRoZSByZWxhdGlvbklkIGEgY3VpZD8gSWYgc28sIHRoZW4gbGV0J3MgcGVyc2lzdFxuXHRpZiAoIGN1aWQuaXNDdWlkKCByZWxhdGlvbklkICkgKSB7XG5cdFx0cmVsYXRpb25JZCA9IHlpZWxkIHJlc29sdmVEaXNwYXRjaChcblx0XHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0XHQncGVyc2lzdE5ld0VudGl0eUFuZFJlbW92ZURpcnR5UmVsYXRpb25zJyxcblx0XHRcdHJlbGF0aW9uTmFtZSxcblx0XHRcdHJlbGF0aW9uSWQsXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRlbnRpdHlJZCxcblx0XHRcdGFkZFJlbGF0aW9uLFxuXHRcdFx0WyBzaW5ndWxhck1vZGVsTmFtZSggcmVsYXRpb25OYW1lICksIHJlbGF0aW9uSWQgXSxcblx0XHRcdCEgZW50aXR5SWRDaGFuZ2VkLFxuXHRcdCk7XG5cdFx0Ly8gaWYgcmVsYXRpb25JZCBpcyAwLCBiYWlsIGJlY2F1c2UgaXQgZGlkbid0IGdldCBwZXJzaXN0ZWQgc28gcmVsYXRpb25zXG5cdFx0Ly8gY2FuJ3QgYmUgcGVyc2lzdGVkIGVpdGhlci5cblx0XHRpZiAoIHJlbGF0aW9uSWQgPT09IDAgKSB7XG5cdFx0XHRyZXR1cm4gcmVsYXRpb25JZDtcblx0XHR9XG5cdH1cblx0Y29uc3QgZW5kcG9pbnQgPSB5aWVsZCByZXNvbHZlU2VsZWN0KFxuXHRcdFNDSEVNQV9SRURVQ0VSX0tFWSxcblx0XHQnZ2V0UmVsYXRpb25FbmRwb2ludEZvckVudGl0eUlkJyxcblx0XHRtb2RlbE5hbWUsXG5cdFx0ZW50aXR5SWQsXG5cdFx0cmVsYXRpb25OYW1lLFxuXHQpO1xuXHRjb25zdCBzdWNjZXNzID0gZW5kcG9pbnQgP1xuXHRcdHlpZWxkIGZldGNoKFxuXHRcdFx0e1xuXHRcdFx0XHRwYXRoOiBlbmRwb2ludCArICcvJyArIHJlbGF0aW9uSWQsXG5cdFx0XHRcdG1ldGhvZDogYWRkUmVsYXRpb24gPyAnUFVUJyA6ICdERUxFVEUnLFxuXHRcdFx0fVxuXHRcdCkgOlxuXHRcdGZhbHNlO1xuXHRpZiAoIHN1Y2Nlc3MgKSB7XG5cdFx0Ly8gRXZlbiB3aGVuIGlkcyBoYXZlIGNoYW5nZWQsIHRoaXMgc2hvdWxkIGNhdGNoIGFueSBwb3RlbnRpYWwgcXVldWVkXG5cdFx0Ly8gcmVsYXRpb24gaXRlbXMgZm9yIHRob3NlIHRoaW5ncyB0aGF0IGdvdCB1cGRhdGVkIGluIHN0YXRlIGluIGEgcHJpb3Jcblx0XHQvLyBkaXNwYXRjaFxuXHRcdHlpZWxkIHJlbW92ZURpcnR5UmVsYXRpb25Gb3JUeXBlKFxuXHRcdFx0cmVsYXRpb25OYW1lLFxuXHRcdFx0cmVsYXRpb25JZCxcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdGVudGl0eUlkLFxuXHRcdFx0YWRkUmVsYXRpb25cblx0XHQpO1xuXHRcdHJldHVybiByZWxhdGlvbklkO1xuXHR9XG5cdHJldHVybiAwO1xufVxuXG4vKipcbiAqIEFjdGlvbiBnZW5lcmF0b3IgZm9yIGhhbmRsaW5nIHBlcnNpc3RpbmcgYSBuZXcgZW50aXR5IGV4aXN0aW5nIGluIHRoZVxuICogcmVsYXRpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IHJlbGF0aW9uSWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbnRpdHlJZFxuICogQHBhcmFtIHtib29sZWFufSBhZGRSZWxhdGlvblxuICogQHBhcmFtIHtBcnJheX0gcGVyc2lzdGluZ0FyZ3VtZW50c1xuICogQHBhcmFtIHtib29sZWFufSBkb1JlbGF0aW9uUmVtb3ZhbFxuICogQHJldHVybiB7bnVtYmVyfSBFaXRoZXIgdGhlIG5ldyBpZCBvciAwIGlmIHRoZSBlbnRpdHkgd2FzIG5vdCBzdWNjZXNzZnVsbHlcbiAqIHBlcnNpc3RlZC5cbiAqL1xuZnVuY3Rpb24qIHBlcnNpc3ROZXdFbnRpdHlBbmRSZW1vdmVEaXJ0eVJlbGF0aW9ucyhcblx0cmVsYXRpb25OYW1lLFxuXHRyZWxhdGlvbklkLFxuXHRtb2RlbE5hbWUsXG5cdGVudGl0eUlkLFxuXHRhZGRSZWxhdGlvbixcblx0cGVyc2lzdGluZ0FyZ3VtZW50cyxcblx0ZG9SZWxhdGlvblJlbW92YWwgPSB0cnVlLFxuKSB7XG5cdHJlbGF0aW9uTmFtZSA9IHBsdXJhbE1vZGVsTmFtZSggcmVsYXRpb25OYW1lICk7XG5cdG1vZGVsTmFtZSA9IHNpbmd1bGFyTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0Y29uc3QgcGVyc2lzdGVkRW50aXR5ID0geWllbGQgcmVzb2x2ZURpc3BhdGNoKFxuXHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0J3BlcnNpc3RGb3JFbnRpdHlJZCcsXG5cdFx0Li4ucGVyc2lzdGluZ0FyZ3VtZW50cyxcblx0KTtcblx0Ly8gaWYgbm90IGRpc3BhdGNoZWQgc3VjY2Vzc2Z1bGx5IHRoZW4gbGV0J3MgYmFpbCBiZWNhdXNlIHJlbGF0aW9uIGNhbid0XG5cdC8vIGJlIHBlcnNpc3RlZFxuXHRpZiAoICEgaXNNb2RlbEVudGl0eU9mTW9kZWwoIHBlcnNpc3RlZEVudGl0eSwgcGVyc2lzdGluZ0FyZ3VtZW50c1sgMCBdICkgKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblx0aWYgKCBkb1JlbGF0aW9uUmVtb3ZhbCApIHtcblx0XHQvLyBlbnN1cmUgb2xkSWQgaXMgcmVtb3ZlZCBmcm9tIGl0ZW1zICh0aGlzIGlzIGEgZmFpbHNhZmUgaW4gY2FzZSB0aGVcblx0XHQvLyBpZCBzd2FwIGluIHJlbGF0aW9uIHN0YXRlIGlzbid0IGNvbXBsZXRlIHlldCkuXG5cdFx0eWllbGQgcmVtb3ZlRGlydHlSZWxhdGlvbkZvclR5cGUoXG5cdFx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0XHRyZWxhdGlvbklkLFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0ZW50aXR5SWQsXG5cdFx0XHRhZGRSZWxhdGlvblxuXHRcdCk7XG5cdH1cblx0cmV0dXJuIHBlcnNpc3RlZEVudGl0eS5pZDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0b3IgZm9yIHJldHVybmluZyByZWxhdGlvbiBzdGF0ZSBmb3IgdGhlIGdpdmVuIG1vZGVsLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYWRkUmVsYXRpb24gIFdoZXRoZXIgdG8gcmV0dXJuIHRoZSByZWxhdGlvbiBzdGF0ZSBmb3IgcmVsYXRpb25zXG4gKiBxdWV1ZWQgZm9yIGFkZGluZyAodHJ1ZSkgb3IgZGVsZXRpb24gKGZhbHNlKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSByZWxhdGlvblN0YXRlICBPcHRpb25hbGx5LCBjYWxsZXJzIGNhbiBwcm92aWRlIGEgcmVsYXRpb25cbiAqIHJlbGF0aW9uIHN0YXRlIGFuZCBpZiBwcm92aWRlZCB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiBzZWxlY3RpbmcgZnJvbSB0aGVcbiAqIHN0b3JlLlxuICpcbiAqIEByZXR1cm4ge09iamVjdH0gIFRoZSByZWxhdGlvbiBzdGF0ZSBmb3IgdGhlIGdpdmVuIG1vZGVsLlxuICovXG5mdW5jdGlvbiogZ2V0UmVsYXRpb25TdGF0ZShcblx0bW9kZWxOYW1lLFxuXHRhZGRSZWxhdGlvbiA9IHRydWUsXG5cdHJlbGF0aW9uU3RhdGUgPSBERUZBVUxUX0VNUFRZX09CSkVDVFxuKSB7XG5cdGNvbnN0IHNlbGVjdG9yID0gYWRkUmVsYXRpb24gP1xuXHRcdCdnZXRSZWxhdGlvbkFkZGl0aW9uc1F1ZXVlZEZvck1vZGVsJyA6XG5cdFx0J2dldFJlbGF0aW9uRGVsZXRpb25zUXVldWVkRm9yTW9kZWwnO1xuXHRyZWxhdGlvblN0YXRlID0gaXNFbXB0eSggcmVsYXRpb25TdGF0ZSApID9cblx0XHR5aWVsZCBzZWxlY3QoXG5cdFx0XHRDT1JFX1JFRFVDRVJfS0VZLFxuXHRcdFx0c2VsZWN0b3IsXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0KSA6XG5cdFx0cmVsYXRpb25TdGF0ZTtcblx0cmV0dXJuIHJlbGF0aW9uU3RhdGU7XG59XG5cbmV4cG9ydCB7XG5cdHBlcnNpc3RBZGRSZWxhdGlvbnNGb3JNb2RlbCxcblx0cGVyc2lzdERlbGV0ZVJlbGF0aW9uc0Zvck1vZGVsLFxuXHRwZXJzaXN0UmVsYXRpb25zRm9yTW9kZWwsXG5cdHBlcnNpc3RSZWxhdGlvbnNGb3JFbnRpdHlJZCxcblx0cGVyc2lzdFJlbGF0aW9uc0ZvckVudGl0eUlkQW5kUmVsYXRpb24sXG5cdHBlcnNpc3RSZWxhdGlvbnNGb3JFbnRpdHlJZEFuZFJlbGF0aW9uSWQsXG5cdHBlcnNpc3ROZXdFbnRpdHlBbmRSZW1vdmVEaXJ0eVJlbGF0aW9ucyxcblx0Z2V0UmVsYXRpb25TdGF0ZSxcbn07XG4iLCIvKipcbiAqIEludGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgQUNUSU9OX1RZUEVTIH0gZnJvbSAnLi9hY3Rpb24tdHlwZXMnO1xuY29uc3QgeyBlbnRpdGllczogdHlwZXMgfSA9IEFDVElPTl9UWVBFUztcblxuLyoqXG4gKiBBY3Rpb24gZm9yIHJlY2VpdmluZyBlbnRpdHkgcmVjb3Jkcy5cbiAqIEVudGl0eSByZWNvcmRzIHJlY2VpdmVkIHdpbGwgTk9UIHJlcGxhY2UgYW55IGV4aXN0aW5nIGVudGl0aWVzIGluIHRoZSBzdGF0ZVxuICogKG1hdGNoaW5nIGlkcykuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZSBleHBlY3RlZCB0byBiZSBhbiBtb2RlbCBuYW1lLlxuICogQHBhcmFtIHtBcnJheTxCYXNlRW50aXR5Pn0gZW50aXRpZXMgQXJyYXkgb2YgbW9kZWwgZW50aXR5XG4gKiBpbnN0YW5jZXMgaW5kZXhlZCBieSB0aGUgcHJpbWFyeSBrZXkuXG4gKiBAcmV0dXJuIHtcbiAqIHtcbiAqIFx0dHlwZTogc3RyaW5nLFxuICogXHRtb2RlbE5hbWU6IHN0cmluZyxcbiAqIFx0ZW50aXRpZXM6IEFycmF5PEJhc2VFbnRpdHk+XG4gKiBcdH1cbiAqIH0gIEFuIGFjdGlvbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVFbnRpdHlSZWNvcmRzKCBtb2RlbE5hbWUsIGVudGl0aWVzID0gW10gKSB7XG5cdHJldHVybiB7XG5cdFx0dHlwZTogdHlwZXMuUkVDRUlWRV9FTlRJVFlfUkVDT1JEUyxcblx0XHRtb2RlbE5hbWUsXG5cdFx0ZW50aXRpZXMsXG5cdH07XG59XG5cbi8qKlxuICogU2FtZSBhcyByZWNlaXZlRW50aXR5UmVjb3JkcyBleGNlcHQgaW5jb21pbmcgZW50aXRpZXMgd2lsbCByZXBsYWNlIGFueVxuICogbWF0Y2hpbmcgcmVjb3JkcyAoYnkgSUQpICBpbiB0aGUgc3RhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge0FycmF5fSBlbnRpdGllc1xuICogQHJldHVybiB7XG4gKiB7XG4gKiBcdHR5cGU6IHN0cmluZyxcbiAqIFx0bW9kZWxOYW1lOiBzdHJpbmcsXG4gKiBcdGVudGl0aWVzOiBBcnJheTxCYXNlRW50aXR5PlxuICogXHR9XG4gKiB9ICBBbiBhY3Rpb24gb2JqZWN0LlxuICovXG5mdW5jdGlvbiByZWNlaXZlQW5kUmVwbGFjZUVudGl0eVJlY29yZHMoIG1vZGVsTmFtZSwgZW50aXRpZXMgPSBbXSApIHtcblx0cmV0dXJuIHtcblx0XHR0eXBlOiB0eXBlcy5SRUNFSVZFX0FORF9SRVBMQUNFX0VOVElUWV9SRUNPUkRTLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdGllcyxcblx0fTtcbn1cblxuLyoqXG4gKiBBY3Rpb24gY3JlYXRvciBmb3IgYWRkaW5nIGFuIGVudGl0eSB0byB0aGUgc3RhdGUgKGFzIG9wcG9zZWQgdG8gYW4gZW50aXR5XG4gKiByZWNvcmQpXG4gKlxuICogQHBhcmFtIHtCYXNlRW50aXR5fSBlbnRpdHlcbiAqIEByZXR1cm4ge3t0eXBlOiBzdHJpbmcsIGVudGl0eTogQmFzZUVudGl0eX19IEFuIGFjdGlvblxuICogb2JqZWN0LlxuICovXG5mdW5jdGlvbiByZWNlaXZlRW50aXR5KCBlbnRpdHkgKSB7XG5cdHJldHVybiB7XG5cdFx0dHlwZTogdHlwZXMuUkVDRUlWRV9FTlRJVFksXG5cdFx0ZW50aXR5LFxuXHR9O1xufVxuXG4vKipcbiAqIEFjdGlvbiBjcmVhdG9yIGZvciBxdWV1aW5nIGFuIGVudGl0eSBpZCBmb3IgdHJhc2guXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IGVudGl0eUlkXG4gKiBAcmV0dXJuIHt7dHlwZTogc3RyaW5nLCBtb2RlbE5hbWU6IHN0cmluZywgZW50aXR5SWQ6IG51bWJlcn19IEFuIGFjdGlvblxuICogb2JqZWN0LlxuICovXG5mdW5jdGlvbiByZWNlaXZlVHJhc2hFbnRpdHlJZCggbW9kZWxOYW1lLCBlbnRpdHlJZCApIHtcblx0cmV0dXJuIHtcblx0XHR0eXBlOiB0eXBlcy5SRUNFSVZFX1RSQVNIX0VOVElUWV9JRCxcblx0XHRtb2RlbE5hbWUsXG5cdFx0ZW50aXR5SWQsXG5cdH07XG59XG5cbi8qKlxuICogQWN0aW9uIGNyZWF0b3IgZm9yIHF1ZXVlaW5nIGFuIGVudGl0eSBpZCBmb3IgaGFyZCBkZWxldGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IGVudGl0eUlkXG4gKiBAcmV0dXJuIHt7dHlwZTogc3RyaW5nLCBtb2RlbE5hbWU6IHN0cmluZywgZW50aXR5SWQ6IG51bWJlcn19IEFuIGFjdGlvblxuICogb2JqZWN0LlxuICovXG5mdW5jdGlvbiByZWNlaXZlRGVsZXRlRW50aXR5SWQoIG1vZGVsTmFtZSwgZW50aXR5SWQgKSB7XG5cdHJldHVybiB7XG5cdFx0dHlwZTogdHlwZXMuUkVDRUlWRV9ERUxFVEVfRU5USVRZX0lELFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHlJZCxcblx0fTtcbn1cblxuZXhwb3J0IHtcblx0cmVjZWl2ZUVudGl0eVJlY29yZHMsXG5cdHJlY2VpdmVBbmRSZXBsYWNlRW50aXR5UmVjb3Jkcyxcblx0cmVjZWl2ZUVudGl0eSxcblx0cmVjZWl2ZURlbGV0ZUVudGl0eUlkLFxuXHRyZWNlaXZlVHJhc2hFbnRpdHlJZCxcbn07XG4iLCIvKipcbiAqIEludGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHtcblx0VFlQRV9RVUVVRV9SRUxBVElPTl9BREQsXG5cdFRZUEVfUVVFVUVfUkVMQVRJT05fREVMRVRFLFxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQUNUSU9OX1RZUEVTIH0gZnJvbSAnLi9hY3Rpb24tdHlwZXMnO1xuY29uc3QgeyByZWxhdGlvbnM6IHR5cGVzIH0gPSBBQ1RJT05fVFlQRVM7XG5cbi8qKlxuICogQWN0aW9uIGNyZWF0b3IgZm9yIGFkZGluZyByZWxhdGlvbiBpbmRleGVzIGZvciBlbnRpdGllcyBhbmQgdGhlaXIgcmVsYXRpb25zLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbnRpdHlJZFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uTmFtZVxuICogQHBhcmFtIHtBcnJheX0gcmVsYXRlZEVudGl0eUlkc1xuICogQHJldHVybiB7XG4gKiBcdHtcbiAqIFx0XHR0eXBlOiBzdHJpbmcsXG4gKiBcdFx0bW9kZWxOYW1lOiBzdHJpbmcsXG4gKiBcdFx0ZW50aXR5SWQ6IG51bWJlcixcbiAqIFx0XHRyZWxhdGVkRW50aXR5SWRzOiBBcnJheVxuICogXHR9XG4gKiB9IEFuIGFjdGlvbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVSZWxhdGVkRW50aXRpZXMoXG5cdG1vZGVsTmFtZSxcblx0ZW50aXR5SWQsXG5cdHJlbGF0aW9uTmFtZSxcblx0cmVsYXRlZEVudGl0eUlkc1xuKSB7XG5cdHJldHVybiB7XG5cdFx0dHlwZTogdHlwZXMuUkVDRUlWRV9SRUxBVEVEX0VOVElUWV9JRFMsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkLFxuXHRcdHJlbGF0aW9uTmFtZSxcblx0XHRyZWxhdGVkRW50aXR5SWRzLFxuXHR9O1xufVxuXG4vKipcbiAqIEFjdGlvbiBjcmVhdG9yIGZvciBxdWV1aW5nIHRoZSBhIHJlbGF0aW9uIGNyZWF0aW9uIGZvciB0aGUgZ2l2ZW4gZGF0YS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25OYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gcmVsYXRpb25FbnRpdHlJZFxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IGVudGl0eUlkXG4gKiBAcmV0dXJuIHtcbiAqIFx0e1xuICogXHRcdHR5cGU6IHN0cmluZyxcbiAqIFx0XHRyZWxhdGlvbk5hbWU6IHN0cmluZyxcbiAqIFx0XHRyZWxhdGlvbkVudGl0eUlkOiBudW1iZXIsXG4gKiBcdFx0bW9kZWxOYW1lOiBzdHJpbmcsXG4gKiBcdFx0ZW50aXR5SWQ6IG51bWJlcixcbiAqIFx0XHRxdWV1ZVR5cGU6IHN0cmluZ1xuICogXHR9XG4gKiB9XG4gKiBBbiBhY3Rpb24gb2JqZWN0LlxuICovXG5mdW5jdGlvbiByZWNlaXZlRGlydHlSZWxhdGlvbkFkZGl0aW9uKFxuXHRyZWxhdGlvbk5hbWUsXG5cdHJlbGF0aW9uRW50aXR5SWQsXG5cdG1vZGVsTmFtZSxcblx0ZW50aXR5SWQsXG4pIHtcblx0cmV0dXJuIHtcblx0XHR0eXBlOiB0eXBlcy5SRUNFSVZFX0RJUlRZX1JFTEFUSU9OX0FERElUSU9OLFxuXHRcdHJlbGF0aW9uTmFtZSxcblx0XHRyZWxhdGlvbkVudGl0eUlkLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHlJZCxcblx0XHRxdWV1ZVR5cGU6IFRZUEVfUVVFVUVfUkVMQVRJT05fQURELFxuXHR9O1xufVxuXG4vKipcbiAqIEFjdGlvbiBjcmVhdG9yIGZvciBxdWV1ZWluZyB0aGUgcmVsYXRpb24gZGVsZXRpb24gZm9yIHRoZSBnaXZlbiBkYXRhLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbk5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSByZWxhdGlvbkVudGl0eUlkXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gZW50aXR5SWRcbiAqIEByZXR1cm4ge1xuICogXHR7XG4gKiBcdFx0dHlwZTogc3RyaW5nLFxuICogXHRcdHJlbGF0aW9uTmFtZTogc3RyaW5nLFxuICogXHRcdHJlbGF0aW9uRW50aXR5SWQ6IG51bWJlcixcbiAqIFx0XHRtb2RlbE5hbWU6IHN0cmluZyxcbiAqIFx0XHRlbnRpdHlJZDogbnVtYmVyLFxuICogXHRcdHF1ZXVlVHlwZTogc3RyaW5nXG4gKiBcdH1cbiAqIH0gQW4gYWN0aW9uIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gcmVjZWl2ZURpcnR5UmVsYXRpb25EZWxldGlvbihcblx0cmVsYXRpb25OYW1lLFxuXHRyZWxhdGlvbkVudGl0eUlkLFxuXHRtb2RlbE5hbWUsXG5cdGVudGl0eUlkLFxuKSB7XG5cdHJldHVybiB7XG5cdFx0dHlwZTogdHlwZXMuUkVDRUlWRV9ESVJUWV9SRUxBVElPTl9ERUxFVElPTixcblx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0cmVsYXRpb25FbnRpdHlJZCxcblx0XHRtb2RlbE5hbWUsXG5cdFx0ZW50aXR5SWQsXG5cdFx0cXVldWVUeXBlOiBUWVBFX1FVRVVFX1JFTEFUSU9OX0RFTEVURSxcblx0fTtcbn1cblxuLyoqXG4gKiBBY3Rpb24gY3JlYXRvciBmb3IgdHJpZ2dlcmluZyB0aGUgcmVwbGFjZW1lbnQgb2YgYW55IGluc3RhbmNlIG9mIHRoZSBvbGRcbiAqIGVudGl0eSBpZCBpbiB0aGUgc3RhdGUgZm9yIHRoZSBnaXZlbiBtb2RlbCB3aXRoIHRoZSBuZXcgZW50aXR5IGlkLlxuICpcbiAqIFR5cGljYWxseSB0aGlzIGlzIHRyaWdnZXJlZCBhZnRlciBwZXJzaXN0aW5nIGEgbmV3IGVudGl0eSB0byB0aGUgc2VydmVyIGFuZFxuICogcmVjZWl2aW5nIGl0cyBuZXcgZW50aXR5IGlkIG9uIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBvbGRFbnRpdHlJZFxuICogQHBhcmFtIHtudW1iZXJ9IG5ld0VudGl0eUlkXG4gKiBAcmV0dXJuIHtcbiAqIFx0e1xuICogXHRcdHR5cGU6IHN0cmluZyxcbiAqIFx0XHRtb2RlbE5hbWU6ICosXG4gKiBcdFx0b2xkRW50aXR5SWQ6ICosXG4gKiBcdFx0bmV3RW50aXR5SWQ6ICpcbiAqIFx0fVxuICogfSBBbiBhY3Rpb24gb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVVcGRhdGVkRW50aXR5SWRGb3JSZWxhdGlvbnMoXG5cdG1vZGVsTmFtZSxcblx0b2xkRW50aXR5SWQsXG5cdG5ld0VudGl0eUlkXG4pIHtcblx0cmV0dXJuIHtcblx0XHR0eXBlOiB0eXBlcy5SRUNFSVZFX1VQREFURURfRU5USVRZX0lEX0ZPUl9SRUxBVElPTlMsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdG9sZEVudGl0eUlkLFxuXHRcdG5ld0VudGl0eUlkLFxuXHR9O1xufVxuXG5leHBvcnQge1xuXHRyZWNlaXZlUmVsYXRlZEVudGl0aWVzLFxuXHRyZWNlaXZlRGlydHlSZWxhdGlvbkFkZGl0aW9uLFxuXHRyZWNlaXZlRGlydHlSZWxhdGlvbkRlbGV0aW9uLFxuXHRyZWNlaXZlVXBkYXRlZEVudGl0eUlkRm9yUmVsYXRpb25zLFxufTtcbiIsIi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBBQ1RJT05fVFlQRVMgfSBmcm9tICcuL2FjdGlvbi10eXBlcyc7XG5jb25zdCB7IGVudGl0aWVzOiB0eXBlcyB9ID0gQUNUSU9OX1RZUEVTO1xuXG4vKipcbiAqIEFjdGlvbiBjcmVhdG9yIGZvciByZW1vdmluZyB0aGUgZW50aXR5IGZyb20gdGhlIHN0YXRlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbnRpdHlJZFxuICogQHJldHVybiB7e3R5cGU6IHN0cmluZywgbW9kZWxOYW1lOiBzdHJpbmcsIGVudGl0eUlkOiBudW1iZXJ9fSBBbiBhY3Rpb25cbiAqIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUVudGl0eUJ5SWQoIG1vZGVsTmFtZSwgZW50aXR5SWQgKSB7XG5cdHJldHVybiB7XG5cdFx0dHlwZTogdHlwZXMuUkVNT1ZFX0VOVElUWV9CWV9JRCxcblx0XHRtb2RlbE5hbWUsXG5cdFx0ZW50aXR5SWQsXG5cdH07XG59XG5cbi8qKlxuICogQWN0aW9uIGNyZWF0b3IgZm9yIHF1ZXVlaW5nIHRoZSBkZWxldGlvbiBvZiBlbnRpdHkgb24gdGhlIHNlcnZlclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbnRpdHlJZFxuICogQHJldHVybiB7e3R5cGU6IHN0cmluZywgbW9kZWxOYW1lOiBzdHJpbmcsIGVudGl0eUlkOiB7bnVtYmVyfX19IEFuIGFjdGlvblxuICogb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEZWxldGVFbnRpdHlJZCggbW9kZWxOYW1lLCBlbnRpdHlJZCApIHtcblx0cmV0dXJuIHtcblx0XHR0eXBlOiB0eXBlcy5SRU1PVkVfREVMRVRFX0VOVElUWV9JRCxcblx0XHRtb2RlbE5hbWUsXG5cdFx0ZW50aXR5SWQsXG5cdH07XG59XG5cbi8qKlxuICogQWN0aW9uIGNyZWF0b3IgZm9yIHF1ZXVpbmcgdGhlIHRyYXNoaW5nIG9mIGVudGl0eSBvbiB0aGUgc2VydmVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IGVudGl0eUlkXG4gKiBAcmV0dXJuIHt7dHlwZTogc3RyaW5nLCBtb2RlbE5hbWU6IHN0cmluZywgZW50aXR5SWQ6IG51bWJlcn19IEFuIGFjdGlvblxuICogb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlVHJhc2hFbnRpdHlJZCggbW9kZWxOYW1lLCBlbnRpdHlJZCApIHtcblx0cmV0dXJuIHtcblx0XHR0eXBlOiB0eXBlcy5SRU1PVkVfVFJBU0hfRU5USVRZX0lELFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHlJZCxcblx0fTtcbn1cbiIsIi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG4vKipcbiAqIEludGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHtcblx0VFlQRV9RVUVVRV9SRUxBVElPTl9BREQsXG5cdFRZUEVfUVVFVUVfUkVMQVRJT05fREVMRVRFLFxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQUNUSU9OX1RZUEVTIH0gZnJvbSAnLi9hY3Rpb24tdHlwZXMnO1xuY29uc3QgeyByZWxhdGlvbnM6IHR5cGVzIH0gPSBBQ1RJT05fVFlQRVM7XG5cbi8qKlxuICogQWN0aW9uIGNyZWF0b3IgZm9yIHJlbW92aW5nIGFsbCBpbmRleGVkIHJlbGF0aW9ucyBmb3IgYSBzcGVjaWZpYyBlbnRpdHkgZnJvbVxuICogdGhlIHN0YXRlLlxuICpcbiAqIE5vdGU6IFRoZSBmb2xsb3dpbmcgdGhpbmdzIGFyZSBhY2NvbXBsaXNoZWQgYnkgdGhpcyBhY3Rpb24gKHZpYSB0aGUgcmVkdWNlcik6XG4gKiAtIFRoZSByZWxhdGlvbiBpbmRleCBmb3IgdGhlIHJlbGF0aW9uIG9uIHRoaXMgZW50aXR5IGlzIHJlbW92ZWQgZnJvbSBzdGF0ZS5cbiAqIC0gSWYgdGhlIHJlbGF0aW9uIGVudGl0aWVzIHRoZW1zZWx2ZXMgaGF2ZSBubyBvdGhlciByZWxhdGlvbiBpbmRleCwgdGhleVxuICogICBhcmUgYWxzbyByZW1vdmVkIGZyb20gc3RhdGUuXG4gKiAtIEFueSBkaXJ0eSByZWxhdGlvbnMgZm9yIHRoaXMgZW50aXR5IGFyZSByZW1vdmVkIGZyb20gc3RhdGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IGVudGl0eUlkXG4gKiBAcmV0dXJuIHt7dHlwZTogc3RyaW5nLCBtb2RlbE5hbWU6IHN0cmluZywgZW50aXR5SWQ6IG51bWJlcn19XG4gKiBBbiBhY3Rpb24gb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUFsbFJlbGF0ZWRFbnRpdGllc0Zvck1vZGVsRW50aXR5KCBtb2RlbE5hbWUsIGVudGl0eUlkICkge1xuXHRyZXR1cm4ge1xuXHRcdHR5cGU6IHR5cGVzLlJFTU9WRV9SRUxBVEVEX0VOVElUSUVTX0ZPUl9FTlRJVFksXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkLFxuXHR9O1xufVxuXG4vKipcbiAqIEFjdGlvbiBjcmVhdG9yIGZvciByZW1vdmluZyByZWxhdGlvbnMgZnJvbSB0aGUgZ2l2ZW4gbW9kZWwgZnJvbSB0aGUgcmVsYXRpb25zXG4gKiBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gZW50aXR5SWRcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbk5hbWVcbiAqIEBwYXJhbSB7QXJyYXl9IHJlbGF0ZWRFbnRpdHlJZHNcbiAqIEByZXR1cm4ge1xuICogXHR7XG4gKiBcdFx0dHlwZTogc3RyaW5nLFxuICogXHRcdG1vZGVsTmFtZTogc3RyaW5nLFxuICogXHRcdGVudGl0eUlkOiBudW1iZXIsXG4gKiBcdFx0cmVsYXRpb25OYW1lOiBzdHJpbmcsXG4gKiBcdFx0cmVsYXRpb25FbnRpdHlJZHM6IEFycmF5XG4gKiBcdH1cbiAqIH0gQW4gYWN0aW9uIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlUmVsYXRlZEVudGl0aWVzKFxuXHRtb2RlbE5hbWUsXG5cdGVudGl0eUlkLFxuXHRyZWxhdGlvbk5hbWUsXG5cdHJlbGF0ZWRFbnRpdHlJZHMsXG4pIHtcblx0cmV0dXJuIHtcblx0XHR0eXBlOiB0eXBlcy5SRU1PVkVfUkVMQVRFRF9FTlRJVFlfSURTLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHlJZCxcblx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0cmVsYXRlZEVudGl0eUlkcyxcblx0fTtcbn1cblxuLyoqXG4gKiBBY3Rpb24gY3JlYXRvciBmb3IgcmVtb3ZpbmcgdGhlIGRpcnR5IHJlbGF0aW9uIGZyb20gdGhlIHN0YXRlIGZvciB0aGUgZ2l2ZW5cbiAqIHJlbGF0aW9uIGFjdGlvbiB0eXBlIChkZWxldGUgb3IgYWRkKS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25OYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gcmVsYXRpb25FbnRpdHlJZFxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IGVudGl0eUlkXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFkZFJlbGF0aW9uXG4gKiBAcmV0dXJuIHtcbiAqIFx0e1xuICogXHRcdHJlbGF0aW9uTmFtZTogc3RyaW5nLFxuICogXHRcdHJlbGF0aW9uRW50aXR5SWQ6IG51bWJlcixcbiAqIFx0XHRtb2RlbE5hbWU6IHN0cmluZyxcbiAqIFx0XHRlbnRpdHlJZDogbnVtYmVyLFxuICogXHRcdHR5cGU6IHN0cmluZyxcbiAqIFx0XHRxdWV1ZVR5cGU6IHN0cmluZ1xuICogXHR9XG4gKiB9IEFuIGFjdGlvbiBvYmplY3RcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlRGlydHlSZWxhdGlvbkZvclR5cGUoXG5cdHJlbGF0aW9uTmFtZSxcblx0cmVsYXRpb25FbnRpdHlJZCxcblx0bW9kZWxOYW1lLFxuXHRlbnRpdHlJZCxcblx0YWRkUmVsYXRpb24gPSB0cnVlXG4pIHtcblx0Y29uc3QgdHlwZSA9IGFkZFJlbGF0aW9uID8gdHlwZXMuUkVNT1ZFX0RJUlRZX1JFTEFUSU9OX0FERElUSU9OIDpcblx0XHR0eXBlcy5SRU1PVkVfRElSVFlfUkVMQVRJT05fREVMRVRJT047XG5cdHJldHVybiB7XG5cdFx0cmVsYXRpb25OYW1lLFxuXHRcdHJlbGF0aW9uRW50aXR5SWQsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkLFxuXHRcdHR5cGUsXG5cdFx0cXVldWVUeXBlOiBhZGRSZWxhdGlvbiA/XG5cdFx0XHRUWVBFX1FVRVVFX1JFTEFUSU9OX0FERCA6XG5cdFx0XHRUWVBFX1FVRVVFX1JFTEFUSU9OX0RFTEVURSxcblx0fTtcbn1cblxuLyoqXG4gKiBBY3Rpb24gY3JlYXRvciBmb3IgcmVtb3ZpbmcgdGhlIGRpcnR5IHJlbGF0aW9uIGZyb20gdGhlIGFkZCByZWxhdGlvbiBzdGF0ZVxuICogcmVjb3JkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbk5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSByZWxhdGlvbkVudGl0eUlkXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gZW50aXR5SWRcbiAqIEByZXR1cm4ge1xuICogXHR7XG4gKiBcdFx0cmVsYXRpb25OYW1lOiBzdHJpbmcsXG4gKiBcdFx0cmVsYXRpb25FbnRpdHlJZDogbnVtYmVyLFxuICogXHRcdG1vZGVsTmFtZTogc3RyaW5nLFxuICogXHRcdGVudGl0eUlkOiBudW1iZXIsXG4gKiBcdFx0dHlwZTogc3RyaW5nLFxuICogXHRcdHF1ZXVlVHlwZTogc3RyaW5nXG4gKiBcdH1cbiAqIH0gQW4gYWN0aW9uIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlRGlydHlSZWxhdGlvbkFkZGl0aW9uKFxuXHRyZWxhdGlvbk5hbWUsXG5cdHJlbGF0aW9uRW50aXR5SWQsXG5cdG1vZGVsTmFtZSxcblx0ZW50aXR5SWQsXG4pIHtcblx0cmV0dXJuIHJlbW92ZURpcnR5UmVsYXRpb25Gb3JUeXBlKFxuXHRcdHJlbGF0aW9uTmFtZSxcblx0XHRyZWxhdGlvbkVudGl0eUlkLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHlJZCxcblx0KTtcbn1cblxuLyoqXG4gKiBBbiBhY3Rpb24gY3JlYXRvciBmb3IgcmVtb3ZpbmcgdGhlIGRpcnR5IHJlbGF0aW9uIGZyb20gdGhlIGRlbGV0ZSByZWxhdGlvblxuICogc3RhdGUgcmVjb3JkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbk5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSByZWxhdGlvbkVudGl0eUlkXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gZW50aXR5SWRcbiAqIEByZXR1cm4ge1xuICogXHR7XG4gKiBcdFx0cmVsYXRpb25OYW1lOiBzdHJpbmcsXG4gKiBcdFx0cmVsYXRpb25FbnRpdHlJZDogbnVtYmVyLFxuICogXHRcdG1vZGVsTmFtZTogc3RyaW5nLFxuICogXHRcdGVudGl0eUlkOiBudW1iZXIsXG4gKiBcdFx0dHlwZTogc3RyaW5nLFxuICogXHRcdHF1ZXVlVHlwZTogc3RyaW5nXG4gKiBcdH1cbiAqIH0gQW4gYWN0aW9uIG9iamVjdFxuICovXG5mdW5jdGlvbiByZW1vdmVEaXJ0eVJlbGF0aW9uRGVsZXRpb24oXG5cdHJlbGF0aW9uTmFtZSxcblx0cmVsYXRpb25FbnRpdHlJZCxcblx0bW9kZWxOYW1lLFxuXHRlbnRpdHlJZCxcbikge1xuXHRyZXR1cm4gcmVtb3ZlRGlydHlSZWxhdGlvbkZvclR5cGUoXG5cdFx0cmVsYXRpb25OYW1lLFxuXHRcdHJlbGF0aW9uRW50aXR5SWQsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkLFxuXHRcdGZhbHNlLFxuXHQpO1xufVxuXG5leHBvcnQge1xuXHRyZW1vdmVBbGxSZWxhdGVkRW50aXRpZXNGb3JNb2RlbEVudGl0eSxcblx0cmVtb3ZlUmVsYXRlZEVudGl0aWVzLFxuXHRyZW1vdmVEaXJ0eVJlbGF0aW9uQWRkaXRpb24sXG5cdHJlbW92ZURpcnR5UmVsYXRpb25EZWxldGlvbixcblx0cmVtb3ZlRGlydHlSZWxhdGlvbkZvclR5cGUsXG59O1xuIiwiZXhwb3J0IGNvbnN0IFJFRFVDRVJfS0VZID0gJ2V2ZW50ZXNwcmVzc28vY29yZSc7XG5leHBvcnQgY29uc3QgVFlQRV9RVUVVRV9SRUxBVElPTl9ERUxFVEUgPSAnZGVsZXRlJztcbmV4cG9ydCBjb25zdCBUWVBFX1FVRVVFX1JFTEFUSU9OX0FERCA9ICdhZGQnO1xuIiwiLyoqXG4gKiBXb3JkUHJlc3MgZGVwZW5kZW5jaWVzXG4gKi9cbmltcG9ydCB7IHJlZ2lzdGVyU3RvcmUgfSBmcm9tICdAd29yZHByZXNzL2RhdGEnO1xuXG4vKipcbiAqIEludGVybmFsIGRlcGVuZGVuY2llc1xuICovXG5pbXBvcnQgcmVkdWNlciBmcm9tICcuL3JlZHVjZXJzJztcbmltcG9ydCAqIGFzIHNlbGVjdG9ycyBmcm9tICcuL3NlbGVjdG9ycyc7XG5pbXBvcnQgKiBhcyBhY3Rpb25zIGZyb20gJy4vYWN0aW9ucyc7XG5pbXBvcnQgKiBhcyByZXNvbHZlcnMgZnJvbSAnLi9yZXNvbHZlcnMnO1xuaW1wb3J0IHtcblx0c2VsZWN0b3JzIGFzIG1vZGVsU2VsZWN0b3JzLFxuXHRhY3Rpb25zIGFzIG1vZGVsQWN0aW9ucyxcblx0cmVzb2x2ZXJzIGFzIG1vZGVsUmVzb2x2ZXJzLFxufSBmcm9tICcuL21vZGVsJztcbmltcG9ydCB7IFJFRFVDRVJfS0VZIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IGNvbnRyb2xzIGZyb20gJy4uL2Jhc2UtY29udHJvbHMnO1xuXG4vKipcbiAqIFJlZ2lzdGVycyBzdG9yZSBmb3IgJ2V2ZW50ZXNwcmVzc28vY29yZScuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyU3RvcmUoIFJFRFVDRVJfS0VZLCB7XG5cdHJlZHVjZXIsXG5cdGFjdGlvbnM6IHsgLi4uYWN0aW9ucywgLi4ubW9kZWxBY3Rpb25zIH0sXG5cdHNlbGVjdG9yczogeyAuLi5zZWxlY3RvcnMsIC4uLm1vZGVsU2VsZWN0b3JzIH0sXG5cdHJlc29sdmVyczogeyAuLi5yZXNvbHZlcnMsIC4uLm1vZGVsUmVzb2x2ZXJzIH0sXG5cdGNvbnRyb2xzLFxufSApO1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7XG5cdGlzTW9kZWxFbnRpdHlPZk1vZGVsLFxuXHRpc01vZGVsRW50aXR5RmFjdG9yeU9mTW9kZWwsXG59IGZyb20gJ0BldmVudGVzcHJlc3NvL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHsgSW52YWxpZE1vZGVsRW50aXR5IH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vZWVqcyc7XG5pbXBvcnQgeyBnZXRFbmRwb2ludCB9IGZyb20gJ0BldmVudGVzcHJlc3NvL21vZGVsJztcbmltcG9ydCB7IF9fIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vaTE4bic7XG5pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJztcblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IGRpc3BhdGNoLCBmZXRjaCwgcmVzb2x2ZVNlbGVjdCB9IGZyb20gJy4uLy4uLy4uL2Jhc2UtY29udHJvbHMnO1xuaW1wb3J0IHsgUkVEVUNFUl9LRVkgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgUkVEVUNFUl9LRVkgYXMgU0NIRU1BX1JFRFVDRVJfS0VZIH0gZnJvbSAnLi4vLi4vLi4vc2NoZW1hL2NvbnN0YW50cyc7XG5cbi8qKlxuICogQWN0aW9uIGZvciByZWNlaXZpbmcgdGhlIGxhdGVzdCBjaGVjay1pbiByZWNvcmQgZm9yIHRoZSBnaXZlbiBkYXRldGltZSBpZCBhbmRcbiAqIHJlZ2lzdHJhdGlvbiBpZC5cbiAqXG4gKiBAcGFyYW0ge0Jhc2VFbnRpdHl9IGNoZWNraW5FbnRpdHlcbiAqIEBwYXJhbSB7bnVtYmVyfSByZWdpc3RyYXRpb25JZFxuICogQHBhcmFtIHtudW1iZXJ9IGRhdGVUaW1lSWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uKiByZWNlaXZlTGF0ZXN0Q2hlY2tpbihcblx0Y2hlY2tpbkVudGl0eSxcblx0cmVnaXN0cmF0aW9uSWQsXG5cdGRhdGVUaW1lSWRcbikge1xuXHRpZiAoICEgaXNNb2RlbEVudGl0eU9mTW9kZWwoIGNoZWNraW5FbnRpdHksICdjaGVja2luJyApICkge1xuXHRcdHRocm93IG5ldyBJbnZhbGlkTW9kZWxFbnRpdHkoXG5cdFx0XHQnRXhwZWN0ZWQgYSBjaGVja2luIHJlY29yZC4nLFxuXHRcdFx0Y2hlY2tpbkVudGl0eVxuXHRcdCk7XG5cdH1cblx0eWllbGQgZGlzcGF0Y2goXG5cdFx0UkVEVUNFUl9LRVksXG5cdFx0J3JlY2VpdmVFbnRpdHknLFxuXHRcdGNoZWNraW5FbnRpdHlcblx0KTtcblx0eWllbGQgZGlzcGF0Y2goXG5cdFx0J2NvcmUvZGF0YScsXG5cdFx0J2ZpbmlzaFJlc29sdXRpb24nLFxuXHRcdFJFRFVDRVJfS0VZLFxuXHRcdCdnZXRFbnRpdHlCeUlkJyxcblx0XHRbICdjaGVja2luJywgY2hlY2tpbkVudGl0eS5pZCBdXG5cdCk7XG5cdHlpZWxkIGRpc3BhdGNoKFxuXHRcdCdjb3JlL2RhdGEnLFxuXHRcdCdmaW5pc2hSZXNvbHV0aW9uJyxcblx0XHRSRURVQ0VSX0tFWSxcblx0XHQnZ2V0TGF0ZXN0Q2hlY2tpbicsXG5cdFx0WyByZWdpc3RyYXRpb25JZCwgZGF0ZVRpbWVJZCBdXG5cdCk7XG5cdHlpZWxkIGRpc3BhdGNoKFxuXHRcdFJFRFVDRVJfS0VZLFxuXHRcdCdyZWNlaXZlU2VsZWN0b3JWYWx1ZScsXG5cdFx0J2dldExhdGVzdENoZWNraW4nLFxuXHRcdGNoZWNraW5FbnRpdHkuaWQsXG5cdFx0cmVnaXN0cmF0aW9uSWQsXG5cdFx0ZGF0ZVRpbWVJZCxcblx0KTtcbn1cblxuLyoqXG4gKiBUb2dnbGVzIHRoZSBjaGVja2luIHN0YXRlIGZvciB0aGUgZ2l2ZW4gcmVnaXN0cmF0aW9uIGlkIGFuZCBkYXRldGltZSBpZC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gcmVnaXN0cmF0aW9uSWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBkYXRlVGltZUlkXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlICBJZiB0cnVlLCB0aGVuIHdoZXRoZXIgdGhlIHJlZ2lzdHJhdGlvbiBDQU4gYmUgY2hlY2tlZFxuICogaW4gb3Igbm90IGlzIGlnbm9yZWQuXG4gKiBAcmV0dXJuIHtCYXNlRW50aXR5fG51bGx9IE51bGwgaWYgdGhlcmUgaXMgYW4gZXJyb3Igb3IgdGhlIG5ldyBDaGVja2luIGVudGl0eVxuICovXG5leHBvcnQgZnVuY3Rpb24qIHRvZ2dsZUNoZWNraW4oIHJlZ2lzdHJhdGlvbklkLCBkYXRlVGltZUlkLCBmb3JjZSA9IGZhbHNlICkge1xuXHRsZXQgY2hlY2tJblJlc3BvbnNlO1xuXHRjb25zdCBwYXRoID0gYCR7IGdldEVuZHBvaW50KCAncmVnaXN0cmF0aW9uJyApIH0vYCArXG5cdFx0YCR7IHJlZ2lzdHJhdGlvbklkIH0vdG9nZ2xlX2NoZWNraW5fZm9yX2RhdGV0aW1lLyR7IGRhdGVUaW1lSWQgfWA7XG5cdHRyeSB7XG5cdFx0Y2hlY2tJblJlc3BvbnNlID0geWllbGQgZmV0Y2goIHtcblx0XHRcdHBhdGgsXG5cdFx0XHRtZXRob2Q6ICdQT1NUJyxcblx0XHRcdGRhdGE6IHsgZm9yY2UgfSxcblx0XHR9ICk7XG5cdH0gY2F0Y2ggKCBlcnJvciApIHtcblx0XHR5aWVsZCBkaXNwYXRjaChcblx0XHRcdCdjb3JlL25vdGljZXMnLFxuXHRcdFx0J2NyZWF0ZUVycm9yTm90aWNlJyxcblx0XHRcdF9fKFxuXHRcdFx0XHQnVG9nZ2xpbmcgdGhlIGNoZWNraW4gZmFpbGVkLiBVc3VhbGx5IHRoaXMgaXMgZHVlIHRvIHRoZSBjaGVja2luIG5vdCBoYXZpbmcgYWNjZXNzJyxcblx0XHRcdFx0J2V2ZW50X2VzcHJlc3NvJyxcblx0XHRcdClcblx0XHQpO1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cdGNvbnN0IGZhY3RvcnkgPSB5aWVsZCByZXNvbHZlU2VsZWN0KFxuXHRcdFNDSEVNQV9SRURVQ0VSX0tFWSxcblx0XHQnZ2V0RmFjdG9yeUZvck1vZGVsJyxcblx0XHQnY2hlY2tpbidcblx0KTtcblx0aWYgKCAhIGlzTW9kZWxFbnRpdHlGYWN0b3J5T2ZNb2RlbCggZmFjdG9yeSwgJ2NoZWNraW4nICkgKSB7XG5cdFx0d2FybmluZyhcblx0XHRcdGZhbHNlLFxuXHRcdFx0J1RoZSBmYWN0b3J5IGZvciB0aGUgY2hlY2tpbiBtb2RlbCBjb3VsZCBub3QgYmUgcmV0cmlldmVkLidcblx0XHQpO1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cdGNvbnN0IG5ld0NoZWNraW4gPSBmYWN0b3J5LmZyb21FeGlzdGluZyggY2hlY2tJblJlc3BvbnNlICk7XG5cdHlpZWxkIGRpc3BhdGNoKFxuXHRcdFJFRFVDRVJfS0VZLFxuXHRcdCdyZWNlaXZlTGF0ZXN0Q2hlY2tpbicsXG5cdFx0bmV3Q2hlY2tpbixcblx0XHRyZWdpc3RyYXRpb25JZCxcblx0XHRkYXRlVGltZUlkLFxuXHQpO1xuXHRyZXR1cm4gbmV3Q2hlY2tpbjtcbn1cbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBnZXRFbmRwb2ludCB9IGZyb20gJ0BldmVudGVzcHJlc3NvL21vZGVsJztcbmltcG9ydCB7IGlzTW9kZWxFbnRpdHlGYWN0b3J5T2ZNb2RlbCB9IGZyb20gJ0BldmVudGVzcHJlc3NvL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHsgaXNFbXB0eSwgaXNVbmRlZmluZWQgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnd2FybmluZyc7XG5cbi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBmZXRjaCwgZGlzcGF0Y2gsIHJlc29sdmVTZWxlY3QgfSBmcm9tICcuLi8uLi8uLi9iYXNlLWNvbnRyb2xzJztcbmltcG9ydCB7IFJFRFVDRVJfS0VZIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFJFRFVDRVJfS0VZIGFzIFNDSEVNQV9SRURVQ0VSX0tFWSB9IGZyb20gJy4uLy4uLy4uL3NjaGVtYS9jb25zdGFudHMnO1xuXG4vKipcbiAqIFJlc29sdmVyIGZvciB0aGUgZ2V0TGF0ZXN0Q2hlY2tpbiBhY3Rpb24uXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHJlZ2lzdHJhdGlvbklkXG4gKiBAcGFyYW0ge251bWJlcn0gZGF0ZVRpbWVJZFxuICogQHJldHVybiB7QmFzZUVudGl0eXxudWxsfSBOdWxsIGlmIHRoZXJlIGlzIGFuIGVycm9yIG9yIG5vIGNoZWNraW4gcmVjb3JkLlxuICovXG5leHBvcnQgZnVuY3Rpb24qIGdldExhdGVzdENoZWNraW4oIHJlZ2lzdHJhdGlvbklkLCBkYXRlVGltZUlkICkge1xuXHRsZXQgY2hlY2tJblJlc3BvbnNlO1xuXHR3YXJuaW5nKFxuXHRcdCEgaXNVbmRlZmluZWQoIHJlZ2lzdHJhdGlvbklkICkgJiYgISBpc1VuZGVmaW5lZCggZGF0ZVRpbWVJZCApLFxuXHRcdCdCb3RoIGEgcmVnaXN0cmF0aW9uIGlkIGFuZCBkYXRldGltZSBpZCBhcmUgbmVlZGVkIGZvciBnZXR0aW5nIHRoZSAnICtcblx0XHQnbGF0ZXN0IGNoZWNraW4uJ1xuXHQpO1xuXHRjb25zdCBwYXRoID0gYCR7IGdldEVuZHBvaW50KCAnY2hlY2tpbicgKSB9L2AgK1xuXHRcdGA/d2hlcmVbUkVHX0lEXT0keyByZWdpc3RyYXRpb25JZCB9JndoZXJlW0RUVF9JRF09JHsgZGF0ZVRpbWVJZCB9YCArXG5cdFx0JyZvcmRlcl9ieVtDSEtfdGltZXN0YW1wXT1ERVNDJmxpbWl0PTEnO1xuXHR0cnkge1xuXHRcdGNoZWNrSW5SZXNwb25zZSA9IHlpZWxkIGZldGNoKCB7XG5cdFx0XHRwYXRoLFxuXHRcdFx0bWV0aG9kOiAnR0VUJyxcblx0XHR9ICk7XG5cdFx0aWYgKCBpc0VtcHR5KCBjaGVja0luUmVzcG9uc2UgKSApIHtcblx0XHRcdC8vIHRoZXJlIGlzIG5vIGNoZWNraW4gcmVjb3JkIHlldCFcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRjaGVja0luUmVzcG9uc2UgPSBjaGVja0luUmVzcG9uc2UucG9wKCk7XG5cdH0gY2F0Y2ggKCBlcnJvciApIHtcblx0XHQvLyBAdG9kbyBuZWVkIHRvIGRvIHNvbWV0aGluZyBkaWZmZXJlbnQgd2hlbiB0aGUgdXNlciBpc24ndCBhdXRoZWQgYW5kXG5cdFx0Ly8gdGhpcyBpcyB0aGUgY2F1c2UgZm9yIHRoZSBlcnJvcj9cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHRjb25zdCBmYWN0b3J5ID0geWllbGQgcmVzb2x2ZVNlbGVjdChcblx0XHRTQ0hFTUFfUkVEVUNFUl9LRVksXG5cdFx0J2dldEZhY3RvcnlGb3JNb2RlbCcsXG5cdFx0J2NoZWNraW4nXG5cdCk7XG5cdGlmICggISBpc01vZGVsRW50aXR5RmFjdG9yeU9mTW9kZWwoIGZhY3RvcnksICdjaGVja2luJyApICkge1xuXHRcdHdhcm5pbmcoXG5cdFx0XHRmYWxzZSxcblx0XHRcdCdUaGUgZmFjdG9yeSBmb3IgdGhlIGNoZWNraW4gbW9kZWwgY291bGQgbm90IGJlIHJldHJpZXZlZC4nXG5cdFx0KTtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHRjb25zdCBuZXdDaGVja2luID0gZmFjdG9yeS5mcm9tRXhpc3RpbmcoIGNoZWNrSW5SZXNwb25zZSApO1xuXHR5aWVsZCBkaXNwYXRjaChcblx0XHRSRURVQ0VSX0tFWSxcblx0XHQncmVjZWl2ZUxhdGVzdENoZWNraW4nLFxuXHRcdG5ld0NoZWNraW4sXG5cdFx0cmVnaXN0cmF0aW9uSWQsXG5cdFx0ZGF0ZVRpbWVJZCxcblx0KTtcblx0cmV0dXJuIG5ld0NoZWNraW47XG59XG4iLCJpbXBvcnQgeyBnZXRTZWxlY3RvclZhbHVlIH0gZnJvbSAnLi4vbW9kZWwtc3BlY2lmaWMtc2VsZWN0b3JzJztcbmltcG9ydCB7IGdldEVudGl0eUJ5SWQgfSBmcm9tICcuLi8uLi9zZWxlY3RvcnMnO1xuXG4vKipcbiAqIEdldHMgdGhlIGxhdGVzdCBjaGVja2luIGVudGl0eSBpbiB0aGUgc3RhdGUgZm9yIHRoZSBnaXZlbiB2YWx1ZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHJlZ2lzdHJhdGlvbklkXG4gKiBAcGFyYW0ge251bWJlcn0gZGF0ZVRpbWVJZFxuICogQHJldHVybiB7bnVsbHxCYXNlRW50aXR5fSBUaGUgY2hlY2tpbiBlbnRpdHkgaWYgaXQgZXhpc3RzIG9yIG51bGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RDaGVja2luKCBzdGF0ZSwgcmVnaXN0cmF0aW9uSWQsIGRhdGVUaW1lSWQgKSB7XG5cdGNvbnN0IGNoZWNraW5JZCA9IGdldFNlbGVjdG9yVmFsdWUoXG5cdFx0c3RhdGUsXG5cdFx0J2dldExhdGVzdENoZWNraW4nLFxuXHRcdHJlZ2lzdHJhdGlvbklkLFxuXHRcdGRhdGVUaW1lSWRcblx0KTtcblx0aWYgKCAhIGNoZWNraW5JZCApIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHRyZXR1cm4gZ2V0RW50aXR5QnlJZCggc3RhdGUsICdjaGVja2luJywgY2hlY2tpbklkICk7XG59XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydFxuICovXG5pbXBvcnQgeyBNT0RFTF9OQU1FUyB9IGZyb20gJ0BldmVudGVzcHJlc3NvL21vZGVsJztcblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IGdldE1ldGhvZE5hbWUgfSBmcm9tICcuLi8uLi9iYXNlLW1vZGVsJztcblxuLyoqXG4gKiBEeW5hbWljIGNyZWF0aW9uIG9mIGFjdGlvbnMgZm9yIGVudGl0aWVzXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uIFRoZSBhY3Rpb24gb2JqZWN0IHRoYXQgZHluYW1pY2FsbHkgY3JlYXRlZCBmdW5jdGlvbnNcbiAqIHdpbGwgYmUgbWFwcGVkIHRvLlxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgbmV3IGFjdGlvbiBvYmplY3QgY29udGFpbmluZyBmdW5jdGlvbnMgZm9yIGVhY2ggbW9kZWwuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVBY3Rpb25zID0gKCBhY3Rpb24gKSA9PiBNT0RFTF9OQU1FUy5yZWR1Y2UoXG5cdCggYWN0aW9ucywgbW9kZWxOYW1lICkgPT4ge1xuXHRcdGFjdGlvbnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQnJyxcblx0XHRcdCdjcmVhdGUnXG5cdFx0KSBdID0gKCBlbnRpdHkgKSA9PiBhY3Rpb24uY3JlYXRlRW50aXR5KCBtb2RlbE5hbWUsIGVudGl0eSApO1xuXHRcdGFjdGlvbnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQnYnlJZCcsXG5cdFx0XHQnZGVsZXRlJ1xuXHRcdCkgXSA9ICggZW50aXR5SWQgKSA9PiBhY3Rpb24uZGVsZXRlRW50aXR5QnlJZCggbW9kZWxOYW1lLCBlbnRpdHlJZCApO1xuXHRcdGFjdGlvbnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQnYnlJZCcsXG5cdFx0XHQndHJhc2gnLFxuXHRcdCkgXSA9ICggZW50aXR5SWQgKSA9PiBhY3Rpb24udHJhc2hFbnRpdHlCeUlkKCBtb2RlbE5hbWUsIGVudGl0eUlkICk7XG5cdFx0YWN0aW9uc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCdyZWNvcmQnLFxuXHRcdFx0J3BlcnNpc3QnXG5cdFx0KSBdID0gKCBlbnRpdHkgKSA9PiBhY3Rpb24ucGVyc2lzdEVudGl0eVJlY29yZCggbW9kZWxOYW1lLCBlbnRpdHkgKTtcblx0XHRhY3Rpb25zWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J2lkJyxcblx0XHRcdCdwZXJzaXN0Rm9yJyxcblx0XHQpIF0gPSAoIGVudGl0eUlkICkgPT4gYWN0aW9uLnBlcnNpc3RGb3JFbnRpdHlJZCggbW9kZWxOYW1lLCBlbnRpdHlJZCApO1xuXHRcdGFjdGlvbnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQnaWRzJyxcblx0XHRcdCdwZXJzaXN0Rm9yJyxcblx0XHQpIF0gPSAoIGVudGl0eUlkcyApID0+IGFjdGlvbi5wZXJzaXN0Rm9yRW50aXR5SWRzKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0ZW50aXR5SWRzXG5cdFx0KTtcblx0XHRhY3Rpb25zWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0JycsXG5cdFx0XHQncGVyc2lzdERlbGV0ZXNGb3InLFxuXHRcdCkgXSA9ICgpID0+IGFjdGlvbi5wZXJzaXN0RGVsZXRlc0Zvck1vZGVsKCBtb2RlbE5hbWUgKTtcblx0XHRhY3Rpb25zWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0JycsXG5cdFx0XHQncGVyc2lzdFRyYXNoZXNGb3InLFxuXHRcdCkgXSA9ICgpID0+IGFjdGlvbi5wZXJzaXN0VHJhc2hlc0Zvck1vZGVsKCBtb2RlbE5hbWUgKTtcblx0XHRhY3Rpb25zWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J2J5SWQnLFxuXHRcdFx0J3JlbW92ZScsXG5cdFx0KSBdID0gKCBlbnRpdHlJZCApID0+IGFjdGlvbi5yZW1vdmVFbnRpdHlCeUlkKCBtb2RlbE5hbWUsIGVudGl0eUlkICk7XG5cdFx0YWN0aW9uc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCdpZCcsXG5cdFx0XHQncmVtb3ZlRGVsZXRlJyxcblx0XHQpIF0gPSAoIGVudGl0eUlkICkgPT4gYWN0aW9uLnJlbW92ZURlbGV0ZUVudGl0eUlkKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0ZW50aXR5SWRcblx0XHQpO1xuXHRcdGFjdGlvbnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQnaWQnLFxuXHRcdFx0J3JlbW92ZVRyYXNoJyxcblx0XHQpIF0gPSAoIGVudGl0eUlkICkgPT4gYWN0aW9uLnJlbW92ZVRyYXNoRW50aXR5SWQoIG1vZGVsTmFtZSwgZW50aXR5SWQgKTtcblx0XHRhY3Rpb25zWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J2FuZFJlc29sdmUnLFxuXHRcdFx0J3JlY2VpdmUnLFxuXHRcdFx0dHJ1ZVxuXHRcdCkgXSA9ICggZW50aXRpZXMgKSA9PiBhY3Rpb24ucmVjZWl2ZUVudGl0aWVzQW5kUmVzb2x2ZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdGVudGl0aWVzXG5cdFx0KTtcblx0XHRhY3Rpb25zWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J3JlY29yZHMnLFxuXHRcdFx0J3JlY2VpdmVBbmRSZXBsYWNlJyxcblx0XHQpIF0gPSAoIGVudGl0aWVzICkgPT4gYWN0aW9uLnJlY2VpdmVBbmRSZXBsYWNlRW50aXR5UmVjb3Jkcyhcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdGVudGl0aWVzXG5cdFx0KTtcblx0XHRhY3Rpb25zWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J2lkJyxcblx0XHRcdCdyZWNlaXZlVHJhc2gnLFxuXHRcdCkgXSA9ICggZW50aXR5SWQgKSA9PiBhY3Rpb24ucmVjZWl2ZVRyYXNoRW50aXR5SWQoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRlbnRpdHlJZFxuXHRcdCk7XG5cdFx0YWN0aW9uc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCdpZCcsXG5cdFx0XHQncmVjZWl2ZURlbGV0ZScsXG5cdFx0KSBdID0gKCBlbnRpdHlJZCApID0+IGFjdGlvbi5yZWNlaXZlRGVsZXRlRW50aXR5SWQoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRlbnRpdHlJZFxuXHRcdCk7XG5cdFx0cmV0dXJuIGFjdGlvbnM7XG5cdH0sXG5cdHt9XG4pO1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRcbiAqL1xuaW1wb3J0IHsgTU9ERUxfTkFNRVMgfSBmcm9tICdAZXZlbnRlc3ByZXNzby9tb2RlbCc7XG5cbi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBnZXRNZXRob2ROYW1lIH0gZnJvbSAnLi4vLi4vYmFzZS1tb2RlbCc7XG5cbi8qKlxuICogRHluYW1pYyBjcmVhdGlvbiBvZiByZXNvbHZlcnMgZm9yIGVudGl0aWVzXG4gKiBAcGFyYW0ge09iamVjdH0gcmVzb2x2ZXIgVGhlIHJlc29sdmVyIG9iamVjdCB0aGF0IGR5bmFtaWNhbGx5IGNyZWF0ZWRcbiAqIGZ1bmN0aW9ucyB3aWxsIGJlIG1hcHBlZCB0by5cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIG5ldyByZXNvbHZlciBvYmplY3QgY29udGFpbmluZyBmdW5jdGlvbnMgZm9yIGVhY2ggbW9kZWwuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVSZXNvbHZlcnMgPSAoIHJlc29sdmVyICkgPT4gTU9ERUxfTkFNRVMucmVkdWNlKFxuXHQoIHJlc29sdmVycywgbW9kZWxOYW1lICkgPT4ge1xuXHRcdHJlc29sdmVyc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCdieUlkJyxcblx0XHRcdCdnZXQnXG5cdFx0KSBdID0gKCBlbnRpdHlJZCApID0+IHJlc29sdmVyLmdldEVudGl0eUJ5SWQoIG1vZGVsTmFtZSwgZW50aXR5SWQgKTtcblx0XHRyZXR1cm4gcmVzb2x2ZXJzO1xuXHR9LFxuXHR7fVxuKTtcbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0XG4gKi9cbmltcG9ydCB7IE1PREVMX05BTUVTIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vbW9kZWwnO1xuXG4vKipcbiAqIEludGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgZ2V0TWV0aG9kTmFtZSB9IGZyb20gJy4uLy4uL2Jhc2UtbW9kZWwnO1xuXG4vKipcbiAqIER5bmFtaWMgY3JlYXRpb24gb2Ygc2VsZWN0b3JzIGZvciBlbnRpdGllc1xuICogQHBhcmFtIHtPYmplY3R9IHNlbGVjdG9yIHNlbGVjdG9yIG9iamVjdCB0aGF0IGR5bmFtaWNhbGx5IGNyZWF0ZWQgZnVuY3Rpb25zXG4gKiB3aWxsIGJlIG1hcHBlZCB0by5cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIG5ldyBzZWxlY3RvciBvYmplY3RzIGZvciBlYWNoIG1vZGVsLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlU2VsZWN0b3JzID0gKCBzZWxlY3RvciApID0+IE1PREVMX05BTUVTLnJlZHVjZShcblx0KCBzZWxlY3RvcnMsIG1vZGVsTmFtZSApID0+IHtcblx0XHRzZWxlY3RvcnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQncmVjb3JkcycsXG5cdFx0XHQnZ2V0J1xuXHRcdCkgXSA9IChcblx0XHRcdHN0YXRlXG5cdFx0KSA9PiBzZWxlY3Rvci5nZXRFbnRpdHlSZWNvcmRzRm9yTW9kZWwoIHN0YXRlLCBtb2RlbE5hbWUgKTtcblx0XHRzZWxlY3RvcnNbIGdldE1ldGhvZE5hbWUoIG1vZGVsTmFtZSwgJycsICdnZXQnLCB0cnVlICkgXSA9IChcblx0XHRcdHN0YXRlXG5cdFx0KSA9PiBzZWxlY3Rvci5nZXRFbnRpdGllc0Zvck1vZGVsKCBzdGF0ZSwgbW9kZWxOYW1lICk7XG5cdFx0c2VsZWN0b3JzWyBnZXRNZXRob2ROYW1lKCBtb2RlbE5hbWUsICdieUlkJywgJ2dldCcgKSBdID0gKFxuXHRcdFx0c3RhdGUsXG5cdFx0XHRlbnRpdHlJZFxuXHRcdCkgPT4gc2VsZWN0b3IuZ2V0RW50aXR5QnlJZCggc3RhdGUsIG1vZGVsTmFtZSwgZW50aXR5SWQgKTtcblx0XHRzZWxlY3RvcnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQnYnlJZHMnLFxuXHRcdFx0J2dldCcsXG5cdFx0XHR0cnVlXG5cdFx0KSBdID0gKFxuXHRcdFx0c3RhdGUsXG5cdFx0XHRlbnRpdHlJZHMsXG5cdFx0KSA9PiBzZWxlY3Rvci5nZXRFbnRpdGllc0J5SWRzKCBzdGF0ZSwgbW9kZWxOYW1lLCBlbnRpdHlJZHMgKTtcblx0XHRzZWxlY3RvcnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQnaWRzUXVldWVkRm9yVHJhc2gnLFxuXHRcdFx0J2dldCdcblx0XHQpIF0gPSAoIHN0YXRlICkgPT4gc2VsZWN0b3IuZ2V0RW50aXR5SWRzUXVldWVkRm9yVHJhc2goXG5cdFx0XHRzdGF0ZSxcblx0XHRcdG1vZGVsTmFtZVxuXHRcdCk7XG5cdFx0c2VsZWN0b3JzWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J2lkc1F1ZXVlZEZvckRlbGV0ZScsXG5cdFx0XHQnZ2V0J1xuXHRcdCkgXSA9ICggc3RhdGUgKSA9PiBzZWxlY3Rvci5nZXRFbnRpdHlJZHNRdWV1ZWRGb3JEZWxldGUoXG5cdFx0XHRzdGF0ZSxcblx0XHRcdG1vZGVsTmFtZVxuXHRcdCk7XG5cdFx0cmV0dXJuIHNlbGVjdG9ycztcblx0fSxcblx0e31cbik7XG4iLCJpbXBvcnQgKiBhcyBlbnRpdHlBY3Rpb25zIGZyb20gJy4vZW50aXR5LWFjdGlvbnMnO1xuaW1wb3J0ICogYXMgZW50aXR5UmVzb2x2ZXJzIGZyb20gJy4vZW50aXR5LXJlc29sdmVycyc7XG5pbXBvcnQgKiBhcyBlbnRpdHlTZWxlY3RvcnMgZnJvbSAnLi9lbnRpdHktc2VsZWN0b3JzJztcbmltcG9ydCAqIGFzIHJlbGF0aW9uQWN0aW9ucyBmcm9tICcuL3JlbGF0aW9uLWFjdGlvbnMnO1xuaW1wb3J0ICogYXMgcmVsYXRpb25TZWxlY3RvcnMgZnJvbSAnLi9yZWxhdGlvbi1zZWxlY3RvcnMnO1xuaW1wb3J0ICogYXMgYmFzZVNlbGVjdG9ycyBmcm9tICcuLi9zZWxlY3RvcnMnO1xuaW1wb3J0ICogYXMgYmFzZUFjdGlvbnMgZnJvbSAnLi4vYWN0aW9ucyc7XG5pbXBvcnQgKiBhcyBiYXNlUmVzb2x2ZXJzIGZyb20gJy4uL3Jlc29sdmVycyc7XG5pbXBvcnQgKiBhcyBtb2RlbEFjdGlvbnMgZnJvbSAnLi9tb2RlbC1hY3Rpb25zLWluZGV4JztcbmltcG9ydCAqIGFzIG1vZGVsU2VsZWN0b3JzIGZyb20gJy4vbW9kZWwtc2VsZWN0b3JzLWluZGV4JztcbmltcG9ydCAqIGFzIG1vZGVsUmVzb2x2ZXJzIGZyb20gJy4vbW9kZWwtcmVzb2x2ZXJzLWluZGV4JztcblxuZXhwb3J0IGNvbnN0IHNlbGVjdG9ycyA9IHtcblx0Li4uZW50aXR5U2VsZWN0b3JzLmNyZWF0ZVNlbGVjdG9ycyggYmFzZVNlbGVjdG9ycyApLFxuXHQuLi5yZWxhdGlvblNlbGVjdG9ycy5jcmVhdGVTZWxlY3RvcnMoIGJhc2VTZWxlY3RvcnMgKSxcblx0Li4ubW9kZWxTZWxlY3RvcnMsXG59O1xuXG5leHBvcnQgY29uc3QgYWN0aW9ucyA9IHtcblx0Li4uZW50aXR5QWN0aW9ucy5jcmVhdGVBY3Rpb25zKCBiYXNlQWN0aW9ucyApLFxuXHQuLi5yZWxhdGlvbkFjdGlvbnMuY3JlYXRlQWN0aW9ucyggYmFzZUFjdGlvbnMgKSxcblx0Li4ubW9kZWxBY3Rpb25zLFxufTtcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVycyA9IHtcblx0Li4uZW50aXR5UmVzb2x2ZXJzLmNyZWF0ZVJlc29sdmVycyggYmFzZVJlc29sdmVycyApLFxuXHQuLi5tb2RlbFJlc29sdmVycyxcbn07XG4iLCJleHBvcnQgKiBmcm9tICcuL21vZGVsLXNwZWNpZmljLWFjdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9jaGVja2luL2FjdGlvbnMnO1xuIiwiZXhwb3J0ICogZnJvbSAnLi9jaGVja2luL3Jlc29sdmVycyc7XG4iLCJleHBvcnQgKiBmcm9tICcuL21vZGVsLXNwZWNpZmljLXNlbGVjdG9ycyc7XG5leHBvcnQgKiBmcm9tICcuL2NoZWNraW4vc2VsZWN0b3JzJztcbiIsIi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBBQ1RJT05fVFlQRVMgfSBmcm9tICcuLi9hY3Rpb25zL2FjdGlvbi10eXBlcyc7XG5jb25zdCB7IG1vZGVsU3BlY2lmaWM6IHR5cGVzIH0gPSBBQ1RJT05fVFlQRVM7XG5cbi8qKlxuICogQWN0aW9uIGZvciBhZGRpbmcgdGhlIHJlc3VsdHMgb2YgYSBzcGVjaWZpYyBzZWxlY3RvciBhbmQgaXRzIHZhbHVlIHRvIHRoZVxuICogc3RhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3NcbiAqIEByZXR1cm4ge09iamVjdH0gQW4gYWN0aW9uIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjZWl2ZVNlbGVjdG9yVmFsdWUoIHNlbGVjdG9yLCB2YWx1ZSwgLi4uYXJncyApIHtcblx0cmV0dXJuIHtcblx0XHR0eXBlOiB0eXBlcy5SRUNFSVZFX1NFTEVDVE9SX1ZBTFVFLFxuXHRcdHNlbGVjdG9yLFxuXHRcdGFyZ3MsXG5cdFx0dmFsdWUsXG5cdH07XG59XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IGNyZWF0ZVNlbGVjdG9yIGZyb20gJ3JlbWVtbyc7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBzZWxlY3RvciBhbmQgYXJncyBpbiB0aGUgY3VycmVudCBzdGF0ZS5cbiAqXG4gKiBAdHlwZSB7Kn0gUmV0dXJucyB3aGF0ZXZlciB0aGUgdmFsdWUgd2FzIGFzc2lnbmVkIHRvIHRoZSBzdGF0ZSBmb3IgdGhlIGdpdmVuXG4gKiBzZWxlY3RvciBhbmQgaXRzIGFyZ3MuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTZWxlY3RvclZhbHVlID0gY3JlYXRlU2VsZWN0b3IoXG5cdCggc3RhdGUsIHNlbGVjdG9yLCAuLi5hcmdzICkgPT4ge1xuXHRcdHJldHVybiBzdGF0ZS5tb2RlbFNwZWNpZmljLmdldEluKFxuXHRcdFx0WyBzZWxlY3RvciwgSlNPTi5zdHJpbmdpZnkoIGFyZ3MgKSBdXG5cdFx0KSB8fCBudWxsO1xuXHR9LFxuXHQoIHN0YXRlLCBzZWxlY3RvciwgLi4uYXJncyApID0+IFtcblx0XHRzdGF0ZS5tb2RlbFNwZWNpZmljLmdldEluKCBbXG5cdFx0XHRzZWxlY3Rvcixcblx0XHRcdEpTT04uc3RyaW5naWZ5KCBhcmdzICksXG5cdFx0XSApLFxuXHRdLFxuKTtcbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0XG4gKi9cbmltcG9ydCB7IE1PREVMX05BTUVTIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vbW9kZWwnO1xuXG4vKipcbiAqIEludGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgZ2V0TWV0aG9kTmFtZSB9IGZyb20gJy4uLy4uL2Jhc2UtbW9kZWwnO1xuXG4vKipcbiAqIER5bmFtaWMgY3JlYXRpb24gb2YgYWN0aW9ucyBmb3IgcmVsYXRpb25zXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uIFRoZSBhY3Rpb24gb2JqZWN0IHRoYXQgZHluYW1pY2FsbHkgY3JlYXRlZCBmdW5jdGlvbnNcbiAqIHdpbGwgYmUgbWFwcGVkIHRvLlxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgbmV3IGFjdGlvbiBvYmplY3QgY29udGFpbmluZyBmdW5jdGlvbnMgZm9yIGVhY2ggbW9kZWxcbiAqIHJlbGF0aW9uLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQWN0aW9ucyA9ICggYWN0aW9uICkgPT4gTU9ERUxfTkFNRVMucmVkdWNlKFxuXHQoIGFjdGlvbnMsIG1vZGVsTmFtZSApID0+IHtcblx0XHRhY3Rpb25zWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J3JlbGF0aW9uJyxcblx0XHRcdCdjcmVhdGUnLFxuXHRcdCkgXSA9ICggZW50aXR5SWQsIHJlbGF0aW9uTmFtZSwgcmVsYXRpb25FbnRpdHkgKSA9PiBhY3Rpb25cblx0XHRcdC5jcmVhdGVSZWxhdGlvbihcblx0XHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0XHRlbnRpdHlJZCxcblx0XHRcdFx0cmVsYXRpb25OYW1lLFxuXHRcdFx0XHRyZWxhdGlvbkVudGl0eSxcblx0XHRcdCk7XG5cdFx0YWN0aW9uc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCdyZWxhdGlvbnMnLFxuXHRcdFx0J2NyZWF0ZScsXG5cdFx0KSBdID0gKCBlbnRpdHlJZCwgcmVsYXRpb25OYW1lLCByZWxhdGlvbkVudGl0aWVzICkgPT4gYWN0aW9uXG5cdFx0XHQuY3JlYXRlUmVsYXRpb25zKFxuXHRcdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRcdGVudGl0eUlkLFxuXHRcdFx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0XHRcdHJlbGF0aW9uRW50aXRpZXMsXG5cdFx0XHQpO1xuXHRcdGFjdGlvbnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQncmVsYXRpb25Gb3JBZGRpdGlvbicsXG5cdFx0XHQncmVtb3ZlRGlydHknXG5cdFx0KSBdID0gKCBlbnRpdHlJZCwgcmVsYXRpb25OYW1lLCByZWxhdGlvbkVudGl0eUlkICkgPT4gYWN0aW9uXG5cdFx0XHQucmVtb3ZlRGlydHlSZWxhdGlvbkZvckFkZGl0aW9uKFxuXHRcdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRcdGVudGl0eUlkLFxuXHRcdFx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0XHRcdHJlbGF0aW9uRW50aXR5SWQsXG5cdFx0XHQpO1xuXHRcdGFjdGlvbnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQnJyxcblx0XHRcdCdyZW1vdmVSZWxhdGlvbkZvcidcblx0XHQpIF0gPSAoIGVudGl0eUlkLCByZWxhdGlvbk5hbWUsIHJlbGF0aW9uRW50aXR5SWQgKSA9PiBhY3Rpb25cblx0XHRcdC5yZW1vdmVSZWxhdGlvbkZvckVudGl0eShcblx0XHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0XHRlbnRpdHlJZCxcblx0XHRcdFx0cmVsYXRpb25OYW1lLFxuXHRcdFx0XHRyZWxhdGlvbkVudGl0eUlkXG5cdFx0XHQpO1xuXHRcdGFjdGlvbnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQnJyxcblx0XHRcdCdwZXJzaXN0QWRkUmVsYXRpb25zRm9yJ1xuXHRcdCkgXSA9ICgpID0+IGFjdGlvbi5wZXJzaXN0QWRkUmVsYXRpb25zRm9yTW9kZWwoIG1vZGVsTmFtZSApO1xuXHRcdGFjdGlvbnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQnJyxcblx0XHRcdCdwZXJzaXN0RGVsZXRlUmVsYXRpb25zRm9yJ1xuXHRcdCkgXSA9ICgpID0+IGFjdGlvbi5wZXJzaXN0RGVsZXRlUmVsYXRpb25zRm9yTW9kZWwoIG1vZGVsTmFtZSApO1xuXHRcdGFjdGlvbnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQnJyxcblx0XHRcdCdwZXJzaXN0UmVsYXRpb25zRm9yJ1xuXHRcdCkgXSA9ICggYWRkUmVsYXRpb24gPSB0cnVlICkgPT5cblx0XHRcdGFjdGlvbi5wZXJzaXN0UmVsYXRpb25zRm9yTW9kZWwoIG1vZGVsTmFtZSwgYWRkUmVsYXRpb24gKTtcblx0XHRhY3Rpb25zWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J3JlbGF0aW9uc0ZvcklkJyxcblx0XHRcdCdwZXJzaXN0J1xuXHRcdCkgXSA9ICggZW50aXR5SWQsIGFkZFJlbGF0aW9uID0gdHJ1ZSApID0+IGFjdGlvblxuXHRcdFx0LnBlcnNpc3RSZWxhdGlvbnNGb3JFbnRpdHlJZChcblx0XHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0XHRlbnRpdHlJZCxcblx0XHRcdFx0YWRkUmVsYXRpb25cblx0XHRcdCk7XG5cdFx0YWN0aW9uc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCdyZWxhdGlvbnNGb3JJZEFuZFJlbGF0aW9uJyxcblx0XHRcdCdwZXJzaXN0J1xuXHRcdCkgXSA9ICggZW50aXR5SWQsIHJlbGF0aW9uTmFtZSwgYWRkUmVsYXRpb24gPSB0cnVlICkgPT4gYWN0aW9uXG5cdFx0XHQucGVyc2lzdFJlbGF0aW9uc0ZvckVudGl0eUlkQW5kUmVsYXRpb24oXG5cdFx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdFx0ZW50aXR5SWQsXG5cdFx0XHRcdHJlbGF0aW9uTmFtZSxcblx0XHRcdFx0YWRkUmVsYXRpb25cblx0XHRcdCk7XG5cdFx0YWN0aW9uc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCdyZWxhdGlvbnNGb3JJZEFuZFJlbGF0aW9uSWQnLFxuXHRcdFx0J3BlcnNpc3QnXG5cdFx0KSBdID0gKFxuXHRcdFx0ZW50aXR5SWQsXG5cdFx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0XHRyZWxhdGlvbklkLFxuXHRcdFx0YWRkUmVsYXRpb24gPSB0cnVlXG5cdFx0KSA9PiBhY3Rpb25cblx0XHRcdC5wZXJzaXN0UmVsYXRpb25zRm9yRW50aXR5SWRBbmRSZWxhdGlvbklkKFxuXHRcdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRcdGVudGl0eUlkLFxuXHRcdFx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0XHRcdHJlbGF0aW9uSWQsXG5cdFx0XHRcdGFkZFJlbGF0aW9uXG5cdFx0XHQpO1xuXHRcdGFjdGlvbnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQnaWQnLFxuXHRcdFx0J3JlY2VpdmVSZWxhdGVkRW50aXRpZXNGb3InXG5cdFx0KSBdID0gKCBlbnRpdHlJZCwgcmVsYXRpb25OYW1lLCByZWxhdGlvbkVudGl0eUlkcyApID0+IGFjdGlvblxuXHRcdFx0LnJlY2VpdmVSZWxhdGVkRW50aXRpZXMoXG5cdFx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdFx0ZW50aXR5SWQsXG5cdFx0XHRcdHJlbGF0aW9uTmFtZSxcblx0XHRcdFx0cmVsYXRpb25FbnRpdHlJZHNcblx0XHRcdCk7XG5cdFx0YWN0aW9uc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCdpZCcsXG5cdFx0XHQncmVjZWl2ZURpcnR5UmVsYXRpb25BZGRpdGlvbkZvcidcblx0XHQpIF0gPSAoIHJlbGF0aW9uTmFtZSwgcmVsYXRpb25JZCwgZW50aXR5SWQgKSA9PiBhY3Rpb25cblx0XHRcdC5yZWNlaXZlRGlydHlSZWxhdGlvbkFkZGl0aW9uKFxuXHRcdFx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0XHRcdHJlbGF0aW9uSWQsXG5cdFx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdFx0ZW50aXR5SWRcblx0XHRcdCk7XG5cdFx0YWN0aW9uc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCdpZCcsXG5cdFx0XHQncmVjZWl2ZURpcnR5UmVsYXRpb25EZWxldGlvbkZvcidcblx0XHQpIF0gPSAoIHJlbGF0aW9uTmFtZSwgcmVsYXRpb25JZCwgZW50aXR5SWQgKSA9PiBhY3Rpb25cblx0XHRcdC5yZWNlaXZlRGlydHlSZWxhdGlvbkRlbGV0aW9uKFxuXHRcdFx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0XHRcdHJlbGF0aW9uSWQsXG5cdFx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdFx0ZW50aXR5SWRcblx0XHRcdCk7XG5cdFx0YWN0aW9uc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCdyZWxhdGlvbnMnLFxuXHRcdFx0J3JlY2VpdmVVcGRhdGVkRW50aXR5SWRGb3InXG5cdFx0KSBdID0gKCBvbGRJZCwgbmV3SWQgKSA9PiBhY3Rpb25cblx0XHRcdC5yZWNlaXZlVXBkYXRlZEVudGl0eUlkRm9yUmVsYXRpb25zKFxuXHRcdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRcdG9sZElkLFxuXHRcdFx0XHRuZXdJZFxuXHRcdFx0KTtcblx0XHRhY3Rpb25zWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J2lkJyxcblx0XHRcdCdyZW1vdmVBbGxSZWxhdGVkRW50aXRpZXNGb3InXG5cdFx0KSBdID0gKCBlbnRpdHlJZCApID0+IGFjdGlvbi5yZW1vdmVBbGxSZWxhdGVkRW50aXRpZXNGb3JNb2RlbEVudGl0eShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdGVudGl0eUlkXG5cdFx0KTtcblx0XHRhY3Rpb25zWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J2lkQW5kUmVsYXRpb24nLFxuXHRcdFx0J3JlbW92ZVJlbGF0ZWRFbnRpdGllc0Zvcidcblx0XHQpIF0gPSAoIGVudGl0eUlkLCByZWxhdGlvbk5hbWUsIHJlbGF0aW9uSWRzICkgPT4gYWN0aW9uXG5cdFx0XHQucmVtb3ZlUmVsYXRlZEVudGl0aWVzKFxuXHRcdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRcdGVudGl0eUlkLFxuXHRcdFx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0XHRcdHJlbGF0aW9uSWRzLFxuXHRcdFx0KTtcblx0XHRhY3Rpb25zWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J2lkQW5kUmVsYXRpb24nLFxuXHRcdFx0J3JlbW92ZURpcnR5UmVsYXRpb25BZGRpdGlvbkZvcidcblx0XHQpIF0gPSAoXG5cdFx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0XHRyZWxhdGlvbkVudGl0eUlkLFxuXHRcdFx0ZW50aXR5SWQsXG5cdFx0KSA9PiBhY3Rpb24ucmVtb3ZlRGlydHlSZWxhdGlvbkFkZGl0aW9uKFxuXHRcdFx0cmVsYXRpb25OYW1lLFxuXHRcdFx0cmVsYXRpb25FbnRpdHlJZCxcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdGVudGl0eUlkLFxuXHRcdCk7XG5cdFx0YWN0aW9uc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCdpZEFuZFJlbGF0aW9uJyxcblx0XHRcdCdyZW1vdmVEaXJ0eVJlbGF0aW9uRGVsZXRpb25Gb3InXG5cdFx0KSBdID0gKFxuXHRcdFx0cmVsYXRpb25OYW1lLFxuXHRcdFx0cmVsYXRpb25FbnRpdHlJZCxcblx0XHRcdGVudGl0eUlkLFxuXHRcdCkgPT4gYWN0aW9uLnJlbW92ZURpcnR5UmVsYXRpb25EZWxldGlvbihcblx0XHRcdHJlbGF0aW9uTmFtZSxcblx0XHRcdHJlbGF0aW9uRW50aXR5SWQsXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRlbnRpdHlJZCxcblx0XHQpO1xuXHRcdHJldHVybiBhY3Rpb25zO1xuXHR9LFxuXHR7fVxuKTtcbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0XG4gKi9cbmltcG9ydCB7IE1PREVMX05BTUVTIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vbW9kZWwnO1xuXG4vKipcbiAqIEludGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgZ2V0TWV0aG9kTmFtZSB9IGZyb20gJy4uLy4uL2Jhc2UtbW9kZWwnO1xuXG4vKipcbiAqIER5bmFtaWMgY3JlYXRpb24gb2Ygc2VsZWN0b3JzIGZvciByZWxhdGlvbnNcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxlY3RvciBzZWxlY3RvciBvYmplY3QgdGhhdCBkeW5hbWljYWxseSBjcmVhdGVkIGZ1bmN0aW9uc1xuICogd2lsbCBiZSBtYXBwZWQgdG8uXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBuZXcgc2VsZWN0b3Igb2JqZWN0cyBmb3IgZWFjaCBtb2RlbCByZWxhdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVNlbGVjdG9ycyA9ICggc2VsZWN0b3IgKSA9PiBNT0RFTF9OQU1FUy5yZWR1Y2UoXG5cdCggc2VsZWN0b3JzLCBtb2RlbE5hbWUgKSA9PiB7XG5cdFx0c2VsZWN0b3JzWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J2FkZGl0aW9uUmVsYXRpb25zJyxcblx0XHRcdCdnZXRRdWV1ZWQnXG5cdFx0KSBdID0gKCBzdGF0ZSApID0+IHNlbGVjdG9yLmdldFJlbGF0aW9uQWRkaXRpb25zUXVldWVkRm9yTW9kZWwoXG5cdFx0XHRzdGF0ZSxcblx0XHRcdG1vZGVsTmFtZVxuXHRcdCk7XG5cdFx0c2VsZWN0b3JzWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J2RlbGV0ZVJlbGF0aW9ucycsXG5cdFx0XHQnZ2V0UXVldWVkJ1xuXHRcdCkgXSA9ICggc3RhdGUgKSA9PiBzZWxlY3Rvci5nZXRSZWxhdGlvbkRlbGV0aW9uc1F1ZXVlZEZvck1vZGVsKFxuXHRcdFx0c3RhdGUsXG5cdFx0XHRtb2RlbE5hbWVcblx0XHQpO1xuXHRcdHNlbGVjdG9yc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCdpZCcsXG5cdFx0XHQnY291bnRSZWxhdGlvbk1vZGVsc0luZGV4ZWRGb3InXG5cdFx0KSBdID0gKCBzdGF0ZSwgZW50aXR5SWQgKSA9PiBzZWxlY3RvclxuXHRcdFx0LmNvdW50UmVsYXRpb25Nb2RlbHNJbmRleGVkRm9yRW50aXR5KFxuXHRcdFx0XHRzdGF0ZSxcblx0XHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0XHRlbnRpdHlJZFxuXHRcdFx0KTtcblx0XHRyZXR1cm4gc2VsZWN0b3JzO1xuXHR9LFxuXHR7fVxuKTtcbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBERUZBVUxUX0NPUkVfU1RBVEUgfSBmcm9tICdAZXZlbnRlc3ByZXNzby9tb2RlbCc7XG5pbXBvcnQgeyBmcm9tSlMsIFNldCB9IGZyb20gJ2ltbXV0YWJsZSc7XG5pbXBvcnQgeyBub3JtYWxpemVFbnRpdHlJZCB9IGZyb20gJ0BldmVudGVzcHJlc3NvL2hlbHBlcnMnO1xuXG4vKipcbiAqIEludGVybmFsIGltcG9ydHMuXG4gKi9cbmltcG9ydCB7IEFDVElPTl9UWVBFUyB9IGZyb20gJy4uL2FjdGlvbnMvYWN0aW9uLXR5cGVzJztcbmNvbnN0IHsgZW50aXRpZXM6IHR5cGVzIH0gPSBBQ1RJT05fVFlQRVM7XG5cbi8qKlxuICogSGFuZGxlIGFkZGluZyBpbmNvbWluZyBkYXRhIHRvIHN0YXRlLlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbnRpdHlJZFxuICogQHBhcmFtIHtJbW11dGFibGUuU2V0fSBleGlzdGluZ0VudGl0aWVzXG4gKiBAcmV0dXJuIHtJbW11dGFibGUuTWFwfSBOZXcgc3RhdGUuXG4gKi9cbmNvbnN0IGFkZFRvU3RhdGUgPSAoIHN0YXRlLCBtb2RlbE5hbWUsIGVudGl0eUlkLCBleGlzdGluZ0VudGl0aWVzICkgPT4ge1xuXHRleGlzdGluZ0VudGl0aWVzID0gZXhpc3RpbmdFbnRpdGllcy5hZGQoIGVudGl0eUlkICk7XG5cdHJldHVybiBzdGF0ZS5zZXQoIG1vZGVsTmFtZSwgZXhpc3RpbmdFbnRpdGllcyApO1xufTtcblxuLyoqXG4gKiBIYW5kbGUgcmVtb3ZpbmcgaW5jb21pbmcgZGF0YSBmcm9tIHN0YXRlXG4gKlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBlbnRpdHlJZFxuICogQHJldHVybiB7SW1tdXRhYmxlLk1hcH0gbmV3IHN0YXRlIG9yIGV4aXN0aW5nIHN0YXRlIGlmIG5vIGNoYW5nZS5cbiAqL1xuY29uc3QgcmVtb3ZlRnJvbVN0YXRlID0gKCBzdGF0ZSwgbW9kZWxOYW1lLCBlbnRpdHlJZCApID0+IHtcblx0bGV0IGVudGl0eUlkcyA9IHN0YXRlLmdldCggbW9kZWxOYW1lLCBTZXQoKSApO1xuXHRpZiAoICEgZW50aXR5SWRzLmluY2x1ZGVzKCBlbnRpdHlJZCApICkge1xuXHRcdHJldHVybiBzdGF0ZTtcblx0fVxuXHRlbnRpdHlJZHMgPSBlbnRpdHlJZHMuZGVsZXRlKCBlbnRpdHlJZCApO1xuXHRyZXR1cm4gZW50aXR5SWRzLmlzRW1wdHkoKSA/XG5cdFx0c3RhdGUuZGVsZXRlKCBtb2RlbE5hbWUgKSA6XG5cdFx0c3RhdGUuc2V0KCBtb2RlbE5hbWUsIGVudGl0eUlkcyApO1xufTtcblxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIGluY29taW5nIGFjdGlvblxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEByZXR1cm4ge0ltbXV0YWJsZS5NYXB9IEVpdGhlciB0aGUgZXhpc3Rpbmcgc3RhdGUgaWYgbm8gY2hhbmdlIG9yIG5ldyBzdGF0ZS5cbiAqL1xuY29uc3QgcHJvY2Vzc0FjdGlvbiA9ICggc3RhdGUsIGFjdGlvbiApID0+IHtcblx0Y29uc3QgeyB0eXBlLCBtb2RlbE5hbWUgfSA9IGFjdGlvbjtcblx0Y29uc3QgZW50aXR5SWQgPSBub3JtYWxpemVFbnRpdHlJZCggYWN0aW9uLmVudGl0eUlkICk7XG5cdGNvbnN0IGV4aXN0aW5nRW50aXRpZXMgPSBzdGF0ZS5nZXQoIG1vZGVsTmFtZSwgU2V0KCkgKTtcblxuXHRzd2l0Y2ggKCB0eXBlICkge1xuXHRcdGNhc2UgdHlwZXMuUkVDRUlWRV9ERUxFVEVfRU5USVRZX0lEOlxuXHRcdGNhc2UgdHlwZXMuUkVDRUlWRV9UUkFTSF9FTlRJVFlfSUQ6XG5cdFx0XHRzdGF0ZSA9IGFkZFRvU3RhdGUoIHN0YXRlLCBtb2RlbE5hbWUsIGVudGl0eUlkLCBleGlzdGluZ0VudGl0aWVzICk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIHR5cGVzLlJFTU9WRV9ERUxFVEVfRU5USVRZX0lEOlxuXHRcdGNhc2UgdHlwZXMuUkVNT1ZFX1RSQVNIX0VOVElUWV9JRDpcblx0XHRcdHN0YXRlID0gcmVtb3ZlRnJvbVN0YXRlKCBzdGF0ZSwgbW9kZWxOYW1lLCBlbnRpdHlJZCApO1xuXHRcdFx0YnJlYWs7XG5cdH1cblx0cmV0dXJuIHN0YXRlO1xufTtcblxuLyoqXG4gKiBSZWR1Y2VyIGZvciBxdWV1aW5nIGFuIGVudGl0eSBmb3IgZGVsZXRpb24gaW4gdGhlIHN0YXRlLlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEByZXR1cm4ge0ltbXV0YWJsZS5NYXB9IEV4aXN0aW5nIG9yIG5ldyBzdGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZUVudGl0eShcblx0c3RhdGUgPSBmcm9tSlMoIERFRkFVTFRfQ09SRV9TVEFURS5kaXJ0eS5kZWxldGUgKSxcblx0YWN0aW9uXG4pIHtcblx0cmV0dXJuIGFjdGlvbi50eXBlID09PSB0eXBlcy5SRUNFSVZFX0RFTEVURV9FTlRJVFlfSUQgfHxcblx0XHRhY3Rpb24udHlwZSA9PT0gdHlwZXMuUkVNT1ZFX0RFTEVURV9FTlRJVFlfSUQgP1xuXHRcdHByb2Nlc3NBY3Rpb24oIHN0YXRlLCBhY3Rpb24gKSA6XG5cdFx0c3RhdGU7XG59XG5cbi8qKlxuICogUmVkdWNlciBmb3IgcXVldWVpbmcgdGhlIGVudGl0eSBmb3IgdHJhc2hpbmcgaW4gdGhlIHN0YXRlLlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEByZXR1cm4ge0ltbXV0YWJsZS5NYXB9IEV4aXN0aW5nIG9yIG5ldyBzdGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYXNoRW50aXR5KFxuXHRzdGF0ZSA9IGZyb21KUyggREVGQVVMVF9DT1JFX1NUQVRFLmRpcnR5LnRyYXNoICksXG5cdGFjdGlvblxuKSB7XG5cdHJldHVybiBhY3Rpb24udHlwZSA9PT0gdHlwZXMuUkVDRUlWRV9UUkFTSF9FTlRJVFlfSUQgfHxcblx0XHRhY3Rpb24udHlwZSA9PT0gdHlwZXMuUkVNT1ZFX1RSQVNIX0VOVElUWV9JRCA/XG5cdFx0cHJvY2Vzc0FjdGlvbiggc3RhdGUsIGFjdGlvbiApIDpcblx0XHRzdGF0ZTtcbn1cbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQge1xuXHRERUZBVUxUX0NPUkVfU1RBVEUsXG5cdHBsdXJhbE1vZGVsTmFtZSxcblx0c2luZ3VsYXJNb2RlbE5hbWUsXG59IGZyb20gJ0BldmVudGVzcHJlc3NvL21vZGVsJztcbmltcG9ydCB7IGZyb21KUywgU2V0LCBNYXAgfSBmcm9tICdpbW11dGFibGUnO1xuaW1wb3J0IHtcblx0cmVtb3ZlRW1wdHlGcm9tU3RhdGUsXG5cdG5vcm1hbGl6ZUVudGl0eUlkLFxufSBmcm9tICdAZXZlbnRlc3ByZXNzby9oZWxwZXJzJztcbmltcG9ydCBjdWlkIGZyb20gJ2N1aWQnO1xuXG4vKipcbiAqIEludGVybmFsIGltcG9ydHMuXG4gKi9cbmltcG9ydCB7IEFDVElPTl9UWVBFUyB9IGZyb20gJy4uL2FjdGlvbnMvYWN0aW9uLXR5cGVzJztcbmNvbnN0IHsgcmVsYXRpb25zOiB0eXBlcyB9ID0gQUNUSU9OX1RZUEVTO1xuXG4vKipcbiAqIFVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHJlbGF0aW9uIGV4aXN0cyBpbiB0aGUgcHJvdmlkZWQgbWFwLlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gcmVsYXRpb25NYXBcbiAqIEBwYXJhbSB7c3RyaW5nfSBxdWV1ZVR5cGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbnRpdHlJZFxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBtZWFucyB0aGUgcmVsYXRpb24gZXhpc3RzIGZvciB0aGUgZ2l2ZW4gZW50aXR5IElkXG4gKiBmYWxzZSBtZWFucyBpdCBkb2VzIG5vdCBleGlzdC5cbiAqL1xuY29uc3QgcmVsYXRpb25FeGlzdHNJbk1hcCA9ICggcmVsYXRpb25NYXAsIHF1ZXVlVHlwZSwgZW50aXR5SWQgKSA9PiB7XG5cdHJldHVybiByZWxhdGlvbk1hcC5nZXQoIHF1ZXVlVHlwZSwgU2V0KCkgKS5pbmNsdWRlcyggZW50aXR5SWQgKTtcbn07XG5cbi8qKlxuICogVXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSByZWxhdGlvbiBleGlzdHMgYWxyZWFkeSBpbiB0aGUgc3RhdGUgZm9yIHRoZVxuICogZ2l2ZW4gZGF0YS5cbiAqXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHN0YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHJlbGF0aW9uTWFwXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIG1lYW5zIHRoZSByZWxhdGlvbiBleGlzdHMgaW4gdGhlIHN0YXRlLlxuICovXG5jb25zdCBoYXNSZWxhdGlvbiA9ICggc3RhdGUsIGFjdGlvbiwgcmVsYXRpb25NYXAgKSA9PiB7XG5cdGNvbnN0IHtcblx0XHRyZWxhdGlvbkVudGl0eUlkLFxuXHRcdGVudGl0eUlkLFxuXHRcdHF1ZXVlVHlwZSxcblx0fSA9IGFjdGlvbjtcblx0bGV0IHsgcmVsYXRpb25OYW1lLCBtb2RlbE5hbWUgfSA9IGFjdGlvbjtcblx0aWYgKCByZWxhdGlvbkV4aXN0c0luTWFwKCByZWxhdGlvbk1hcCwgcXVldWVUeXBlLCBlbnRpdHlJZCApICkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8gc3RpbGwgaGVyZT8gT2theSwgbGV0J3MgZG8gYSByZXZlcnNlIGxvb2t1cCB0aGVuLCB3aGVyZSB0aGUgcmVsYXRpb24gbWF5XG5cdC8vIGJlIHN0b3JlZCB3aXRoIHRoZSByZWxhdGlvbiBhcyB0aGUgb3JpZ2luYXRpbmcgZW50aXR5LlxuXHRyZWxhdGlvbk5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggcmVsYXRpb25OYW1lICk7XG5cdG1vZGVsTmFtZSA9IHBsdXJhbE1vZGVsTmFtZSggbW9kZWxOYW1lICk7XG5cdGNvbnN0IGVudGl0eUlkcyA9IHN0YXRlLmdldEluKFxuXHRcdFsgcXVldWVUeXBlLCByZWxhdGlvbk5hbWUsIHJlbGF0aW9uRW50aXR5SWQsIG1vZGVsTmFtZSBdLFxuXHQpO1xuXHRyZXR1cm4gZW50aXR5SWRzID8gZW50aXR5SWRzLmluY2x1ZGVzKCBlbnRpdHlJZCApIDogZmFsc2U7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSByZWxhdGlvbiBtYXAgZnJvbSB0aGUgaW5kZXggZm9yIHRoZSBnaXZlbiBkYXRhLlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEByZXR1cm4ge0ltbXV0YWJsZS5NYXB9IEEgbmV3IG1hcCBpcyByZXR1cm5lZCBpZiB0aGVyZSBpc24ndCBhbiBleGlzdGluZyBtYXAgcHJlc2VudC5cbiAqL1xuY29uc3QgZ2V0UmVsYXRpb25NYXAgPSAoIHN0YXRlLCBhY3Rpb24gKSA9PiB7XG5cdGNvbnN0IHsgcmVsYXRpb25OYW1lLCByZWxhdGlvbkVudGl0eUlkOiByZWxhdGlvbklkLCBtb2RlbE5hbWUgfSA9IGFjdGlvbjtcblx0Ly8gZ2V0IHRoZSBtYXAgZm9yIHRoZSBxdWV1ZVR5cGVcblx0cmV0dXJuIHN0YXRlLmdldEluKFxuXHRcdFsgJ2luZGV4JywgcmVsYXRpb25OYW1lLCByZWxhdGlvbklkLCBtb2RlbE5hbWUgXVxuXHQpIHx8IE1hcCgpO1xufTtcblxuLyoqXG4gKiBHaXZlbiBhIHNldCBvZiBpZHMsIHRoaXMgcmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBpZCBleGlzdHMgaW4gaXQuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGVudGl0eUlkXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5TZXR9IGlkU2V0XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIG1lYW5zIGl0IGV4aXN0cyBpbiB0aGUgYXJyYXkuXG4gKi9cbmNvbnN0IGlkRXhpc3RzSW5TZXQgPSAoIGVudGl0eUlkLCBpZFNldCApID0+IHtcblx0cmV0dXJuIChcblx0XHRpZFNldCBpbnN0YW5jZW9mIFNldCAmJlxuXHRcdGlkU2V0LmluY2x1ZGVzKCBlbnRpdHlJZCApXG5cdCk7XG59O1xuXG4vKipcbiAqIFJlZHVjZXIgZm9yIGFkZGluZyB0byB0aGUgcmVsYXRpb25zIGluZGV4IHN0YXRlLlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gcmVsYXRpb25NYXBcbiAqIEByZXR1cm4ge0ltbXV0YWJsZS5NYXB9ICBFaXRoZXIgZXhpc3Rpbmcgc3RhdGUgaWYgbm8gY2hhbmdlIG9yIG5ldyBzdGF0ZSBpZiBjaGFuZ2UuXG4gKi9cbmZ1bmN0aW9uIGluZGV4UmVsYXRpb25zKCBzdGF0ZSwgYWN0aW9uLCByZWxhdGlvbk1hcCApIHtcblx0Y29uc3Qge1xuXHRcdHR5cGUsXG5cdFx0cmVsYXRpb25OYW1lLFxuXHRcdHJlbGF0aW9uRW50aXR5SWQsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkLFxuXHRcdHF1ZXVlVHlwZSxcblx0fSA9IGFjdGlvbjtcblx0bGV0IGVudGl0eUlkcyA9IHJlbGF0aW9uTWFwLmdldCggcXVldWVUeXBlICkgfHwgU2V0KCk7XG5cdGNvbnN0IHBhdGggPSBbIHJlbGF0aW9uTmFtZSwgcmVsYXRpb25FbnRpdHlJZCwgbW9kZWxOYW1lLCBxdWV1ZVR5cGUgXTtcblx0c3dpdGNoICggdHlwZSApIHtcblx0XHRjYXNlIHR5cGVzLlJFQ0VJVkVfRElSVFlfUkVMQVRJT05fQURESVRJT046XG5cdFx0Y2FzZSB0eXBlcy5SRUNFSVZFX0RJUlRZX1JFTEFUSU9OX0RFTEVUSU9OOlxuXHRcdFx0aWYgKCBpZEV4aXN0c0luU2V0KCBlbnRpdHlJZCwgZW50aXR5SWRzICkgKSB7XG5cdFx0XHRcdHJldHVybiBzdGF0ZTtcblx0XHRcdH1cblx0XHRcdHN0YXRlID0gc3RhdGUuc2V0SW4oIHBhdGgsIGVudGl0eUlkcy5hZGQoIGVudGl0eUlkICkgKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgdHlwZXMuUkVNT1ZFX0RJUlRZX1JFTEFUSU9OX0FERElUSU9OOlxuXHRcdGNhc2UgdHlwZXMuUkVNT1ZFX0RJUlRZX1JFTEFUSU9OX0RFTEVUSU9OOlxuXHRcdFx0aWYgKCAhIGlkRXhpc3RzSW5TZXQoIGVudGl0eUlkLCBlbnRpdHlJZHMgKSApIHtcblx0XHRcdFx0cmV0dXJuIHN0YXRlO1xuXHRcdFx0fVxuXHRcdFx0ZW50aXR5SWRzID0gZW50aXR5SWRzLmRlbGV0ZSggZW50aXR5SWQgKTtcblx0XHRcdGlmICggZW50aXR5SWRzLmlzRW1wdHkoKSApIHtcblx0XHRcdFx0c3RhdGUgPSByZW1vdmVFbXB0eUZyb21TdGF0ZSggc3RhdGUsIHBhdGgsIDAgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHN0YXRlID0gc3RhdGUuc2V0SW4oIHBhdGgsIGVudGl0eUlkcyApO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdH1cblx0cmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyByZWxhdGlvbiBpZHMgZnJvbSBzdGF0ZSBmb3IgZ2l2ZW4gZGF0YS5cbiAqXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHN0YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uXG4gKiBAcmV0dXJuIHtJbW11dGFibGUuU2V0fSBBIExpc3Qgb2YgaWRzIGlmIHByZXNlbnQgb3IgZW1wdHkgTGlzdCBpZiBub3QuXG4gKi9cbmZ1bmN0aW9uIGdldFJlbGF0aW9uSWRzRnJvbVN0YXRlKCBzdGF0ZSwgYWN0aW9uICkge1xuXHRjb25zdCB7XG5cdFx0cmVsYXRpb25OYW1lLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHlJZCxcblx0fSA9IGFjdGlvbjtcblx0Y29uc3QgcGF0aCA9IFsgbW9kZWxOYW1lLCBlbnRpdHlJZCwgcmVsYXRpb25OYW1lIF07XG5cdHJldHVybiBzdGF0ZS5oYXNJbiggcGF0aCApID8gc3RhdGUuZ2V0SW4oIHBhdGggKSA6IFNldCgpO1xufVxuXG4vKipcbiAqIFVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHN0YXRlIHJlcXVpcmVzIGFuIHVwZGF0ZSBvciBub3QgZm9yIHRoZSBnaXZlblxuICogZGF0YS5cbiAqXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHN0YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHJlbGF0aW9uTWFwXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGluZGljYXRlcyB1cGRhdGUgaXMgbmVlZGVkLlxuICovXG5mdW5jdGlvbiByZXF1aXJlc1VwZGF0ZSggc3RhdGUsIGFjdGlvbiwgcmVsYXRpb25NYXAgKSB7XG5cdHN3aXRjaCAoIGFjdGlvbi50eXBlICkge1xuXHRcdGNhc2UgdHlwZXMuUkVDRUlWRV9ESVJUWV9SRUxBVElPTl9BRERJVElPTjpcblx0XHRjYXNlIHR5cGVzLlJFQ0VJVkVfRElSVFlfUkVMQVRJT05fREVMRVRJT046XG5cdFx0XHRyZXR1cm4gISBoYXNSZWxhdGlvbiggc3RhdGUsIGFjdGlvbiwgcmVsYXRpb25NYXAgKTtcblx0XHRjYXNlIHR5cGVzLlJFTU9WRV9ESVJUWV9SRUxBVElPTl9BRERJVElPTjpcblx0XHRjYXNlIHR5cGVzLlJFTU9WRV9ESVJUWV9SRUxBVElPTl9ERUxFVElPTjpcblx0XHRcdHJldHVybiBoYXNSZWxhdGlvbiggc3RhdGUsIGFjdGlvbiwgcmVsYXRpb25NYXAgKTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUmVkdWNlciBmb3IgdXBkYXRpbmcgZGlydHkgcmVsYXRpb24gc3RhdGUgZm9yIGdpdmVuIGRhdGEuXG4gKlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSByZWxhdGlvbk1hcFxuICogQHJldHVybiB7SW1tdXRhYmxlLk1hcH0gSWYgbm8gY2hhbmdlIG9yaWdpbmFsIHN0YXRlIGlzIHJldHVybmVkIG90aGVyd2lzZSBuZXcgc3RhdGUuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVJlbGF0aW9uU3RhdGUoIHN0YXRlLCBhY3Rpb24sIHJlbGF0aW9uTWFwICkge1xuXHRjb25zdCB7XG5cdFx0dHlwZSxcblx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0cmVsYXRpb25FbnRpdHlJZCxcblx0XHRtb2RlbE5hbWUsXG5cdFx0ZW50aXR5SWQsXG5cdFx0cXVldWVUeXBlLFxuXHR9ID0gYWN0aW9uO1xuXHRjb25zdCBpZHMgPSByZWxhdGlvbk1hcC5nZXQoIHF1ZXVlVHlwZSApIHx8IFNldCgpO1xuXHRjb25zdCBwYXRoID0gWyBtb2RlbE5hbWUsIGVudGl0eUlkLCByZWxhdGlvbk5hbWUgXTtcblx0bGV0IHJlbGF0aW9uSWRzO1xuXHRzd2l0Y2ggKCB0eXBlICkge1xuXHRcdGNhc2UgdHlwZXMuUkVDRUlWRV9ESVJUWV9SRUxBVElPTl9BRERJVElPTjpcblx0XHRjYXNlIHR5cGVzLlJFQ0VJVkVfRElSVFlfUkVMQVRJT05fREVMRVRJT046XG5cdFx0XHRpZiAoIGlkRXhpc3RzSW5TZXQoIGVudGl0eUlkLCBpZHMgKSApIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRyZWxhdGlvbklkcyA9IGdldFJlbGF0aW9uSWRzRnJvbVN0YXRlKCBzdGF0ZSwgYWN0aW9uICk7XG5cdFx0XHRpZiAoIHJlbGF0aW9uSWRzLmluY2x1ZGVzKCByZWxhdGlvbkVudGl0eUlkICkgKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0c3RhdGUgPSBzdGF0ZS5zZXRJbiggcGF0aCwgcmVsYXRpb25JZHMuYWRkKCByZWxhdGlvbkVudGl0eUlkICkgKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgdHlwZXMuUkVNT1ZFX0RJUlRZX1JFTEFUSU9OX0FERElUSU9OOlxuXHRcdGNhc2UgdHlwZXMuUkVNT1ZFX0RJUlRZX1JFTEFUSU9OX0RFTEVUSU9OOlxuXHRcdFx0aWYgKCAhIGlkRXhpc3RzSW5TZXQoIGVudGl0eUlkLCBpZHMgKSApIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRyZWxhdGlvbklkcyA9IGdldFJlbGF0aW9uSWRzRnJvbVN0YXRlKCBzdGF0ZSwgYWN0aW9uICk7XG5cdFx0XHRpZiAoICEgcmVsYXRpb25JZHMuaW5jbHVkZXMoIHJlbGF0aW9uRW50aXR5SWQgKSApIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRyZWxhdGlvbklkcyA9IHJlbGF0aW9uSWRzLmRlbGV0ZSggcmVsYXRpb25FbnRpdHlJZCApO1xuXHRcdFx0aWYgKCByZWxhdGlvbklkcy5pc0VtcHR5KCkgKSB7XG5cdFx0XHRcdHN0YXRlID0gcmVtb3ZlRW1wdHlGcm9tU3RhdGUoIHN0YXRlLCBwYXRoLCAwICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzdGF0ZSA9IHN0YXRlLnNldEluKCBwYXRoLCByZWxhdGlvbklkcyApO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdH1cblx0cmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIFV0aWxpdHkgbWV0aG9kIGFzc2lzdGluZyB3aXRoIHJlcGxhY2luZyBhbiBvbGQgcmVsYXRpb24gaWQgZm9yIGEgbmV3IHJlbGF0aW9uXG4gKiBpZC5cbiAqXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHN0YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uXG4gKiBAcmV0dXJuIHtJbW11dGFibGUuTWFwfSBFaXRoZXIgb3JpZ2luYWwgb3IgbmV3IHN0YXRlLlxuICovXG5mdW5jdGlvbiByZXBsYWNlT2xkUmVsYXRpb25JZFdpdGhOZXdSZWxhdGlvbklkKCBzdGF0ZSwgYWN0aW9uICkge1xuXHRsZXQgeyBvbGRFbnRpdHlJZCwgbmV3RW50aXR5SWQgfSA9IGFjdGlvbjtcblx0Y29uc3QgeyBtb2RlbE5hbWUgfSA9IGFjdGlvbjtcblx0b2xkRW50aXR5SWQgPSBub3JtYWxpemVFbnRpdHlJZCggb2xkRW50aXR5SWQgKTtcblx0bmV3RW50aXR5SWQgPSBub3JtYWxpemVFbnRpdHlJZCggbmV3RW50aXR5SWQgKTtcblx0Ly8gcmVwbGFjZW1lbnRzIGluIGluZGV4XG5cdGxldCBuZXdTdGF0ZSA9IHJlcGxhY2VJZHMoXG5cdFx0J2luZGV4Jyxcblx0XHRzdGF0ZSxcblx0XHRtb2RlbE5hbWUsXG5cdFx0b2xkRW50aXR5SWQsXG5cdFx0bmV3RW50aXR5SWRcblx0KTtcblx0aWYgKCBuZXdTdGF0ZSA9PT0gc3RhdGUgKSB7XG5cdFx0bmV3U3RhdGUgPSByZXBsYWNlSWRzKFxuXHRcdFx0J2RlbGV0ZScsXG5cdFx0XHRuZXdTdGF0ZSxcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdG9sZEVudGl0eUlkLFxuXHRcdFx0bmV3RW50aXR5SWQsXG5cdFx0KTtcblx0fVxuXHRpZiAoIG5ld1N0YXRlID09PSBzdGF0ZSApIHtcblx0XHRuZXdTdGF0ZSA9IHJlcGxhY2VJZHMoXG5cdFx0XHQnYWRkJyxcblx0XHRcdG5ld1N0YXRlLFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0b2xkRW50aXR5SWQsXG5cdFx0XHRuZXdFbnRpdHlJZCxcblx0XHQpO1xuXHR9XG5cdHJldHVybiBuZXdTdGF0ZTtcbn1cblxuLyoqXG4gKiBIYW5kbGVzIGdvaW5nIHRocm91Z2ggdGhlIHByb3ZpZGVkIHN0YXRlIG9iamVjdCBhbmQgdXBkYXRpbmcgYW55IG9jY3VycmVuY2VzXG4gKiBvZiB0aGUgcHJvdmlkZWQgb2xkSWQgZm9yIHRoZSBwcm92aWRlZCBtb2RlbCBuYW1lIHdpdGggdGhlIG5ldyBpZC4gIFRoaXNcbiAqIG11dGF0ZXMgdGhlIGluY29taW5nIHN0YXRlIHNvIGRvIG5vdCBwcm92aWRlIHRoZSBvcmlnaW5hbCBzdGF0ZSBmcm9tIHRoZVxuICogc3RvcmUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0YXRlUHJvcGVydHkgKHdoYXQgcHJvcGVydHkgZm9yIHRoZSBzdGF0ZSBzaG91bGQgYmVcbiAqICAgcmV2aWV3ZWQpXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gb2xkSWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBuZXdJZFxuICogQHJldHVybiB7SW1tdXRhYmxlLk1hcH0gUmV0dXJucyBlaXRoZXIgbmV3IHN0YXRlIG9yIGV4aXN0aW5nIHN0YXRlLlxuICovXG5jb25zdCByZXBsYWNlSWRzID0gKCBzdGF0ZVByb3BlcnR5LCBzdGF0ZSwgbW9kZWxOYW1lLCBvbGRJZCwgbmV3SWQgKSA9PiB7XG5cdGNvbnN0IHBsdXJhbE5hbWUgPSBwbHVyYWxNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRjb25zdCBzaW5ndWxhck5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lICk7XG5cdGNvbnN0IHRvcExldmVsTmFtZSA9IHN0YXRlUHJvcGVydHkgPT09ICdpbmRleCcgPyBwbHVyYWxOYW1lIDogc2luZ3VsYXJOYW1lO1xuXHRjb25zdCBtYWluUGF0aCA9IFsgc3RhdGVQcm9wZXJ0eSwgdG9wTGV2ZWxOYW1lLCBvbGRJZCBdO1xuXG5cdC8vIGZpcnN0IGRvIHRvcC1sZXZlbCBjaGVja3MgaWYgaXQgZG9lc24ndCBleGlzdCwgYmFpbC5cblx0aWYgKCAhIHN0YXRlLmhhc0luKCBtYWluUGF0aCApICkge1xuXHRcdHJldHVybiBzdGF0ZTtcblx0fVxuXG5cdGNvbnN0IG1haW5SZWNvcmQgPSBzdGF0ZS5nZXRJbiggbWFpblBhdGggKTtcblxuXHRzdGF0ZSA9IHN0YXRlXG5cdFx0LmRlbGV0ZUluKCBtYWluUGF0aCApXG5cdFx0LnNldEluKCBbIHN0YXRlUHJvcGVydHksIHRvcExldmVsTmFtZSwgbmV3SWQgXSwgbWFpblJlY29yZCApO1xuXG5cdC8vIG1haW5SZWNvcmQgcHJvdmlkZXMgdGhlIGluZGV4IHRvIHRoZSBvdGhlciByZWNvcmRzIG5lZWRpbmcgdXBkYXRlZC5cblx0bWFpblJlY29yZC5mb3JFYWNoKCAoIG1hcE9ySWRzLCByZWxhdGlvbk1vZGVsTmFtZSApID0+IHtcblx0XHRjb25zdCB1cGRhdGVJZHMgPSAoIHF1ZXVlVHlwZSwgcmVsYXRpb25JZCApID0+IHtcblx0XHRcdGNvbnN0IHJlbGF0aW9uUGF0aCA9IFtcblx0XHRcdFx0cXVldWVUeXBlLFxuXHRcdFx0XHRyZWxhdGlvbk1vZGVsTmFtZSxcblx0XHRcdFx0cmVsYXRpb25JZCxcblx0XHRcdFx0dG9wTGV2ZWxOYW1lLFxuXHRcdFx0XTtcblx0XHRcdGxldCBpZHMgPSBzdGF0ZS5nZXRJbiggcmVsYXRpb25QYXRoICkgfHwgU2V0KCk7XG5cdFx0XHRpZHMgPSBpZHMuZGVsZXRlKCBvbGRJZCApLmFkZCggbmV3SWQgKTtcblx0XHRcdHJldHVybiBzdGF0ZS5zZXRJbiggcmVsYXRpb25QYXRoLCBpZHMgKTtcblx0XHR9O1xuXHRcdGlmICggbWFwT3JJZHMgaW5zdGFuY2VvZiBNYXAgKSB7XG5cdFx0XHRpZiAoIG1hcE9ySWRzLmhhcyggJ2FkZCcgKSApIHtcblx0XHRcdFx0bWFwT3JJZHMuZ2V0KCAnYWRkJyApLmZvckVhY2goICggcmVsYXRpb25JZCApID0+IHtcblx0XHRcdFx0XHRzdGF0ZSA9IHVwZGF0ZUlkcyggJ2FkZCcsIHJlbGF0aW9uSWQgKTtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBtYXBPcklkcy5oYXMoICdkZWxldGUnICkgKSB7XG5cdFx0XHRcdG1hcE9ySWRzLmdldCggJ2RlbGV0ZScgKS5mb3JFYWNoKCAoIHJlbGF0aW9uSWQgKSA9PiB7XG5cdFx0XHRcdFx0c3RhdGUgPSB1cGRhdGVJZHMoICdkZWxldGUnLCByZWxhdGlvbklkICk7XG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKCBtYXBPcklkcyBpbnN0YW5jZW9mIFNldCApIHtcblx0XHRcdGNvbnN0IHJlbGF0aW9uUGF0aCA9IFsgJ2luZGV4JywgcmVsYXRpb25Nb2RlbE5hbWUgXTtcblx0XHRcdG1hcE9ySWRzLmZvckVhY2goICggcmVsYXRpb25JZCApID0+IHtcblx0XHRcdFx0bGV0IGluZGV4UmVjb3JkID0gc3RhdGUuZ2V0SW4oXG5cdFx0XHRcdFx0WyAuLi5yZWxhdGlvblBhdGgsIHJlbGF0aW9uSWQsIHRvcExldmVsTmFtZSBdXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGxldCBpZHMgPSBpbmRleFJlY29yZC5nZXQoIHN0YXRlUHJvcGVydHkgKSB8fCBTZXQoKTtcblx0XHRcdFx0aWRzID0gaWRzLmRlbGV0ZSggb2xkSWQgKS5hZGQoIG5ld0lkICk7XG5cdFx0XHRcdGluZGV4UmVjb3JkID0gaW5kZXhSZWNvcmQuc2V0KCBzdGF0ZVByb3BlcnR5LCBpZHMgKTtcblx0XHRcdFx0c3RhdGUgPSBzdGF0ZS5zZXRJbihcblx0XHRcdFx0XHRbIC4uLnJlbGF0aW9uUGF0aCwgcmVsYXRpb25JZCwgdG9wTGV2ZWxOYW1lIF0sXG5cdFx0XHRcdFx0aW5kZXhSZWNvcmRcblx0XHRcdFx0KTtcblx0XHRcdH0gKTtcblx0XHR9XG5cdH0gKTtcblx0cmV0dXJuIHN0YXRlO1xufTtcblxuLyoqXG4gKiBUaGlzIGVuc3VyZXMgdGhhdCBmb3IgaW5jb21pbmcgcmVsYXRpb24gc3RhdGUsIHJlbGF0aW9ucyBhcmUgcmVjb3JkZWQgaW4gb25lXG4gKiBkaXJlY3Rpb24uICBGb3IgZXhhbXBsZSBhZGRpbmcgYSByZWxhdGlvbiBmb3IgYGV2ZW50YCB0byBgZGF0ZXRpbWVgIGFuZCB0aGVuXG4gKiBzb21ldGltZSBsYXRlciBgZGF0ZXRpbWVgIHRvIGBldmVudGAgZm9yIHRoZSBzYW1lIGVudGl0aWVzIHNob3VsZCByZXN1bHQgaW5cbiAqIGp1c3QgYSBzaW5nbGUgcmVjb3JkLCBub3QgdHdvLlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIGFjdGlvbiBvYmplY3QgdG8gd29yayB3aXRoIGFmdGVyIG5vcm1hbGl6YXRpb24uXG4gKi9cbmNvbnN0IG5vcm1hbGl6ZUFjdGlvbkZvclN0YXRlID0gKCBzdGF0ZSwgYWN0aW9uICkgPT4ge1xuXHQvLyBub3JtYWxpemVJZHNcblx0YWN0aW9uLmVudGl0eUlkID0gbm9ybWFsaXplRW50aXR5SWQoIGFjdGlvbi5lbnRpdHlJZCApO1xuXHRhY3Rpb24ucmVsYXRpb25FbnRpdHlJZCA9IG5vcm1hbGl6ZUVudGl0eUlkKCBhY3Rpb24ucmVsYXRpb25FbnRpdHlJZCApO1xuXHQvLyB3ZSBvbmx5IHVzZSBpbmRleCB0byBoZWxwIHdpdGggbm9ybWFsaXphdGlvblxuXHRjb25zdCBpbmRleCA9IHN0YXRlLmdldCggJ2luZGV4JyApO1xuXHRjb25zdCB7IG1vZGVsTmFtZSwgcmVsYXRpb25OYW1lLCByZWxhdGlvbkVudGl0eUlkLCBlbnRpdHlJZCB9ID0gYWN0aW9uO1xuXHRpZiAoIG1vZGVsTmFtZSAmJlxuXHRcdHJlbGF0aW9uTmFtZSAmJlxuXHRcdGluZGV4LmhhcyggcGx1cmFsTW9kZWxOYW1lKCBtb2RlbE5hbWUgKSApXG5cdCkge1xuXHRcdC8vIG9rYXkgdGhpcyBtb2RlbCBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgYXMgYSByZWxhdGlvbiBvbiBhbm90aGVyIG1vZGVsXG5cdFx0Ly8gc28gbGV0J3Mgbm9ybWFsaXplIGFuZCBtYWtlIGl0IHRoZSByZWxhdGlvbiBpbnN0ZWFkLlxuXHRcdHJldHVybiB7XG5cdFx0XHQuLi5hY3Rpb24sXG5cdFx0XHRtb2RlbE5hbWU6IHNpbmd1bGFyTW9kZWxOYW1lKCByZWxhdGlvbk5hbWUgKSxcblx0XHRcdGVudGl0eUlkOiByZWxhdGlvbkVudGl0eUlkLFxuXHRcdFx0cmVsYXRpb25OYW1lOiBwbHVyYWxNb2RlbE5hbWUoIG1vZGVsTmFtZSApLFxuXHRcdFx0cmVsYXRpb25FbnRpdHlJZDogZW50aXR5SWQsXG5cdFx0fTtcblx0fVxuXHQvLyB3ZSBjYW4gcmV0dXJuIGFzIGlzIGJ1dCBsZXRzIG5vcm1hbGl6ZSB0aGUgaW5jb21pbmcgbmFtZXNcblx0cmV0dXJuIHtcblx0XHQuLi5hY3Rpb24sXG5cdFx0bW9kZWxOYW1lOiBtb2RlbE5hbWUgPyBzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lICkgOiBtb2RlbE5hbWUsXG5cdFx0cmVsYXRpb25OYW1lOiByZWxhdGlvbk5hbWUgP1xuXHRcdFx0cGx1cmFsTW9kZWxOYW1lKCByZWxhdGlvbk5hbWUgKSA6XG5cdFx0XHRyZWxhdGlvbk5hbWUsXG5cdH07XG59O1xuXG4vKipcbiAqIFJlZHVjZXIgZm9yIGRpcnR5IHJlbGF0aW9uIHN0YXRlIGFjdGlvbnMuXG4gKlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblxuICogQHJldHVybiB7SW1tdXRhYmxlLk1hcH0gUmV0dXJucyBvcmlnaW5hbCBzdGF0ZSBpZiBubyBjaGFuZ2VzLCBvdGhlcndpc2UgbmV3IHN0YXRlLlxuICovXG5mdW5jdGlvbiBkaXJ0eVJlbGF0aW9ucyggc3RhdGUsIGFjdGlvbiApIHtcblx0YWN0aW9uID0gbm9ybWFsaXplQWN0aW9uRm9yU3RhdGUoIHN0YXRlLCBhY3Rpb24gKTtcblx0Y29uc3QgeyB0eXBlIH0gPSBhY3Rpb247XG5cdGNvbnN0IHJlbGF0aW9uTWFwID0gZ2V0UmVsYXRpb25NYXAoIHN0YXRlLCBhY3Rpb24gKTtcblx0Ly8gZG9lcyB0aGlzIGV2ZW4gbmVlZCBhbiB1cGRhdGU/XG5cdGlmICggISByZXF1aXJlc1VwZGF0ZSggc3RhdGUsIGFjdGlvbiwgcmVsYXRpb25NYXAgKSApIHtcblx0XHRyZXR1cm4gc3RhdGU7XG5cdH1cblx0c3dpdGNoICggdHlwZSApIHtcblx0XHRjYXNlIHR5cGVzLlJFQ0VJVkVfRElSVFlfUkVMQVRJT05fQURESVRJT046XG5cdFx0Y2FzZSB0eXBlcy5SRU1PVkVfRElSVFlfUkVMQVRJT05fQURESVRJT046XG5cdFx0XHRzdGF0ZSA9IHN0YXRlLnNldChcblx0XHRcdFx0J2luZGV4Jyxcblx0XHRcdFx0aW5kZXhSZWxhdGlvbnMoXG5cdFx0XHRcdFx0TWFwKCBzdGF0ZS5nZXQoICdpbmRleCcgKSApLFxuXHRcdFx0XHRcdGFjdGlvbixcblx0XHRcdFx0XHRyZWxhdGlvbk1hcFxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIHN0YXRlLnNldChcblx0XHRcdFx0J2FkZCcsXG5cdFx0XHRcdHVwZGF0ZVJlbGF0aW9uU3RhdGUoXG5cdFx0XHRcdFx0TWFwKCBzdGF0ZS5nZXQoICdhZGQnICkgKSxcblx0XHRcdFx0XHRhY3Rpb24sXG5cdFx0XHRcdFx0cmVsYXRpb25NYXBcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHRjYXNlIHR5cGVzLlJFQ0VJVkVfRElSVFlfUkVMQVRJT05fREVMRVRJT046XG5cdFx0Y2FzZSB0eXBlcy5SRU1PVkVfRElSVFlfUkVMQVRJT05fREVMRVRJT046XG5cdFx0XHQvLyBpZiB0aGUgcmVsYXRpb24gb3IgZW50aXR5IGlkIGlzIGEgY3VpZCwgdGhlbiB3ZSBza2lwIHRoaXMgYmVjYXVzZVxuXHRcdFx0Ly8gdGhlIHJlbGF0aW9uIGhhcyBuZXZlciBiZWVuIHBlcnNpc3RlZCBhbnl3YXlzLlxuXHRcdFx0aWYgKFxuXHRcdFx0XHRjdWlkLmlzQ3VpZCggYWN0aW9uLnJlbGF0aW9uRW50aXR5SWQgKSB8fFxuXHRcdFx0XHRjdWlkLmlzQ3VpZCggYWN0aW9uLmVudGl0eUlkIClcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gc3RhdGU7XG5cdFx0XHR9XG5cdFx0XHRzdGF0ZSA9IHN0YXRlLnNldChcblx0XHRcdFx0J2luZGV4Jyxcblx0XHRcdFx0aW5kZXhSZWxhdGlvbnMoXG5cdFx0XHRcdFx0TWFwKCBzdGF0ZS5nZXQoICdpbmRleCcgKSApLFxuXHRcdFx0XHRcdGFjdGlvbixcblx0XHRcdFx0XHRyZWxhdGlvbk1hcFxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIHN0YXRlLnNldChcblx0XHRcdFx0J2RlbGV0ZScsXG5cdFx0XHRcdHVwZGF0ZVJlbGF0aW9uU3RhdGUoXG5cdFx0XHRcdFx0TWFwKCBzdGF0ZS5nZXQoICdkZWxldGUnICkgKSxcblx0XHRcdFx0XHRhY3Rpb24sXG5cdFx0XHRcdFx0cmVsYXRpb25NYXBcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0fVxuXHRyZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmVtb3ZpbmcgZW50aXR5IGlkIGluIHRoZSBzdGF0ZSBmb3IgYSBnaXZlbiBtb2RlbE5hbWVcbiAqIHdoaWNoIG1heSBleGlzdCBhcyBhIHJlbGF0aW9uIGluIHRoZSBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHN0YXRlIEltbXV0YWJsZSBjb2xsZWN0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gbW9kZWxEYXRhIEFuIG9iamVjdCBjb250YWluaW5nIGRhdGEgZm9yIHVzZSBpbiB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtJbW11dGFibGUuTWFwfSBJbW11dGFibGUgY29sbGVjdGlvbiAgZWl0aGVyIHRoZSBvcmlnaW5hbCBzdGF0ZSBvciBhIG5ldyBzdGF0ZS5cbiAqL1xuY29uc3QgY2xlYXJSZWxhdGVkRW50aXRpZXNGb3JFbnRpdHkgPSAoXG5cdHN0YXRlLFxuXHRtb2RlbERhdGFcbikgPT4ge1xuXHRjb25zdCB7XG5cdFx0bW9kZWxSZW1vdmVkLFxuXHRcdGVudGl0eUlkUmVtb3ZlZCxcblx0XHRpbmRleFR5cGUsXG5cdFx0cmVsYXRpb25UeXBlcyxcblx0fSA9IG1vZGVsRGF0YTtcblxuXHRjb25zdCByZWNvcmRQYXRoID0gW1xuXHRcdGluZGV4VHlwZSxcblx0XHRtb2RlbFJlbW92ZWQsXG5cdFx0ZW50aXR5SWRSZW1vdmVkLFxuXHRdO1xuXG5cdGNvbnN0IGNsZWFyRW50aXR5SWRzSW5QYXRoID0gKCBzdWJTdGF0ZSwgcGF0aCApID0+IHtcblx0XHRpZiAoIHN1YlN0YXRlLmhhc0luKCBwYXRoICkgKSB7XG5cdFx0XHRsZXQgZW50aXR5SWRzID0gc3ViU3RhdGUuZ2V0SW4oIHBhdGggKSB8fCBTZXQoKTtcblx0XHRcdGVudGl0eUlkcyA9IGVudGl0eUlkcy5kZWxldGUoIGVudGl0eUlkUmVtb3ZlZCApO1xuXHRcdFx0aWYgKCAhIGVudGl0eUlkcy5pc0VtcHR5KCkgKSB7XG5cdFx0XHRcdHN1YlN0YXRlLnNldEluKCBwYXRoLCBlbnRpdHlJZHMgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbW92ZUVtcHR5RnJvbVN0YXRlKFxuXHRcdFx0XHRcdHN1YlN0YXRlLFxuXHRcdFx0XHRcdHBhdGgsXG5cdFx0XHRcdFx0MSxcblx0XHRcdFx0XHRmYWxzZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHRpZiAoIHN0YXRlLmhhc0luKCByZWNvcmRQYXRoICkgKSB7XG5cdFx0c3RhdGUgPSBzdGF0ZS53aXRoTXV0YXRpb25zKCAoIHN1YlN0YXRlICkgPT4ge1xuXHRcdFx0Y29uc3QgbWFpblJlY29yZCA9IHN1YlN0YXRlLmdldEluKCByZWNvcmRQYXRoICk7XG5cdFx0XHRyZW1vdmVFbXB0eUZyb21TdGF0ZShcblx0XHRcdFx0c3ViU3RhdGUsXG5cdFx0XHRcdHJlY29yZFBhdGgsXG5cdFx0XHRcdDEsXG5cdFx0XHRcdGZhbHNlXG5cdFx0XHQpO1xuXHRcdFx0bWFpblJlY29yZC5mb3JFYWNoKCAoIHJlbGF0aW9uUmVjb3JkLCByZWxhdGlvbk1vZGVsTmFtZSApID0+IHtcblx0XHRcdFx0aWYgKCByZWxhdGlvblJlY29yZCBpbnN0YW5jZW9mIFNldCApIHtcblx0XHRcdFx0XHRyZWxhdGlvblJlY29yZC5mb3JFYWNoKCAoIHJlbGF0aW9uSWQgKSA9PiB7XG5cdFx0XHRcdFx0XHRjbGVhckVudGl0eUlkc0luUGF0aChcblx0XHRcdFx0XHRcdFx0c3ViU3RhdGUsXG5cdFx0XHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdFx0XHQnaW5kZXgnLFxuXHRcdFx0XHRcdFx0XHRcdHJlbGF0aW9uTW9kZWxOYW1lLFxuXHRcdFx0XHRcdFx0XHRcdHJlbGF0aW9uSWQsXG5cdFx0XHRcdFx0XHRcdFx0bW9kZWxSZW1vdmVkLFxuXHRcdFx0XHRcdFx0XHRcdGluZGV4VHlwZSxcblx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0cmVsYXRpb25UeXBlcyAhPT0gbnVsbCAmJlxuXHRcdFx0XHRcdHJlbGF0aW9uUmVjb3JkIGluc3RhbmNlb2YgTWFwXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJlbGF0aW9uVHlwZXMuZm9yRWFjaCggKCByZWxhdGlvblR5cGUgKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoIHJlbGF0aW9uUmVjb3JkLmhhcyggcmVsYXRpb25UeXBlICkgKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHJlbGF0aW9uSWRzID0gcmVsYXRpb25SZWNvcmQuZ2V0KFxuXHRcdFx0XHRcdFx0XHRcdHJlbGF0aW9uVHlwZVxuXHRcdFx0XHRcdFx0XHQpIHx8IFNldCgpO1xuXHRcdFx0XHRcdFx0XHRyZWxhdGlvbklkcy5mb3JFYWNoKCAoIHJlbGF0aW9uSWQgKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0Y2xlYXJFbnRpdHlJZHNJblBhdGgoXG5cdFx0XHRcdFx0XHRcdFx0XHRzdWJTdGF0ZSxcblx0XHRcdFx0XHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVsYXRpb25UeXBlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZWxhdGlvbk1vZGVsTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVsYXRpb25JZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0bW9kZWxSZW1vdmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9ICk7XG5cdH1cblx0cmV0dXJuIHN0YXRlO1xufTtcblxuLyoqXG4gKiBIYW5kbGVzIHJlbW92aW5nIGFsbCByZWxhdGlvbnNoaXBzIGluIHRoZSBkaXJ0eSByZWxhdGlvbnMgc3RhdGUgZm9yIHRoZSBnaXZlblxuICogYWN0aW9uIG9iamVjdCAoY29udGFpbmluZyBtb2RlbE5hbWUgYW5kIGVudGl0eUlkKVxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEByZXR1cm4ge0ltbXV0YWJsZS5NYXB9IEVpdGhlciB0aGUgb3JpZ2luYWwgc3RhdGUgb3IgbmV3IHN0YXRlIGlmIGl0IHdhcyB1cGRhdGVkLlxuICovXG5mdW5jdGlvbiByZW1vdmVSZWxhdGVkRW50aXRpZXNGb3JFbnRpdHkoIHN0YXRlLCBhY3Rpb24gKSB7XG5cdGNvbnN0IHsgbW9kZWxOYW1lIH0gPSBhY3Rpb247XG5cdGNvbnN0IHBsdXJhbE5hbWUgPSBwbHVyYWxNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRjb25zdCBzaW5nbGVOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRjb25zdCBlbnRpdHlJZCA9IG5vcm1hbGl6ZUVudGl0eUlkKCBhY3Rpb24uZW50aXR5SWQgKTtcblx0W1xuXHRcdFsgcGx1cmFsTmFtZSwgZW50aXR5SWQsICdpbmRleCcsIFsgJ2FkZCcsICdkZWxldGUnIF0gXSxcblx0XHRbIHNpbmdsZU5hbWUsIGVudGl0eUlkLCAnYWRkJyBdLFxuXHRcdFsgc2luZ2xlTmFtZSwgZW50aXR5SWQsICdkZWxldGUnIF0sXG5cdF0uZm9yRWFjaCggKCBbXG5cdFx0bW9kZWxSZW1vdmVkLFxuXHRcdGVudGl0eUlkUmVtb3ZlZCxcblx0XHRpbmRleFR5cGUsXG5cdFx0cmVsYXRpb25UeXBlcyA9IG51bGwsXG5cdF0gKSA9PiB7XG5cdFx0c3RhdGUgPSBjbGVhclJlbGF0ZWRFbnRpdGllc0ZvckVudGl0eShcblx0XHRcdHN0YXRlLFxuXHRcdFx0eyBtb2RlbFJlbW92ZWQsIGVudGl0eUlkUmVtb3ZlZCwgaW5kZXhUeXBlLCByZWxhdGlvblR5cGVzIH1cblx0XHQpO1xuXHR9ICk7XG5cdHJldHVybiBzdGF0ZTtcbn1cblxuLyoqXG4gKiBleHBvcnRzIHVzZWZ1bCBmb3IgdGVzdGluZy5cbiAqL1xuZXhwb3J0IHtcblx0cmVwbGFjZU9sZFJlbGF0aW9uSWRXaXRoTmV3UmVsYXRpb25JZCxcblx0cmVtb3ZlUmVsYXRlZEVudGl0aWVzRm9yRW50aXR5LFxuXHRkaXJ0eVJlbGF0aW9ucyxcbn07XG5cbi8qKlxuICogRGVmYXVsdCByZWR1Y2VyIGZvciBoYW5kbGluZyBkaXJ0eSByZWxhdGlvbiBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHN0YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uXG4gKiBAcmV0dXJuIHtJbW11dGFibGUuTWFwfSBSZXR1cm5zIG9yaWdpbmFsIHN0YXRlIGlmIG5vIGNoYW5nZXMsIG90aGVyd2lzZSBuZXcgc3RhdGUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IChcblx0c3RhdGUgPSBmcm9tSlMoIERFRkFVTFRfQ09SRV9TVEFURS5kaXJ0eS5yZWxhdGlvbnMgKSxcblx0YWN0aW9uXG4pID0+IHtcblx0c3dpdGNoICggYWN0aW9uLnR5cGUgKSB7XG5cdFx0Y2FzZSB0eXBlcy5SRUNFSVZFX1VQREFURURfRU5USVRZX0lEX0ZPUl9SRUxBVElPTlM6XG5cdFx0XHRyZXR1cm4gcmVwbGFjZU9sZFJlbGF0aW9uSWRXaXRoTmV3UmVsYXRpb25JZCggc3RhdGUsIGFjdGlvbiApO1xuXHRcdGNhc2UgdHlwZXMuUkVNT1ZFX1JFTEFURURfRU5USVRJRVNfRk9SX0VOVElUWTpcblx0XHRcdHJldHVybiByZW1vdmVSZWxhdGVkRW50aXRpZXNGb3JFbnRpdHkoIHN0YXRlLCBhY3Rpb24gKTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIGRpcnR5UmVsYXRpb25zKCBzdGF0ZSwgYWN0aW9uICk7XG5cdH1cbn07XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgY29tYmluZVJlZHVjZXJzIH0gZnJvbSAnQHdvcmRwcmVzcy9kYXRhJztcblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IGRlbGV0ZUVudGl0eSwgdHJhc2hFbnRpdHkgfSBmcm9tICcuL2RpcnR5LWVudGl0aWVzJztcbmltcG9ydCB7IGRlZmF1bHQgYXMgcmVsYXRpb25zIH0gZnJvbSAnLi9kaXJ0eS1yZWxhdGlvbnMnO1xuXG4vKipcbiAqIFRoZSByb290IHN0YXRlICgnZGVsZXRlJywgJ3RyYXNoJywgcmVsYXRpb25zJykgaXMgYSBwbGFpbiBvYmplY3QsIGJ1dCB0aGVcbiAqIHNsaWNlcyBhcmUgaW1tdXRhYmxlIE1hcHMpLlxuICovXG5leHBvcnQgZGVmYXVsdCBjb21iaW5lUmVkdWNlcnMoIHtcblx0ZGVsZXRlOiBkZWxldGVFbnRpdHksXG5cdHRyYXNoOiB0cmFzaEVudGl0eSxcblx0cmVsYXRpb25zLFxufSApO1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IGZyb21KUywgTWFwIH0gZnJvbSAnaW1tdXRhYmxlJztcbmltcG9ydCB7IGlzRW1wdHksIGRpZmZlcmVuY2UgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgREVGQVVMVF9DT1JFX1NUQVRFIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vbW9kZWwnO1xuaW1wb3J0IHsgaXNNb2RlbEVudGl0eSwgaXNNb2RlbEVudGl0eU9mTW9kZWwgfSBmcm9tICdAZXZlbnRlc3ByZXNzby92YWxpZGF0b3JzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUVudGl0eUlkIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vaGVscGVycyc7XG5cbi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBBQ1RJT05fVFlQRVMgfSBmcm9tICcuLi9hY3Rpb25zL2FjdGlvbi10eXBlcyc7XG5jb25zdCB7IGVudGl0aWVzOiB0eXBlcyB9ID0gQUNUSU9OX1RZUEVTO1xuXG4vKipcbiAqIFRoaXMgcmVwbGFjZXMgYW55IGVudGl0aWVzIGluIHRoZSBpbmNvbWluZyBvYmplY3Qgd2l0aCBtYXRjaGluZyBlbnRpdGllcyAoYnlcbiAqIGlkKSBpbiB0aGUgc3RhdGUgKGlmIHRoZXkgZXhpc3QpLlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gZW50aXR5UmVjb3Jkc1xuICogQHJldHVybiB7SW1tdXRhYmxlLk1hcH0gTmV3IGVudGl0eVJlY29yZHMgb2JqZWN0LlxuICovXG5jb25zdCByZXBsYWNlRXhpc3RpbmdFbnRpdGllc0Zyb21TdGF0ZSA9ICggc3RhdGUsIG1vZGVsTmFtZSwgZW50aXR5UmVjb3JkcyApID0+IHtcblx0Y29uc3QgZXhpc3RpbmdFbnRpdGllcyA9IHN0YXRlLmdldCggbW9kZWxOYW1lLCBudWxsICk7XG5cdGlmICggZXhpc3RpbmdFbnRpdGllcyA9PT0gbnVsbCApIHtcblx0XHRyZXR1cm4gZW50aXR5UmVjb3Jkcztcblx0fVxuXHRyZXR1cm4gZW50aXR5UmVjb3Jkcy5tZXJnZSggZXhpc3RpbmdFbnRpdGllcyApO1xufTtcblxuLyoqXG4gKiBSZWR1Y2VyIGZvciByZWNlaXZpbmcgYW4gZW50aXR5IGludG8gdGhlIHN0YXRlLlxuICpcbiAqIFRoaXMgZG9lcyBub3QgcmVwbGFjZSBhbnkgZW50aXR5IHRoYXQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHN0YXRlLlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEByZXR1cm4ge0ltbXV0YWJsZS5NYXB9IE5ldyBzdGF0ZSBpZiB0aGVyZSBpcyBhIGNoYW5nZSBvdGhlcndpc2UgZXhpc3Rpbmcgc3RhdGUuXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVFbnRpdHkoIHN0YXRlLCBhY3Rpb24gKSB7XG5cdC8qKlxuXHQgKiBAdHlwZSB7c3RyaW5nfSBtb2RlbE5hbWVcblx0ICogQHR5cGUge0Jhc2VFbnRpdHl8bnVsbH0gZW50aXR5XG5cdCAqL1xuXHRjb25zdCB7IGVudGl0eSB9ID0gYWN0aW9uO1xuXG5cdGlmIChcblx0XHQhIGlzTW9kZWxFbnRpdHkoIGVudGl0eSApIHx8XG5cdFx0c3RhdGUuaGFzSW4oIFsgZW50aXR5Lm1vZGVsTmFtZSwgZW50aXR5LmlkIF0gKVxuXHQpIHtcblx0XHRyZXR1cm4gc3RhdGU7XG5cdH1cblx0cmV0dXJuIHN0YXRlLnNldEluKCBbIGVudGl0eS5tb2RlbE5hbWUsIGVudGl0eS5pZCBdLCBlbnRpdHkgKTtcbn1cblxuLyoqXG4gKiBBIHJlZHVjZXIgcmV0dXJuaW5nIHRoZSBuZXcgc3RhdGUgZm9yIGFjdGlvbi5cbiAqXG4gKiBIYW5kbGVzIHJlY2VpdmluZyBlbnRpdHkgcmVjb3JkcyBmcm9tIGEgcmVzdCByZXNwb25zZSBhbmQgY29udmVydGluZyB0aGVtIHRvXG4gKiBtb2RlbCBlbnRpdGllcyB1c2luZyB0aGUgcHJvdmlkZWQgZmFjdG9yeS5cbiAqXG4gKiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBpbmNvbWluZyBlbnRpdHkgcmVjb3JkcyBhcmUgYW4gYXJyYXkgb2YgQmFzZUVudGl0eVxuICogY2hpbGRyZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEByZXR1cm4ge0ltbXV0YWJsZS5NYXB9IFRoZSBuZXcgc3RhdGUgKG9yIHRoZSBvcmlnaW5hbCBpZiBub1xuICogY2hhbmdlIGRldGVjdGVkIG9yIGFjdGlvbiBpc24ndCBoYW5kbGVkIGJ5IHRoaXMgbWV0aG9kKVxuICovXG5mdW5jdGlvbiByZWNlaXZlRW50aXR5UmVjb3Jkcyggc3RhdGUsIGFjdGlvbiApIHtcblx0Y29uc3QgeyB0eXBlLCBtb2RlbE5hbWUgfSA9IGFjdGlvbjtcblx0Ly8gY29udmVydCBmcm9tIGFycmF5IG9mIGVudGl0aWVzIHRvIGEgTWFwIGluZGV4ZWQgYnkgZW50aXR5IGlkLlxuXHRjb25zdCBpbmNvbWluZ0VudGl0aWVzID0gTWFwKCkud2l0aE11dGF0aW9ucyggKCBzdWJTdGF0ZSApID0+IHtcblx0XHRhY3Rpb24uZW50aXRpZXMuZm9yRWFjaChcblx0XHRcdCggZW50aXR5ICkgPT4ge1xuXHRcdFx0XHRpZiAoIGlzTW9kZWxFbnRpdHlPZk1vZGVsKCBlbnRpdHksIG1vZGVsTmFtZSApICkge1xuXHRcdFx0XHRcdHN1YlN0YXRlLnNldCggZW50aXR5LmlkLCBlbnRpdHkgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdCk7XG5cdH0gKTtcblx0aWYgKCAhIHN0YXRlLmhhcyggbW9kZWxOYW1lICkgfHwgaW5jb21pbmdFbnRpdGllcy5pc0VtcHR5KCkgKSB7XG5cdFx0cmV0dXJuIHN0YXRlO1xuXHR9XG5cdGxldFx0dXBkYXRlU3RhdGUgPSBmYWxzZSxcblx0XHRlbnRpdHlSZWNvcmRzO1xuXHRzd2l0Y2ggKCB0eXBlICkge1xuXHRcdGNhc2UgdHlwZXMuUkVDRUlWRV9FTlRJVFlfUkVDT1JEUzpcblx0XHRcdC8vIGlmIGFsbCBpbmNvbWluZyBrZXlzIGV4aXN0IGluIHN0YXRlIGFscmVhZHkgdGhlbiB3ZSBkb24ndCBkb1xuXHRcdFx0Ly8gYW55dGhpbmdcblx0XHRcdGlmICggaXNFbXB0eSggZGlmZmVyZW5jZShcblx0XHRcdFx0QXJyYXkuZnJvbSggaW5jb21pbmdFbnRpdGllcy5rZXlzKCkgKSxcblx0XHRcdFx0QXJyYXkuZnJvbSggc3RhdGUuZ2V0KCBtb2RlbE5hbWUsIE1hcCgpICkua2V5cygpIClcblx0XHRcdCkgKSApIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHQvLyByZXBsYWNlIGFueSBpbmNvbWluZyBlbnRpdHlSZWNvcmRzIHdpdGggZXhpc3RpbmcgZW50aXR5UmVjb3JkcyBhbHJlYWR5XG5cdFx0XHQvLyBpbiB0aGUgc3RvcmUgc28gdGhpcyByZWdpc3RyeSBhY3RzIGFzIHRoZSBcImF1dGhvcml0eVwiXG5cdFx0XHQvLyBmb3IgZW50aXR5UmVjb3Jkcy5cblx0XHRcdGVudGl0eVJlY29yZHMgPSByZXBsYWNlRXhpc3RpbmdFbnRpdGllc0Zyb21TdGF0ZShcblx0XHRcdFx0c3RhdGUsXG5cdFx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdFx0aW5jb21pbmdFbnRpdGllc1xuXHRcdFx0KTtcblx0XHRcdHVwZGF0ZVN0YXRlID0gdHJ1ZTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgdHlwZXMuUkVDRUlWRV9BTkRfUkVQTEFDRV9FTlRJVFlfUkVDT1JEUzpcblx0XHRcdHVwZGF0ZVN0YXRlID0gdHJ1ZTtcblx0XHRcdGVudGl0eVJlY29yZHMgPSBzdGF0ZS5nZXQoIG1vZGVsTmFtZSwgTWFwKCkgKS5tZXJnZSggaW5jb21pbmdFbnRpdGllcyApO1xuXHRcdFx0YnJlYWs7XG5cdH1cblx0aWYgKCB1cGRhdGVTdGF0ZSApIHtcblx0XHRyZXR1cm4gc3RhdGUuc2V0KCBtb2RlbE5hbWUsIGVudGl0eVJlY29yZHMgKTtcblx0fVxuXHRyZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogQSByZWR1Y2VyIGhhbmRsaW5nIHRoZSByZW1vdmFsIG9mIGFuIGVudGl0eSBmcm9tIHN0YXRlIG1hdGNoaW5nIHRoZSBnaXZlblxuICogaWQuXG4gKlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblxuICogQHJldHVybiB7SW1tdXRhYmxlLk1hcH0gTmV3IG9yIGV4aXN0aW5nIHN0YXRlLlxuICovXG5mdW5jdGlvbiByZW1vdmVFbnRpdHlCeUlkKCBzdGF0ZSwgYWN0aW9uICkge1xuXHRjb25zdCB7IG1vZGVsTmFtZSwgZW50aXR5SWQgPSAwIH0gPSBhY3Rpb247XG5cdGNvbnN0IGlkID0gbm9ybWFsaXplRW50aXR5SWQoIGVudGl0eUlkICk7XG5cdHJldHVybiBzdGF0ZS5kZWxldGVJbiggWyBtb2RlbE5hbWUsIGlkIF0gKTtcbn1cblxuLyoqXG4gKiBFeHBvcnRzIHVzZWZ1bCBmb3IgdGVzdHMuXG4gKi9cbmV4cG9ydCB7XG5cdHJlY2VpdmVFbnRpdHksXG5cdHJlY2VpdmVFbnRpdHlSZWNvcmRzLFxuXHRyZW1vdmVFbnRpdHlCeUlkLFxufTtcblxuLyoqXG4gKiBEZWZhdWx0IHJlZHVjZXIgZm9yIGhhbmRsaW5nIGVudGl0aWVzIGluIHN0YXRlLlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEByZXR1cm4ge0ltbXV0YWJsZS5NYXB9IE5ldyBvciBleGlzdGluZyBzdGF0ZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBlbnRpdGllcyhcblx0c3RhdGUgPSBmcm9tSlMoIERFRkFVTFRfQ09SRV9TVEFURS5lbnRpdGllcyApLFxuXHRhY3Rpb25cbikge1xuXHRpZiAoIGFjdGlvbi50eXBlICkge1xuXHRcdHN3aXRjaCAoIGFjdGlvbi50eXBlICkge1xuXHRcdFx0Y2FzZSB0eXBlcy5SRUNFSVZFX0VOVElUWV9SRUNPUkRTOlxuXHRcdFx0Y2FzZSB0eXBlcy5SRUNFSVZFX0FORF9SRVBMQUNFX0VOVElUWV9SRUNPUkRTOlxuXHRcdFx0XHRyZXR1cm4gcmVjZWl2ZUVudGl0eVJlY29yZHMoIHN0YXRlLCBhY3Rpb24gKTtcblx0XHRcdGNhc2UgdHlwZXMuUkVDRUlWRV9FTlRJVFk6XG5cdFx0XHRcdHJldHVybiByZWNlaXZlRW50aXR5KCBzdGF0ZSwgYWN0aW9uICk7XG5cdFx0XHRjYXNlIHR5cGVzLlJFTU9WRV9FTlRJVFlfQllfSUQgOlxuXHRcdFx0XHRyZXR1cm4gcmVtb3ZlRW50aXR5QnlJZCggc3RhdGUsIGFjdGlvbiApO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gc3RhdGU7XG59XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgY29tYmluZVJlZHVjZXJzIH0gZnJvbSAnQHdvcmRwcmVzcy9kYXRhJztcblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCBlbnRpdGllcyBmcm9tICcuL2VudGl0aWVzJztcbmltcG9ydCByZWxhdGlvbnMgZnJvbSAnLi9yZWxhdGlvbnMnO1xuaW1wb3J0IGRpcnR5IGZyb20gJy4vZGlydHknO1xuaW1wb3J0IG1vZGVsU3BlY2lmaWMgZnJvbSAnLi9tb2RlbC1zcGVjaWZpYy1yZWR1Y2Vycyc7XG5cbi8qKlxuICogUmVkdWNlcnMgZm9yIGVudGl0aWVzLCByZWxhdGlvbnMgYW5kIGRpcnR5IHN0YXRlLlxuICpcbiAqIEJlIGF3YXJlIHRoYXQgdGhlIHJvb3Qgc3RhdGUgaXMgYSBwbGFpbiBvYmplY3QgYnV0IHRoZSBzbGljZXMgKGVudGl0aWVzLFxuICogcmVsYXRpb25zLCBkaXJ0eSkgYXJlIGltbXV0YWJsZSBNYXBzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjb21iaW5lUmVkdWNlcnMoIHtcblx0ZW50aXRpZXMsXG5cdHJlbGF0aW9ucyxcblx0ZGlydHksXG5cdG1vZGVsU3BlY2lmaWMsXG59ICk7XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgTWFwIH0gZnJvbSAnaW1tdXRhYmxlJztcblxuaW1wb3J0IHsgQUNUSU9OX1RZUEVTIH0gZnJvbSAnLi4vYWN0aW9ucy9hY3Rpb24tdHlwZXMnO1xuY29uc3QgeyBtb2RlbFNwZWNpZmljOiB0eXBlcyB9ID0gQUNUSU9OX1RZUEVTO1xuXG4vKipcbiAqIEhhbmRsZSByZWNlaXZpbmcgYSBtb2RlbCBzcGVjaWZpYyBzZWxlY3RvciByZWNvcmQgaW50byB0aGUgc3RhdGUuXG4gKlxuICogQHBhcmFtIHtNYXB9IHN0YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uXG4gKiBAcmV0dXJuIHtNYXB9IE5ldyBvciBleGlzdGluZyBzdGF0ZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaGFuZGxlUmVjZWl2ZVNlbGVjdG9yKCBzdGF0ZSA9IE1hcCgpLCBhY3Rpb24gKSB7XG5cdGNvbnN0IHtcblx0XHR0eXBlLFxuXHRcdHNlbGVjdG9yLFxuXHRcdGFyZ3MsXG5cdFx0dmFsdWUsXG5cdH0gPSBhY3Rpb247XG5cdGlmICggdHlwZSA9PT0gdHlwZXMuUkVDRUlWRV9TRUxFQ1RPUl9WQUxVRSApIHtcblx0XHRyZXR1cm4gc3RhdGUuc2V0SW4oIFsgc2VsZWN0b3IsIEpTT04uc3RyaW5naWZ5KCBhcmdzICkgXSwgdmFsdWUgKTtcblx0fVxuXHRyZXR1cm4gc3RhdGU7XG59XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHMuXG4gKi9cbmltcG9ydCB7XG5cdERFRkFVTFRfQ09SRV9TVEFURSxcblx0cGx1cmFsTW9kZWxOYW1lLFxuXHRzaW5ndWxhck1vZGVsTmFtZSxcbn0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vbW9kZWwnO1xuaW1wb3J0IHtcblx0cmVtb3ZlRW1wdHlGcm9tU3RhdGUsXG5cdG5vcm1hbGl6ZUVudGl0eUlkLFxufSBmcm9tICdAZXZlbnRlc3ByZXNzby9oZWxwZXJzJztcbmltcG9ydCB7IGZyb21KUywgU2V0LCBNYXAgfSBmcm9tICdpbW11dGFibGUnO1xuXG4vKipcbiAqIEludGVybmFsIEltcG9ydHNcbiAqL1xuaW1wb3J0IHsgQUNUSU9OX1RZUEVTIH0gZnJvbSAnLi4vYWN0aW9ucy9hY3Rpb24tdHlwZXMnO1xuY29uc3QgeyByZWxhdGlvbnM6IHR5cGVzIH0gPSBBQ1RJT05fVFlQRVM7XG5cbi8qKlxuICogSGFuZGxlcyBub3JtYWxpemluZyB0aGUgaW5jb21pbmcgYWN0aW9uIHNvIHRoYXQgd2UncmUgYWx3YXlzIG9ubHkgcmVjZWl2aW5nXG4gKiByZWxhdGlvbiBkYXRhIGluIHRoZSBzdGF0ZSBvcmllbnRlZCBmcm9tIG9uZSBkaXJlY3Rpb24uXG4gKlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblxuICogQHJldHVybiB7SW1tdXRhYmxlLk1hcH0gRXhpc3Rpbmcgb3IgbmV3IHN0YXRlLlxuICovXG5jb25zdCBub3JtYWxpemVkUmVjZWl2ZUFuZFJlbW92ZVJlbGF0aW9ucyA9ICggc3RhdGUsIGFjdGlvbiApID0+IHtcblx0Ly8gZmlyc3Qgbm9ybWFsaXplIHRoZSBhY3Rpb25cblx0YWN0aW9uID0ge1xuXHRcdC4uLmFjdGlvbixcblx0XHRtb2RlbE5hbWU6IHNpbmd1bGFyTW9kZWxOYW1lKCBhY3Rpb24ubW9kZWxOYW1lICksXG5cdFx0cmVsYXRpb25OYW1lOiBwbHVyYWxNb2RlbE5hbWUoIGFjdGlvbi5yZWxhdGlvbk5hbWUgKSxcblx0XHRlbnRpdHlJZDogbm9ybWFsaXplRW50aXR5SWQoIGFjdGlvbi5lbnRpdHlJZCApLFxuXHR9O1xuXHRjb25zdCB7XG5cdFx0bW9kZWxOYW1lLFxuXHRcdHJlbGF0aW9uTmFtZSxcblx0XHRyZWxhdGVkRW50aXR5SWRzLFxuXHRcdGVudGl0eUlkLFxuXHR9ID0gYWN0aW9uO1xuXHQvLyBpZiBtb2RlbE5hbWUgZXhpc3RzLCB0aGVuIHdlIGp1c3QgcHJvY2VzcyBhcyBpcy5cblx0aWYgKCBzdGF0ZS5oYXNJbiggWyAnZW50aXR5TWFwJywgbW9kZWxOYW1lIF0gKSApIHtcblx0XHRyZXR1cm4gcmVjZWl2ZUFuZFJlbW92ZVJlbGF0aW9ucyggc3RhdGUsIGFjdGlvbiApO1xuXHR9XG5cdC8vIGlmIHRoZSBzaW5ndWxhciBmb3JtIG9mIHRoZSByZWxhdGlvbiBtb2RlbCBuYW1lIGV4aXN0cywgdGhlbiB3ZSBuZWVkIHRvXG5cdC8vIGZsaXAgdGhpbmdzIHNvIHdlJ3JlIG5vcm1hbGl6aW5nIHRvIGFsd2F5cyBoYXZlIGFuIGluZGV4IGZyb20gYSBzaW5nbGVcblx0Ly8gbW9kZWxOYW1lIGZvciB0aGlzIHJlbGF0aW9uIHR5cGUuXG5cdGlmICggc3RhdGUuaGFzSW4oXG5cdFx0WyAnZW50aXR5TWFwJywgc2luZ3VsYXJNb2RlbE5hbWUoIHJlbGF0aW9uTmFtZSApIF1cblx0KSApIHtcblx0XHRjb25zdCBuZXdBY3Rpb24gPSB7XG5cdFx0XHQuLi5hY3Rpb24sXG5cdFx0XHRtb2RlbE5hbWU6IHNpbmd1bGFyTW9kZWxOYW1lKCByZWxhdGlvbk5hbWUgKSxcblx0XHRcdHJlbGF0aW9uTmFtZTogcGx1cmFsTW9kZWxOYW1lKCBtb2RlbE5hbWUgKSxcblx0XHRcdHJlbGF0ZWRFbnRpdHlJZHM6IFsgZW50aXR5SWQgXSxcblx0XHR9O1xuXHRcdC8vIGxvb3AgdGhyb3VnaCBlYWNoIGV4aXN0aW5nIHJlbGF0aW9uIGlkIGFuZCBnZXQgdGhlIHN0YXRlIGZvciBlYWNoXG5cdFx0d2hpbGUgKCByZWxhdGVkRW50aXR5SWRzLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRuZXdBY3Rpb24uZW50aXR5SWQgPSBub3JtYWxpemVFbnRpdHlJZCggcmVsYXRlZEVudGl0eUlkcy5wb3AoKSApO1xuXHRcdFx0c3RhdGUgPSByZWNlaXZlQW5kUmVtb3ZlUmVsYXRpb25zKCBzdGF0ZSwgbmV3QWN0aW9uICk7XG5cdFx0fVxuXHRcdHJldHVybiBzdGF0ZTtcblx0fVxuXHQvLyBsb29rcyBsaWtlIHRoaW5ncyBhcmUgYWxyZWFkeSBub3JtYWxpemVkIGNvcnJlY3RseSBzbyBqdXN0IHByb2Nlc3MgYXMgaXMuXG5cdHJldHVybiByZWNlaXZlQW5kUmVtb3ZlUmVsYXRpb25zKCBzdGF0ZSwgYWN0aW9uICk7XG59O1xuXG4vKipcbiAqIFVzZWQgdG8gc2V0IHRoZSByZWxhdGlvbiBpbmRleCBmb3IgdGhlIGdpdmVuIGRhdGEuXG4gKlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHJlbGF0aW9uRGF0YVxuICogQHBhcmFtIHtib29sZWFufSByZW1vdmFsICBpZiB0cnVlIHRoZW4gcmVtb3ZlcyB0aGUgaW5jb21pbmcgcmVsYXRpb24gaWRzIGZyb21cbiAqIHRoZSBzdGF0ZSwgb3RoZXJ3aXNlIGFkZHMuXG4gKiBAcmV0dXJuIHtJbW11dGFibGUuTWFwfSBFeGlzdGluZyBvciBjaGFuZ2VkIHN0YXRlLlxuICovXG5jb25zdCBzZXRSZWxhdGlvbkluZGV4ID0gKCBzdGF0ZSwgcmVsYXRpb25EYXRhLCByZW1vdmFsID0gZmFsc2UgKSA9PiB7XG5cdGNvbnN0IHtcblx0XHRlbnRpdHlJZCxcblx0XHRyZWxhdGVkRW50aXR5SWRzLFxuXHR9ID0gcmVsYXRpb25EYXRhO1xuXHRjb25zdCBtb2RlbE5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggcmVsYXRpb25EYXRhLm1vZGVsTmFtZSApO1xuXHRjb25zdCByZWxhdGlvbk5hbWUgPSBwbHVyYWxNb2RlbE5hbWUoIHJlbGF0aW9uRGF0YS5yZWxhdGlvbk5hbWUgKTtcblx0Y29uc3QgcmVsYXRpb25JZHMgPSBbIC4uLnJlbGF0ZWRFbnRpdHlJZHMgXTtcblx0d2hpbGUgKCByZWxhdGlvbklkcy5sZW5ndGggPiAwICkge1xuXHRcdGNvbnN0IHBhdGggPSBbICdpbmRleCcsIHJlbGF0aW9uTmFtZSwgcmVsYXRpb25JZHMucG9wKCksIG1vZGVsTmFtZSBdO1xuXHRcdGxldCBleGlzdGluZ0lkcyA9IHN0YXRlLmdldEluKCBwYXRoICkgfHwgU2V0KCk7XG5cdFx0ZXhpc3RpbmdJZHMgPSByZW1vdmFsID9cblx0XHRcdGV4aXN0aW5nSWRzLmRlbGV0ZSggZW50aXR5SWQgKSA6XG5cdFx0XHRleGlzdGluZ0lkcy5hZGQoIGVudGl0eUlkICk7XG5cdFx0c3RhdGUgPSBleGlzdGluZ0lkcy5pc0VtcHR5KCkgP1xuXHRcdFx0cmVtb3ZlRW1wdHlGcm9tU3RhdGUoIHN0YXRlLCBwYXRoICkgOlxuXHRcdFx0c3RhdGUuc2V0SW4oIHBhdGgsIGV4aXN0aW5nSWRzICk7XG5cdH1cblx0cmV0dXJuIHN0YXRlO1xufTtcblxuLyoqXG4gKiBSZWR1Y2VyIGZvciB0aGUgcmVsYXRpb25zIHN0YXRlIGluIHRoZSBzdG9yZS5cbiAqXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHN0YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uXG4gKiBAcmV0dXJuIHtJbW11dGFibGUuTWFwfSBFaXRoZXIgYSBuZXcgc3RhdGUgb3IgdGhlIGV4aXN0aW5nIHN0YXRlLlxuICovXG5mdW5jdGlvbiByZWNlaXZlQW5kUmVtb3ZlUmVsYXRpb25zKCBzdGF0ZSwgYWN0aW9uICkge1xuXHRjb25zdCB7XG5cdFx0bW9kZWxOYW1lLFxuXHRcdHJlbGF0aW9uTmFtZSxcblx0XHRlbnRpdHlJZCxcblx0XHR0eXBlLFxuXHR9ID0gYWN0aW9uO1xuXHRjb25zdCByZWxhdGlvbkVudGl0eUlkcyA9IFNldCggYWN0aW9uLnJlbGF0ZWRFbnRpdHlJZHMgKTtcblx0Y29uc3QgcGF0aCA9IFsgJ2VudGl0eU1hcCcsIG1vZGVsTmFtZSwgZW50aXR5SWQsIHJlbGF0aW9uTmFtZSBdO1xuXG5cdGNvbnN0IGV4aXN0aW5nSWRzID0gc3RhdGUuZ2V0SW4oIHBhdGgsIFNldCgpICk7XG5cblx0c3dpdGNoICggdHlwZSApIHtcblx0XHRjYXNlIHR5cGVzLlJFQ0VJVkVfUkVMQVRFRF9FTlRJVFlfSURTOlxuXHRcdFx0c3RhdGUgPSBzdGF0ZS5zZXRJbihcblx0XHRcdFx0cGF0aCxcblx0XHRcdFx0ZXhpc3RpbmdJZHMuY29uY2F0KCByZWxhdGlvbkVudGl0eUlkcyApXG5cdFx0XHQpO1xuXHRcdFx0c3RhdGUgPSBzZXRSZWxhdGlvbkluZGV4KCBzdGF0ZSwgYWN0aW9uICk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIHR5cGVzLlJFTU9WRV9SRUxBVEVEX0VOVElUWV9JRFM6XG5cdFx0XHRjb25zdCBpZHNBZnRlclJlbW92YWwgPSBleGlzdGluZ0lkcy5maWx0ZXIoXG5cdFx0XHRcdCggaWQgKSA9PiAhIHJlbGF0aW9uRW50aXR5SWRzLmtleU9mKFxuXHRcdFx0XHRcdG5vcm1hbGl6ZUVudGl0eUlkKCBpZCApXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0XHQvLyBJbW11dGFibGUuU2V0KCkuZmlsdGVyKCkgcmV0dXJucyBuZXcgaW5zdGFuY2UsIHNvIGxldCdzIGNvbXBhcmVcblx0XHRcdC8vIHNpemUuXG5cdFx0XHRpZiAoIGlkc0FmdGVyUmVtb3ZhbC5jb3VudCgpID09PSBleGlzdGluZ0lkcy5jb3VudCgpICkge1xuXHRcdFx0XHRyZXR1cm4gc3RhdGU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoICEgaWRzQWZ0ZXJSZW1vdmFsLmlzRW1wdHkoKSApIHtcblx0XHRcdFx0c3RhdGUgPSBzdGF0ZS5zZXRJbiggcGF0aCwgaWRzQWZ0ZXJSZW1vdmFsICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzdGF0ZSA9IHJlbW92ZUVtcHR5RnJvbVN0YXRlKCBzdGF0ZSwgcGF0aCApO1xuXHRcdFx0fVxuXHRcdFx0c3RhdGUgPSBzZXRSZWxhdGlvbkluZGV4KCBzdGF0ZSwgYWN0aW9uLCB0cnVlICk7XG5cdFx0XHRicmVhaztcblx0fVxuXHRyZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogUmVkdWNlciBmb3IgaGFuZGxpbmcgZW50aXR5IGlkcyBpbiB0aGUgcmVsYXRpb24gdGhhdCBoYXZlIGEgY3VpZCB0aGF0IGhhc1xuICogYmVlbiB1cGRhdGVkIHdpdGggYSBuZXcgZW50aXR5IGlkIGZyb20gdGhlIHNlcnZlci5cbiAqXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHN0YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uXG4gKiBAcmV0dXJuIHtJbW11dGFibGUuTWFwfSBFaXRoZXIgbmV3IG9yIG9yaWdpbmFsIHN0YXRlXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZUVudGl0eUlkRm9yUmVsYXRpb25zKCBzdGF0ZSwgYWN0aW9uICkge1xuXHRsZXQge1xuXHRcdG9sZEVudGl0eUlkLFxuXHRcdG5ld0VudGl0eUlkLFxuXHRcdG1vZGVsTmFtZSxcblx0fSA9IGFjdGlvbjtcblx0bW9kZWxOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRvbGRFbnRpdHlJZCA9IG5vcm1hbGl6ZUVudGl0eUlkKCBvbGRFbnRpdHlJZCApO1xuXHRuZXdFbnRpdHlJZCA9IG5vcm1hbGl6ZUVudGl0eUlkKCBuZXdFbnRpdHlJZCApO1xuXHRjb25zdCBtb2RlbEFzUmVsYXRpb25OYW1lID0gcGx1cmFsTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0Y29uc3Qgb2xkSW5kZXhQYXRoID0gWyAnaW5kZXgnLCBtb2RlbEFzUmVsYXRpb25OYW1lLCBvbGRFbnRpdHlJZCBdO1xuXHRjb25zdCBpbmRleFJlY29yZFRvUmVwbGFjZSA9IHN0YXRlLmdldEluKCBvbGRJbmRleFBhdGggKSB8fCBNYXAoKTtcblx0aWYgKCAhIGluZGV4UmVjb3JkVG9SZXBsYWNlLmlzRW1wdHkoKSApIHtcblx0XHRzdGF0ZSA9IHJlcGxhY2VSZWxhdGlvblJlY29yZHMoXG5cdFx0XHRzdGF0ZSxcblx0XHRcdCdpbmRleCcsXG5cdFx0XHR7XG5cdFx0XHRcdG1vZGVsTmFtZTogbW9kZWxBc1JlbGF0aW9uTmFtZSxcblx0XHRcdFx0b2xkRW50aXR5SWQsXG5cdFx0XHRcdG5ld0VudGl0eUlkLFxuXHRcdFx0XHRtYWluUmVjb3JkVG9SZXBsYWNlOiBpbmRleFJlY29yZFRvUmVwbGFjZSxcblx0XHRcdH1cblx0XHQpO1xuXHR9XG5cdGNvbnN0IG9sZEVudGl0eU1hcFBhdGggPSBbICdlbnRpdHlNYXAnLCBtb2RlbE5hbWUsIG9sZEVudGl0eUlkIF07XG5cdGNvbnN0IG1hcEVudGl0eVJlY29yZFRvUmVwbGFjZSA9IHN0YXRlLmdldEluKCBvbGRFbnRpdHlNYXBQYXRoICkgfHwgTWFwKCk7XG5cblx0aWYgKCAhIG1hcEVudGl0eVJlY29yZFRvUmVwbGFjZS5pc0VtcHR5KCkgKSB7XG5cdFx0c3RhdGUgPSByZXBsYWNlUmVsYXRpb25SZWNvcmRzKFxuXHRcdFx0c3RhdGUsXG5cdFx0XHQnZW50aXR5TWFwJyxcblx0XHRcdHtcblx0XHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0XHRvbGRFbnRpdHlJZCxcblx0XHRcdFx0bmV3RW50aXR5SWQsXG5cdFx0XHRcdG1haW5SZWNvcmRUb1JlcGxhY2U6IG1hcEVudGl0eVJlY29yZFRvUmVwbGFjZSxcblx0XHRcdH1cblx0XHQpO1xuXHR9XG5cdHJldHVybiBzdGF0ZTtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IG1ldGhvZCBmb3IgaGFuZGxpbmcgcmVwbGFjaW5nIHRoZSBvbGQgZW50aXR5IGlkIGZyb20gaW5jb21pbmcgbW9kZWxcbiAqIHdpdGggdGhlIHByb3ZpZGVkIG5ldyBpZCBkYXRhIChvciBqdXN0IHJlbW92aW5nIGl0IGlmIHJlbW92ZU9ubHkgaXMgdHJ1ZSlcbiAqIFRoaXMgaGFuZGxlcyBib3RoIHRoZSBpbmRleCBhbmQgZW50aXR5TWFwIG9iamVjdHMgaW4gdGhlIHJlbGF0aW9ucyBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RhdGVQcm9wZXJ0eU5hbWUgKGVpdGhlciBgaW5kZXhgIG9yIGBlbnRpdHlNYXBgKVxuICogQHBhcmFtIHtPYmplY3R9IG1vZGVsRGF0YVxuICogQHBhcmFtIHtib29sZWFufSByZW1vdmVPbmx5IElmIHRydWUsIHRoZW4gdGhlIHZhbHVlIGZvciBvbGRFbnRpdHlJZCB3aWxsIGJlXG4gKiByZW1vdmVkIGZyb20gc3RhdGUgYW5kIG5ld0VudGl0eSB3aWxsIG5vdCBiZSBhZGRlZCB0byBzdGF0ZS5cbiAqIEByZXR1cm4ge0ltbXV0YWJsZS5NYXB9IFJldHVybnMgZWl0aGVyIG5ldyBvciBleGlzdGluZyBzdGF0ZS5cbiAqL1xuY29uc3QgcmVwbGFjZVJlbGF0aW9uUmVjb3JkcyA9IChcblx0c3RhdGUsXG5cdHN0YXRlUHJvcGVydHlOYW1lLFxuXHRtb2RlbERhdGEsXG5cdHJlbW92ZU9ubHkgPSBmYWxzZSxcbikgPT4ge1xuXHRjb25zdCB7XG5cdFx0bW9kZWxOYW1lLFxuXHRcdG9sZEVudGl0eUlkLFxuXHRcdG5ld0VudGl0eUlkID0gMCxcblx0XHRtYWluUmVjb3JkVG9SZXBsYWNlLFxuXHR9ID0gbW9kZWxEYXRhO1xuXHRjb25zdCBsb29wUHJvcGVydHkgPSBzdGF0ZVByb3BlcnR5TmFtZSA9PT0gJ2luZGV4JyA/ICdlbnRpdHlNYXAnIDogJ2luZGV4Jztcblx0Y29uc3Qgb2xkRW50aXR5UGF0aCA9IFsgc3RhdGVQcm9wZXJ0eU5hbWUsIG1vZGVsTmFtZSwgb2xkRW50aXR5SWQgXTtcblx0c3RhdGUgPSBzdGF0ZS53aXRoTXV0YXRpb25zKCAoIHN1YlN0YXRlICkgPT4ge1xuXHRcdHN1YlN0YXRlLmRlbGV0ZUluKCBvbGRFbnRpdHlQYXRoICk7XG5cdFx0b2xkRW50aXR5UGF0aC5wb3AoKTtcblx0XHRpZiAoIHJlbW92ZU9ubHkgKSB7XG5cdFx0XHRpZiAoIHN1YlN0YXRlLmdldEluKCBvbGRFbnRpdHlQYXRoICkuaXNFbXB0eSgpICkge1xuXHRcdFx0XHRzdWJTdGF0ZS5kZWxldGVJbiggb2xkRW50aXR5UGF0aCApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzdWJTdGF0ZS5zZXRJbihcblx0XHRcdFx0WyAuLi5vbGRFbnRpdHlQYXRoLCBuZXdFbnRpdHlJZCBdLFxuXHRcdFx0XHRtYWluUmVjb3JkVG9SZXBsYWNlXG5cdFx0XHQpO1xuXHRcdH1cblx0fSApO1xuXG5cdC8vcmVwbGFjZSByZWxhdGVkIGVudHJpZXNcblx0bWFpblJlY29yZFRvUmVwbGFjZS5mb3JFYWNoKCAoIHJlbGF0aW9uSWRzLCByZWxhdGlvbk5hbWUgKSA9PiB7XG5cdFx0cmVsYXRpb25JZHMgPSByZWxhdGlvbklkcy50b0FycmF5KCk7XG5cdFx0c3RhdGUgPSBzdGF0ZS53aXRoTXV0YXRpb25zKCAoIHN1YlN0YXRlICkgPT4ge1xuXHRcdFx0d2hpbGUgKCByZWxhdGlvbklkcy5sZW5ndGggPiAwICkge1xuXHRcdFx0XHRjb25zdCByZWxhdGlvblBhdGggPSBbXG5cdFx0XHRcdFx0bG9vcFByb3BlcnR5LFxuXHRcdFx0XHRcdHJlbGF0aW9uTmFtZSxcblx0XHRcdFx0XHRyZWxhdGlvbklkcy5wb3AoKSxcblx0XHRcdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRcdF07XG5cdFx0XHRcdGxldCByZWxhdGlvblJlY29yZCA9IHN1YlN0YXRlLmdldEluKCByZWxhdGlvblBhdGggKSB8fCBTZXQoKTtcblx0XHRcdFx0cmVsYXRpb25SZWNvcmQgPSByZWxhdGlvblJlY29yZC5kZWxldGUoIG9sZEVudGl0eUlkICk7XG5cdFx0XHRcdGlmICggcmVtb3ZlT25seSAmJiByZWxhdGlvblJlY29yZC5pc0VtcHR5KCkgKSB7XG5cdFx0XHRcdFx0cmVtb3ZlRW1wdHlGcm9tU3RhdGUoXG5cdFx0XHRcdFx0XHRzdWJTdGF0ZSxcblx0XHRcdFx0XHRcdHJlbGF0aW9uUGF0aCxcblx0XHRcdFx0XHRcdDEsXG5cdFx0XHRcdFx0XHRmYWxzZVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVsYXRpb25SZWNvcmQgPSByZW1vdmVPbmx5ID9cblx0XHRcdFx0XHRcdHJlbGF0aW9uUmVjb3JkIDpcblx0XHRcdFx0XHRcdHJlbGF0aW9uUmVjb3JkLmFkZCggbmV3RW50aXR5SWQgKTtcblx0XHRcdFx0XHRzdWJTdGF0ZS5zZXRJbiggcmVsYXRpb25QYXRoLCByZWxhdGlvblJlY29yZCApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9ICk7XG5cdHJldHVybiBzdGF0ZTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyBhbnkgcmVsYXRpb24gcmVxdWVzdHMgZm9yIHJlbGF0ZWQgZW50aXRpZXMgaW4gdGhlIHN0YXRlLlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEByZXR1cm4ge0ltbXV0YWJsZS5NYXB9IGVpdGhlciBleGlzdGluZyAoaWYgbm8gY2hhbmdlcykgb3IgbmV3IHN0YXRlLlxuICovXG5jb25zdCByZW1vdmVSZWxhdGVkRW50aXRpZXNGb3JFbnRpdHkgPSAoIHN0YXRlLCBhY3Rpb24gKSA9PiB7XG5cdGxldCB7XG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkLFxuXHR9ID0gYWN0aW9uO1xuXHRtb2RlbE5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lICk7XG5cdGVudGl0eUlkID0gbm9ybWFsaXplRW50aXR5SWQoIGVudGl0eUlkICk7XG5cdGNvbnN0IG1vZGVsQXNSZWxhdGlvbk5hbWUgPSBwbHVyYWxNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRjb25zdCBpbmRleFJlY29yZFRvUmVwbGFjZSA9IHN0YXRlLmdldEluKFxuXHRcdFsgJ2luZGV4JywgbW9kZWxBc1JlbGF0aW9uTmFtZSwgZW50aXR5SWQgXVxuXHQpIHx8IE1hcCgpO1xuXG5cdGlmICggISBpbmRleFJlY29yZFRvUmVwbGFjZS5pc0VtcHR5KCkgKSB7XG5cdFx0c3RhdGUgPSByZXBsYWNlUmVsYXRpb25SZWNvcmRzKFxuXHRcdFx0c3RhdGUsXG5cdFx0XHQnaW5kZXgnLFxuXHRcdFx0e1xuXHRcdFx0XHRtb2RlbE5hbWU6IG1vZGVsQXNSZWxhdGlvbk5hbWUsXG5cdFx0XHRcdG9sZEVudGl0eUlkOiBlbnRpdHlJZCxcblx0XHRcdFx0bWFpblJlY29yZFRvUmVwbGFjZTogaW5kZXhSZWNvcmRUb1JlcGxhY2UsXG5cdFx0XHR9LFxuXHRcdFx0dHJ1ZVxuXHRcdCk7XG5cdH1cblxuXHRjb25zdCBlbnRpdHlNYXBSZWNvcmRUb1JlcGxhY2UgPSBzdGF0ZS5nZXRJbihcblx0XHRbICdlbnRpdHlNYXAnLCBtb2RlbE5hbWUsIGVudGl0eUlkIF1cblx0KSB8fCBNYXAoKTtcblxuXHRpZiAoICEgZW50aXR5TWFwUmVjb3JkVG9SZXBsYWNlLmlzRW1wdHkoKSApIHtcblx0XHRzdGF0ZSA9IHJlcGxhY2VSZWxhdGlvblJlY29yZHMoXG5cdFx0XHRzdGF0ZSxcblx0XHRcdCdlbnRpdHlNYXAnLFxuXHRcdFx0e1xuXHRcdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRcdG9sZEVudGl0eUlkOiBlbnRpdHlJZCxcblx0XHRcdFx0bWFpblJlY29yZFRvUmVwbGFjZTogZW50aXR5TWFwUmVjb3JkVG9SZXBsYWNlLFxuXHRcdFx0fSxcblx0XHRcdHRydWVcblx0XHQpO1xuXHR9XG5cdHJldHVybiBzdGF0ZTtcbn07XG5cbi8qKlxuICogZXhwb3J0IGZvciB0ZXN0c1xuICovXG5leHBvcnQge1xuXHRub3JtYWxpemVkUmVjZWl2ZUFuZFJlbW92ZVJlbGF0aW9ucyxcblx0dXBkYXRlRW50aXR5SWRGb3JSZWxhdGlvbnMsXG5cdHJlbW92ZVJlbGF0ZWRFbnRpdGllc0ZvckVudGl0eSxcbn07XG5cbi8qKlxuICogUmVkdWNlciBmb3IgcmVsYXRpb24gcmVsYXRlZCBzdGF0ZSBjaGFuZ2VzLlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblxuICogQHJldHVybiB7SW1tdXRhYmxlLk1hcH0gT3JpZ2luYWwgc3RhdGUgaWYgbm8gY2hhbmdlLCBuZXcgc3RhdGUgaWYgY2hhbmdlLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWxhdGlvbnMoXG5cdHN0YXRlID0gZnJvbUpTKCBERUZBVUxUX0NPUkVfU1RBVEUucmVsYXRpb25zICksXG5cdGFjdGlvblxuKSB7XG5cdHN3aXRjaCAoIGFjdGlvbi50eXBlICkge1xuXHRcdGNhc2UgdHlwZXMuUkVDRUlWRV9SRUxBVEVEX0VOVElUWV9JRFM6XG5cdFx0Y2FzZSB0eXBlcy5SRU1PVkVfUkVMQVRFRF9FTlRJVFlfSURTOlxuXHRcdFx0cmV0dXJuIG5vcm1hbGl6ZWRSZWNlaXZlQW5kUmVtb3ZlUmVsYXRpb25zKCBzdGF0ZSwgYWN0aW9uICk7XG5cdFx0Y2FzZSB0eXBlcy5SRUNFSVZFX1VQREFURURfRU5USVRZX0lEX0ZPUl9SRUxBVElPTlM6XG5cdFx0XHRyZXR1cm4gdXBkYXRlRW50aXR5SWRGb3JSZWxhdGlvbnMoIHN0YXRlLCBhY3Rpb24gKTtcblx0XHRjYXNlIHR5cGVzLlJFTU9WRV9SRUxBVEVEX0VOVElUSUVTX0ZPUl9FTlRJVFk6XG5cdFx0XHRyZXR1cm4gcmVtb3ZlUmVsYXRlZEVudGl0aWVzRm9yRW50aXR5KCBzdGF0ZSwgYWN0aW9uICk7XG5cdH1cblx0cmV0dXJuIHN0YXRlO1xufVxuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IGdldEVuZHBvaW50IH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vbW9kZWwnO1xuaW1wb3J0IHsgaXNNb2RlbEVudGl0eUZhY3RvcnlPZk1vZGVsIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vdmFsaWRhdG9ycyc7XG5cbi8qKlxuICogSW50ZXJuYWwgSW1wb3J0c1xuICovXG5pbXBvcnQgeyBmZXRjaCwgcmVzb2x2ZVNlbGVjdCB9IGZyb20gJy4uLy4uL2Jhc2UtY29udHJvbHMnO1xuaW1wb3J0IHsgcmVjZWl2ZUVudGl0eVJlY29yZHMgfSBmcm9tICcuLy4uL2FjdGlvbnMnO1xuaW1wb3J0IHsgUkVEVUNFUl9LRVkgYXMgU0NIRU1BX1JFRFVDRVJfS0VZIH0gZnJvbSAnLi4vLi4vc2NoZW1hL2NvbnN0YW50cyc7XG5cbi8qKlxuICogQSByZXNvbHZlciBmb3IgZ2V0dGluZyBhbiBlbnRpdHkgZm9yIHRoZSBnaXZlbiBtb2RlbCBuYW1lIGFuZCBlbnRpdHkgaWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IGVudGl0eUlkXG4gKiBAcmV0dXJuIHtudWxsfEJhc2VFbnRpdHl9IElmIHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQsIHRoZSBlbnRpdHksXG4gKiBvdGhlcndpc2UgbnVsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uKiBnZXRFbnRpdHlCeUlkKCBtb2RlbE5hbWUsIGVudGl0eUlkICkge1xuXHRjb25zdCBlbnRpdHkgPSB5aWVsZCBmZXRjaCgge1xuXHRcdHBhdGg6IGdldEVuZHBvaW50KCBtb2RlbE5hbWUgKSArICcvJyArIGVudGl0eUlkLFxuXHR9ICk7XG5cdGNvbnN0IGZhY3RvcnkgPSB5aWVsZCByZXNvbHZlU2VsZWN0KFxuXHRcdFNDSEVNQV9SRURVQ0VSX0tFWSxcblx0XHQnZ2V0RmFjdG9yeUZvck1vZGVsJyxcblx0XHRtb2RlbE5hbWVcblx0KTtcblx0aWYgKCAhIGlzTW9kZWxFbnRpdHlGYWN0b3J5T2ZNb2RlbCggZmFjdG9yeSwgbW9kZWxOYW1lICkgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0Y29uc3QgZnVsbEVudGl0eSA9IGZhY3RvcnkuZnJvbUV4aXN0aW5nKCBlbnRpdHkgKTtcblx0eWllbGQgcmVjZWl2ZUVudGl0eVJlY29yZHMoIG1vZGVsTmFtZSwgWyBmdWxsRW50aXR5IF0gKTtcblx0cmV0dXJuIGZ1bGxFbnRpdHk7XG59XG4iLCJleHBvcnQgKiBmcm9tICcuL2VudGl0aWVzJztcbmV4cG9ydCAqIGZyb20gJy4vcmVsYXRpb25zJztcbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQge1xuXHRjcmVhdGVBbmRLZXlFbnRpdGllc0J5UHJpbWFyeUtleVZhbHVlLFxuXHRrZXlFbnRpdGllc0J5UHJpbWFyeUtleVZhbHVlLFxuXHRwbHVyYWxNb2RlbE5hbWUsXG5cdHNpbmd1bGFyTW9kZWxOYW1lLFxuXHRzdHJpcEJhc2VSb3V0ZUZyb21VcmwsXG5cdGdldFByaW1hcnlLZXlRdWVyeVN0cmluZyxcblx0Z2V0UHJpbWFyeUtleSxcblx0Z2V0RW5kcG9pbnQsXG59IGZyb20gJ0BldmVudGVzcHJlc3NvL21vZGVsJztcbmltcG9ydCB7XG5cdGlzTW9kZWxFbnRpdHlGYWN0b3J5T2ZNb2RlbCxcblx0aXNNb2RlbEVudGl0eSxcbn0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vdmFsaWRhdG9ycyc7XG5pbXBvcnQgeyBJbnZhbGlkTW9kZWxFbnRpdHkgfSBmcm9tICdAZXZlbnRlc3ByZXNzby9lZWpzJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJ3dhcm5pbmcnO1xuaW1wb3J0IHsgaXNFbXB0eSwgc3RhcnRDYXNlLCBpc1VuZGVmaW5lZCwgaXNBcnJheSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBNYXAgYXMgSW1tdXRhYmxlTWFwIH0gZnJvbSAnaW1tdXRhYmxlJztcblxuLyoqXG4gKiBJbnRlcm5hbCBJbXBvcnRzXG4gKi9cbmltcG9ydCB7XG5cdGZldGNoLFxuXHRkaXNwYXRjaCxcblx0c2VsZWN0LFxuXHRyZXNvbHZlU2VsZWN0LFxuXHRyZXNvbHZlR2V0RW50aXR5QnlJZEZvcklkcyxcblx0cmVzb2x2ZUdldFJlbGF0ZWRFbnRpdGllcyxcbn0gZnJvbSAnLi4vLi4vYmFzZS1jb250cm9scyc7XG5pbXBvcnQge1xuXHRyZWNlaXZlRW50aXR5UmVjb3Jkcyxcblx0cmVjZWl2ZVJlbGF0ZWRFbnRpdGllcyxcbn0gZnJvbSAnLi8uLi9hY3Rpb25zJztcbmltcG9ydCB7IGtlZXBFeGlzdGluZ0VudGl0aWVzSW5PYmplY3QgfSBmcm9tICcuLi8uLi9iYXNlLW1vZGVsJztcbmltcG9ydCB7IFJFRFVDRVJfS0VZIGFzIENPUkVfUkVEVUNFUl9LRVkgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgUkVEVUNFUl9LRVkgYXMgU0NIRU1BX1JFRFVDRVJfS0VZIH0gZnJvbSAnLi4vLi4vc2NoZW1hL2NvbnN0YW50cyc7XG5cbmNvbnN0IERFRkFVTFRfRU1QVFlfQVJSQVkgPSBbXTtcblxuLyoqXG4gKiBBIHJlc29sdmVyIGZvciBnZXR0aW5nIHJlbGF0aW9uIGVudGl0aWVzIGZvciB0aGUgZ2l2ZW4gbW9kZWwgbmFtZSBhbmQgZW50aXR5XG4gKiBmb3IgdGhhdCBtb2RlbC5cbiAqXG4gKiBAcGFyYW0ge0Jhc2VFbnRpdHl9IGVudGl0eVxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uTW9kZWxOYW1lXG4gKiBAcmV0dXJuIHtbXXxBcnJheTxCYXNlRW50aXR5Pn0gSWYgdGhlcmUgYXJlIHJlbGF0aW9ucywgcmV0dXJucyBhbiBhcnJheSBvZlxuICogQmFzZUVudGl0eSBpbnN0YW5jZXMgZm9yIHRoZSByZWxhdGlvbnMsIG90aGVyd2lzZSBhbiBlbXB0eSBhcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uKiBnZXRSZWxhdGVkRW50aXRpZXMoIGVudGl0eSwgcmVsYXRpb25Nb2RlbE5hbWUgKSB7XG5cdGlmICggISBpc01vZGVsRW50aXR5KCBlbnRpdHkgKSApIHtcblx0XHR0aHJvdyBuZXcgSW52YWxpZE1vZGVsRW50aXR5KCAnJywgZW50aXR5ICk7XG5cdH1cblx0Y29uc3QgbW9kZWxOYW1lID0gZW50aXR5Lm1vZGVsTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRjb25zdCBwbHVyYWxSZWxhdGlvbk5hbWUgPSBwbHVyYWxNb2RlbE5hbWUoIHJlbGF0aW9uTW9kZWxOYW1lICk7XG5cdGNvbnN0IHNpbmd1bGFyUmVsYXRpb25OYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIHJlbGF0aW9uTW9kZWxOYW1lICk7XG5cdGNvbnN0IHJlbGF0aW9uUmVzb3VyY2VQcm9wZXJ0eSA9IHBsdXJhbFJlbGF0aW9uTmFtZSArICdSZXNvdXJjZSc7XG5cdGNvbnN0IHJlbGF0aW9uRW5kcG9pbnQgPSBlbnRpdHlbIHJlbGF0aW9uUmVzb3VyY2VQcm9wZXJ0eSBdID9cblx0XHRzdHJpcEJhc2VSb3V0ZUZyb21VcmwoXG5cdFx0XHRlbnRpdHlbIHJlbGF0aW9uUmVzb3VyY2VQcm9wZXJ0eSBdLnJlc291cmNlTGlua1xuXHRcdCkgOlxuXHRcdCcnO1xuXHRpZiAoIHJlbGF0aW9uRW5kcG9pbnQgPT09ICcnICkge1xuXHRcdHdhcm5pbmcoXG5cdFx0XHRmYWxzZSxcblx0XHRcdCdUaGVyZSBpcyBubyByZWxhdGlvbiByZXNvdXJjZSBmb3IgdGhlIGdpdmVuIG1vZGVsICglcykgYW5kIHJlcXVlc3RlZCByZWxhdGlvbiAoJXMpJyxcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdHBsdXJhbFJlbGF0aW9uTmFtZVxuXHRcdCk7XG5cdFx0cmV0dXJuIERFRkFVTFRfRU1QVFlfQVJSQVk7XG5cdH1cblx0eWllbGQgZGlzcGF0Y2goXG5cdFx0U0NIRU1BX1JFRFVDRVJfS0VZLFxuXHRcdCdyZWNlaXZlUmVsYXRpb25FbmRwb2ludEZvck1vZGVsRW50aXR5Jyxcblx0XHRtb2RlbE5hbWUsXG5cdFx0ZW50aXR5LmlkLFxuXHRcdHBsdXJhbFJlbGF0aW9uTmFtZSxcblx0XHRyZWxhdGlvbkVuZHBvaW50XG5cdCk7XG5cdHlpZWxkIGRpc3BhdGNoKFxuXHRcdCdjb3JlL2RhdGEnLFxuXHRcdCdmaW5pc2hSZXNvbHV0aW9uJyxcblx0XHRTQ0hFTUFfUkVEVUNFUl9LRVksXG5cdFx0J3JlY2VpdmVSZWxhdGlvbkVuZHBvaW50Rm9yTW9kZWxFbnRpdHknLFxuXHRcdFsgbW9kZWxOYW1lLCBlbnRpdHkuaWQsIHBsdXJhbFJlbGF0aW9uTmFtZSwgcmVsYXRpb25FbmRwb2ludCBdXG5cdCk7XG5cdGNvbnN0IHJlbGF0aW9uRW50aXRpZXMgPSB5aWVsZCBmZXRjaCgge1xuXHRcdHBhdGg6IHJlbGF0aW9uRW5kcG9pbnQsXG5cdH0gKTtcblx0aWYgKCAhIHJlbGF0aW9uRW50aXRpZXMubGVuZ3RoICkge1xuXHRcdHJldHVybiBERUZBVUxUX0VNUFRZX0FSUkFZO1xuXHR9XG5cblx0Y29uc3QgZmFjdG9yeSA9IHlpZWxkIHJlc29sdmVTZWxlY3QoXG5cdFx0U0NIRU1BX1JFRFVDRVJfS0VZLFxuXHRcdCdnZXRGYWN0b3J5Rm9yTW9kZWwnLFxuXHRcdHNpbmd1bGFyUmVsYXRpb25OYW1lXG5cdCk7XG5cdGlmICggISBpc01vZGVsRW50aXR5RmFjdG9yeU9mTW9kZWwoXG5cdFx0ZmFjdG9yeSxcblx0XHRzaW5ndWxhclJlbGF0aW9uTmFtZVxuXHQpICkge1xuXHRcdHJldHVybiBERUZBVUxUX0VNUFRZX0FSUkFZO1xuXHR9XG5cblx0bGV0IGZ1bGxFbnRpdGllcyA9IGtleUVudGl0aWVzQnlQcmltYXJ5S2V5VmFsdWUoXG5cdFx0c2luZ3VsYXJSZWxhdGlvbk5hbWUsXG5cdFx0cmVsYXRpb25FbnRpdGllc1xuXHQpO1xuXHRmdWxsRW50aXRpZXMgPSBjcmVhdGVBbmRLZXlFbnRpdGllc0J5UHJpbWFyeUtleVZhbHVlKFxuXHRcdGZhY3RvcnksXG5cdFx0ZnVsbEVudGl0aWVzLFxuXHQpO1xuXHRjb25zdCBlbnRpdHlJZHMgPSBBcnJheS5mcm9tKCBmdWxsRW50aXRpZXMua2V5cygpICk7XG5cblx0Ly8gYXJlIHRoZXJlIGFscmVhZHkgZW50aXRpZXMgZm9yIHRoZSBpZHMgaW4gdGhlIHN0b3JlPyBJZiBzby4uLndlIHVzZVxuXHQvLyB0aG9zZS5cblx0Y29uc3QgZXhpc3RpbmdFbnRpdGllcyA9IHlpZWxkIHNlbGVjdChcblx0XHRDT1JFX1JFRFVDRVJfS0VZLFxuXHRcdCdnZXRFbnRpdGllc0J5SWRzJyxcblx0XHRzaW5ndWxhclJlbGF0aW9uTmFtZSxcblx0XHRlbnRpdHlJZHNcblx0KTtcblxuXHRpZiAoICEgaXNFbXB0eSggZXhpc3RpbmdFbnRpdGllcyApICkge1xuXHRcdGZ1bGxFbnRpdGllcyA9IGtlZXBFeGlzdGluZ0VudGl0aWVzSW5PYmplY3QoXG5cdFx0XHRleGlzdGluZ0VudGl0aWVzLm1hcChcblx0XHRcdFx0KCBlbnRpdGllc09iamVjdCwgZW50aXR5T2JqICkgPT5cblx0XHRcdFx0XHRlbnRpdGllc09iamVjdFsgZW50aXR5T2JqLmlkIF0gPSBlbnRpdHksXG5cdFx0XHRcdHt9XG5cdFx0XHQpLFxuXHRcdFx0ZnVsbEVudGl0aWVzLFxuXHRcdCk7XG5cdH1cblxuXHQvLyBpZiBmdWxsRW50aXRpZXMgaXMgbm90IGEgbWFwLCB0aGVuIHdlIG5lZWQgdG8gbWFrZSBpdCBhIG1hcFxuXHRjb25zdCBlbnRpdHlBcnJheSA9IGZ1bGxFbnRpdGllcyBpbnN0YW5jZW9mIE1hcCA/XG5cdFx0QXJyYXkuZnJvbSggZnVsbEVudGl0aWVzLnZhbHVlcygpICkgOlxuXHRcdGZ1bGxFbnRpdGllcztcblxuXHR5aWVsZCByZWNlaXZlRW50aXR5UmVjb3Jkcyhcblx0XHRzaW5ndWxhclJlbGF0aW9uTmFtZSxcblx0XHRlbnRpdHlBcnJheVxuXHQpO1xuXHR5aWVsZCByZWNlaXZlUmVsYXRlZEVudGl0aWVzKFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHkuaWQsXG5cdFx0cGx1cmFsUmVsYXRpb25OYW1lLFxuXHRcdGVudGl0eUlkcyxcblx0KTtcblx0eWllbGQgcmVzb2x2ZUdldFJlbGF0ZWRFbnRpdGllcyhcblx0XHRlbnRpdHksXG5cdFx0ZnVsbEVudGl0aWVzLFxuXHRcdGVudGl0eUlkcyxcblx0KTtcblx0eWllbGQgcmVzb2x2ZUdldEVudGl0eUJ5SWRGb3JJZHMoXG5cdFx0c2luZ3VsYXJSZWxhdGlvbk5hbWUsXG5cdFx0ZW50aXR5SWRzXG5cdCk7XG5cdHJldHVybiBlbnRpdHlBcnJheTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlciBmb3IgdGhlIGdldFJlbGF0ZWRFbnRpdGllc0ZvcklkcyBzZWxlY3RvclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gZW50aXR5SWRzXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25OYW1lXG4gKlxuICogQHJldHVybiB7dW5kZWZpbmVkfEFycmF5fSBJZiB0aGVyZSBpcyBubyBzY2hlbWEgZm9yIHRoZSByZWxhdGlvbiwgYW5cbiAqIGVtcHR5IGFycmF5IGlzIHJldHVybmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24qIGdldFJlbGF0ZWRFbnRpdGllc0Zvcklkcyhcblx0bW9kZWxOYW1lLFxuXHRlbnRpdHlJZHMsXG5cdHJlbGF0aW9uTmFtZVxuKSB7XG5cdGxldCBwYXRoLCByZXNwb25zZSwgcmVjb3Jkcztcblx0Y29uc3QgaGFzSm9pblRhYmxlID0geWllbGQgcmVzb2x2ZVNlbGVjdChcblx0XHRTQ0hFTUFfUkVEVUNFUl9LRVksXG5cdFx0J2hhc0pvaW5UYWJsZVJlbGF0aW9uJyxcblx0XHRtb2RlbE5hbWUsXG5cdFx0cmVsYXRpb25OYW1lLFxuXHQpO1xuXHRjb25zdCByZWxhdGlvblNjaGVtYSA9IHlpZWxkIHJlc29sdmVTZWxlY3QoXG5cdFx0U0NIRU1BX1JFRFVDRVJfS0VZLFxuXHRcdCdnZXRSZWxhdGlvblNjaGVtYScsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdHJlbGF0aW9uTmFtZSxcblx0KTtcblx0Y29uc3QgcmVsYXRpb25QcmltYXJ5S2V5ID0gZ2V0UHJpbWFyeUtleShcblx0XHRzaW5ndWxhck1vZGVsTmFtZSggcmVsYXRpb25OYW1lIClcblx0KTtcblx0Y29uc3QgbW9kZWxQcmltYXJ5S2V5ID0gZ2V0UHJpbWFyeUtleSggc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApICk7XG5cdGNvbnN0IHNpbmd1bGFyUmVsYXRpb25OYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIHJlbGF0aW9uTmFtZSApO1xuXHRjb25zdCBwbHVyYWxSZWxhdGlvbk5hbWUgPSBwbHVyYWxNb2RlbE5hbWUoIHJlbGF0aW9uTmFtZSApO1xuXHRpZiAoIHJlbGF0aW9uU2NoZW1hID09PSBudWxsICkge1xuXHRcdHJldHVybiBERUZBVUxUX0VNUFRZX0FSUkFZO1xuXHR9XG5cdGNvbnN0IGZhY3RvcnkgPSB5aWVsZCByZXNvbHZlU2VsZWN0KFxuXHRcdFNDSEVNQV9SRURVQ0VSX0tFWSxcblx0XHQnZ2V0RmFjdG9yeUZvck1vZGVsJyxcblx0XHRzaW5ndWxhclJlbGF0aW9uTmFtZVxuXHQpO1xuXHRsZXQgaGFzU2V0TWFwID0gSW1tdXRhYmxlTWFwKCk7XG5cdGlmICggaGFzSm9pblRhYmxlICkge1xuXHRcdC8vIHByZXBhcmUgYSBmZXRjaCB1c2luZyB0aGUgam9pbiB0YWJsZSB3aXRoIHJlbGF0aW9ucyBpbiB0aGUgcmVzcG9uc2UuXG5cdFx0cGF0aCA9IGdldEVuZHBvaW50KFxuXHRcdFx0c2luZ3VsYXJNb2RlbE5hbWUoIHJlbGF0aW9uU2NoZW1hLmpvaW5pbmdfbW9kZWxfbmFtZSApLnRvTG93ZXJDYXNlKClcblx0XHQpO1xuXHRcdHBhdGggKz0gJy8/d2hlcmUnICsgZ2V0UHJpbWFyeUtleVF1ZXJ5U3RyaW5nKFxuXHRcdFx0c2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApLFxuXHRcdFx0ZW50aXR5SWRzXG5cdFx0KTtcblx0XHRwYXRoICs9ICcmaW5jbHVkZT0nICsgZ2V0TW9kZWxOYW1lRm9yUmVxdWVzdCggcmVsYXRpb25OYW1lICkgKyAnLionO1xuXHRcdHJlc3BvbnNlID0geWllbGQgZmV0Y2goIHsgcGF0aCB9ICk7XG5cdFx0aWYgKCAhIHJlc3BvbnNlLmxlbmd0aCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0cmVjb3JkcyA9IFsgLi4ucmVzcG9uc2UgXTtcblx0XHR3aGlsZSAoIHJlY29yZHMubGVuZ3RoID4gMCApIHtcblx0XHRcdGNvbnN0IHJlY29yZCA9IHJlY29yZHMucG9wKCk7XG5cdFx0XHRsZXQgcmVsYXRpb25SZWNvcmRzID0gcmVjb3JkWyBwbHVyYWxSZWxhdGlvbk5hbWUgXSB8fCBudWxsO1xuXHRcdFx0cmVsYXRpb25SZWNvcmRzID0gcmVsYXRpb25SZWNvcmRzID09PSBudWxsICYmXG5cdFx0XHQhIGlzVW5kZWZpbmVkKCByZWNvcmRbIHNpbmd1bGFyUmVsYXRpb25OYW1lIF0gKSA/XG5cdFx0XHRcdHJlY29yZFsgc2luZ3VsYXJSZWxhdGlvbk5hbWUgXSA6XG5cdFx0XHRcdHJlbGF0aW9uUmVjb3Jkcztcblx0XHRcdHJlbGF0aW9uUmVjb3JkcyA9IHJlbGF0aW9uUmVjb3JkcyAhPT0gbnVsbCAmJlxuXHRcdFx0XHQhIGlzQXJyYXkoIHJlbGF0aW9uUmVjb3JkcyApID9cblx0XHRcdFx0WyByZWxhdGlvblJlY29yZHMgXSA6XG5cdFx0XHRcdHJlbGF0aW9uUmVjb3Jkcztcblx0XHRcdGlmICggcmVsYXRpb25SZWNvcmRzICE9PSBudWxsICkge1xuXHRcdFx0XHR3aGlsZSAoIHJlbGF0aW9uUmVjb3Jkcy5sZW5ndGggPiAwICkge1xuXHRcdFx0XHRcdGNvbnN0IG1vZGVsSWQgPSByZWNvcmRbIG1vZGVsUHJpbWFyeUtleSBdO1xuXHRcdFx0XHRcdGNvbnN0IHJlbGF0aW9uSWQgPSByZWNvcmRbIHJlbGF0aW9uUHJpbWFyeUtleSBdO1xuXHRcdFx0XHRcdGNvbnN0IHJlbGF0aW9uUmVjb3JkID0gcmVsYXRpb25SZWNvcmRzLnBvcCgpO1xuXHRcdFx0XHRcdGlmICggcmVsYXRpb25SZWNvcmQgIT09IG51bGwgJiZcblx0XHRcdFx0XHRcdCEgaGFzU2V0TWFwLmhhc0luKCBbIG1vZGVsSWQsIHJlbGF0aW9uSWQgXSApXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRjb25zdCByZWxhdGlvbkVudGl0eSA9IGZhY3RvcnkuZnJvbUV4aXN0aW5nKFxuXHRcdFx0XHRcdFx0XHRyZWxhdGlvblJlY29yZCApO1xuXHRcdFx0XHRcdFx0eWllbGQgZGlzcGF0Y2goXG5cdFx0XHRcdFx0XHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0XHRcdFx0XHRcdCdyZXNvbHZlUmVsYXRpb25SZWNvcmRGb3JSZWxhdGlvbicsXG5cdFx0XHRcdFx0XHRcdHJlbGF0aW9uRW50aXR5LFxuXHRcdFx0XHRcdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRcdFx0XHRcdG1vZGVsSWQsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0aGFzU2V0TWFwID0gaGFzU2V0TWFwLnNldEluKFxuXHRcdFx0XHRcdFx0XHRbIG1vZGVsSWQsIHJlbGF0aW9uSWQgXSxcblx0XHRcdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cGF0aCA9IGdldEVuZHBvaW50KCBzaW5ndWxhclJlbGF0aW9uTmFtZSApICtcblx0XHRcdCcvP3doZXJlJyArIGdldFByaW1hcnlLZXlRdWVyeVN0cmluZyggbW9kZWxOYW1lLCBlbnRpdHlJZHMgKTtcblx0XHRyZXNwb25zZSA9IHlpZWxkIGZldGNoKCB7IHBhdGggfSApO1xuXHRcdGlmICggISByZXNwb25zZS5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHJlY29yZHMgPSBbIC4uLnJlc3BvbnNlIF07XG5cdFx0d2hpbGUgKCByZWNvcmRzLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRjb25zdCByZWNvcmQgPSByZWNvcmRzLnBvcCgpO1xuXHRcdFx0Y29uc3QgbW9kZWxJZCA9IHJlY29yZFsgbW9kZWxQcmltYXJ5S2V5IF07XG5cdFx0XHRjb25zdCByZWxhdGlvbklkID0gcmVjb3JkWyByZWxhdGlvblByaW1hcnlLZXkgXTtcblx0XHRcdGlmICggISBoYXNTZXRNYXAuaGFzSW4oIFsgbW9kZWxJZCwgcmVsYXRpb25JZCBdICkgKSB7XG5cdFx0XHRcdGNvbnN0IHJlbGF0aW9uRW50aXR5ID0gZmFjdG9yeS5mcm9tRXhpc3RpbmcoIHJlY29yZCApO1xuXHRcdFx0XHR5aWVsZCBkaXNwYXRjaChcblx0XHRcdFx0XHRDT1JFX1JFRFVDRVJfS0VZLFxuXHRcdFx0XHRcdCdyZXNvbHZlUmVsYXRpb25SZWNvcmRGb3JSZWxhdGlvbicsXG5cdFx0XHRcdFx0cmVsYXRpb25FbnRpdHksXG5cdFx0XHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0XHRcdG1vZGVsSWQsXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGhhc1NldE1hcCA9IGhhc1NldE1hcC5zZXRJbihcblx0XHRcdFx0XHRbIG1vZGVsSWQsIHJlbGF0aW9uSWQgXSxcblx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbmNvbnN0IGdldE1vZGVsTmFtZUZvclJlcXVlc3QgPSAoIG1vZGVsTmFtZSApID0+IHtcblx0bW9kZWxOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRtb2RlbE5hbWUgPSBtb2RlbE5hbWUucmVwbGFjZSggJ18nLCAnICcgKTtcblx0bW9kZWxOYW1lID0gc3RhcnRDYXNlKCBtb2RlbE5hbWUgKTtcblx0cmV0dXJuIG1vZGVsTmFtZS5yZXBsYWNlKCAnICcsICdfJyApO1xufTtcbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgY3JlYXRlU2VsZWN0b3IgZnJvbSAncmVtZW1vJztcbmltcG9ydCB7IG5vcm1hbGl6ZUVudGl0eUlkIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vaGVscGVycyc7XG5pbXBvcnQgeyBzaW5ndWxhck1vZGVsTmFtZSB9IGZyb20gJ0BldmVudGVzcHJlc3NvL21vZGVsJztcblxuLyoqXG4gKiBSZXR1cm5zIGFsbCBlbnRpdHkgcmVjb3JkcyBmb3IgdGhlIGdpdmVuIG1vZGVsTmFtZSBpbiB0aGUgY3VycmVudCBzdGF0ZS5cbiAqIEFuIGVudGl0eSByZWNvcmQgaXMgdGhlIE1hcCBvZiBlbnRpdGllcyAoZW50aXR5SWQgPT4gZW50aXR5KS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHJldHVybiB7T2JqZWN0PG51bWJlcnxzdHJpbmcsIEJhc2VFbnRpdHk+fXxudWxsfSBBIGNvbGxlY3Rpb24gb2YgZW50aXR5XG4gKiByZWNvcmRzIGZvciB0aGUgZ2l2ZW4gbW9kZWwgaW5kZXhlZCBieSBwcmltYXJ5IGtleSB2YWx1ZSBvciBudWxsIGlmIG5vbmVcbiAqIGhhdmUgYmVlbiBzZXQgaW4gdGhlIHN0YXRlLlxuICovXG5jb25zdCBnZXRFbnRpdHlSZWNvcmRzRm9yTW9kZWwgPSBjcmVhdGVTZWxlY3Rvcihcblx0KCBzdGF0ZSwgbW9kZWxOYW1lICkgPT4ge1xuXHRcdG1vZGVsTmFtZSA9IHNpbmd1bGFyTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0XHRyZXR1cm4gc3RhdGUuZW50aXRpZXMuaGFzKCBtb2RlbE5hbWUgKSA/XG5cdFx0XHRzdGF0ZS5lbnRpdGllcy5nZXQoIG1vZGVsTmFtZSApLnRvSlMoKSA6XG5cdFx0XHRudWxsO1xuXHR9LFxuXHQoIHN0YXRlLCBtb2RlbE5hbWUgKSA9PiBbIHN0YXRlLmVudGl0aWVzLmdldCggbW9kZWxOYW1lICkgXVxuKTtcblxuLyoqXG4gKiBSZXR1cm5zIGFsbCBlbnRpdGllcyBmb3IgdGhlIGdpdmVuIG1vZGVsLlxuICogVGhpcyBkaWZmZXJzIGZyb20gZW50aXR5UmVjb3JkcywgaW4gdGhhdCB0aGUgZW50aXRpZXMgYXJlIE5PVCBpbmRleGVkIGJ5XG4gKiBwcmltYXJ5IGtleSB2YWx1ZSBhbmQgYW4gQXJyYXkgb2YgZW50aXRpZXMgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcmV0dXJuIHtBcnJheTxCYXNlRW50aXR5PnxudWxsfSBBbiBhcnJheSBvZiBlbnRpdGllcyBmb3IgdGhlIGdpdmVuIG1vZGVsIG9yXG4gKiBudWxsIGlmIG5vbmUgaGF2ZSBiZWVuIHNldCBpbiB0aGUgc3RhdGUuXG4gKi9cbmNvbnN0IGdldEVudGl0aWVzRm9yTW9kZWwgPSBjcmVhdGVTZWxlY3Rvcihcblx0KCBzdGF0ZSwgbW9kZWxOYW1lICkgPT4ge1xuXHRcdG1vZGVsTmFtZSA9IHNpbmd1bGFyTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0XHRyZXR1cm4gc3RhdGUuZW50aXRpZXMuaGFzKCBtb2RlbE5hbWUgKSA/XG5cdFx0XHRzdGF0ZS5lbnRpdGllcy5nZXQoIG1vZGVsTmFtZSApLnZhbHVlU2VxKCkudG9BcnJheSgpIDpcblx0XHRcdFtdO1xuXHR9LFxuXHQoIHN0YXRlLCBtb2RlbE5hbWUgKSA9PiBbIHN0YXRlLmVudGl0aWVzLmdldCggbW9kZWxOYW1lICkgXSxcbik7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbW9kZWwgZW50aXR5IGZvciB0aGUgZ2l2ZW4gbW9kZWwgYW5kIGlkLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBlbnRpdHlJZFxuICogQHJldHVybiB7QmFzZUVudGl0eXxudWxsfSBSZXR1cm5zIHRoZSBtb2RlbCBlbnRpdHkgb3IgbnVsbC5cbiAqL1xuZnVuY3Rpb24gZ2V0RW50aXR5QnlJZCggc3RhdGUsIG1vZGVsTmFtZSwgZW50aXR5SWQgKSB7XG5cdG1vZGVsTmFtZSA9IHNpbmd1bGFyTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0cmV0dXJuIHN0YXRlLmVudGl0aWVzLmdldEluKCBbXG5cdFx0bW9kZWxOYW1lLFxuXHRcdG5vcm1hbGl6ZUVudGl0eUlkKCBlbnRpdHlJZCApLFxuXHRdICkgfHwgbnVsbDtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW4gYXJyYXkgb2YgbW9kZWwgZW50aXRpZXMgZm9yIHRoZSBwcm92aWRlZCBhcnJheSBvZiBpZHMgYW5kIG1vZGVsLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtBcnJheTxzdHJpbmd8bnVtYmVyPn0gZW50aXR5SWRzXG4gKiBAcmV0dXJuIHtBcnJheTxCYXNlRW50aXR5PnxudWxsfSBSZXR1cm5zIGFuIGFycmF5IG9mIG1vZGVsIGVudGl0aWVzIGZvciB0aGVcbiAqIHByb3ZpZGVkIGlkcyBvciBudWxsIGlmIG5ldmVyIGJlZW4gc2V0LlxuICovXG5jb25zdCBnZXRFbnRpdGllc0J5SWRzID0gKCBzdGF0ZSwgbW9kZWxOYW1lLCBlbnRpdHlJZHMgKSA9PiB7XG5cdHJldHVybiByZXRyaWV2ZUVudGl0aWVzQnlJZHMoIHN0YXRlLCBtb2RlbE5hbWUsIGVudGl0eUlkcy5qb2luKCkgKTtcbn07XG5cbmdldEVudGl0aWVzQnlJZHMuY2xlYXIgPSAoKSA9PiByZXRyaWV2ZUVudGl0aWVzQnlJZHMuY2xlYXIoKTtcbmdldEVudGl0aWVzQnlJZHMuZ2V0RGVwZW5kYW50cyA9ICggc3RhdGUsIG1vZGVsTmFtZSApID0+IHJldHJpZXZlRW50aXRpZXNCeUlkc1xuXHQuZ2V0RGVwZW5kYW50cyggc3RhdGUsIG1vZGVsTmFtZSApO1xuXG4vKipcbiAqIFJldHJpZXZlcyBhbiBhcnJheSBvZiBtb2RlbCBlbnRpdGllcyBmb3IgdGhlIHByb3ZpZGVkIGFycmF5IG9mIGlkcyBhbmQgbW9kZWwuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gZW50aXR5SWRzICBBIGNvbW1hIGRlbGltaXRlZCBzdHJpbmcgb2YgaWRzLiAgVGhpcyBpcyBzb1xuICogd2UgYXJlIHBhc3NpbmcgYSBwcmltaXRpdmUgYXJnIHRvIHJlbWVtbyBmb3IgYmV0dGVyIGNhY2hlIHZhbGlkYXRpb24uXG4gKiBAcmV0dXJuIHtBcnJheTxCYXNlRW50aXR5PnxudWxsfSBSZXR1cm5zIGFuIGFycmF5IG9mIG1vZGVsIGVudGl0aWVzIGZvciB0aGVcbiAqIHByb3ZpZGVkIGlkcyBvciBudWxsIGlmIG5ldmVyIGJlZW4gc2V0LlxuICovXG5jb25zdCByZXRyaWV2ZUVudGl0aWVzQnlJZHMgPSBjcmVhdGVTZWxlY3Rvcihcblx0KCBzdGF0ZSwgbW9kZWxOYW1lLCBlbnRpdHlJZHMgKSA9PiB7XG5cdFx0bW9kZWxOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRcdGVudGl0eUlkcyA9IGVudGl0eUlkcy5zcGxpdCggJywnICk7XG5cdFx0Y29uc3QgZW50aXRpZXMgPSBbXTtcblx0XHRpZiAoIHN0YXRlLmVudGl0aWVzLmhhcyggbW9kZWxOYW1lICkgKSB7XG5cdFx0XHRlbnRpdHlJZHMuZm9yRWFjaCggKCBlbnRpdHlJZCApID0+IHtcblx0XHRcdFx0Y29uc3QgZW50aXR5ID0gZ2V0RW50aXR5QnlJZCggc3RhdGUsIG1vZGVsTmFtZSwgZW50aXR5SWQgKTtcblx0XHRcdFx0aWYgKCBlbnRpdHkgIT09IG51bGwgKSB7XG5cdFx0XHRcdFx0ZW50aXRpZXMucHVzaCggZW50aXR5ICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cdFx0cmV0dXJuIGVudGl0aWVzO1xuXHR9LFxuXHQoIHN0YXRlLCBtb2RlbE5hbWUgKSA9PiBbIHN0YXRlLmVudGl0aWVzLmdldCggbW9kZWxOYW1lICkgXVxuKTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW4gYXJyYXkgb2YgZW50aXR5IGlkcyBxdWV1ZWQgZm9yIHRyYXNoIGZvciB0aGUgZ2l2ZW4gbW9kZWwuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcmV0dXJuIHtBcnJheTxudW1iZXI+fSBBbiBhcnJheSBvZiBlbnRpdHkgaWRzLlxuICovXG5jb25zdCBnZXRFbnRpdHlJZHNRdWV1ZWRGb3JUcmFzaCA9IGNyZWF0ZVNlbGVjdG9yKFxuXHQoIHN0YXRlLCBtb2RlbE5hbWUgKSA9PiB7XG5cdFx0bW9kZWxOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRcdHJldHVybiBzdGF0ZS5kaXJ0eS50cmFzaC5oYXMoIG1vZGVsTmFtZSApID9cblx0XHRcdHN0YXRlLmRpcnR5LnRyYXNoLmdldCggbW9kZWxOYW1lICkudG9BcnJheSgpIDpcblx0XHRcdFtdO1xuXHR9LFxuXHQoIHN0YXRlLCBtb2RlbE5hbWUgKSA9PiBbIHN0YXRlLmRpcnR5LnRyYXNoLmdldCggbW9kZWxOYW1lICkgXVxuKTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW4gYXJyYXkgb2YgZW50aXR5IGlkcyBxdWV1ZWQgZm9yIGRlbGV0ZSBmb3IgdGhlIGdpdmVuIG1vZGVsLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHJldHVybiB7QXJyYXk8bnVtYmVyfHN0cmluZz59IEFuIGFycmF5IG9mIGVudGl0eSBpZHMuXG4gKi9cbmNvbnN0IGdldEVudGl0eUlkc1F1ZXVlZEZvckRlbGV0ZSA9IGNyZWF0ZVNlbGVjdG9yKFxuXHQoIHN0YXRlLCBtb2RlbE5hbWUgKSA9PiB7XG5cdFx0bW9kZWxOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRcdHJldHVybiBzdGF0ZS5kaXJ0eS5kZWxldGUuaGFzKCBtb2RlbE5hbWUgKSA/XG5cdFx0XHRzdGF0ZS5kaXJ0eS5kZWxldGUuZ2V0KCBtb2RlbE5hbWUgKS50b0FycmF5KCkgOlxuXHRcdFx0W107XG5cdH0sXG5cdCggc3RhdGUsIG1vZGVsTmFtZSApID0+IFsgc3RhdGUuZGlydHkuZGVsZXRlLmdldCggbW9kZWxOYW1lICkgXVxuKTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgYWxsIHRoZSBtb2RlbHMgY3VycmVudGx5IGhhdmluZyBpZHMgcXVldWVkIGZvciB0cmFzaFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICogQHJldHVybiB7QXJyYXk8c3RyaW5nPn0gQW4gYXJyYXkgb2YgbW9kZWwgbmFtZXMuXG4gKi9cbmNvbnN0IGdldE1vZGVsc1F1ZXVlZEZvclRyYXNoID0gY3JlYXRlU2VsZWN0b3IoXG5cdCggc3RhdGUgKSA9PiB7XG5cdFx0cmV0dXJuIHN0YXRlLmRpcnR5LnRyYXNoLmtleVNlcSgpLnRvQXJyYXkoKTtcblx0fSxcblx0KCBzdGF0ZSApID0+IFsgc3RhdGUuZGlydHkudHJhc2ggXVxuKTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgYWxsIHRoZSBtb2RlbHMgY3VycmVudGx5IGhhdmluZyBpZHMgcXVldWVkIGZvciBkZWxldGUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcmV0dXJuIHtBcnJheTxzdHJpbmc+fSBBbiBhcnJheSBvZiBtb2RlbCBuYW1lcy5cbiAqL1xuY29uc3QgZ2V0TW9kZWxzUXVldWVkRm9yRGVsZXRlID0gY3JlYXRlU2VsZWN0b3IoXG5cdCggc3RhdGUgKSA9PiB7XG5cdFx0cmV0dXJuIHN0YXRlLmRpcnR5LmRlbGV0ZS5rZXlTZXEoKS50b0FycmF5KCk7XG5cdH0sXG5cdCggc3RhdGUgKSA9PiBbIHN0YXRlLmRpcnR5LmRlbGV0ZSBdXG4pO1xuXG5leHBvcnQge1xuXHRnZXRFbnRpdHlSZWNvcmRzRm9yTW9kZWwsXG5cdGdldEVudGl0aWVzRm9yTW9kZWwsXG5cdGdldEVudGl0eUJ5SWQsXG5cdGdldEVudGl0aWVzQnlJZHMsXG5cdGdldEVudGl0eUlkc1F1ZXVlZEZvclRyYXNoLFxuXHRnZXRFbnRpdHlJZHNRdWV1ZWRGb3JEZWxldGUsXG5cdGdldE1vZGVsc1F1ZXVlZEZvckRlbGV0ZSxcblx0Z2V0TW9kZWxzUXVldWVkRm9yVHJhc2gsXG59O1xuIiwiZXhwb3J0ICogZnJvbSAnLi9lbnRpdGllcyc7XG5leHBvcnQgKiBmcm9tICcuL3JlbGF0aW9ucyc7XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgaXNNb2RlbEVudGl0eSB9IGZyb20gJ0BldmVudGVzcHJlc3NvL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHsgSW52YWxpZE1vZGVsRW50aXR5IH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vZWVqcyc7XG5pbXBvcnQge1xuXHRwbHVyYWxNb2RlbE5hbWUsXG5cdHNpbmd1bGFyTW9kZWxOYW1lLFxufSBmcm9tICdAZXZlbnRlc3ByZXNzby9tb2RlbCc7XG5pbXBvcnQgY3JlYXRlU2VsZWN0b3IgZnJvbSAncmVtZW1vJztcbmltcG9ydCB7IG5vcm1hbGl6ZUVudGl0eUlkIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vaGVscGVycyc7XG5pbXBvcnQgeyBNYXAsIFNldCB9IGZyb20gJ2ltbXV0YWJsZSc7XG5cbi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQge1xuXHRnZXRFbnRpdGllc0J5SWRzLFxuXHRnZXRFbnRpdHlCeUlkLFxufSBmcm9tICcuL2VudGl0aWVzJztcblxuY29uc3QgREVGQVVMVF9FTVBUWV9TRVQgPSBTZXQoKTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHJlbGF0aW9uIGlkcyBmb3IgdGhlIGdpdmVuIGVudGl0eSBhbmQgcmVsYXRpb24gbmFtZSBmcm9tIHRoZVxuICogc3RhdGUgYW5kIGNvbnNpZGVycyBob3cgdGhlIHJlbGF0aW9uIG1pZ2h0IGJlIHNhdmVkIGluIHRoZSBzdGF0ZSAoZWl0aGVyIGFzXG4gKiByZWxhdGlvbiBtYXBwZWQgdG8gbW9kZWwgKGluZGV4KSBvciBtb2RlbCBtYXBwZWQgdG8gcmVsYXRpb24gKGVudGl0eU1hcClcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7QmFzZUVudGl0eX0gZW50aXR5XG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25OYW1lXG4gKiBAcmV0dXJuIHtBcnJheX0gQW4gZW1wdHkgYXJyYXkgaWYgdGhlcmUgYXJlIG5vIGlkcyBmb3IgdGhlIGdpdmVuIHJlbGF0aW9uLlxuICovXG5jb25zdCBnZXRSZWxhdGlvbklkc0ZvckVudGl0eVJlbGF0aW9uID0gY3JlYXRlU2VsZWN0b3IoXG5cdCggc3RhdGUsIGVudGl0eSwgcmVsYXRpb25OYW1lICkgPT4ge1xuXHRcdGlmICggISBpc01vZGVsRW50aXR5KCBlbnRpdHkgKSApIHtcblx0XHRcdHRocm93IG5ldyBJbnZhbGlkTW9kZWxFbnRpdHkoICcnLCBlbnRpdHkgKTtcblx0XHR9XG5cdFx0bGV0IG1vZGVsTmFtZSA9IHNpbmd1bGFyTW9kZWxOYW1lKCBlbnRpdHkubW9kZWxOYW1lICk7XG5cdFx0cmVsYXRpb25OYW1lID0gcGx1cmFsTW9kZWxOYW1lKCByZWxhdGlvbk5hbWUgKTtcblx0XHRpZiAoIHN0YXRlLnJlbGF0aW9ucy5oYXNJbiggWyAnZW50aXR5TWFwJywgbW9kZWxOYW1lIF0gKSApIHtcblx0XHRcdHJldHVybiAoIHN0YXRlLnJlbGF0aW9ucy5nZXRJbihcblx0XHRcdFx0W1xuXHRcdFx0XHRcdCdlbnRpdHlNYXAnLFxuXHRcdFx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdFx0XHRlbnRpdHkuaWQsXG5cdFx0XHRcdFx0cmVsYXRpb25OYW1lLFxuXHRcdFx0XHRdLFxuXHRcdFx0KSB8fCBTZXQoKSApLnRvQXJyYXkoKTtcblx0XHR9XG5cdFx0bW9kZWxOYW1lID0gcGx1cmFsTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0XHRyZWxhdGlvbk5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggcmVsYXRpb25OYW1lICk7XG5cdFx0aWYgKCBzdGF0ZS5yZWxhdGlvbnMuaGFzSW4oIFsgJ2luZGV4JywgbW9kZWxOYW1lIF0gKSApIHtcblx0XHRcdHJldHVybiAoIHN0YXRlLnJlbGF0aW9ucy5nZXRJbihcblx0XHRcdFx0W1xuXHRcdFx0XHRcdCdpbmRleCcsXG5cdFx0XHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0XHRcdGVudGl0eS5pZCxcblx0XHRcdFx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0XHRcdF1cblx0XHRcdCkgfHwgU2V0KCkgKS50b0FycmF5KCk7XG5cdFx0fVxuXHRcdHJldHVybiBbXTtcblx0fSxcblx0KCBzdGF0ZSwgZW50aXR5LCByZWxhdGlvbk5hbWUgKSA9PiB7XG5cdFx0aWYgKCAhIGlzTW9kZWxFbnRpdHkoIGVudGl0eSApICkge1xuXHRcdFx0cmV0dXJuIFsgREVGQVVMVF9FTVBUWV9TRVQgXTtcblx0XHR9XG5cdFx0Y29uc3Qgc2luZ3VsYXJNb2RlbCA9IHNpbmd1bGFyTW9kZWxOYW1lKCBlbnRpdHkubW9kZWxOYW1lICksXG5cdFx0XHRwbHVyYWxNb2RlbCA9IHBsdXJhbE1vZGVsTmFtZSggc2luZ3VsYXJNb2RlbCApLFxuXHRcdFx0aWQgPSBlbnRpdHkuaWQsXG5cdFx0XHRzaW5ndWxhclJlbGF0aW9uTmFtZSA9IHNpbmd1bGFyTW9kZWxOYW1lKCByZWxhdGlvbk5hbWUgKSxcblx0XHRcdHBsdXJhbFJlbGF0aW9uTmFtZSA9IHBsdXJhbE1vZGVsTmFtZSggc2luZ3VsYXJSZWxhdGlvbk5hbWUgKTtcblx0XHRyZXR1cm4gW1xuXHRcdFx0c3RhdGUucmVsYXRpb25zLmdldEluKCBbXG5cdFx0XHRcdCdlbnRpdHlNYXAnLFxuXHRcdFx0XHRzaW5ndWxhck1vZGVsLFxuXHRcdFx0XHRpZCxcblx0XHRcdFx0cGx1cmFsUmVsYXRpb25OYW1lLFxuXHRcdFx0XSApLFxuXHRcdFx0c3RhdGUucmVsYXRpb25zLmdldEluKCBbXG5cdFx0XHRcdCdpbmRleCcsXG5cdFx0XHRcdHBsdXJhbE1vZGVsLFxuXHRcdFx0XHRpZCxcblx0XHRcdFx0c2luZ3VsYXJSZWxhdGlvbk5hbWUsXG5cdFx0XHRdICksXG5cdFx0XTtcblx0fVxuKTtcblxuLyoqXG4gKiBSZXR1cm5zIGFsbCB0aGUgcmVsYXRpb24gZW50aXRpZXMgZm9yIHRoZSByZWxhdGlvbiBvbiBtb2RlbCBlbnRpdHkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge0Jhc2VFbnRpdHl9IGVudGl0eVxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uTW9kZWxOYW1lXG4gKiBAcmV0dXJuIHtBcnJheTxCYXNlRW50aXR5Pn0gQW4gYXJyYXkgb2YgZW50aXRpZXMgZm9yIHRoZSByZWxhdGlvbi5cbiAqL1xuY29uc3QgZ2V0UmVsYXRlZEVudGl0aWVzID0gY3JlYXRlU2VsZWN0b3IoXG5cdCggc3RhdGUsIGVudGl0eSwgcmVsYXRpb25Nb2RlbE5hbWUgKSA9PiB7XG5cdFx0aWYgKCAhIGlzTW9kZWxFbnRpdHkoIGVudGl0eSApICkge1xuXHRcdFx0dGhyb3cgbmV3IEludmFsaWRNb2RlbEVudGl0eSggJycsIGVudGl0eSApO1xuXHRcdH1cblx0XHRyZXR1cm4gZ2V0RW50aXRpZXNCeUlkcyhcblx0XHRcdHN0YXRlLFxuXHRcdFx0c2luZ3VsYXJNb2RlbE5hbWUoIHJlbGF0aW9uTW9kZWxOYW1lICksXG5cdFx0XHRnZXRSZWxhdGlvbklkc0ZvckVudGl0eVJlbGF0aW9uKFxuXHRcdFx0XHRzdGF0ZSxcblx0XHRcdFx0ZW50aXR5LFxuXHRcdFx0XHRyZWxhdGlvbk1vZGVsTmFtZVxuXHRcdFx0KVxuXHRcdCk7XG5cdH0sXG5cdCggc3RhdGUsIGVudGl0eSwgcmVsYXRpb25OYW1lICkgPT4gW1xuXHRcdC4uLmdldEVudGl0aWVzQnlJZHMuZ2V0RGVwZW5kYW50cyhcblx0XHRcdHN0YXRlLFxuXHRcdFx0c2luZ3VsYXJNb2RlbE5hbWUoIHJlbGF0aW9uTmFtZSApXG5cdFx0KSxcblx0XHQuLi5nZXRSZWxhdGlvbklkc0ZvckVudGl0eVJlbGF0aW9uLmdldERlcGVuZGFudHMoXG5cdFx0XHRzdGF0ZSxcblx0XHRcdGVudGl0eSxcblx0XHRcdHJlbGF0aW9uTmFtZVxuXHRcdCksXG5cdF1cbik7XG5cbi8qKlxuICogRWZmaWNpZW50IHNlbGVjdG9yIGZvciBnZXR0aW5nIGFsbCB0aGUgcmVsYXRlZCBlbnRpdGllcyBmb3IgdGhlIGdpdmVuIG1vZGVsLFxuICogaXQncyBlbnRpdHkgaWRzLCBhbmQgdGhlIHJlbGF0aW9uIG5hbWUuXG4gKlxuICogSW5zdGVhZCBvZiB1c2luZyB0aGUgYGdldFJlbGF0aW9uc2Agc2VsZWN0b3Igd2hpY2ggZ2V0cyB0aGUgcmVsYXRpb25zIGZvciBhXG4gKiBzaW5nbGUgZW50aXR5LiAgVGhpcyBhbGxvd3MgeW91IHRvIGdldCBhbGwgdGhlIHJlbGF0aW9ucyBmb3IgYSBnaXZlbiBzZXQgb2ZcbiAqIGVudGl0eSBpZHMgKGkuZS4gR2V0IGFsbCBkYXRldGltZXMgcmVsYXRlZCB0byB0aGUgZXZlbnQgaWRzOiAxMCwgMjAsIGFuZCAzMCkuXG4gKlxuICogVGhpcyBzZWxlY3RvciBpcyB3aXJlZCB1cCB0byBhIHJlc29sdmVyIHRoYXQgZG9lcyBhbiBlZmZpY2llbnQgcmVxdWVzdCB0b1xuICogcmV0cmlldmUgYWxsIHRob3NlIGVudGl0aWVzIGFuZCB0aGVuIGRpc3BhdGNoIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb25zIHNvXG4gKiB0aGUgcmVsYXRpb24gc3RhdGUgaXMgY29ycmVjdGx5IHJlY29yZGVkIGZvciBlYWNoIHJlbGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBlbnRpdHlJZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbk5hbWVcbiAqIEByZXR1cm4ge0FycmF5PEJhc2VFbnRpdHk+fSBBbiBhcnJheSBvZiBCYXNlRW50aXR5IGluc3RhbmNlcyBmb3IgdGhlXG4gKiByZWxhdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRSZWxhdGVkRW50aXRpZXNGb3JJZHMgPSBjcmVhdGVTZWxlY3Rvcihcblx0KCBzdGF0ZSwgbW9kZWxOYW1lLCBlbnRpdHlJZHMsIHJlbGF0aW9uTmFtZSApID0+IHtcblx0XHRsZXQgcmVsYXRpb25FbnRpdGllcyA9IFNldCgpO1xuXHRcdGVudGl0eUlkcy5mb3JFYWNoKCAoIGVudGl0eUlkICkgPT4ge1xuXHRcdFx0Y29uc3QgZW50aXR5ID0gZ2V0RW50aXR5QnlJZChcblx0XHRcdFx0c3RhdGUsXG5cdFx0XHRcdHNpbmd1bGFyTW9kZWxOYW1lKCBtb2RlbE5hbWUgKSxcblx0XHRcdFx0ZW50aXR5SWRcblx0XHRcdCk7XG5cdFx0XHRjb25zdCByZWxhdGVkRW50aXRpZXMgPSBnZXRSZWxhdGVkRW50aXRpZXMoXG5cdFx0XHRcdHN0YXRlLFxuXHRcdFx0XHRlbnRpdHksXG5cdFx0XHRcdHBsdXJhbE1vZGVsTmFtZSggcmVsYXRpb25OYW1lIClcblx0XHRcdCk7XG5cdFx0XHRyZWxhdGlvbkVudGl0aWVzID0gcmVsYXRpb25FbnRpdGllcy5tZXJnZSggcmVsYXRlZEVudGl0aWVzICk7XG5cdFx0fSApO1xuXHRcdHJldHVybiByZWxhdGlvbkVudGl0aWVzLnRvSlMoKTtcblx0fSxcblx0KCBzdGF0ZSwgbW9kZWxOYW1lLCBlbnRpdHlJZHMsIHJlbGF0aW9uTmFtZSApID0+IFtcblx0XHQuLi5nZXRFbnRpdGllc0J5SWRzLmdldERlcGVuZGFudHMoXG5cdFx0XHRzdGF0ZSxcblx0XHRcdHNpbmd1bGFyTW9kZWxOYW1lKCBtb2RlbE5hbWUgKSxcblx0XHQpLFxuXHRcdC4uLmdldEVudGl0aWVzQnlJZHMuZ2V0RGVwZW5kYW50cyhcblx0XHRcdHN0YXRlLFxuXHRcdFx0c2luZ3VsYXJNb2RlbE5hbWUoIHJlbGF0aW9uTmFtZSApXG5cdFx0KSxcblx0XVxuKTtcblxuLyoqXG4gKiBMb29rcyB1cCB0aGUgcmVsYXRpb25zIHF1ZXVlZCBmb3IgYSBnaXZlbiBtb2RlbCBmaXJzdCBmcm9tIHRoZSBhY3R1YWwgcmVsYXRpb25cbiAqIHR5cGUgaW4gdGhlIHN0YXRlLCBhbmQgdGhlbiBhIHJldmVyc2UgbG9va3VwIGluIHRoZSBpbmRleCBpZiBub3QgdGhlcmUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAnYWRkJyBvciAnZGVsZXRlJ1xuICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCBrZXllZCBieSBlbnRpdHkgaWRzIGZvciB0aGUgZ2l2ZW4gbW9kZWwuXG4gKiBUaGUgdmFsdWVzIG9uIGZvciBlYWNoIGVudGl0eSBpZCBpcyBhbiBvYmplY3Qga2V5ZWQgYnkgcmVsYXRpb24gbmFtZXMgYW5kXG4gKiB3aXRoIHZhbHVlcyBiZWluZyBhbiBhcnJheSBvZiBpZHMgZm9yIHJlbGF0aW9uLiBFeGFtcGxlOlxuICoge1xuICogICAxMDoge1xuICogICAgIGRhdGV0aW1lczogWyAyMiwgMjMgXSxcbiAqICAgICBtZXNzYWdlX3RlbXBsYXRlX2dyb3VwczogWyAyLCA0IF0sXG4gKiAgIH0sXG4gKiAgIDIwOiB7XG4gKiAgICAgZGF0ZXRpbWVzOiBbIDI0LCAyNSBdLFxuICogICB9LFxuICogfVxuICovXG5jb25zdCBsb29rdXBSZWxhdGlvbnNRdWV1ZWRGb3JNb2RlbCA9ICggc3RhdGUsIG1vZGVsTmFtZSwgdHlwZSA9ICdhZGQnICkgPT4ge1xuXHRjb25zdCBmb3JJbmRleExvb2t1cCA9IHBsdXJhbE1vZGVsTmFtZSggbW9kZWxOYW1lICk7XG5cdGNvbnN0IGZvckFkZExvb2t1cCA9IHNpbmd1bGFyTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0aWYgKCBzdGF0ZS5kaXJ0eS5yZWxhdGlvbnMuaGFzSW4oIFsgdHlwZSwgZm9yQWRkTG9va3VwIF0gKSApIHtcblx0XHRyZXR1cm4gc3RhdGUuZGlydHkucmVsYXRpb25zLmdldEluKCBbIHR5cGUsIGZvckFkZExvb2t1cCBdICkudG9KUygpO1xuXHR9XG5cdGlmICggc3RhdGUuZGlydHkucmVsYXRpb25zLmhhc0luKCBbICdpbmRleCcsIGZvckluZGV4TG9va3VwIF0gKSApIHtcblx0XHRsZXQgcmVsYXRpb25zID0gTWFwKCk7XG5cdFx0c3RhdGUuZGlydHkucmVsYXRpb25zLmdldEluKCBbICdpbmRleCcsIGZvckluZGV4TG9va3VwIF0gKS5mb3JFYWNoKFxuXHRcdFx0KCByZWxhdGlvbk1hcCwgZW50aXR5SWQgKSA9PiB7XG5cdFx0XHRcdHJlbGF0aW9uTWFwLmZvckVhY2goICggcmVsYXRpb25SZWNvcmQsIG1vZGVsICkgPT4ge1xuXHRcdFx0XHRcdGlmICggcmVsYXRpb25SZWNvcmQuaGFzKCB0eXBlICkgKSB7XG5cdFx0XHRcdFx0XHRyZWxhdGlvbnMgPSByZWxhdGlvbnMuc2V0SW4oXG5cdFx0XHRcdFx0XHRcdFsgZW50aXR5SWQsIHBsdXJhbE1vZGVsTmFtZSggbW9kZWwgKSBdLFxuXHRcdFx0XHRcdFx0XHRyZWxhdGlvblJlY29yZC5nZXQoIHR5cGUgKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblx0XHQpO1xuXHRcdHJldHVybiByZWxhdGlvbnMudG9KUygpO1xuXHR9XG5cdHJldHVybiB7fTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIGFsbCB0aGUgcXVldWVkIHJlbGF0aW9uIGFkZGl0aW9ucyBmb3IgdGhlIGdpdmVuIG1vZGVsXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IGtleWVkIGJ5IGVudGl0eSBpZHMgZm9yIHRoZSBnaXZlbiBtb2RlbC5cbiAqIFRoZSB2YWx1ZXMgb24gZm9yIGVhY2ggZW50aXR5IGlkIGlzIGFuIG9iamVjdCBrZXllZCBieSByZWxhdGlvbiBuYW1lcyBhbmRcbiAqIHdpdGggdmFsdWVzIGJlaW5nIGFuIGFycmF5IG9mIGlkcyBmb3IgcmVsYXRpb24uIEV4YW1wbGU6XG4gKiB7XG4gKiAgIDEwOiB7XG4gKiAgICAgZGF0ZXRpbWVzOiBbIDIyLCAyMyBdLFxuICogICAgIG1lc3NhZ2VfdGVtcGxhdGVfZ3JvdXBzOiBbIDIsIDQgXSxcbiAqICAgfSxcbiAqICAgMjA6IHtcbiAqICAgICBkYXRldGltZXM6IFsgMjQsIDI1IF0sXG4gKiAgIH0sXG4gKiB9XG4gKlxuICovXG5jb25zdCBnZXRSZWxhdGlvbkFkZGl0aW9uc1F1ZXVlZEZvck1vZGVsID0gY3JlYXRlU2VsZWN0b3IoXG5cdCggc3RhdGUsIG1vZGVsTmFtZSApID0+IHtcblx0XHRyZXR1cm4gbG9va3VwUmVsYXRpb25zUXVldWVkRm9yTW9kZWwoIHN0YXRlLCBtb2RlbE5hbWUgKTtcblx0fSxcblx0KCBzdGF0ZSwgbW9kZWxOYW1lICkgPT4gW1xuXHRcdHN0YXRlLmRpcnR5LnJlbGF0aW9ucy5nZXRJbiggWyAnYWRkJywgc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApIF0gKSxcblx0XHRzdGF0ZS5kaXJ0eS5yZWxhdGlvbnMuZ2V0SW4oIFsgJ2luZGV4JywgcGx1cmFsTW9kZWxOYW1lKCBtb2RlbE5hbWUgKSBdICksXG5cdF1cbik7XG5cbi8qKlxuICogUmV0cmlldmVzIGFsbCB0aGUgcXVldWVkIHJlbGF0aW9uIGRlbGV0aW9ucyBmb3IgdGhlIGdpdmVuIG1vZGVsXG4gKiBTaW1pbGFyIHRvIGBnZXRSZWxhdGlvbkFkZGl0aW9uc1F1ZXVlZEZvck1vZGVsYCBleGNlcHQgdGhpcyBpcyByZWxhdGlvbnNcbiAqIHF1ZXVlZCBmb3IgZGVsZXRpb24uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IGtleWVkIGJ5IGVudGl0eSBpZHMgZm9yIHRoZSBnaXZlbiBtb2RlbC5cbiAqIFRoZSB2YWx1ZXMgb24gZm9yIGVhY2ggZW50aXR5IGlkIGlzIGFuIG9iamVjdCBrZXllZCBieSByZWxhdGlvbiBuYW1lcyBhbmRcbiAqIHdpdGggdmFsdWVzIGJlaW5nIGFuIGFycmF5IG9mIGlkcyBmb3IgcmVsYXRpb24uXG4gKi9cbmNvbnN0IGdldFJlbGF0aW9uRGVsZXRpb25zUXVldWVkRm9yTW9kZWwgPSBjcmVhdGVTZWxlY3Rvcihcblx0KCBzdGF0ZSwgbW9kZWxOYW1lICkgPT4ge1xuXHRcdHJldHVybiBsb29rdXBSZWxhdGlvbnNRdWV1ZWRGb3JNb2RlbCggc3RhdGUsIG1vZGVsTmFtZSwgJ2RlbGV0ZScgKTtcblx0fSxcblx0KCBzdGF0ZSwgbW9kZWxOYW1lICkgPT4gW1xuXHRcdHN0YXRlLmRpcnR5LnJlbGF0aW9ucy5nZXRJbihcblx0XHRcdFsgJ2RlbGV0ZScsIHNpbmd1bGFyTW9kZWxOYW1lKCBtb2RlbE5hbWUgKSBdXG5cdFx0KSxcblx0XHRzdGF0ZS5kaXJ0eS5yZWxhdGlvbnMuZ2V0SW4oIFsgJ2luZGV4JywgcGx1cmFsTW9kZWxOYW1lKCBtb2RlbE5hbWUgKSBdICksXG5cdF1cbik7XG5cbi8qKlxuICogUmV0dXJucyBhIGNvdW50IG9mIGFsbCB0aGUgcmVsYXRpb24gbW9kZWxzIChub3QgY291bnQgb2YgZW50aXRpZXMpIHRoYXQgZXhpc3RcbiAqIGluIHRoZSBzdGF0ZSBiZWluZyByZWxhdGVkIHRvIHRoZSBnaXZlbiBtb2RlbCBhbmQgZW50aXR5SWQuXG4gKlxuICogTm90ZTogVGhpcyBvbmx5IHF1ZXJpZXMgdGhlIHN0YXRlLCBub3QgYW55IHJlbGF0aW9ucyB0aGF0IG1pZ2h0IGV4aXN0IGluIHRoZVxuICogZGIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IGVudGl0eUlkXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjb3VudCBvZiByZWxhdGlvbnMuXG4gKi9cbmNvbnN0IGNvdW50UmVsYXRpb25Nb2RlbHNJbmRleGVkRm9yRW50aXR5ID0gY3JlYXRlU2VsZWN0b3IoXG5cdChcblx0XHRzdGF0ZSxcblx0XHRtb2RlbE5hbWUsXG5cdFx0ZW50aXR5SWRcblx0KSA9PiB7XG5cdFx0Y29uc3Qgc2luZ2xlTmFtZSA9IHNpbmd1bGFyTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0XHRjb25zdCBwbHVyYWxOYW1lID0gcGx1cmFsTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0XHRlbnRpdHlJZCA9IG5vcm1hbGl6ZUVudGl0eUlkKCBlbnRpdHlJZCApO1xuXHRcdC8vIGZpcnN0IGZyb20gdGhlIGVudGl0eU1hcFxuXHRcdGxldCBjb3VudFJlbGF0aW9ucyA9IChcblx0XHRcdHN0YXRlLnJlbGF0aW9uc1xuXHRcdFx0XHQuZ2V0SW4oIFsgJ2VudGl0eU1hcCcsIHNpbmdsZU5hbWUsIGVudGl0eUlkIF0gKSB8fCBNYXAoKVxuXHRcdCkuY291bnQoKTtcblxuXHRcdC8vIGNvbnNpZGVyIG1heWJlIGluIHRoZSBpbmRleCAoZXhpc3RzIGFzIGEgcmVsYXRpb24gZm9yIGFub3RoZXIgbW9kZWwpXG5cdFx0Y291bnRSZWxhdGlvbnMgKz0gKFxuXHRcdFx0c3RhdGUucmVsYXRpb25zXG5cdFx0XHRcdC5nZXRJbiggWyAnaW5kZXgnLCBwbHVyYWxOYW1lLCBlbnRpdHlJZCBdICkgfHwgTWFwKClcblx0XHQpLmNvdW50KCk7XG5cdFx0cmV0dXJuIGNvdW50UmVsYXRpb25zO1xuXHR9LFxuXHQoIHN0YXRlLCBtb2RlbE5hbWUsIGVudGl0eUlkICkgPT4ge1xuXHRcdGNvbnN0IHNpbmdsZU5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lICk7XG5cdFx0Y29uc3QgcGx1cmFsTmFtZSA9IHBsdXJhbE1vZGVsTmFtZSggbW9kZWxOYW1lICk7XG5cdFx0ZW50aXR5SWQgPSBub3JtYWxpemVFbnRpdHlJZCggZW50aXR5SWQgKTtcblx0XHRyZXR1cm4gW1xuXHRcdFx0c3RhdGUucmVsYXRpb25zLmdldEluKCBbICdlbnRpdHlNYXAnLCBzaW5nbGVOYW1lLCBlbnRpdHlJZCBdICksXG5cdFx0XHRzdGF0ZS5yZWxhdGlvbnMuZ2V0SW4oIFsgJ2luZGV4JywgcGx1cmFsTmFtZSwgZW50aXR5SWQgXSApLFxuXHRcdF07XG5cdH1cbik7XG5cbmV4cG9ydCB7XG5cdGdldFJlbGF0ZWRFbnRpdGllcyxcblx0Z2V0UmVsYXRpb25JZHNGb3JFbnRpdHlSZWxhdGlvbixcblx0Z2V0UmVsYXRpb25BZGRpdGlvbnNRdWV1ZWRGb3JNb2RlbCxcblx0Z2V0UmVsYXRpb25EZWxldGlvbnNRdWV1ZWRGb3JNb2RlbCxcblx0Y291bnRSZWxhdGlvbk1vZGVsc0luZGV4ZWRGb3JFbnRpdHksXG59O1xuIiwiZXhwb3J0IGNvbnN0IEFDVElPTl9UWVBFUyA9IHtcblx0UkVDRUlWRV9MSVNUOiAnUkVDRUlWRV9MSVNUJyxcblx0UkVDRUlWRV9FTlRJVFlfTElTVDogJ1JFQ0VJVkVfRU5USVRZX0xJU1QnLFxufTtcbiIsIi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBBQ1RJT05fVFlQRVMgYXMgdHlwZXMgfSBmcm9tICcuL2FjdGlvbi10eXBlcyc7XG5cbi8qKlxuICogUmV0dXJucyBhbiBhY3Rpb24gb2JqZWN0IHVzZWQgaW4gdXBkYXRpbmcgdGhlIHN0b3JlIHdpdGggdGhlIHByb3ZpZGVkIGl0ZW1zXG4gKiByZXRyaWV2ZWQgZnJvbSBhIHJlcXVlc3QgdXNpbmcgdGhlIGdpdmVuIHF1ZXJ5c3RyaW5nLlxuICpcbiAqIFRoaXMgaXMgYSBnZW5lcmljIHJlc3BvbnNlIGFjdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaWRlbnRpZmllclxuICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5U3RyaW5nICBSZXN1bHRzIGFyZSBzdG9yZWQgaW5kZXhlZCBieSB0aGUgcXVlcnlcbiAqIHN0cmluZyBnZW5lcmF0aW5nIHRoZW0uXG4gKiBAcGFyYW0ge0FycmF5PCo+fSBpdGVtcyAgICAgaXRlbXMgYXR0YWNoZWQgd2l0aCB0aGUgbGlzdC5cbiAqIEByZXR1cm4ge1xuICogXHR7XG4gKiBcdFx0dHlwZTogc3RyaW5nLFxuICogXHRcdGlkZW50aWZpZXI6IHN0cmluZyxcbiAqIFx0XHRxdWVyeVN0cmluZzogc3RyaW5nLFxuICogXHRcdGl0ZW1zOiBBcnJheTwqPlxuICpcdH1cbiAqIH0gT2JqZWN0IGZvciBhY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNlaXZlUmVzcG9uc2UoIGlkZW50aWZpZXIsIHF1ZXJ5U3RyaW5nLCBpdGVtcyA9IFtdICkge1xuXHRyZXR1cm4ge1xuXHRcdHR5cGU6IHR5cGVzLlJFQ0VJVkVfTElTVCxcblx0XHRpZGVudGlmaWVyLFxuXHRcdHF1ZXJ5U3RyaW5nLFxuXHRcdGl0ZW1zLFxuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gYWN0aW9uIG9iamVjdCB1c2VkIGluIHVwZGF0aW5nIHRoZSBzdG9yZSB3aXRoIHRoZSBwcm92aWRlZCBlbnRpdHlcbiAqIGl0ZW1zIHJldHJpZXZlZCBmcm9tIGEgcmVxdWVzdCB1c2luZyB0aGUgZ2l2ZW4gcXVlcnkgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeVN0cmluZ1xuICogQHBhcmFtIHtBcnJheTxCYXNlRW50aXR5Pn1lbnRpdGllc1xuICogQHJldHVybiB7e3R5cGU6IHN0cmluZywgaWRlbnRpZmllcjogc3RyaW5nLCBxdWVyeVN0cmluZzogc3RyaW5nLCBpdGVtczpcbiAqICAgQXJyYXk8QmFzZUVudGl0eT59fSBBbiBhY3Rpb24gb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjZWl2ZUVudGl0eVJlc3BvbnNlKFxuXHRtb2RlbE5hbWUsXG5cdHF1ZXJ5U3RyaW5nLFxuXHRlbnRpdGllcyA9IFtdLFxuKSB7XG5cdHJldHVybiB7XG5cdFx0dHlwZTogdHlwZXMuUkVDRUlWRV9FTlRJVFlfTElTVCxcblx0XHRpZGVudGlmaWVyOiBtb2RlbE5hbWUsXG5cdFx0cXVlcnlTdHJpbmcsXG5cdFx0aXRlbXM6IGVudGl0aWVzLFxuXHR9O1xufVxuIiwiLyoqXG4gKiBUaGUga2V5IGZvciB0aGUgcmVkdWNlciBvbiB0aGUgc3RvcmUuXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgUkVEVUNFUl9LRVkgPSAnZXZlbnRlc3ByZXNzby9saXN0cyc7XG4iLCIvKipcbiAqIEV4dGVybmFsIGRlcGVuZGVuY2llc1xuICovXG5pbXBvcnQgeyByZWdpc3RlclN0b3JlIH0gZnJvbSAnQHdvcmRwcmVzcy9kYXRhJztcblxuLyoqXG4gKiBJbnRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqL1xuaW1wb3J0IHJlZHVjZXIgZnJvbSAnLi9yZWR1Y2Vycyc7XG5pbXBvcnQgKiBhcyBzZWxlY3RvcnMgZnJvbSAnLi9zZWxlY3RvcnMnO1xuaW1wb3J0ICogYXMgYWN0aW9ucyBmcm9tICcuL2FjdGlvbnMnO1xuaW1wb3J0ICogYXMgcmVzb2x2ZXJzIGZyb20gJy4vcmVzb2x2ZXJzJztcbmltcG9ydCB7IGNyZWF0ZUVudGl0eVNlbGVjdG9ycywgY3JlYXRlRW50aXR5UmVzb2x2ZXJzIH0gZnJvbSAnLi9tb2RlbCc7XG5pbXBvcnQgeyBSRURVQ0VSX0tFWSB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBjb250cm9scyBmcm9tICcuLi9iYXNlLWNvbnRyb2xzJztcblxuLyoqXG4gKiBDcmVhdGVzIHNwZWNpZmljIG1vZGVsIGVudGl0eSBzZWxlY3RvcnMgKGdldEV2ZW50cywgZ2V0RGF0ZXRpbWVzIGV0YylcbiAqIEB0eXBlIHtPYmplY3Q8RnVuY3Rpb24+fVxuICovXG5jb25zdCBlbnRpdHlTZWxlY3RvcnMgPSBjcmVhdGVFbnRpdHlTZWxlY3RvcnMoIHNlbGVjdG9ycyApO1xuXG4vKipcbiAqIENyZWF0ZXMgc3BlY2lmaWMgbW9kZWwgZW50aXR5IHJlc29sdmVycyAoZ2V0RXZlbnRzLCBnZXREYXRldGltZXMgZXRjKVxuICogQHR5cGUge09iamVjdDxGdW5jdGlvbj59XG4gKi9cbmNvbnN0IGVudGl0eVJlc29sdmVycyA9IGNyZWF0ZUVudGl0eVJlc29sdmVycyggcmVzb2x2ZXJzICk7XG5cbi8qKlxuICogUmVnaXN0ZXJzIHRoZSBzdG9yZSBmb3IgdGhlICdldmVudGVzcHJlc3NvL2xpc3RzYCByZWR1Y2VyLlxuICovXG5leHBvcnQgZGVmYXVsdCByZWdpc3RlclN0b3JlKCBSRURVQ0VSX0tFWSwge1xuXHRyZWR1Y2VyLFxuXHRhY3Rpb25zLFxuXHRzZWxlY3RvcnM6IHsgLi4uc2VsZWN0b3JzLCAuLi5lbnRpdHlTZWxlY3RvcnMgfSxcblx0cmVzb2x2ZXJzOiB7IC4uLnJlc29sdmVycywgLi4uZW50aXR5UmVzb2x2ZXJzIH0sXG5cdGNvbnRyb2xzLFxufSApO1xuIiwiLyoqXG4gKiBJbnRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqL1xuaW1wb3J0IHsgZ2V0TWV0aG9kTmFtZSB9IGZyb20gJy4uL2Jhc2UtbW9kZWwnO1xuaW1wb3J0IHsgTU9ERUxfTkFNRVMgfSBmcm9tICcuLi8uLi9tb2RlbCc7XG5pbXBvcnQgeyBpc1Jlc29sdmluZyB9IGZyb20gJy4uL2Jhc2Utc2VsZWN0b3JzJztcbmltcG9ydCB7IFJFRFVDRVJfS0VZIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgc2VsZWN0b3JzIGZvciBlYWNoIHJlZ2lzdGVyZWQgbW9kZWwgbmFtZSB3cmFwcGluZyB0aGVcbiAqIGdlbmVyaWMgc291cmNlIHNlbGVjdG9ycy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdDxmdW5jdGlvbj59IHNvdXJjZVxuICogQHJldHVybiB7T2JqZWN0PGZ1bmN0aW9uPn0gQWxsIHRoZSBnZW5lcmF0ZWQgc2VsZWN0b3JzIGZvciBlYWNoIG1vZGVsLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlRW50aXR5U2VsZWN0b3JzID0gKCBzb3VyY2UgKSA9PiBNT0RFTF9OQU1FUy5yZWR1Y2UoXG5cdCggc2VsZWN0b3JzLCBtb2RlbE5hbWUgKSA9PiB7XG5cdFx0Y29uc3QgbWV0aG9kTmFtZUZvckdldCA9IGdldE1ldGhvZE5hbWUoIG1vZGVsTmFtZSwgJycsICdnZXQnLCB0cnVlICk7XG5cdFx0c2VsZWN0b3JzWyBtZXRob2ROYW1lRm9yR2V0IF0gPSAoXG5cdFx0XHRzdGF0ZSxcblx0XHRcdHF1ZXJ5U3RyaW5nLFxuXHRcdCkgPT4gc291cmNlLmdldEVudGl0aWVzKCBzdGF0ZSwgbW9kZWxOYW1lLCBxdWVyeVN0cmluZyApO1xuXHRcdHNlbGVjdG9yc1tcblx0XHRcdGdldE1ldGhvZE5hbWUoIG1vZGVsTmFtZSwgJ2J5SWRzJywgJ2dldCcsIHRydWUgKVxuXHRcdF0gPSAoXG5cdFx0XHRzdGF0ZSxcblx0XHRcdGlkcyA9IFtdLFxuXHRcdCkgPT4gc291cmNlLmdldEVudGl0aWVzQnlJZHMoIHN0YXRlLCBtb2RlbE5hbWUsIGlkcyApO1xuXHRcdHNlbGVjdG9yc1sgZ2V0TWV0aG9kTmFtZSggbW9kZWxOYW1lLCAnJywgJ2lzUmVxdWVzdGluZycsIHRydWUgKSBdID0gKFxuXHRcdFx0c3RhdGUsXG5cdFx0XHRxdWVyeVN0cmluZyxcblx0XHQpID0+IGlzUmVzb2x2aW5nKFxuXHRcdFx0UkVEVUNFUl9LRVksXG5cdFx0XHRtZXRob2ROYW1lRm9yR2V0LFxuXHRcdFx0cXVlcnlTdHJpbmdcblx0XHQpO1xuXHRcdHJldHVybiBzZWxlY3RvcnM7XG5cdH0sXG5cdHt9LFxuKTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjcmVhdGVzIHJlc29sdmVycyBmb3IgZWFjaCByZWdpc3RlcmVkIG1vZGVsIG5hbWUgd3JhcHBpbmcgdGhlXG4gKiBnZW5lcmljIHNvdXJjZSByZXNvbHZlcnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3Q8ZnVuY3Rpb24+fSBzb3VyY2VcbiAqIEByZXR1cm4ge09iamVjdDxmdW5jdGlvbj59IEFsbCB0aGUgZ2VuZXJhdGVkIHJlc29sdmVycyBmb3IgZWFjaCBtb2RlbC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUVudGl0eVJlc29sdmVycyA9ICggc291cmNlICkgPT4gTU9ERUxfTkFNRVMucmVkdWNlKFxuXHQoIHJlc29sdmVycywgbW9kZWxOYW1lICkgPT4ge1xuXHRcdHJlc29sdmVyc1sgZ2V0TWV0aG9kTmFtZSggbW9kZWxOYW1lLCAnJywgJ2dldCcsIHRydWUgKSBdID0gKFxuXHRcdFx0cXVlcnlTdHJpbmdcblx0XHQpID0+IHNvdXJjZS5nZXRFbnRpdGllcyggbW9kZWxOYW1lLCBxdWVyeVN0cmluZyApO1xuXHRcdHJlc29sdmVyc1sgZ2V0TWV0aG9kTmFtZSggbW9kZWxOYW1lLCAnYnlJZHMnLCAnZ2V0JywgdHJ1ZSApIF0gPSAoXG5cdFx0XHRpZHNcblx0XHQpID0+IHNvdXJjZS5nZXRFbnRpdGllc0J5SWRzKCBtb2RlbE5hbWUsIGlkcyApO1xuXHRcdHJldHVybiByZXNvbHZlcnM7XG5cdH0sXG5cdHt9LFxuKTtcbiIsIi8qKlxuICogSW50ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cbmltcG9ydCB7IERFRkFVTFRfTElTVFNfU1RBVEUgfSBmcm9tICcuLi8uLi9tb2RlbCc7XG5pbXBvcnQgeyBBQ1RJT05fVFlQRVMgYXMgdHlwZXMgfSBmcm9tICcuL2FjdGlvbi10eXBlcyc7XG5cbi8qKlxuICogRXh0ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cbmltcG9ydCB7IGZyb21KUywgU2V0LCBPcmRlcmVkTWFwIH0gZnJvbSAnaW1tdXRhYmxlJztcblxuLyoqXG4gKiBSZWR1Y2VyIG1hbmFnaW5nIGl0ZW0gbGlzdCBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHN0YXRlICBDdXJyZW50IHN0YXRlLlxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblx0RGlzcGF0Y2hlZCBhY3Rpb24uXG4gKiBAcmV0dXJuIHtJbW11dGFibGUuTWFwfVx0VXBkYXRlZCBzdGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY2VpdmVMaXN0SXRlbXMoXG5cdHN0YXRlID0gZnJvbUpTKCBERUZBVUxUX0xJU1RTX1NUQVRFICksXG5cdGFjdGlvblxuKSB7XG5cdGNvbnN0IHsgdHlwZSwgaWRlbnRpZmllciwgcXVlcnlTdHJpbmcgfSA9IGFjdGlvbjtcblx0Y29uc3QgcGF0aCA9IFsgaWRlbnRpZmllciwgcXVlcnlTdHJpbmcgXTtcblx0bGV0IHsgaXRlbXMgfSA9IGFjdGlvbjtcblx0bGV0IGRvVXBkYXRlID0gdHJ1ZSxcblx0XHRleGlzdGluZ1ZhbHVlcztcblx0c3dpdGNoICggdHlwZSApIHtcblx0XHRjYXNlIHR5cGVzLlJFQ0VJVkVfTElTVDpcblx0XHRcdGV4aXN0aW5nVmFsdWVzID0gc3RhdGUuZ2V0SW4oIHBhdGggKSB8fCBTZXQoKTtcblx0XHRcdGl0ZW1zID0gZXhpc3RpbmdWYWx1ZXMubWVyZ2UoIGl0ZW1zICk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIHR5cGVzLlJFQ0VJVkVfRU5USVRZX0xJU1Q6XG5cdFx0XHRleGlzdGluZ1ZhbHVlcyA9IHN0YXRlLmdldEluKCBwYXRoICkgfHwgT3JkZXJlZE1hcCgpO1xuXHRcdFx0aXRlbXMgPSBleGlzdGluZ1ZhbHVlcy5tZXJnZShcblx0XHRcdFx0aXRlbXMubWFwKCAoIGVudGl0eSApID0+IFsgZW50aXR5LmlkLCBlbnRpdHkgXSApXG5cdFx0XHQpO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdCA6XG5cdFx0XHRkb1VwZGF0ZSA9IGZhbHNlO1xuXHR9XG5cdHJldHVybiBkb1VwZGF0ZSA/XG5cdFx0c3RhdGUuc2V0SW4oIFsgaWRlbnRpZmllciwgcXVlcnlTdHJpbmcgXSwgaXRlbXMgKSA6XG5cdFx0c3RhdGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHJlY2VpdmVMaXN0SXRlbXM7XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgaXNFbXB0eSwgZmluZCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1xuXHRhcHBseVF1ZXJ5U3RyaW5nLFxuXHRnZXRQcmltYXJ5S2V5UXVlcnlTdHJpbmcsXG59IGZyb20gJ0BldmVudGVzcHJlc3NvL21vZGVsJztcblxuLyoqXG4gKiBJbnRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqL1xuaW1wb3J0IHsgcmVjZWl2ZVJlc3BvbnNlLCByZWNlaXZlRW50aXR5UmVzcG9uc2UgfSBmcm9tICcuL2FjdGlvbnMnO1xuaW1wb3J0IHtcblx0ZmV0Y2gsXG5cdHNlbGVjdCxcblx0ZGlzcGF0Y2gsXG5cdHJlc29sdmVHZXRFbnRpdHlCeUlkRm9ySWRzLFxuXHRyZXNvbHZlU2VsZWN0LFxufSBmcm9tICcuLi9iYXNlLWNvbnRyb2xzJztcbmltcG9ydCB7IFJFRFVDRVJfS0VZIGFzIENPUkVfUkVEVUNFUl9LRVkgfSBmcm9tICcuLi9jb3JlL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBSRURVQ0VSX0tFWSBhcyBTQ0hFTUFfUkVEVUNFUl9LRVkgfSBmcm9tICcuLi9zY2hlbWEvY29uc3RhbnRzJztcblxuY29uc3QgREVGQVVMVF9FTVBUWV9BUlJBWSA9IFtdO1xuXG4vKipcbiAqIFJlc29sdmVyIGZvciBnZW5lcmljIGl0ZW1zIHJldHVybmVkIGZyb20gYW4gZW5kcG9pbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlkZW50aWZpZXIgIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgaXRlbXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gcXVlcnlTdHJpbmcgIEFkZGl0aW9uYWwgcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnMgcGFzc2VkIG9uIHRvXG4gKiAgIHRoZSBSRVNUIHJlcXVlc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiogZ2V0SXRlbXMoIGlkZW50aWZpZXIsIHF1ZXJ5U3RyaW5nICkge1xuXHRjb25zdCBpdGVtcyA9IHlpZWxkIGZldGNoKCB7XG5cdFx0cGF0aDogcXVlcnlTdHJpbmcsXG5cdH0gKTtcblx0eWllbGQgcmVjZWl2ZVJlc3BvbnNlKCBpZGVudGlmaWVyLCBxdWVyeVN0cmluZywgaXRlbXMgKTtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IGZvciBoYW5kbGluZyBhbiBlbnRpdHkgcmVzcG9uc2UgYW5kIGNvbnN0cnVjdGluZyBCYXNlRW50aXR5XG4gKiBjaGlsZHJlbiBmcm9tIHRoZW0uXG4gKlxuICogTm90ZSwgdGhpcyB1c2VzIHRoZSBlbnRpdGllcyBzdG9yZWQgaW4gdGhlIGV2ZW50ZXNwcmVzc28vY29yZSBzdG9yZSBhcyB0aGVcbiAqIGF1dGhvcml0eSBzbyBpZiBhbiBlbnRpdHkgYWxyZWFkeSBleGlzdHMgdGhlcmUsIGl0IHJlcGxhY2VzIHdoYXQgd2FzXG4gKiByZXRyaWV2ZWQgZnJvbSB0aGUgc2VydmVyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7QXJyYXl9IHJlc3BvbnNlXG4gKiBAcmV0dXJuIHtJdGVyYWJsZUl0ZXJhdG9yPCo+fEFycmF5PEJhc2VFbnRpdHk+fSAgQW4gZW1wdHkgYXJyYXkgaWYgdGhlXG4gKiBmYWN0b3J5IGNhbm5vdCBiZSByZXRyaWV2ZWQgZm9yIHRoZSBtb2RlbC4gIE90aGVyd2lzZSB0aGUgY29uc3RydWN0ZWRcbiAqIGVudGl0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24qIGJ1aWxkQW5kRGlzcGF0Y2hFbnRpdGllc0Zyb21SZXNwb25zZSggbW9kZWxOYW1lLCByZXNwb25zZSApIHtcblx0Y29uc3QgZmFjdG9yeSA9IHlpZWxkIHJlc29sdmVTZWxlY3QoXG5cdFx0U0NIRU1BX1JFRFVDRVJfS0VZLFxuXHRcdCdnZXRGYWN0b3J5Rm9yTW9kZWwnLFxuXHRcdG1vZGVsTmFtZVxuXHQpO1xuXHRpZiAoIGlzRW1wdHkoIGZhY3RvcnkgKSApIHtcblx0XHRyZXR1cm4gREVGQVVMVF9FTVBUWV9BUlJBWTtcblx0fVxuXHRsZXQgZnVsbEVudGl0aWVzID0gcmVzcG9uc2UubWFwKFxuXHRcdCggZW50aXR5ICkgPT4gZmFjdG9yeS5mcm9tRXhpc3RpbmcoIGVudGl0eSApXG5cdCk7XG5cdGNvbnN0IGVudGl0eUlkcyA9IGZ1bGxFbnRpdGllcy5tYXAoICggZW50aXR5ICkgPT4gZW50aXR5LmlkICk7XG5cdC8vIGFyZSB0aGVyZSBhbHJlYWR5IGVudGl0aWVzIGZvciB0aGUgaWRzIGluIHRoZSBzdG9yZT8gIElmIHNvLCB3ZSB1c2UgdGhvc2Vcblx0Y29uc3QgZXhpc3RpbmdFbnRpdGllcyA9IHlpZWxkIHNlbGVjdChcblx0XHRDT1JFX1JFRFVDRVJfS0VZLFxuXHRcdCdnZXRFbnRpdGllc0J5SWRzJyxcblx0XHRtb2RlbE5hbWUsXG5cdFx0ZW50aXR5SWRzXG5cdCk7XG5cdGlmICggISBpc0VtcHR5KCBleGlzdGluZ0VudGl0aWVzICkgKSB7XG5cdFx0ZnVsbEVudGl0aWVzID0gZnVsbEVudGl0aWVzLm1hcCggKCBlbnRpdHkgKSA9PiB7XG5cdFx0XHRyZXR1cm4gZmluZCggZXhpc3RpbmdFbnRpdGllcywgKCBleGlzdGluZ0VudGl0eSApID0+IHtcblx0XHRcdFx0cmV0dXJuIGV4aXN0aW5nRW50aXR5LmlkID09PSBlbnRpdHkuaWQ7XG5cdFx0XHR9ICkgfHwgZW50aXR5O1xuXHRcdH0gKTtcblx0fVxuXHR5aWVsZCBkaXNwYXRjaChcblx0XHRDT1JFX1JFRFVDRVJfS0VZLFxuXHRcdCdyZWNlaXZlRW50aXR5UmVjb3JkcycsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGZ1bGxFbnRpdGllc1xuXHQpO1xuXHR5aWVsZCByZXNvbHZlR2V0RW50aXR5QnlJZEZvcklkcyggbW9kZWxOYW1lLCBlbnRpdHlJZHMgKTtcblx0cmV0dXJuIGZ1bGxFbnRpdGllcztcbn1cblxuLyoqXG4gKiBSZXNvbHZlciBmb3IgbW9kZWwgZW50aXRpZXMgcmV0dXJuZWQgZnJvbSBhbiBlbmRwb2ludC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeVN0cmluZ1xuICogQHJldHVybiB7SXRlcmFibGVJdGVyYXRvcjwqPnxBcnJheTxCYXNlRW50aXR5Pn0gQW4gZW1wdHkgYXJyYXkgaWYgbm9cbiAqIGVudGl0aWVzIHJldHJpZXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uKiBnZXRFbnRpdGllcyggbW9kZWxOYW1lLCBxdWVyeVN0cmluZyApIHtcblx0Y29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaCgge1xuXHRcdHBhdGg6IGFwcGx5UXVlcnlTdHJpbmcoIG1vZGVsTmFtZSwgcXVlcnlTdHJpbmcgKSxcblx0fSApO1xuXHRpZiAoIGlzRW1wdHkoIHJlc3BvbnNlICkgKSB7XG5cdFx0cmV0dXJuIERFRkFVTFRfRU1QVFlfQVJSQVk7XG5cdH1cblx0Y29uc3QgZnVsbEVudGl0aWVzID0geWllbGQgYnVpbGRBbmREaXNwYXRjaEVudGl0aWVzRnJvbVJlc3BvbnNlKFxuXHRcdG1vZGVsTmFtZSxcblx0XHRyZXNwb25zZVxuXHQpO1xuXHR5aWVsZCByZWNlaXZlRW50aXR5UmVzcG9uc2UoIG1vZGVsTmFtZSwgcXVlcnlTdHJpbmcsIGZ1bGxFbnRpdGllcyApO1xufVxuXG4vKipcbiAqIFJlc29sdmVyIGZvciBnZXR0aW5nIG1vZGVsIGVudGl0aWVzIGZvciBhIGdpdmVuIHNldCBvZiBpZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn1pZHNcbiAqIEByZXR1cm4ge0l0ZXJhYmxlSXRlcmF0b3I8Kj58QXJyYXl9IEFuIGVtcHR5IGFycmF5IGlmIG5vIGVudGl0aWVzIHJldHJpZXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uKiBnZXRFbnRpdGllc0J5SWRzKCBtb2RlbE5hbWUsIGlkcyA9IFtdICkge1xuXHRjb25zdCBxdWVyeVN0cmluZyA9IGdldFByaW1hcnlLZXlRdWVyeVN0cmluZyggbW9kZWxOYW1lLCBpZHMgKTtcblx0Y29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaCgge1xuXHRcdHBhdGg6IGFwcGx5UXVlcnlTdHJpbmcoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRxdWVyeVN0cmluZ1xuXHRcdCksXG5cdH0gKTtcblx0aWYgKCBpc0VtcHR5KCByZXNwb25zZSApICkge1xuXHRcdHJldHVybiBERUZBVUxUX0VNUFRZX0FSUkFZO1xuXHR9XG5cdGNvbnN0IGZ1bGxFbnRpdGllcyA9IHlpZWxkIGJ1aWxkQW5kRGlzcGF0Y2hFbnRpdGllc0Zyb21SZXNwb25zZShcblx0XHRtb2RlbE5hbWUsXG5cdFx0cmVzcG9uc2Vcblx0KTtcblx0eWllbGQgcmVjZWl2ZUVudGl0eVJlc3BvbnNlKCBtb2RlbE5hbWUsIHF1ZXJ5U3RyaW5nLCBmdWxsRW50aXRpZXMgKTtcbn1cbiIsIi8qKlxuICogSW50ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cbmltcG9ydCB7IGlzUmVzb2x2aW5nIH0gZnJvbSAnLi4vYmFzZS1zZWxlY3RvcnMnO1xuaW1wb3J0IHsgUkVEVUNFUl9LRVkgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbi8qKlxuICogRXh0ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cbmltcG9ydCB7IF9fLCBzcHJpbnRmIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vaTE4bic7XG5pbXBvcnQgY3JlYXRlU2VsZWN0b3IgZnJvbSAncmVtZW1vJztcbmltcG9ydCB7XG5cdGFzc2VydEltbXV0YWJsZU9iamVjdEhhc1BhdGgsXG5cdGdldFByaW1hcnlLZXlRdWVyeVN0cmluZyxcbn0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vbW9kZWwnO1xuaW1wb3J0IHsgT3JkZXJlZE1hcCwgU2V0IH0gZnJvbSAnaW1tdXRhYmxlJztcblxuY29uc3QgREVGQVVMVF9FTVBUWV9BUlJBWSA9IFtdO1xuXG4vKipcbiAqIEdlbmVyaWMgaGVscGVyIGZvciByZXRyaWV2aW5nIGl0ZW1zIGZyb20gc3RhdGUgZm9yIGdpdmVuIGlkZW50aWZpZXIgYW5kXG4gKiBxdWVyeVN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gaWRlbnRpZmllclxuICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5U3RyaW5nXG4gKiBAcGFyYW0geyp9IGRlZmF1bHRFbXB0eSAgQ2FsbGVyIGNhbiBzdXBwbHkgd2hhdCB0aGUgZGVmYXVsdCBpcyB3aGVuIHN0YXRlIGlzXG4gKiBkb2Vzbid0IGhhdmUgZW50cmllcyBmb3IgdGhlIGdpdmVuIGlkZW50aWZpZXIgYW5kIHF1ZXJ5U3RyaW5nXG4gKiBAcmV0dXJuIHtBcnJheXxPYmplY3R9IFJldHVybnMgdGhlIGFycmF5IG9mIGl0ZW1zIGlmIHRoZSBnaXZlbiBpZGVudGlmaWVyL1xuICogcXVlcnlzdHJpbmcgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHN0YXRlIG9yIHRoZSBnaXZlbiBpdGVtcyBhcyBhbiBhcnJheSBvclxuICogb2JqZWN0IChkZXBlbmRpbmcgb24gaG93IHRoZXkgYXJlIHN0b3JlZCBpbiB0aGUgc3RhdGUpLlxuICovXG5jb25zdCByZXRyaWV2ZUl0ZW1zID1cblx0KFxuXHRcdHN0YXRlLFxuXHRcdGlkZW50aWZpZXIsXG5cdFx0cXVlcnlTdHJpbmcsXG5cdFx0ZGVmYXVsdEVtcHR5ID0gU2V0KClcblx0KSA9PiBzdGF0ZS5nZXRJbiggWyBpZGVudGlmaWVyLCBxdWVyeVN0cmluZyBdICkgfHwgZGVmYXVsdEVtcHR5O1xuXG4vKipcbiAqIFJldHVybnMgYWxsIHRoZSBpdGVtcyBmb3IgdGhlIGdpdmVuIGlkZW50aWZpZXIgYW5kIHF1ZXJ5U3RyaW5nXG4gKlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZSBEYXRhIHN0YXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgdGhlIGl0ZW1zIGFyZSBiZWluZyByZXRyaWV2ZWQgZm9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5U3RyaW5nIFRoZSBxdWVyeSBzdHJpbmcgZm9yIHJldHJpZXZpbmcgdGhlIGl0ZW1zLlxuICogQHJldHVybiB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2YgaXRlbXMgZm9yIHRoZSBnaXZlbiBtb2RlbCBhbmQgcXVlcnkuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRJdGVtcyA9IGNyZWF0ZVNlbGVjdG9yKFxuXHQoIHN0YXRlLCBpZGVudGlmaWVyLCBxdWVyeVN0cmluZyApID0+IHJldHJpZXZlSXRlbXMoXG5cdFx0c3RhdGUsXG5cdFx0aWRlbnRpZmllcixcblx0XHRxdWVyeVN0cmluZ1xuXHQpLnRvQXJyYXkoKSxcblx0KCBzdGF0ZSwgaWRlbnRpZmllciwgcXVlcnlTdHJpbmcgKSA9PiBbXG5cdFx0c3RhdGUuZ2V0SW4oIFsgaWRlbnRpZmllciwgcXVlcnlTdHJpbmcgXSApLFxuXHRdXG4pO1xuXG4vKipcbiAqIFJldHVybnMgYWxsIHRoZSBtb2RlbCBlbnRpdGllcyBmb3IgdGhlIGdpdmVuIG1vZGVsTmFtZSBhbmQgcXVlcnkgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeVN0cmluZ1xuICogQHJldHVybiB7QXJyYXk8QmFzZUVudGl0eT59IFJldHVybnMgYXJyYXkgb2YgZW50aXRpZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFbnRpdGllcyA9IGNyZWF0ZVNlbGVjdG9yKFxuXHQoIHN0YXRlLCBtb2RlbE5hbWUsIHF1ZXJ5U3RyaW5nICkgPT4gcmV0cmlldmVJdGVtcyhcblx0XHRzdGF0ZSxcblx0XHRtb2RlbE5hbWUsXG5cdFx0cXVlcnlTdHJpbmcsXG5cdFx0T3JkZXJlZE1hcCgpXG5cdCkudmFsdWVTZXEoKS50b0FycmF5KCksXG5cdCggc3RhdGUsIG1vZGVsTmFtZSwgcXVlcnlTdHJpbmcgKSA9PiBbXG5cdFx0c3RhdGUuZ2V0SW4oIFsgbW9kZWxOYW1lLCBxdWVyeVN0cmluZyBdICksXG5cdF1cbik7XG5cbi8qKlxuICogUmV0dXJucyBhbGwgdGhlIG1vZGVsIGVudGl0aWVzIGZvciB0aGUgZ2l2ZW4gbW9kZWxOYW1lIGFuZCBxdWVyeSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtBcnJheX0gaWRzXG4gKiBAcmV0dXJuIHtBcnJheTxCYXNlRW50aXR5Pn0gQW4gYXJyYXkgb2YgZW50aXRpZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFbnRpdGllc0J5SWRzID0gKCBzdGF0ZSwgbW9kZWxOYW1lLCBpZHMgPSBbXSApID0+IHtcblx0dHJ5IHtcblx0XHRjb25zdCBxdWVyeVN0cmluZyA9IGdldFByaW1hcnlLZXlRdWVyeVN0cmluZyggbW9kZWxOYW1lLCBpZHMgKTtcblx0XHRyZXR1cm4gZ2V0RW50aXRpZXMoIHN0YXRlLCBtb2RlbE5hbWUsIHF1ZXJ5U3RyaW5nICk7XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHJldHVybiBERUZBVUxUX0VNUFRZX0FSUkFZO1xuXHR9XG59O1xuXG5nZXRFbnRpdGllc0J5SWRzLmNsZWFyID0gKCkgPT4gZ2V0RW50aXRpZXMuY2xlYXIoKTtcblxuLyoqXG4gKiBIZWxwZXIgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBnaXZlbiBpZGVudGlmaWVyLCBzZWxlY3Rvck5hbWUsIGFuZCBxdWVyeVN0cmluZ1xuICogaXMgYmVpbmcgcmVzb2x2ZWQgb3Igbm90LlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBpZGVudGlmaWVyXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JOYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcXVlcnlTdHJpbmdcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VsZWN0b3IgaXMgY3VycmVudGx5IHJlcXVlc3RpbmcgaXRlbXMuXG4gKi9cbmZ1bmN0aW9uIGlzUmVxdWVzdGluZyggc3RhdGUsIGlkZW50aWZpZXIsIHNlbGVjdG9yTmFtZSwgcXVlcnlTdHJpbmcgKSB7XG5cdGFzc2VydEltbXV0YWJsZU9iamVjdEhhc1BhdGgoXG5cdFx0WyBpZGVudGlmaWVyIF0sXG5cdFx0c3RhdGUsXG5cdFx0c3ByaW50Zihcblx0XHRcdF9fKFxuXHRcdFx0XHQnVGhlIGdpdmVuIGlkZW50aWZpZXIgKCVzKSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgc3RhdGUuJyxcblx0XHRcdFx0J2V2ZW50X2VzcHJlc3NvJyxcblx0XHRcdCksXG5cdFx0XHRpZGVudGlmaWVyLFxuXHRcdCksXG5cdCk7XG5cdHJldHVybiBpc1Jlc29sdmluZyggUkVEVUNFUl9LRVksIHNlbGVjdG9yTmFtZSwgaWRlbnRpZmllciwgcXVlcnlTdHJpbmcgKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGl0ZW1zIGZvciB0aGUgZ2l2ZW4gaWRlbnRpZmllciBhbmQgcXVlcnkgc3RyaW5nIGFyZSBiZWluZ1xuICogcmVxdWVzdGVkLlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGUgRGF0YSBzdGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZGVudGlmaWVyICBUaGUgaWRlbnRpZmllciBmb3IgdGhlIGl0ZW1zIGJlaW5nIHJlcXVlc3RlZFxuICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5U3RyaW5nIFRoZSBxdWVyeSBzdHJpbmcgZm9yIHRoZSByZXF1ZXN0XG4gKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIGl0ZW1zIGFyZSBiZWluZyByZXF1ZXN0ZWQgb3Igbm90LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZXF1ZXN0aW5nSXRlbXMoIHN0YXRlLCBpZGVudGlmaWVyLCBxdWVyeVN0cmluZyApIHtcblx0cmV0dXJuIGlzUmVxdWVzdGluZyggc3RhdGUsIGlkZW50aWZpZXIsICdnZXRJdGVtcycsIHF1ZXJ5U3RyaW5nICk7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBnZXQgZW50aXRpZXMgcmVxdWVzdCBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyByZXNvbHZlZFxuICogb3Igbm90LlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5U3RyaW5nXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIG1lYW5zIGVudGl0aWVzIChmb3IgdGhlIGdpdmVuIG1vZGVsKSBhcmUgYmVpbmdcbiAqIHJlcXVlc3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVxdWVzdGluZ0VudGl0aWVzKFxuXHRzdGF0ZSxcblx0bW9kZWxOYW1lLFxuXHRxdWVyeVN0cmluZ1xuKSB7XG5cdHJldHVybiBpc1JlcXVlc3RpbmcoIHN0YXRlLCBtb2RlbE5hbWUsICdnZXRFbnRpdGllcycsIHF1ZXJ5U3RyaW5nICk7XG59XG4iLCJleHBvcnQgY29uc3QgQUNUSU9OX1RZUEVTID0ge1xuXHRSRUNFSVZFX1NDSEVNQV9SRUNPUkQ6ICdSRUNFSVZFX1NDSEVNQV9SRUNPUkQnLFxuXHRSRUNFSVZFX0ZBQ1RPUllfRk9SX01PREVMOiAnUkVDRUlWRV9GQUNUT1JZX0ZPUl9NT0RFTCcsXG5cdFJFQ0VJVkVfUkVMQVRJT05fRU5EUE9JTlRfRk9SX01PREVMX0VOVElUWTpcblx0XHQnUkVDRUlWRV9SRUxBVElPTl9FTkRQT0lOVF9GT1JfTU9ERUxfRU5USVRZJyxcblx0UkVDRUlWRV9SRUxBVElPTl9TQ0hFTUE6ICdSRUNFSVZFX1JFTEFUSU9OX1NDSEVNQScsXG59O1xuIiwiLyoqXG4gKiBJbnRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IEFDVElPTl9UWVBFUyBhcyB0eXBlcyB9IGZyb20gJy4vYWN0aW9uLXR5cGVzJztcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFjdGlvbiBvYmplY3QgdXNlZCB0byB1cGRhdGUgdGhlIHN0b3JlIHdpdGggdGhlIHByb3ZpZGVkIHNjaGVtYVxuICogZm9yIHRoZSBwcm92aWRlZCBtb2RlbE5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYVxuICogQHJldHVybiB7e3R5cGU6IHN0cmluZywgbW9kZWxOYW1lOiAqLCBzY2hlbWF9fSAgVGhlIGFjdGlvbiBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNlaXZlU2NoZW1hRm9yTW9kZWwoIG1vZGVsTmFtZSwgc2NoZW1hID0ge30gKSB7XG5cdHJldHVybiB7XG5cdFx0dHlwZTogdHlwZXMuUkVDRUlWRV9TQ0hFTUFfUkVDT1JELFxuXHRcdG1vZGVsTmFtZSxcblx0XHRzY2hlbWEsXG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBhY3Rpb24gb2JqZWN0IHVzZWQgdG8gdXBkYXRlIHRoZSBzdG9yZSB3aXRoIHRoZSBwcm92aWRlZCBtb2RlbFxuICogZW50aXR5IGZhY3RvcnkgZm9yIHRoZSBwcm92aWRlZCBtb2RlbE5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtPYmplY3R9IGZhY3RvcnlcbiAqIEByZXR1cm4ge3t0eXBlOiBzdHJpbmcsIG1vZGVsTmFtZTogc3RyaW5nLCBmYWN0b3J5OiBPYmplY3R9fSBBbiBhY3Rpb25cbiAqIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY2VpdmVGYWN0b3J5Rm9yTW9kZWwoIG1vZGVsTmFtZSwgZmFjdG9yeSA9IHt9ICkge1xuXHRyZXR1cm4ge1xuXHRcdHR5cGU6IHR5cGVzLlJFQ0VJVkVfRkFDVE9SWV9GT1JfTU9ERUwsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGZhY3RvcnksXG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBhY3Rpb24gb2JqZWN0IHVzZWQgdG8gdXBkYXRlIHRoZSBzdG9yZSB3aXRoIHRoZSBwcm92aWRlZCByZWxhdGlvblxuICogZW5kcG9pbnQgZm9yIHRoZSBtb2RlbCBhbmQgaWQsIGFuZCBpdHMgcmVsYXRpb25zLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbnRpdHlJZFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uTmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IGVuZHBvaW50XG4gKiBAcmV0dXJuIHtcbiAqIFx0e1xuICogXHRcdG1vZGVsTmFtZTogKixcbiAqIFx0XHRlbmRwb2ludDogKixcbiAqIFx0XHRyZWxhdGlvbk5hbWU6ICosXG4gKiBcdFx0ZW50aXR5SWQ6ICosXG4gKiBcdFx0dHlwZTogc3RyaW5nXG4gKiBcdH1cbiAqIH0gQW4gYWN0aW9uIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY2VpdmVSZWxhdGlvbkVuZHBvaW50Rm9yTW9kZWxFbnRpdHkoXG5cdG1vZGVsTmFtZSxcblx0ZW50aXR5SWQsXG5cdHJlbGF0aW9uTmFtZSxcblx0ZW5kcG9pbnRcbikge1xuXHRyZXR1cm4ge1xuXHRcdHR5cGU6IHR5cGVzLlJFQ0VJVkVfUkVMQVRJT05fRU5EUE9JTlRfRk9SX01PREVMX0VOVElUWSxcblx0XHRtb2RlbE5hbWUsXG5cdFx0ZW50aXR5SWQsXG5cdFx0cmVsYXRpb25OYW1lLFxuXHRcdGVuZHBvaW50LFxuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVjZWl2ZVJlbGF0aW9uU2NoZW1hKFxuXHRtb2RlbE5hbWUsXG5cdHJlbGF0aW9uTmFtZSxcblx0cmVsYXRpb25TY2hlbWFcbikge1xuXHRyZXR1cm4ge1xuXHRcdHR5cGU6IHR5cGVzLlJFQ0VJVkVfUkVMQVRJT05fU0NIRU1BLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0cmVsYXRpb25TY2hlbWEsXG5cdH07XG59XG4iLCIvKipcbiAqIElkZW50aWZpZXIga2V5IGZvciB0aGlzIHN0b3JlIHJlZHVjZXIuXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgUkVEVUNFUl9LRVkgPSAnZXZlbnRlc3ByZXNzby9zY2hlbWEnO1xuXG5leHBvcnQgY29uc3QgSk9JTl9SRUxBVElPTl9UWVBFUyA9IFtcblx0J0VFX0hBQlRNX1JlbGF0aW9uJyxcblx0J0VFX0hBQlRNX0FueV9SZWxhdGlvbicsXG5dO1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqL1xuaW1wb3J0IHsgcmVnaXN0ZXJTdG9yZSB9IGZyb20gJ0B3b3JkcHJlc3MvZGF0YSc7XG5cbi8qKlxuICogSW50ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cbmltcG9ydCB7IFJFRFVDRVJfS0VZIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0ICogYXMgc2VsZWN0b3JzIGZyb20gJy4vc2VsZWN0b3JzJztcbmltcG9ydCAqIGFzIGFjdGlvbnMgZnJvbSAnLi9hY3Rpb25zJztcbmltcG9ydCAqIGFzIHJlc29sdmVycyBmcm9tICcuL3Jlc29sdmVycyc7XG5pbXBvcnQgcmVkdWNlciBmcm9tICcuL3JlZHVjZXJzJztcbmltcG9ydCBjb250cm9scyBmcm9tICcuLi9iYXNlLWNvbnRyb2xzJztcbmltcG9ydCB7IGNyZWF0ZUVudGl0eVNlbGVjdG9ycywgY3JlYXRlRW50aXR5UmVzb2x2ZXJzIH0gZnJvbSAnLi9tb2RlbCc7XG5cbi8qKlxuICogQ3JlYXRlcyBzcGVjaWZpYyBtb2RlbCBlbnRpdHkgc2VsZWN0b3JzIChnZXRGYWN0b3J5Rm9yRXZlbnQgZXRjKVxuICogQHR5cGUge09iamVjdDxGdW5jdGlvbj59XG4gKi9cbmNvbnN0IGVudGl0eVNlbGVjdG9ycyA9IGNyZWF0ZUVudGl0eVNlbGVjdG9ycyggc2VsZWN0b3JzICk7XG5cbi8qKlxuICogQ3JlYXRlcyBzcGVjaWZpYyBtb2RlbCBlbnRpdHkgcmVzb2x2ZXJzIChnZXRGYWN0b3J5Rm9yRXZlbnQgZXRjKVxuICogQHR5cGUge09iamVjdDxGdW5jdGlvbj59XG4gKi9cbmNvbnN0IGVudGl0eVJlc29sdmVycyA9IGNyZWF0ZUVudGl0eVJlc29sdmVycyggcmVzb2x2ZXJzICk7XG5cbi8qKlxuICogUmVnaXN0cmF0aW9uIG9mIHN0b3JlIGZvciBldmVudGVzcHJlc3NvL3NjaGVtYS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXJTdG9yZSggUkVEVUNFUl9LRVksIHtcblx0cmVkdWNlcixcblx0YWN0aW9ucyxcblx0Y29udHJvbHMsXG5cdHNlbGVjdG9yczogeyAuLi5zZWxlY3RvcnMsIC4uLmVudGl0eVNlbGVjdG9ycyB9LFxuXHRyZXNvbHZlcnM6IHsgLi4ucmVzb2x2ZXJzLCAuLi5lbnRpdHlSZXNvbHZlcnMgfSxcbn0gKTtcblxuZXhwb3J0IGNvbnN0IFNDSEVNQV9LRVkgPSBSRURVQ0VSX0tFWTtcbiIsIi8qKlxuICogRXh0ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cbmltcG9ydCB7IE1PREVMX05BTUVTIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vbW9kZWwnO1xuXG4vKipcbiAqIEludGVybmFsIGRlcGVuZGVuY2llc1xuICovXG5pbXBvcnQgeyBnZXRNZXRob2ROYW1lIH0gZnJvbSAnLi4vYmFzZS1tb2RlbCc7XG5pbXBvcnQgeyBpc1Jlc29sdmluZyB9IGZyb20gJy4uL2Jhc2Utc2VsZWN0b3JzJztcbmltcG9ydCB7IFJFRFVDRVJfS0VZIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG4vKipcbiAqIENyZWF0ZXMgc2VsZWN0b3JzIGZvciBlYWNoIHJlZ2lzdGVyZWQgbW9kZWwgbmFtZSB3cmFwcGluZyB0aGUgZ2VuZXJpYyBzb3VyY2VcbiAqIHNlbGVjdG9ycy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdDxmdW5jdGlvbj59IHNvdXJjZVxuICogQHJldHVybiB7T2JqZWN0PGZ1bmN0aW9uPn0gQWxsIHRoZSBnZW5lcmF0ZWQgc2VsZWN0b3JzIGZvciBlYWNoIG1vZGVsLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlRW50aXR5U2VsZWN0b3JzID0gKCBzb3VyY2UgKSA9PiBNT0RFTF9OQU1FUy5yZWR1Y2UoXG5cdCggc2VsZWN0b3JzLCBtb2RlbE5hbWUgKSA9PiB7XG5cdFx0Y29uc3Qgc2NoZW1hTWV0aG9kTmFtZSA9IGdldE1ldGhvZE5hbWUoIG1vZGVsTmFtZSwgJ3NjaGVtYScsICdnZXQnICk7XG5cdFx0Y29uc3QgZmFjdG9yeU1ldGhvZE5hbWUgPSBnZXRNZXRob2ROYW1lKCBtb2RlbE5hbWUsICdmYWN0b3J5JywgJ2dldCcgKTtcblx0XHRzZWxlY3RvcnNbIHNjaGVtYU1ldGhvZE5hbWUgXSA9IChcblx0XHRcdHN0YXRlXG5cdFx0KSA9PiBzb3VyY2UuZ2V0U2NoZW1hRm9yTW9kZWwoIHN0YXRlLCBtb2RlbE5hbWUgKTtcblx0XHRzZWxlY3RvcnNbIGdldE1ldGhvZE5hbWUoIG1vZGVsTmFtZSwgJ3NjaGVtYScsICdpc1JlcXVlc3RpbmcnICkgXSA9XG5cdFx0XHQoKSA9PiBpc1Jlc29sdmluZyggUkVEVUNFUl9LRVksIHNjaGVtYU1ldGhvZE5hbWUgKTtcblx0XHRzZWxlY3RvcnNbIGZhY3RvcnlNZXRob2ROYW1lIF0gPSAoXG5cdFx0XHRzdGF0ZVxuXHRcdCkgPT4gc291cmNlLmdldEZhY3RvcnlGb3JNb2RlbCggc3RhdGUsIG1vZGVsTmFtZSApO1xuXHRcdHNlbGVjdG9yc1sgZ2V0TWV0aG9kTmFtZSggbW9kZWxOYW1lLCAnZmFjdG9yeScsICdpc1JlcXVlc3RpbmcnICkgXSA9XG5cdFx0XHQoKSA9PiBpc1Jlc29sdmluZyggUkVEVUNFUl9LRVksIGZhY3RvcnlNZXRob2ROYW1lICk7XG5cdFx0cmV0dXJuIHNlbGVjdG9ycztcblx0fSxcblx0e31cbik7XG5cbi8qKlxuICogQ3JlYXRlcyByZXNvbHZlcnMgZm9yIGVhY2ggcmVnaXN0ZXJlZCBtb2RlbCBuYW1lIHdyYXBwaW5nIHRoZSBnZW5lcmljIHNvdXJjZVxuICogcmVzb2x2ZXJzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0PGZ1bmN0aW9uPn0gc291cmNlXG4gKiBAcmV0dXJuIHtPYmplY3Q8ZnVuY3Rpb24+fSBBbGwgdGhlIGdlbmVyYXRlZCByZXNvbHZlcnMgZm9yIGVhY2ggbW9kZWwuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVFbnRpdHlSZXNvbHZlcnMgPSAoIHNvdXJjZSApID0+IE1PREVMX05BTUVTLnJlZHVjZShcblx0KCByZXNvbHZlcnMsIG1vZGVsTmFtZSApID0+IHtcblx0XHRyZXNvbHZlcnNbIGdldE1ldGhvZE5hbWUoIG1vZGVsTmFtZSwgJ3NjaGVtYScsICdnZXQnICkgXSA9ICgpID0+XG5cdFx0XHRzb3VyY2UuZ2V0U2NoZW1hRm9yTW9kZWwoIG1vZGVsTmFtZSApO1xuXHRcdHJlc29sdmVyc1sgZ2V0TWV0aG9kTmFtZSggbW9kZWxOYW1lLCAnZmFjdG9yeScsICdnZXQnICkgXSA9ICgpID0+XG5cdFx0XHRzb3VyY2UuZ2V0RmFjdG9yeUZvck1vZGVsKCBtb2RlbE5hbWUgKTtcblx0XHRyZXR1cm4gcmVzb2x2ZXJzO1xuXHR9LFxuXHR7fVxuKTtcbiIsIi8qKlxuICogRXh0ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cbmltcG9ydCB7IGNvbWJpbmVSZWR1Y2VycyB9IGZyb20gJ0B3b3JkcHJlc3MvZGF0YSc7XG5pbXBvcnQgeyBub3JtYWxpemVFbnRpdHlJZCB9IGZyb20gJ0BldmVudGVzcHJlc3NvL2hlbHBlcnMnO1xuaW1wb3J0IHtcblx0cGx1cmFsTW9kZWxOYW1lLFxuXHRERUZBVUxUX1NDSEVNQV9TVEFURSxcblx0c2luZ3VsYXJNb2RlbE5hbWUsXG59IGZyb20gJ0BldmVudGVzcHJlc3NvL21vZGVsJztcbmltcG9ydCB7XG5cdGlzU2NoZW1hUmVzcG9uc2VPZk1vZGVsLFxuXHRpc01vZGVsRW50aXR5RmFjdG9yeU9mTW9kZWwsXG59IGZyb20gJ0BldmVudGVzcHJlc3NvL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHsgZnJvbUpTLCBNYXAgfSBmcm9tICdpbW11dGFibGUnO1xuaW1wb3J0IGlzU2hhbGxvd0VxdWFsIGZyb20gJ0B3b3JkcHJlc3MvaXMtc2hhbGxvdy1lcXVhbCc7XG5cbi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBBQ1RJT05fVFlQRVMgYXMgdHlwZXMgfSBmcm9tICcuL2FjdGlvbi10eXBlcyc7XG4vKipcbiAqIFJlZHVjZXIgZm9yIGEgbW9kZWwgc2NoZW1hLlxuICogQHBhcmFtIHtNYXB9IHN0YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uXG4gKiBAcmV0dXJuIHtNYXB9IFRoZSBuZXcgKG9yIG9yaWdpbmFsKSBzdGF0ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlY2VpdmVTY2hlbWEgPSAoXG5cdHN0YXRlID0gZnJvbUpTKCBERUZBVUxUX1NDSEVNQV9TVEFURS5zY2hlbWEgKSxcblx0YWN0aW9uXG4pID0+IHtcblx0Y29uc3QgeyB0eXBlLCBzY2hlbWEgfSA9IGFjdGlvbjtcblx0dHJ5IHtcblx0XHRjb25zdCBtb2RlbE5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggYWN0aW9uLm1vZGVsTmFtZSApO1xuXHRcdGlmIChcblx0XHRcdGlzU2NoZW1hUmVzcG9uc2VPZk1vZGVsKCBzY2hlbWEsIG1vZGVsTmFtZSApICYmXG5cdFx0XHR0eXBlID09PSB0eXBlcy5SRUNFSVZFX1NDSEVNQV9SRUNPUkRcblx0XHQpIHtcblx0XHRcdHJldHVybiBzdGF0ZS5zZXQoIG1vZGVsTmFtZSwgc2NoZW1hICk7XG5cdFx0fVxuXHR9IGNhdGNoICggZSApIHtcblx0XHRyZXR1cm4gc3RhdGU7XG5cdH1cblx0cmV0dXJuIHN0YXRlO1xufTtcblxuLyoqXG4gKiBSZWR1Y2VyIGZvciBhIG1vZGVsIGZhY3RvcnlcbiAqIEBwYXJhbSB7TWFwfSBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblxuICogQHJldHVybiB7TWFwfSB0aGUgbmV3IChvciBvcmlnaW5hbCkgc3RhdGUuXG4gKi9cbmV4cG9ydCBjb25zdCByZWNlaXZlRmFjdG9yeSA9IChcblx0c3RhdGUgPSBmcm9tSlMoIERFRkFVTFRfU0NIRU1BX1NUQVRFLmZhY3RvcnkgKSxcblx0YWN0aW9uXG4pID0+IHtcblx0Y29uc3QgeyB0eXBlLCBmYWN0b3J5IH0gPSBhY3Rpb247XG5cdHRyeSB7XG5cdFx0Y29uc3QgbW9kZWxOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIGFjdGlvbi5tb2RlbE5hbWUgKTtcblx0XHRpZiAoXG5cdFx0XHRpc01vZGVsRW50aXR5RmFjdG9yeU9mTW9kZWwoIGZhY3RvcnksIG1vZGVsTmFtZSApICYmXG5cdFx0XHR0eXBlID09PSB0eXBlcy5SRUNFSVZFX0ZBQ1RPUllfRk9SX01PREVMXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gc3RhdGUuc2V0KCBtb2RlbE5hbWUsIGZhY3RvcnkgKTtcblx0XHR9XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHJldHVybiBzdGF0ZTtcblx0fVxuXHRyZXR1cm4gc3RhdGU7XG59O1xuXG4vKipcbiAqIFJlZHVjZXIgZm9yIHJlbGF0aW9uIGVuZHBvaW50cy5cbiAqXG4gKiBAcGFyYW0ge01hcH1zdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblxuICogQHJldHVybiB7TWFwfSBOZXcgb3Igb3JpZ2luYWwgc3RhdGUuXG4gKi9cbmV4cG9ydCBjb25zdCByZWNlaXZlUmVsYXRpb25FbmRwb2ludEZvckVudGl0eSA9IChcblx0c3RhdGUgPSBmcm9tSlMoIERFRkFVTFRfU0NIRU1BX1NUQVRFLnJlbGF0aW9uRW5kcG9pbnRzICksXG5cdGFjdGlvblxuKSA9PiB7XG5cdHRyeSB7XG5cdFx0Y29uc3QgeyB0eXBlLCBlbnRpdHlJZCwgZW5kcG9pbnQgfSA9IGFjdGlvbjtcblx0XHRjb25zdCBtb2RlbE5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggYWN0aW9uLm1vZGVsTmFtZSApO1xuXHRcdGNvbnN0IHJlbGF0aW9uTmFtZSA9IHBsdXJhbE1vZGVsTmFtZSggYWN0aW9uLnJlbGF0aW9uTmFtZSApO1xuXHRcdGlmICggdHlwZSA9PT0gdHlwZXMuUkVDRUlWRV9SRUxBVElPTl9FTkRQT0lOVF9GT1JfTU9ERUxfRU5USVRZICkge1xuXHRcdFx0cmV0dXJuIHN0YXRlLnNldEluKFxuXHRcdFx0XHRbIG1vZGVsTmFtZSwgbm9ybWFsaXplRW50aXR5SWQoIGVudGl0eUlkICksIHJlbGF0aW9uTmFtZSBdLFxuXHRcdFx0XHRlbmRwb2ludFxuXHRcdFx0KTtcblx0XHR9XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHJldHVybiBzdGF0ZTtcblx0fVxuXHRyZXR1cm4gc3RhdGU7XG59O1xuXG4vKipcbiAqIFJlZHVjZXIgZm9yIHJlbGF0aW9uIHNjaGVtYVxuICpcbiAqIEBwYXJhbSB7TWFwfSBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblxuICogQHJldHVybiB7TWFwfSBOZXcgb3Igb3JpZ2luYWwgc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IHJlY2VpdmVSZWxhdGlvblNjaGVtYSA9ICggc3RhdGUgPSBNYXAoKSwgYWN0aW9uICkgPT4ge1xuXHRpZiAoIGFjdGlvbi50eXBlID09PSB0eXBlcy5SRUNFSVZFX1JFTEFUSU9OX1NDSEVNQSApIHtcblx0XHRjb25zdCBtb2RlbE5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggYWN0aW9uLm1vZGVsTmFtZSApO1xuXHRcdGNvbnN0IHJlbGF0aW9uTmFtZSA9IHBsdXJhbE1vZGVsTmFtZSggYWN0aW9uLnJlbGF0aW9uTmFtZSApO1xuXHRcdGlmICggaXNTaGFsbG93RXF1YWwoXG5cdFx0XHRzdGF0ZS5nZXRJbiggWyBtb2RlbE5hbWUsIHJlbGF0aW9uTmFtZSBdLCB7fSApLFxuXHRcdFx0YWN0aW9uLnJlbGF0aW9uU2NoZW1hLFxuXHRcdCkgKSB7XG5cdFx0XHRyZXR1cm4gc3RhdGU7XG5cdFx0fVxuXHRcdHJldHVybiBzdGF0ZS5zZXRJbihcblx0XHRcdFsgbW9kZWxOYW1lLCByZWxhdGlvbk5hbWUgXSxcblx0XHRcdGFjdGlvbi5yZWxhdGlvblNjaGVtYVxuXHRcdCk7XG5cdH1cblx0cmV0dXJuIHN0YXRlO1xufTtcblxuLyoqXG4gKiBCZSBhd2FyZSB0aGF0IHRoZSByb290IHN0YXRlIGlzIGEgcGxhaW4gb2JqZWN0IGJ1dCBlYWNoIHNsaWNlICgnc2NoZW1hJyxcbiAqICdmYWN0b3J5JywgJ3JlbGF0aW9uRW5kcG9pbnRzJykgaXMgYW4gaW1tdXRhYmxlIE1hcC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY29tYmluZVJlZHVjZXJzKCB7XG5cdHNjaGVtYTogcmVjZWl2ZVNjaGVtYSxcblx0ZmFjdG9yeTogcmVjZWl2ZUZhY3RvcnksXG5cdHJlbGF0aW9uRW5kcG9pbnRzOiByZWNlaXZlUmVsYXRpb25FbmRwb2ludEZvckVudGl0eSxcblx0cmVsYXRpb25TY2hlbWE6IHJlY2VpdmVSZWxhdGlvblNjaGVtYSxcbn0gKTtcbiIsIi8qKlxuICogRXh0ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cbmltcG9ydCB7XG5cdGlzU2NoZW1hUmVzcG9uc2VPZk1vZGVsLFxuXHRpc01vZGVsRW50aXR5LFxufSBmcm9tICdAZXZlbnRlc3ByZXNzby92YWxpZGF0b3JzJztcbmltcG9ydCB7XG5cdGdldEVuZHBvaW50LFxuXHRzdHJpcEJhc2VSb3V0ZUZyb21VcmwsXG5cdGNyZWF0ZUVudGl0eUZhY3RvcnksXG5cdE1PREVMX1BSRUZJWEVTLFxuXHRwbHVyYWxNb2RlbE5hbWUsXG5cdHNpbmd1bGFyTW9kZWxOYW1lLFxufSBmcm9tICdAZXZlbnRlc3ByZXNzby9tb2RlbCc7XG5pbXBvcnQgeyBpc1VuZGVmaW5lZCB9IGZyb20gJ2xvZGFzaCc7XG5cbi8qKlxuICogSW50ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cbmltcG9ydCB7XG5cdHJlY2VpdmVTY2hlbWFGb3JNb2RlbCxcblx0cmVjZWl2ZUZhY3RvcnlGb3JNb2RlbCxcblx0cmVjZWl2ZVJlbGF0aW9uRW5kcG9pbnRGb3JNb2RlbEVudGl0eSxcblx0cmVjZWl2ZVJlbGF0aW9uU2NoZW1hLFxufSBmcm9tICcuL2FjdGlvbnMnO1xuaW1wb3J0IHsgZmV0Y2gsIHJlc29sdmVTZWxlY3QgfSBmcm9tICcuLi9iYXNlLWNvbnRyb2xzJztcbmltcG9ydCB7IFJFRFVDRVJfS0VZIGFzIENPUkVfUkVEVUNFUl9LRVkgfSBmcm9tICcuLi9jb3JlL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuXHRSRURVQ0VSX0tFWSBhcyBTQ0hFTUFfUkVEVUNFUl9LRVksXG5cdEpPSU5fUkVMQVRJT05fVFlQRVMsXG59IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBBIHJlc29sdmVyIGZvciBnZXR0aW5nIHRoZSBzY2hlbWEgZm9yIGEgZ2l2ZW4gbW9kZWwgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0cmlldmVkIHNjaGVtYS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uKiBnZXRTY2hlbWFGb3JNb2RlbCggbW9kZWxOYW1lICkge1xuXHRjb25zdCBwYXRoID0gZ2V0RW5kcG9pbnQoIHNpbmd1bGFyTW9kZWxOYW1lKCBtb2RlbE5hbWUgKSApO1xuXHRjb25zdCBzY2hlbWEgPSB5aWVsZCBmZXRjaCggeyBwYXRoLCBtZXRob2Q6ICdPUFRJT05TJyB9ICk7XG5cdHlpZWxkIHJlY2VpdmVTY2hlbWFGb3JNb2RlbCggbW9kZWxOYW1lLCBzY2hlbWEgKTtcblx0cmV0dXJuIHNjaGVtYTtcbn1cblxuLyoqXG4gKiBBIHJlc29sdmVyIGZvciBnZXR0aW5nIHRoZSBtb2RlbCBlbnRpdHkgZmFjdG9yeSBmb3IgYSBnaXZlbiBtb2RlbCBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYVxuICogQHJldHVybiB7T2JqZWN0fG51bGx9IHJldHJpZXZlZCBmYWN0b3J5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiogZ2V0RmFjdG9yeUZvck1vZGVsKCBtb2RlbE5hbWUsIHNjaGVtYSA9IHt9ICkge1xuXHRpZiAoICEgaXNTY2hlbWFSZXNwb25zZU9mTW9kZWwoIHNjaGVtYSwgbW9kZWxOYW1lICkgKSB7XG5cdFx0c2NoZW1hID0geWllbGQgcmVzb2x2ZVNlbGVjdChcblx0XHRcdFNDSEVNQV9SRURVQ0VSX0tFWSxcblx0XHRcdCdnZXRTY2hlbWFGb3JNb2RlbCcsXG5cdFx0XHRtb2RlbE5hbWVcblx0XHQpO1xuXHR9XG5cdGlmICggISBpc1NjaGVtYVJlc3BvbnNlT2ZNb2RlbCggc2NoZW1hLCBtb2RlbE5hbWUgKSApIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHRjb25zdCBmYWN0b3J5ID0gY3JlYXRlRW50aXR5RmFjdG9yeShcblx0XHRtb2RlbE5hbWUsXG5cdFx0c2NoZW1hLnNjaGVtYSxcblx0XHRNT0RFTF9QUkVGSVhFUyggbW9kZWxOYW1lIClcblx0KTtcblx0eWllbGQgcmVjZWl2ZUZhY3RvcnlGb3JNb2RlbCggbW9kZWxOYW1lLCBmYWN0b3J5ICk7XG5cdHJldHVybiBmYWN0b3J5O1xufVxuXG4vKipcbiAqIEEgcmVzb2x2ZXIgZm9yIGdldHRpbmcgdGhlIHJlbGF0aW9uIGVuZHBvaW50IGZvciBhIGdpdmVuIG1vZGVsLCBpdCdzIGlkLCBhbmRcbiAqIHRoZSByZXF1ZXN0ZWQgcmVsYXRpb24uXG4gKlxuICogVGhlIEVFIFJFU1QgYXBpIG5hbWVzIHJlbGF0aW9ucyBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGV5IHRoZXJlIGFyZSBzaW5ndWxhclxuICogb3IgcGx1cmFsIHJlbGF0aW9ucyBvbiBhIGdpdmVuIG1vZGVsIChlZy4gUmVnaXN0cmF0aW9ucyBoYXZlIG9uZSBldmVudFxuICogcmVsYXRpb24sIGJ1dCBFdmVudHMgY2FuIGhhdmUgbXVsdGlwbGUgZGF0ZXRpbWVzKS4gIFRoaXMgbWVhbnMgdGhlIG9ubHkgd2F5XG4gKiB0byBkZXJpdmUgYW4gYWNjdXJhdGUgZW5kcG9pbnQgZm9yIGEgZ2l2ZW4gcmVsYXRpb24gcmVxdWVzdCBvbiBhbiBlbnRpdHkgaXNcbiAqIHRvIHJldHJpZXZlIHRoZSBlbnRpdHkgZnJvbSB0aGUgcmVzb3VyY2UgYW5kIGRlcml2ZSB0aGUgZW5kcG9pbnQgZnJvbSB0aGVcbiAqIGxpbmtzIGluIHRoZSByZXNwb25zZS5cbiAqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IGVudGl0eUlkXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25Nb2RlbE5hbWVcbiAqIEByZXR1cm4ge0l0ZXJhYmxlSXRlcmF0b3I8Kj58c3RyaW5nfSBBIGdlbmVyYXRvciBvciB0aGUgZGVyaXZlZCBlbmRwb2ludC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uKiBnZXRSZWxhdGlvbkVuZHBvaW50Rm9yRW50aXR5SWQoXG5cdG1vZGVsTmFtZSxcblx0ZW50aXR5SWQsXG5cdHJlbGF0aW9uTW9kZWxOYW1lXG4pIHtcblx0Ly8gZmlyc3QgYXR0ZW1wdCB0byBnZXQgdGhlIHJlbGF0aW9uIGVuZHBvaW50IGZyb20gdGhlIGVudGl0eSB0aGF0IG1pZ2h0XG5cdC8vIGFscmVhZHkgYmUgaW4gY29yZSBzdGF0ZS5cblx0Y29uc3QgZW50aXR5ID0geWllbGQgcmVzb2x2ZVNlbGVjdChcblx0XHRDT1JFX1JFRFVDRVJfS0VZLFxuXHRcdCdnZXRFbnRpdHlCeUlkJyxcblx0XHRtb2RlbE5hbWUsXG5cdFx0ZW50aXR5SWRcblx0KTtcblx0Y29uc3QgcGx1cmFsUmVsYXRpb25OYW1lID0gcGx1cmFsTW9kZWxOYW1lKCByZWxhdGlvbk1vZGVsTmFtZSApO1xuXHRsZXQgZW5kcG9pbnQgPSAnJztcblx0aWYgKCBpc01vZGVsRW50aXR5KCBlbnRpdHkgKSAmJiBlbnRpdHlbIHBsdXJhbFJlbGF0aW9uTmFtZSArICdSZXNvdXJjZScgXSApIHtcblx0XHRlbmRwb2ludCA9IHN0cmlwQmFzZVJvdXRlRnJvbVVybChcblx0XHRcdGVudGl0eVsgcGx1cmFsUmVsYXRpb25OYW1lICsgJ1Jlc291cmNlJyBdLnJlc291cmNlTGlua1xuXHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0Y29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChcblx0XHRcdHtcblx0XHRcdFx0cGF0aDogZ2V0RW5kcG9pbnQoIG1vZGVsTmFtZSApICsgJy8nICsgZW50aXR5SWQsXG5cdFx0XHR9XG5cdFx0KTtcblx0XHRpZiAoICEgcmVzcG9uc2UuX2xpbmtzICkge1xuXHRcdFx0cmV0dXJuICcnO1xuXHRcdH1cblx0XHRjb25zdCBsaW5rcyA9IHJlc3BvbnNlLl9saW5rcyB8fCB7fTtcblx0XHRjb25zdCBiYXNlUmVsYXRpb25QYXRoID0gJ2h0dHBzOi8vYXBpLmV2ZW50ZXNwcmVzc28uY29tLyc7XG5cdFx0ZW5kcG9pbnQgPSBsaW5rc1tcblx0XHRcdGJhc2VSZWxhdGlvblBhdGggKyBzaW5ndWxhck1vZGVsTmFtZSggcmVsYXRpb25Nb2RlbE5hbWUgKVxuXHRcdF0gfHwgJyc7XG5cdFx0ZW5kcG9pbnQgPSAoIGVuZHBvaW50ID09PSAnJyAmJiBsaW5rc1tcblx0XHRcdGJhc2VSZWxhdGlvblBhdGggKyBwbHVyYWxSZWxhdGlvbk5hbWVcblx0XHRdICkgfHwgZW5kcG9pbnQ7XG5cdH1cblx0aWYgKCBlbmRwb2ludCApIHtcblx0XHR5aWVsZCByZWNlaXZlUmVsYXRpb25FbmRwb2ludEZvck1vZGVsRW50aXR5KFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0ZW50aXR5SWQsXG5cdFx0XHRyZWxhdGlvbk1vZGVsTmFtZSxcblx0XHRcdGVuZHBvaW50XG5cdFx0KTtcblx0fVxuXHRyZXR1cm4gZW5kcG9pbnQ7XG59XG5cbi8qKlxuICogQSByZXNvbHZlciBmb3IgcmV0dXJuaW5nIHdoZXRoZXIgdGhlIGdpdmVuIG1vZGVsTmFtZSBhbmQgcmVsYXRpb25OYW1lIGhhdmVcbiAqIGEgam9pbiB0YWJsZSBmb3IgcmVwcmVzZW50aW5nIHRoZWlyIHJlbGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbk5hbWVcbiAqIEByZXR1cm4ge2Jvb2xlYW59ICBUcnVlIG1lYW5zIHRoZXJlIGlzIGEgam9pbiB0YWJsZSwgZmFsc2UgbWVhbnMgdGhlcmUgaXNuJ3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiogaGFzSm9pblRhYmxlUmVsYXRpb24oIG1vZGVsTmFtZSwgcmVsYXRpb25OYW1lICkge1xuXHRjb25zdCByZWxhdGlvblR5cGUgPSB5aWVsZCByZXNvbHZlU2VsZWN0KFxuXHRcdFNDSEVNQV9SRURVQ0VSX0tFWSxcblx0XHQnZ2V0UmVsYXRpb25UeXBlJyxcblx0XHRtb2RlbE5hbWUsXG5cdFx0cmVsYXRpb25OYW1lLFxuXHQpO1xuXHRyZXR1cm4gSk9JTl9SRUxBVElPTl9UWVBFUy5pbmRleE9mKCByZWxhdGlvblR5cGUgKSA+IC0xO1xufVxuXG4vKipcbiAqIEEgcmVzb2x2ZXIgZm9yIGdldHRpbmcgdGhlIHJlbGF0aW9uIHR5cGUgZGVzY3JpYmluZyB0aGUgcmVsYXRpb24gYmV0d2VlblxuICogbW9kZWxOYW1lIGFuZCByZWxhdGlvbk5hbWVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25OYW1lXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICBUaGUgcmVsYXRpb24gdHlwZSB0byBkZXNjcmliZSB0aGUgcmVsYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uKiBnZXRSZWxhdGlvblR5cGUoIG1vZGVsTmFtZSwgcmVsYXRpb25OYW1lICkge1xuXHRjb25zdCByZWxhdGlvblNjaGVtYSA9IHlpZWxkIHJlc29sdmVTZWxlY3QoXG5cdFx0U0NIRU1BX1JFRFVDRVJfS0VZLFxuXHRcdCdnZXRSZWxhdGlvblNjaGVtYScsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdHJlbGF0aW9uTmFtZVxuXHQpO1xuXHRyZXR1cm4gcmVsYXRpb25TY2hlbWEgIT09IG51bGwgPyByZWxhdGlvblNjaGVtYS5yZWxhdGlvbl90eXBlIDogJyc7XG59XG5cbi8qKlxuICogQSByZXNvbHZlciBmb3IgcmV0cmlldmluZyB0aGUgcmVsYXRpb24gc2NoZW1hIGZyb20gdGhlIHNlcnZlciBmb3IgdGhlIGdpdmVuXG4gKiBtb2RlbE5hbWUgYW5kIHJlbGF0aW9uTmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25OYW1lXG4gKiBAdGhyb3dzIEVycm9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiogZ2V0UmVsYXRpb25TY2hlbWEoIG1vZGVsTmFtZSwgcmVsYXRpb25OYW1lICkge1xuXHRtb2RlbE5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lICk7XG5cdGNvbnN0IHBsdXJhbFJlbGF0aW9uTmFtZSA9IHBsdXJhbE1vZGVsTmFtZSggcmVsYXRpb25OYW1lICk7XG5cdGNvbnN0IHNpbmd1bGFyUmVsYXRpb25OYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIHJlbGF0aW9uTmFtZSApO1xuXHRjb25zdCBzY2hlbWEgPSB5aWVsZCByZXNvbHZlU2VsZWN0KFxuXHRcdFNDSEVNQV9SRURVQ0VSX0tFWSxcblx0XHQnZ2V0U2NoZW1hRm9yTW9kZWwnLFxuXHRcdG1vZGVsTmFtZVxuXHQpO1xuXHRpZiAoIHNjaGVtYSA9PT0gbnVsbCApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHQnVGhlICcgKyBtb2RlbE5hbWUgKyAnIGRvZXMgbm90IGhhdmUgYSBzY2hlbWEnXG5cdFx0KTtcblx0fVxuXHQvLyBpcyB0aGVyZSBhIHNjaGVtYSBmb3IgcGx1cmFsIHJlbGF0aW9uIG5hbWU/XG5cdGxldCB0eXBlU2NoZW1hID0gc2NoZW1hLnNjaGVtYS5wcm9wZXJ0aWVzWyBwbHVyYWxSZWxhdGlvbk5hbWUgXSB8fCBudWxsO1xuXHR0eXBlU2NoZW1hID0gdHlwZVNjaGVtYSA9PT0gbnVsbCAmJlxuXHRcdCEgaXNVbmRlZmluZWQoIHNjaGVtYS5zY2hlbWEucHJvcGVydGllc1sgc2luZ3VsYXJSZWxhdGlvbk5hbWUgXSApID9cblx0XHRzY2hlbWEuc2NoZW1hLnByb3BlcnRpZXNbIHNpbmd1bGFyUmVsYXRpb25OYW1lIF0gOlxuXHRcdHR5cGVTY2hlbWE7XG5cdGlmICggdHlwZVNjaGVtYSA9PT0gbnVsbCApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHQnVGhlcmUgaXMgbm8gcmVsYXRpb24gZm9yICcgKyByZWxhdGlvbk5hbWUgKyAnIG9uIHRoZSAnICtcblx0XHRcdCdtb2RlbCAnICsgbW9kZWxOYW1lXG5cdFx0KTtcblx0fVxuXHR5aWVsZCByZWNlaXZlUmVsYXRpb25TY2hlbWEoXG5cdFx0bW9kZWxOYW1lLFxuXHRcdHJlbGF0aW9uTmFtZSxcblx0XHR0eXBlU2NoZW1hXG5cdCk7XG59XG4iLCIvKipcbiAqIEludGVybmFsIGRlcGVuZGVuY2llc1xuICovXG5pbXBvcnQgeyBpc1Jlc29sdmluZywgaGFzRmluaXNoZWRSZXNvbHZpbmcgfSBmcm9tICcuLi9iYXNlLXNlbGVjdG9ycyc7XG5pbXBvcnQgeyBSRURVQ0VSX0tFWSwgSk9JTl9SRUxBVElPTl9UWVBFUyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IE1hcCB9IGZyb20gJ2ltbXV0YWJsZSc7XG5cbi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBwbHVyYWxNb2RlbE5hbWUsIHNpbmd1bGFyTW9kZWxOYW1lIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vbW9kZWwnO1xuaW1wb3J0IHsgbm9ybWFsaXplRW50aXR5SWQgfSBmcm9tICdAZXZlbnRlc3ByZXNzby9oZWxwZXJzJztcblxuLyoqXG4gKiBTZWxlY3RvciBmb3IgcmV0dXJuaW5nIHRoZSBzY2hlbWEgb2JqZWN0IGZvciBhIGdpdmVuIG1vZGVsIG5hbWUgZnJvbSB0aGVcbiAqIHN0YXRlLlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBzY2hlbWEgb2JqZWN0IG9yIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNjaGVtYUZvck1vZGVsKCBzdGF0ZSwgbW9kZWxOYW1lICkge1xuXHRyZXR1cm4gc3RhdGUuc2NoZW1hLmdldCggc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApLCBudWxsICk7XG59XG5cbi8qKlxuICogU2VsZWN0b3IgZm9yIHJldHVybmluZyB3aGV0aGVyIHRoZSBzY2hlbWEgaXMgYmVpbmcgcmVxdWVzdGVkIG9yIG5vdCBmb3IgdGhlXG4gKiBnaXZlbiBtb2RlbCBuYW1lLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHJldHVybiB7Ym9vbGVhbn0gIFRydWUgbWVhbnMgaXRzIGJlaW5nIHJlcXVlc3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVxdWVzdGluZ1NjaGVtYUZvck1vZGVsKCBzdGF0ZSwgbW9kZWxOYW1lICkge1xuXHRyZXR1cm4gaXNSZXNvbHZpbmcoXG5cdFx0UkVEVUNFUl9LRVksXG5cdFx0J2dldFNjaGVtYUZvck1vZGVsJyxcblx0XHRzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lIClcblx0KTtcbn1cblxuLyoqXG4gKiBTZWxlY3RvciBmb3IgcmV0dXJuaW5nIHdoZXRoZXIgdGhlIHNjaGVtYSBoYXMgYmVlbiByZXNvbHZlZCBvciBub3QgZm9yIHRoZVxuICogZ2l2ZW4gbW9kZWwgbmFtZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBtZWFucyB0aGF0IHRoZSBzY2hlbWEgaGFzIGZpbmlzaGVkIHJlc29sdmluZyBmb3IgdGhpc1xuICogbW9kZWwgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1Jlc29sdmVkU2NoZW1hRm9yTW9kZWwoIHN0YXRlLCBtb2RlbE5hbWUgKSB7XG5cdHJldHVybiBoYXNGaW5pc2hlZFJlc29sdmluZyhcblx0XHRSRURVQ0VSX0tFWSxcblx0XHQnZ2V0U2NoZW1hRm9yTW9kZWwnLFxuXHRcdHNpbmd1bGFyTW9kZWxOYW1lKCBtb2RlbE5hbWUgKVxuXHQpO1xufVxuXG4vKipcbiAqIFNlbGVjdG9yIGZvciByZXR1cm5pbmcgdGhlIG1vZGVsIGVudGl0eSBmYWN0b3J5IG9iamVjdCBmb3IgYSBnaXZlblxuICogbW9kZWwgbmFtZSBmcm9tIHRoZSBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyB0aGUgbW9kZWwgZW50aXR5IGZhY3Rvcnkgb3IgbnVsbCBpZiBpdCBkb2Vzbid0XG4gKiBleGlzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZhY3RvcnlGb3JNb2RlbCggc3RhdGUsIG1vZGVsTmFtZSApIHtcblx0Y29uc3QgZmFjdG9yeSA9IHN0YXRlLmZhY3RvcnkuZ2V0KCBzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lICksIG51bGwgKTtcblx0cmV0dXJuICEgKCBmYWN0b3J5IGluc3RhbmNlb2YgTWFwICkgPyBmYWN0b3J5IDogbnVsbDtcbn1cblxuLyoqXG4gKiBTZWxlY3RvciBmb3IgcmV0dXJuaW5nIHdoZXRoZXIgdGhlIG1vZGVsIGVudGl0eSBmYWN0b3J5IGlzIGJlaW5nIHJlcXVlc3RlZFxuICogb3Igbm90IGZvciB0aGUgZ2l2ZW4gbW9kZWwgbmFtZSBmcm9tIHRoZSBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEByZXR1cm4ge2Jvb2xlYW59ICBUcnVlIG1lYW5zIGl0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVxdWVzdGluZ0ZhY3RvcnlGb3JNb2RlbCggc3RhdGUsIG1vZGVsTmFtZSApIHtcblx0cmV0dXJuIGlzUmVzb2x2aW5nKFxuXHRcdFJFRFVDRVJfS0VZLFxuXHRcdCdnZXRGYWN0b3J5Rm9yTW9kZWwnLFxuXHRcdHNpbmd1bGFyTW9kZWxOYW1lKCBtb2RlbE5hbWUgKVxuXHQpO1xufVxuXG4vKipcbiAqIFNlbGVjdG9yIGZvciByZXR1cm5pbmcgd2hldGhlciB0aGUgZmFjdG9yeSBoYXMgYmVlbiByZXNvbHZlZCBvciBub3QgZm9yIHRoZVxuICogZ2l2ZW4gbW9kZWwgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgbWVhbnMgdGhhdCB0aGUgZmFjdG9yeSBoYXMgZmluaXNoZWQgcmVzb2x2aW5nIGZvciB0aGlzXG4gKiBtb2RlbCBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzUmVzb2x2ZWRGYWN0b3J5Rm9yTW9kZWwoIHN0YXRlLCBtb2RlbE5hbWUgKSB7XG5cdHJldHVybiBoYXNGaW5pc2hlZFJlc29sdmluZyhcblx0XHRSRURVQ0VSX0tFWSxcblx0XHQnZ2V0RmFjdG9yeUZvck1vZGVsJyxcblx0XHRzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lIClcblx0KTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIHJlbGF0aW9uIGVuZHBvaW50IGZvciB0aGUgZ2l2ZW4gbW9kZWwsIGVudGl0eSBpZCBhbmQgcmVsYXRpb24uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IGVudGl0eUlkXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25Nb2RlbE5hbWVcbiAqIEByZXR1cm4ge3N0cmluZ30gUmV0dXJucyB0aGUgcmVsYXRpb24gZW5kcG9pbnQgaWYgYXZhaWxhYmxlIG9yIGFuIGVtcHR5XG4gKiBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWxhdGlvbkVuZHBvaW50Rm9yRW50aXR5SWQoXG5cdHN0YXRlLFxuXHRtb2RlbE5hbWUsXG5cdGVudGl0eUlkLFxuXHRyZWxhdGlvbk1vZGVsTmFtZVxuKSB7XG5cdG1vZGVsTmFtZSA9IHNpbmd1bGFyTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0cmVsYXRpb25Nb2RlbE5hbWUgPSBwbHVyYWxNb2RlbE5hbWUoIHJlbGF0aW9uTW9kZWxOYW1lICk7XG5cdGVudGl0eUlkID0gbm9ybWFsaXplRW50aXR5SWQoIGVudGl0eUlkICk7XG5cdHJldHVybiBzdGF0ZS5yZWxhdGlvbkVuZHBvaW50cy5nZXRJbihcblx0XHRbIG1vZGVsTmFtZSwgZW50aXR5SWQsIHJlbGF0aW9uTW9kZWxOYW1lIF1cblx0KSB8fCAnJztcbn1cblxuLyoqXG4gKiBTZWxlY3RvciBmb3IgcmV0dXJuaW5nIHdoZXRoZXIgdGhlIHJlbGF0aW9uIGVuZHBvaW50IGlzIGJlaW5nIHJlcXVlc3RlZFxuICogb3Igbm90IGZvciB0aGUgZ2l2ZW4gbW9kZWwgbmFtZSwgZW50aXR5IGlkLCBhbmQgcmVsYXRpb24gZnJvbSB0aGUgc3RhdGUuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gZW50aXR5SWRcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbk1vZGVsTmFtZVxuICogQHJldHVybiB7Ym9vbGVhbn0gIFRydWUgbWVhbnMgaXQgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZXF1ZXN0aW5nUmVsYXRpb25FbmRwb2ludEZvckVudGl0eUlkKFxuXHRzdGF0ZSxcblx0bW9kZWxOYW1lLFxuXHRlbnRpdHlJZCxcblx0cmVsYXRpb25Nb2RlbE5hbWVcbikge1xuXHRtb2RlbE5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lICk7XG5cdGVudGl0eUlkID0gbm9ybWFsaXplRW50aXR5SWQoIGVudGl0eUlkICk7XG5cdHJlbGF0aW9uTW9kZWxOYW1lID0gcGx1cmFsTW9kZWxOYW1lKCByZWxhdGlvbk1vZGVsTmFtZSApO1xuXHRyZXR1cm4gaXNSZXNvbHZpbmcoXG5cdFx0UkVEVUNFUl9LRVksXG5cdFx0J2dldFJlbGF0aW9uRW5kcG9pbnRGb3JFbnRpdHlJZCcsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkLFxuXHRcdHJlbGF0aW9uTW9kZWxOYW1lLFxuXHQpO1xufVxuXG4vKipcbiAqIFNlbGVjdG9yIHJldHVybmluZyB3aGV0aGVyIHRoZSByZWxhdGlvbiBiZXR3ZWVuIHRoZSBnaXZlbiBtb2RlbCBuYW1lIGFuZFxuICogcmVsYXRpb24gbmFtZSBoYXMgYSBqb2luIHRhYmxlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uTmFtZVxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBtZWFucyB0aGVyZSBpcyBhIGpvaW4gdGFibGUsIGZhbHNlIG1lYW5zIHRoZXJlIGlzbid0LlxuICovXG5leHBvcnQgY29uc3QgaGFzSm9pblRhYmxlUmVsYXRpb24gPSAoIHN0YXRlLCBtb2RlbE5hbWUsIHJlbGF0aW9uTmFtZSApID0+IHtcblx0bW9kZWxOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRyZWxhdGlvbk5hbWUgPSBwbHVyYWxNb2RlbE5hbWUoIHJlbGF0aW9uTmFtZSApO1xuXHRjb25zdCByZWxhdGlvblR5cGUgPSBnZXRSZWxhdGlvblR5cGUoIHN0YXRlLCBtb2RlbE5hbWUsIHJlbGF0aW9uTmFtZSApO1xuXHRyZXR1cm4gSk9JTl9SRUxBVElPTl9UWVBFUy5pbmRleE9mKCByZWxhdGlvblR5cGUgKSA+IC0xO1xufTtcblxuLyoqXG4gKiBTZWxlY3RvciByZXR1cm5pbmcgdGhlIHJlbGF0aW9uIHR5cGUgZGVzY3JpYmluZyB0aGUgcmVsYXRpb24gYmV0d2VlbiB0aGVcbiAqIGdpdmVuIG1vZGVsIG5hbWUgYW5kIHJlbGF0aW9uIG5hbWUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25OYW1lXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICBUaGUgcmVsYXRpb24gdHlwZSAoZWcuIFwiRUVfSEFCVE1fUmVsYXRpb25cIilcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFJlbGF0aW9uVHlwZSA9ICggc3RhdGUsIG1vZGVsTmFtZSwgcmVsYXRpb25OYW1lICkgPT4ge1xuXHRtb2RlbE5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lICk7XG5cdHJlbGF0aW9uTmFtZSA9IHBsdXJhbE1vZGVsTmFtZSggcmVsYXRpb25OYW1lICk7XG5cdGNvbnN0IHJlbGF0aW9uU2NoZW1hID0gZ2V0UmVsYXRpb25TY2hlbWEoIHN0YXRlLCBtb2RlbE5hbWUsIHJlbGF0aW9uTmFtZSApO1xuXHRyZXR1cm4gcmVsYXRpb25TY2hlbWEgIT09IG51bGwgP1xuXHRcdHJlbGF0aW9uU2NoZW1hLnJlbGF0aW9uX3R5cGUgOlxuXHRcdCcnO1xufTtcblxuLyoqXG4gKiBTZWxlY3RvciByZXR1cm5pbmcgdGhlIHJlbGF0aW9uIHNjaGVtYSBkZXNjcmliaW5nIHRoZSByZWxhdGlvbiBiZXR3ZWVuIHRoZVxuICogZ2l2ZW4gbW9kZWwgbmFtZSBhbmQgcmVsYXRpb24gbmFtZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbk5hbWVcbiAqIEByZXR1cm4ge09iamVjdHxudWxsfSBBbiBvYmplY3Qgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyByZWxhdGlvbiBzY2hlbWEuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRSZWxhdGlvblNjaGVtYSA9ICggc3RhdGUsIG1vZGVsTmFtZSwgcmVsYXRpb25OYW1lICkgPT4ge1xuXHRtb2RlbE5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lICk7XG5cdHJlbGF0aW9uTmFtZSA9IHBsdXJhbE1vZGVsTmFtZSggcmVsYXRpb25OYW1lICk7XG5cdHJldHVybiBzdGF0ZS5yZWxhdGlvblNjaGVtYS5nZXRJbiggWyBtb2RlbE5hbWUsIHJlbGF0aW9uTmFtZSBdLCBudWxsICk7XG59O1xuIiwiLyoqXG4gKiBSZWdpc3RlciBzdG9yZXNcbiAqL1xuaW1wb3J0ICcuL2V2ZW50ZXNwcmVzc28vc2NoZW1hJztcbmltcG9ydCAnLi9ldmVudGVzcHJlc3NvL2NvcmUnO1xuaW1wb3J0ICcuL2V2ZW50ZXNwcmVzc28vbGlzdHMnO1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IEV4Y2VwdGlvbiB9IGZyb20gJ0BldmVudGVzcHJlc3NvL2VlanMnO1xuaW1wb3J0IHsgc3ByaW50ZiwgX18gfSBmcm9tICdAZXZlbnRlc3ByZXNzby9pMThuJztcbmltcG9ydCB7IGlzQXJyYXksIGlzRW1wdHksIGlzTWFwIH0gZnJvbSAnbG9kYXNoJztcblxuLyoqXG4gKiBBc3NlcnRzIHdoZXRoZXIgdGhlIGdpdmVuIGtleSBleGlzdHMgaW4gdGhlIHByb3ZpZGVkIGVudGl0eSBvYmplY3QuXG4gKiBUaGlzIGlzIHVzZWQgd2hlbiBjYWxsaW5nIGNvZGUgd2FudHMgYW4gZXhjZXB0aW9uIHRvIGJlIHRocm93bi5cbiAqXG4gKiBAcGFyYW0geyBzdHJpbmcgfSBrZXlcbiAqIEBwYXJhbSB7IE9iamVjdCB9IGVudGl0eVxuICogQHBhcmFtIHsgc3RyaW5nIH0gbWVzc2FnZVxuICogQHRocm93cyB7IEV4Y2VwdGlvbiB9ICBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBwcm92aWRlZCBlbnRpdHkgZG9lcyBub3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlIHRoZSBnaXZlbiBrZXkuXG4gKi9cbmV4cG9ydCBjb25zdCBhc3NlcnRFbnRpdHlIYXNLZXkgPSAoIGtleSwgZW50aXR5LCBtZXNzYWdlID0gJycgKSA9PiB7XG5cdGlmICggbWVzc2FnZSA9PT0gJycgKSB7XG5cdFx0bWVzc2FnZSA9IHNwcmludGYoXG5cdFx0XHRfXyhcblx0XHRcdFx0J1RoZSBwcm92aWRlZCBlbnRpdHkgKCVzKSBkb2VzIG5vdCBoYXZlIHRoZSBnaXZlbiBwcm9wZXJ0eSAoJXMpJyxcblx0XHRcdFx0J2V2ZW50X2VzcHJlc3NvJyxcblx0XHRcdCksXG5cdFx0XHRlbnRpdHksXG5cdFx0XHRrZXksXG5cdFx0KTtcblx0fVxuXHRpZiAoICEgZW50aXR5Lmhhc093blByb3BlcnR5KCBrZXkgKSApIHtcblx0XHR0aHJvdyBuZXcgRXhjZXB0aW9uKCBtZXNzYWdlICk7XG5cdH1cbn07XG5cbi8qKlxuICogQXNzZXJ0cyB3aGV0aGVyIHRoZSBnaXZlbiBwYXRoIGluIHRoZSBwcm92aWRlZCBpbW11dGFibGUgb2JqZWN0IGV4aXN0cy5cbiAqIFRoaXMgaXMgdXNlZCB3aGVuIGNhbGxpbmcgY29kZSB3YW50cyBhbiBleGNlcHRpb24gdG8gYmUgdGhyb3duIGlmIHRoZSBnaXZlblxuICogc2VhcmNoIHBhdGggYXJyYXkgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGltbXV0YWJsZSBvYmplY3QuXG4gKlxuICogSWYgdGhlIGltbXV0YWJsZSBvYmplY3QgaXMgc2V0dXAgbGlrZSB0aGlzOlxuICpcbiAqIGltbXV0YWJsZSA9IEltbXV0YWJsZS5NYXAoKS5zZXQoICdldmVudCcsIEltbXV0YWJsZS5NYXAoKS5zZXQoIDEwLCBFdmVudCApICk7XG4gKlxuICogVGhlbiBhIHZhbGlkIHNlYXJjaGFibGUgcGF0aCBjb3VsZCBiZSBgWyAnZXZlbnQnLCAxMCBdYC4gIEFuIGludmFsaWQgcGF0aFxuICogd291bGQgYmUgYFsgJ2RhdGV0aW1lJywgMTAgXWBcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBwYXRoICBTZWFyY2hhYmxlIHBhdGggZm9yIHRoZSBpbW11dGFibGUgb2piZWN0IHRvIHZlcmlmeS5cbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcHxJbW11dGFibGUuU2V0fSBpbW11dGFibGUgIEFuIGltbXV0YWJsZSBvYmplY3QgKE1hcCwgU2V0LCBMaXN0IGV0YylcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIEEgY3VzdG9tIG1lc3NhZ2UgdG8gdXNlLlxuICogQHRocm93cyBFeGNlcHRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGFzc2VydEltbXV0YWJsZU9iamVjdEhhc1BhdGggPSAoXG5cdHBhdGgsXG5cdGltbXV0YWJsZSxcblx0bWVzc2FnZSA9ICcnXG4pID0+IHtcblx0aWYgKCBtZXNzYWdlID09PSAnJyApIHtcblx0XHRtZXNzYWdlID0gc3ByaW50Zihcblx0XHRcdF9fKFxuXHRcdFx0XHQnVGhlIHByb3ZpZGVkIGltbXV0YWJsZSBvYmplY3QgKCVzKSBkb2VzIG5vdCBoYXZlIHRoZSBnaXZlbiBwYXRoICglcyknLFxuXHRcdFx0XHQnZXZlbnRfZXNwcmVzc28nLFxuXHRcdFx0KSxcblx0XHRcdGltbXV0YWJsZSxcblx0XHRcdHBhdGgsXG5cdFx0KTtcblx0fVxuXHRpZiAoICEgaW1tdXRhYmxlLmhhc0luKCBwYXRoICkgKSB7XG5cdFx0dGhyb3cgbmV3IEV4Y2VwdGlvbiggbWVzc2FnZSApO1xuXHR9XG59O1xuXG4vKipcbiAqIEFzc2VydHMgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gYXJyYXkuXG4gKlxuICogQHBhcmFtIHsqfSBpdGVtc1xuICogQHBhcmFtIHsgc3RyaW5nIH0gIG1lc3NhZ2VcbiAqIEB0aHJvd3MgeyBFeGNlcHRpb24gfSBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBwcm92aWRlZCB2YWx1ZSBpcyBub3QgYW5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5cbiAqL1xuZXhwb3J0IGNvbnN0IGFzc2VydElzQXJyYXkgPSAoIGl0ZW1zLCBtZXNzYWdlID0gJycgKSA9PiB7XG5cdGlmICggbWVzc2FnZSA9PT0gJycgKSB7XG5cdFx0bWVzc2FnZSA9IF9fKCAnVGhlIHByb3ZpZGVkIHZhbHVlIGlzIG5vdCBhbiBhcnJheS4nLCAnZXZlbnRfZXNwcmVzc28nICk7XG5cdH1cblx0aWYgKCAhIGlzQXJyYXkoIGl0ZW1zICkgKSB7XG5cdFx0dGhyb3cgbmV3IEV4Y2VwdGlvbiggbWVzc2FnZSApO1xuXHR9XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBlbXB0eSBvciBub3QuXG4gKlxuICogQ2FsbCB0aGlzIHZhbGlkYXRvciB3aGVuIHlvdSB3YW50IHRvIG1ha2Ugc3VyZSB0aGUgdmFsdWUgaXMgTk9UIGVtcHR5LlxuICpcbiAqIEBwYXJhbSB7Kn0gaXRlbXNcbiAqIEBwYXJhbSB7IHN0cmluZyB9IG1lc3NhZ2VcbiAqIEB0aHJvd3MgeyBFeGNlcHRpb24gfSBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBwcm92aWRlZCB2YWx1ZSBpcyBlbXB0eS5cbiAqL1xuZXhwb3J0IGNvbnN0IGFzc2VydElzTm90RW1wdHkgPSAoIGl0ZW1zLCBtZXNzYWdlID0gJycgKSA9PiB7XG5cdGlmICggbWVzc2FnZSA9PT0gJycgKSB7XG5cdFx0bWVzc2FnZSA9IF9fKFxuXHRcdFx0J1RoZSBwcm92aWRlZCBpdGVtcyBtdXN0IG5vdCBiZSBlbXB0eScsXG5cdFx0XHQnZXZlbnRfZXNwcmVzc28nLFxuXHRcdCk7XG5cdH1cblx0aWYgKCBpc0VtcHR5KCBpdGVtcyApICkge1xuXHRcdHRocm93IG5ldyBFeGNlcHRpb24oIG1lc3NhZ2UgKTtcblx0fVxufTtcblxuLyoqXG4gKiBBc3NlcnRzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgTWFwIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0geyp9IGl0ZW1cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAdGhyb3dzIHsgRXhjZXB0aW9uIH1cbiAqL1xuZXhwb3J0IGNvbnN0IGFzc2VydElzTWFwID0gKCBpdGVtLCBtZXNzYWdlID0gJycgKSA9PiB7XG5cdGlmICggbWVzc2FnZSA9PT0gJycgKSB7XG5cdFx0bWVzc2FnZSA9IF9fKFxuXHRcdFx0J1RoZSBwcm92aWRlZCBpdGVtIG11c3QgYmUgYSBNYXAgb2JqZWN0Jyxcblx0XHRcdCdldmVudF9lc3ByZXNzbydcblx0XHQpO1xuXHR9XG5cdGlmICggISBpc01hcCggaXRlbSApICkge1xuXHRcdHRocm93IG5ldyBFeGNlcHRpb24oIG1lc3NhZ2UgKTtcblx0fVxufTtcbiIsImV4cG9ydCBjb25zdCBNT0RFTF9OQU1FID0gJ2F0dGVuZGVlJztcbiIsImV4cG9ydCAqIGZyb20gJy4vcXVlcnknO1xuZXhwb3J0ICogZnJvbSAnLi9jb25zdGFudHMnO1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IGlzVW5kZWZpbmVkIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbmltcG9ydCB7XG5cdGdldFF1ZXJ5U3RyaW5nIGFzIGJhc2VHZXRRdWVyeVN0cmluZyxcblx0UVVFUllfT1JERVJfQVNDLFxuXHRBTExPV0VEX09SREVSX1ZBTFVFUyxcbn0gZnJvbSAnLi4vYmFzZSc7XG5pbXBvcnQgeyBSRUdJU1RSQVRJT05fU1RBVFVTX0lEUyB9IGZyb20gJy4uL3JlZ2lzdHJhdGlvbi9jb25zdGFudHMnO1xuXG5leHBvcnQgY29uc3Qgb3JkZXJCeU1hcCA9IHtcblx0aWQ6ICdBVFRfSUQnLFxuXHRsYXN0TmFtZU9ubHk6ICdBVFRfbG5hbWUnLFxuXHRmaXJzdE5hbWVPbmx5OiAnQVRUX2ZuYW1lJyxcblx0Zmlyc3RUaGVuTGFzdE5hbWU6IFsgJ0FUVF9mbmFtZScsICdBVFRfbG5hbWUnIF0sXG5cdGxhc3RUaGVuRmlyc3ROYW1lOiBbICdBVFRfbG5hbWUnLCAnQVRUX2ZuYW1lJyBdLFxufTtcblxuLyoqXG4gKiBEZXNjcmliZWQgYXR0cmlidXRlcyBmb3IgdGhpcyBtb2RlbFxuICogQHR5cGUge3thdHRyaWJ1dGVzOiAqfX1cbiAqL1xuZXhwb3J0IGNvbnN0IHF1ZXJ5RGF0YVR5cGVzID0ge1xuXHRmb3JFdmVudElkOiBQcm9wVHlwZXMubnVtYmVyLFxuXHRmb3JEYXRldGltZUlkOiBQcm9wVHlwZXMubnVtYmVyLFxuXHRmb3JUaWNrZXRJZDogUHJvcFR5cGVzLm51bWJlcixcblx0Zm9yU3RhdHVzSWQ6IFByb3BUeXBlcy5vbmVPZiggUkVHSVNUUkFUSU9OX1NUQVRVU19JRFMgKSxcblx0Zm9yUmVnaXN0cmF0aW9uSWQ6IFByb3BUeXBlcy5udW1iZXIsXG5cdHNob3dHcmF2YXRhcjogUHJvcFR5cGVzLmJvb2wsXG5cdHF1ZXJ5RGF0YTogUHJvcFR5cGVzLnNoYXBlKCB7XG5cdFx0bGltaXQ6IFByb3BUeXBlcy5udW1iZXIsXG5cdFx0b3JkZXJCeTogUHJvcFR5cGVzLm9uZU9mKCBPYmplY3Qua2V5cyggb3JkZXJCeU1hcCApICksXG5cdFx0b3JkZXI6IFByb3BUeXBlcy5vbmVPZiggQUxMT1dFRF9PUkRFUl9WQUxVRVMgKSxcblx0fSApLFxufTtcblxuLyoqXG4gKiBEZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoaXMgbW9kZWxcbiAqIEB0eXBlIHtcbiAqIFx0e1xuICogXHRcdGF0dHJpYnV0ZXM6IHtcbiAqIFx0XHRcdGxpbWl0OiBudW1iZXIsXG4gKiBcdFx0XHRvcmRlckJ5OiBzdHJpbmcsXG4gKiBcdFx0XHRvcmRlcjogc3RyaW5nLFxuICogICBcdH1cbiAqICAgfVxuICogfVxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdFF1ZXJ5RGF0YSA9IHtcblx0cXVlcnlEYXRhOiB7XG5cdFx0bGltaXQ6IDEwMCxcblx0XHRvcmRlckJ5OiAnbGFzdFRoZW5GaXJzdE5hbWUnLFxuXHRcdG9yZGVyOiBRVUVSWV9PUkRFUl9BU0MsXG5cdH0sXG59O1xuXG4vKipcbiAqIFVzZWQgdG8gbWFwIGFuIG9yZGVyQnkgc3RyaW5nIHRvIHRoZSBhY3R1YWwgdmFsdWUgdXNlZFxuICogaW4gYSBSRVNUIHF1ZXJ5IGZyb20gdGhlIGNvbnRleHQgb2YgYSBhdHRlbmRlZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gXHRcdG9yZGVyQnlcbiAqIEByZXR1cm4geyBzdHJpbmcgfSBcdFJldHVybnMgYW4gYWN0dWFsIG9yZGVyQnkgc3RyaW5nXG4gKiBcdFx0XHRcdFx0XHRmb3IgdGhlIFJFU1QgcXVlcnkgZm9yIHRoZSBwcm92aWRlZCBhbGlhc1xuICovXG5leHBvcnQgY29uc3QgbWFwT3JkZXJCeSA9ICggb3JkZXJCeSApID0+IHtcblx0cmV0dXJuIGlzVW5kZWZpbmVkKCBvcmRlckJ5TWFwWyBvcmRlckJ5IF0gKSA/XG5cdFx0b3JkZXJCeSA6XG5cdFx0b3JkZXJCeU1hcFsgb3JkZXJCeSBdO1xufTtcblxuLyoqXG4gKiBCdWlsZHMgd2hlcmUgY29uZGl0aW9ucyBmb3IgYW4gYXR0ZW5kZWVzIGVuZHBvaW50IHJlcXVlc3RcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZm9yRXZlbnRJZCAgICBcdElEIG9mIEV2ZW50IHRvIHJldHJpZXZlIGF0dGVuZGVlcyBmb3JcbiAqIEBwYXJhbSB7bnVtYmVyfSBmb3JEYXRldGltZUlkIFx0SUQgb2YgRGF0ZXRpbWUgdG8gcmV0cmlldmUgYXR0ZW5kZWVzIGZvclxuICogQHBhcmFtIHtudW1iZXJ9IGZvclRpY2tldElkIFx0XHRJRCBvZiBUaWNrZXQgdG8gcmV0cmlldmUgYXR0ZW5kZWVzIGZvclxuICogQHBhcmFtIHtudW1iZXJ9IGZvclJlZ2lzdHJhdGlvbklkXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9yU3RhdHVzSWQgXHRcdElEIG9mIFN0YXR1cyB0byByZXRyaWV2ZSBhdHRlbmRlZXMgZm9yXG4gKiBAcGFyYW0ge3N0cmluZ30gc2hvd0dyYXZhdGFyIFx0Qm9vbGVhbiB0b2dnbGUgZm9yIHdoZXRoZXIgdG8gZGlzcGxheSB1c2VyIEdyYXZhdGFyXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgICAgICAgICAgIFx0VGhlIGFzc2VtYmxlZCB3aGVyZSBjb25kaXRpb25zLlxuICovXG5leHBvcnQgY29uc3Qgd2hlcmVDb25kaXRpb25zID0gKCB7XG5cdGZvckV2ZW50SWQgPSAwLFxuXHRmb3JEYXRldGltZUlkID0gMCxcblx0Zm9yVGlja2V0SWQgPSAwLFxuXHRmb3JSZWdpc3RyYXRpb25JZCA9IDAsXG5cdGZvclN0YXR1c0lkID0gJ1JBUCcsXG5cdHNob3dHcmF2YXRhciA9IGZhbHNlLFxufSApID0+IHtcblx0Y29uc3Qgd2hlcmUgPSBbXTtcblxuXHQvLyBlbnN1cmUgdGhhdCBlbnRpdHkgSURzIGFyZSBpbnRlZ2Vyc1xuXHRmb3JSZWdpc3RyYXRpb25JZCA9IHBhcnNlSW50KCBmb3JSZWdpc3RyYXRpb25JZCwgMTAgKTtcblx0Zm9yVGlja2V0SWQgPSBwYXJzZUludCggZm9yVGlja2V0SWQsIDEwICk7XG5cdGZvckRhdGV0aW1lSWQgPSBwYXJzZUludCggZm9yRGF0ZXRpbWVJZCwgMTAgKTtcblx0Zm9yRXZlbnRJZCA9IHBhcnNlSW50KCBmb3JFdmVudElkLCAxMCApO1xuXG5cdC8vIG9yZGVyIG9mIHByaW9yaXR5IGZvciBwcm92aWRlZCBhcmd1bWVudHMuXG5cdGlmICggZm9yUmVnaXN0cmF0aW9uSWQgIT09IDAgJiYgISBpc05hTiggZm9yUmVnaXN0cmF0aW9uSWQgKSApIHtcblx0XHR3aGVyZS5wdXNoKCBgd2hlcmVbUmVnaXN0cmF0aW9uLlJFR19JRF09JHsgZm9yUmVnaXN0cmF0aW9uSWQgfWAgKTtcblx0fSBlbHNlIGlmICggZm9yVGlja2V0SWQgIT09IDAgJiYgISBpc05hTiggZm9yVGlja2V0SWQgKSApIHtcblx0XHR3aGVyZS5wdXNoKCBgd2hlcmVbUmVnaXN0cmF0aW9uLlRpY2tldC5US1RfSURdPSR7IGZvclRpY2tldElkIH1gICk7XG5cdH0gZWxzZSBpZiAoIGZvckRhdGV0aW1lSWQgIT09IDAgJiYgISBpc05hTiggZm9yRGF0ZXRpbWVJZCApICkge1xuXHRcdHdoZXJlLnB1c2goIGB3aGVyZVtSZWdpc3RyYXRpb24uVGlja2V0LkRhdGV0aW1lLkRUVF9JRF09JHsgZm9yRGF0ZXRpbWVJZCB9YCApO1xuXHR9IGVsc2UgaWYgKCBmb3JFdmVudElkICE9PSAwICYmICEgaXNOYU4oIGZvckV2ZW50SWQgKSApIHtcblx0XHR3aGVyZS5wdXNoKCBgd2hlcmVbUmVnaXN0cmF0aW9uLkVWVF9JRF09JHsgZm9yRXZlbnRJZCB9YCApO1xuXHR9XG5cblx0aWYgKCBSRUdJU1RSQVRJT05fU1RBVFVTX0lEUy5pbmNsdWRlcyggZm9yU3RhdHVzSWQgKSApIHtcblx0XHR3aGVyZS5wdXNoKCBgd2hlcmVbUmVnaXN0cmF0aW9uLlN0YXR1cy5TVFNfSURdPSR7IGZvclN0YXR1c0lkIH1gICk7XG5cdH1cblx0aWYgKCBzaG93R3JhdmF0YXIgPT09IHRydWUgKSB7XG5cdFx0d2hlcmUucHVzaCggJ2NhbGN1bGF0ZT11c2VyX2F2YXRhcicgKTtcblx0fVxuXHRyZXR1cm4gd2hlcmUuam9pbiggJyYnICk7XG59O1xuXG4vKipcbiAqIFJldHVybiBhIHF1ZXJ5IHN0cmluZyBmb3IgdXNlIGJ5IGEgUkVTVCByZXF1ZXN0IGdpdmVuIGEgc2V0IG9mIHF1ZXJ5RGF0YS5cbiAqIEBwYXJhbSB7IE9iamVjdCB9IHF1ZXJ5RGF0YVxuICogQHJldHVybiB7IHN0cmluZyB9ICBSZXR1cm5zIHRoZSBxdWVyeSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRRdWVyeVN0cmluZyA9ICggcXVlcnlEYXRhID0ge30gKSA9PiB7XG5cdHF1ZXJ5RGF0YSA9IHsgLi4uZGVmYXVsdFF1ZXJ5RGF0YS5xdWVyeURhdGEsIC4uLnF1ZXJ5RGF0YSB9O1xuXHRyZXR1cm4gYmFzZUdldFF1ZXJ5U3RyaW5nKCBxdWVyeURhdGEsIHdoZXJlQ29uZGl0aW9ucywgbWFwT3JkZXJCeSApO1xufTtcbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgKiBhcyBkYXRlRm9ybWF0cyBmcm9tICdAZXZlbnRlc3ByZXNzby9oZWxwZXJzJztcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tICdsb2Rhc2gnO1xuXG4vKipcbiAqIEZvcm1hdHMgdGhlIGRhdGUgZmllbGRzIG9uIHByb3ZpZGVkIGVudGl0aWVzLiAgRG9lcyBub3QgbXV0YXRlIG9yaWdpbmFsXG4gKiBlbnRpdGllcy5cbiAqXG4gKiBAcGFyYW0geyBBcnJheSB9IGVudGl0aWVzICBBbiBhcnJheSBvZiBlbnRpdHkgb2JqZWN0c1xuICogQHBhcmFtIHsgQXJyYXkgfSBlbnRpdHlEYXRlRmllbGRzICBBbiBhcnJheSBvZiBmaWVsZCBuYW1lcyB0aGF0IGFyZSBkYXRlXG4gKiAgIGZpZWxkcy5cbiAqIEBwYXJhbSB7IHN0cmluZyB9IGZvcm1hdCAgVGhlIGZvcm1hdCB0byB0cmFuc2Zvcm0gdGhlIGRhdGUgZmllbGQgdmFsdWVzIHRvLlxuICogQHBhcmFtIHsgYm9vbGVhbiB9IGxvY2FsICAgICAgV2hldGhlciBvciBub3QgdG8gY29udmVydCB0aGUgZGF0ZSBmaWVsZCB2YWx1ZVxuICogICB0byB0aGUgbG9jYWwgdGltZXpvbmUgZm9yIHRoZSBob3N0LlxuICogQHJldHVybiB7IEFycmF5IH0gIFJldHVybnMgYSBuZXcgYXJyYXkgb2YgbmV3IGVudGl0aWVzIHdpdGggdGhlIGRhdGUgZmllbGRcbiAqICAgdmFsdWVzIGZvcm1hdHRlZFxuICovXG5leHBvcnQgY29uc3QgZm9ybWF0RGF0ZXNPbkVudGl0aWVzID0gKFxuXHRlbnRpdGllcyA9IFtdLFxuXHRlbnRpdHlEYXRlRmllbGRzID0gW10sXG5cdGZvcm1hdCA9IGRhdGVGb3JtYXRzLkRBVEVfVElNRV9GT1JNQVRfSVNPODYwMSxcblx0bG9jYWwgPSB0cnVlLFxuKSA9PiB7XG5cdGlmICggaXNFbXB0eSggZW50aXRpZXMgKSB8fCBpc0VtcHR5KCBlbnRpdHlEYXRlRmllbGRzICkgKSB7XG5cdFx0cmV0dXJuIGVudGl0aWVzO1xuXHR9XG5cdGNvbnN0IGZvcm1hdHRlZEVudGl0aWVzID0gW107XG5cdGVudGl0aWVzLmZvckVhY2goICggZW50aXR5ICkgPT4ge1xuXHRcdGZvcm1hdHRlZEVudGl0aWVzLnB1c2goIGZvcm1hdERhdGVzT25FbnRpdHkoXG5cdFx0XHRlbnRpdHksXG5cdFx0XHRlbnRpdHlEYXRlRmllbGRzLFxuXHRcdFx0Zm9ybWF0LFxuXHRcdFx0bG9jYWwsXG5cdFx0KSApO1xuXHR9ICk7XG5cdHJldHVybiBmb3JtYXR0ZWRFbnRpdGllcztcbn07XG5cbi8qKlxuICogRm9ybWF0cyB0aGUgZGF0ZSBmaWVsZHMgb24gdGhlIHByb3ZpZGVkIGVudGl0eS4gIERvZXMgbm90IG11dGF0ZSBvcmlnaW5hbFxuICogZW50aXR5LlxuICpcbiAqIEBwYXJhbSB7IE9iamVjdCB9IGVudGl0eSAgQW4gZW50aXR5XG4gKiBAcGFyYW0geyBBcnJheSB9IGVudGl0eURhdGVGaWVsZHMgIEFuIGFycmF5IG9mIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGRhdGVcbiAqICAgZmllbGRzLlxuICogQHBhcmFtIHsgc3RyaW5nIH0gZm9ybWF0ICBUaGUgZm9ybWF0IHRvIHRyYW5zZm9ybSB0aGUgZGF0ZSBmaWVsZCB2YWx1ZXMgdG8uXG4gKiBAcGFyYW0geyBib29sZWFuIH0gbG9jYWwgICAgICBXaGV0aGVyIG9yIG5vdCB0byBjb252ZXJ0IHRoZSBkYXRlIGZpZWxkIHZhbHVlXG4gKiAgIHRvIHRoZSBsb2NhbCB0aW1lem9uZSBmb3IgdGhlIGhvc3QuXG4gKiBAcmV0dXJuIHsgT2JqZWN0IH0gIFJldHVybnMgYSBuZXcgZW50aXR5IHdpdGggdGhlIGRhdGUgZmllbGQgdmFsdWVzIGZvcm1hdHRlZFxuICovXG5leHBvcnQgY29uc3QgZm9ybWF0RGF0ZXNPbkVudGl0eSA9IChcblx0ZW50aXR5ID0ge30sXG5cdGVudGl0eURhdGVGaWVsZHMgPSBbXSxcblx0Zm9ybWF0ID0gZGF0ZUZvcm1hdHMuREFURV9USU1FX0ZPUk1BVF9JU084NjAxLFxuXHRsb2NhbCA9IHRydWUsXG4pID0+IHtcblx0Y29uc3QgbmV3RW50aXR5ID0geyAuLi5lbnRpdHkgfTtcblx0ZW50aXR5RGF0ZUZpZWxkcy5mb3JFYWNoKCAoIGRhdGVGaWVsZCApID0+IHtcblx0XHRpZiAoIG5ld0VudGl0eVsgZGF0ZUZpZWxkIF0gKSB7XG5cdFx0XHRuZXdFbnRpdHlbIGRhdGVGaWVsZCBdID0gZGF0ZUZvcm1hdHMuZm9ybWF0RGF0ZVN0cmluZyhcblx0XHRcdFx0bmV3RW50aXR5WyBkYXRlRmllbGQgXSxcblx0XHRcdFx0Zm9ybWF0LFxuXHRcdFx0XHRsb2NhbCxcblx0XHRcdCk7XG5cdFx0fVxuXHR9ICk7XG5cdHJldHVybiBuZXdFbnRpdHk7XG59O1xuXG4vKipcbiAqIEZvcm1hdHMgdGhlIGRhdGUgZmllbGRzIHRvIG15c3FsIGZvcm1hdCBvbiBwcm92aWRlZCBlbnRpdGllcy4gIERvZXMgbm90XG4gKiBtdXRhdGUgb3JpZ2luYWwgZW50aXRpZXMuXG4gKlxuICogQHBhcmFtIHsgQXJyYXkgfSBlbnRpdGllcyAgQW4gYXJyYXkgb2YgZW50aXR5IG9iamVjdHNcbiAqIEBwYXJhbSB7IEFycmF5IH0gZW50aXR5RGF0ZUZpZWxkcyAgQW4gYXJyYXkgb2YgZmllbGQgbmFtZXMgdGhhdCBhcmUgZGF0ZVxuICogICBmaWVsZHMuXG4gKiBAcGFyYW0geyBib29sZWFuIH0gbG9jYWwgICAgICBXaGV0aGVyIG9yIG5vdCB0byBjb252ZXJ0IHRoZSBkYXRlIGZpZWxkIHZhbHVlXG4gKiAgIHRvIHRoZSBsb2NhbCB0aW1lem9uZSBmb3IgdGhlIGhvc3QuXG4gKiBAcmV0dXJuIHsgQXJyYXkgfSAgUmV0dXJucyBhIG5ldyBhcnJheSBvZiBuZXcgZW50aXRpZXMgd2l0aCB0aGUgZGF0ZSBmaWVsZFxuICogICB2YWx1ZXMgZm9ybWF0dGVkXG4gKi9cbmV4cG9ydCBjb25zdCBmb3JtYXRFbnRpdGllc0RhdGVzVG9NeXNxbCA9IChcblx0ZW50aXRpZXMgPSBbXSxcblx0ZW50aXR5RGF0ZUZpZWxkcyA9IFtdLFxuXHRsb2NhbCA9IHRydWUsXG4pID0+IHtcblx0cmV0dXJuIGZvcm1hdERhdGVzT25FbnRpdGllcyhcblx0XHRlbnRpdGllcyxcblx0XHRlbnRpdHlEYXRlRmllbGRzLFxuXHRcdGRhdGVGb3JtYXRzLkRBVEVfVElNRV9GT1JNQVRfTVlTUUwsXG5cdFx0bG9jYWwsXG5cdCk7XG59O1xuXG4vKipcbiAqIEZvcm1hdHMgdGhlIGRhdGUgZmllbGRzIHRvIG15c3FsIGZvcm1hdCBvbiBwcm92aWRlZCBlbnRpdHkuICBEb2VzIG5vdFxuICogbXV0YXRlIG9yaWdpbmFsIGVudGl0eS5cbiAqXG4gKiBAcGFyYW0geyBPYmplY3QgfSBlbnRpdHkgIEFuIGFycmF5IG9mIGVudGl0eSBvYmplY3RzXG4gKiBAcGFyYW0geyBBcnJheSB9IGVudGl0eURhdGVGaWVsZHMgIEFuIGFycmF5IG9mIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGRhdGVcbiAqICAgZmllbGRzLlxuICogQHBhcmFtIHsgYm9vbGVhbiB9IGxvY2FsICAgICAgV2hldGhlciBvciBub3QgdG8gY29udmVydCB0aGUgZGF0ZSBmaWVsZCB2YWx1ZVxuICogICB0byB0aGUgbG9jYWwgdGltZXpvbmUgZm9yIHRoZSBob3N0LlxuICogQHJldHVybiB7IE9iamVjdCB9ICBSZXR1cm5zIGEgbmV3IGVudGl0eSB3aXRoIHRoZSBkYXRlIGZpZWxkIHZhbHVlcyBmb3JtYXR0ZWRcbiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1hdEVudGl0eURhdGVzVG9NeXNxbCA9IChcblx0ZW50aXR5ID0ge30sXG5cdGVudGl0eURhdGVGaWVsZHMgPSBbXSxcblx0bG9jYWwgPSB0cnVlLFxuKSA9PiB7XG5cdHJldHVybiBmb3JtYXREYXRlc09uRW50aXR5KFxuXHRcdGVudGl0eSxcblx0XHRlbnRpdHlEYXRlRmllbGRzLFxuXHRcdGRhdGVGb3JtYXRzLkRBVEVfVElNRV9GT1JNQVRfTVlTUUwsXG5cdFx0bG9jYWwsXG5cdCk7XG59O1xuXG4vKipcbiAqIEZvcm1hdHMgdGhlIGRhdGUgZmllbGRzIHRvIHRoZSBzaXRlIGZvcm1hdCBvbiBwcm92aWRlZCBlbnRpdGllcy4gIERvZXMgbm90XG4gKiBtdXRhdGUgb3JpZ2luYWwgZW50aXRpZXMuXG4gKlxuICogQHBhcmFtIHsgQXJyYXkgfSBlbnRpdGllcyAgQW4gYXJyYXkgb2YgZW50aXR5IG9iamVjdHNcbiAqIEBwYXJhbSB7IEFycmF5IH0gZW50aXR5RGF0ZUZpZWxkcyAgQW4gYXJyYXkgb2YgZmllbGQgbmFtZXMgdGhhdCBhcmUgZGF0ZVxuICogICBmaWVsZHMuXG4gKiBAcGFyYW0geyBib29sZWFuIH0gbG9jYWwgICAgICBXaGV0aGVyIG9yIG5vdCB0byBjb252ZXJ0IHRoZSBkYXRlIGZpZWxkIHZhbHVlXG4gKiAgIHRvIHRoZSBsb2NhbCB0aW1lem9uZSBmb3IgdGhlIGhvc3QuXG4gKiBAcmV0dXJuIHsgQXJyYXkgfSAgUmV0dXJucyBhIG5ldyBhcnJheSBvZiBuZXcgZW50aXRpZXMgd2l0aCB0aGUgZGF0ZSBmaWVsZFxuICogICB2YWx1ZXMgZm9ybWF0dGVkXG4gKi9cbmV4cG9ydCBjb25zdCBmb3JtYXRFbnRpdGllc0RhdGVzVG9TaXRlID0gKFxuXHRlbnRpdGllcyA9IFtdLFxuXHRlbnRpdHlEYXRlRmllbGRzID0gW10sXG5cdGxvY2FsID0gdHJ1ZSxcbikgPT4ge1xuXHRyZXR1cm4gZm9ybWF0RGF0ZXNPbkVudGl0aWVzKFxuXHRcdGVudGl0aWVzLFxuXHRcdGVudGl0eURhdGVGaWVsZHMsXG5cdFx0ZGF0ZUZvcm1hdHMuREFURV9USU1FX0ZPUk1BVF9TSVRFLFxuXHRcdGxvY2FsLFxuXHQpO1xufTtcblxuLyoqXG4gKiBGb3JtYXRzIHRoZSBkYXRlIGZpZWxkcyB0byB0aGUgc2l0ZSBmb3JtYXQgb24gcHJvdmlkZWQgZW50aXR5LiAgRG9lcyBub3RcbiAqIG11dGF0ZSBvcmlnaW5hbCBlbnRpdHkuXG4gKlxuICogQHBhcmFtIHsgT2JqZWN0IH0gZW50aXR5ICBBbiBhcnJheSBvZiBlbnRpdHkgb2JqZWN0c1xuICogQHBhcmFtIHsgQXJyYXkgfSBlbnRpdHlEYXRlRmllbGRzICBBbiBhcnJheSBvZiBmaWVsZCBuYW1lcyB0aGF0IGFyZSBkYXRlXG4gKiAgIGZpZWxkcy5cbiAqIEBwYXJhbSB7IGJvb2xlYW4gfSBsb2NhbCAgICAgIFdoZXRoZXIgb3Igbm90IHRvIGNvbnZlcnQgdGhlIGRhdGUgZmllbGQgdmFsdWVcbiAqICAgdG8gdGhlIGxvY2FsIHRpbWV6b25lIGZvciB0aGUgaG9zdC5cbiAqIEByZXR1cm4geyBPYmplY3QgfSAgUmV0dXJucyBhIG5ldyBlbnRpdHkgd2l0aCB0aGUgZGF0ZSBmaWVsZCB2YWx1ZXMgZm9ybWF0dGVkXG4gKi9cbmV4cG9ydCBjb25zdCBmb3JtYXRFbnRpdHlEYXRlc1RvU2l0ZSA9IChcblx0ZW50aXR5ID0ge30sXG5cdGVudGl0eURhdGVGaWVsZHMgPSBbXSxcblx0bG9jYWwgPSB0cnVlLFxuKSA9PiB7XG5cdHJldHVybiBmb3JtYXREYXRlc09uRW50aXR5KFxuXHRcdGVudGl0eSxcblx0XHRlbnRpdHlEYXRlRmllbGRzLFxuXHRcdGRhdGVGb3JtYXRzLkRBVEVfVElNRV9GT1JNQVRfU0lURSxcblx0XHRsb2NhbCxcblx0KTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgZGF0ZSBmaWVsZCB2YWx1ZXMgdG8gbW9tZW50IG9iamVjdHMgZm9yIHRoZSBwcm92aWRlZCBlbnRpdGllcy5cbiAqIERvZXMgbm90IG11dGF0ZSBvcmlnaW5hbCBlbnRpdGllcy5cbiAqXG4gKiBAcGFyYW0geyBBcnJheSB9IGVudGl0aWVzIEFuIGFycmF5IG9mIGVudGl0eSBvYmplY3RzXG4gKiBAcGFyYW0geyBBcnJheSB9IGVudGl0eURhdGVGaWVsZHMgQW4gYXJyYXkgb2YgZmllbGQgbmFtZXMgdGhhdCBhcmUgZGF0ZVxuICogICBmaWVsZHMuXG4gKiBAcmV0dXJuIHsgQXJyYXkgfSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIG5ldyBlbnRpdGllcyB3aXRoIHRoZSBkYXRlIGZpZWxkXG4gKiAgIHZhbHVlcyBjb252ZXJ0ZWQgdG8gbW9tZW50IG9iamVjdHMuXG4gKi9cbmV4cG9ydCBjb25zdCBjb252ZXJ0RW50aXRpZXNEYXRlc1RvTW9tZW50ID0gKFxuXHRlbnRpdGllcyA9IFtdLFxuXHRlbnRpdHlEYXRlRmllbGRzID0gW10sXG4pID0+IHtcblx0aWYgKCBpc0VtcHR5KCBlbnRpdGllcyApIHx8IGlzRW1wdHkoIGVudGl0eURhdGVGaWVsZHMgKSApIHtcblx0XHRyZXR1cm4gZW50aXRpZXM7XG5cdH1cblx0Y29uc3QgZm9ybWF0dGVkRW50aXRpZXMgPSBbXTtcblx0ZW50aXRpZXMuZm9yRWFjaCggKCBlbnRpdHkgKSA9PiB7XG5cdFx0Zm9ybWF0dGVkRW50aXRpZXMucHVzaCggY29udmVydEVudGl0eURhdGVzVG9Nb21lbnQoXG5cdFx0XHRlbnRpdHksXG5cdFx0XHRlbnRpdHlEYXRlRmllbGRzLFxuXHRcdCkgKTtcblx0fSApO1xuXHRyZXR1cm4gZm9ybWF0dGVkRW50aXRpZXM7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGRhdGUgZmllbGQgdmFsdWVzIHRvIG1vbWVudCBvYmplY3RzIGZvciB0aGUgcHJvdmlkZWQgZW50aXR5LlxuICogRG9lcyBub3QgbXV0YXRlIG9yaWdpbmFsIGVudGl0eS5cbiAqXG4gKiBAcGFyYW0geyBPYmplY3QgfSBlbnRpdHkgQW4gZW50aXR5LlxuICogQHBhcmFtIHsgQXJyYXkgfSBlbnRpdHlEYXRlRmllbGRzIEFuIGFycmF5IG9mIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGRhdGVcbiAqICAgZmllbGRzLlxuICogQHJldHVybiB7IE9iamVjdCB9IFJldHVybnMgYSBuZXcgZW50aXR5IHdpdGggdGhlIGRhdGUgZmllbGQgdmFsdWVzIGNvbnZlcnRlZFxuICogICB0byBtb21lbnQgb2JqZWN0cy5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbnZlcnRFbnRpdHlEYXRlc1RvTW9tZW50ID0gKFxuXHRlbnRpdHkgPSB7fSxcblx0ZW50aXR5RGF0ZUZpZWxkcyA9IFtdLFxuKSA9PiB7XG5cdGNvbnN0IG5ld0VudGl0eSA9IHsgLi4uZW50aXR5IH07XG5cdGVudGl0eURhdGVGaWVsZHMuZm9yRWFjaCggKCBkYXRlRmllbGQgKSA9PiB7XG5cdFx0aWYgKCBuZXdFbnRpdHlbIGRhdGVGaWVsZCBdICkge1xuXHRcdFx0bmV3RW50aXR5WyBkYXRlRmllbGQgXSA9IGRhdGVGb3JtYXRzLnN0cmluZ1RvTW9tZW50KFxuXHRcdFx0XHRuZXdFbnRpdHlbIGRhdGVGaWVsZCBdLFxuXHRcdFx0KTtcblx0XHR9XG5cdH0gKTtcblx0cmV0dXJuIG5ld0VudGl0eTtcbn07XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgaXNBcnJheSwgaXNVbmRlZmluZWQgfSBmcm9tICdsb2Rhc2gnO1xuXG5leHBvcnQgY29uc3QgUVVFUllfT1JERVJfQVNDID0gJ0FTQyc7XG5leHBvcnQgY29uc3QgUVVFUllfT1JERVJfREVTQyA9ICdERVNDJztcbmV4cG9ydCBjb25zdCBBTExPV0VEX09SREVSX1ZBTFVFUyA9IFsgJ2FzYycsICdkZXNjJywgJ0FTQycsICdERVNDJyBdO1xuZXhwb3J0IGNvbnN0IEdSRUFURVJfVEhBTiA9IGVuY29kZVVSSUNvbXBvbmVudCggJz4nICk7XG5leHBvcnQgY29uc3QgTEVTU19USEFOID0gZW5jb2RlVVJJQ29tcG9uZW50KCAnPCcgKTtcbmV4cG9ydCBjb25zdCBHUkVBVEVSX1RIQU5fQU5EX0VRVUFMID0gZW5jb2RlVVJJQ29tcG9uZW50KCAnPj0nICk7XG5leHBvcnQgY29uc3QgTEVTU19USEFOX0FORF9FUVVBTCA9IGVuY29kZVVSSUNvbXBvbmVudCggJzw9JyApO1xuXG4vKipcbiAqIFJldHVybiBhIHF1ZXJ5IHN0cmluZyBmb3IgdXNlIGJ5IGEgUkVTVCByZXF1ZXN0IGdpdmVuIGEgc2V0IG9mIHF1ZXJ5RGF0YS5cbiAqIEBwYXJhbSB7IE9iamVjdCB9IHF1ZXJ5RGF0YVxuICogQHBhcmFtIHsgZnVuY3Rpb24gfSB3aGVyZUNvbmRpdGlvbnMgIEEgZnVuY3Rpb24gZm9yIHByZXBwaW5nIHRoZSB3aGVyZVxuICogXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25kaXRpb25zIGZyb20gdGhlIHF1ZXJ5RGF0YS5cbiAqIEBwYXJhbSB7IGZ1bmN0aW9uIH0gbWFwT3JkZXJCeVx0XHRBIGZ1bmN0aW9uIGZvciBtYXBwaW5nIGluY29taW5nIG9yZGVyX2J5XG4gKiBcdFx0XHRcdFx0XHRcdFx0XHRcdHN0cmluZ3MgdG8gdGhlIHZhbHVlIG5lZWRlZCBmb3IgdGhlXG4gKiBcdFx0XHRcdFx0XHRcdFx0XHRcdHF1ZXJ5X3N0cmluZy5cbiAqIEByZXR1cm4geyBzdHJpbmcgfSAgXHRcdFx0XHRcdFJldHVybnMgdGhlIHF1ZXJ5IHN0cmluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFF1ZXJ5U3RyaW5nID0gKFxuXHRxdWVyeURhdGEgPSB7fSxcblx0d2hlcmVDb25kaXRpb25zID0gKCkgPT4gbnVsbCxcblx0bWFwT3JkZXJCeSA9ICggb3JkZXJCeSApID0+IG9yZGVyQnksXG4pID0+IHtcblx0Y29uc3Qgd2hlcmUgPSB3aGVyZUNvbmRpdGlvbnMoIHF1ZXJ5RGF0YSApO1xuXHRjb25zdCB7IGxpbWl0LCBvcmRlciwgb3JkZXJCeSwgZGVmYXVsdFdoZXJlQ29uZGl0aW9ucyB9ID0gcXVlcnlEYXRhO1xuXHRjb25zdCBxdWVyeVBhcmFtcyA9IFtdO1xuXHRpZiAoICEgaXNVbmRlZmluZWQoIGxpbWl0ICkgKSB7XG5cdFx0cXVlcnlQYXJhbXMucHVzaCggYGxpbWl0PSR7IGxpbWl0IH1gICk7XG5cdH1cblx0aWYgKCAhIGlzVW5kZWZpbmVkKCBkZWZhdWx0V2hlcmVDb25kaXRpb25zICkgKSB7XG5cdFx0cXVlcnlQYXJhbXMucHVzaChcblx0XHRcdGBkZWZhdWx0X3doZXJlX2NvbmRpdGlvbnM9JHsgZGVmYXVsdFdoZXJlQ29uZGl0aW9ucyB9YFxuXHRcdCk7XG5cdH1cblx0aWYgKCAhIGlzVW5kZWZpbmVkKCBtYXBPcmRlckJ5KCBvcmRlckJ5ICkgKSApIHtcblx0XHRpZiAoIGlzQXJyYXkoIG1hcE9yZGVyQnkoIG9yZGVyQnkgKSApICkge1xuXHRcdFx0Zm9yICggY29uc3QgZmllbGQgb2YgbWFwT3JkZXJCeSggb3JkZXJCeSApICkge1xuXHRcdFx0XHRxdWVyeVBhcmFtcy5wdXNoKCBgb3JkZXJfYnlbJHsgZmllbGQgfV09JHsgb3JkZXIgfWAgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0cXVlcnlQYXJhbXMucHVzaCggYG9yZGVyPSR7IG9yZGVyIH1gICk7XG5cdFx0XHRxdWVyeVBhcmFtcy5wdXNoKCBgb3JkZXJfYnk9JHsgbWFwT3JkZXJCeSggb3JkZXJCeSApIH1gICk7XG5cdFx0fVxuXHR9XG5cdGxldCBxdWVyeVN0cmluZyA9IHF1ZXJ5UGFyYW1zLmpvaW4oICcmJyApO1xuXHRpZiAoIHdoZXJlICkge1xuXHRcdHF1ZXJ5U3RyaW5nICs9ICcmJyArIHdoZXJlO1xuXHR9XG5cdHJldHVybiBxdWVyeVN0cmluZztcbn07XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgdmFsdWVzIH0gZnJvbSAnbG9kYXNoJztcblxuZXhwb3J0IGNvbnN0IE1PREVMX05BTUUgPSAnY2hlY2tpbic7XG5cbmV4cG9ydCBjb25zdCBDSEVDS0lOX1NUQVRVU19JRCA9IHtcblx0U1RBVFVTX0NIRUNLRURfT1VUOiAwLFxuXHRTVEFUVVNfQ0hFQ0tFRF9JTjogMSxcblx0U1RBVFVTX0NIRUNLRURfTkVWRVI6IDIsXG59O1xuXG5leHBvcnQgY29uc3QgQ0hFQ0tJTl9TVEFUVVNfSURTID0gdmFsdWVzKFxuXHRDSEVDS0lOX1NUQVRVU19JRFxuKTtcbiIsImV4cG9ydCAqIGZyb20gJy4vY29uc3RhbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vcXVlcnknO1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IGlzVW5kZWZpbmVkIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBwcmV0dHlTdGF0dXMgfSBmcm9tICcuLi9zdGF0dXMnO1xuXG4vKipcbiAqIEludGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHtcblx0Z2V0UXVlcnlTdHJpbmcgYXMgYmFzZUdldFF1ZXJ5U3RyaW5nLFxuXHRRVUVSWV9PUkRFUl9ERVNDLFxuXHRBTExPV0VEX09SREVSX1ZBTFVFUyxcbn0gZnJvbSAnLi4vYmFzZSc7XG5pbXBvcnQgKiBhcyBjaGVja2luU3RhdHVzIGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBEZXNjcmliZWQgYXR0cmlidXRlcyBmb3IgdGhpcyBtb2RlbFxuICogQHR5cGUge3thdHRyaWJ1dGVzOiAqfX1cbiAqL1xuZXhwb3J0IGNvbnN0IHF1ZXJ5RGF0YVR5cGVzID0ge1xuXHRmb3JEYXRldGltZUlkOiBQcm9wVHlwZXMubnVtYmVyLFxuXHRmb3JFdmVudElkOiBQcm9wVHlwZXMubnVtYmVyLFxuXHRmb3JSZWdpc3RyYXRpb25JZDogUHJvcFR5cGVzLm51bWJlcixcblx0Zm9yVGlja2V0SWQ6IFByb3BUeXBlcy5udW1iZXIsXG5cdGZvclN0YXR1c0lkOiBQcm9wVHlwZXMub25lT2YoIGNoZWNraW5TdGF0dXMuQ0hFQ0tJTl9TVEFUVVNfSURTICksXG5cdHF1ZXJ5RGF0YTogUHJvcFR5cGVzLnNoYXBlKCB7XG5cdFx0bGltaXQ6IFByb3BUeXBlcy5udW1iZXIsXG5cdFx0b3JkZXJCeTogUHJvcFR5cGVzLm9uZU9mKCBbXG5cdFx0XHQnQ0hLX0lEJyxcblx0XHRcdCdSRUdfSUQnLFxuXHRcdFx0J0NIS190aW1lc3RhbXAnLFxuXHRcdFx0J0RUVF9JRCcsXG5cdFx0XSApLFxuXHRcdG9yZGVyOiBQcm9wVHlwZXMub25lT2YoIEFMTE9XRURfT1JERVJfVkFMVUVTICksXG5cdH0gKSxcbn07XG5cbmV4cG9ydCBjb25zdCBvcHRpb25zRW50aXR5TWFwID0ge1xuXHRkZWZhdWx0OiAoKSA9PiB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0bGFiZWw6IHByZXR0eVN0YXR1cyhcblx0XHRcdFx0XHRjaGVja2luU3RhdHVzLkNIRUNLSU5fU1RBVFVTX0lELlNUQVRVU19DSEVDS0VEX09VVFxuXHRcdFx0XHQpLFxuXHRcdFx0XHR2YWx1ZTogY2hlY2tpblN0YXR1cy5DSEVDS0lOX1NUQVRVU19JRC5TVEFUVVNfQ0hFQ0tFRF9PVVQsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRsYWJlbDogcHJldHR5U3RhdHVzKFxuXHRcdFx0XHRcdGNoZWNraW5TdGF0dXMuQ0hFQ0tJTl9TVEFUVVNfSUQuU1RBVFVTX0NIRUNLRURfSU5cblx0XHRcdFx0KSxcblx0XHRcdFx0dmFsdWU6IGNoZWNraW5TdGF0dXMuQ0hFQ0tJTl9TVEFUVVNfSUQuU1RBVFVTX0NIRUNLRURfSU4sXG5cdFx0XHR9LFxuXHRcdF07XG5cdH0sXG59O1xuXG4vKipcbiAqIERlZmF1bHQgYXR0cmlidXRlcyBmb3IgdGhpcyBtb2RlbFxuICogQHR5cGUge1xuICogXHR7XG4gKiBcdFx0YXR0cmlidXRlczoge1xuICogXHRcdFx0bGltaXQ6IG51bWJlcixcbiAqIFx0XHRcdG9yZGVyQnk6IHN0cmluZyxcbiAqIFx0XHRcdG9yZGVyOiBzdHJpbmcsXG4gKiAgIFx0fVxuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0UXVlcnlEYXRhID0ge1xuXHRxdWVyeURhdGE6IHtcblx0XHRsaW1pdDogMTAwLFxuXHRcdG9yZGVyQnk6ICdDSEtfdGltZXN0YW1wJyxcblx0XHRvcmRlcjogUVVFUllfT1JERVJfREVTQyxcblx0fSxcbn07XG5cbi8qKlxuICogVXNlZCB0byBtYXAgYW4gb3JkZXJCeSBzdHJpbmcgdG8gdGhlIGFjdHVhbCB2YWx1ZSB1c2VkIGluIGEgUkVTVCBxdWVyeSBmcm9tXG4gKiB0aGUgY29udGV4dCBvZiBhIHJlZ2lzdHJhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gb3JkZXJCeVxuICpcbiAqIEByZXR1cm4geyBzdHJpbmcgfSBSZXR1cm5zIGFuIGFjdHVhbCBvcmRlckJ5IHN0cmluZyBmb3IgdGhlIFJFU1QgcXVlcnkgZm9yXG4gKiAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJvdmlkZWQgYWxpYXNcbiAqL1xuZXhwb3J0IGNvbnN0IG1hcE9yZGVyQnkgPSAoIG9yZGVyQnkgKSA9PiB7XG5cdGNvbnN0IG9yZGVyQnlNYXAgPSB7XG5cdFx0dGltZXN0YW1wOiAnQ0hLX3RpbWVzdGFtcCcsXG5cdFx0aWQ6ICdDSEtfSUQnLFxuXHR9O1xuXHRyZXR1cm4gaXNVbmRlZmluZWQoIG9yZGVyQnlNYXBbIG9yZGVyQnkgXSApID9cblx0XHRvcmRlckJ5IDpcblx0XHRvcmRlckJ5TWFwWyBvcmRlckJ5IF07XG59O1xuXG4vKipcbiAqIEJ1aWxkcyB3aGVyZSBjb25kaXRpb25zIGZvciBhbiByZWdpc3RyYXRpb25zIGVuZHBvaW50IHJlcXVlc3RcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZm9yRGF0ZXRpbWVJZCAgICBcdElEIG9mIEV2ZW50IHRvIHJldHJpZXZlIHJlZ2lzdHJhdGlvbnMgZm9yXG4gKiBAcGFyYW0ge251bWJlcn0gZm9yRXZlbnRJZCAgICBJRCBvZiBBdHRlbmRlZSB0byByZXRyaWV2ZSByZWdpc3RyYXRpb25zIGZvclxuICogQHBhcmFtIHtudW1iZXJ9IGZvclJlZ2lzdHJhdGlvbklkIElEIG9mIFRyYW5zYWN0aW9uIHRvIHJldHJpZXZlIHJlZ2lzdHJhdGlvbnMgZm9yXG4gKiBAcGFyYW0ge251bWJlcn0gZm9yVGlja2V0SWQgXHRcdElEIG9mIFRpY2tldCB0byByZXRyaWV2ZSByZWdpc3RyYXRpb25zIGZvclxuICogQHBhcmFtIHtzdHJpbmd9IGZvclN0YXR1c0lkIFx0XHRJRCBvZiBTdGF0dXMgdG8gcmV0cmlldmUgcmVnaXN0cmF0aW9ucyBmb3JcbiAqIEByZXR1cm4ge3N0cmluZ30gICAgICAgICAgICAgICAgXHRUaGUgYXNzZW1ibGVkIHdoZXJlIGNvbmRpdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCB3aGVyZUNvbmRpdGlvbnMgPSAoIHtcblx0Zm9yRGF0ZXRpbWVJZCA9IDAsXG5cdGZvckV2ZW50SWQgPSAwLFxuXHRmb3JSZWdpc3RyYXRpb25JZCA9IDAsXG5cdGZvclRpY2tldElkID0gMCxcblx0Zm9yU3RhdHVzSWQgPSAnJyxcbn0gKSA9PiB7XG5cdGNvbnN0IHdoZXJlID0gW107XG5cdGZvckV2ZW50SWQgPSBwYXJzZUludCggZm9yRXZlbnRJZCwgMTAgKTtcblx0aWYgKCBmb3JFdmVudElkICE9PSAwICYmICEgaXNOYU4oIGZvckV2ZW50SWQgKSApIHtcblx0XHR3aGVyZS5wdXNoKCAnd2hlcmVbUmVnaXN0cmF0aW9uLkVWVF9JRF09JyArIGZvckV2ZW50SWQgKTtcblx0fVxuXHRmb3JEYXRldGltZUlkID0gcGFyc2VJbnQoIGZvckRhdGV0aW1lSWQsIDEwICk7XG5cdGlmICggZm9yRGF0ZXRpbWVJZCAhPT0gMCAmJiAhIGlzTmFOKCBmb3JEYXRldGltZUlkICkgKSB7XG5cdFx0d2hlcmUucHVzaCggJ3doZXJlW0RUVF9JRF09JyArIGZvckRhdGV0aW1lSWQgKTtcblx0fVxuXHRmb3JSZWdpc3RyYXRpb25JZCA9IHBhcnNlSW50KCBmb3JSZWdpc3RyYXRpb25JZCwgMTAgKTtcblx0aWYgKCBmb3JSZWdpc3RyYXRpb25JZCAhPT0gMCAmJiAhIGlzTmFOKCBmb3JSZWdpc3RyYXRpb25JZCApICkge1xuXHRcdHdoZXJlLnB1c2goICd3aGVyZVtSRUdfSURdPScgKyBmb3JSZWdpc3RyYXRpb25JZCApO1xuXHR9XG5cdGZvclRpY2tldElkID0gcGFyc2VJbnQoIGZvclRpY2tldElkLCAxMCApO1xuXHRpZiAoIGZvclRpY2tldElkICE9PSAwICYmICEgaXNOYU4oIGZvclRpY2tldElkICkgKSB7XG5cdFx0d2hlcmUucHVzaCggJ3doZXJlW1JlZ2lzdHJhdGlvbi5US1RfSURdPScgKyBmb3JUaWNrZXRJZCApO1xuXHR9XG5cdGlmICggZm9yU3RhdHVzSWQgIT09ICcnICYmIGZvclN0YXR1c0lkICE9PSBudWxsICkge1xuXHRcdHdoZXJlLnB1c2goICd3aGVyZVtDSEtfaW5dPScgKyBmb3JTdGF0dXNJZCApO1xuXHR9XG5cdHJldHVybiB3aGVyZS5qb2luKCAnJicgKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIGEgcXVlcnkgc3RyaW5nIGZvciB1c2UgYnkgYSBSRVNUIHJlcXVlc3QgZ2l2ZW4gYSBzZXQgb2YgcXVlcnlEYXRhLlxuICogQHBhcmFtIHsgT2JqZWN0IH0gcXVlcnlEYXRhXG4gKiBAcmV0dXJuIHsgc3RyaW5nIH0gIFJldHVybnMgdGhlIHF1ZXJ5IHN0cmluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFF1ZXJ5U3RyaW5nID0gKCBxdWVyeURhdGEgPSB7fSApID0+IHtcblx0cXVlcnlEYXRhID0geyAuLi5kZWZhdWx0UXVlcnlEYXRhLnF1ZXJ5RGF0YSwgLi4ucXVlcnlEYXRhIH07XG5cdHJldHVybiBiYXNlR2V0UXVlcnlTdHJpbmcoIHF1ZXJ5RGF0YSwgd2hlcmVDb25kaXRpb25zLCBtYXBPcmRlckJ5ICk7XG59O1xuIiwiaW1wb3J0IHsgdmFsdWVzIH0gZnJvbSAnbG9kYXNoJztcblxuZXhwb3J0IGNvbnN0IE1PREVMX05BTUUgPSAnZGF0ZXRpbWUnO1xuXG5leHBvcnQgY29uc3QgREFURVRJTUVfU1RBVFVTX0lEID0ge1xuXHRTT0xEX09VVDogJ0RUUycsXG5cdEFDVElWRTogJ0RUQScsXG5cdFVQQ09NSU5HOiAnRFRVJyxcblx0UE9TVFBPTkVEOiAnRFRQJyxcblx0Q0FOQ0VMTEVEOiAnRFRDJyxcblx0RVhQSVJFRDogJ0RURScsXG5cdElOQUNUSVZFOiAnRFRJJyxcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFVElNRV9TVEFUVVNfSURTID0gdmFsdWVzKCBEQVRFVElNRV9TVEFUVVNfSUQgKTtcbiIsIi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgKiBhcyBiYXNlRm9ybWF0dGVyIGZyb20gJy4uL2Jhc2UtZGF0ZS1mb3JtYXR0ZXInO1xuXG4vKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgZm9yT3duLCBwdWxsQXQgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcblx0VElNRV9GT1JNQVRfU0lURSxcblx0REFURV9USU1FX0ZPUk1BVF9TSVRFLFxuXHRhbGxEYXRlVGltZXNBc1N0cmluZyxcblx0U0VQQVJBVE9SX1NQQUNFX0RBU0hfU1BBQ0UsXG59IGZyb20gJ0BldmVudGVzcHJlc3NvL2hlbHBlcnMnO1xuaW1wb3J0IHsgaXNNb2RlbEVudGl0eU9mTW9kZWwgfSBmcm9tICdAZXZlbnRlc3ByZXNzby92YWxpZGF0b3JzJztcblxuLyoqXG4gKiBBcnJheSBvZiBmaWVsZHMgdGhhdCBoYXZlIGRhdGUgaW5mb3JtYXRpb25cbiAqIEB0eXBlIHsgc3RyaW5nW10gfVxuICovXG5leHBvcnQgY29uc3QgREFURV9GSUVMRFMgPSBbXG5cdCdEVFRfRVZUX3N0YXJ0Jyxcblx0J0RUVF9FVlRfZW5kJyxcbl07XG5cbi8qKlxuICogV2lsbCBob2xkIHRoZSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgbGlzdCBvZiBmb3JtYXR0ZXJzIGZvciBkYXRlcy4gIEZvcm1hdHRlcnNcbiAqIGFyZSBmdW5jdGlvbnMgZGVmaW5lZCBpbiBgLi4vYmFzZS1kYXRlLWZvcm1hdHRlcmAgYnV0IHdyYXBwZWQgYnkgZHluYW1pY2FsbHlcbiAqIGdlbmVyYXRlZCBmdW5jdGlvbnMgKGNhbGxhYmxlIHZpYSBzYW1lIG5hbWUpIHRoYXQgYXV0b21hdGljYWxseSByZWNlaXZlIHRoZVxuICogY29ycmVjdCBkYXRlRmllbGRzTWFwIGFyZ3VtZW50LlxuICpcbiAqIEVnLiAgYC4uL2Jhc2UtZGF0ZS1mb3JtYXR0ZXIgaGFzXG4gKiBmb3JtYXREYXRlc09uRW50aXRpZXMoIGVudGl0aWVzLCBlbnRpdHlEYXRlRmllbGRzLCBmb3JtYXQsIGxvY2FsICk7XG4gKiBXaGVuIGltcG9ydGluZyBgZm9ybWF0RGF0ZXNPbkVudGl0aWVzYCBmcm9tIHRoaXMgZmlsZSwgeW91IGNhbiBjYWxsIGl0IHNpbXBseVxuICogYnkgZG9pbmcgdGhpczpcbiAqXG4gKiBmb3JtYXREYXRlc09uRW50aXRpZXMoIGRhdGVUaW1lT2JqZWN0cywgZm9ybWF0LCBsb2NhbCApO1xuICpcbiAqIE5vdGljZSB0aGF0IGl0J3MgY2FsbGVkIHdpdGhvdXQgdGhlIGVudGl0eURhdGVGaWVsZHMgYXJndW1lbnQgYmVjYXVzZSB0aGF0J3NcbiAqIHByb3ZpZGVkIGJ5IHRoaXMgZ2VuZXJhdG9yLlxuICpcbiAqIEB0eXBlIHt7fX1cbiAqL1xuY29uc3QgZm9ybWF0dGVycyA9IHt9O1xuXG5mb3JPd24oIGJhc2VGb3JtYXR0ZXIsICggaW1wbGVtZW50YXRpb24sIGZ1bmN0aW9uTmFtZSApID0+IHtcblx0Zm9ybWF0dGVyc1sgZnVuY3Rpb25OYW1lIF0gPSAoIC4uLmluY29taW5nQXJncyApID0+IHtcblx0XHRjb25zdCBmaXJzdEFyZyA9IHB1bGxBdCggaW5jb21pbmdBcmdzLCAwICk7XG5cdFx0cmV0dXJuIGltcGxlbWVudGF0aW9uKCBmaXJzdEFyZ1sgMCBdLCBEQVRFX0ZJRUxEUywgLi4uaW5jb21pbmdBcmdzICk7XG5cdH07XG59ICk7XG5cbi8qKlxuICogVGhpcyB3aWxsIHNwaXQgb3V0IGEgcHJldHRpZmllZCBsYWJlbCBmb3IgdGhlIHByb3ZpZGVkIERhdGVUaW1lIGVudGl0eS5cbiAqXG4gKiBJZiB0aGVyZSBpcyBhIERUVF9uYW1lLCB0aGUgZm9ybWF0IHdpbGwgYmU6XG4gKiBgRFRUX25hbWUgKERUVF9FVlRfc3RhcnQgLSBEVFRfRVZUX2VuZClgXG4gKlxuICogSWYgbm8gRFRUX25hbWUgdGhlbjpcbiAqIGBEVFRfRVZUX3N0YXJ0IC0gRFRUX0VWVF9lbmRgXG4gKlxuICogVGhpcyB3aWxsIGFjY291bnQgZm9yIGlmIGJvdGggc3RhcnQgYW5kIGVuZCBhcmUgaW4gdGhlIHNhbWUgZGF5IGFuZCBzaW1wbHlcbiAqIHVzZSB0aW1lIGZvciB0aGUgZW5kIHBhcnQuXG4gKlxuICogQHBhcmFtIHsgQmFzZUVudGl0eSB9IERhdGVUaW1lRW50aXR5XG4gKiBAcmV0dXJuIHsgc3RyaW5nIH0gIEEgZm9ybWF0dGVkIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHByb3ZpZGVkXG4gKiAgICBEYXRlVGltZUVudGl0eS5cbiAqL1xuZXhwb3J0IGNvbnN0IHByZXR0eURhdGVGcm9tRGF0ZVRpbWUgPSAoIERhdGVUaW1lRW50aXR5ICkgPT4ge1xuXHRsZXQgY29udGVudCA9ICcnO1xuXHRpZiAoIGlzTW9kZWxFbnRpdHlPZk1vZGVsKCBEYXRlVGltZUVudGl0eSwgJ2RhdGV0aW1lJyApICkge1xuXHRcdGlmICggRGF0ZVRpbWVFbnRpdHkuRFRUX0VWVF9zdGFydC5oYXNTYW1lKFxuXHRcdFx0RGF0ZVRpbWVFbnRpdHkuRFRUX0VWVF9lbmQsXG5cdFx0XHQnZGF5J1xuXHRcdCkgKSB7XG5cdFx0XHRjb250ZW50ICs9IGFsbERhdGVUaW1lc0FzU3RyaW5nKFxuXHRcdFx0XHRTRVBBUkFUT1JfU1BBQ0VfREFTSF9TUEFDRSxcblx0XHRcdFx0RGF0ZVRpbWVFbnRpdHkuRFRUX0VWVF9zdGFydC50b0Zvcm1hdChcblx0XHRcdFx0XHREQVRFX1RJTUVfRk9STUFUX1NJVEVcblx0XHRcdFx0KSxcblx0XHRcdFx0RGF0ZVRpbWVFbnRpdHkuRFRUX0VWVF9lbmQudG9Gb3JtYXQoXG5cdFx0XHRcdFx0VElNRV9GT1JNQVRfU0lURVxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29udGVudCArPSBhbGxEYXRlVGltZXNBc1N0cmluZyhcblx0XHRcdFx0U0VQQVJBVE9SX1NQQUNFX0RBU0hfU1BBQ0UsXG5cdFx0XHRcdERhdGVUaW1lRW50aXR5LkRUVF9FVlRfc3RhcnQudG9Gb3JtYXQoXG5cdFx0XHRcdFx0REFURV9USU1FX0ZPUk1BVF9TSVRFXG5cdFx0XHRcdCksXG5cdFx0XHRcdERhdGVUaW1lRW50aXR5LkRUVF9FVlRfZW5kLnRvRm9ybWF0KFxuXHRcdFx0XHRcdERBVEVfVElNRV9GT1JNQVRfU0lURVxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0Y29udGVudCA9IERhdGVUaW1lRW50aXR5LkRUVF9uYW1lID9cblx0XHRcdGAkeyBEYXRlVGltZUVudGl0eS5EVFRfbmFtZSB9ICgkeyBjb250ZW50IH0pYCA6XG5cdFx0XHRjb250ZW50O1xuXHR9XG5cdHJldHVybiBjb250ZW50O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZm9ybWF0dGVycztcbiIsImV4cG9ydCAqIGZyb20gJy4vY29uc3RhbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vcXVlcnknO1xuZXhwb3J0ICogZnJvbSAnLi9mb3JtYXR0ZXInO1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50LXRpbWV6b25lJztcbmltcG9ydCB7IGlzVW5kZWZpbmVkIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbi8qKlxuICogSW50ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cbmltcG9ydCB7XG5cdGdldFF1ZXJ5U3RyaW5nIGFzIGJhc2VHZXRRdWVyeVN0cmluZyxcblx0UVVFUllfT1JERVJfREVTQyxcblx0QUxMT1dFRF9PUkRFUl9WQUxVRVMsXG5cdEdSRUFURVJfVEhBTixcblx0R1JFQVRFUl9USEFOX0FORF9FUVVBTCxcblx0TEVTU19USEFOX0FORF9FUVVBTCxcbn0gZnJvbSAnLi4vYmFzZSc7XG5cbmV4cG9ydCBjb25zdCBub3dEYXRlQW5kVGltZSA9IG1vbWVudCgpO1xuXG4vKipcbiAqIERlc2NyaWJlZCBhdHRyaWJ1dGVzIGZvciB0aGlzIG1vZGVsXG4gKiBAdHlwZSB7e2F0dHJpYnV0ZXM6ICp9fVxuICovXG5leHBvcnQgY29uc3QgcXVlcnlEYXRhVHlwZXMgPSB7XG5cdHF1ZXJ5RGF0YTogUHJvcFR5cGVzLnNoYXBlKCB7XG5cdFx0bGltaXQ6IFByb3BUeXBlcy5udW1iZXIsXG5cdFx0b3JkZXJCeTogUHJvcFR5cGVzLm9uZU9mKCBbXG5cdFx0XHQnRFRUX25hbWUnLFxuXHRcdFx0J0RUVF9JRCcsXG5cdFx0XHQnc3RhcnRfZGF0ZScsXG5cdFx0XHQnZW5kX2RhdGUnLFxuXHRcdF0gKSxcblx0XHRvcmRlcjogUHJvcFR5cGVzLm9uZU9mKCBBTExPV0VEX09SREVSX1ZBTFVFUyApLFxuXHRcdHNob3dFeHBpcmVkOiBQcm9wVHlwZXMuYm9vbCxcblx0XHRtb250aDogUHJvcFR5cGVzLm1vbnRoLFxuXHR9ICksXG59O1xuXG4vKipcbiAqIERlZmF1bHQgYXR0cmlidXRlcyBmb3IgdGhpcyBtb2RlbFxuICogQHR5cGUge1xuICogXHR7XG4gKiBcdFx0YXR0cmlidXRlczoge1xuICogXHRcdFx0bGltaXQ6IG51bWJlcixcbiAqIFx0XHRcdG9yZGVyQnk6IHN0cmluZyxcbiAqIFx0XHRcdG9yZGVyOiBzdHJpbmcsXG4gKiAgIFx0XHRzaG93RXhwaXJlZDogYm9vbGVhblxuICogICBcdH1cbiAqICAgfVxuICogfVxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdFF1ZXJ5RGF0YSA9IHtcblx0cXVlcnlEYXRhOiB7XG5cdFx0bGltaXQ6IDEwMCxcblx0XHRvcmRlckJ5OiAnc3RhcnRfZGF0ZScsXG5cdFx0b3JkZXI6IFFVRVJZX09SREVSX0RFU0MsXG5cdFx0c2hvd0V4cGlyZWQ6IGZhbHNlLFxuXHR9LFxufTtcblxuLyoqXG4gKiBVc2VkIHRvIG1hcCBhbiBvcmRlckJ5IHN0cmluZyB0byB0aGUgYWN0dWFsIHZhbHVlIHVzZWQgaW4gYSBSRVNUIHF1ZXJ5IGZyb21cbiAqIHRoZSBjb250ZXh0IG9mIGFuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcmRlckJ5XG4gKlxuICogQHJldHVybiB7IHN0cmluZyB9IFJldHVybnMgYW4gYWN0dWFsIG9yZGVyQnkgc3RyaW5nIGZvciB0aGUgUkVTVCBxdWVyeSBmb3JcbiAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm92aWRlZCBhbGlhc1xuICovXG5leHBvcnQgY29uc3QgbWFwT3JkZXJCeSA9ICggb3JkZXJCeSApID0+IHtcblx0Y29uc3Qgb3JkZXJCeU1hcCA9IHtcblx0XHRzdGFydF9kYXRlOiAnRFRUX0VWVF9zdGFydCcsXG5cdFx0ZW5kX2RhdGU6ICdEVFRfRVZUX2VuZCcsXG5cdH07XG5cdHJldHVybiBpc1VuZGVmaW5lZCggb3JkZXJCeU1hcFsgb3JkZXJCeSBdICkgP1xuXHRcdG9yZGVyQnkgOlxuXHRcdG9yZGVyQnlNYXBbIG9yZGVyQnkgXTtcbn07XG5cbi8qKlxuICogQnVpbGRzIHdoZXJlIGNvbmRpdGlvbnMgZm9yIGFuIGV2ZW50cyBlbmRwb2ludCByZXF1ZXN0IHVzaW5nIHByb3ZpZGVkXG4gKiBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZm9yRXZlbnRJZCAgSUQgZm9yIEV2ZW50IHRvIHJldHJpZXZlIGRhdGV0aW1lcyBmcm9tXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNob3dFeHBpcmVkICBXaGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIGV4cGlyZWQgZXZlbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IG1vbnRoICAgICAgICAgUmV0dXJuIGV2ZW50cyBmb3IgdGhlIGdpdmVuIG1vbnRoLiAgQ2FuIGJlIGFueVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhbnkgbW9udGggZm9ybWF0IHJlY29nbml6ZWQgYnkgbW9tZW50LlxuICogQHJldHVybiB7c3RyaW5nfSAgICAgICAgICAgICBUaGUgYXNzZW1ibGVkIHdoZXJlIGNvbmRpdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCB3aGVyZUNvbmRpdGlvbnMgPSAoIHtcblx0Zm9yRXZlbnRJZCA9IDAsXG5cdHNob3dFeHBpcmVkID0gZmFsc2UsXG5cdG1vbnRoID0gJ25vbmUnLFxufSApID0+IHtcblx0Y29uc3Qgd2hlcmUgPSBbXTtcblx0aWYgKCAhIHNob3dFeHBpcmVkICkge1xuXHRcdHdoZXJlLnB1c2goXG5cdFx0XHQnd2hlcmVbRFRUX0VWVF9lbmQqKmV4cGlyZWRdW109JyArIEdSRUFURVJfVEhBTiArXG5cdFx0XHQnJndoZXJlW0RUVF9FVlRfZW5kKipleHBpcmVkXVtdPScgK1xuXHRcdFx0bm93RGF0ZUFuZFRpbWUubG9jYWwoKS5mb3JtYXQoKVxuXHRcdCk7XG5cdH1cblx0aWYgKCBtb250aCAmJiBtb250aCAhPT0gJ25vbmUnICkge1xuXHRcdHdoZXJlLnB1c2goXG5cdFx0XHQnd2hlcmVbRFRUX0VWVF9zdGFydF1bXT0nICsgR1JFQVRFUl9USEFOX0FORF9FUVVBTCArXG5cdFx0XHQnJndoZXJlW0RUVF9FVlRfc3RhcnRdW109JyArXG5cdFx0XHRtb21lbnQoKS5tb250aCggbW9udGggKS5zdGFydE9mKCAnbW9udGgnICkubG9jYWwoKS5mb3JtYXQoKVxuXHRcdCk7XG5cdFx0d2hlcmUucHVzaChcblx0XHRcdCd3aGVyZVtEVFRfRVZUX2VuZF1bXT0nICsgTEVTU19USEFOX0FORF9FUVVBTCArXG5cdFx0XHQnJndoZXJlW0RUVF9FVlRfZW5kXVtdPScgK1xuXHRcdFx0bW9tZW50KCkubW9udGgoIG1vbnRoICkuZW5kT2YoICdtb250aCcgKS5sb2NhbCgpLmZvcm1hdCgpXG5cdFx0KTtcblx0fVxuXHRpZiAoIHBhcnNlSW50KCBmb3JFdmVudElkLCAxMCApICE9PSAwICkge1xuXHRcdHdoZXJlLnB1c2goICd3aGVyZVtFdmVudC5FVlRfSURdPScgKyBmb3JFdmVudElkICk7XG5cdH1cblx0cmV0dXJuIHdoZXJlLmpvaW4oICcmJyApO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gYSBxdWVyeSBzdHJpbmcgZm9yIHVzZSBieSBhIFJFU1QgcmVxdWVzdCBnaXZlbiBhIHNldCBvZiBxdWVyeURhdGEuXG4gKiBAcGFyYW0geyBPYmplY3QgfSBxdWVyeURhdGFcbiAqIEByZXR1cm4geyBzdHJpbmcgfSAgUmV0dXJucyB0aGUgcXVlcnkgc3RyaW5nLlxuICovXG5leHBvcnQgY29uc3QgZ2V0UXVlcnlTdHJpbmcgPSAoIHF1ZXJ5RGF0YSA9IHt9ICkgPT4ge1xuXHRxdWVyeURhdGEgPSB7IC4uLmRlZmF1bHRRdWVyeURhdGEucXVlcnlEYXRhLCAuLi5xdWVyeURhdGEgfTtcblx0cmV0dXJuIGJhc2VHZXRRdWVyeVN0cmluZyggcXVlcnlEYXRhLCB3aGVyZUNvbmRpdGlvbnMsIG1hcE9yZGVyQnkgKTtcbn07XG4iLCIvKipcbiAqIEV4dGVybmFsIGRlcGVuZGVuY2llc1xuICovXG5pbXBvcnQgeyBtYXBWYWx1ZXMgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG1lbW9pemUgZnJvbSAnbWVtaXplJztcblxuLyoqXG4gKiBJbnRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqL1xuaW1wb3J0IHsgZW5kcG9pbnRzIH0gZnJvbSAnLi9lbmRwb2ludHMuanMnO1xuXG4vKipcbiAqIFJlY2VpdmVzIGFuIG9iamVjdCBtYXAgb2YgbW9kZWxOYW1lIHRvIGVuZHBvaW50IGFuZCBtYXBzIHRoYXQgdG8gYSBkZWZhdWx0XG4gKiBtYXAgb2YgbW9kZWxOYW1lIHRvIGVtcHR5IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0geyBPYmplY3QgfSBtb2RlbE5hbWVFbmRwb2ludHNcbiAqIEByZXR1cm4geyBPYmplY3QgfSBBbiBvYmplY3Qgb2YgeyB7IG1vZGVsTmFtZSB9IDoge30gfVxuICovXG5jb25zdCBtYXBUb09iamVjdFZhbHVlcyA9ICggbW9kZWxOYW1lRW5kcG9pbnRzICkgPT4ge1xuXHRyZXR1cm4gbWFwVmFsdWVzKCBtb2RlbE5hbWVFbmRwb2ludHMsXG5cdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fSxcblx0KTtcbn07XG5cbmNvbnN0IGdldERlZmF1bHRNb2RlbEVudGl0aWVzT2JqZWN0ID0gbWVtb2l6ZShcblx0KCkgPT4gbWFwVG9PYmplY3RWYWx1ZXMoIGVuZHBvaW50cyApXG4pO1xuXG4vKipcbiAqIFByb3ZpZGVzIHRoZSBkZWZhdWx0IHN0YXRlIHRvIGJlIHVzZWQgYnkgc3RvcmVzIGNvbnRhaW5pbmcgbGlzdHMuXG4gKlxuICogQHR5cGUgeyBPYmplY3QgfVxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9MSVNUU19TVEFURSA9IG1hcFRvT2JqZWN0VmFsdWVzKCBlbmRwb2ludHMgKTtcblxuLyoqXG4gKiBQcm92aWRlcyB0aGUgZGVmYXVsdCBzdGF0ZSB0byBiZSB1c2VkIGJ5IHRoZSBjb3JlIHN0b3JlLlxuICpcbiAqIEB0eXBlIHt7ZW50aXRpZXM6IHt9LCBlbnRpdHlJZHM6IHt9LCBkaXJ0eToge319fVxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9DT1JFX1NUQVRFID0ge1xuXHRlbnRpdGllczoge1xuXHRcdC4uLmdldERlZmF1bHRNb2RlbEVudGl0aWVzT2JqZWN0KCksXG5cdH0sXG5cdHJlbGF0aW9uczoge1xuXHRcdGluZGV4OiB7fSxcblx0XHRlbnRpdHlNYXA6IHt9LFxuXHR9LFxuXHRkaXJ0eToge1xuXHRcdHJlbGF0aW9uczoge1xuXHRcdFx0aW5kZXg6IHt9LFxuXHRcdFx0ZGVsZXRlOiB7fSxcblx0XHRcdGFkZDoge30sXG5cdFx0fSxcblx0XHR0cmFzaDoge30sXG5cdFx0ZGVsZXRlOiB7fSxcblx0fSxcbn07XG5cbi8qKlxuICogUHJvdmlkZXMgdGhlIGRlZmF1bHQgc3RhdGUgdG8gYmUgdXNlZCBieSB0aGUgc2NoZW1hIHN0b3JlLlxuICogQHR5cGUge09iamVjdH1cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0NIRU1BX1NUQVRFID0ge1xuXHRzY2hlbWE6IHtcblx0XHQuLi5nZXREZWZhdWx0TW9kZWxFbnRpdGllc09iamVjdCgpLFxuXHR9LFxuXHRmYWN0b3J5OiB7XG5cdFx0Li4uZ2V0RGVmYXVsdE1vZGVsRW50aXRpZXNPYmplY3QoKSxcblx0fSxcblx0cmVsYXRpb25FbmRwb2ludHM6IHtcblx0XHQuLi5nZXREZWZhdWx0TW9kZWxFbnRpdGllc09iamVjdCgpLFxuXHR9LFxuXHRyZWxhdGlvblNjaGVtYToge30sXG59O1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IGRhdGEgfSBmcm9tICdAZXZlbnRlc3ByZXNzby9lZWpzJztcblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IGFzc2VydEVudGl0eUhhc0tleSB9IGZyb20gJy4vYXNzZXJ0aW9ucyc7XG5cbi8qKlxuICogQWxsIGF2YWlsYWJsZSBlbmRwb2ludHMgZXhwb3NlZCB2aWEgdGhlIGVlanMuZGF0YSBnbG9iYWwgZnJvbSB0aGUgc2VydmVyLlxuICpcbiAqIEB0eXBlIHt7fX1cbiAqL1xuZXhwb3J0IGNvbnN0IHtcblx0Y29sbGVjdGlvbl9lbmRwb2ludHM6IGVuZHBvaW50cyA9IHt9LFxuXHRiYXNlX3Jlc3Rfcm91dGU6IGJhc2VSZXN0Um91dGUsXG59ID0gZGF0YS5wYXRocztcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGVuZHBvaW50IGZvciB0aGUgcHJvdmlkZWQgbW9kZWwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZSAgV2hhdCBtb2RlbCB0byByZXRyaWV2ZSB0aGUgZW5kcG9pbnQgZm9yLlxuICogQHJldHVybiB7c3RyaW5nfSAgVGhlIGVuZHBvaW50IGZvciB0aGUgcHJvdmlkZWQgbW9kZWwuXG4gKiBAdGhyb3dzIHtFeGNlcHRpb259XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFbmRwb2ludCA9ICggbW9kZWxOYW1lICkgPT4ge1xuXHRhc3NlcnRFbnRpdHlIYXNLZXkoIG1vZGVsTmFtZSwgZW5kcG9pbnRzICk7XG5cdHJldHVybiBlbmRwb2ludHNbIG1vZGVsTmFtZSBdO1xufTtcblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBwcm92aWRlZCBxdWVyeVN0cmluZyB0byB0aGUgZW5kcG9pbnQgZm9yIHRoZSBwcm92aWRlZCBtb2RlbCBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZSAgV2hhdCBtb2RlbCB0aGUgZmluYWwgc3RyaW5nIGlzIGZvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeVN0cmluZyAgVGhlIHF1ZXJ5IGJlaW5nIGFwcGVuZGVkIHRvIHRoZSBlbmRwb2ludC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZpbmFsIGFzc2VtYmxlZCBxdWVyeSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBhcHBseVF1ZXJ5U3RyaW5nID0gKCBtb2RlbE5hbWUsIHF1ZXJ5U3RyaW5nID0gJycgKSA9PiB7XG5cdHJldHVybiBxdWVyeVN0cmluZyAhPT0gJycgP1xuXHRcdGdldEVuZHBvaW50KCBtb2RlbE5hbWUgKSArICc/JyArIHF1ZXJ5U3RyaW5nIDpcblx0XHRnZXRFbmRwb2ludCggbW9kZWxOYW1lICk7XG59O1xuXG4vKipcbiAqIFN0cmlwcyB0aGUgYmFzZV9yZXN0X3JvdXRlIChpLmUuIGh0dHBzOi8vbXl1cmwuY29tL3dwLWpzb24vKSBmcm9tIHRoZSBwcm92aWRlZFxuICogdXJsIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSB1cmwgd2l0aCB0aGUgYmFzZSByZXN0IHJvdXRlIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBzdHJpcEJhc2VSb3V0ZUZyb21VcmwgPSAoIHVybCApID0+IHtcblx0cmV0dXJuIHVybC5yZXBsYWNlKCBiYXNlUmVzdFJvdXRlLCAnJyApO1xufTtcbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBpc1VuZGVmaW5lZCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBzcHJpbnRmIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vaTE4bic7XG5pbXBvcnQgeyBJbnZhbGlkU2NoZW1hIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vZWVqcyc7XG5pbXBvcnQgeyBpc1NjaGVtYSB9IGZyb20gJ0BldmVudGVzcHJlc3NvL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHtcblx0TW9uZXksXG5cdFNlcnZlckRhdGVUaW1lIGFzIERhdGVUaW1lLFxufSBmcm9tICdAZXZlbnRlc3ByZXNzby92YWx1ZS1vYmplY3RzJztcbi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQge1xuXHRpc0RhdGVUaW1lRmllbGQsXG5cdGlzTW9uZXlGaWVsZCxcbn0gZnJvbSAnLi9ib29sZWFucyc7XG5pbXBvcnQge1xuXHRpc1NoYWxsb3dWYWxpZFZhbHVlRm9yRmllbGQsXG5cdHZhbGlkYXRlRW51bVR5cGUsXG5cdHZhbGlkYXRlVHlwZSxcblx0dmFsaWRhdGVUeXBlRm9yRmllbGQsXG59IGZyb20gJy4vdmFsaWRhdG9ycyc7XG5pbXBvcnQgeyBtYXliZUNvbnZlcnRGcm9tVmFsdWVPYmplY3RXaXRoQXNzZXJ0aW9ucyB9IGZyb20gJy4vZXh0cmFjdG9ycyc7XG5cbi8qKlxuICogQXNzZXJ0cyB3aGV0aGVyIHRoZSBwcm92aWRlZCBmaWVsZCB2YWx1ZSBpcyBhIGtub3duIHZhbHVlIG9iamVjdC5cbiAqXG4gKiBOb3RlOiB0aGlzIG9ubHkgYXNzZXJ0cyBrbm93biB2YWx1ZSBvYmplY3RzLCBpZiB0aGUgdmFsdWUgaXMgbm90IGRldGVjdGVkIGFzXG4gKiBhIGtub3duIHZhbHVlIG9iamVjdCBpdCBpcyBwYXNzZWQgYmFjayBhcyBpcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lXG4gKiBAcGFyYW0geyp9IGZpZWxkVmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWFcbiAqIEB0aHJvd3MgSW52YWxpZERhdGVUaW1lXG4gKiBAdGhyb3dzIFR5cGVFcnJvclxuICovXG5leHBvcnQgY29uc3QgbWF5YmVBc3NlcnRWYWx1ZU9iamVjdCA9ICggZmllbGROYW1lLCBmaWVsZFZhbHVlLCBzY2hlbWEgKSA9PiB7XG5cdGlmICggaXNEYXRlVGltZUZpZWxkKCBmaWVsZE5hbWUsIHNjaGVtYSApICkge1xuXHRcdERhdGVUaW1lLmFzc2VydElzRGF0ZVRpbWUoIGZpZWxkVmFsdWUgKTtcblx0fVxuXHRpZiAoIGlzTW9uZXlGaWVsZCggZmllbGROYW1lLCBzY2hlbWEgKSApIHtcblx0XHRNb25leS5hc3NlcnRNb25leSggZmllbGRWYWx1ZSApO1xuXHR9XG59O1xuXG4vKipcbiAqIEFzc2VydHMgd2hldGhlciB0aGUgcHJvdmlkZWQgb2JqZWN0IGlzIGEgdmFsaWQgbW9kZWwgc2NoZW1hIG9iamVjdC5cbiAqXG4gKiBDdXJyZW50bHksIGFuIG9iamVjdCBpcyBjb25zaWRlcmVkIGEgdmFsaWQgbW9kZWwgc2NoZW1hIGlmIGl0IGhhcyBhXG4gKiAncHJvcGVydGllcycgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHsqfSBzY2hlbWFcbiAqIEB0aHJvd3MgSW52YWxpZFNjaGVtYVxuICovXG5leHBvcnQgY29uc3QgYXNzZXJ0VmFsaWRTY2hlbWEgPSAoIHNjaGVtYSApID0+IHtcblx0aWYgKCAhIGlzU2NoZW1hKCBzY2hlbWEgKSApIHtcblx0XHR0aHJvdyBuZXcgSW52YWxpZFNjaGVtYShcblx0XHRcdCdUaGlzIGlzIGFuIGludmFsaWQgc2NoZW1hIGZvciBhIG1vZGVsLicsXG5cdFx0KTtcblx0fVxufTtcblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGZpZWxkIGV4aXN0cyBpbiB0aGUgcHJvdmlkZWQgc2NoZW1hIGFuZCB0aGUgc2hhcGUgZm9yXG4gKiB0aGUgc2NoZW1hIGVudHJ5IG9uIHRoYXQgZmllbGQgaXMgZXhwZWN0ZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZSAgVGhlIG1vZGVsIHRoZSBzY2hlbWEgYmVsb25ncyB0bywgdGhpcyBpcyB1c2VkIGZvclxuICogZXJyb3IgbWVzc2FnZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lICBUaGUgZmllbGQgYmVpbmcgY2hlY2tlZCBhZ2FpbnN0IHRoZSBzY2hlbWFcbiAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWEgICAgIFRoZSBzY2hlbWEgZm9yIHRoZSBtb2RlbCB1c2VkIGZvciB2YWxpZGF0aW9uXG4gKiBAdGhyb3dzIEludmFsaWRTY2hlbWFcbiAqIEB0aHJvd3MgVHlwZUVycm9yXG4gKi9cbmV4cG9ydCBjb25zdCBhc3NlcnRWYWxpZFNjaGVtYUZpZWxkUHJvcGVydGllcyA9IChcblx0bW9kZWxOYW1lLFxuXHRmaWVsZE5hbWUsXG5cdHNjaGVtYSxcbikgPT4ge1xuXHRpZiAoIGlzVW5kZWZpbmVkKCBzY2hlbWFbIGZpZWxkTmFtZSBdICkgKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcblx0XHRcdHNwcmludGYoXG5cdFx0XHRcdCdUaGUgZ2l2ZW4gXCIlc1wiIGZpZWxkTmFtZSBkb2VzIG5vdCBoYXZlIGEgZGVmaW5lZCBzY2hlbWEgJyArXG5cdFx0XHRcdCdmb3IgdGhlIG1vZGVsIFwiJXNcIicsXG5cdFx0XHRcdGZpZWxkTmFtZSxcblx0XHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0KSxcblx0XHQpO1xuXHR9XG5cdGlmICggc2NoZW1hWyBmaWVsZE5hbWUgXS50eXBlID09PSAnb2JqZWN0JyApIHtcblx0XHRpZiAoIGlzVW5kZWZpbmVkKCBzY2hlbWFbIGZpZWxkTmFtZSBdLnByb3BlcnRpZXMgKSApIHtcblx0XHRcdHRocm93IG5ldyBJbnZhbGlkU2NoZW1hKFxuXHRcdFx0XHRzcHJpbnRmKFxuXHRcdFx0XHRcdCdUaGUgc2NoZW1hIGZvciB0aGUgZmllbGQgJXMgb24gdGhlIG1vZGVsICVzIGlzIG9mIHR5cGUgJyArXG5cdFx0XHRcdFx0J1wib2JqZWN0XCIgYnV0IGRvZXMgbm90IGhhdmUgYSBwcm9wZXJ0aWVzIHByb3BlcnR5LicsXG5cdFx0XHRcdFx0ZmllbGROYW1lLFxuXHRcdFx0XHRcdG1vZGVsTmFtZVxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRpZiAoIGlzVW5kZWZpbmVkKCBzY2hlbWFbIGZpZWxkTmFtZSBdLnByb3BlcnRpZXMucmF3ICkgKSB7XG5cdFx0XHR0aHJvdyBuZXcgSW52YWxpZFNjaGVtYShcblx0XHRcdFx0c3ByaW50Zihcblx0XHRcdFx0XHQnVGhlIHNjaGVtYSBmb3IgdGhlIGZpZWxkICVzIG9uIHRoZSBtb2RlbCAlcyBpcyBvZiB0eXBlICcgK1xuXHRcdFx0XHRcdCdcIm9iamVjdFwiIGJ1dCBkb2VzIG5vdCBoYXZlIGEgcmF3IHByb3BlcnR5IGluIGl0XFwncyAnICtcblx0XHRcdFx0XHQnXCJwcm9wZXJ0aWVzXCIgcHJvcGVydHkuJyxcblx0XHRcdFx0XHRmaWVsZE5hbWUsXG5cdFx0XHRcdFx0bW9kZWxOYW1lXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fVxuXHRcdGlmICggaXNVbmRlZmluZWQoIHNjaGVtYVsgZmllbGROYW1lIF0ucHJvcGVydGllcy5yYXcudHlwZSApICkge1xuXHRcdFx0dGhyb3cgbmV3IEludmFsaWRTY2hlbWEoXG5cdFx0XHRcdHNwcmludGYoXG5cdFx0XHRcdFx0J1RoZSBzY2hlbWEgZm9yIHRoZSBmaWVsZCAlcyBvbiB0aGUgbW9kZWwgJXMgaXMgb2YgdHlwZSAnICtcblx0XHRcdFx0XHQnXCJvYmplY3RcIiBhbmQgaGFzIGEgcHJvcGVydGllcy5yYXcgcHJvcGVydHksIGhvd2V2ZXIgdGhlcmUnICtcblx0XHRcdFx0XHQnaXMgbm8gXCJ0eXBlXCIgZGVmaW5lZCBmb3IgdGhlIHJhdyBwcm9wZXJ0eS4nLFxuXHRcdFx0XHRcdGZpZWxkTmFtZSxcblx0XHRcdFx0XHRtb2RlbE5hbWVcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG59O1xuXG4vKipcbiAqIEFzc2VydHMgdGhhdCB0aGUgdmFsdWUgcHJvdmlkZWQgZm9yIHRoZSBwcmVwYXJlZCBmaWVsZCBpcyB2YWxpZCBhY2NvcmRpbmcgdG9cbiAqIHRoZSBzY2hlbWEuXG4gKlxuICogUHJlcGFyZWQgZmllbGRzIGFyZTpcbiAqXG4gKiAtIGZpZWxkcyBoYXZpbmcgdmFsdWVzIHRoYXQgYXJlIHNldCBhcyBhIHZhbHVlIG9iamVjdCBhbmQgZXhwZWN0IGEgdmFsdWVcbiAqICAgb2JqZWN0IG9uIHVwZGF0ZXMvaW5zZXJ0cy5cbiAqIC0gZmllbGRzIHRoYXQgYXJlIHRoZSBlcXVpdmFsZW50IGByYXdgIHZhbHVlIHdoZW4gdGhlIGZpZWxkIGluIHRoZSBzY2hlbWEgaXNcbiAqICAgZGVmaW5lZCB0byBoYXZlIHJhdyBhbmQgcmVuZGVyZWQvcHJldHR5IHZhbHVlcy5cbiAqXG4gKiBOb3RlOiAgVGhpcyB2YWxpZGF0ZXMgYWdhaW5zdCBwcmVwYXJlZCBmaWVsZHMgd2hpY2ggbWVhbnMgdGhhdDpcbiAqXG4gKiAtIGlmIHRoZSBwcmVwYXJlZCBmaWVsZCBoYXMgYSB2YWx1ZSBvYmplY3QgYXMgaXRzIHZhbHVlLCB0aGVuIHRoYXQgdmFsdWVcbiAqICAgb2JqZWN0IGlzIHZhbGlkYXRlZCBiZWZvcmUgYW55IG90aGVyIHZhbGlkYXRpb24uXG4gKiAtIGlmIHRoZSBwcmVwYXJlZCBmaWVsZCByZXByZXNlbnRzIGFuIG9iamVjdCBpbiB0aGUgc2NoZW1hLCB0aGVuIGl0cyB2YWx1ZSBpc1xuICogICB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgYHJhd2AgdHlwZSBpbiB0aGUgc2NoZW1hLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWVcbiAqIEBwYXJhbSB7Kn0gZmllbGRWYWx1ZVxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlXG4gKiBAdGhyb3dzIFR5cGVFcnJvclxuICogQHRocm93cyBJbnZhbGlkRGF0ZVRpbWVcbiAqL1xuZXhwb3J0IGNvbnN0IGFzc2VydFZhbGlkVmFsdWVGb3JQcmVwYXJlZEZpZWxkID0gKFxuXHRmaWVsZE5hbWUsXG5cdGZpZWxkVmFsdWUsXG5cdGluc3RhbmNlLFxuKSA9PiB7XG5cdGNvbnN0IHsgc2NoZW1hIH0gPSBpbnN0YW5jZTtcblx0bGV0IGlzVmFsaWQgPSBpc1NoYWxsb3dWYWxpZFZhbHVlRm9yRmllbGQoXG5cdFx0ZmllbGROYW1lLFxuXHRcdGZpZWxkVmFsdWUsXG5cdFx0c2NoZW1hLFxuXHQpO1xuXHRpZiAoICEgaXNWYWxpZCAmJiBzY2hlbWFbIGZpZWxkTmFtZSBdLnR5cGUgPT09ICdvYmplY3QnICYmXG5cdFx0c2NoZW1hWyBmaWVsZE5hbWUgXS5wcm9wZXJ0aWVzXG5cdCkge1xuXHRcdGlzVmFsaWQgPSBzY2hlbWFbIGZpZWxkTmFtZSBdLnByb3BlcnRpZXMucmF3LmVudW0gP1xuXHRcdFx0dmFsaWRhdGVFbnVtVHlwZShcblx0XHRcdFx0c2NoZW1hWyBmaWVsZE5hbWUgXS5wcm9wZXJ0aWVzLnJhdy50eXBlLFxuXHRcdFx0XHRzY2hlbWFbIGZpZWxkTmFtZSBdLnByb3BlcnRpZXMucmF3LmVudW0sXG5cdFx0XHRcdGZpZWxkVmFsdWUsXG5cdFx0XHQpIDpcblx0XHRcdHZhbGlkYXRlVHlwZShcblx0XHRcdFx0c2NoZW1hWyBmaWVsZE5hbWUgXS5wcm9wZXJ0aWVzLnJhdy50eXBlLFxuXHRcdFx0XHRtYXliZUNvbnZlcnRGcm9tVmFsdWVPYmplY3RXaXRoQXNzZXJ0aW9ucyhcblx0XHRcdFx0XHRmaWVsZE5hbWUsXG5cdFx0XHRcdFx0ZmllbGRWYWx1ZSxcblx0XHRcdFx0XHRzY2hlbWFcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHRpZiAoICEgaXNWYWxpZCApIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXG5cdFx0XHRcdHNwcmludGYoXG5cdFx0XHRcdFx0J1RoZSBnaXZlbiBcIiUxJHNcIiBmaWVsZCAgaXMgbm90IHZhbGlkIGZvciB0aGUgZGVmaW5lZCAnICtcblx0XHRcdFx0XHQnc2NoZW1hLiAgSXRcXCdzIGByYXdgIHByb3BlcnR5IFZhbHVlICglMiRzKSBpcyBub3QgJyArXG5cdFx0XHRcdFx0J3RoZSBjb3JyZWN0IGV4cGVjdGVkIHR5cGUgKCUzJHMpLicsXG5cdFx0XHRcdFx0ZmllbGROYW1lLFxuXHRcdFx0XHRcdGZpZWxkVmFsdWUsXG5cdFx0XHRcdFx0c2NoZW1hWyBmaWVsZE5hbWUgXS5wcm9wZXJ0aWVzLnJhdy50eXBlLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblx0aWYgKCAhIGlzVmFsaWQgKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcblx0XHRcdHNwcmludGYoXG5cdFx0XHRcdCdUaGUgZ2l2ZW4gXCIlMSRzXCIgZmllbGRcXCdzIFZhbHVlICglMiRzKSBpcyBub3QgdmFsaWQgZm9yJyArXG5cdFx0XHRcdCcgdGhlIGRlZmluZWQgc2NoZW1hIHR5cGUgKCUzJHMpLicsXG5cdFx0XHRcdGZpZWxkTmFtZSxcblx0XHRcdFx0ZmllbGRWYWx1ZSxcblx0XHRcdFx0c2NoZW1hWyBmaWVsZE5hbWUgXS50eXBlLFxuXHRcdFx0KSxcblx0XHQpO1xuXHR9XG59O1xuXG4vKipcbiAqIEFzc2VydHMgd2hldGhlciB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBmaWVsZCBpcyB2YWxpZCBhY2NvcmRpbmcgdG8gdGhlXG4gKiBzY2hlbWEuXG4gKlxuICogVGhpcyBpcyB1c2VkIG9uIGVudGl0eSBjb25zdHJ1Y3Rpb24gYW5kIGRvZXMgbm90IHZhbGlkYXRlIHByZXBhcmVkIGZpZWxkXG4gKiB2YWx1ZXMgKHNlZSBhc3NlcnQgYXNzZXJ0VmFsaWRWYWx1ZUZvclByZXBhcmVkRmllbGQpLlxuICpcbiAqIFRoaXMgbWV0aG9kIGFsc28gYXNzZXJ0cyB0aGF0IHRoZSBzY2hlbWEgaGFzIHZhbGlkIHNjaGVtYSBmaWVsZCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWVcbiAqIEBwYXJhbSB7Kn0gZmllbGRWYWx1ZVxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlXG4gKiBAdGhyb3dzIFR5cGVFcnJvclxuICogQHRocm93cyBJbnZhbGlkU2NoZW1hXG4gKi9cbmV4cG9ydCBjb25zdCBhc3NlcnRWYWxpZEZpZWxkQW5kVmFsdWVBZ2FpbnN0U2NoZW1hID0gKFxuXHRtb2RlbE5hbWUsXG5cdGZpZWxkTmFtZSxcblx0ZmllbGRWYWx1ZSxcblx0aW5zdGFuY2UsXG4pID0+IHtcblx0Y29uc3Qgc2NoZW1hID0gaW5zdGFuY2Uuc2NoZW1hO1xuXHRjb25zdCB2YWxpZGF0aW9uVHlwZSA9IHZhbGlkYXRlVHlwZUZvckZpZWxkKCBmaWVsZE5hbWUsIGluc3RhbmNlICk7XG5cdGFzc2VydFZhbGlkU2NoZW1hRmllbGRQcm9wZXJ0aWVzKCBtb2RlbE5hbWUsIGZpZWxkTmFtZSwgc2NoZW1hICk7XG5cdGxldCBpc1ZhbGlkID0gaXNTaGFsbG93VmFsaWRWYWx1ZUZvckZpZWxkKFxuXHRcdGZpZWxkTmFtZSxcblx0XHRmaWVsZFZhbHVlLFxuXHRcdHNjaGVtYSxcblx0XHRmYWxzZSxcblx0KTtcblx0Ly8gYWNjb3VudCBmb3IgZmllbGROYW1lIGZpZWxkVmFsdWVzIHRoYXQgaGF2ZSBwcm9wZXJ0eSBzY2hlbWEuIEZvciBNb2RlbFxuXHQvLyBFbnRpdGllcywgb25seSB0aGUgVkFMSURBVEVfVFlQRSBwcm9wZXJ0eSBpcyBjYXJlZCBhYm91dC5cblx0aWYgKCBzY2hlbWFbIGZpZWxkTmFtZSBdLnR5cGUgPT09ICdvYmplY3QnICYmXG5cdFx0c2NoZW1hWyBmaWVsZE5hbWUgXS5wcm9wZXJ0aWVzXG5cdCkge1xuXHRcdGlmICggaXNVbmRlZmluZWQoIGZpZWxkVmFsdWVbIHZhbGlkYXRpb25UeXBlIF0gKSApIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXG5cdFx0XHRcdHNwcmludGYoXG5cdFx0XHRcdFx0J1RoZSBnaXZlbiBcIiUxJHNcIiB2YWx1ZSBpcyBub3QgdmFsaWQgZm9yIHRoZSBkZWZpbmVkICcgK1xuXHRcdFx0XHRcdCdzY2hlbWEuIEl0IG11c3QgYmUgYW4gb2JqZWN0IGFuZCBpdCBtdXN0IGhhdmUgYSAnICtcblx0XHRcdFx0XHQnYCUyJHNgIGtleS4nLFxuXHRcdFx0XHRcdGZpZWxkTmFtZSxcblx0XHRcdFx0XHR2YWxpZGF0aW9uVHlwZSxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXHRcdGlzVmFsaWQgPSBzY2hlbWFbIGZpZWxkTmFtZSBdLnByb3BlcnRpZXNbIHZhbGlkYXRpb25UeXBlIF0uZW51bSA/XG5cdFx0XHR2YWxpZGF0ZUVudW1UeXBlKFxuXHRcdFx0XHRzY2hlbWFbIGZpZWxkTmFtZSBdLnByb3BlcnRpZXNbIHZhbGlkYXRpb25UeXBlIF0udHlwZSxcblx0XHRcdFx0c2NoZW1hWyBmaWVsZE5hbWUgXS5wcm9wZXJ0aWVzLnJhdy5lbnVtLFxuXHRcdFx0XHRmaWVsZFZhbHVlWyB2YWxpZGF0aW9uVHlwZSBdLFxuXHRcdFx0KSA6XG5cdFx0XHR2YWxpZGF0ZVR5cGUoXG5cdFx0XHRcdHNjaGVtYVsgZmllbGROYW1lIF0ucHJvcGVydGllc1sgdmFsaWRhdGlvblR5cGUgXS50eXBlLFxuXHRcdFx0XHRmaWVsZFZhbHVlWyB2YWxpZGF0aW9uVHlwZSBdXG5cdFx0XHQpO1xuXHRcdGlmICggISBpc1ZhbGlkICkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcblx0XHRcdFx0c3ByaW50Zihcblx0XHRcdFx0XHQnVGhlIGdpdmVuIFwiJTEkc1wiIHZhbHVlIGlzIG5vdCB2YWxpZCBmb3IgdGhlIGRlZmluZWQgJyArXG5cdFx0XHRcdFx0J3NjaGVtYS4gIEl0XFwncyBgJTIkc2AgcHJvcGVydHkgdmFsdWUgKCUzJHMpIGlzIG5vdCAnICtcblx0XHRcdFx0XHQndGhlIGNvcnJlY3QgZXhwZWN0ZWQgdHlwZSAoJTQkcykuJyxcblx0XHRcdFx0XHRmaWVsZE5hbWUsXG5cdFx0XHRcdFx0dmFsaWRhdGlvblR5cGUsXG5cdFx0XHRcdFx0ZmllbGRWYWx1ZSxcblx0XHRcdFx0XHRzY2hlbWFbIGZpZWxkTmFtZSBdLnByb3BlcnRpZXNbIHZhbGlkYXRpb25UeXBlIF0udHlwZSxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cdGlmICggISBpc1ZhbGlkICkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXG5cdFx0XHRzcHJpbnRmKFxuXHRcdFx0XHQnVGhlIGdpdmVuIFwiJTEkc1wiIGZpZWxkXFwncyB2YWx1ZSAoJTIkcykgaXMgbm90IHZhbGlkIGZvcicgK1xuXHRcdFx0XHQnIHRoZSBkZWZpbmVkIHNjaGVtYSB0eXBlICglMyRzKS4nLFxuXHRcdFx0XHRmaWVsZE5hbWUsXG5cdFx0XHRcdGZpZWxkVmFsdWUsXG5cdFx0XHRcdHNjaGVtYVsgZmllbGROYW1lIF0udHlwZSxcblx0XHRcdCksXG5cdFx0KTtcblx0fVxufTtcbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBpc0FycmF5LCB1cHBlckZpcnN0LCBjYW1lbENhc2UgfSBmcm9tICdsb2Rhc2gnO1xuXG4vKipcbiAqIEludGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgYXNzZXJ0VmFsaWRTY2hlbWEgfSBmcm9tICcuL2Fzc2VydGlvbnMnO1xuaW1wb3J0IHtcblx0Y3JlYXRlR2V0dGVyLFxuXHRjcmVhdGVFbnRpdHlHZXR0ZXJzQW5kU2V0dGVycyxcblx0Y3JlYXRlUGVyc2lzdGluZ0dldHRlcnNBbmRTZXR0ZXJzLFxuXHRzZXRTYXZlU3RhdGUsXG59IGZyb20gJy4vY3JlYXRlJztcbmltcG9ydCB7XG5cdFNBVkVfU1RBVEUsXG5cdFBSSVZBVEVfUFJPUEVSVElFUyxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG4vKipcbiAqIEJhc2VFbnRpdHkgaXMgdGhlIGJhc2ljIGNsYXNzIGZvciBhbGwgZW50aXRpZXMuICBjcmVhdGVFbnRpdHlGYWN0b3J5IHJldHVybnNcbiAqIGFuIGluc3RhbmNlIG9mIHRoaXMgYW5kIGFsbCB0aGUgZ2V0dGVycy9zZXR0ZXJzIGZvciBmaWVsZHMgZXRjIGFyZVxuICogZHluYW1pY2FsbHkgY3JlYXRlZCB2aWEgdGhlIGNvbnN0cnVjdG9yLlxuICovXG5jbGFzcyBCYXNlRW50aXR5IHtcblx0WyBQUklWQVRFX1BST1BFUlRJRVMuU0FWRV9TVEFURSBdID0gU0FWRV9TVEFURS5DTEVBTjtcblx0WyBQUklWQVRFX1BST1BFUlRJRVMuVkFMSURBVEVfVFlQRVMgXSA9IHt9O1xuXG5cdC8qKlxuXHQgKiBDb25zdHJ1Y3RvciBmb3IgQmFzZSBFbnRpdHlcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuXHQgKiBAcGFyYW0ge09iamVjdH0gZW50aXR5RmllbGRzQW5kVmFsdWVzXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWFcblx0ICogQHBhcmFtIHtBcnJheX1maWVsZFByZWZpeGVzXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNOZXdcblx0ICovXG5cdGNvbnN0cnVjdG9yKFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHlGaWVsZHNBbmRWYWx1ZXMsXG5cdFx0c2NoZW1hLFxuXHRcdGZpZWxkUHJlZml4ZXMgPSBbXSxcblx0XHRpc05ldyA9IGZhbHNlLFxuXHQpIHtcblx0XHRhc3NlcnRWYWxpZFNjaGVtYSggc2NoZW1hICk7XG5cdFx0ZmllbGRQcmVmaXhlcyA9IGlzQXJyYXkoIGZpZWxkUHJlZml4ZXMgKSA/IGZpZWxkUHJlZml4ZXMgOiBbXTtcblx0XHRjcmVhdGVHZXR0ZXIoIHRoaXMsICdmaWVsZFByZWZpeGVzJywgZmllbGRQcmVmaXhlcyApO1xuXHRcdGNyZWF0ZUdldHRlciggdGhpcywgJ3NjaGVtYScsIHNjaGVtYS5wcm9wZXJ0aWVzICk7XG5cdFx0c2V0U2F2ZVN0YXRlKFxuXHRcdFx0dGhpcyxcblx0XHRcdGlzTmV3ID8gU0FWRV9TVEFURS5ORVcgOiBTQVZFX1NUQVRFLkNMRUFOXG5cdFx0KTtcblx0XHRjcmVhdGVHZXR0ZXIoIHRoaXMsICdtb2RlbE5hbWUnLCBtb2RlbE5hbWUgKTtcblx0XHRjcmVhdGVHZXR0ZXIoIHRoaXMsICdvcmlnaW5hbEZpZWxkc0FuZFZhbHVlcycsIGVudGl0eUZpZWxkc0FuZFZhbHVlcyApO1xuXHRcdGNyZWF0ZUdldHRlcihcblx0XHRcdHRoaXMsXG5cdFx0XHQnZmllbGRzVG9QZXJzaXN0T25JbnNlcnQnLFxuXHRcdFx0bmV3IFNldCggT2JqZWN0LmtleXMoIGVudGl0eUZpZWxkc0FuZFZhbHVlcyApIClcblx0XHQpO1xuXHRcdGNyZWF0ZUVudGl0eUdldHRlcnNBbmRTZXR0ZXJzKCB0aGlzICk7XG5cdFx0Y3JlYXRlUGVyc2lzdGluZ0dldHRlcnNBbmRTZXR0ZXJzKCB0aGlzICk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgY3VycmVudCBzYXZlIHN0YXRlIG9uIHRoZSBlbnRpdHkuXG5cdCAqXG5cdCAqIFNhdmUgc3RhdGUgZGVzY3JpYmVzIHdoZXRoZXIgdGhlIGVudGl0eSBpczpcblx0ICpcblx0ICogLSBTQVZFX1NUQVRFLk5FVzogVGhlIGVudGl0eSBoYXMgbmV2ZXIgYmVlbiBwZXJzaXN0ZWQgdG8gc3RvcmFnZS5cblx0ICogLSBTQVZFX1NUQVRFLkNMRUFOOiBUaGUgZW50aXR5IGV4aXN0cyBpbiBzdG9yYWdlIGFuZCBoYXMgbm90IGJlZW4gbXV0YXRlZC5cblx0ICogLSBTQVZFX1NUQVRFLkRJUlRZOiBUaGUgZW50aXR5IGlzIG11dGF0ZWQgYW5kIGNoYW5nZXMgaGF2ZSBub3QgYmVlblxuXHQgKiBwZXJzaXN0ZWQgdG8gc3RvcmFnZS5cblx0ICpcblx0ICogQHJldHVybiB7U3ltYm9sfSAgUmV0dXJucyB0aGUgY3VycmVudCBzYXZlIHN0YXRlIGZvciB0aGUgZW50aXR5LlxuXHQgKi9cblx0Z2V0IHNhdmVTdGF0ZSgpIHtcblx0XHRyZXR1cm4gdGhpc1sgUFJJVkFURV9QUk9QRVJUSUVTLlNBVkVfU1RBVEUgXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaGV0aGVyIHRoZSBjdXJyZW50IHNhdmUgc3RhdGUgaXMgU0FWRV9TVEFURS5ORVdcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gIFRydWUgbWVhbnMgU0FWRV9TVEFURS5ORVcgaXMgdGhlIHNhdmUgc3RhdGUuXG5cdCAqL1xuXHRnZXQgaXNOZXcoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2F2ZVN0YXRlID09PSBTQVZFX1NUQVRFLk5FVztcblx0fVxuXG5cdC8qKlxuXHQgKiBXaGV0aGVyIHRoZSBjdXJyZW50IHNhdmUgc3RhdGUgaXMgU0FWRV9TVEFURS5ESVJUWVxuXHQgKiBAcmV0dXJuIHtib29sZWFufSAgVHJ1ZSBtZWFucyBTQVZFX1NUQVRFLkRJUlRZIGlzIHRoZSBzYXZlIHN0YXRlLlxuXHQgKi9cblx0Z2V0IGlzRGlydHkoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2F2ZVN0YXRlID09PSBTQVZFX1NUQVRFLkRJUlRZO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdoZXRoZXIgdGhlIGN1cnJlbnQgc2F2ZSBzdGF0ZSBpcyBTQVZFX1NUQVRFLkNMRUFOXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59ICBUcnVlIG1lYW5zIFNBVkVfU1RBVEUuQ0xFQU4gaXMgdGhlIHNhdmUgc3RhdGUuXG5cdCAqL1xuXHRnZXQgaXNDbGVhbigpIHtcblx0XHRyZXR1cm4gdGhpcy5zYXZlU3RhdGUgPT09IFNBVkVfU1RBVEUuQ0xFQU47XG5cdH1cblxuXHQvKipcblx0ICogV2hldGhlciB0aGUgZW50aXR5IGhhcyBhbnkgcGFzc3dvcmQgcHJvdGVjdGVkIGZpZWxkcy5cblx0ICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBtZWFucyBpdCBkb2VzLCBmYWxzZSBtZWFucyBpdCBkb2Vzbid0LlxuXHQgKi9cblx0Z2V0IGlzUGFzc3dvcmRQcm90ZWN0ZWQoKSB7XG5cdFx0cmV0dXJuIHRoaXMucHJvdGVjdGVkRmllbGRzLmxlbmd0aCA+IDA7XG5cdH1cblxuXHQvKipcblx0ICogV2hldGhlciB0aGUgZ2l2ZW4gZmllbGROYW1lIGlzIGEgcGFzc3dvcmQgcHJvdGVjdGVkIGZpZWxkLlxuXHQgKiBAcmV0dXJuIHtmdW5jdGlvbihzdHJpbmcpOiBib29sZWFufSAgUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWRcblx0ICogdG8gY2hlY2sgaWYgdGhlIGdpdmVuIGZpZWxkIG5hbWUgaXMgYSBwcm90ZWN0ZWQgZmllbGQgaW4gdGhpcyBlbnRpdHkuXG5cdCAqL1xuXHRnZXQgaXNGaWVsZFBhc3N3b3JkUHJvdGVjdGVkKCkge1xuXHRcdHJldHVybiAoIGZpZWxkTmFtZSApID0+IHRoaXMucHJvdGVjdGVkRmllbGRzLmluZGV4T2YoIGZpZWxkTmFtZSApID4gLTE7XG5cdH1cblxuXHQvKipcblx0ICogVXNlZCB0byBjbG9uZSB0aGUgY3VycmVudCBlbnRpdHkgb2JqZWN0LiAgVGhpcyByZXN1bHRzIGluIGFuIGluc3RhbmNlIG9mXG5cdCAqIEJhc2VFbnRpdHkgdGhhdCBpcyBlcXVpdmFsZW50IGFzIHRoaXMgY3VycmVudCBpbnN0YW5jZSAoZXhjZXB0IGl0IHdpbGxcblx0ICogaGF2ZSBhIG5ldyBnZW5lcmF0ZWQgaWQpLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtCYXNlRW50aXR5fSBBIG5ldyBpbnN0YW5jZSBvZiBCYXNlRW50aXR5XG5cdCAqL1xuXHRnZXQgY2xvbmUoKSB7XG5cdFx0cmV0dXJuIG5ldyBCYXNlRW50aXR5KFxuXHRcdFx0dGhpcy5tb2RlbE5hbWUsXG5cdFx0XHR0aGlzLmZvckNsb25lLFxuXHRcdFx0eyAkc2NoZW1hOiB7fSwgcHJvcGVydGllczogdGhpcy5zY2hlbWEgfSxcblx0XHRcdHRoaXMuZmllbGRQcmVmaXhlcyxcblx0XHRcdHRydWVcblx0XHQpO1xuXHR9XG5cblx0c3RhdGljIG5hbWUgPSAnQmFzZUVudGl0eSdcbn1cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgZ2l2ZXMgYSBjbGFzcyB0aGUgcHJvdmlkZWQgbmFtZVxuICogKGFuZCBvcHRpb25hbGx5IGV4dGVuZHMgdGhlIHByb3ZpZGVkIG9iamVjdCkuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtPYmplY3R9IGV4dGVuZGVkQ2xhc3NcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uXG4gKi9cbmNvbnN0IG5hbWVDbGFzcyA9ICggbmFtZSwgZXh0ZW5kZWRDbGFzcyApID0+IHtcblx0cmV0dXJuIGNsYXNzIGV4dGVuZHMgZXh0ZW5kZWRDbGFzcyB7XG5cdFx0c3RhdGljIGdldCBuYW1lKCkge1xuXHRcdFx0cmV0dXJuIG5hbWU7XG5cdFx0fVxuXHR9O1xufTtcblxuLyoqXG4gKiBBIGZhY3RvcnkgZm9yIGVudGl0eSBmYWN0b3JpZXMuXG4gKlxuICogQ2FsbGluZyB0aGlzIHJldHVybnMgYW4gb2JqZWN0IG9mIGZhY3RvcnkgZnVuY3Rpb25zIHRoYXQgaW5zdGFudGlhdGUgYW5cbiAqIGluc3RhbmNlIG9mIGEgbmFtZWQgRW50aXR5LiAgVGhlIG1vZGVsTmFtZSBpcyB1c2VkIGFzIHRoZSBuYW1lIGZvciB0aGUgbmV3XG4gKiBlbnRpdHkuXG4gKlxuICogVHdvIG1ldGhvZHMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgb2JqZWN0IHJldHVybmVkOiBgY3JlYXRlTmV3YCBhbmRcbiAqIGBmcm9tRXhpc3RpbmdgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWUgIFRoZSBtb2RlbCBmb3IgdGhlIGVudGl0eVxuICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSAgICAgVGhlIHNjaGVtYSBmb3IgdGhlIG1vZGVsLiBUaGlzIGlzIHRoZSBzY2hlbWFcbiAqIHByb3ZpZGVkIGJ5IHRoZSBPUFRJT05TIGVuZHBvaW50IGZvciB0aGUgbW9kZWwuXG4gKiBAcGFyYW0ge0FycmF5fSBmaWVsZFByZWZpeGVzIEFuIGFycmF5IG9mIGZpZWxkIHByZWZpeGVzIGZvciBiYXNlIGZpZWxkcyBvblxuICogb24gdGhlIG1vZGVsIChlZy4gRXZlbnQgbW9kZWwgaGFzIGBbIEVWVCBdYCBwcmVmaXhlcyBvbiBmaWVsZHMsIERhdGV0aW1lIG1vZGVsXG4gKiBoYXMgWyBgRFRUYCwgYERUVF9FVlRgIF1cbiAqIEByZXR1cm4ge09iamVjdH0gQSBmYWN0b3J5IGZvciBpbnN0YW50aWF0aW5nIGFuIGVudGl0eSBpbnN0YW5jZS5cbiAqL1xuY29uc3QgY3JlYXRlRW50aXR5RmFjdG9yeSA9ICggbW9kZWxOYW1lLCBzY2hlbWEsIGZpZWxkUHJlZml4ZXMgPSBbXSApID0+IHtcblx0Y29uc3QgRW50aXR5ID0gbmFtZUNsYXNzKFxuXHRcdHVwcGVyRmlyc3QoIGNhbWVsQ2FzZSggbW9kZWxOYW1lICkgKSxcblx0XHRCYXNlRW50aXR5XG5cdCk7XG5cdHJldHVybiB7XG5cdFx0LyoqXG5cdFx0ICogRXhwb3NlcyBtb2RlbE5hbWUgc28gY2xpZW50IGNvZGUgY2FuIGRlcml2ZSB3aGF0IG1vZGVsIHRoaXMgZmFjdG9yeVxuXHRcdCAqIGlzIGZvciBmcm9tIGFueSBnaXZlbiBmYWN0b3J5LlxuXHRcdCAqIEB0eXBlIHN0cmluZ1xuXHRcdCAqL1xuXHRcdG1vZGVsTmFtZTogbW9kZWxOYW1lLFxuXHRcdC8qKlxuXHRcdCAqIFRoaXMgaXMgdGhlIGNsYXNzIGRlZmluaXRpb24gZm9yIHRoZSBFbnRpdHkuICBUeXBpY2FsbHkgdGhpcyBpc1xuXHRcdCAqIHJldHJpZXZlZCBmb3IgdGhlIGFiaWxpdHkgdG8gZG8gaW5zdGFuY2VvZiBjaGVja3MuXG5cdFx0ICovXG5cdFx0Y2xhc3NEZWY6IEVudGl0eSxcblx0XHQvKipcblx0XHQgKiBUaGlzIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgRW50aXR5IGZvciB0aGUgZ2l2ZW4gYXJndW1lbnRzIHdpdGggdGhlXG5cdFx0ICogaW5kaWNhdGlvbiB0aGlzIGlzIGEgbmV3IG5vbi1wZXJzaXN0ZWQgZW50aXR5LiAgVGhpcyBtZWFuczpcblx0XHQgKlxuXHRcdCAqIC0gQWxsIGZpZWxkIHZhbHVlcyBhcmUgcG9wdWxhdGVkIGFuZCBhbnkgbm90IHByb3ZpZGVkIHdpbGwgYmVcblx0XHQgKiAgIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgdmFsdWVzIGRlZmluZWQgYnkgdGhlIHNjaGVtYS5cblx0XHQgKiAtIEdlbmVyYXRlcyB0ZW1wb3JhcnkgdW5pcXVlIGlkcyBmb3IgdGhlIHByaW1hcnkga2V5IGZpZWxkcyBvbiB0aGVcblx0XHQgKiAgIGVudGl0eSAodXNpbmcgY3VpZCkuXG5cdFx0ICogLSBTZXRzIHRoZSBgaXNOZXdgIGZsYWcgdG8gdHJ1ZSBmb3IgdGhlIGVudGl0eSBzbyBjbGllbnQgY29kZSBpcyBhYmxlXG5cdFx0ICogICB0byBkaXNjb3ZlciB3aGljaCBlbnRpdGllcyBoYXZlIG5ldmVyIGJlZW4gcGVyc2lzdGVkLlxuXHRcdCAqIC0gVGhpcyBmYWN0b3J5IG1ldGhvZCBleHBlY3RzIGZpZWxkcyBhbmQgdmFsdWVzIHRvIGJlIFwicHJlcGFyZWRcIi5cblx0XHQgKiAgIFdoYXQgdGhhdCBtZWFucyBpcyB0aGF0IGZvciBhbnkgZmllbGRzIHRoYXQgdGhlIHNjaGVtYSBkZXNjcmliZWQgYXNcblx0XHQgKiAgIGhhdmluZyBhIGByYXdgIHByb3BlcnR5IChpLmUuIHsgRVZUX2Rlc2M6IHsgcmF3OiAnc29tZXRoaW5nJyB9IH0pXG5cdFx0ICogICB0aGUgdmFsdWUgc2hvdWxkIGJlIG9mIHRoZSBjb3JyZWN0IHR5cGUgZm9yIHRoYXQgcmF3IHByb3BlcnR5IGFuZC5cblx0XHQgKiAgIFRoaXMgYWxzbyBtZWFucyBpcyB0aGF0IGZvciBhbnkgZmllbGRzIHRoZSBzY2hlbWEgZGVzY3JpYmVzIGFzIGFcblx0XHQgKiAgIGRhdGUtdGltZSAoZm9ybWF0KSBvciBtb25leSAoZm9ybWF0KSBmaWVsZCwgdGhlIHZhbHVlIGlzIGV4cGVjdGVkXG5cdFx0ICogICB0byBiZSB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBvYmplY3QuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gZmllbGRzQW5kVmFsdWVzXG5cdFx0ICogQHJldHVybiB7RW50aXR5fSBhbiBpbnN0YW5jZSBvZiBFbnRpdHlcblx0XHQgKi9cblx0XHRjcmVhdGVOZXc6ICggZmllbGRzQW5kVmFsdWVzICkgPT4gbmV3IEVudGl0eShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdGZpZWxkc0FuZFZhbHVlcyxcblx0XHRcdHNjaGVtYSxcblx0XHRcdGZpZWxkUHJlZml4ZXMsXG5cdFx0XHR0cnVlXG5cdFx0KSxcblx0XHQvKipcblx0XHQgKiBUaGlzIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgRW50aXR5IGZvciB0aGUgZ2l2ZW4gYXJndW1lbnRzIHdpdGggdGhlXG5cdFx0ICogaW5kaWNhdGlvbiB0aGlzIHJlcHJlc2VudHMgdGhlIGVudGl0eSBhcyBpcyBpbiB0aGUgZGIuICBUaGlzIG1lYW5zOlxuXHRcdCAqXG5cdFx0ICogLSBBbGwgZmllbGQgdmFsdWVzIGFyZSBOT1QgcG9wdWxhdGVkIGlmIG1pc3NpbmcgdmFsdWVzLiAgVGhpcyBpc1xuXHRcdCAqICAgZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIGNvbnRleHRzIGxpa2UgdW5hdXRob3JpemVkIHZpZXdzIHdoZXJlXG5cdFx0ICogICBvbmx5IHBhcnRpYWwgZW50aXRpZXMgYXJlIHJldHVybmVkIGluIFJFU1QgcmVzcG9uc2VzLlxuXHRcdCAqIC0gaXNOZXcgZmxhZyBpcyBzZXQgdG8gZmFsc2UgKGFuZCBuZXZlciBjaGFuZ2VzIGZvciB0aGlzIGVudGl0eSlcblx0XHQgKiAtIFRoZSBpbmNvbWluZyB2YWx1ZXMgYXJlIGV4cGVjdGVkIHRvIGJlIGluIHRoZSBleGFjdCBzaGFwZSBhc1xuXHRcdCAqICAgZGVzY3JpYmVkIGJ5IHRoZSBzY2hlbWEgZm9yIHRoZSBlbnRpdHkgbW9kZWwuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gZmllbGRzQW5kVmFsdWVzXG5cdFx0ICogQHJldHVybiB7RW50aXR5fSBhbiBpbnN0YW5jZSBvZiBFbnRpdHlcblx0XHQgKi9cblx0XHRmcm9tRXhpc3Rpbmc6ICggZmllbGRzQW5kVmFsdWVzICkgPT4gbmV3IEVudGl0eShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdGZpZWxkc0FuZFZhbHVlcyxcblx0XHRcdHNjaGVtYSxcblx0XHRcdGZpZWxkUHJlZml4ZXNcblx0XHQpLFxuXHR9O1xufTtcbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUVudGl0eUZhY3Rvcnk7XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgaXNQbGFpbk9iamVjdCwgaXNVbmRlZmluZWQgfSBmcm9tICdsb2Rhc2gnO1xuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBwcm92aWRlZCB2YWx1ZSBoYXMgYSBcInJhd1wiIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0IGFuZCBoYXMgYSBgcmF3YCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGNvbnN0IGhhc1Jhd1Byb3BlcnR5ID0gKCB2YWx1ZSApID0+IGlzUGxhaW5PYmplY3QoIHZhbHVlICkgJiZcblx0ISBpc1VuZGVmaW5lZCggdmFsdWUucmF3ICk7XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIHZhbHVlIGhhcyBhIFwicHJldHR5XCIgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybiB7Kn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QgYW5kIGhhcyBhIGBwcmV0dHlgIHByb3BlcnR5LlxuICovXG5leHBvcnQgY29uc3QgaGFzUHJldHR5UHJvcGVydHkgPSAoIHZhbHVlICkgPT4gaXNQbGFpbk9iamVjdCggdmFsdWUgKSAmJlxuXHQhIGlzVW5kZWZpbmVkKCB2YWx1ZS5wcmV0dHkgKTtcblxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcHJvdmlkZWQgdmFsdWUgaGFzIGEgXCJyZW5kZXJlZFwiIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0IGFuZCBoYXMgYSBgcmVuZGVyZWRgIHByb3BlcnR5LlxuICovXG5leHBvcnQgY29uc3QgaGFzUmVuZGVyZWRQcm9wZXJ0eSA9ICggdmFsdWUgKSA9PiBpc1BsYWluT2JqZWN0KCB2YWx1ZSApICYmXG5cdCEgaXNVbmRlZmluZWQoIHZhbHVlLnJlbmRlcmVkICk7XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIHZhbHVlIGhhcyBhIFwiZm9ybWF0XCIgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QgYW5kIGhhcyBhIGBmb3JtYXRgIHByb3BlcnR5LlxuICovXG5leHBvcnQgY29uc3QgaGFzRm9ybWF0UHJvcGVydHkgPSAoIHZhbHVlICkgPT4gaXNQbGFpbk9iamVjdCggdmFsdWUgKSAmJlxuXHQhIGlzVW5kZWZpbmVkKCB2YWx1ZS5mb3JtYXQgKTtcblxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcHJvdmlkZWQgdmFsdWUgaGFzIGEgXCJlbnVtXCIgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QgYW5kIGhhcyBhbiBlbnVtXG4gKiBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGNvbnN0IGhhc0VudW1Qcm9wZXJ0eSA9ICggdmFsdWUgKSA9PiBpc1BsYWluT2JqZWN0KCB2YWx1ZSApICYmXG5cdCEgaXNVbmRlZmluZWQoIHZhbHVlLmVudW0gKTtcblxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcHJvdmlkZWQgdmFsdWUgaXMgYSBcInZhbHVlIG9iamVjdFwiIGZpZWxkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZFxuICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYVxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSB2YWx1ZSBvYmplY3QgZmllbGQuXG4gKi9cbmV4cG9ydCBjb25zdCBpc1ZhbHVlT2JqZWN0RmllbGQgPSAoIGZpZWxkLCBzY2hlbWEgKSA9PiB7XG5cdHJldHVybiBpc0RhdGVUaW1lRmllbGQoIGZpZWxkLCBzY2hlbWEgKSB8fCBpc01vbmV5RmllbGQoIGZpZWxkLCBzY2hlbWEgKTtcbn07XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIGZpZWxkIGlzIGEgZGF0ZS10aW1lIGZpZWxkIGFjY29yZGluZyB0byB0aGVcbiAqIHByb3ZpZGVkIHNjaGVtYS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGRcbiAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWFcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgbWVhbnMgaXQgaXMgYSBkYXRlLXRpbWUgZmllbGQuXG4gKi9cbmV4cG9ydCBjb25zdCBpc0RhdGVUaW1lRmllbGQgPSAoIGZpZWxkLCBzY2hlbWEgKSA9PlxuXHQhIGlzVW5kZWZpbmVkKCBzY2hlbWFbIGZpZWxkIF0gKSAmJlxuXHRoYXNGb3JtYXRQcm9wZXJ0eSggc2NoZW1hWyBmaWVsZCBdICkgJiZcblx0c2NoZW1hWyBmaWVsZCBdLmZvcm1hdCA9PT0gJ2RhdGUtdGltZSc7XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIGZpZWxkIGlzIGEgVVRDIGRhdGUtdGltZSBmaWVsZC5cbiAqXG4gKiBJZiBzY2hlbWEgaXMgcHJvdmlkZWQsIHRoaXMgYWxzbyBjb25zaWRlcnMgd2hldGhlciB0aGlzIGlzIGEgZGF0ZS10aW1lIGZpZWxkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRlVGltZUZpZWxkTmFtZVxuICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBbb3B0aW9uYWxdXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIG1lYW5zIHRoaXMgaXMgYSBVVEMgZmllbGQuICBJZiBzY2hlbWEgaXMgcHJvdmlkZWQgaXRcbiAqIG1lYW5zIHRoaXMgaXMgYWxzbyBhIGRhdGUtdGltZSBmaWVsZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzVVRDRGF0ZVRpbWVGaWVsZCA9ICggZGF0ZVRpbWVGaWVsZE5hbWUsIHNjaGVtYSA9IG51bGwgKSA9PiB7XG5cdHJldHVybiBzY2hlbWEgIT09IG51bGwgP1xuXHRcdGlzRGF0ZVRpbWVGaWVsZCggZGF0ZVRpbWVGaWVsZE5hbWUsIHNjaGVtYSApICYmXG5cdFx0XHRkYXRlVGltZUZpZWxkTmFtZS5pbmRleE9mKCAnX2dtdCcgKSA+IDAgOlxuXHRcdGRhdGVUaW1lRmllbGROYW1lLmluZGV4T2YoICdfZ210JyApID4gMDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBwcm92aWRlZCBmaWVsZCByZXByZXNlbnRzIGEgcHJpbWFyeSBrZXkgZmllbGQgdXNpbmcgdGhlXG4gKiBwcm92aWRlZCBzY2hlbWEuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZVxuICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYVxuICogQHJldHVybiB7Ym9vbGVhbn0gIFRydWUgbWVhbnMgaXQgaXMgYSBwcmltYXJ5IGtleSBmaWVsZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzUHJpbWFyeUtleUZpZWxkID0gKCBmaWVsZE5hbWUsIHNjaGVtYSApID0+XG5cdCEgaXNVbmRlZmluZWQoIHNjaGVtYVsgZmllbGROYW1lIF0gKSAmJlxuXHQhIGlzVW5kZWZpbmVkKCBzY2hlbWFbIGZpZWxkTmFtZSBdLnByaW1hcnlfa2V5ICk7XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBwcm92aWRlZCBmaWVsZCByZXByZXNlbnRzIGEgcmVhZG9ubHkgZmllbGQgdXNpbmcgdGhlXG4gKiBwcm92aWRlZCBzY2hlbWEuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZVxuICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYVxuICogQHJldHVybiB7Ym9vbGVhbn0gIFRydWUgbWVhbnMgaXQgaXMgYSByZWFkb25seSBmaWVsZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzUmVhZE9ubHkgPSAoIGZpZWxkTmFtZSwgc2NoZW1hICkgPT5cblx0ISBpc1VuZGVmaW5lZCggc2NoZW1hWyBmaWVsZE5hbWUgXSApICYmXG5cdCEgaXNVbmRlZmluZWQoIHNjaGVtYVsgZmllbGROYW1lIF0ucmVhZG9ubHkgKSAmJlxuXHRzY2hlbWFbIGZpZWxkTmFtZSBdLnJlYWRvbmx5O1xuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBwcm92aWRlZCBmaWVsZCBpcyBhIFwiZW50aXR5XCIgZmllbGQgdXNpbmcgdGhlIHByb3ZpZGVkXG4gKiBzY2hlbWEuXG4gKlxuICogQW4gXCJlbnRpdHlcIiBmaWVsZCBpcyBhbnkgZmllbGQgdGhhdCBzYXRpc2ZpZXMgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIC0gZmllbGQgZXhpc3RzIGluIHRoZSBzY2hlbWFcbiAqIC0gaXQgaXMgbm90IHJlYWRvbmx5IG9yIGlzIGEgcHJpbWFyeSBrZXkgZmllbGQuXG4gKiAtIGl0IGlzIG5vdCBhIHV0YyBmaWVsZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lXG4gKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoaXMgaXMgYW4gZW50aXR5IGZpZWxkXG4gKi9cbmV4cG9ydCBjb25zdCBpc0VudGl0eUZpZWxkID0gKCBmaWVsZE5hbWUsIHNjaGVtYSApID0+XG5cdCEgaXNVbmRlZmluZWQoIHNjaGVtYVsgZmllbGROYW1lIF0gKSAmJlxuXHQoICEgaXNSZWFkT25seSggZmllbGROYW1lLCBzY2hlbWEgKSB8fFxuXHRcdGlzUHJpbWFyeUtleUZpZWxkKCBmaWVsZE5hbWUsIHNjaGVtYSApXG5cdCkgJiZcblx0ISBpc1VUQ0RhdGVUaW1lRmllbGQoIGZpZWxkTmFtZSApICYmXG5cdGZpZWxkTmFtZSAhPT0gJ19wcm90ZWN0ZWQnO1xuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZCByZXByZXNlbnRzIGEgdmFsdWUgb2YgbW9uZXkgZnJvbSB0aGUgcHJvdmlkZWRcbiAqIHNjaGVtYS5cbiAqXG4gKiBBIGZpZWxkIGlzIGEgbW9uZXkgZmllbGQgaWYgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBzYXRpc2ZpZWQ6XG4gKlxuICogLSBJdCBleGlzdHMgaW4gdGhlIHNjaGVtYVxuICogLSBJdCBoYXMgYSBwcmV0dHkgcHJvcGVydHlcbiAqIC0gVGhlIHByZXR0eSBwcm9wZXJ0eSB2YWx1ZSBoYXMgYSBmb3JtYXQgcHJvcGVydHkuXG4gKiAtIFRoZSBmb3JtYXQgcHJvcGVydHkgaXMgZXF1YWwgdG8gJ21vbmV5J1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWFcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgaXQgaXMgYSBtb25leSBmaWVsZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzTW9uZXlGaWVsZCA9ICggZmllbGROYW1lLCBzY2hlbWEgKSA9PlxuXHQhIGlzVW5kZWZpbmVkKCBzY2hlbWFbIGZpZWxkTmFtZSBdICkgJiZcblx0ISBpc1VuZGVmaW5lZCggc2NoZW1hWyBmaWVsZE5hbWUgXS5wcm9wZXJ0aWVzICkgJiZcblx0aGFzUHJldHR5UHJvcGVydHkoIHNjaGVtYVsgZmllbGROYW1lIF0ucHJvcGVydGllcyApICYmXG5cdGhhc0Zvcm1hdFByb3BlcnR5KCBzY2hlbWFbIGZpZWxkTmFtZSBdLnByb3BlcnRpZXMucHJldHR5ICkgJiZcblx0c2NoZW1hWyBmaWVsZE5hbWUgXS5wcm9wZXJ0aWVzLnByZXR0eS5mb3JtYXQgPT09ICdtb25leSc7XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkIGlzIGFuIGVudW0gdHlwZSBmaWVsZCBhcyBkZWZpbmVkIGluIHRoZSBwcm92aWRlZFxuICogc2NoZW1hLlxuICpcbiAqIE5vdGU6IHRoaXMgb25seSBldmFsdWF0ZXMgdGhlIHRvcC1sZXZlbCBmb3IgdGhlIGZpZWxkIHNjaGVtYS4gIElmIHRoZSBmaWVsZFxuICogaW4gdGhlIHNjaGVtYSBpcyBvZiB0eXBlICdvYmplY3QnIGFuZCBvbmUgb2YgdGhlIG9iamVjdCBwcm9wZXJ0aWVzIGlzIG9mIHR5cGVcbiAqICdlbnVtJyB0aGlzIHdpbGwgbm90IGNvbnNpZGVyIGl0IGFuIFwiZW51bVwiIGZpZWxkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWFcbiAqIEByZXR1cm4ge2Jvb2xlYW59ICBUcnVlIGlmIHRoZSBmaWVsZCBpcyBhbiBlbnVtIHR5cGUgZmllbGQuXG4gKi9cbmV4cG9ydCBjb25zdCBpc0VudW1GaWVsZCA9ICggZmllbGROYW1lLCBzY2hlbWEgKSA9PlxuXHQhIGlzVW5kZWZpbmVkKCBzY2hlbWFbIGZpZWxkTmFtZSBdICkgJiZcblx0aGFzRW51bVByb3BlcnR5KCBzY2hlbWFbIGZpZWxkTmFtZSBdICkgJiZcblx0ISBpc1VuZGVmaW5lZCggc2NoZW1hWyBmaWVsZE5hbWUgXS5lbnVtLmxlbmd0aCApICYmXG5cdHNjaGVtYVsgZmllbGROYW1lIF0uZW51bS5sZW5ndGggPiAwO1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IGFwcGx5RmlsdGVycyB9IGZyb20gJ0B3b3JkcHJlc3MvaG9va3MnO1xuaW1wb3J0IHsgaXNVbmRlZmluZWQgfSBmcm9tICdsb2Rhc2gnO1xuXG4vKipcbiAqIENvbnN0YW50cyBkZXNjcmliaW5nIHRoZSBjdXJyZW50IFwic2F2ZSBzdGF0ZVwiIGZvciBhbiBlbnRpdHkuXG4gKlxuICogQHR5cGUge3tDTEVBTjogU3ltYm9sLCBORVc6IFN5bWJvbCwgRElSVFk6IFN5bWJvbH19XG4gKi9cbmV4cG9ydCBjb25zdCBTQVZFX1NUQVRFID0ge1xuXHRDTEVBTjogU3ltYm9sKCAnRW50aXR5IGlzIHBlcnNpc3RlZC4nICksXG5cdE5FVzogU3ltYm9sKCAnRW50aXR5IGlzIG5ldy4nICksXG5cdERJUlRZOiBTeW1ib2woICdFeGlzdGluZyBlbnRpdHkgaGFzIGNoYW5nZXMgYW5kIG5lZWRzIHBlcnNpc3RlZC4nICksXG59O1xuXG4vKipcbiAqIFZhbGlkYXRpb24gdHlwZXMgYXJlIGZvciBzY2hlbWEncyB0aGF0IGhhdmUgdmFsdWUgdmFyaWF0aW9ucy5cbiAqIEB0eXBlIHt7UkFXOiBzdHJpbmcsIFJFTkRFUkVEOiBzdHJpbmcsIFBSRVRUWTogc3RyaW5nfX1cbiAqL1xuZXhwb3J0IGNvbnN0IFZBTElEQVRFX1RZUEUgPSB7XG5cdFJBVzogJ3JhdycsXG5cdFJFTkRFUkVEOiAncmVuZGVyZWQnLFxuXHRQUkVUVFk6ICdwcmV0dHknLFxufTtcblxuLyoqXG4gKiBQcml2YXRlIHByb3BlcnRpZXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBCYXNlIEVudGl0eSBDbGFzc1xuICogQHR5cGUge3tzYXZlU3RhdGU6IGJvb2xlYW59fVxuICovXG5leHBvcnQgY29uc3QgUFJJVkFURV9QUk9QRVJUSUVTID0ge1xuXHRTQVZFX1NUQVRFOiBTeW1ib2woICdiYXNlRW50aXR5UHJpdmF0ZVByb3BlcnRpZXNTYXZlU3RhdGUnICksXG5cdFZBTElEQVRFX1RZUEVTOiBTeW1ib2woICdiYXNlRW50aXR5UHJpdmF0ZVByb3BlcnRpZXNWYWxpZGF0ZVR5cGVzJyApLFxufTtcblxuLyoqXG4gKiBIYXJkY29kZWQgbGlzdCBvZiBtb2RlbCBwcmVmaXhlcyBmb3IgZmllbGRzIG9uIG1vZGVscy5cblxuICogQSBtb2RlbCBwcmVmaXggaXMgc29tZXRoaW5nIHRoYXQgXCJuYW1lc3BhY2VzXCIgYSBmaWVsZCBvbiBhIG1vZGVsLiAgRm9yXG4gKiBleGFtcGxlLCBpZiB0aGUgZmllbGQgaXMgXCJFVlRfSURcIiwgdGhlbiB0aGUgcHJlZml4IGlzIFwiRVZUXCI7IGlmIHRoZSBmaWVsZCBpc1xuICogXCJEVFRfRVZUX3N0YXJ0XCIsIHRoZW4gdGhlIHByZWZpeGVzIGFyZSBcIkRUVFwiLCBhbmQgXCJEVFRfRVZUXCIuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEByZXR1cm4ge09iamVjdH0gQSBmaWx0ZXJlZCBvYmplY3QgaW5kZXhlZCBieSBtb2RlbCBuYW1lIGFuZCB0aGUgdmFsdWVzIGFyZVxuICogYW4gYXJyYXkgb2YgbW9kZWwgcHJlZml4ZXMgZm9yIHRoYXQgbW9kZWwuXG4gKi9cbmV4cG9ydCBjb25zdCBNT0RFTF9QUkVGSVhFUyA9ICggbW9kZWxOYW1lICkgPT4ge1xuXHRjb25zdCBwcmVmaXhNYXAgPSBhcHBseUZpbHRlcnMoXG5cdFx0J0ZIRUVfX0VOVElUWV9GQUNUT1JZX19DT05TVEFOVFNfX01PREVMX1BSRUZJWEVTJyxcblx0XHR7XG5cdFx0XHRhbnN3ZXI6IFsgJ0FOUycgXSxcblx0XHRcdGF0dGVuZGVlOiBbICdBVFQnIF0sXG5cdFx0XHRjaGFuZ2VfbG9nOiBbICdMT0cnIF0sXG5cdFx0XHRjaGVja2luOiBbICdDSEsnIF0sXG5cdFx0XHRjb3VudHJ5OiBbICdDTlQnIF0sXG5cdFx0XHRjdXJyZW5jeTogWyAnQ1VSJyBdLFxuXHRcdFx0Y3VycmVuY3lfcGF5bWVudF9tZXRob2Q6IFsgJ0NQTScgXSxcblx0XHRcdGRhdGV0aW1lOiBbICdEVFQnLCAnRFRUX0VWVCcgXSxcblx0XHRcdGRhdGV0aW1lX3RpY2tldDogWyAnRFRLJyBdLFxuXHRcdFx0ZXZlbnQ6IFsgJ0VWVCcgXSxcblx0XHRcdGV2ZW50X21lc3NhZ2VfdGVtcGxhdGU6IFsgJ0VNVCcgXSxcblx0XHRcdGV2ZW50X3F1ZXN0aW9uX2dyb3VwOiBbICdFUUcnIF0sXG5cdFx0XHRldmVudF92ZW51ZTogWyAnRVZWJyBdLFxuXHRcdFx0ZXh0cmFfam9pbjogWyAnRVhKJyBdLFxuXHRcdFx0ZXh0cmFfbWV0YTogWyAnRVhNJyBdLFxuXHRcdFx0bGluZV9pdGVtOiBbICdMSU4nIF0sXG5cdFx0XHRtZXNzYWdlOiBbICdNU0cnIF0sXG5cdFx0XHRtZXNzYWdlX3RlbXBsYXRlOiBbICdNVFAnIF0sXG5cdFx0XHRtZXNzYWdlX3RlbXBsYXRlX2dyb3VwOiBbICdHUlAnLCAnTVRQJyBdLFxuXHRcdFx0cGF5bWVudDogWyAnUEFZJyBdLFxuXHRcdFx0cGF5bWVudF9tZXRob2Q6IFsgJ1BNRCcgXSxcblx0XHRcdHBvc3RfbWV0YTogWyAnbWV0YScgXSxcblx0XHRcdHByaWNlOiBbICdQUkMnIF0sXG5cdFx0XHRwcmljZV90eXBlOiBbICdQUlQnIF0sXG5cdFx0XHRxdWVzdGlvbjogWyAnUVNUJyBdLFxuXHRcdFx0cXVlc3Rpb25fZ3JvdXA6IFsgJ1FTRycgXSxcblx0XHRcdHF1ZXN0aW9uX2dyb3VwX3F1ZXN0aW9uOiBbICdRR1EnIF0sXG5cdFx0XHRxdWVzdGlvbl9vcHRpb246IFsgJ1FTTycgXSxcblx0XHRcdHJlZ2lzdHJhdGlvbjogWyAnUkVHJyBdLFxuXHRcdFx0cmVnaXN0cmF0aW9uX3BheW1lbnQ6IFsgJ1JQWScgXSxcblx0XHRcdHN0YXRlOiBbICdTVEEnIF0sXG5cdFx0XHRzdGF0dXM6IFsgJ1NUUycgXSxcblx0XHRcdHRlcm06IFsgJ3Rlcm0nIF0sXG5cdFx0XHR0ZXJtX3JlbGF0aW9uc2hpcDogW10sXG5cdFx0XHR0ZXJtX3RheG9ub215OiBbICd0ZXJtX3RheG9ub215JyBdLFxuXHRcdFx0dGlja2V0OiBbICdUS1QnIF0sXG5cdFx0XHR0aWNrZXRfcHJpY2U6IFsgJ1RLUCcgXSxcblx0XHRcdHRpY2tldF90ZW1wbGF0ZTogWyAnVFRNJyBdLFxuXHRcdFx0dHJhbnNhY3Rpb246IFsgJ1RYTicgXSxcblx0XHRcdHZlbnVlOiBbICdWTlUnIF0sXG5cdFx0XHR3cF91c2VyOiBbICd1c2VyJyBdLFxuXHRcdH0gKTtcblx0cmV0dXJuICEgaXNVbmRlZmluZWQoIHByZWZpeE1hcFsgbW9kZWxOYW1lIF0gKSA/XG5cdFx0cHJlZml4TWFwWyBtb2RlbE5hbWUgXSA6XG5cdFx0W107XG59O1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7XG5cdGNhbWVsQ2FzZSxcblx0dXBwZXJGaXJzdCxcblx0Zm9yRWFjaCxcblx0aXNVbmRlZmluZWQsXG5cdGlzQXJyYXksXG5cdGtleXMsXG5cdHNvcnRCeSxcbn0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBjdWlkIGZyb20gJ2N1aWQnO1xuaW1wb3J0IHsgSW52YWxpZEFyZ3VtZW50IH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vZWVqcyc7XG5cbi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQge1xuXHRhc3NlcnRWYWxpZEZpZWxkQW5kVmFsdWVBZ2FpbnN0U2NoZW1hLFxuXHRhc3NlcnRWYWxpZFZhbHVlRm9yUHJlcGFyZWRGaWVsZCxcbn0gZnJvbSAnLi9hc3NlcnRpb25zJztcbmltcG9ydCB7XG5cdGRlcml2ZVJlbmRlcmVkVmFsdWUsXG5cdGRlcml2ZVByZXBhcmVkVmFsdWVGb3JGaWVsZCxcblx0Z2V0UmVsYXRpb25OYW1lRnJvbUxpbmssXG5cdGdldEJhc2VGaWVsZHNBbmRWYWx1ZXNGb3JDbG9uaW5nLFxuXHRnZXRCYXNlRmllbGRzQW5kVmFsdWVzRm9yUGVyc2lzdGluZyxcblx0Z2V0UHJpbWFyeUtleUZpZWxkc0Zyb21TY2hlbWEsXG5cdGdldEVudGl0eUZpZWxkc0Zyb21TY2hlbWEsXG5cdGdldERlZmF1bHRWYWx1ZUZvckZpZWxkLFxuXHRkZXJpdmVWYWxpZGF0ZVR5cGVGb3JGaWVsZCxcbn0gZnJvbSAnLi9leHRyYWN0b3JzJztcbmltcG9ydCB7XG5cdGlzRW50aXR5RmllbGQsXG5cdGlzUHJpbWFyeUtleUZpZWxkLFxufSBmcm9tICcuL2Jvb2xlYW5zJztcbmltcG9ydCB7IFBSSVZBVEVfUFJPUEVSVElFUywgU0FWRV9TVEFURSB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqKFxuICogQSBnZW5lcmljIGdldHRlciBjcmVhdG9yIGZvciBhIHByb3ZpZGVkIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZSAgVGhlIG5hbWUgb2YgdGhlIGFjY2Vzc29yLlxuICogQHBhcmFtIHsqfSBmaWVsZFZhbHVlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyB1c2VkIHRvIHBhc3MgdGhyb3VnaCBhZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZVxuICogT2JqZWN0LmRlZmluZVByb3BlcnR5IGNhbGwuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVHZXR0ZXIgPSAoIGluc3RhbmNlLCBmaWVsZE5hbWUsIGZpZWxkVmFsdWUsIG9wdHMgPSB7fSApID0+IHtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCBpbnN0YW5jZSwgZmllbGROYW1lLCB7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIGZpZWxkVmFsdWU7XG5cdFx0fSxcblx0XHQuLi5vcHRzLFxuXHR9ICk7XG59O1xuXG4vKipcbiAqIFRoaXMgY3JlYXRlcyBhIGdldHRlciB0aGF0IGNhbGxzIHRoZSBwcm92aWRlZCBjYWxsYmFjayB3aGVuIGludm9rZWQuXG4gKlxuICogVGhlIGNhbGxiYWNrIHJlY2VpdmVzIHRoZSBgaW5zdGFuY2VgIGFyZ3VtZW50IHBhc3NlZCB0aHJvdWdoXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlOYW1lXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCl9IGNhbGxCYWNrXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQ2FsbGJhY2tHZXR0ZXIgPSAoXG5cdGluc3RhbmNlLFxuXHRwcm9wZXJ0eU5hbWUsXG5cdGNhbGxCYWNrLFxuXHRvcHRzID0ge31cbikgPT4ge1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIGluc3RhbmNlLCBwcm9wZXJ0eU5hbWUsIHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gY2FsbEJhY2soIGluc3RhbmNlICk7XG5cdFx0fSxcblx0XHQuLi5vcHRzLFxuXHR9ICk7XG59O1xuXG4vKipcbiAqIEEgZ2VuZXJpYyBnZXR0ZXIgYW5kIHNldHRlciBjcmVhdG9yIGZvciBhIHByb3ZpZGVkIGluc3RhbmNlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lXG4gKiBAcGFyYW0geyp9ICBpbml0aWFsRmllbGRWYWx1ZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uYWwsIHBhc3MgdGhyb3VnaCBvcHRpb25zIHVzZWQgYnlcbiAqIE9iamVjdC5kZWZpbmVQcm9wZXJ0eVxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlR2V0dGVyQW5kU2V0dGVyID0gKFxuXHRpbnN0YW5jZSxcblx0ZmllbGROYW1lLFxuXHRpbml0aWFsRmllbGRWYWx1ZSxcblx0b3B0cyA9IHt9LFxuKSA9PiB7XG5cdGxldCBwcm9wZXJ0eVZhbHVlID0gaW5pdGlhbEZpZWxkVmFsdWU7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggaW5zdGFuY2UsIGZpZWxkTmFtZSwge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBwcm9wZXJ0eVZhbHVlO1xuXHRcdH0sXG5cdFx0c2V0KCByZWNlaXZlZFZhbHVlICkge1xuXHRcdFx0YXNzZXJ0VmFsaWRWYWx1ZUZvclByZXBhcmVkRmllbGQoXG5cdFx0XHRcdGZpZWxkTmFtZSxcblx0XHRcdFx0cmVjZWl2ZWRWYWx1ZSxcblx0XHRcdFx0aW5zdGFuY2Vcblx0XHRcdCk7XG5cdFx0XHRzZXRTYXZlU3RhdGUoIGluc3RhbmNlLCBTQVZFX1NUQVRFLkRJUlRZICk7XG5cdFx0XHRzZXRGaWVsZFRvUGVyc2lzdCggaW5zdGFuY2UsIGZpZWxkTmFtZSApO1xuXHRcdFx0cHJvcGVydHlWYWx1ZSA9IHJlY2VpdmVkVmFsdWU7XG5cdFx0fSxcblx0XHQuLi5vcHRzLFxuXHR9ICk7XG59O1xuXG4vKipcbiAqIEEgZ2V0dGVyIGFuZCBzZXR0ZXIgY3JlYXRvciBmb3IgYW4gZmllbGQgYWxpYXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gb3JpZ2luYWxGaWVsZE5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBhbGlhc0ZpZWxkTmFtZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUFsaWFzR2V0dGVyQW5kU2V0dGVyID0gKFxuXHRpbnN0YW5jZSxcblx0b3JpZ2luYWxGaWVsZE5hbWUsXG5cdGFsaWFzRmllbGROYW1lLFxuXHRvcHRzID0ge30sXG4pID0+IHtcblx0aWYgKCBvcmlnaW5hbEZpZWxkTmFtZSAhPT0gYWxpYXNGaWVsZE5hbWUgKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCBpbnN0YW5jZSwgYWxpYXNGaWVsZE5hbWUsIHtcblx0XHRcdGdldCgpIHtcblx0XHRcdFx0cmV0dXJuIGluc3RhbmNlWyBvcmlnaW5hbEZpZWxkTmFtZSBdO1xuXHRcdFx0fSxcblx0XHRcdHNldCggcmVjZWl2ZWRWYWx1ZSApIHtcblx0XHRcdFx0cmV0dXJuIGluc3RhbmNlWyBvcmlnaW5hbEZpZWxkTmFtZSBdID0gcmVjZWl2ZWRWYWx1ZTtcblx0XHRcdH0sXG5cdFx0XHQuLi5vcHRzLFxuXHRcdH0gKTtcblx0fVxufTtcblxuLyoqXG4gKiBBIGdldHRlciBjcmVhdG9yIGZvciBhIGZpZWxkIGFsaWFzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IG9yaWdpbmFsRmllbGROYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gYWxpYXNGaWVsZE5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVBbGlhc0dldHRlciA9IChcblx0aW5zdGFuY2UsXG5cdG9yaWdpbmFsRmllbGROYW1lLFxuXHRhbGlhc0ZpZWxkTmFtZSxcblx0b3B0cyA9IHt9LFxuKSA9PiB7XG5cdGlmICggb3JpZ2luYWxGaWVsZE5hbWUgIT09IGFsaWFzRmllbGROYW1lICkge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggaW5zdGFuY2UsIGFsaWFzRmllbGROYW1lLCB7XG5cdFx0XHRnZXQoKSB7XG5cdFx0XHRcdHJldHVybiBpbnN0YW5jZVsgb3JpZ2luYWxGaWVsZE5hbWUgXTtcblx0XHRcdH0sXG5cdFx0XHQuLi5vcHRzLFxuXHRcdH0gKTtcblx0fVxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZmx1ZW50IHNldHRlciBvbiB0aGUgcHJvdmlkZWQgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBmaWVsZCBuYW1lLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgIE9wdGlvbnMgZm9yIE9iamVjdC5kZWZpbmVQcm9wZXJ0eVxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlRmx1ZW50U2V0dGVyID0gKCBpbnN0YW5jZSwgZmllbGROYW1lLCBvcHRzID0ge30gKSA9PiB7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggaW5zdGFuY2UsICdzZXQnICsgdXBwZXJGaXJzdCggZmllbGROYW1lICksIHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gKCByZWNlaXZlZFZhbHVlICkgPT4ge1xuXHRcdFx0XHRpbnN0YW5jZVsgZmllbGROYW1lIF0gPSByZWNlaXZlZFZhbHVlO1xuXHRcdFx0XHRyZXR1cm4gaW5zdGFuY2U7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0Li4ub3B0cyxcblx0fSApO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGluaXRpYWwgZ2V0dGVycyBhbmQgc2V0dGVycyBmb3IgZW50aXRpZXMgb24gdGhlIHByb3ZpZGVkIGVudGl0eVxuICogaW5zdGFuY2UgdXNpbmcgdGhlIGdpdmVuIGRhdGEuXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VcbiAqIGtleXMgb24gaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVFbnRpdHlHZXR0ZXJzQW5kU2V0dGVycyA9ICggaW5zdGFuY2UgKSA9PiB7XG5cdGNvbnN0IHByaW1hcnlLZXlzID0gW107XG5cdGZvckVhY2goXG5cdFx0aW5zdGFuY2Uub3JpZ2luYWxGaWVsZHNBbmRWYWx1ZXMsXG5cdFx0KCBmaWVsZFZhbHVlLCBmaWVsZE5hbWUgKSA9PiB7XG5cdFx0XHRjb25zdCBpc1ByaW1hcnlLZXkgPSBpc1ByaW1hcnlLZXlGaWVsZCggZmllbGROYW1lLCBpbnN0YW5jZS5zY2hlbWEgKTtcblx0XHRcdHNldFZhbGlkYXRlVHlwZUZvckZpZWxkKCBpbnN0YW5jZSwgZmllbGROYW1lLCBmaWVsZFZhbHVlICk7XG5cdFx0XHRpZiAoIGlzRW50aXR5RmllbGQoIGZpZWxkTmFtZSwgaW5zdGFuY2Uuc2NoZW1hICkgKSB7XG5cdFx0XHRcdGlmICggaW5zdGFuY2UuaXNOZXcgKSB7XG5cdFx0XHRcdFx0YXNzZXJ0VmFsaWRWYWx1ZUZvclByZXBhcmVkRmllbGQoXG5cdFx0XHRcdFx0XHRmaWVsZE5hbWUsXG5cdFx0XHRcdFx0XHRmaWVsZFZhbHVlLFxuXHRcdFx0XHRcdFx0aW5zdGFuY2Vcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFzc2VydFZhbGlkRmllbGRBbmRWYWx1ZUFnYWluc3RTY2hlbWEoXG5cdFx0XHRcdFx0XHRpbnN0YW5jZS5tb2RlbE5hbWUsXG5cdFx0XHRcdFx0XHRmaWVsZE5hbWUsXG5cdFx0XHRcdFx0XHRmaWVsZFZhbHVlLFxuXHRcdFx0XHRcdFx0aW5zdGFuY2Vcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNldEluaXRpYWxFbnRpdHlGaWVsZHNBbmRWYWx1ZXMoXG5cdFx0XHRcdFx0aW5zdGFuY2UsXG5cdFx0XHRcdFx0ZmllbGROYW1lLFxuXHRcdFx0XHRcdGZpZWxkVmFsdWUsXG5cdFx0XHRcdFx0aXNQcmltYXJ5S2V5XG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGZpZWxkTmFtZSA9PT0gJ19jYWxjdWxhdGVkX2ZpZWxkcycgKSB7XG5cdFx0XHRcdHNldENhbGN1bGF0ZWRGaWVsZEFuZFZhbHVlcyggaW5zdGFuY2UsIGZpZWxkVmFsdWUgKTtcblx0XHRcdH1cblx0XHRcdGlmICggZmllbGROYW1lID09PSAnX3Byb3RlY3RlZCcgKSB7XG5cdFx0XHRcdHBvcHVsYXRlUHJvdGVjdGVkRmllbGRzUHJvcGVydHkoIGluc3RhbmNlLCBmaWVsZFZhbHVlICk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGZpZWxkTmFtZSA9PT0gJ2xpbmsnICkge1xuXHRcdFx0XHRjcmVhdGVHZXR0ZXIoIGluc3RhbmNlLCAnbGluaycsIGZpZWxkVmFsdWUgKTtcblx0XHRcdH1cblx0XHRcdGlmICggZmllbGROYW1lID09PSAnX2xpbmtzJyApIHtcblx0XHRcdFx0c2V0UmVzb3VyY2VzKCBpbnN0YW5jZSwgZmllbGRWYWx1ZSApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAhIGluc3RhbmNlLmlzTmV3ICYmIGlzUHJpbWFyeUtleSApIHtcblx0XHRcdFx0cHJpbWFyeUtleXMucHVzaCggZmllbGROYW1lICk7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xuXHRpZiAoICEgaW5zdGFuY2UuaXNOZXcgJiYgcHJpbWFyeUtleXMubGVuZ3RoICkge1xuXHRcdGNyZWF0ZVByaW1hcnlLZXlGaWVsZEdldHRlcnMoIGluc3RhbmNlLCBwcmltYXJ5S2V5cyApO1xuXHR9XG5cblx0cG9wdWxhdGVQcmltYXJ5S2V5cyggaW5zdGFuY2UgKTtcblx0cG9wdWxhdGVNaXNzaW5nRmllbGRzKCBpbnN0YW5jZSApO1xufTtcblxuLyoqXG4gKiBQb3B1bGF0ZXMgdGhlIGBwcm90ZWN0ZWRGaWVsZHNgIHByb3BlcnR5IG9uIHRoZSBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VcbiAqIEBwYXJhbSB7QXJyYXl9IHByb3RlY3RlZEZpZWxkc1xuICovXG5jb25zdCBwb3B1bGF0ZVByb3RlY3RlZEZpZWxkc1Byb3BlcnR5ID0gKCBpbnN0YW5jZSwgcHJvdGVjdGVkRmllbGRzICkgPT4ge1xuXHQvLyBnZXQgYW55IGNhbGN1bGF0ZWQgcHJvdGVjdGVkIGZpZWxkcy5cblx0Y29uc3QgY2FsY3VsYXRlZEZpZWxkcyA9IGluc3RhbmNlXG5cdFx0Lm9yaWdpbmFsRmllbGRzQW5kVmFsdWVzXG5cdFx0Ll9jYWxjdWxhdGVkX2ZpZWxkcyB8fCB7fTtcblx0aWYgKFxuXHRcdGNhbGN1bGF0ZWRGaWVsZHMuX3Byb3RlY3RlZCAmJlxuXHRcdGlzQXJyYXkoIGNhbGN1bGF0ZWRGaWVsZHMuX3Byb3RlY3RlZCApXG5cdCkge1xuXHRcdHByb3RlY3RlZEZpZWxkcyA9IFtcblx0XHRcdC4uLnByb3RlY3RlZEZpZWxkcyxcblx0XHRcdC4uLmNhbGN1bGF0ZWRGaWVsZHMuX3Byb3RlY3RlZCxcblx0XHRdO1xuXHR9XG5cdGNyZWF0ZUdldHRlciggaW5zdGFuY2UsICdwcm90ZWN0ZWRGaWVsZHMnLCBwcm90ZWN0ZWRGaWVsZHMgKTtcbn07XG5cbi8qKlxuICogVGhpcyBwb3B1bGF0ZXMgcHJpbWFyeSBrZXkgZmllbGRzLlxuICogTm90ZSB0aGF0IGl0IGFsc28gb3ZlcnJpZGVzIGFueSBwcmltYXJ5IGtleSB2YWx1ZXMvcHJvcGVydGllcyB0aGF0IGFyZVxuICogYWxyZWFkeSBzZXQgaW4gdGhlIGVudGl0eSBzbyBpcyBvbmx5IHByb2Nlc3NlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcyBuZXcuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlXG4gKi9cbmNvbnN0IHBvcHVsYXRlUHJpbWFyeUtleXMgPSAoIGluc3RhbmNlICkgPT4ge1xuXHRpZiAoICEgaW5zdGFuY2UuaXNOZXcgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGNvbnN0IHByaW1hcnlLZXlzID0gZ2V0UHJpbWFyeUtleUZpZWxkc0Zyb21TY2hlbWEoIGluc3RhbmNlICk7XG5cdGZvckVhY2goIHByaW1hcnlLZXlzLCAoXG5cdFx0c2NoZW1hUHJvcGVydGllcyxcblx0XHRzY2hlbWFGaWVsZFxuXHQpID0+IHtcblx0XHQvLyBhbHdheXMgZGVsZXRlIGFuZCBvdmVycmlkZSB3aGF0IGlzIGV4aXN0aW5nLlxuXHRcdGlmICggaW5zdGFuY2VbIHNjaGVtYUZpZWxkIF0gKSB7XG5cdFx0XHRkZWxldGUgaW5zdGFuY2VbIHNjaGVtYUZpZWxkIF07XG5cdFx0fVxuXHRcdGNyZWF0ZUdldHRlcihcblx0XHRcdGluc3RhbmNlLFxuXHRcdFx0c2NoZW1hRmllbGQsXG5cdFx0XHRjdWlkKCksXG5cdFx0XHR7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSB9XG5cdFx0KTtcblx0XHRjcmVhdGVBbGlhc0dldHRlckZvckZpZWxkKCBpbnN0YW5jZSwgc2NoZW1hRmllbGQgKTtcblx0fSApO1xuXHRjcmVhdGVQcmltYXJ5S2V5RmllbGRHZXR0ZXJzKFxuXHRcdGluc3RhbmNlLFxuXHRcdGtleXMoIHByaW1hcnlLZXlzIClcblx0KTtcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgdmFsaWRhdGUgdHlwZSBmb3IgYSBmaWVsZCBwcm9wZXJ0eS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZVxuICogQHBhcmFtIHsqfSBmaWVsZFZhbHVlXG4gKi9cbmNvbnN0IHNldFZhbGlkYXRlVHlwZUZvckZpZWxkID0gKCBpbnN0YW5jZSwgZmllbGROYW1lLCBmaWVsZFZhbHVlICkgPT4ge1xuXHRpbnN0YW5jZVsgUFJJVkFURV9QUk9QRVJUSUVTLlZBTElEQVRFX1RZUEVTIF1bIGZpZWxkTmFtZSBdID1cblx0XHRkZXJpdmVWYWxpZGF0ZVR5cGVGb3JGaWVsZCggZmllbGROYW1lLCBmaWVsZFZhbHVlLCBpbnN0YW5jZS5zY2hlbWEgKTtcbn07XG5cbi8qKlxuICogIFBvcHVsYXRlcyBtaXNzaW5nIGZpZWxkcyBhbmQgdmFsdWVzIHVzaW5nIGRlZmF1bHRzIHByb3ZpZGVkIGJ5IHNjaGVtYS4gIElmXG4gKiAgc2NoZW1hIGRvZXNuJ3QgcHJvdmlkZSBhIGRlZmF1bHQgdGhlbiB0aGlzIHdpbGwgcG9wdWxhdGUgdGhlIGZpZWxkIHdpdGggYVxuICogIGRlZmF1bHQgdmFsdWUgdGhhdCBtYXRjaGVzIHRoZSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICovXG5jb25zdCBwb3B1bGF0ZU1pc3NpbmdGaWVsZHMgPSAoIGluc3RhbmNlICkgPT4ge1xuXHRpZiAoIHR5cGVvZiBpbnN0YW5jZS5wcm90ZWN0ZWRGaWVsZHMgPT09ICd1bmRlZmluZWQnICkge1xuXHRcdHBvcHVsYXRlUHJvdGVjdGVkRmllbGRzUHJvcGVydHkoIGluc3RhbmNlLCBbXSApO1xuXHR9XG5cdGlmICggISBpbnN0YW5jZS5pc05ldyApIHtcblx0XHRyZXR1cm47XG5cdH1cblx0Zm9yRWFjaChcblx0XHRnZXRFbnRpdHlGaWVsZHNGcm9tU2NoZW1hKCBpbnN0YW5jZSApLFxuXHRcdCggc2NoZW1hUHJvcGVydGllcywgZmllbGROYW1lICkgPT4ge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHR0eXBlb2YgaW5zdGFuY2VbIGZpZWxkTmFtZSBdID09PSAndW5kZWZpbmVkJyAmJlxuXHRcdFx0XHQhIGlzUHJpbWFyeUtleUZpZWxkKCBmaWVsZE5hbWUsIGluc3RhbmNlLnNjaGVtYSApXG5cdFx0XHQpIHtcblx0XHRcdFx0c2V0SW5pdGlhbEVudGl0eUZpZWxkc0FuZFZhbHVlcyhcblx0XHRcdFx0XHRpbnN0YW5jZSxcblx0XHRcdFx0XHRmaWVsZE5hbWUsXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHBsYWluIG9iamVjdCBvZiBlbnRpdHkgZmllbGRzIGFuZCB2YWx1ZXMgZnJvbSB0aGlzIGVudGl0eSBpbnN0YW5jZVxuICogZm9yIHVzZSBpbiBjbG9uaW5nIHRoZSBlbnRpdHkuXG4gKlxuICogQHBhcmFtIHtCYXNlRW50aXR5fSBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm4ge09iamVjdH0gUGxhaW4gb2JqZWN0IG9mIGFsbCBmaWVsZDp2YWx1ZSBwYWlycy5cbiAqL1xuY29uc3QgZm9yQ2xvbmUgPSAoIGluc3RhbmNlICkgPT4ge1xuXHRyZXR1cm4gZ2V0QmFzZUZpZWxkc0FuZFZhbHVlc0ZvckNsb25pbmcoIGluc3RhbmNlICk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBwbGFpbiBvYmplY3Qgb2YgdGhlIGVudGl0eSBmaWVsZHMgYW5kIHZhbHVlcyBmcm9tIHRoaXMgZW50aXR5XG4gKiBpbnN0YW5jZSBwcmVwYXJlZCBmb3IgdXNlIGluIGFuIHVwZGF0ZSByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHJldHVybiB7T2JqZWN0fSBQbGFpbiBvYmplY3Qgb2YgZmllbGQ6dmFsdWUgcGFpcnMuXG4gKi9cbmNvbnN0IGZvclVwZGF0ZSA9ICggaW5zdGFuY2UgKSA9PiB7XG5cdHJldHVybiBnZXRCYXNlRmllbGRzQW5kVmFsdWVzRm9yUGVyc2lzdGluZyggaW5zdGFuY2UgKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHBsYWluIG9iamVjdCBvZiB0aGUgZW50aXR5IGZpZWxkcyBhbmQgdmFsdWVzIGZyb20gdGhpcyBlbnRpdHlcbiAqIGluc3RhbmNlIHByZXBhcmVkIGZvciB1c2UgaW4gYW4gaW5zZXJ0IHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlXG4gKiBAcmV0dXJuIHtPYmplY3R9IFBsYWluIG9iamVjdCBvZiBmaWVsZDp2YWx1ZSBwYWlycy5cbiAqL1xuY29uc3QgZm9ySW5zZXJ0ID0gKCBpbnN0YW5jZSApID0+IHtcblx0Y29uc3QgZW50aXR5VmFsdWVzID0gZ2V0QmFzZUZpZWxkc0FuZFZhbHVlc0ZvclBlcnNpc3RpbmcoXG5cdFx0aW5zdGFuY2UsXG5cdFx0dHJ1ZVxuXHQpO1xuXHRpbnN0YW5jZS5wcmltYXJ5S2V5cy5mb3JFYWNoKCAoIHByaW1hcnlLZXkgKSA9PiB7XG5cdFx0ZW50aXR5VmFsdWVzWyBwcmltYXJ5S2V5IF0gPSBpbnN0YW5jZVsgcHJpbWFyeUtleSBdO1xuXHR9ICk7XG5cdHJldHVybiBlbnRpdHlWYWx1ZXM7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBwbGFpbiBvYmplY3Qgb2YgdGhlIGVudGl0eSBmaWVsZHMgYW5kIHZhbHVlcyBmcm9tIHRoaXMgZW50aXR5XG4gKiBpbnN0YW5jZSBwcmVwYXJlZCBmb3IgdXNlIGluIGVpdGhlciBhbiBpbnNlcnQgb3IgdXBkYXRlIHJlcXVlc3QuICBUaGUgdHlwZVxuICogaXMgYXV0b21hdGljYWxseSBkZXJpdmVkIGZyb20gdGhlIGRldGVybWluaW5nIHdoZXRoZXIgdGhlIGVudGl0eSBpcyBcIm5ld1wiIG9yXG4gKiBub3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlXG4gKiBAcmV0dXJuIHtPYmplY3R9IFBsYWluIG9iamVjdCBvZiBmaWVsZDp2YWx1ZSBwYWlycy5cbiAqL1xuY29uc3QgZm9yUGVyc2lzdCA9ICggaW5zdGFuY2UgKSA9PiB7XG5cdGlmICggaW5zdGFuY2UuaXNOZXcgKSB7XG5cdFx0cmV0dXJuIGZvckluc2VydCggaW5zdGFuY2UgKTtcblx0fVxuXHRyZXR1cm4gZm9yVXBkYXRlKCBpbnN0YW5jZSApO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGdldHRlcnMgZm9yIHJldHJpZXZpbmcgdGhlIGZpZWxkcyBhbmQgdmFsdWVzIG9mIHRoZSBlbnRpdHkgaW5zdGFuY2VcbiAqIGZvciBpbnNlcnQgb3IgdXBkYXRlIHJlcXVlc3RzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlUGVyc2lzdGluZ0dldHRlcnNBbmRTZXR0ZXJzID0gKCBpbnN0YW5jZSApID0+IHtcblx0Y3JlYXRlQ2FsbGJhY2tHZXR0ZXIoIGluc3RhbmNlLCAnZm9yVXBkYXRlJywgZm9yVXBkYXRlICk7XG5cdGNyZWF0ZUNhbGxiYWNrR2V0dGVyKCBpbnN0YW5jZSwgJ2Zvckluc2VydCcsIGZvckluc2VydCApO1xuXHRjcmVhdGVDYWxsYmFja0dldHRlciggaW5zdGFuY2UsICdmb3JQZXJzaXN0JywgZm9yUGVyc2lzdCApO1xuXHRjcmVhdGVDYWxsYmFja0dldHRlciggaW5zdGFuY2UsICdmb3JDbG9uZScsIGZvckNsb25lICk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgaW5pdGlhbCBlbnRpdHkgZmllbGQgYWNjZXNzb3JzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZVxuICogQHBhcmFtIHsqfSBmaWVsZFZhbHVlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzUHJpbWFyeUtleVxuICovXG5jb25zdCBzZXRJbml0aWFsRW50aXR5RmllbGRzQW5kVmFsdWVzID0gKFxuXHRpbnN0YW5jZSxcblx0ZmllbGROYW1lLFxuXHRmaWVsZFZhbHVlLFxuXHRpc1ByaW1hcnlLZXkgPSBmYWxzZSxcbikgPT4ge1xuXHRpZiAoIGlzVW5kZWZpbmVkKCBmaWVsZFZhbHVlICkgKSB7XG5cdFx0ZmllbGRWYWx1ZSA9IGdldERlZmF1bHRWYWx1ZUZvckZpZWxkKCBmaWVsZE5hbWUsIGluc3RhbmNlLnNjaGVtYSApO1xuXHRcdHNldFZhbGlkYXRlVHlwZUZvckZpZWxkKCBpbnN0YW5jZSwgZmllbGROYW1lLCBmaWVsZFZhbHVlICk7XG5cdH1cblx0Y3JlYXRlUmF3RW50aXR5R2V0dGVyc1NldHRlcnMoXG5cdFx0aW5zdGFuY2UsXG5cdFx0ZmllbGROYW1lLFxuXHRcdGRlcml2ZVByZXBhcmVkVmFsdWVGb3JGaWVsZCggZmllbGROYW1lLCBmaWVsZFZhbHVlLCBpbnN0YW5jZSApLFxuXHRcdGlzUHJpbWFyeUtleVxuXHQpO1xuXHRpZiAoICEgaXNQcmltYXJ5S2V5ICkge1xuXHRcdGNyZWF0ZVJlbmRlcmVkR2V0dGVycyhcblx0XHRcdGluc3RhbmNlLFxuXHRcdFx0ZmllbGROYW1lLFxuXHRcdFx0ZGVyaXZlUmVuZGVyZWRWYWx1ZSggZmllbGRWYWx1ZSApXG5cdFx0KTtcblx0fVxufTtcblxuLyoqXG4gKiBDcmVhdGVzIHJhdyBlbnRpdHkgZ2V0dGVycyBhbmQgc2V0dGVycy4gIFRoZXNlIGFyZSB0aGUgcHJvcGVydGllcyBvZiBhblxuICogZW50aXR5IHRoYXQgaGF2ZSB0aGUgdmFsdWVzIHVzZWQgZm9yIG5vdCBvbmx5IGdldHRpbmcgYnV0IGFsc28gc2V0dGluZy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWVcbiAqIEBwYXJhbSB7Kn0gZmllbGRWYWx1ZVxuICogQHBhcmFtIHtib29sZWFufSBpc1ByaW1hcnlLZXkgc2V0IHRvIHRydWUgaWYgZmllbGQgaXMgdGhlIG1vZGVsJ3MgcHJpbWFyeSBrZXlcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVJhd0VudGl0eUdldHRlcnNTZXR0ZXJzID0gKFxuXHRpbnN0YW5jZSxcblx0ZmllbGROYW1lLFxuXHRmaWVsZFZhbHVlLFxuXHRpc1ByaW1hcnlLZXkgPSBmYWxzZSxcbikgPT4ge1xuXHRjb25zdCBvcHRzID0geyBlbnVtZXJhYmxlOiB0cnVlIH07XG5cdC8vIHByaW1hcnkga2V5IGlzIGltbXV0YWJsZVxuXHRpZiAoIGlzUHJpbWFyeUtleSApIHtcblx0XHRjcmVhdGVHZXR0ZXIoXG5cdFx0XHRpbnN0YW5jZSxcblx0XHRcdGZpZWxkTmFtZSxcblx0XHRcdGZpZWxkVmFsdWUsXG5cdFx0XHRvcHRzXG5cdFx0KTtcblx0XHRjcmVhdGVBbGlhc0dldHRlckZvckZpZWxkKCBpbnN0YW5jZSwgZmllbGROYW1lICk7XG5cdH0gZWxzZSB7XG5cdFx0Y3JlYXRlR2V0dGVyQW5kU2V0dGVyKFxuXHRcdFx0aW5zdGFuY2UsXG5cdFx0XHRmaWVsZE5hbWUsXG5cdFx0XHRmaWVsZFZhbHVlLFxuXHRcdFx0b3B0c1xuXHRcdCk7XG5cdFx0Y3JlYXRlRmx1ZW50U2V0dGVyKCBpbnN0YW5jZSwgZmllbGROYW1lICk7XG5cdFx0Y3JlYXRlQWxpYXNHZXR0ZXJBbmRTZXR0ZXJGb3JGaWVsZCggaW5zdGFuY2UsIGZpZWxkTmFtZSApO1xuXHR9XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgXCJhbGlhc1wiIGdldHRlciBmb3IgdGhlIGdpdmVuIGZpZWxkIG5hbWUgb24gdGhlIGVudGl0eSBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZVxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQWxpYXNHZXR0ZXJGb3JGaWVsZCA9ICggaW5zdGFuY2UsIGZpZWxkTmFtZSApID0+IHtcblx0Y3JlYXRlQWxpYXNlc0Zvck1ldGhvZCggaW5zdGFuY2UsIGZpZWxkTmFtZSwgY3JlYXRlQWxpYXNHZXR0ZXIgKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBcImFsaWFzXCIgZ2V0dGVycyBhbmQgc2V0dGVycyBmb3IgdGhlIGdpdmVuIGZpZWxkIG9uIHRoZSBlbnRpdHlcbiAqIGluc3RhbmNlLlxuICpcbiAqIEV4YW1wbGU6IERhdGV0aW1lIGVudGl0aWVzIGhhdmUgYSBgRFRUX0VWVF9zdGFydGAgZmllbGQuICBPbiB0aGUgZW50aXR5XG4gKiBpbnN0YW5jZSwgeW91IHdpbGwgYmUgYWJsZSB0byBhY2Nlc3MgdGhlIHZhbHVlIG9mIHRoYXQgZmllbGQgdmlhOlxuICogLSBkYXRldGltZS5EVFRfRVZUX3N0YXJ0XG4gKiAtIGRhdGV0aW1lLmR0dEV2dFN0YXJ0XG4gKiAtIGRhdGV0aW1lLmV2dFN0YXJ0XG4gKiAtIGRhdGV0aW1lLnN0YXJ0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVBbGlhc0dldHRlckFuZFNldHRlckZvckZpZWxkID0gKCBpbnN0YW5jZSwgZmllbGROYW1lICkgPT4ge1xuXHRjcmVhdGVBbGlhc2VzRm9yTWV0aG9kKCBpbnN0YW5jZSwgZmllbGROYW1lLCBjcmVhdGVBbGlhc0dldHRlckFuZFNldHRlciApO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIEFsaWFzZXMgdXNpbmcgdGhlIHByb3ZpZGVkIG1ldGhvZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZVxuICogQHBhcmFtIHtmdW5jdGlvbn0gbWV0aG9kXG4gKi9cbmNvbnN0IGNyZWF0ZUFsaWFzZXNGb3JNZXRob2QgPSAoIGluc3RhbmNlLCBmaWVsZE5hbWUsIG1ldGhvZCApID0+IHtcblx0Ly8gY2FtZWxDYXNlIGdldHRlciAob3Igc2V0dGVyKSBmb3IgZnVsbCBmaWVsZCBuYW1lIChlZy4gRVZUX2Rlc2MgPT4gZXZ0RGVzYylcblx0bWV0aG9kKCBpbnN0YW5jZSwgZmllbGROYW1lLCBjYW1lbENhc2UoIGZpZWxkTmFtZSApICk7XG5cdC8vIHN0cmlwIGZpZWxkIHByZWZpeGVzIGFuZCBjYW1lbENhc2UgKGlmIHRoZXJlIGFyZSBmaWVsZCBwcmVmaXhlcyBmb3IgdGhlXG5cdC8vIGVudGl0eS4gKGVnLiBFVlRfZGVzYyA9PiBkZXNjKTtcblx0aWYgKCBpbnN0YW5jZS5maWVsZFByZWZpeGVzICkge1xuXHRcdGxldCBuZXdGaWVsZE5hbWUgPSAnJztcblx0XHQvLyBZZXMsIGl0cyBpbnRlbmRlZCB0aGF0IGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBwcmVmaXhlcywgdGhpcyBjb3VsZFxuXHRcdC8vIGVuZCB1cCBjcmVhdGluZyBtdWx0aXBsZSBhbGlhc2VkIGdldHRlcnMgKG9yIHNldHRlcnMpXG5cdFx0Ly8gKGVnIERhdGV0aW1lOiBEVFRfRVZUX3N0YXJ0IHdvdWxkIGVuZCB1cCB3aXRoIGBldnRTdGFydGAgYW5kIGBzdGFydGBcblx0XHQvLyBhcyBnZXR0ZXIgYWNjZXNzb3JzKS5cblx0XHRpbnN0YW5jZS5maWVsZFByZWZpeGVzLmZvckVhY2goICggZmllbGRQcmVmaXggKSA9PiB7XG5cdFx0XHRuZXdGaWVsZE5hbWUgPSBmaWVsZE5hbWUucmVwbGFjZSggZmllbGRQcmVmaXggKyAnXycsICcnICk7XG5cdFx0XHRpZiAoIG5ld0ZpZWxkTmFtZSAhPT0gZmllbGROYW1lICkge1xuXHRcdFx0XHRtZXRob2QoXG5cdFx0XHRcdFx0aW5zdGFuY2UsXG5cdFx0XHRcdFx0ZmllbGROYW1lLFxuXHRcdFx0XHRcdGNhbWVsQ2FzZSggbmV3RmllbGROYW1lIClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn07XG5cbi8qKlxuICogUmV0dXJucyBhIGNhbGxiYWNrIHRoYXQgaXMgdXNlZCBpbiB0aGUgYGdldFJlbmRlcmVkYCBmaWVsZCBnZXR0ZXIuXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKHN0cmluZyk6ICp9ICBBIGNhbGxiYWNrLlxuICovXG5jb25zdCBnZXRSZW5kZXJlZENhbGxiYWNrID0gKCBpbnN0YW5jZSApID0+ICggcmVxdWVzdGVkRmllbGROYW1lICkgPT5cblx0aW5zdGFuY2VbIHJlcXVlc3RlZEZpZWxkTmFtZSArICdSZW5kZXJlZCcgXTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZmllbGROYW1lIHN0cmlwcGVkIG9mIGFsbCBwb3NzaWJsZSBwcmVmaXhlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWVcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHByZWZpeCBmcmVlIGZpZWxkTmFtZS5cbiAqL1xuY29uc3QgcmVtb3ZlUHJlZml4ZXNGcm9tRmllbGQgPSAoIGluc3RhbmNlLCBmaWVsZE5hbWUgKSA9PiB7XG5cdGNvbnN0IHByZWZpeGVzVG9SZW1vdmUgPSBzb3J0QnkoXG5cdFx0aW5zdGFuY2UuZmllbGRQcmVmaXhlcyxcblx0XHQoIHByZWZpeCApID0+IHByZWZpeC5sZW5ndGggKiAtMVxuXHQpO1xuXHRsZXQgbmV3RmllbGROYW1lID0gZmllbGROYW1lO1xuXHRmb3JFYWNoKCBwcmVmaXhlc1RvUmVtb3ZlLCAoIHByZWZpeCApID0+IHtcblx0XHRuZXdGaWVsZE5hbWUgPSBmaWVsZE5hbWUucmVwbGFjZSggcHJlZml4LCAnJyApO1xuXHRcdGlmICggbmV3RmllbGROYW1lICE9PSBmaWVsZE5hbWUgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9ICk7XG5cdHJldHVybiBuZXdGaWVsZE5hbWU7XG59O1xuXG4vKipcbiAqIFRoaXMgY3JlYXRlcyB0aGUgZ2V0dGVycyBmb3IgdGhlIHJlbmRlcmVkIHByb3BlcnR5IG9mIG1vZGVsIGZpZWxkcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWVcbiAqIEBwYXJhbSB7Kn0gIGZpZWxkVmFsdWVcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlbmRlcmVkR2V0dGVycyA9ICggaW5zdGFuY2UsIGZpZWxkTmFtZSwgZmllbGRWYWx1ZSApID0+IHtcblx0Y3JlYXRlR2V0dGVyKFxuXHRcdGluc3RhbmNlLFxuXHRcdGNhbWVsQ2FzZSggcmVtb3ZlUHJlZml4ZXNGcm9tRmllbGQoIGluc3RhbmNlLCBmaWVsZE5hbWUgKSApICtcblx0XHQnUmVuZGVyZWQnLFxuXHRcdGZpZWxkVmFsdWVcblx0KTtcblx0aWYgKCBpc1VuZGVmaW5lZCggaW5zdGFuY2UuZ2V0UmVuZGVyZWQgKSApIHtcblx0XHRjcmVhdGVDYWxsYmFja0dldHRlcihcblx0XHRcdGluc3RhbmNlLFxuXHRcdFx0J2dldFJlbmRlcmVkJyxcblx0XHRcdGdldFJlbmRlcmVkQ2FsbGJhY2ssXG5cdFx0KTtcblx0fVxufTtcblxuLyoqXG4gKiBDYWxsYmFjayBmb3IgdGhlIGBoYXNNdWx0aXBsZVByaW1hcnlLZXlzYCBnZXR0ZXIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlXG4gKiBAcmV0dXJuIHtmdW5jdGlvbigpOiBib29sZWFufSBUaGUgY2FsbGJhY2sgZm9yIGhhc011bHRpcGxlUHJpbWFyeUtleXMgZ2V0dGVyXG4gKi9cbmNvbnN0IGhhc011bHRpcGxlUHJpbWFyeUtleXNDYWxsYmFjayA9ICggaW5zdGFuY2UgKSA9PlxuXHRpbnN0YW5jZS5wcmltYXJ5S2V5cy5sZW5ndGggPiAxO1xuXG4vKipcbiAqIENyZWF0ZXMgZ2V0dGVycyBmb3IgcHJpbWFyeSBrZXkgcmVsYXRlZCBkYXRhLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHBhcmFtIHtBcnJheX0gcHJpbWFyeUtleXNcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVByaW1hcnlLZXlGaWVsZEdldHRlcnMgPSAoIGluc3RhbmNlLCBwcmltYXJ5S2V5cyApID0+IHtcblx0Y29uc3Qgb3B0cyA9IHsgY29uZmlndXJhYmxlOiB0cnVlIH07XG5cdGlmICggaXNBcnJheSggcHJpbWFyeUtleXMgKSApIHtcblx0XHRjcmVhdGVHZXR0ZXIoXG5cdFx0XHRpbnN0YW5jZSxcblx0XHRcdCdwcmltYXJ5S2V5Jyxcblx0XHRcdHByaW1hcnlLZXlzWyAwIF0sXG5cdFx0XHRvcHRzXG5cdFx0KTtcblx0XHRjcmVhdGVHZXR0ZXJBbmRTZXR0ZXIoXG5cdFx0XHRpbnN0YW5jZSxcblx0XHRcdCdwcmltYXJ5S2V5cycsXG5cdFx0XHRwcmltYXJ5S2V5cyxcblx0XHRcdG9wdHNcblx0XHQpO1xuXHRcdGNyZWF0ZUNhbGxiYWNrR2V0dGVyKFxuXHRcdFx0aW5zdGFuY2UsXG5cdFx0XHQnaGFzTXVsdGlwbGVQcmltYXJ5S2V5cycsXG5cdFx0XHRoYXNNdWx0aXBsZVByaW1hcnlLZXlzQ2FsbGJhY2ssXG5cdFx0XHRvcHRzXG5cdFx0KTtcblx0fVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKHN0cmluZyk6IGJvb2xlYW59IFJldHVybnMgYSBjYWxsYmFjayBmb3IgdGhlXG4gKiBoYXNDYWxjdWxhdGVkRmllbGQgZ2V0dGVyXG4gKi9cbmNvbnN0IGhhc0NhbGN1bGF0ZWRGaWVsZENhbGxiYWNrID0gKCBpbnN0YW5jZSApID0+XG5cdCggZmllbGROYW1lVG9DaGVjayApID0+ICEgaXNVbmRlZmluZWQoIGluc3RhbmNlWyBmaWVsZE5hbWVUb0NoZWNrIF0gKTtcblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBnZXR0ZXJzIGZvciBhbGwgdGhlIGNhbGN1bGF0ZWQgZmllbGRzIGFuZCB2YWx1ZSBvbiB0aGUgZW50aXR5LlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlXG4gKiBAcGFyYW0ge09iamVjdC48c3RyaW5nLCo+fWZpZWxkc0FuZFZhbHVlc1xuICovXG5leHBvcnQgY29uc3Qgc2V0Q2FsY3VsYXRlZEZpZWxkQW5kVmFsdWVzID0gKCBpbnN0YW5jZSwgZmllbGRzQW5kVmFsdWVzICkgPT4ge1xuXHRmb3JFYWNoKCBmaWVsZHNBbmRWYWx1ZXMsICggY2FsY3VsYXRlZEZpZWxkVmFsdWUsIGNhbGN1bGF0ZWRGaWVsZE5hbWUgKSA9PiB7XG5cdFx0aWYgKCBjYWxjdWxhdGVkRmllbGROYW1lICE9PSAnX3Byb3RlY3RlZCcgKSB7XG5cdFx0XHRjcmVhdGVHZXR0ZXIoXG5cdFx0XHRcdGluc3RhbmNlLFxuXHRcdFx0XHRjYW1lbENhc2UoIGNhbGN1bGF0ZWRGaWVsZE5hbWUgKSxcblx0XHRcdFx0Y2FsY3VsYXRlZEZpZWxkVmFsdWVcblx0XHRcdCk7XG5cdFx0fVxuXHR9ICk7XG5cdGNyZWF0ZUNhbGxiYWNrR2V0dGVyKFxuXHRcdGluc3RhbmNlLFxuXHRcdCdoYXNDYWxjdWxhdGVkRmllbGQnLFxuXHRcdGhhc0NhbGN1bGF0ZWRGaWVsZENhbGxiYWNrXG5cdCk7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBnZXR0ZXJzIGZvciB0aGUgdmFyaW91cyByZXNvdXJjZSBsaW5rcyBvbiB0aGUgZW50aXR5LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHBhcmFtIHtPYmplY3QuPHN0cmluZywqPn1maWVsZHNBbmRWYWx1ZXNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldFJlc291cmNlcyA9ICggaW5zdGFuY2UsIGZpZWxkc0FuZFZhbHVlcyApID0+IHtcblx0Y29uc3QgcmVsYXRpb25zID0gW107XG5cdGxldCByZWxhdGlvbk5hbWU7XG5cdGZvckVhY2goIGZpZWxkc0FuZFZhbHVlcywgKCByZXNvdXJjZVZhbHVlLCByZXNvdXJjZU5hbWUgKSA9PiB7XG5cdFx0aWYgKCByZXNvdXJjZU5hbWUgPT09ICdzZWxmJyApIHtcblx0XHRcdGNyZWF0ZUdldHRlciggaW5zdGFuY2UsICdyZXNvdXJjZUxpbmsnLCByZXNvdXJjZVZhbHVlWyAwIF0uaHJlZiApO1xuXHRcdH0gZWxzZSBpZiAoIHJlc291cmNlTmFtZSA9PT0gJ2NvbGxlY3Rpb24nICkge1xuXHRcdFx0Y3JlYXRlR2V0dGVyKFxuXHRcdFx0XHRpbnN0YW5jZSxcblx0XHRcdFx0J2NvbGxlY3Rpb25SZXNvdXJjZUxpbmsnLFxuXHRcdFx0XHRyZXNvdXJjZVZhbHVlWyAwIF0uaHJlZlxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVsYXRpb25OYW1lID0gZ2V0UmVsYXRpb25OYW1lRnJvbUxpbmsoIHJlc291cmNlTmFtZSApO1xuXHRcdFx0cmVsYXRpb25zLnB1c2goIHJlbGF0aW9uTmFtZSApO1xuXHRcdFx0c2V0UmVsYXRpb25zUmVzb3VyY2UoXG5cdFx0XHRcdGluc3RhbmNlLFxuXHRcdFx0XHRyZWxhdGlvbk5hbWUgKyAnUmVzb3VyY2UnLFxuXHRcdFx0XHRyZXNvdXJjZVZhbHVlXG5cdFx0XHQpO1xuXHRcdH1cblx0fSApO1xuXHQvL3NldCByZWxhdGlvbnMgZ2V0dGVyXG5cdGNyZWF0ZUdldHRlciggaW5zdGFuY2UsICdnZXRSZWxhdGlvbnMnLCByZWxhdGlvbnMgKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihzdHJpbmcpOiBPYmplY3R9IFJldHVybnMgdGhlIGNhbGxiYWNrIGZvciBnZXR0aW5nIGFcbiAqIHJlbGF0aW9uIHJlc291cmNlXG4gKi9cbmNvbnN0IGdldFJlbGF0aW9uUmVzb3VyY2VDYWxsYmFjayA9ICggaW5zdGFuY2UgKSA9PlxuXHQoIHJlbGF0aW9uTmFtZSApID0+IGluc3RhbmNlWyByZWxhdGlvbk5hbWUucmVwbGFjZSggJ1Jlc291cmNlJywgJycgKSBdO1xuXG4vKipcbiAqIENyZWF0ZXMgZ2V0dGVycyBmb3IgdGhlIHJlbGF0aW9ucyByZXNvdXJjZSBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25OYW1lXG4gKiBAcGFyYW0ge09iamVjdC48c3RyaW5nLCBzdHJpbmc+fSByZXNvdXJjZUluZm9cbiAqL1xuZXhwb3J0IGNvbnN0IHNldFJlbGF0aW9uc1Jlc291cmNlID0gKFxuXHRpbnN0YW5jZSxcblx0cmVsYXRpb25OYW1lLFxuXHRyZXNvdXJjZUluZm9cbikgPT4ge1xuXHRjcmVhdGVHZXR0ZXIoXG5cdFx0aW5zdGFuY2UsXG5cdFx0cmVsYXRpb25OYW1lLFxuXHRcdHtcblx0XHRcdHJlc291cmNlTGluazogcmVzb3VyY2VJbmZvWyAwIF0uaHJlZixcblx0XHRcdHNpbmdsZTogcmVzb3VyY2VJbmZvWyAwIF0uc2luZ2xlLFxuXHRcdH1cblx0KTtcblx0aWYgKCBpc1VuZGVmaW5lZCggaW5zdGFuY2UuZ2V0UmVsYXRpb25SZXNvdXJjZSApICkge1xuXHRcdGNyZWF0ZUNhbGxiYWNrR2V0dGVyKCBpbnN0YW5jZSxcblx0XHRcdCdnZXRSZWxhdGlvblJlc291cmNlJyxcblx0XHRcdGdldFJlbGF0aW9uUmVzb3VyY2VDYWxsYmFja1xuXHRcdCk7XG5cdH1cbn07XG5cbi8qKlxuICogU2V0cyB0aGUgaW50ZXJuYWwgc2F2ZSBzdGF0ZSB0byB0aGUgZ2l2ZW4gdmFsdWUgd2hlbiBjdXJyZW50IHN0YXRlIGlzXG4gKiBTQVZFX1NUQVRFLmNsZWFuIG90aGVyd2lzZSBjdXJyZW50IHNhdmUgc3RhdGUgaXMgcmV0YWluZWQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gc2F2ZVN0YXRlIEV4cGVjdGVkIHRvIGJlIG9uZSBvZiBTQVZFX1NUQVRFIGNvbnN0YW50IHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IHNldFNhdmVTdGF0ZSA9ICggaW5zdGFuY2UsIHNhdmVTdGF0ZSApID0+IHtcblx0Y29uc3QgY3VycmVudFN0YXRlID0gaW5zdGFuY2VbIFBSSVZBVEVfUFJPUEVSVElFUy5TQVZFX1NUQVRFIF07XG5cdHN3aXRjaCAoIHNhdmVTdGF0ZSApIHtcblx0XHRjYXNlIFNBVkVfU1RBVEUuRElSVFk6XG5cdFx0Y2FzZSBTQVZFX1NUQVRFLk5FVzpcblx0XHRjYXNlIFNBVkVfU1RBVEUuQ0xFQU46XG5cdFx0XHRpbnN0YW5jZVsgUFJJVkFURV9QUk9QRVJUSUVTLlNBVkVfU1RBVEUgXSA9XG5cdFx0XHRcdGN1cnJlbnRTdGF0ZSA9PT0gU0FWRV9TVEFURS5DTEVBTiA/XG5cdFx0XHRcdFx0c2F2ZVN0YXRlIDpcblx0XHRcdFx0XHRjdXJyZW50U3RhdGU7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0dGhyb3cgbmV3IEludmFsaWRBcmd1bWVudChcblx0XHRcdFx0J1NhdmUgc3RhdGUgZm9yIGVudGl0eSBjYW4gb25seSBiZSBzZXQgdG8gZWl0aGVyICcgK1xuXHRcdFx0XHQnU0FWRV9TVEFURS5ESVJUWSwgU0FWRV9TVEFURS5ORVcgb3IgU0FWRV9TVEFURS5DTEVBTidcblx0XHRcdCk7XG5cdH1cbn07XG5cbi8qKlxuICogQWRkIHRoZSBmaWVsZCBuYW1lIHRvIHRoZSBmaWVsZFRvUGVyc2lzdE9uSW5zZXJ0IHByb3BlcnR5IG9uIHRoZSBpbnN0YW5jZVxuICogaWYgaXQgZXhpc3RzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZVxuICovXG5leHBvcnQgY29uc3Qgc2V0RmllbGRUb1BlcnNpc3QgPSAoIGluc3RhbmNlLCBmaWVsZE5hbWUgKSA9PiB7XG5cdGlmICggaW5zdGFuY2UuZmllbGRzVG9QZXJzaXN0T25JbnNlcnQgKSB7XG5cdFx0aW5zdGFuY2UuZmllbGRzVG9QZXJzaXN0T25JbnNlcnQuYWRkKCBmaWVsZE5hbWUgKTtcblx0fVxufTtcbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQge1xuXHRpc1BsYWluT2JqZWN0LFxuXHRjYW1lbENhc2UsXG5cdGxhc3QsXG5cdHBpY2ssXG5cdHBpY2tCeSxcblx0aXNBcnJheSxcbn0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGluc3RhbmNlT2YgfSBmcm9tICdAZXZlbnRlc3ByZXNzby92YWxpZGF0b3JzJztcblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7XG5cdE1vbmV5LFxuXHRTaXRlQ3VycmVuY3ksXG5cdFNlcnZlckRhdGVUaW1lIGFzIERhdGVUaW1lLFxufSBmcm9tICdAZXZlbnRlc3ByZXNzby92YWx1ZS1vYmplY3RzJztcblxuaW1wb3J0IHsgcGx1cmFsTW9kZWxOYW1lIH0gZnJvbSAnLi4vbW9kZWwtbmFtZXMnO1xuXG5pbXBvcnQge1xuXHRoYXNSYXdQcm9wZXJ0eSxcblx0aGFzUHJldHR5UHJvcGVydHksXG5cdGhhc1JlbmRlcmVkUHJvcGVydHksXG5cdGlzRGF0ZVRpbWVGaWVsZCxcblx0aXNNb25leUZpZWxkLFxuXHRpc1ByaW1hcnlLZXlGaWVsZCxcblx0aXNFbnRpdHlGaWVsZCxcbn0gZnJvbSAnLi9ib29sZWFucyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVR5cGVGb3JGaWVsZCB9IGZyb20gJy4vdmFsaWRhdG9ycyc7XG5pbXBvcnQgeyBWQUxJREFURV9UWVBFIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG4vKipcbiAqIFRoaXMgcmVjZWl2ZXMgYSBmaWVsZCBuYW1lLCBpdCdzIHZhbHVlIGFuZCB0aGUgc2NoZW1hIGFuZCBjb252ZXJ0cyBpdCB0byB0aGVcbiAqIHJlbGF0ZWQgdmFsdWUgb2JqZWN0IElGIHRoZSBzY2hlbWEgaW5kaWNhdGVzIGl0IGlzIG9mIGEgdHlwZSB0aGF0IHRoZXJlIGlzIGFcbiAqIGtub3duIHZhbHVlIG9iamVjdCBmb3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZVxuICogQHBhcmFtIHsqfSBmaWVsZFZhbHVlXG4gKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hXG4gKiBAcmV0dXJuIHtEYXRlVGltZXxNb25leXwqfSAgSWYgdGhpcyBpcyBub3QgYSB2YWx1ZSBvYmplY3QsIHRoZSBvcmlnaW5hbCBmaWVsZFxuICogdmFsdWUgaXMgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBtYXliZUNvbnZlcnRUb1ZhbHVlT2JqZWN0ID0gKCBmaWVsZE5hbWUsIGZpZWxkVmFsdWUsIHNjaGVtYSApID0+IHtcblx0aWYgKFxuXHRcdGlzRGF0ZVRpbWVGaWVsZCggZmllbGROYW1lLCBzY2hlbWEgKSAmJlxuXHRcdCEgRGF0ZVRpbWUudmFsaWRhdGVJc0RhdGVUaW1lKCBmaWVsZFZhbHVlIClcblx0KSB7XG5cdFx0cmV0dXJuIERhdGVUaW1lLmZyb21JU08oIGZpZWxkVmFsdWUgKTtcblx0fVxuXHRpZiAoXG5cdFx0aXNNb25leUZpZWxkKCBmaWVsZE5hbWUsIHNjaGVtYSApICYmXG5cdFx0ISAoIGluc3RhbmNlT2YoIGZpZWxkVmFsdWUsICdNb25leScgKSApXG5cdCkge1xuXHRcdHJldHVybiBuZXcgTW9uZXkoIGZpZWxkVmFsdWUsIFNpdGVDdXJyZW5jeSApO1xuXHR9XG5cdC8vIGlmIG1vcmUgVk9zIGdldCBhZGRlZCwgdGhlbiBpbnN0ZWFkIG9mIGFkZGluZyBtb3JlIGlmIGVsc2UgYmxvY2tzXG5cdC8vIHRvIHRoaXMgZnVuY3Rpb24gYW5kIHRoZSBvbmVzIGJlbG93LCBhbGwgVk8gbG9naWMgc2hvdWxkIGJlIGV4dHJhY3RlZFxuXHQvLyBpbnRvIHNvbWUga2luZCBvZiAgVmFsdWVPYmplY3RFeHRyYWN0b3Igb2JqZWN0IHRoYXQgd291bGQgaG9sZCBhbGwgb2Zcblx0Ly8gdGhlIG5lY2Vzc2FyeSBjYWxsYmFja3MgZm9yIG1hbmFnaW5nIHRoZSBkZXRlY3Rpb24gb2YgVk8gZmllbGRzIGFuZFxuXHQvLyBjb252ZXJzaW9uIG9mIGRhdGEgdG8gYW5kIGZyb20gdGhlIHZhcmlvdXMgVk9zXG5cdC8vIHBseiBzZWU6XG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ldmVudGVzcHJlc3NvL2V2ZW50LWVzcHJlc3NvLWNvcmUvcHVsbC82MzcvZmlsZXMjcjIyODY5MDc4OVxuXHRyZXR1cm4gZmllbGRWYWx1ZTtcbn07XG5cbi8qKlxuICogVGhpcyBjb252ZXJ0cyB0aGUgaW5jb21pbmcgdmFsdWUgZm9yIGEgZmllbGQgdG8gaXRzIGVxdWl2YWxlbnQgXCJyYXdcIiB2YWx1ZVxuICogZnJvbSBhIHZhbHVlIG9iamVjdCBpZiBpdCBpcyBhIHZhbHVlIG9iamVjdC4gIE90aGVyd2lzZSBpdCBqdXN0IHJldHVybnMgdGhlXG4gKiBvcmlnaW5hbCBpbmNvbWluZyB2YWx1ZS4gIFRoaXMgYWxzbyBhc3NlcnRzIHRoYXQgaWYgdGhlIHByb3ZpZGVkIGZpZWxkIGlzXG4gKiBleHBlY3RlZCB0byBiZSBhIHZhbHVlIG9iamVjdCB0aGF0IHRoZSBpbmNvbWluZyB2YWx1ZSBJUyBhIHZhbGlkIHZhbHVlIG9iamVjdFxuICogYW5kIGl0IGlzIHRoZSBleHBlY3RlZCBpbnN0YW5jZSBvZiBhIHZhbHVlIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lXG4gKiBAcGFyYW0geyp8TW9uZXl8RGF0ZVRpbWV9IGZpZWxkVmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWFcbiAqIEByZXR1cm4ge3N0cmluZ3xudW1iZXJ8Kn0gIElmIHRoZSB2YWx1ZSBpcyBub3QgYSB2YWx1ZSBvYmplY3QsIHJldHVybnMgdGhlXG4gKiBvcmlnaW5hbCB2YWx1ZVxuICovXG5leHBvcnQgY29uc3QgbWF5YmVDb252ZXJ0RnJvbVZhbHVlT2JqZWN0V2l0aEFzc2VydGlvbnMgPSAoXG5cdGZpZWxkTmFtZSxcblx0ZmllbGRWYWx1ZSxcblx0c2NoZW1hXG4pID0+IHtcblx0aWYgKCBpc0RhdGVUaW1lRmllbGQoIGZpZWxkTmFtZSwgc2NoZW1hICkgKSB7XG5cdFx0RGF0ZVRpbWUuYXNzZXJ0SXNEYXRlVGltZSggZmllbGRWYWx1ZSApO1xuXHRcdGZpZWxkVmFsdWUgPSBmaWVsZFZhbHVlLnRvSVNPKCk7XG5cdH0gZWxzZSBpZiAoIGlzTW9uZXlGaWVsZCggZmllbGROYW1lLCBzY2hlbWEgKSApIHtcblx0XHRNb25leS5hc3NlcnRNb25leSggZmllbGRWYWx1ZSApO1xuXHRcdGZpZWxkVmFsdWUgPSBmaWVsZFZhbHVlLnRvTnVtYmVyKCk7XG5cdH1cblx0cmV0dXJuIGZpZWxkVmFsdWU7XG59O1xuXG4vKipcbiAqIFRoaXMgY29udmVydHMgdGhlIGluY29taW5nIHZhbHVlIGZvciBhIGZpZWxkIHRvIGl0cyBlcXVpdmFsZW50IFwicmF3XCIgdmFsdWVcbiAqIGlmIHRoZSBpbmNvbWluZyB2YWx1ZSAgaXMgYSB2YWx1ZSBvYmplY3QuICBPdGhlcndpc2UgaXQganVzdCByZXR1cm5zIHRoZVxuICogb3JpZ2luYWwgaW5jb21pbmcgdmFsdWUuXG4gKlxuICogQHBhcmFtIHsqfERhdGVUaW1lfE1vbmV5fWZpZWxkVmFsdWVcbiAqIEByZXR1cm4geyp9IFRoZSByYXcgdmFsdWUgZm9yIHRoZSB2YWx1ZSBvYmplY3Qgb3IgdGhlIG9yaWdpbmFsIHZhbHVlLlxuICovXG5leHBvcnQgY29uc3QgbWF5YmVDb252ZXJ0RnJvbVZhbHVlT2JqZWN0ID0gKCBmaWVsZFZhbHVlICkgPT4ge1xuXHRpZiAoIERhdGVUaW1lLnZhbGlkYXRlSXNEYXRlVGltZSggZmllbGRWYWx1ZSApICkge1xuXHRcdGZpZWxkVmFsdWUgPSBmaWVsZFZhbHVlLnRvSVNPKCk7XG5cdH0gZWxzZSBpZiAoIGluc3RhbmNlT2YoIGZpZWxkVmFsdWUsICdNb25leScgKSApIHtcblx0XHRmaWVsZFZhbHVlID0gZmllbGRWYWx1ZS50b051bWJlcigpO1xuXHR9XG5cdHJldHVybiBmaWVsZFZhbHVlO1xufTtcblxuLyoqXG4gKiBUaGlzIGRlcml2ZXMgdGhlIFwicHJlcGFyZWRcIiB2YWx1ZSBmb3IgdGhlIGdpdmVuIGZpZWxkIGFuZCB2YWx1ZS5cbiAqXG4gKiBcIlByZXBhcmVkXCIgbWVhbnM6XG4gKlxuICogLSBjb252ZXJ0aW5nIHRvIGEgdmFsdWUgb2JqZWN0IGlmIHRoaXMgaXMgYSBmaWVsZCB0aGF0IHRoZXJlIGFyZSBkZWZpbmVkXG4gKiAgIHZhbHVlIG9iamVjdHMgZm9yLlxuICogLSByZXRyaWV2aW5nIHRoZSBcInJhd1wiIHZhbHVlIGZyb20gZmllbGQgdmFsdWVzIHRoYXQgaGF2ZSBgcmF3YCBhbmQgYHJlbmRlcmVkYFxuICogICBvciBgcHJldHR5YCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWVcbiAqIEBwYXJhbSB7Kn0gIGZpZWxkVmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHJldHVybiB7RGF0ZVRpbWV8TW9uZXl8Kn0gIFJldHVybnMgdGhlIG9yaWdpbmFsIGluY29taW5nIHZhbHVlIGlmIGl0IGRvZXNcbiAqIG5vdCBoYXZlIGEgcmF3IGVxdWl2YWxlbnQgb3IgaXMgbm90IGEgdmFsdWUgb2JqZWN0LlxuICovXG5leHBvcnQgY29uc3QgZGVyaXZlUHJlcGFyZWRWYWx1ZUZvckZpZWxkID0gKFxuXHRmaWVsZE5hbWUsXG5cdGZpZWxkVmFsdWUsXG5cdGluc3RhbmNlXG4pID0+IHtcblx0Y29uc3QgdmFsaWRhdGlvblR5cGUgPSB2YWxpZGF0ZVR5cGVGb3JGaWVsZCggZmllbGROYW1lLCBpbnN0YW5jZSApO1xuXHRmaWVsZFZhbHVlID0gaXNQbGFpbk9iamVjdCggZmllbGRWYWx1ZSApID9cblx0XHRmaWVsZFZhbHVlWyB2YWxpZGF0aW9uVHlwZSBdIDpcblx0XHRmaWVsZFZhbHVlO1xuXHRyZXR1cm4gbWF5YmVDb252ZXJ0VG9WYWx1ZU9iamVjdCggZmllbGROYW1lLCBmaWVsZFZhbHVlLCBpbnN0YW5jZS5zY2hlbWEgKTtcbn07XG5cbi8qKlxuICogVGhpcyByZXR1cm5zIHRoZSBcInJlbmRlcmVkXCIgb3IgXCJwcmV0dHlcIiBlcXVpdmFsZW50IGZyb20gYSB2YWx1ZSBpZiBpdCBleGlzdHNcbiAqIGFzIGEgcHJvcGVydHkgb24gaXQuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybiB7Kn0gIFRoZSBvcmlnaW5hbCB2YWx1ZSBpcyByZXR1cm5lZCBpZiBpdHMgbm90IGEgcGxhaW4gb2JqZWN0IG9yIGlmXG4gKiBpdCBoYXMgbm8gYHJlbmRlcmVkYCBvciBgcHJldHR5YCBwcm9wZXJ0eS4gIEhvd2V2ZXIsIGlmIGl0IGlzIGEgcGxhaW4gb2JqZWN0XG4gKiBhbmQgaGFzIG5vIHByZXR0eS9yZW5kZXJlZCBwcm9wZXJ0aWVzIGJ1dCBET0VTIGhhdmUgYSByYXcgcHJvcGVydHksIHRoZW4gdGhhdFxuICogaXMgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBkZXJpdmVSZW5kZXJlZFZhbHVlID0gKCB2YWx1ZSApID0+IHtcblx0aWYgKCAhIGlzUGxhaW5PYmplY3QoIHZhbHVlICkgKSB7XG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9XG5cdHZhbHVlID0gaGFzUHJldHR5UHJvcGVydHkoIHZhbHVlICkgPyB2YWx1ZS5wcmV0dHkgOiB2YWx1ZTtcblx0dmFsdWUgPSBoYXNSZW5kZXJlZFByb3BlcnR5KCB2YWx1ZSApID8gdmFsdWUucmVuZGVyZWQgOiB2YWx1ZTtcblx0cmV0dXJuIGhhc1Jhd1Byb3BlcnR5KCB2YWx1ZSApID8gdmFsdWUucmF3IDogdmFsdWU7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG5hbWUgb2YgYSByZXNvdXJjZSBmcm9tIHRoZSBnaXZlbiBgcmVzb3VyY2VMaW5rYC5cbiAqXG4gKiBlZy4gXCJodHRwczovL2FwaS5ldmVudGVzcHJlc3NvLmNvbS9yZWdpc3RyYXRpb25cIiB3aWxsIHJldHVybiAncmVnaXN0cmF0aW9uJztcblxuICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlTGlua1xuICogQHJldHVybiB7c3RyaW5nfSBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBmcm9tIGEgcHJvdmlkZWQgcmVzb3VyY2VcbiAqIGxpbmsuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRSZWxhdGlvbk5hbWVGcm9tTGluayA9ICggcmVzb3VyY2VMaW5rICkgPT4ge1xuXHRyZXR1cm4gcGx1cmFsTW9kZWxOYW1lKCBjYW1lbENhc2UoIGxhc3QoIHJlc291cmNlTGluay5zcGxpdCggJy8nICkgKSApICk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBwbGFpbiBvYmplY3QgY29udGFpbmluZyB0aGUgZW50aXR5IGZpZWxkIG5hbWVzIGFuZCB2YWx1ZXMgZnJvbSB0aGVcbiAqIHByb3ZpZGVkIGVudGl0eSBpbnN0YW5jZS4gIFRoZSB2YWx1ZXMgYXJlIG5vdCBwcmVwYXJlZCBhbmQgbWF0Y2ggZXhhY3RseSB3aGF0XG4gKiBpcyBjdXJyZW50bHkgc2V0IG9uIHRoaXMgZW50aXR5LlxuICpcbiAqIEBwYXJhbSB7QmFzZUVudGl0eX0gZW50aXR5SW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgcGxhaW4gb2JqZWN0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRCYXNlRmllbGRzQW5kVmFsdWVzRm9yQ2xvbmluZyA9ICggZW50aXR5SW5zdGFuY2UgKSA9PiB7XG5cdHJldHVybiBPYmplY3Qua2V5cyggZW50aXR5SW5zdGFuY2UgKS5yZWR1Y2UoIChcblx0XHRmaWVsZHNBbmRWYWx1ZXMsXG5cdFx0ZmllbGROYW1lXG5cdCkgPT4ge1xuXHRcdGlmIChcblx0XHRcdGlzRW50aXR5RmllbGQoIGZpZWxkTmFtZSwgZW50aXR5SW5zdGFuY2Uuc2NoZW1hICkgJiZcblx0XHRcdCEgaXNQcmltYXJ5S2V5RmllbGQoIGZpZWxkTmFtZSwgZW50aXR5SW5zdGFuY2Uuc2NoZW1hIClcblx0XHQpIHtcblx0XHRcdGZpZWxkc0FuZFZhbHVlc1sgZmllbGROYW1lIF0gPSBlbnRpdHlJbnN0YW5jZVsgZmllbGROYW1lIF07XG5cdFx0XHRyZXR1cm4gZmllbGRzQW5kVmFsdWVzO1xuXHRcdH1cblx0XHRyZXR1cm4gZmllbGRzQW5kVmFsdWVzO1xuXHR9LCB7fSApO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgcGxhaW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGVudGl0eSBmaWVsZCBuYW1lIGFuZCB2YWx1ZXMgZnJvbSB0aGVcbiAqIHByb3ZpZGVkIGVudGl0eSBpbnN0YW5jZVxuICogQHBhcmFtIHtPYmplY3R9IGVudGl0eUluc3RhbmNlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGZvckluc2VydCAgV2hldGhlciB0byByZXR1cm4gdGhlIGZpZWxkcyBhbmQgdmFsdWVzIGZvclxuICogaW5zZXJ0IG9yIGZvciB1cGRhdGUuXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgcGxhaW4gb2JqZWN0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRCYXNlRmllbGRzQW5kVmFsdWVzRm9yUGVyc2lzdGluZyA9IChcblx0ZW50aXR5SW5zdGFuY2UsXG5cdGZvckluc2VydCA9IGZhbHNlXG4pID0+IHtcblx0Y29uc3QgaXRlcmF0b3IgPSBmb3JJbnNlcnQgP1xuXHRcdEFycmF5LmZyb20oIGVudGl0eUluc3RhbmNlLmZpZWxkc1RvUGVyc2lzdE9uSW5zZXJ0LnZhbHVlcygpICkgOlxuXHRcdE9iamVjdC5rZXlzKCBlbnRpdHlJbnN0YW5jZSApO1xuXG5cdHJldHVybiBpdGVyYXRvci5yZWR1Y2UoIChcblx0XHRmaWVsZHNBbmRWYWx1ZXMsXG5cdFx0ZmllbGROYW1lXG5cdCkgPT4ge1xuXHRcdGlmIChcblx0XHRcdGlzRW50aXR5RmllbGQoIGZpZWxkTmFtZSwgZW50aXR5SW5zdGFuY2Uuc2NoZW1hICkgJiZcblx0XHRcdCEgaXNQcmltYXJ5S2V5RmllbGQoIGZpZWxkTmFtZSwgZW50aXR5SW5zdGFuY2Uuc2NoZW1hIClcblx0XHQpIHtcblx0XHRcdGZpZWxkc0FuZFZhbHVlc1sgZmllbGROYW1lIF0gPSBtYXliZUNvbnZlcnRGcm9tVmFsdWVPYmplY3QoXG5cdFx0XHRcdGVudGl0eUluc3RhbmNlWyBmaWVsZE5hbWUgXSxcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm4gZmllbGRzQW5kVmFsdWVzO1xuXHRcdH1cblx0XHRyZXR1cm4gZmllbGRzQW5kVmFsdWVzO1xuXHR9LCB7fSApO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwcmltYXJ5IGtleShzKSBhbmQgdmFsdWVzIGZvciB0aGUgZ2l2ZW4gZW50aXR5SW5zdGFuY2VcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZW50aXR5SW5zdGFuY2VcbiAqIEByZXR1cm4ge09iamVjdH0gYW4gYXJyYXkgb2YgdmFsdWVzIGZvciB0aGUgcHJpbWFyeSBrZXlzLlxuICovXG5leHBvcnQgY29uc3QgZ2V0UHJpbWFyeUtleVZhbHVlcyA9ICggZW50aXR5SW5zdGFuY2UgKSA9PiBwaWNrKFxuXHRlbnRpdHlJbnN0YW5jZSxcblx0ZW50aXR5SW5zdGFuY2UucHJpbWFyeUtleXNcbik7XG5cbi8qKlxuICogVGhpcyByZXR1cm5zIGEgcGxhaW4gb2JqZWN0IG9mIGVudGl0eSBmaWVsZHMgZnJvbSB0aGUgc2NoZW1hIGZvciB0aGUgZW50aXR5XG4gKiBpbnN0YW5jZSAoc2NoZW1hIGZvciBmaWVsZHMgYXJlIGV4dHJhY3RlZCBhcyB3ZWxsKS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZW50aXR5SW5zdGFuY2VcbiAqIEByZXR1cm4ge09iamVjdH0gQSBwbGFpbiBvYmplY3Qgd2l0aCBmaWVsZHMgYW5kIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXQgYXJlXG4gKiBlbnRpdHkgcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEVudGl0eUZpZWxkc0Zyb21TY2hlbWEgPSAoIGVudGl0eUluc3RhbmNlICkgPT4gcGlja0J5KFxuXHRlbnRpdHlJbnN0YW5jZS5zY2hlbWEsXG5cdCggZmllbGRWYWx1ZSwgZmllbGROYW1lICkgPT4gaXNFbnRpdHlGaWVsZChcblx0XHRmaWVsZE5hbWUsXG5cdFx0ZW50aXR5SW5zdGFuY2Uuc2NoZW1hXG5cdClcbik7XG5cbi8qKlxuICogVGhpcyByZXR1cm5zIGEgcGxhaW4gb2JqZWN0IG9mIGV4dHJhY3RlZCBwcmltYXJ5S2V5IGZpZWxkcyBmcm9tIHRoZSBzY2hlbWFcbiAqIGZvciB0aGUgZW50aXR5IGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBlbnRpdHlJbnN0YW5jZVxuICogQHJldHVybiB7T2JqZWN0fSBBIHBsYWluIG9iamVjdCB3aXRoIGZpZWxkcyBhbmQgc2NoZW1hIHByb3BlcnRpZXMgdGhhdFxuICogXHRcdFx0XHRcdHJlcHJlc2VudCBwcmltYXJ5IGtleSBmaWVsZHMuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRQcmltYXJ5S2V5RmllbGRzRnJvbVNjaGVtYSA9ICggZW50aXR5SW5zdGFuY2UgKSA9PiBwaWNrQnkoXG5cdGVudGl0eUluc3RhbmNlLnNjaGVtYSxcblx0KCBmaWVsZFZhbHVlLCBmaWVsZE5hbWUgKSA9PiBpc1ByaW1hcnlLZXlGaWVsZChcblx0XHRmaWVsZE5hbWUsXG5cdFx0ZW50aXR5SW5zdGFuY2Uuc2NoZW1hXG5cdClcbik7XG5cbi8qKlxuICogRGVyaXZlcyB0aGUgZGVmYXVsdCB2YWx1ZSB0byB1c2UgZm9yIGEgZ2l2ZW4gdHlwZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHJldHVybiB7Kn0gIEEgdmFsdWUgdG8gdXNlIGZvciB0aGUgZ2l2ZW4gdHlwZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGRlcml2ZURlZmF1bHRWYWx1ZUZvclR5cGUgPSAoIHR5cGUgKSA9PiB7XG5cdGlmICggaXNBcnJheSggdHlwZSApICkge1xuXHRcdHJldHVybiB0eXBlLmluZGV4T2YoICdudWxsJyApID4gLTEgP1xuXHRcdFx0bnVsbCA6XG5cdFx0XHRkZXJpdmVEZWZhdWx0VmFsdWVGb3JUeXBlKCB0eXBlWyAwIF0gKTtcblx0fVxuXHRzd2l0Y2ggKCB0eXBlICkge1xuXHRcdGNhc2UgJ3N0cmluZyc6XG5cdFx0XHRyZXR1cm4gJyc7XG5cdFx0Y2FzZSAnbnVtYmVyJzpcblx0XHRjYXNlICdpbnRlZ2VyJzpcblx0XHRcdHJldHVybiAwO1xuXHRcdGNhc2UgJ251bGwnOlxuXHRcdGNhc2UgJ29iamVjdCc6XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRjYXNlICdib29sZWFuJzpcblx0XHRjYXNlICdib29sJzpcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRjYXNlICdkYXRlLXRpbWUnOlxuXHRcdFx0cmV0dXJuICggbmV3IERhdGUoKSApLnRvSVNPU3RyaW5nKCk7XG5cdH1cblx0cmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIERlcml2ZXMgd2hhdCBgdHlwZWAgYSBmaWVsZCBpcyBmcm9tIHRoZSBzY2hlbWEuXG4gKiBJdCBhY2NvdW50cyBmb3IgY2FzZXMgd2hlcmUgdGhlIFwidHlwZVwiIG9mIGEgZmllbGQgbWlnaHQgYmUgYGRhdGUtdGltZWAgb3JcbiAqIHdoZXJlIHRoZSB0eXBlIGlzIGFuIG9iamVjdCBhbmQgdGh1cyB0aGUgYHR5cGVgIGZvciB0aGUgcHVycG9zZXMgb2YgbW9kZWxcbiAqIGVudGl0aWVzIGlzIGRlZmluZWQgYnkgdGhlIGByYXdgIHByb3BlcnR5IGZvciB0aGUgZmllbGQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZVxuICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYVxuICogQHJldHVybiB7Kn0gIFdoYXQgdHlwZSB0aGUgZmlsZWQgaXMuXG4gKi9cbmV4cG9ydCBjb25zdCBkZXJpdmVUeXBlRm9yRmllbGQgPSAoIGZpZWxkTmFtZSwgc2NoZW1hICkgPT4ge1xuXHRpZiAoIGlzRGF0ZVRpbWVGaWVsZCggZmllbGROYW1lLCBzY2hlbWEgKSApIHtcblx0XHRyZXR1cm4gJ2RhdGUtdGltZSc7XG5cdH1cblx0aWYgKCBzY2hlbWFbIGZpZWxkTmFtZSBdICYmIHNjaGVtYVsgZmllbGROYW1lIF0udHlwZSApIHtcblx0XHRpZiAoIHNjaGVtYVsgZmllbGROYW1lIF0udHlwZSA9PT0gJ29iamVjdCcgKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdHNjaGVtYVsgZmllbGROYW1lIF0ucHJvcGVydGllcyAmJlxuXHRcdFx0XHRoYXNSYXdQcm9wZXJ0eSggc2NoZW1hWyBmaWVsZE5hbWUgXS5wcm9wZXJ0aWVzIClcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gc2NoZW1hWyBmaWVsZE5hbWUgXS5wcm9wZXJ0aWVzLnJhdy50eXBlID9cblx0XHRcdFx0XHRzY2hlbWFbIGZpZWxkTmFtZSBdLnByb3BlcnRpZXMucmF3LnR5cGUgOlxuXHRcdFx0XHRcdG51bGw7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0cmV0dXJuIHNjaGVtYVsgZmllbGROYW1lIF0udHlwZTtcblx0fVxuXHRyZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogVGhpcyBkZXJpdmVzIHRoZSB2YWxpZGF0ZSB0eXBlIGZyb20gdGhlIGluY29taW5nIGZpZWxkIGFuZCB2YWx1ZSBhY2NvcmRpbmdcbiAqIHRvIHRoZSBzY2hlbWEgYW5kIGluY29taW5nIHZhbHVlLlxuICpcbiAqIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBmYWN0IHRoYXQgZW50aXRpZXMgbWF5IGJlIGNvbnN0cnVjdGVkIGZyb20gdGhlXG4gKiBmb2xsb3dpbmcgY29udGV4dHM6XG4gKlxuICogMS4gQXV0aGVkIFJFU1QgcmVzcG9uc2UgKHdoaWNoIGNvdWxkIGhhdmUgYm90aCByYXcsIHJlbmRlcmVkIG9yIHByZXR0eVxuICogICAgdmFsdWVzIGluIHRoZSBmaWVsZCB2YWx1ZSkuXG4gKiAyLiBOb24tYXV0aGVkIFJFU1QgcmVzcG9uc2UgKHdoaWNoIHdpbGwgbm90IGhhdmUgYSByYXcgdmFsdWUsIGJ1dCBjb3VsZCBoYXZlXG4gKiAgICBhIHByZXR0eSBvciByZW5kZXJlZCB2YWx1ZSkuICBUaGlzIGlzIHBvdGVudGlhbGx5IHByb2JsZW1hdGljIGlmIHRoZVxuICogICAgcmVuZGVyZWQgb3IgcHJldHR5IHZhbHVlIGlzIG9mIGEgZGlmZmVyZW50IGRhdGEgdHlwZSB0aGFuIHRoZSByYXcgdmFsdWUuXG4gKiAzLiBOZXcgZW50aXRpZXMgYnVpbHQgY2xpZW50IHNpZGUsIHdoaWNoIHdpbGwgYmUgYXNzdW1lZCB0byBiZSBwcmVwYXJlZFxuICogICAgYWdhaW5zdCB0aGUgXCJyYXdcIiB2YWxpZGF0ZSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWVcbiAqIEBwYXJhbSB7Kn0gZmllbGRWYWx1ZVxuICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYVxuICogQHJldHVybiB7U3ltYm9sfSAgVGhlIHZhbGlkYXRlIHR5cGUgZm9yIHRoZSBmaWVsZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGRlcml2ZVZhbGlkYXRlVHlwZUZvckZpZWxkID0gKCBmaWVsZE5hbWUsIGZpZWxkVmFsdWUsIHNjaGVtYSApID0+IHtcblx0aWYgKCBoYXNSYXdQcm9wZXJ0eSggZmllbGRWYWx1ZSApICkge1xuXHRcdHJldHVybiBWQUxJREFURV9UWVBFLlJBVztcblx0fVxuXHRpZiAoIHNjaGVtYVsgZmllbGROYW1lIF0gJiYgc2NoZW1hWyBmaWVsZE5hbWUgXS50eXBlICkge1xuXHRcdGlmIChcblx0XHRcdHNjaGVtYVsgZmllbGROYW1lIF0udHlwZSA9PT0gJ29iamVjdCcgJiZcblx0XHRcdGlzUGxhaW5PYmplY3QoIGZpZWxkVmFsdWUgKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIGhhc1JlbmRlcmVkUHJvcGVydHkoIGZpZWxkVmFsdWUgKSA/XG5cdFx0XHRcdFZBTElEQVRFX1RZUEUuUkVOREVSRUQgOlxuXHRcdFx0XHRWQUxJREFURV9UWVBFLlBSRVRUWTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIFZBTElEQVRFX1RZUEUuUkFXO1xufTtcblxuLyoqXG4gKiBUaGlzIGdldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGEgZmllbGQgZnJvbSB0aGUgcHJvdmlkZWQgc2NoZW1hLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWFcbiAqIEByZXR1cm4geyp9IFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgZmllbGQgZnJvbSB0aGUgc2NoZW1hIG9yIGlmIG5vdFxuICogcHJlc2VudCBpbiB0aGUgc2NoZW1hLCBhIGRlcml2ZWQgZGVmYXVsdCB2YWx1ZSBmcm9tIHRoZSBzY2hlbWEgdHlwZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldERlZmF1bHRWYWx1ZUZvckZpZWxkID0gKCBmaWVsZE5hbWUsIHNjaGVtYSApID0+IHtcblx0aWYgKCBzY2hlbWFbIGZpZWxkTmFtZSBdICkge1xuXHRcdHJldHVybiBzY2hlbWFbIGZpZWxkTmFtZSBdLmRlZmF1bHQgP1xuXHRcdFx0c2NoZW1hWyBmaWVsZE5hbWUgXS5kZWZhdWx0IDpcblx0XHRcdGRlcml2ZURlZmF1bHRWYWx1ZUZvclR5cGUoIHNjaGVtYVsgZmllbGROYW1lIF0udHlwZSApO1xuXHR9XG5cdHJldHVybiBudWxsO1xufTtcbiIsImV4cG9ydCB7IGRlZmF1bHQgYXMgY3JlYXRlRW50aXR5RmFjdG9yeSB9IGZyb20gJy4vYmFzZS1lbnRpdHknO1xuZXhwb3J0IHsgTU9ERUxfUFJFRklYRVMsIFNBVkVfU1RBVEUgfSBmcm9tICcuL2NvbnN0YW50cyc7XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHtcblx0aXNBcnJheSxcblx0aXNJbnRlZ2VyLFxuXHRpc1N0cmluZyxcblx0aXNQbGFpbk9iamVjdCxcblx0aXNCb29sZWFuLFxuXHRpc051bWJlcixcbn0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHNwcmludGYgfSBmcm9tICdAZXZlbnRlc3ByZXNzby9pMThuJztcblxuLyoqXG4gKiBJbnRlcm5hbCBJbXBvcnRzXG4gKi9cbmltcG9ydCB7IGlzRW51bUZpZWxkLCBpc1ByaW1hcnlLZXlGaWVsZCwgaXNWYWx1ZU9iamVjdEZpZWxkIH0gZnJvbSAnLi9ib29sZWFucyc7XG5pbXBvcnQgeyBtYXliZUNvbnZlcnRGcm9tVmFsdWVPYmplY3RXaXRoQXNzZXJ0aW9ucyB9IGZyb20gJy4vZXh0cmFjdG9ycyc7XG5pbXBvcnQgeyBQUklWQVRFX1BST1BFUlRJRVMsIFZBTElEQVRFX1RZUEUgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSBpbmNvbWluZyB2YWx1ZSBmb3IgZ2l2ZW4gdHlwZS4gIFR5cGVzIGFsbG93ZWQgYXJlOlxuICpcbiAqIC0gaW50ZWdlcjogY2hlY2tzIGlmIHZhbHVlIGlzIGFuIGludGVnZXIuXG4gKiAtIG51bWJlcjogY2hlY2tzIGlmIHZhbHVlIGlzIGNsYXNzaWZpZWQgYXMgYSBOdW1iZXIgcHJpbWl0aXZlIG9yIG9iamVjdCAodGhpc1xuICogICBtZWFucyBgSW5maW5pdHlgLCBgLUluZmluaXR5YCwgYW5kIGBOYU5gIGFyZSBjb25zaWRlcmVkIHZhbGlkIGZvciB0aGlzIHR5cGVcbiAqIC0gc3RyaW5nXG4gKiAtIG9iamVjdCAtIHRoaXMgdmFsaWRhdGVzIGFzIGEgXCJwbGFpbk9iamVjdFwiLCB0aGF0IGlzIGFuIG9iamVjdCBjcmVhdGVkIGJ5XG4gKiAgIHRoZSBPYmplY3QgY29uc3RydWN0b3Igb3Igb25lIHdpdGggYSBbW1Byb3RvdHlwZV1dIG9mIG51bGwuXG4gKiAtIGJvb2xlYW5cbiAqIC0gYm9vbDogKHNhbWUgYXMgYm9vbGVhbiBjaGVjaylcbiAqIC0gbnVsbDogdmFsdWUgbXVzdCBleHBsaWNpdGx5IGJlIGBudWxsYFxuICpcbiAqIE5vdGU6IGlmIHRoZSBwYXNzZWQgaW4gdHlwZSBkb2VzIG5vdCBleGlzdCwgdGhlbiB0aGUgdmFsdWUgaXMgY29uc2lkZXJlZFxuICogaW52YWxpZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xBcnJheX0gdHlwZSAgVGhlIHR5cGUgb3IgdHlwZXMgdG8gY2hlY2tcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgIFRoZSB2YWx1ZSBiZWluZyB2YWxpZGF0ZWRcbiAqIEByZXR1cm4ge2Jvb2xlYW59ICBUcnVlIG1lYW5zIHRoZSB2YWx1ZSBpcyB2YWxpZCBmb3IgdGhlIGdpdmVuIHR5cGUuXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVR5cGUgPSAoIHR5cGUsIHZhbHVlICkgPT4ge1xuXHRsZXQgdmFsaWQgPSBmYWxzZTtcblx0Ly8gYWNjb3VudCBmb3IgdHlwZSBkZWZpbml0aW9ucyB0aGF0IGFyZSBhbiBhcnJheSBvZiBhbGxvd2VkIHR5cGVzLlxuXHRpZiAoIGlzQXJyYXkoIHR5cGUgKSApIHtcblx0XHRmb3IgKCBjb25zdCBzaW5nbGVUeXBlIG9mIHR5cGUgKSB7XG5cdFx0XHR2YWxpZCA9IHZhbGlkYXRlVHlwZSggc2luZ2xlVHlwZSwgdmFsdWUgKTtcblx0XHRcdGlmICggdmFsaWQgKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyByZXR1cm4gcmlnaHQgYXdheSBiZWNhdXNlIHdlJ3ZlIGRldGVybWluZWQgdGhlIHZhbGlkaXR5IG9mIHRoZSB0eXBlLlxuXHRcdHJldHVybiB2YWxpZDtcblx0fVxuXHRzd2l0Y2ggKCB0eXBlICkge1xuXHRcdGNhc2UgJ2ludGVnZXInOlxuXHRcdFx0dmFsaWQgPSBpc0ludGVnZXIoIHZhbHVlICk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdudW1iZXInOlxuXHRcdFx0dmFsaWQgPSBpc051bWJlciggdmFsdWUgKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ3N0cmluZyc6XG5cdFx0XHR2YWxpZCA9IGlzU3RyaW5nKCB2YWx1ZSApO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnb2JqZWN0Jzpcblx0XHRcdHZhbGlkID0gaXNQbGFpbk9iamVjdCggdmFsdWUgKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ2Jvb2xlYW4nOlxuXHRcdGNhc2UgJ2Jvb2wnOlxuXHRcdFx0dmFsaWQgPSBpc0Jvb2xlYW4oIHZhbHVlICk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdudWxsJzpcblx0XHRcdHZhbGlkID0gdmFsdWUgPT09IG51bGw7XG5cdFx0XHRicmVhaztcblx0fVxuXHRyZXR1cm4gdmFsaWQ7XG59O1xuXG4vKipcbiAqIFRoaXMgdmFsaWRhdGVzIGVudW0gdHlwZSBvZiB2YWx1ZXMuXG4gKlxuICogVGhpcyBtZWFucyB0aGF0IHRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgcHJvdmlkZWQgYXJyYXkgb2YgZW51bVZhbHVlcyBhc1xuICogd2VsbCBhcyBiZWluZyBvZiB0aGUgZXhwZWN0ZWQgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtBcnJheX0gZW51bVZhbHVlc1xuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybiB7Ym9vbGVhbn0gIFRydWUgbWVhbnMgdGhpcyB2YWx1ZSBpcyB2YWxpZC5cbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlRW51bVR5cGUgPSAoIHR5cGUsIGVudW1WYWx1ZXMsIHZhbHVlICkgPT4ge1xuXHRyZXR1cm4gdmFsaWRhdGVUeXBlKCB0eXBlLCB2YWx1ZSApICYmXG5cdFx0aXNBcnJheSggZW51bVZhbHVlcyApICYmXG5cdFx0ZW51bVZhbHVlcy5pbmRleE9mKCB2YWx1ZSApID4gLTE7XG59O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGRvZXMgYSBzaGFsbG93IHZhbGlkYXRpb24gZm9yIHRoZSBnaXZlbiB2YWx1ZSBhbmQgZmllbGQuXG4gKlxuICogXCJTaGFsbG93XCIgaGVyZSBtZWFucyB0aGF0IGlmIHRoZSBmaWVsZCBzY2hlbWEgaXMgb2YgdHlwZSAnb2JqZWN0JywgdGhlbiB0aGVcbiAqIHZhbGlkYXRpb24gb25seSB2ZXJpZmllcyB0aGF0IHRoZSB2YWx1ZSBpcyBhbiBvYmplY3QuICBUaGUgb2JqZWN0IGNvbnRlbnRzXG4gKiBhcmUgbm90IHZhbGlkYXRlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lXG4gKiBAcGFyYW0geyp9IGZpZWxkVmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWFcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZXhwZWN0VmFsdWVPYmplY3RzICBJZiB0cnVlLCB0aGVuIHRoaXMgZmxhZ3MgdGhlIHZhbGlkYXRvclxuICogdG8gYXNzdW1lIHRoZSB2YWx1ZSBtaWdodCBiZSBhIHZhbHVlIG9iamVjdCBhbmQgYXR0ZW1wdCB0byByZXRyaWV2ZSB0aGUgcmF3XG4gKiB2YWx1ZSBmcm9tIHRoYXQgdmFsdWUgb2JqZWN0IGZvciB2YWxpZGF0aW9uIGFnYWluc3QgdGhlIGV4cGVjdGVkIHR5cGUgaW4gdGhlXG4gKiBzY2hlbWEgZm9yIHRoYXQgZmllbGQuXG4gKiBAcmV0dXJuIHtib29sZWFufSAgVHJ1ZSBtZWFucyB0aGUgdmFsdWUgaXMgdmFsaWQuXG4gKiBAdGhyb3dzIFR5cGVFcnJvclxuICogQHRocm93cyBJbnZhbGlkRGF0ZVRpbWVcbiAqL1xuZXhwb3J0IGNvbnN0IGlzU2hhbGxvd1ZhbGlkVmFsdWVGb3JGaWVsZCA9IChcblx0ZmllbGROYW1lLFxuXHRmaWVsZFZhbHVlLFxuXHRzY2hlbWEsXG5cdGV4cGVjdFZhbHVlT2JqZWN0cyA9IHRydWVcbikgPT4ge1xuXHQvLyBpZiBmaWVsZCBpcyBhIHByaW1hcnkgS2V5IGZpZWxkIHRoZW4gd2Ugb3ZlcnJpZGUgdGhlIHZhbGlkYXRpb24gc28gaXQgY2FuXG5cdC8vIGJlIGVpdGhlciBzdHJpbmcgb3IgbnVtYmVyXG5cdGlmICggaXNQcmltYXJ5S2V5RmllbGQoIGZpZWxkTmFtZSwgc2NoZW1hICkgKSB7XG5cdFx0cmV0dXJuIHZhbGlkYXRlVHlwZSggJ3N0cmluZycsIGZpZWxkVmFsdWUgKSB8fFxuXHRcdFx0dmFsaWRhdGVUeXBlKCAnbnVtYmVyJywgZmllbGRWYWx1ZSApO1xuXHR9XG5cdGNvbnN0IGlzRW51bSA9IGlzRW51bUZpZWxkKCBmaWVsZE5hbWUsIHNjaGVtYSApO1xuXHRjb25zdCBpc1ZhbHVlT2JqZWN0ID0gaXNWYWx1ZU9iamVjdEZpZWxkKCBmaWVsZE5hbWUsIHNjaGVtYSApO1xuXHRmaWVsZFZhbHVlID0gZXhwZWN0VmFsdWVPYmplY3RzICYmIGlzVmFsdWVPYmplY3QgP1xuXHRcdG1heWJlQ29udmVydEZyb21WYWx1ZU9iamVjdFdpdGhBc3NlcnRpb25zKFxuXHRcdFx0ZmllbGROYW1lLFxuXHRcdFx0ZmllbGRWYWx1ZSxcblx0XHRcdHNjaGVtYVxuXHRcdCkgOlxuXHRcdGZpZWxkVmFsdWU7XG5cdGZpZWxkVmFsdWUgPSBleHBlY3RWYWx1ZU9iamVjdHMgJiZcblx0XHRcdHNjaGVtYVsgZmllbGROYW1lIF0udHlwZSA9PT0gJ29iamVjdCcgJiZcblx0XHRcdGlzVmFsdWVPYmplY3QgP1xuXHRcdHsgcmF3OiBmaWVsZFZhbHVlIH0gOlxuXHRcdGZpZWxkVmFsdWU7XG5cdGNvbnN0IGlzVmFsaWQgPSBpc0VudW0gP1xuXHRcdHZhbGlkYXRlRW51bVR5cGUoXG5cdFx0XHRzY2hlbWFbIGZpZWxkTmFtZSBdLnR5cGUsXG5cdFx0XHRzY2hlbWFbIGZpZWxkTmFtZSBdLmVudW0sXG5cdFx0XHRmaWVsZFZhbHVlXG5cdFx0KSA6XG5cdFx0dmFsaWRhdGVUeXBlKCBzY2hlbWFbIGZpZWxkTmFtZSBdLnR5cGUsIGZpZWxkVmFsdWUgKTtcblx0Ly8gaWYgaXNFbnVtIGFuZCBub3QgdmFsaWQsIHRoZW4gbGV0cyBiYWlsIHdpdGggZXJyb3Jcblx0aWYgKCBpc0VudW0gJiYgISBpc1ZhbGlkICkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXG5cdFx0XHRzcHJpbnRmKFxuXHRcdFx0XHQnVGhlIGdpdmVuIFwiJXNcIiBmaWVsZE5hbWUgaXMgbm90IHZhbGlkIGZvciB0aGUgZGVmaW5lZCAnICtcblx0XHRcdFx0J3NjaGVtYS4gIEl0IG11c3QgYmUgYSBcIiVzXCIgYW5kIGl0IG11c3QgYmUgb25lIG9mIFwiJXNcIi4gJyArXG5cdFx0XHRcdCdUaGUgZmllbGRWYWx1ZSBnaXZlbiB3YXMgXCIlc1wiJyxcblx0XHRcdFx0ZmllbGROYW1lLFxuXHRcdFx0XHRzY2hlbWFbIGZpZWxkTmFtZSBdLmVudW0uam9pbigpLFxuXHRcdFx0XHRmaWVsZFZhbHVlXG5cdFx0XHQpXG5cdFx0KTtcblx0fVxuXHRyZXR1cm4gaXNWYWxpZDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB3aGF0IGlzIHNldCBhcyB0aGUgdmFsaWRhdGVUeXBlIGZvciB0aGUgZ2l2ZW4gZmllbGQgYW5kIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgdmFsaWRhdGlvbiB0eXBlIGZvciB0aGUgZ2l2ZW4gZmllbGQgYW5kIGluc3RhbmNlLlxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVUeXBlRm9yRmllbGQgPSAoIGZpZWxkTmFtZSwgaW5zdGFuY2UgKSA9PiB7XG5cdHJldHVybiBpbnN0YW5jZVsgUFJJVkFURV9QUk9QRVJUSUVTLlZBTElEQVRFX1RZUEVTIF1bIGZpZWxkTmFtZSBdID9cblx0XHRpbnN0YW5jZVsgUFJJVkFURV9QUk9QRVJUSUVTLlZBTElEQVRFX1RZUEVTIF1bIGZpZWxkTmFtZSBdIDpcblx0XHRWQUxJREFURV9UWVBFLlJBVztcbn07XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgdmFsdWVzIH0gZnJvbSAnbG9kYXNoJztcblxuZXhwb3J0IGNvbnN0IE1PREVMX05BTUUgPSAnZXZlbnQnO1xuXG5leHBvcnQgY29uc3QgRVZFTlRfU1RBVFVTX0lEID0ge1xuXHRTT0xEX09VVDogJ3NvbGRfb3V0Jyxcblx0UE9TVFBPTkVEOiAncG9zdHBvbmVkJyxcblx0Q0FOQ0VMTEVEOiAnY2FuY2VsbGVkJyxcbn07XG5cbmV4cG9ydCBjb25zdCBFVkVOVF9TVEFUVVNfSURTID0gdmFsdWVzKCBFVkVOVF9TVEFUVVNfSUQgKTtcbiIsImV4cG9ydCAqIGZyb20gJy4vY29uc3RhbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vcXVlcnknO1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqL1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQtdGltZXpvbmUnO1xuaW1wb3J0IHsgaXNVbmRlZmluZWQgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7XG5cdGdldFF1ZXJ5U3RyaW5nIGFzIGJhc2VHZXRRdWVyeVN0cmluZyxcblx0UVVFUllfT1JERVJfREVTQyxcblx0QUxMT1dFRF9PUkRFUl9WQUxVRVMsXG5cdEdSRUFURVJfVEhBTixcblx0R1JFQVRFUl9USEFOX0FORF9FUVVBTCxcblx0TEVTU19USEFOX0FORF9FUVVBTCxcbn0gZnJvbSAnLi4vYmFzZSc7XG5cbmV4cG9ydCBjb25zdCBub3dEYXRlQW5kVGltZSA9IG1vbWVudCgpO1xuXG4vKipcbiAqIERlc2NyaWJlZCBhdHRyaWJ1dGVzIGZvciB0aGlzIG1vZGVsXG4gKiBAdHlwZSB7e2F0dHJpYnV0ZXM6ICp9fVxuICovXG5leHBvcnQgY29uc3QgcXVlcnlEYXRhVHlwZXMgPSB7XG5cdHF1ZXJ5RGF0YTogUHJvcFR5cGVzLnNoYXBlKCB7XG5cdFx0bGltaXQ6IFByb3BUeXBlcy5udW1iZXIsXG5cdFx0b3JkZXJCeTogUHJvcFR5cGVzLm9uZU9mKCBbXG5cdFx0XHQnRVZUX25hbWUnLFxuXHRcdFx0J0VWVF9JRCcsXG5cdFx0XHQnc3RhcnRfZGF0ZScsXG5cdFx0XHQnZW5kX2RhdGUnLFxuXHRcdFx0J3RpY2tldF9zdGFydCcsXG5cdFx0XHQndGlja2V0X2VuZCcsXG5cdFx0XSApLFxuXHRcdG9yZGVyOiBQcm9wVHlwZXMub25lT2YoIEFMTE9XRURfT1JERVJfVkFMVUVTICksXG5cdFx0c2hvd0V4cGlyZWQ6IFByb3BUeXBlcy5ib29sLFxuXHRcdGNhdGVnb3J5U2x1ZzogUHJvcFR5cGVzLnN0cmluZyxcblx0XHRtb250aDogUHJvcFR5cGVzLm1vbnRoLFxuXHR9ICksXG59O1xuXG4vKipcbiAqIERlZmF1bHQgYXR0cmlidXRlcyBmb3IgdGhpcyBtb2RlbFxuICogQHR5cGUge1xuICogXHR7XG4gKiBcdFx0YXR0cmlidXRlczoge1xuICogXHRcdFx0bGltaXQ6IG51bWJlcixcbiAqIFx0XHRcdG9yZGVyQnk6IHN0cmluZyxcbiAqIFx0XHRcdG9yZGVyOiBzdHJpbmcsXG4gKiAgIFx0XHRzaG93RXhwaXJlZDogYm9vbGVhblxuICogICBcdH1cbiAqICAgfVxuICogfVxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdFF1ZXJ5RGF0YSA9IHtcblx0cXVlcnlEYXRhOiB7XG5cdFx0bGltaXQ6IDEwMCxcblx0XHRvcmRlckJ5OiAnc3RhcnRfZGF0ZScsXG5cdFx0b3JkZXI6IFFVRVJZX09SREVSX0RFU0MsXG5cdFx0c2hvd0V4cGlyZWQ6IGZhbHNlLFxuXHR9LFxufTtcblxuLyoqXG4gKiBVc2VkIHRvIG1hcCBhbiBvcmRlckJ5IHN0cmluZyB0byB0aGUgYWN0dWFsIHZhbHVlIHVzZWQgaW4gYSBSRVNUIHF1ZXJ5IGZyb21cbiAqIHRoZSBjb250ZXh0IG9mIGFuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcmRlckJ5XG4gKlxuICogQHJldHVybiB7IHN0cmluZyB9IFJldHVybnMgYW4gYWN0dWFsIG9yZGVyQnkgc3RyaW5nIGZvciB0aGUgUkVTVCBxdWVyeSBmb3JcbiAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm92aWRlZCBhbGlhc1xuICovXG5leHBvcnQgY29uc3QgbWFwT3JkZXJCeSA9ICggb3JkZXJCeSApID0+IHtcblx0Y29uc3Qgb3JkZXJCeU1hcCA9IHtcblx0XHRzdGFydF9kYXRlOiAnRGF0ZXRpbWUuRFRUX0VWVF9zdGFydCcsXG5cdFx0ZW5kX2RhdGU6ICdEYXRldGltZS5EVFRfRVZUX2VuZCcsXG5cdFx0dGlja2V0X3N0YXJ0OiAnRGF0ZXRpbWUuVGlja2V0LlRLVF9zdGFydF9kYXRlJyxcblx0XHR0aWNrZXRfZW5kOiAnRGF0ZXRpbWUuVGlja2V0LlRLVF9lbmRfZGF0ZScsXG5cdH07XG5cdHJldHVybiBpc1VuZGVmaW5lZCggb3JkZXJCeU1hcFsgb3JkZXJCeSBdICkgP1xuXHRcdG9yZGVyQnkgOlxuXHRcdG9yZGVyQnlNYXBbIG9yZGVyQnkgXTtcbn07XG5cbi8qKlxuICogQnVpbGRzIHdoZXJlIGNvbmRpdGlvbnMgZm9yIGFuIGV2ZW50cyBlbmRwb2ludCByZXF1ZXN0IHVzaW5nIHByb3ZpZGVkXG4gKiBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNob3dFeHBpcmVkICBXaGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIGV4cGlyZWQgZXZlbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IGNhdGVnb3J5U2x1ZyAgUmV0dXJuIGV2ZW50cyBmb3IgdGhlIGdpdmVuIGNhdGVnb3J5U2x1Z1xuICogQHBhcmFtIHtzdHJpbmd9IG1vbnRoICAgICAgICAgUmV0dXJuIGV2ZW50cyBmb3IgdGhlIGdpdmVuIG1vbnRoLlxuICogXHRcdFx0XHRcdFx0XHRcdCBDYW4gYmUgYW55IG1vbnRoIGZvcm1hdCByZWNvZ25pemVkIGJ5IG1vbWVudC5cbiAqIEByZXR1cm4ge3N0cmluZ30gICAgICAgICAgICAgIFRoZSBhc3NlbWJsZWQgd2hlcmUgY29uZGl0aW9ucy5cbiAqL1xuZXhwb3J0IGNvbnN0IHdoZXJlQ29uZGl0aW9ucyA9ICgge1xuXHRzaG93RXhwaXJlZCA9IGZhbHNlLFxuXHRjYXRlZ29yeVNsdWcsXG5cdG1vbnRoID0gJ25vbmUnLFxufSApID0+IHtcblx0Y29uc3Qgd2hlcmUgPSBbXTtcblxuXHRpZiAoICEgc2hvd0V4cGlyZWQgKSB7XG5cdFx0d2hlcmUucHVzaChcblx0XHRcdCd3aGVyZVtEYXRldGltZS5EVFRfRVZUX2VuZCoqZXhwaXJlZF1bXT0nICsgR1JFQVRFUl9USEFOICtcblx0XHRcdCcmd2hlcmVbRGF0ZXRpbWUuRFRUX0VWVF9lbmQqKmV4cGlyZWRdW109JyArXG5cdFx0XHRub3dEYXRlQW5kVGltZS5sb2NhbCgpLmZvcm1hdCgpXG5cdFx0KTtcblx0fVxuXHRpZiAoIGNhdGVnb3J5U2x1ZyApIHtcblx0XHR3aGVyZS5wdXNoKFxuXHRcdFx0J3doZXJlW1Rlcm1fUmVsYXRpb25zaGlwLlRlcm1fVGF4b25vbXkuVGVybS5zbHVnXT0nICsgY2F0ZWdvcnlTbHVnXG5cdFx0KTtcblx0fVxuXHRpZiAoIG1vbnRoICYmIG1vbnRoICE9PSAnbm9uZScgKSB7XG5cdFx0d2hlcmUucHVzaChcblx0XHRcdCd3aGVyZVtEYXRldGltZS5EVFRfRVZUX3N0YXJ0XVtdPScgKyBHUkVBVEVSX1RIQU5fQU5EX0VRVUFMICtcblx0XHRcdCcmd2hlcmVbRGF0ZXRpbWUuRFRUX0VWVF9zdGFydF1bXT0nICtcblx0XHRcdG1vbWVudCgpLm1vbnRoKCBtb250aCApLnN0YXJ0T2YoICdtb250aCcgKS5sb2NhbCgpLmZvcm1hdCgpXG5cdFx0KTtcblx0XHR3aGVyZS5wdXNoKFxuXHRcdFx0J3doZXJlW0RhdGV0aW1lLkRUVF9FVlRfZW5kXVtdPScgKyBMRVNTX1RIQU5fQU5EX0VRVUFMICtcblx0XHRcdCcmd2hlcmVbRGF0ZXRpbWUuRFRUX0VWVF9lbmRdW109JyArXG5cdFx0XHRtb21lbnQoKS5tb250aCggbW9udGggKS5lbmRPZiggJ21vbnRoJyApLmxvY2FsKCkuZm9ybWF0KClcblx0XHQpO1xuXHR9XG5cdHJldHVybiB3aGVyZS5qb2luKCAnJicgKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIGEgcXVlcnkgc3RyaW5nIGZvciB1c2UgYnkgYSBSRVNUIHJlcXVlc3QgZ2l2ZW4gYSBzZXQgb2YgcXVlcnlEYXRhLlxuICogQHBhcmFtIHsgT2JqZWN0IH0gcXVlcnlEYXRhXG4gKiBAcmV0dXJuIHsgc3RyaW5nIH0gIFJldHVybnMgdGhlIHF1ZXJ5IHN0cmluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFF1ZXJ5U3RyaW5nID0gKCBxdWVyeURhdGEgPSB7fSApID0+IHtcblx0cXVlcnlEYXRhID0geyAuLi5kZWZhdWx0UXVlcnlEYXRhLnF1ZXJ5RGF0YSwgLi4ucXVlcnlEYXRhIH07XG5cdHJldHVybiBiYXNlR2V0UXVlcnlTdHJpbmcoIHF1ZXJ5RGF0YSwgd2hlcmVDb25kaXRpb25zLCBtYXBPcmRlckJ5ICk7XG59O1xuIiwiZXhwb3J0ICogZnJvbSAnLi9kZWZhdWx0LW1vZGVsLXN0YXRlJztcbmV4cG9ydCAqIGZyb20gJy4vZW5kcG9pbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vcHJpbWFyeS1rZXlzJztcbmV4cG9ydCAqIGZyb20gJy4vYXNzZXJ0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL21vZGVsLW5hbWVzJztcbmV4cG9ydCAqIGZyb20gJy4vYmFzZSc7XG5leHBvcnQgKiBmcm9tICcuL21vZGVscyc7XG5leHBvcnQgKiBmcm9tICcuL2VudGl0eS1mYWN0b3J5JztcbiIsIi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBwcmltYXJ5S2V5cyB9IGZyb20gJy4vcHJpbWFyeS1rZXlzLmpzJztcblxuLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IGtleXMgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBsdXJhbGl6ZSBmcm9tICdwbHVyYWxpemUnO1xuaW1wb3J0IG1lbW9pemUgZnJvbSAnbWVtaXplJztcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIG1vZGVsIG5hbWVzIGN1cnJlbnRseSBleHBvc2VkIGZvciBSRVNUIEFQSSByZXF1ZXN0LlxuICovXG5leHBvcnQgY29uc3QgTU9ERUxfTkFNRVMgPSBrZXlzKCBwcmltYXJ5S2V5cyApO1xuXG4vKipcbiAqIFVzZWQgdG8gbm9ybWFsaXplIHRoZSBwbHVyYWwgZm9ybSBvZiBhIGdpdmVuIG1vZGVsIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICBFbnN1cmVzIHRoZSBnaXZlbiBtb2RlbE5hbWUgaXMgaXRzIHBsdXJhbCBmb3JtLlxuICovXG5leHBvcnQgY29uc3QgcGx1cmFsTW9kZWxOYW1lID0gbWVtb2l6ZShcblx0KCBtb2RlbE5hbWUgKSA9PiBwbHVyYWxpemUoIG1vZGVsTmFtZSApXG4pO1xuXG4vKipcbiAqIFVzZWQgdG8gbm9ybWFsaXplIHRoZSBzaW5ndWxhciBmb3JtIG9mIGEgZ2l2ZW4gbW9kZWwgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEByZXR1cm4ge3N0cmluZ30gRW5zdXJlcyB0aGUgZ2l2ZW4gbW9kZWxOYW1lIGlzIGluIGl0cyBzaW5ndWxhciBmb3JtLlxuICovXG5leHBvcnQgY29uc3Qgc2luZ3VsYXJNb2RlbE5hbWUgPSBtZW1vaXplKFxuXHQoIG1vZGVsTmFtZSApID0+IHBsdXJhbGl6ZS5zaW5ndWxhciggbW9kZWxOYW1lIClcbik7XG4iLCJpbXBvcnQgKiBhcyBkYXRlVGltZU1vZGVsIGZyb20gJy4vZGF0ZXRpbWUnO1xuaW1wb3J0ICogYXMgZXZlbnRNb2RlbCBmcm9tICcuL2V2ZW50JztcbmltcG9ydCAqIGFzIHJlZ2lzdHJhdGlvbk1vZGVsIGZyb20gJy4vcmVnaXN0cmF0aW9uJztcbmltcG9ydCAqIGFzIHN0YXR1c01vZGVsIGZyb20gJy4vc3RhdHVzJztcbmltcG9ydCAqIGFzIHRpY2tldE1vZGVsIGZyb20gJy4vdGlja2V0JztcbmltcG9ydCAqIGFzIGNoZWNrSW5Nb2RlbCBmcm9tICcuL2NoZWNraW4nO1xuaW1wb3J0ICogYXMgYXR0ZW5kZWVNb2RlbCBmcm9tICcuL2F0dGVuZGVlJztcbmV4cG9ydCB7XG5cdGNoZWNrSW5Nb2RlbCxcblx0ZGF0ZVRpbWVNb2RlbCxcblx0ZXZlbnRNb2RlbCxcblx0cmVnaXN0cmF0aW9uTW9kZWwsXG5cdHN0YXR1c01vZGVsLFxuXHR0aWNrZXRNb2RlbCxcblx0YXR0ZW5kZWVNb2RlbCxcbn07XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgZGF0YSB9IGZyb20gJ0BldmVudGVzcHJlc3NvL2VlanMnO1xuaW1wb3J0IHsgX18gfSBmcm9tICdAZXZlbnRlc3ByZXNzby9pMThuJztcbmltcG9ydCB7IGlzQXJyYXksIHJlZHVjZSwgdHJpbUVuZCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbWVtb2l6ZSBmcm9tICdtZW1pemUnO1xuXG4vKipcbiAqIEludGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHtcblx0YXNzZXJ0RW50aXR5SGFzS2V5LFxuXHRhc3NlcnRJc0FycmF5LFxuXHRhc3NlcnRJc05vdEVtcHR5LFxuXHRhc3NlcnRJc01hcCxcbn0gZnJvbSAnLi9hc3NlcnRpb25zJztcblxuLyoqXG4gKiBFeHBvc2VzIGEgbWFwIG9mIG1vZGVsbmFtZSB0byBwcmltYXJ5IGtleSBleHBvc2VkIGJ5IHRoZSBlZWpzLmRhdGEgZ2xvYmFsXG4gKiB2aWEgdGhlIHNlcnZlci5cbiAqXG4gKiBAdHlwZSB7e319XG4gKi9cbmV4cG9ydCBjb25zdCB7IHByaW1hcnlfa2V5czogcHJpbWFyeUtleXMgPSB7fSB9ID0gZGF0YS5wYXRocztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBrZXlzIGZyb20gdGhlIHByb3ZpZGVkIGVudGl0eS5cbiAqIFRoaXMgZnVuY3Rpb24gd291bGQgYmUgdXNlZCBmb3IgbW9kZWxzIHRoYXQgaGF2ZSBjb21iaW5lZCBwcmltYXJ5IGtleXNcbiAqIChkZWxpdmVyZWQgYXMgYW4gYXJyYXkpLlxuICpcbiAqIEB0eXBlIHsgbWVtb2l6ZWQgfVxuICogQHJldHVybiB7IHN0cmluZyB9IFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gZm9yIHRoZSB2YWx1ZXMuXG4gKiBAdGhyb3dzIHsgRXhjZXB0aW9uIH1cbiAqL1xuZXhwb3J0IGNvbnN0IHZhbHVlc0ZvckNvbWJpbmVkUHJpbWFyeUtleXMgPSBtZW1vaXplKCAoIGtleXMsIGVudGl0eSApID0+IHtcblx0YXNzZXJ0SXNBcnJheSgga2V5cyApO1xuXHRjb25zdCBwcmltYXJ5S2V5ID0gcmVkdWNlKCBrZXlzLCBmdW5jdGlvbiggcmVzdWx0LCBrZXkgKSB7XG5cdFx0YXNzZXJ0RW50aXR5SGFzS2V5KCBrZXksIGVudGl0eSApO1xuXHRcdHJldHVybiBlbnRpdHlbIHJlc3VsdCBdICsgJzonICsgZW50aXR5WyBrZXkgXTtcblx0fSApO1xuXHRyZXR1cm4gdHJpbUVuZCggcHJpbWFyeUtleSwgJzonICk7XG59ICk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkgZnJvbSB0aGUgcHJvdmlkZWQgZW50aXR5LlxuICogVGhpcyBmdW5jdGlvbiB3b3VsZCBiZSB1c2VkIGZvciBtb2RlbHMgdGhhdCBoYXZlIG9ubHkgb25lIHByaW1hcnkga2V5LlxuICpcbiAqIEB0eXBlIHttZW1vaXplZH1cbiAqIEByZXR1cm4geyBmdW5jdGlvbiB9IFRoZSB2YWx1ZSBmb3IgdGhlIGtleSBpbiB0aGUgcHJvdmlkZWQgZW50aXR5LlxuICogQHRocm93cyB7IEV4Y2VwdGlvbiB9XG4gKi9cbmV4cG9ydCBjb25zdCB2YWx1ZUZvclByaW1hcnlLZXkgPSBtZW1vaXplKCAoIGtleSwgZW50aXR5ICkgPT4ge1xuXHRhc3NlcnRFbnRpdHlIYXNLZXkoIGtleSwgZW50aXR5ICk7XG5cdHJldHVybiBlbnRpdHlbIGtleSBdO1xufSApO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHByaW1hcnkga2V5IChvciBjb21iaW5lZCBwcmltYXJ5IGtleXMpIGZyb20gdGhlIGF2YWlsYWJsZSBkYXRhLlxuICpcbiAqIEB0eXBlIHttZW1vaXplZH1cbiAqIEByZXR1cm4geyBmdW5jdGlvbihzdHJpbmcpIH1cbiAqIEB0aHJvd3MgeyBFeGNlcHRpb24gfVxuICovXG5leHBvcnQgY29uc3QgZ2V0UHJpbWFyeUtleSA9IG1lbW9pemUoICggbW9kZWxOYW1lICkgPT4ge1xuXHRhc3NlcnRFbnRpdHlIYXNLZXkoIG1vZGVsTmFtZSwgcHJpbWFyeUtleXMgKTtcblx0cmV0dXJuIHByaW1hcnlLZXlzWyBtb2RlbE5hbWUgXTtcbn0gKTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgcXVlcnkgc3RyaW5nIGZvciBnZXR0aW5nIHRoZSBlbnRpdGllcyBiZWxvbmdpbmcgdG8gYSBtb2RlbCBmb3IgdGhlXG4gKiBnaXZlbiBwcmltYXJ5IGtleSB2YWx1ZXNcbiAqXG4gKiBAdHlwZSB7bWVtb2l6ZWR9XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRQcmltYXJ5S2V5UXVlcnlTdHJpbmcgPSBtZW1vaXplKFxuXHQoIG1vZGVsTmFtZSwga2V5VmFsdWVzID0gW10gKSA9PiB7XG5cdFx0Y29uc3QgcHJpbWFyeUtleSA9IGdldFByaW1hcnlLZXkoIG1vZGVsTmFtZSApO1xuXHRcdHJldHVybiBgWyR7IHByaW1hcnlLZXkgfV1bSU5dPWAgKyBrZXlWYWx1ZXMuam9pbigpO1xuXHR9XG4pO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHZhbHVlcyBmb3IgdGhlIHByaW1hcnkga2V5cyBmcm9tIHRoZSBwcm92aWRlZCBlbnRpdHkuXG4gKlxuICogQHR5cGUge21lbW9pemVkfVxuICogQHJldHVybiB7IGZ1bmN0aW9uIH0gIElmIHRoZSBtb2RlbCBoYXMgb25seSBvbmUgcHJpbWFyeSBrZXkgdGhlbiB0aGUgdmFsdWUgd2lsbFxuICogYmUgYSBzaW1wbGUgc3RyaW5nLiAgSWYgdGhlIG1vZGVsIGhhcyBjb21iaW5lZCBwcmltYXJ5IGtleXMsIHRoZW4gdGhlIHZhbHVlXG4gKiB3aWxsIGJlIGFzIHN0cmluZyBpbiB0aGUgZm9ybWF0IGAlcy4lc2AgZm9yIHRoZSBwcmltYXJ5IGtleSB2YWx1ZXMuXG4gKiBAdGhyb3dzIHsgRXhjZXB0aW9uIH1cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEVudGl0eVByaW1hcnlLZXlWYWx1ZXMgPSBtZW1vaXplKCAoIG1vZGVsTmFtZSwgZW50aXR5ICkgPT4ge1xuXHRjb25zdCBrZXlzID0gZ2V0UHJpbWFyeUtleSggbW9kZWxOYW1lICk7XG5cdHJldHVybiBpc0FycmF5KCBrZXlzICkgP1xuXHRcdHZhbHVlc0ZvckNvbWJpbmVkUHJpbWFyeUtleXMoIGtleXMsIGVudGl0eSApIDpcblx0XHR2YWx1ZUZvclByaW1hcnlLZXkoIGtleXMsIGVudGl0eSApO1xufSApO1xuXG4vKipcbiAqIFRoaXMgcmVjZWl2ZXMgYW4gYXJyYXkgb2YgZW50aXRpZXMgYW5kIHJldHVybnMgYSBjb2xsZWN0aW9uIG9mIHRob3NlIHNhbWVcbiAqIGVudGl0aWVzIGluZGV4ZWQgYnkgdGhlIHByaW1hcnkga2V5IHZhbHVlIGZvciBlYWNoIGVudGl0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge0FycmF5fSBlbnRpdGllc1xuICogQHJldHVybiB7TWFwfSAgQSBjb2xsZWN0aW9uIGluZGV4ZWQgYnkgdGhlIHByaW1hcnkga2V5IHZhbHVlcyBmb3IgZWFjaCBlbnRpdHkuXG4gKiBAdGhyb3dzIHtFeGNlcHRpb259XG4gKi9cbmV4cG9ydCBjb25zdCBrZXlFbnRpdGllc0J5UHJpbWFyeUtleVZhbHVlID0gKCBtb2RlbE5hbWUsIGVudGl0aWVzID0gW10gKSA9PiB7XG5cdGFzc2VydElzTm90RW1wdHkoXG5cdFx0ZW50aXRpZXMsXG5cdFx0X18oXG5cdFx0XHQnVGhlIHByb3ZpZGVkIGFycmF5IG9mIGVudGl0aWVzIG11c3Qgbm90IGJlIGVtcHR5Jyxcblx0XHRcdCdldmVudF9lc3ByZXNzbycsXG5cdFx0KVxuXHQpO1xuXHRhc3NlcnRJc0FycmF5KCBlbnRpdGllcyApO1xuXG5cdGNvbnN0IG1hcHBlZEVudGl0aWVzID0gbmV3IE1hcCgpO1xuXHRlbnRpdGllcy5mb3JFYWNoKCAoIGVudGl0eSApID0+IHtcblx0XHRtYXBwZWRFbnRpdGllcy5zZXQoXG5cdFx0XHRnZXRFbnRpdHlQcmltYXJ5S2V5VmFsdWVzKCBtb2RlbE5hbWUsIGVudGl0eSApLFxuXHRcdFx0ZW50aXR5XG5cdFx0KTtcblx0fSApO1xuXHRyZXR1cm4gbWFwcGVkRW50aXRpZXM7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZW50aXR5IGluc3RhbmNlcyB1c2luZyB0aGUgZ2l2ZW4gZmFjdG9yeSBhbmQgYXJyYXlcbiAqIG9mIGVudGl0eSB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGZhY3RvcnlcbiAqIEBwYXJhbSB7TWFwfSBlbnRpdGllc1xuICogQHJldHVybiB7TWFwfSAgQW4gYXJyYXkgb2YgZW50aXR5IGluc3RhbmNlcyBpbmRleGVkIGJ5XG4gKiB0aGVpciBwcmltYXJ5IGtleSB2YWx1ZVxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQW5kS2V5RW50aXRpZXNCeVByaW1hcnlLZXlWYWx1ZSA9IChcblx0ZmFjdG9yeSxcblx0ZW50aXRpZXMsXG4pID0+IHtcblx0YXNzZXJ0SXNNYXAoXG5cdFx0ZW50aXRpZXMsXG5cdFx0X18oXG5cdFx0XHQnVGhlIHByb3ZpZGVkIG9iamVjdCBvZiBlbnRpdGllcyBtdXN0IGJlIGEgTWFwIG9iamVjdCcsXG5cdFx0XHQnZXZlbnRfZXNwcmVzc28nLFxuXHRcdClcblx0KTtcblx0ZW50aXRpZXMuZm9yRWFjaCggKCBlbnRpdHksIGVudGl0eUlkICkgPT4ge1xuXHRcdGVudGl0aWVzLnNldCggZW50aXR5SWQsIGZhY3RvcnkuZnJvbUV4aXN0aW5nKCBlbnRpdHkgKSApO1xuXHR9ICk7XG5cdHJldHVybiBlbnRpdGllcztcbn07XG4iLCIvKipcbiAqIEludGVybmFsIEltcG9ydHNcbiAqL1xuaW1wb3J0ICogYXMgc3RhdHVzTW9kZWwgZnJvbSAnLi4vc3RhdHVzL2NvbnN0YW50cyc7XG5cbi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyB2YWx1ZXMgfSBmcm9tICdsb2Rhc2gnO1xuXG5leHBvcnQgY29uc3QgTU9ERUxfTkFNRSA9ICdyZWdpc3RyYXRpb24nO1xuXG5leHBvcnQgY29uc3QgUkVHSVNUUkFUSU9OX1NUQVRVU19JRFMgPSB2YWx1ZXMoXG5cdHN0YXR1c01vZGVsLlJFR0lTVFJBVElPTl9TVEFUVVNfSURcbik7XG4iLCJleHBvcnQgKiBmcm9tICcuL2NvbnN0YW50cyc7XG5leHBvcnQgKiBmcm9tICcuL3F1ZXJ5JztcbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBpc1VuZGVmaW5lZCwgdmFsdWVzIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQge1xuXHRnZXRRdWVyeVN0cmluZyBhcyBiYXNlR2V0UXVlcnlTdHJpbmcsXG5cdFFVRVJZX09SREVSX0RFU0MsXG5cdEFMTE9XRURfT1JERVJfVkFMVUVTLFxufSBmcm9tICcuLi9iYXNlJztcbmltcG9ydCAqIGFzIHN0YXR1c01vZGVsIGZyb20gJy4uL3N0YXR1cy9jb25zdGFudHMnO1xuXG4vKipcbiAqIERlc2NyaWJlZCBhdHRyaWJ1dGVzIGZvciB0aGlzIG1vZGVsXG4gKiBAdHlwZSB7e2F0dHJpYnV0ZXM6ICp9fVxuICovXG5leHBvcnQgY29uc3QgcXVlcnlEYXRhVHlwZXMgPSB7XG5cdGZvckV2ZW50SWQ6IFByb3BUeXBlcy5udW1iZXIsXG5cdGZvckF0dGVuZGVlSWQ6IFByb3BUeXBlcy5udW1iZXIsXG5cdGZvclRyYW5zYWN0aW9uSWQ6IFByb3BUeXBlcy5udW1iZXIsXG5cdGZvclRpY2tldElkOiBQcm9wVHlwZXMubnVtYmVyLFxuXHRmb3JTdGF0dXNJZDogUHJvcFR5cGVzLm9uZU9mKCB2YWx1ZXMoIHN0YXR1c01vZGVsLlJFR0lTVFJBVElPTl9TVEFUVVNfSUQgKSApLFxuXHRxdWVyeURhdGE6IFByb3BUeXBlcy5zaGFwZSgge1xuXHRcdGxpbWl0OiBQcm9wVHlwZXMubnVtYmVyLFxuXHRcdG9yZGVyQnk6IFByb3BUeXBlcy5vbmVPZiggW1xuXHRcdFx0J1JFR19JRCcsXG5cdFx0XHQnUkVHX2RhdGUnLFxuXHRcdF0gKSxcblx0XHRvcmRlcjogUHJvcFR5cGVzLm9uZU9mKCBBTExPV0VEX09SREVSX1ZBTFVFUyApLFxuXHR9ICksXG59O1xuXG5leHBvcnQgY29uc3Qgb3B0aW9uc0VudGl0eU1hcCA9IHtcblx0ZGVmYXVsdDoge1xuXHRcdHZhbHVlOiAnUkVHX0lEJyxcblx0XHRsYWJlbDogJ1JFR19jb2RlJyxcblx0fSxcbn07XG5cbi8qKlxuICogRGVmYXVsdCBhdHRyaWJ1dGVzIGZvciB0aGlzIG1vZGVsXG4gKiBAdHlwZSB7XG4gKiBcdHtcbiAqIFx0XHRhdHRyaWJ1dGVzOiB7XG4gKiBcdFx0XHRsaW1pdDogbnVtYmVyLFxuICogXHRcdFx0b3JkZXJCeTogc3RyaW5nLFxuICogXHRcdFx0b3JkZXI6IHN0cmluZyxcbiAqICAgXHR9XG4gKiAgIH1cbiAqIH1cbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRRdWVyeURhdGEgPSB7XG5cdHF1ZXJ5RGF0YToge1xuXHRcdGxpbWl0OiAxMDAsXG5cdFx0b3JkZXJCeTogJ3JlZ19kYXRlJyxcblx0XHRvcmRlcjogUVVFUllfT1JERVJfREVTQyxcblx0fSxcbn07XG5cbi8qKlxuICogVXNlZCB0byBtYXAgYW4gb3JkZXJCeSBzdHJpbmcgdG8gdGhlIGFjdHVhbCB2YWx1ZSB1c2VkIGluIGEgUkVTVCBxdWVyeSBmcm9tXG4gKiB0aGUgY29udGV4dCBvZiBhIHJlZ2lzdHJhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gb3JkZXJCeVxuICpcbiAqIEByZXR1cm4geyBzdHJpbmcgfSBSZXR1cm5zIGFuIGFjdHVhbCBvcmRlckJ5IHN0cmluZyBmb3IgdGhlIFJFU1QgcXVlcnkgZm9yXG4gKiAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJvdmlkZWQgYWxpYXNcbiAqL1xuZXhwb3J0IGNvbnN0IG1hcE9yZGVyQnkgPSAoIG9yZGVyQnkgKSA9PiB7XG5cdGNvbnN0IG9yZGVyQnlNYXAgPSB7XG5cdFx0cmVnX2lkOiAnUkVHX0lEJyxcblx0XHRyZWdfZGF0ZTogJ1JFR19kYXRlJyxcblx0fTtcblx0cmV0dXJuIGlzVW5kZWZpbmVkKCBvcmRlckJ5TWFwWyBvcmRlckJ5IF0gKSA/XG5cdFx0b3JkZXJCeSA6XG5cdFx0b3JkZXJCeU1hcFsgb3JkZXJCeSBdO1xufTtcblxuLyoqXG4gKiBCdWlsZHMgd2hlcmUgY29uZGl0aW9ucyBmb3IgYW4gcmVnaXN0cmF0aW9ucyBlbmRwb2ludCByZXF1ZXN0XG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGZvckV2ZW50SWQgICAgXHRJRCBvZiBFdmVudCB0byByZXRyaWV2ZSByZWdpc3RyYXRpb25zIGZvclxuICogQHBhcmFtIHtudW1iZXJ9IGZvckF0dGVuZGVlSWQgICAgSUQgb2YgQXR0ZW5kZWUgdG8gcmV0cmlldmUgcmVnaXN0cmF0aW9ucyBmb3JcbiAqIEBwYXJhbSB7bnVtYmVyfSBmb3JUcmFuc2FjdGlvbklkIElEIG9mIFRyYW5zYWN0aW9uIHRvIHJldHJpZXZlIHJlZ2lzdHJhdGlvbnMgZm9yXG4gKiBAcGFyYW0ge251bWJlcn0gZm9yVGlja2V0SWQgXHRcdElEIG9mIFRpY2tldCB0byByZXRyaWV2ZSByZWdpc3RyYXRpb25zIGZvclxuICogQHBhcmFtIHtzdHJpbmd9IGZvclN0YXR1c0lkIFx0XHRJRCBvZiBTdGF0dXMgdG8gcmV0cmlldmUgcmVnaXN0cmF0aW9ucyBmb3JcbiAqIEByZXR1cm4ge3N0cmluZ30gICAgICAgICAgICAgICAgXHRUaGUgYXNzZW1ibGVkIHdoZXJlIGNvbmRpdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCB3aGVyZUNvbmRpdGlvbnMgPSAoIHtcblx0Zm9yRXZlbnRJZCA9IDAsXG5cdGZvckF0dGVuZGVlSWQgPSAwLFxuXHRmb3JUcmFuc2FjdGlvbklkID0gMCxcblx0Zm9yVGlja2V0SWQgPSAwLFxuXHRmb3JTdGF0dXNJZCA9ICcnLFxufSApID0+IHtcblx0Y29uc3Qgd2hlcmUgPSBbXTtcblx0Zm9yRXZlbnRJZCA9IHBhcnNlSW50KCBmb3JFdmVudElkLCAxMCApO1xuXHRpZiAoIGZvckV2ZW50SWQgIT09IDAgJiYgISBpc05hTiggZm9yRXZlbnRJZCApICkge1xuXHRcdHdoZXJlLnB1c2goICd3aGVyZVtFVlRfSURdPScgKyBmb3JFdmVudElkICk7XG5cdH1cblx0Zm9yQXR0ZW5kZWVJZCA9IHBhcnNlSW50KCBmb3JBdHRlbmRlZUlkLCAxMCApO1xuXHRpZiAoIGZvckF0dGVuZGVlSWQgIT09IDAgJiYgISBpc05hTiggZm9yQXR0ZW5kZWVJZCApICkge1xuXHRcdHdoZXJlLnB1c2goICd3aGVyZVtBVFRfSURdPScgKyBmb3JBdHRlbmRlZUlkICk7XG5cdH1cblx0Zm9yVHJhbnNhY3Rpb25JZCA9IHBhcnNlSW50KCBmb3JUcmFuc2FjdGlvbklkLCAxMCApO1xuXHRpZiAoIGZvclRyYW5zYWN0aW9uSWQgIT09IDAgJiYgISBpc05hTiggZm9yVHJhbnNhY3Rpb25JZCApICkge1xuXHRcdHdoZXJlLnB1c2goICd3aGVyZVtUWE5fSURdPScgKyBmb3JUcmFuc2FjdGlvbklkICk7XG5cdH1cblx0Zm9yVGlja2V0SWQgPSBwYXJzZUludCggZm9yVGlja2V0SWQsIDEwICk7XG5cdGlmICggZm9yVGlja2V0SWQgIT09IDAgJiYgISBpc05hTiggZm9yVGlja2V0SWQgKSApIHtcblx0XHR3aGVyZS5wdXNoKCAnd2hlcmVbVEtUX0lEXT0nICsgZm9yVGlja2V0SWQgKTtcblx0fVxuXHRpZiAoIGZvclN0YXR1c0lkICE9PSAnJyAmJiBmb3JTdGF0dXNJZCAhPT0gbnVsbCApIHtcblx0XHR3aGVyZS5wdXNoKCAnd2hlcmVbU1RTX0lEXT0nICsgZm9yU3RhdHVzSWQgKTtcblx0fVxuXHRyZXR1cm4gd2hlcmUuam9pbiggJyYnICk7XG59O1xuXG4vKipcbiAqIFJldHVybiBhIHF1ZXJ5IHN0cmluZyBmb3IgdXNlIGJ5IGEgUkVTVCByZXF1ZXN0IGdpdmVuIGEgc2V0IG9mIHF1ZXJ5RGF0YS5cbiAqIEBwYXJhbSB7IE9iamVjdCB9IHF1ZXJ5RGF0YVxuICogQHJldHVybiB7IHN0cmluZyB9ICBSZXR1cm5zIHRoZSBxdWVyeSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRRdWVyeVN0cmluZyA9ICggcXVlcnlEYXRhID0ge30gKSA9PiB7XG5cdHF1ZXJ5RGF0YSA9IHsgLi4uZGVmYXVsdFF1ZXJ5RGF0YS5xdWVyeURhdGEsIC4uLnF1ZXJ5RGF0YSB9O1xuXHRyZXR1cm4gYmFzZUdldFF1ZXJ5U3RyaW5nKCBxdWVyeURhdGEsIHdoZXJlQ29uZGl0aW9ucywgbWFwT3JkZXJCeSApO1xufTtcbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyB2YWx1ZXMgfSBmcm9tICdsb2Rhc2gnO1xuXG5leHBvcnQgY29uc3QgTU9ERUxfTkFNRSA9ICdzdGF0dXMnO1xuLy8gdHlwZXNcbmV4cG9ydCBjb25zdCBTVEFUVVNfVFlQRV9FTUFJTCA9ICdlbWFpbCc7XG5leHBvcnQgY29uc3QgU1RBVFVTX1RZUEVfRVZFTlQgPSAnZXZlbnQnO1xuZXhwb3J0IGNvbnN0IFNUQVRVU19UWVBFX01FU1NBR0UgPSAnbWVzc2FnZSc7XG5leHBvcnQgY29uc3QgU1RBVFVTX1RZUEVfUEFZTUVOVCA9ICdwYXltZW50JztcbmV4cG9ydCBjb25zdCBTVEFUVVNfVFlQRV9SRUdJU1RSQVRJT04gPSAncmVnaXN0cmF0aW9uJztcbmV4cG9ydCBjb25zdCBTVEFUVVNfVFlQRV9UUkFOU0FDVElPTiA9ICd0cmFuc2FjdGlvbic7XG4vLyBlbWFpbFxuZXhwb3J0IGNvbnN0IEVNQUlMX1NUQVRVU19JRCA9IHtcblx0RFJBRlQ6ICdFRFInLFxuXHRTRU5UOiAnRVNOJyxcblx0RVhQSVJFRDogJ0VYUCcsXG59O1xuLy8gZXZlbnRcbmV4cG9ydCBjb25zdCBFVkVOVF9TVEFUVVNfSUQgPSB7XG5cdEFDVElWRTogJ0FDVCcsXG5cdFJFR0lTVFJBVElPTl9DTE9TRUQ6ICdDTFMnLFxuXHRERUxFVEVEOiAnREVMJyxcblx0REVOSUVEOiAnREVOJyxcblx0RFJBRlQ6ICdEUkYnLFxuXHROT1RfQUNUSVZFOiAnTkFDJyxcblx0Tk9UX09QRU46ICdOT1AnLFxuXHRPTkdPSU5HOiAnT05HJyxcblx0UkVHSVNUUkFUSU9OX09QRU46ICdPUE4nLFxuXHRQRU5ESU5HOiAnUE5EJyxcblx0U0VDT05EQVJZOiAnU0VDJyxcbn07XG4vLyBtZXNzYWdlXG5leHBvcnQgY29uc3QgTUVTU0FHRV9TVEFUVVNfSUQgPSB7XG5cdERFQlVHOiAnTURPJyxcblx0RVhFQ1VUSU5HOiAnTUVYJyxcblx0RkFJTDogJ01GTCcsXG5cdElOQ09NUExFVEU6ICdNSUMnLFxuXHRJRExFOiAnTUlEJyxcblx0UkVTRU5EOiAnTVJTJyxcblx0UkVUUlk6ICdNUlQnLFxuXHRTRU5UOiAnTVNOJyxcbn07XG4vLyBwYXltZW50XG5leHBvcnQgY29uc3QgUEFZTUVOVF9TVEFUVVNfSUQgPSB7XG5cdEFQUFJPVkVEOiAnUEFQJyxcblx0Q0FOQ0VMTEVEOiAnUENOJyxcblx0REVDTElORUQ6ICdQREMnLFxuXHRGQUlMRUQ6ICdQRkwnLFxuXHRQRU5ESU5HOiAnUFBOJyxcbn07XG4vLyByZWdpc3RyYXRpb25cbmV4cG9ydCBjb25zdCBSRUdJU1RSQVRJT05fU1RBVFVTX0lEID0ge1xuXHRBUFBST1ZFRDogJ1JBUCcsXG5cdENBTkNFTExFRDogJ1JDTicsXG5cdERFQ0xJTkVEOiAnUkRDJyxcblx0SU5DT01QTEVURTogJ1JJQycsXG5cdE5PVF9BUFBST1ZFRDogJ1JOQScsXG5cdFBFTkRJTkdfUEFZTUVOVDogJ1JQUCcsXG5cdFdBSVRfTElTVDogJ1JXTCcsXG59O1xuLy8gdHJhbnNhY3Rpb25cbmV4cG9ydCBjb25zdCBUUkFOU0FDVElPTl9TVEFUVVNfSUQgPSB7XG5cdEFCQU5ET05FRDogJ1RBQicsXG5cdENPTVBMRVRFOiAnVENNJyxcblx0RkFJTEVEOiAnVEZMJyxcblx0SU5DT01QTEVURTogJ1RJTicsXG5cdE9WRVJQQUlEOiAnVE9QJyxcbn07XG5cbi8vIHRoZSBmb2xsb3dpbmcgYXJlIG5vdCBpbiB0aGUgc3RhdHVzIGRhdGFiYXNlIGJ1dCBhcmUga2VwdCBoZXJlIGZvclxuLy8gY29udmVuaWVuY2VcblxuLy8gY3VzdG9tIHBvc3QgdHlwZXNcbmV4cG9ydCBjb25zdCBDUFRfU1RBVFVTX0lEID0ge1xuXHRQVUJMSVNIOiAncHVibGlzaCcsXG5cdEZVVFVSRTogJ2Z1dHVyZScsXG5cdERSQUZUOiAnZHJhZnQnLFxuXHRQRU5ESU5HOiAncGVuZGluZycsXG5cdFBSSVZBVEU6ICdwcml2YXRlJyxcblx0VFJBU0hFRDogJ3RyYXNoJyxcbn07XG5cbmV4cG9ydCBjb25zdCBVTktOT1dOX1NUQVRVU19JRCA9ICd1bmtub3duJztcblxuZXhwb3J0IGNvbnN0IEFMTF9TVEFUVVNfSURTID0gW1xuXHQuLi52YWx1ZXMoIEVNQUlMX1NUQVRVU19JRCApLFxuXHQuLi52YWx1ZXMoIEVWRU5UX1NUQVRVU19JRCApLFxuXHQuLi52YWx1ZXMoIE1FU1NBR0VfU1RBVFVTX0lEICksXG5cdC4uLnZhbHVlcyggUEFZTUVOVF9TVEFUVVNfSUQgKSxcblx0Li4udmFsdWVzKCBSRUdJU1RSQVRJT05fU1RBVFVTX0lEICksXG5cdC4uLnZhbHVlcyggVFJBTlNBQ1RJT05fU1RBVFVTX0lEICksXG5cdC4uLnZhbHVlcyggQ1BUX1NUQVRVU19JRCApLFxuXHRVTktOT1dOX1NUQVRVU19JRCxcbl07XG4iLCIvKipcbiAqIEludGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0ICogYXMgc3RhdHVzIGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IEVWRU5UX1NUQVRVU19JRCB9IGZyb20gJy4uL2V2ZW50JztcbmltcG9ydCB7IFRJQ0tFVF9TVEFUVVNfSUQgfSBmcm9tICcuLi90aWNrZXQnO1xuaW1wb3J0IHsgREFURVRJTUVfU1RBVFVTX0lEIH0gZnJvbSAnLi4vZGF0ZXRpbWUnO1xuaW1wb3J0IHsgQ0hFQ0tJTl9TVEFUVVNfSUQgfSBmcm9tICcuLi9jaGVja2luJztcblxuLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IF9fIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vaTE4bic7XG5pbXBvcnQgeyBMYWJlbCB9IGZyb20gJ0BldmVudGVzcHJlc3NvL3ZhbHVlLW9iamVjdHMnO1xuaW1wb3J0IHsgaXNBcnJheSB9IGZyb20gJ2xvZGFzaCc7XG5cbi8qKlxuICogVHJhbnNsYXRpb24gbWFwIGZvciBSZWdpc3RyYXRpb24gc3RhdHVzZXNcbiAqIEB0eXBlIHt7fX1cbiAqL1xuY29uc3QgU1RBVFVTX1RSQU5TTEFUSU9OX01BUF9SRUdJU1RSQVRJT04gPSB7XG5cdFsgc3RhdHVzLlJFR0lTVFJBVElPTl9TVEFUVVNfSUQuUEVORElOR19QQVlNRU5UIF06IG5ldyBMYWJlbChcblx0XHRfXyggJ3BlbmRpbmcgcGF5bWVudCcsICdldmVudF9lc3ByZXNzbycgKSxcblx0XHRfXyggJ3BlbmRpbmcgcGF5bWVudHMnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcblx0WyBzdGF0dXMuUkVHSVNUUkFUSU9OX1NUQVRVU19JRC5BUFBST1ZFRCBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ2FwcHJvdmVkJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgc3RhdHVzLlJFR0lTVFJBVElPTl9TVEFUVVNfSUQuTk9UX0FQUFJPVkVEIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAnbm90IGFwcHJvdmVkJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgc3RhdHVzLlJFR0lTVFJBVElPTl9TVEFUVVNfSUQuQ0FOQ0VMTEVEIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAnY2FuY2VsbGVkJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgc3RhdHVzLlJFR0lTVFJBVElPTl9TVEFUVVNfSUQuSU5DT01QTEVURSBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ2luY29tcGxldGUnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcblx0WyBzdGF0dXMuUkVHSVNUUkFUSU9OX1NUQVRVU19JRC5ERUNMSU5FRCBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ2RlY2xpbmVkJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgc3RhdHVzLlJFR0lTVFJBVElPTl9TVEFUVVNfSUQuV0FJVF9MSVNUIF06IG5ldyBMYWJlbChcblx0XHRfXyggJ3dhaXQgbGlzdCcsICdldmVudF9lc3ByZXNzbycgKSxcblx0XHRfXyggJ3dhaXQgbGlzdHMnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcbn07XG5cbi8qKlxuICogVHJhbnNsYXRpb24gbWFwIGZvciBUcmFuc2FjdGlvbiBzdGF0dXNlc1xuICogQHR5cGUge3t9fVxuICpcbiAqL1xuY29uc3QgU1RBVFVTX1RSQU5TTEFUSU9OX01BUF9UUkFOU0FDVElPTiA9IHtcblx0WyBzdGF0dXMuVFJBTlNBQ1RJT05fU1RBVFVTX0lELk9WRVJQQUlEIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAnb3ZlcnBhaWQnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcblx0WyBzdGF0dXMuVFJBTlNBQ1RJT05fU1RBVFVTX0lELkNPTVBMRVRFIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAnY29tcGxldGUnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcblx0WyBzdGF0dXMuVFJBTlNBQ1RJT05fU1RBVFVTX0lELklOQ09NUExFVEUgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdpbmNvbXBsZXRlJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgc3RhdHVzLlRSQU5TQUNUSU9OX1NUQVRVU19JRC5GQUlMRUQgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdmYWlsZWQnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcblx0WyBzdGF0dXMuVFJBTlNBQ1RJT05fU1RBVFVTX0lELkFCQU5ET05FRCBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ2FiYW5kb25lZCcsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxufTtcblxuLyoqXG4gKiBUcmFuc2xhdGlvbiBtYXAgZm9yIHBheW1lbnQgc3RhdHVzZXNcbiAqIEB0eXBlIHt7fX1cbiAqL1xuY29uc3QgU1RBVFVTX1RSQU5TTEFUSU9OX01BUF9QQVlNRU5UID0ge1xuXHRbIHN0YXR1cy5QQVlNRU5UX1NUQVRVU19JRC5BUFBST1ZFRCBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ2FjY2VwdGVkJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgc3RhdHVzLlBBWU1FTlRfU1RBVFVTX0lELlBFTkRJTkcgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdwZW5kaW5nJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgc3RhdHVzLlBBWU1FTlRfU1RBVFVTX0lELkNBTkNFTExFRCBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ2NhbmNlbGxlZCcsICdldmVudF9lc3ByZXNzbycgKSxcblx0KSxcblx0WyBzdGF0dXMuUEFZTUVOVF9TVEFUVVNfSUQuREVDTElORUQgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdkZWNsaW5lZCcsICdldmVudF9lc3ByZXNzbycgKSxcblx0KSxcblx0WyBzdGF0dXMuUEFZTUVOVF9TVEFUVVNfSUQuRkFJTEVEIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAnZmFpbGVkJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG59O1xuXG4vKipcbiAqIFRyYW5zbGF0aW9uIG1hcCBmb3IgTWVzc2FnZSBzdGF0dXNlc1xuICogQHR5cGUge3t9fVxuICovXG5jb25zdCBTVEFUVVNfVFJBTlNMQVRJT05fTUFQX01FU1NBR0UgPSB7XG5cdFsgc3RhdHVzLk1FU1NBR0VfU1RBVFVTX0lELlNFTlQgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdzZW50JywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgc3RhdHVzLk1FU1NBR0VfU1RBVFVTX0lELklETEUgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdxdWV1ZWQgZm9yIHNlbmRpbmcnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcblx0WyBzdGF0dXMuTUVTU0FHRV9TVEFUVVNfSUQuRkFJTCBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ2ZhaWxlZCcsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIHN0YXR1cy5NRVNTQUdFX1NUQVRVU19JRC5ERUJVRyBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ2RlYnVnIG9ubHknLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcblx0WyBzdGF0dXMuTUVTU0FHRV9TVEFUVVNfSUQuRVhFQ1VUSU5HIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAnbWVzc2VuZ2VyIGlzIGV4ZWN1dGluZycsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIHN0YXR1cy5NRVNTQUdFX1NUQVRVU19JRC5SRVNFTkQgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdxdWV1ZWQgZm9yIHJlc2VuZGluZycsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIHN0YXR1cy5NRVNTQUdFX1NUQVRVU19JRC5JTkNPTVBMRVRFIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAncXVldWVkIGZvciBnZW5lcmF0aW5nJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgc3RhdHVzLk1FU1NBR0VfU1RBVFVTX0lELlJFVFJZIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAnZmFpbGVkIHNlbmRpbmcsIGNhbiBiZSByZXRyaWVkJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG59O1xuXG4vKipcbiAqIFRyYW5zbGF0aW9uIG1hcCBmb3IgQ1BUIHN0YXR1c2VzXG4gKiBAdHlwZSB7e319XG4gKi9cbmNvbnN0IFNUQVRVU19UUkFOU0xBVElPTl9NQVBfQ1BUID0ge1xuXHRbIHN0YXR1cy5DUFRfU1RBVFVTX0lELlBVQkxJU0ggXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdwdWJsaXNoZWQnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcblx0WyBzdGF0dXMuQ1BUX1NUQVRVU19JRC5GVVRVUkUgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdzY2hlZHVsZWQnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcblx0WyBzdGF0dXMuQ1BUX1NUQVRVU19JRC5EUkFGVCBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ2RyYWZ0JywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgc3RhdHVzLkNQVF9TVEFUVVNfSUQuUEVORElORyBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ3BlbmRpbmcnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcblx0WyBzdGF0dXMuQ1BUX1NUQVRVU19JRC5QUklWQVRFIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAncHJpdmF0ZScsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIHN0YXR1cy5DUFRfU1RBVFVTX0lELlRSQVNIRUQgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICd0cmFzaGVkJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG59O1xuXG4vLyB0aGUgZm9sbG93aW5nIHN0YXR1cyBtYXBzIGFyZSBmb3IgbW9kZWwgc3RhdHVzZXMgdGhhdCBhcmUgbm90IHNhdmVkIGluIHRoZVxuLy8gc3RhdHVzIHRhYmxlIGJ1dCBmb3IgY29udmVuaWVuY2UgaGF2ZSB0aGVpciBsYWJlbHMgcmV0cmlldmFibGUgdmlhIGhlcmUuXG5cbi8qKlxuICogVHJhbnNsYXRpb24gbWFwIGZvciBFdmVudCBTdGF0dXNlc1xuICogQHR5cGUge3t9fVxuICovXG5jb25zdCBTVEFUVVNfVFJBTlNMQVRJT05fTUFQX0VWRU5UID0ge1xuXHRbIEVWRU5UX1NUQVRVU19JRC5TT0xEX09VVCBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ3NvbGQgb3V0JywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgRVZFTlRfU1RBVFVTX0lELlBPU1RQT05FRCBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ3Bvc3Rwb25lZCcsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIEVWRU5UX1NUQVRVU19JRC5DQU5DRUxMRUQgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdjYW5jZWxsZWQnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcbn07XG5cbi8qKlxuICogVHJhbnNsYXRpb24gbWFwIGZvciBUaWNrZXQgc3RhdHVzZXNcbiAqIEB0eXBlIHt7fX1cbiAqL1xuY29uc3QgU1RBVFVTX1RSQU5TTEFUSU9OX01BUF9USUNLRVQgPSB7XG5cdFsgVElDS0VUX1NUQVRVU19JRC5BUkNISVZFRCBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ2FyY2hpdmVkJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgVElDS0VUX1NUQVRVU19JRC5FWFBJUkVEIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAnZXhwaXJlZCcsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIFRJQ0tFVF9TVEFUVVNfSUQuU09MRF9PVVQgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdzb2xkIG91dCcsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIFRJQ0tFVF9TVEFUVVNfSUQuUEVORElORyBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ3VwY29taW5nJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgVElDS0VUX1NUQVRVU19JRC5PTlNBTEUgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdvbiBzYWxlJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG59O1xuXG4vKipcbiAqIFRyYW5zbGF0aW9uIG1hcCBmb3IgZGF0ZXRpbWUgc3RhdHVzZXNcbiAqIEB0eXBlIHt7fX1cbiAqL1xuY29uc3QgU1RBVFVTX1RSQU5TTEFUSU9OX01BUF9EQVRFVElNRSA9IHtcblx0WyBEQVRFVElNRV9TVEFUVVNfSUQuQ0FOQ0VMTEVEIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAnY2FuY2VsbGVkJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgREFURVRJTUVfU1RBVFVTX0lELlNPTERfT1VUIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAnc29sZCBvdXQnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcblx0WyBEQVRFVElNRV9TVEFUVVNfSUQuRVhQSVJFRCBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ2V4cGlyZWQnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcblx0WyBEQVRFVElNRV9TVEFUVVNfSUQuSU5BQ1RJVkUgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdpbmFjdGl2ZScsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIERBVEVUSU1FX1NUQVRVU19JRC5VUENPTUlORyBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ3VwY29taW5nJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgREFURVRJTUVfU1RBVFVTX0lELkFDVElWRSBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ2FjdGl2ZScsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIERBVEVUSU1FX1NUQVRVU19JRC5QT1NUUE9ORUQgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdwb3N0cG9uZWQnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcbn07XG5cbi8qKlxuICogVHJhbnNsYXRpb24gbWFwIGZvciBjaGVja2luIHN0YXR1c2VzXG4gKlxuICogQHR5cGUge3t9fVxuICovXG5jb25zdCBTVEFUVVNfVFJBTlNMQVRJT05fTUFQX0NIRUNLSU4gPSB7XG5cdFsgQ0hFQ0tJTl9TVEFUVVNfSUQuU1RBVFVTX0NIRUNLRURfSU4gXTogbmV3IExhYmVsKFxuXHRcdF9fKCAnY2hlY2staW4nLCAnZXZlbnRfZXNwcmVzc28nICksXG5cdFx0X18oICdjaGVjay1pbnMnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcblx0WyBDSEVDS0lOX1NUQVRVU19JRC5TVEFUVVNfQ0hFQ0tFRF9PVVQgXTogbmV3IExhYmVsKFxuXHRcdF9fKCAnY2hlY2stb3V0JywgJ2V2ZW50X2VzcHJlc3NvJyApLFxuXHRcdF9fKCAnY2hlY2stb3V0cycsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIENIRUNLSU5fU1RBVFVTX0lELlNUQVRVU19DSEVDS0VEX05FVkVSIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAnbmV2ZXIgY2hlY2tlZCBpbicsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxufTtcblxuLyoqXG4gKiBDb21iaW5lZCB0cmFuc2xhdGlvbiBtYXAgZm9yIGFsbCBzdGF0dXNlcy5cbiAqIEB0eXBlIHt7fX1cbiAqL1xuY29uc3QgU1RBVFVTX1RSQU5TTEFUSU9OX01BUF9BTEwgPSB7XG5cdC4uLlNUQVRVU19UUkFOU0xBVElPTl9NQVBfUkVHSVNUUkFUSU9OLFxuXHQuLi5TVEFUVVNfVFJBTlNMQVRJT05fTUFQX1RSQU5TQUNUSU9OLFxuXHQuLi5TVEFUVVNfVFJBTlNMQVRJT05fTUFQX1BBWU1FTlQsXG5cdC4uLlNUQVRVU19UUkFOU0xBVElPTl9NQVBfTUVTU0FHRSxcblx0Li4uU1RBVFVTX1RSQU5TTEFUSU9OX01BUF9DUFQsXG5cdC4uLlNUQVRVU19UUkFOU0xBVElPTl9NQVBfRVZFTlQsXG5cdC4uLlNUQVRVU19UUkFOU0xBVElPTl9NQVBfVElDS0VULFxuXHQuLi5TVEFUVVNfVFJBTlNMQVRJT05fTUFQX0RBVEVUSU1FLFxuXHQuLi5TVEFUVVNfVFJBTlNMQVRJT05fTUFQX0NIRUNLSU4sXG5cdFsgc3RhdHVzLlVOS05PV05fU1RBVFVTX0lEIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAndW5rbm93bicsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwcmV0dHkgc3RhdHVzIGxhYmVsIHN0cmluZyBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RhdHVzQ29kZVxuICogQHBhcmFtIHtib29sZWFufSBzaW5ndWxhciAgV2hldGhlciB0byByZXR1cm4gdGhlIHNpbmd1bGFyIG9yIHBsdXJhbCBsYWJlbFxuICogdmFsdWVcbiAqIEBwYXJhbSB7KHNlbnRlbmNlfGxvd2VyfHVwcGVyKX0gc2NoZW1hXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFJldHVybnMgdGhlIG1hcHBlZCBwcmV0dHkgbGFiZWwgZm9yIHRoZSBnaXZlbiBzdGF0dXMgY29kZSBvclxuICogYSBmb3JtYXR0ZWQgJ3Vua293bicgc3RyaW5nIGlmIHRoZXJlIGlzIG5vIG1hcHBlZCB2YWx1ZSBmb3IgdGhlIGdpdmVuIGNvZGUuXG4gKi9cbmV4cG9ydCBjb25zdCBwcmV0dHlTdGF0dXMgPSAoXG5cdHN0YXR1c0NvZGUsXG5cdHNpbmd1bGFyID0gdHJ1ZSxcblx0c2NoZW1hID0gTGFiZWwuRk9STUFUX1NFTlRFTkNFX0NBU0VcbikgPT4ge1xuXHRyZXR1cm4gU1RBVFVTX1RSQU5TTEFUSU9OX01BUF9BTExbIHN0YXR1c0NvZGUgXSA/XG5cdFx0U1RBVFVTX1RSQU5TTEFUSU9OX01BUF9BTExbIHN0YXR1c0NvZGUgXS5hc0Zvcm1hdHRlZCggc2luZ3VsYXIsIHNjaGVtYSApIDpcblx0XHRTVEFUVVNfVFJBTlNMQVRJT05fTUFQX0FMTFsgc3RhdHVzLlVOS05PV05fU1RBVFVTX0lEIF0uYXNGb3JtYXR0ZWQoXG5cdFx0XHRzaW5ndWxhcixcblx0XHRcdHNjaGVtYVxuXHRcdCk7XG59O1xuXG4vKipcbiAqIEV4cGVjdHMgYW4gYXJyYXkgb2Ygc3RhdHVzIGNvZGVzIGFuZCByZXR1cm5zIGFuIG9iamVjdCBpbmRleGVkIGJ5IGNvZGVzIHdpdGhcbiAqIHZhbHVlcyBiZWluZyB0aGUgZm9ybWF0dGVkIHByZXR0eSBsYWJlbHMgZm9yIGVhY2ggY29kZSBhY2NvcmRpbmcgdG8gdGhlXG4gKiBwcm92aWRlZCBhcmd1bWVudHNcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBzdGF0dXNDb2Rlc1xuICogQHBhcmFtIHtib29sZWFufSBzaW5ndWxhclxuICogQHBhcmFtIHsoc2VudGVuY2V8bG93ZXJ8dXBwZXIpfSBzY2hlbWFcbiAqIEByZXR1cm4ge09iamVjdH0gQW4gb2JqZWN0IG1hcHBpbmcgc3RhdHVzIGNvZGUgdG8gcHJldHR5IGxhYmVsLlxuICovXG5leHBvcnQgY29uc3QgcHJldHR5U3RhdHVzZXMgPSAoXG5cdHN0YXR1c0NvZGVzLFxuXHRzaW5ndWxhciA9IHRydWUsXG5cdHNjaGVtYSA9IExhYmVsLkZPUk1BVF9TRU5URU5DRV9DQVNFXG4pID0+IHtcblx0aWYgKCAhIGlzQXJyYXkoIHN0YXR1c0NvZGVzICkgKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvciggJ0V4cGVjdCBpbmNvbWluZyBzdGF0dXNDb2RlcyBhcmd1bWVudCcgK1xuXHRcdFx0JyB0byBiZSBhbiBhcnJheScgKTtcblx0fVxuXHRjb25zdCBtYXBwZWRTdGF0dXNlcyA9IHt9O1xuXHRzdGF0dXNDb2Rlcy5mb3JFYWNoKCAoIHN0YXR1c0NvZGUgKSA9PiB7XG5cdFx0bWFwcGVkU3RhdHVzZXNbIHN0YXR1c0NvZGUgXSA9IHByZXR0eVN0YXR1cyhcblx0XHRcdHN0YXR1c0NvZGUsXG5cdFx0XHRzaW5ndWxhcixcblx0XHRcdHNjaGVtYVxuXHRcdCk7XG5cdH0gKTtcblx0cmV0dXJuIG1hcHBlZFN0YXR1c2VzO1xufTtcbiIsImV4cG9ydCAqIGZyb20gJy4vY29uc3RhbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vcXVlcnknO1xuZXhwb3J0ICogZnJvbSAnLi9oZWxwZXJzJztcbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBpc1VuZGVmaW5lZCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG4vKipcbiAqIEludGVybmFsIGRlcGVuZGVuY2llc1xuICovXG5pbXBvcnQge1xuXHRnZXRRdWVyeVN0cmluZyBhcyBiYXNlR2V0UXVlcnlTdHJpbmcsXG5cdFFVRVJZX09SREVSX0FTQyxcblx0QUxMT1dFRF9PUkRFUl9WQUxVRVMsXG59IGZyb20gJy4uL2Jhc2UnO1xuXG4vKipcbiAqIERlc2NyaWJlZCBhdHRyaWJ1dGVzIGZvciB0aGlzIG1vZGVsXG4gKiBAdHlwZSB7e2F0dHJpYnV0ZXM6ICp9fVxuICovXG5leHBvcnQgY29uc3QgcXVlcnlEYXRhVHlwZXMgPSB7XG5cdHF1ZXJ5RGF0YTogUHJvcFR5cGVzLnNoYXBlKCB7XG5cdFx0bGltaXQ6IFByb3BUeXBlcy5udW1iZXIsXG5cdFx0b3JkZXJCeTogUHJvcFR5cGVzLnN0cmluZyxcblx0XHRvcmRlcjogUHJvcFR5cGVzLm9uZU9mKCBBTExPV0VEX09SREVSX1ZBTFVFUyApLFxuXHR9ICksXG59O1xuXG4vKipcbiAqIERlZmF1bHQgYXR0cmlidXRlcyBmb3IgdGhpcyBtb2RlbFxuICogQHR5cGUge1xuICogXHR7XG4gKiBcdFx0YXR0cmlidXRlczoge1xuICogXHRcdFx0bGltaXQ6IG51bWJlcixcbiAqIFx0XHRcdG9yZGVyQnk6IHN0cmluZyxcbiAqIFx0XHRcdG9yZGVyOiBzdHJpbmcsXG4gKiAgIFx0fVxuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0UXVlcnlEYXRhID0ge1xuXHRxdWVyeURhdGE6IHtcblx0XHRsaW1pdDogMjUsXG5cdFx0b3JkZXJCeTogJ3N0YXR1c0NvZGUnLFxuXHRcdG9yZGVyOiBRVUVSWV9PUkRFUl9BU0MsXG5cdH0sXG59O1xuXG4vKipcbiAqIFVzZWQgdG8gbWFwIGFuIG9yZGVyQnkgc3RyaW5nIHRvIHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBpbiBhIFJFU1QgcXVlcnkgZnJvbVxuICogdGhlIGNvbnRleHQgb2YgYW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG9yZGVyQnlcbiAqXG4gKiBAcmV0dXJuIHsgc3RyaW5nIH0gUmV0dXJucyBhbiBhY3R1YWwgb3JkZXJCeSBzdHJpbmcgZm9yIHRoZSBSRVNUIHF1ZXJ5IGZvclxuICogICAgICAgICAgICAgICAgICAgICAgdGhlIHByb3ZpZGVkIGFsaWFzXG4gKi9cbmV4cG9ydCBjb25zdCBtYXBPcmRlckJ5ID0gKCBvcmRlckJ5ICkgPT4ge1xuXHRjb25zdCBvcmRlckJ5TWFwID0ge1xuXHRcdHN0YXR1c0NvZGU6ICdTVFNfY29kZScsXG5cdH07XG5cdHJldHVybiBpc1VuZGVmaW5lZCggb3JkZXJCeU1hcFsgb3JkZXJCeSBdICkgP1xuXHRcdG9yZGVyQnkgOlxuXHRcdG9yZGVyQnlNYXBbIG9yZGVyQnkgXTtcbn07XG5cbi8qKlxuICogQnVpbGRzIHdoZXJlIGNvbmRpdGlvbnMgZm9yIGFuIGV2ZW50cyBlbmRwb2ludCByZXF1ZXN0IHVzaW5nIHByb3ZpZGVkXG4gKiBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzVHlwZSBcdElEIGZvciB0eXBlIG9mIFN0YXR1cyB0byByZXRyaWV2ZVxuICogQHJldHVybiB7c3RyaW5nfSAgICAgICAgICAgICBUaGUgYXNzZW1ibGVkIHdoZXJlIGNvbmRpdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCB3aGVyZUNvbmRpdGlvbnMgPSAoIHsgc3RhdHVzVHlwZSB9ICkgPT4ge1xuXHRjb25zdCB3aGVyZSA9IFtdO1xuXHRpZiAoIHN0YXR1c1R5cGUgKSB7XG5cdFx0d2hlcmUucHVzaCggJ3doZXJlW1NUU190eXBlXT0nICsgc3RhdHVzVHlwZSApO1xuXHR9XG5cdHJldHVybiB3aGVyZS5qb2luKCAnJicgKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIGEgcXVlcnkgc3RyaW5nIGZvciB1c2UgYnkgYSBSRVNUIHJlcXVlc3QgZ2l2ZW4gYSBzZXQgb2YgcXVlcnlEYXRhLlxuICogQHBhcmFtIHsgT2JqZWN0IH0gcXVlcnlEYXRhXG4gKiBAcmV0dXJuIHsgc3RyaW5nIH0gIFJldHVybnMgdGhlIHF1ZXJ5IHN0cmluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFF1ZXJ5U3RyaW5nID0gKCBxdWVyeURhdGEgPSB7fSApID0+IHtcblx0cXVlcnlEYXRhID0geyAuLi5kZWZhdWx0UXVlcnlEYXRhLnF1ZXJ5RGF0YSwgLi4ucXVlcnlEYXRhIH07XG5cdHJldHVybiBiYXNlR2V0UXVlcnlTdHJpbmcoIHF1ZXJ5RGF0YSwgd2hlcmVDb25kaXRpb25zLCBtYXBPcmRlckJ5ICk7XG59O1xuXG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgdmFsdWVzIH0gZnJvbSAnbG9kYXNoJztcblxuZXhwb3J0IGNvbnN0IE1PREVMX05BTUUgPSAndGlja2V0JztcblxuZXhwb3J0IGNvbnN0IFRJQ0tFVF9TVEFUVVNfSUQgPSB7XG5cdFNPTERfT1VUOiAnVEtTJyxcblx0RVhQSVJFRDogJ1RLRScsXG5cdEFSQ0hJVkVEOiAnVEtBJyxcblx0UEVORElORzogJ1RLUCcsXG5cdE9OU0FMRTogJ1RLTycsXG59O1xuXG5leHBvcnQgY29uc3QgVElDS0VUX1NUQVRVU19JRFMgPSB2YWx1ZXMoIFRJQ0tFVF9TVEFUVVNfSUQgKTtcbiIsImV4cG9ydCAqIGZyb20gJy4vY29uc3RhbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vcXVlcnknO1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50LXRpbWV6b25lJztcbmltcG9ydCB7IGlzVW5kZWZpbmVkIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbmltcG9ydCB7XG5cdGdldFF1ZXJ5U3RyaW5nIGFzIGJhc2VHZXRRdWVyeVN0cmluZyxcblx0UVVFUllfT1JERVJfREVTQyxcblx0QUxMT1dFRF9PUkRFUl9WQUxVRVMsXG5cdEdSRUFURVJfVEhBTixcblx0R1JFQVRFUl9USEFOX0FORF9FUVVBTCxcblx0TEVTU19USEFOX0FORF9FUVVBTCxcbn0gZnJvbSAnLi4vYmFzZSc7XG5cbmV4cG9ydCBjb25zdCBub3dEYXRlQW5kVGltZSA9IG1vbWVudCgpO1xuXG4vKipcbiAqIERlc2NyaWJlZCBhdHRyaWJ1dGVzIGZvciB0aGlzIG1vZGVsXG4gKiBAdHlwZSB7e2F0dHJpYnV0ZXM6ICp9fVxuICovXG5leHBvcnQgY29uc3QgcXVlcnlEYXRhVHlwZXMgPSB7XG5cdHF1ZXJ5RGF0YTogUHJvcFR5cGVzLnNoYXBlKCB7XG5cdFx0bGltaXQ6IFByb3BUeXBlcy5udW1iZXIsXG5cdFx0b3JkZXJCeTogUHJvcFR5cGVzLm9uZU9mKCBbXG5cdFx0XHQnVEtUX25hbWUnLFxuXHRcdFx0J1RLVF9JRCcsXG5cdFx0XHQnc3RhcnRfZGF0ZScsXG5cdFx0XHQnZW5kX2RhdGUnLFxuXHRcdF0gKSxcblx0XHRvcmRlcjogUHJvcFR5cGVzLm9uZU9mKCBBTExPV0VEX09SREVSX1ZBTFVFUyApLFxuXHRcdHNob3dFeHBpcmVkOiBQcm9wVHlwZXMuYm9vbCxcblx0XHRtb250aDogUHJvcFR5cGVzLm1vbnRoLFxuXHR9ICksXG59O1xuXG4vKipcbiAqIERlZmF1bHQgYXR0cmlidXRlcyBmb3IgdGhpcyBtb2RlbFxuICogQHR5cGUge1xuICogXHR7XG4gKiBcdFx0YXR0cmlidXRlczoge1xuICogXHRcdFx0bGltaXQ6IG51bWJlcixcbiAqIFx0XHRcdG9yZGVyQnk6IHN0cmluZyxcbiAqIFx0XHRcdG9yZGVyOiBzdHJpbmcsXG4gKiAgIFx0XHRzaG93RXhwaXJlZDogYm9vbGVhblxuICogICBcdH1cbiAqICAgfVxuICogfVxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdFF1ZXJ5RGF0YSA9IHtcblx0cXVlcnlEYXRhOiB7XG5cdFx0bGltaXQ6IDEwMCxcblx0XHRvcmRlckJ5OiAnc3RhcnRfZGF0ZScsXG5cdFx0b3JkZXI6IFFVRVJZX09SREVSX0RFU0MsXG5cdFx0c2hvd0V4cGlyZWQ6IGZhbHNlLFxuXHR9LFxufTtcblxuLyoqXG4gKiBVc2VkIHRvIG1hcCBhbiBvcmRlckJ5IHN0cmluZyB0byB0aGUgYWN0dWFsIHZhbHVlIHVzZWQgaW4gYSBSRVNUIHF1ZXJ5IGZyb21cbiAqIHRoZSBjb250ZXh0IG9mIGEgdGlja2V0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcmRlckJ5XG4gKlxuICogQHJldHVybiB7IHN0cmluZyB9IFJldHVybnMgYW4gYWN0dWFsIG9yZGVyQnkgc3RyaW5nIGZvciB0aGUgUkVTVCBxdWVyeSBmb3JcbiAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm92aWRlZCBhbGlhc1xuICovXG5leHBvcnQgY29uc3QgbWFwT3JkZXJCeSA9ICggb3JkZXJCeSApID0+IHtcblx0Y29uc3Qgb3JkZXJCeU1hcCA9IHtcblx0XHRzdGFydF9kYXRlOiAnVEtUX3N0YXJ0X2RhdGUnLFxuXHRcdGVuZF9kYXRlOiAnVEtUX2VuZF9kYXRlJyxcblx0fTtcblx0cmV0dXJuIGlzVW5kZWZpbmVkKCBvcmRlckJ5TWFwWyBvcmRlckJ5IF0gKSA/XG5cdFx0b3JkZXJCeSA6XG5cdFx0b3JkZXJCeU1hcFsgb3JkZXJCeSBdO1xufTtcblxuLyoqXG4gKiBCdWlsZHMgd2hlcmUgY29uZGl0aW9ucyBmb3IgYW4gdGlja2V0cyBlbmRwb2ludCByZXF1ZXN0IHVzaW5nIHByb3ZpZGVkXG4gKiBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNob3dFeHBpcmVkIFx0V2hldGhlciBvciBub3QgdG8gaW5jbHVkZSBleHBpcmVkIHRpY2tldHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9udGggICAgICAgICAgICBSZXR1cm4gdGlja2V0cyBmb3IgdGhlIGdpdmVuIG1vbnRoLiBDYW4gYmVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdGluIGFueSBtb250aCBmb3JtYXQgcmVjb2duaXplZCBieSBtb21lbnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBmb3JFdmVudElkICAgIFx0SUQgb2YgRXZlbnQgdG8gcmV0cmlldmUgdGlja2V0cyBmb3JcbiAqIEBwYXJhbSB7bnVtYmVyfSBmb3JEYXRldGltZUlkICAgIElEIG9mIERhdGV0aW1lIHRvIHJldHJpZXZlIHRpY2tldHMgZm9yXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgICAgICAgICAgIFx0VGhlIGFzc2VtYmxlZCB3aGVyZSBjb25kaXRpb25zLlxuICovXG5leHBvcnQgY29uc3Qgd2hlcmVDb25kaXRpb25zID0gKCB7XG5cdGZvckV2ZW50SWQgPSAwLFxuXHRmb3JEYXRldGltZUlkID0gMCxcblx0c2hvd0V4cGlyZWQgPSBmYWxzZSxcblx0bW9udGggPSAnbm9uZScsXG59ICkgPT4ge1xuXHRjb25zdCB3aGVyZSA9IFtdO1xuXHRpZiAoICEgc2hvd0V4cGlyZWQgKSB7XG5cdFx0d2hlcmUucHVzaChcblx0XHRcdCd3aGVyZVtUS1RfZW5kX2RhdGUqKmV4cGlyZWRdW109JyArIEdSRUFURVJfVEhBTiArXG5cdFx0XHQnJndoZXJlW1RLVF9lbmRfZGF0ZSoqZXhwaXJlZF1bXT0nICtcblx0XHRcdG5vd0RhdGVBbmRUaW1lLmxvY2FsKCkuZm9ybWF0KClcblx0XHQpO1xuXHR9XG5cdGlmICggbW9udGggJiYgbW9udGggIT09ICdub25lJyApIHtcblx0XHR3aGVyZS5wdXNoKFxuXHRcdFx0J3doZXJlW1RLVF9zdGFydF9kYXRlXVtdPScgKyBHUkVBVEVSX1RIQU5fQU5EX0VRVUFMICtcblx0XHRcdCcmd2hlcmVbVEtUX3N0YXJ0X2RhdGVdW109JyArXG5cdFx0XHRtb21lbnQoKS5tb250aCggbW9udGggKS5zdGFydE9mKCAnbW9udGgnICkubG9jYWwoKS5mb3JtYXQoKVxuXHRcdCk7XG5cdFx0d2hlcmUucHVzaChcblx0XHRcdCd3aGVyZVtUS1RfZW5kX2RhdGVdW109JyArIExFU1NfVEhBTl9BTkRfRVFVQUwgK1xuXHRcdFx0JyZ3aGVyZVtUS1RfZW5kX2RhdGVdW109JyArXG5cdFx0XHRtb21lbnQoKS5tb250aCggbW9udGggKS5lbmRPZiggJ21vbnRoJyApLmxvY2FsKCkuZm9ybWF0KClcblx0XHQpO1xuXHR9XG5cdGZvckV2ZW50SWQgPSBwYXJzZUludCggZm9yRXZlbnRJZCwgMTAgKTtcblx0aWYgKCBmb3JFdmVudElkICE9PSAwICYmICEgaXNOYU4oIGZvckV2ZW50SWQgKSApIHtcblx0XHR3aGVyZS5wdXNoKCAnd2hlcmVbRGF0ZXRpbWUuRXZlbnQuRVZUX0lEXT0nICsgZm9yRXZlbnRJZCApO1xuXHR9XG5cdGZvckRhdGV0aW1lSWQgPSBwYXJzZUludCggZm9yRGF0ZXRpbWVJZCwgMTAgKTtcblx0aWYgKCBmb3JEYXRldGltZUlkICE9PSAwICYmICEgaXNOYU4oIGZvckRhdGV0aW1lSWQgKSApIHtcblx0XHR3aGVyZS5wdXNoKCAnd2hlcmVbRGF0ZXRpbWUuRFRUX0lEXT0nICsgZm9yRGF0ZXRpbWVJZCApO1xuXHR9XG5cdHJldHVybiB3aGVyZS5qb2luKCAnJicgKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIGEgcXVlcnkgc3RyaW5nIGZvciB1c2UgYnkgYSBSRVNUIHJlcXVlc3QgZ2l2ZW4gYSBzZXQgb2YgcXVlcnlEYXRhLlxuICogQHBhcmFtIHsgT2JqZWN0IH0gcXVlcnlEYXRhXG4gKiBAcmV0dXJuIHsgc3RyaW5nIH0gIFJldHVybnMgdGhlIHF1ZXJ5IHN0cmluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFF1ZXJ5U3RyaW5nID0gKCBxdWVyeURhdGEgPSB7fSApID0+IHtcblx0cXVlcnlEYXRhID0geyAuLi5kZWZhdWx0UXVlcnlEYXRhLnF1ZXJ5RGF0YSwgLi4ucXVlcnlEYXRhIH07XG5cdHJldHVybiBiYXNlR2V0UXVlcnlTdHJpbmcoIHF1ZXJ5RGF0YSwgd2hlcmVDb25kaXRpb25zLCBtYXBPcmRlckJ5ICk7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL2FycmF5L2Zyb21cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL2FycmF5L2lzLWFycmF5XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9nZXQtaXRlcmF0b3JcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL2lzLWl0ZXJhYmxlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9qc29uL3N0cmluZ2lmeVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vbWFwXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvY3JlYXRlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZlwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2tleXNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9zZXQtcHJvdG90eXBlLW9mXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9wYXJzZS1pbnRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL3Byb21pc2VcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL3NldFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vc3ltYm9sXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9zeW1ib2wvaXRlcmF0b3JcIik7IiwidmFyIF9BcnJheSRpc0FycmF5ID0gcmVxdWlyZShcIi4uL2NvcmUtanMvYXJyYXkvaXMtYXJyYXlcIik7XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHtcbiAgaWYgKF9BcnJheSRpc0FycmF5KGFycikpIHJldHVybiBhcnI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5V2l0aEhvbGVzOyIsInZhciBfQXJyYXkkaXNBcnJheSA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL2FycmF5L2lzLWFycmF5XCIpO1xuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7XG4gIGlmIChfQXJyYXkkaXNBcnJheShhcnIpKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFycjJbaV0gPSBhcnJbaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycjI7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlXaXRob3V0SG9sZXM7IiwiZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7XG4gIGlmIChzZWxmID09PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIH1cblxuICByZXR1cm4gc2VsZjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXNzZXJ0VGhpc0luaXRpYWxpemVkOyIsInZhciBfUHJvbWlzZSA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL3Byb21pc2VcIik7XG5cbmZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHtcbiAgdHJ5IHtcbiAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZWplY3QoZXJyb3IpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpbmZvLmRvbmUpIHtcbiAgICByZXNvbHZlKHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBfUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgIHJldHVybiBuZXcgX1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXG4gICAgICBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkge1xuICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwibmV4dFwiLCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcInRocm93XCIsIGVycik7XG4gICAgICB9XG5cbiAgICAgIF9uZXh0KHVuZGVmaW5lZCk7XG4gICAgfSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FzeW5jVG9HZW5lcmF0b3I7IiwiZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY2xhc3NDYWxsQ2hlY2s7IiwidmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcblxuICAgIF9PYmplY3QkZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2NyZWF0ZUNsYXNzOyIsInZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIi4uL2NvcmUtanMvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIF9PYmplY3QkZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9kZWZpbmVQcm9wZXJ0eTsiLCJ2YXIgX09iamVjdCRnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9nZXQtcHJvdG90eXBlLW9mXCIpO1xuXG52YXIgX09iamVjdCRzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9zZXQtcHJvdG90eXBlLW9mXCIpO1xuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICBtb2R1bGUuZXhwb3J0cyA9IF9nZXRQcm90b3R5cGVPZiA9IF9PYmplY3Qkc2V0UHJvdG90eXBlT2YgPyBfT2JqZWN0JGdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgICByZXR1cm4gby5fX3Byb3RvX18gfHwgX09iamVjdCRnZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfZ2V0UHJvdG90eXBlT2Y7IiwidmFyIF9PYmplY3QkY3JlYXRlID0gcmVxdWlyZShcIi4uL2NvcmUtanMvb2JqZWN0L2NyZWF0ZVwiKTtcblxudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIi4vc2V0UHJvdG90eXBlT2ZcIik7XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gX09iamVjdCRjcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH1cbiAgfSk7XG4gIGlmIChzdXBlckNsYXNzKSBzZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2luaGVyaXRzOyIsInZhciBfQXJyYXkkZnJvbSA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL2FycmF5L2Zyb21cIik7XG5cbnZhciBfaXNJdGVyYWJsZSA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL2lzLWl0ZXJhYmxlXCIpO1xuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHtcbiAgaWYgKF9pc0l0ZXJhYmxlKE9iamVjdChpdGVyKSkgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZXIpID09PSBcIltvYmplY3QgQXJndW1lbnRzXVwiKSByZXR1cm4gX0FycmF5JGZyb20oaXRlcik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2l0ZXJhYmxlVG9BcnJheTsiLCJ2YXIgX2dldEl0ZXJhdG9yID0gcmVxdWlyZShcIi4uL2NvcmUtanMvZ2V0LWl0ZXJhdG9yXCIpO1xuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7XG4gIHZhciBfYXJyID0gW107XG4gIHZhciBfbiA9IHRydWU7XG4gIHZhciBfZCA9IGZhbHNlO1xuICB2YXIgX2UgPSB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKHZhciBfaSA9IF9nZXRJdGVyYXRvcihhcnIpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2QgPSB0cnVlO1xuICAgIF9lID0gZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF9hcnI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2l0ZXJhYmxlVG9BcnJheUxpbWl0OyIsImZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9ub25JdGVyYWJsZVJlc3Q7IiwiZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2VcIik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX25vbkl0ZXJhYmxlU3ByZWFkOyIsInZhciBfT2JqZWN0JGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JcIik7XG5cbnZhciBfT2JqZWN0JGdldE93blByb3BlcnR5U3ltYm9scyA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9nZXQtb3duLXByb3BlcnR5LXN5bWJvbHNcIik7XG5cbnZhciBfT2JqZWN0JGtleXMgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9vYmplY3Qva2V5c1wiKTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIi4vZGVmaW5lUHJvcGVydHlcIik7XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG5cbiAgICB2YXIgb3duS2V5cyA9IF9PYmplY3Qka2V5cyhzb3VyY2UpO1xuXG4gICAgaWYgKHR5cGVvZiBfT2JqZWN0JGdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3duS2V5cyA9IG93bktleXMuY29uY2F0KF9PYmplY3QkZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgICAgcmV0dXJuIF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlO1xuICAgICAgfSkpO1xuICAgIH1cblxuICAgIG93bktleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfb2JqZWN0U3ByZWFkOyIsInZhciBfdHlwZW9mID0gcmVxdWlyZShcIi4uL2hlbHBlcnMvdHlwZW9mXCIpO1xuXG52YXIgYXNzZXJ0VGhpc0luaXRpYWxpemVkID0gcmVxdWlyZShcIi4vYXNzZXJ0VGhpc0luaXRpYWxpemVkXCIpO1xuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7XG4gIGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgcmV0dXJuIGNhbGw7XG4gIH1cblxuICByZXR1cm4gYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuOyIsInZhciBfT2JqZWN0JHNldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIi4uL2NvcmUtanMvb2JqZWN0L3NldC1wcm90b3R5cGUtb2ZcIik7XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gX3NldFByb3RvdHlwZU9mID0gX09iamVjdCRzZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICAgIG8uX19wcm90b19fID0gcDtcbiAgICByZXR1cm4gbztcbiAgfTtcblxuICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9zZXRQcm90b3R5cGVPZjsiLCJ2YXIgYXJyYXlXaXRoSG9sZXMgPSByZXF1aXJlKFwiLi9hcnJheVdpdGhIb2xlc1wiKTtcblxudmFyIGl0ZXJhYmxlVG9BcnJheUxpbWl0ID0gcmVxdWlyZShcIi4vaXRlcmFibGVUb0FycmF5TGltaXRcIik7XG5cbnZhciBub25JdGVyYWJsZVJlc3QgPSByZXF1aXJlKFwiLi9ub25JdGVyYWJsZVJlc3RcIik7XG5cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkge1xuICByZXR1cm4gYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBpdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IG5vbkl0ZXJhYmxlUmVzdCgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9zbGljZWRUb0FycmF5OyIsInZhciBhcnJheVdpdGhvdXRIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aG91dEhvbGVzXCIpO1xuXG52YXIgaXRlcmFibGVUb0FycmF5ID0gcmVxdWlyZShcIi4vaXRlcmFibGVUb0FycmF5XCIpO1xuXG52YXIgbm9uSXRlcmFibGVTcHJlYWQgPSByZXF1aXJlKFwiLi9ub25JdGVyYWJsZVNwcmVhZFwiKTtcblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikge1xuICByZXR1cm4gYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBpdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBub25JdGVyYWJsZVNwcmVhZCgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF90b0NvbnN1bWFibGVBcnJheTsiLCJ2YXIgX1N5bWJvbCRpdGVyYXRvciA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL3N5bWJvbC9pdGVyYXRvclwiKTtcblxudmFyIF9TeW1ib2wgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9zeW1ib2xcIik7XG5cbmZ1bmN0aW9uIF90eXBlb2YyKG9iaikgeyBpZiAodHlwZW9mIF9TeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgX1N5bWJvbCRpdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mMiA9IGZ1bmN0aW9uIF90eXBlb2YyKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZjIgPSBmdW5jdGlvbiBfdHlwZW9mMihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgX1N5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gX1N5bWJvbCAmJiBvYmogIT09IF9TeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2YyKG9iaik7IH1cblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgaWYgKHR5cGVvZiBfU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgX3R5cGVvZjIoX1N5bWJvbCRpdGVyYXRvcikgPT09IFwic3ltYm9sXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIF90eXBlb2YyKG9iaik7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgX1N5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gX1N5bWJvbCAmJiBvYmogIT09IF9TeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IF90eXBlb2YyKG9iaik7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfdHlwZW9mKG9iaik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3R5cGVvZjsiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbi8vIFRoaXMgbWV0aG9kIG9mIG9idGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdCBuZWVkcyB0byBiZVxuLy8ga2VwdCBpZGVudGljYWwgdG8gdGhlIHdheSBpdCBpcyBvYnRhaW5lZCBpbiBydW50aW1lLmpzXG52YXIgZyA9IChmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMgfHwgKHR5cGVvZiBzZWxmID09PSBcIm9iamVjdFwiICYmIHNlbGYpO1xufSkoKSB8fCBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG5cbi8vIFVzZSBgZ2V0T3duUHJvcGVydHlOYW1lc2AgYmVjYXVzZSBub3QgYWxsIGJyb3dzZXJzIHN1cHBvcnQgY2FsbGluZ1xuLy8gYGhhc093blByb3BlcnR5YCBvbiB0aGUgZ2xvYmFsIGBzZWxmYCBvYmplY3QgaW4gYSB3b3JrZXIuIFNlZSAjMTgzLlxudmFyIGhhZFJ1bnRpbWUgPSBnLnJlZ2VuZXJhdG9yUnVudGltZSAmJlxuICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhnKS5pbmRleE9mKFwicmVnZW5lcmF0b3JSdW50aW1lXCIpID49IDA7XG5cbi8vIFNhdmUgdGhlIG9sZCByZWdlbmVyYXRvclJ1bnRpbWUgaW4gY2FzZSBpdCBuZWVkcyB0byBiZSByZXN0b3JlZCBsYXRlci5cbnZhciBvbGRSdW50aW1lID0gaGFkUnVudGltZSAmJiBnLnJlZ2VuZXJhdG9yUnVudGltZTtcblxuLy8gRm9yY2UgcmVldmFsdXRhdGlvbiBvZiBydW50aW1lLmpzLlxuZy5yZWdlbmVyYXRvclJ1bnRpbWUgPSB1bmRlZmluZWQ7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vcnVudGltZVwiKTtcblxuaWYgKGhhZFJ1bnRpbWUpIHtcbiAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcnVudGltZS5cbiAgZy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBvbGRSdW50aW1lO1xufSBlbHNlIHtcbiAgLy8gUmVtb3ZlIHRoZSBnbG9iYWwgcHJvcGVydHkgYWRkZWQgYnkgcnVudGltZS5qcy5cbiAgdHJ5IHtcbiAgICBkZWxldGUgZy5yZWdlbmVyYXRvclJ1bnRpbWU7XG4gIH0gY2F0Y2goZSkge1xuICAgIGcucmVnZW5lcmF0b3JSdW50aW1lID0gdW5kZWZpbmVkO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbiEoZnVuY3Rpb24oZ2xvYmFsKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBPcCA9IE9iamVjdC5wcm90b3R5cGU7XG4gIHZhciBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIHVuZGVmaW5lZDsgLy8gTW9yZSBjb21wcmVzc2libGUgdGhhbiB2b2lkIDAuXG4gIHZhciAkU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiID8gU3ltYm9sIDoge307XG4gIHZhciBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgXCJAQGl0ZXJhdG9yXCI7XG4gIHZhciBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCI7XG4gIHZhciB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgXCJAQHRvU3RyaW5nVGFnXCI7XG5cbiAgdmFyIGluTW9kdWxlID0gdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIjtcbiAgdmFyIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lO1xuICBpZiAocnVudGltZSkge1xuICAgIGlmIChpbk1vZHVsZSkge1xuICAgICAgLy8gSWYgcmVnZW5lcmF0b3JSdW50aW1lIGlzIGRlZmluZWQgZ2xvYmFsbHkgYW5kIHdlJ3JlIGluIGEgbW9kdWxlLFxuICAgICAgLy8gbWFrZSB0aGUgZXhwb3J0cyBvYmplY3QgaWRlbnRpY2FsIHRvIHJlZ2VuZXJhdG9yUnVudGltZS5cbiAgICAgIG1vZHVsZS5leHBvcnRzID0gcnVudGltZTtcbiAgICB9XG4gICAgLy8gRG9uJ3QgYm90aGVyIGV2YWx1YXRpbmcgdGhlIHJlc3Qgb2YgdGhpcyBmaWxlIGlmIHRoZSBydW50aW1lIHdhc1xuICAgIC8vIGFscmVhZHkgZGVmaW5lZCBnbG9iYWxseS5cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBEZWZpbmUgdGhlIHJ1bnRpbWUgZ2xvYmFsbHkgKGFzIGV4cGVjdGVkIGJ5IGdlbmVyYXRlZCBjb2RlKSBhcyBlaXRoZXJcbiAgLy8gbW9kdWxlLmV4cG9ydHMgKGlmIHdlJ3JlIGluIGEgbW9kdWxlKSBvciBhIG5ldywgZW1wdHkgb2JqZWN0LlxuICBydW50aW1lID0gZ2xvYmFsLnJlZ2VuZXJhdG9yUnVudGltZSA9IGluTW9kdWxlID8gbW9kdWxlLmV4cG9ydHMgOiB7fTtcblxuICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gSWYgb3V0ZXJGbiBwcm92aWRlZCBhbmQgb3V0ZXJGbi5wcm90b3R5cGUgaXMgYSBHZW5lcmF0b3IsIHRoZW4gb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IuXG4gICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3I7XG4gICAgdmFyIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUocHJvdG9HZW5lcmF0b3IucHJvdG90eXBlKTtcbiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTtcblxuICAgIC8vIFRoZSAuX2ludm9rZSBtZXRob2QgdW5pZmllcyB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuXG4gICAgZ2VuZXJhdG9yLl9pbnZva2UgPSBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBydW50aW1lLndyYXAgPSB3cmFwO1xuXG4gIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAvLyByZWNvcmQgbGlrZSBjb250ZXh0LnRyeUVudHJpZXNbaV0uY29tcGxldGlvbi4gVGhpcyBpbnRlcmZhY2UgY291bGRcbiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlXG4gIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1ldGhvZCB3ZSB3YW50IHRvIGNhbGwsIHNvIHRoZXJlJ3Mgbm8gbmVlZFxuICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nXG4gIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gIC8vIGluIGV2ZXJ5IGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gdG91Y2ggdGhlIGFyZ3VtZW50cyBvYmplY3QuIFRoZVxuICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoXG4gIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkWWllbGQgPSBcInN1c3BlbmRlZFlpZWxkXCI7XG4gIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG5cbiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAvLyBicmVha2luZyBvdXQgb2YgdGhlIGRpc3BhdGNoIHN3aXRjaCBzdGF0ZW1lbnQuXG4gIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307XG5cbiAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kXG4gIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91clxuICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLlxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICAvLyBUaGlzIGlzIGEgcG9seWZpbGwgZm9yICVJdGVyYXRvclByb3RvdHlwZSUgZm9yIGVudmlyb25tZW50cyB0aGF0XG4gIC8vIGRvbid0IG5hdGl2ZWx5IHN1cHBvcnQgaXQuXG4gIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuICBJdGVyYXRvclByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuICB2YXIgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7XG4gIGlmIChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJlxuICAgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmXG4gICAgICBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpKSB7XG4gICAgLy8gVGhpcyBlbnZpcm9ubWVudCBoYXMgYSBuYXRpdmUgJUl0ZXJhdG9yUHJvdG90eXBlJTsgdXNlIGl0IGluc3RlYWRcbiAgICAvLyBvZiB0aGUgcG9seWZpbGwuXG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxuXG4gIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9XG4gICAgR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHcC5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZVt0b1N0cmluZ1RhZ1N5bWJvbF0gPVxuICAgIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIHByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIHZhciBjdG9yID0gdHlwZW9mIGdlbkZ1biA9PT0gXCJmdW5jdGlvblwiICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gY3RvclxuICAgICAgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fFxuICAgICAgICAvLyBGb3IgdGhlIG5hdGl2ZSBHZW5lcmF0b3JGdW5jdGlvbiBjb25zdHJ1Y3RvciwgdGhlIGJlc3Qgd2UgY2FuXG4gICAgICAgIC8vIGRvIGlzIHRvIGNoZWNrIGl0cyAubmFtZSBwcm9wZXJ0eS5cbiAgICAgICAgKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSA9PT0gXCJHZW5lcmF0b3JGdW5jdGlvblwiXG4gICAgICA6IGZhbHNlO1xuICB9O1xuXG4gIHJ1bnRpbWUubWFyayA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICAgICAgaWYgKCEodG9TdHJpbmdUYWdTeW1ib2wgaW4gZ2VuRnVuKSkge1xuICAgICAgICBnZW5GdW5bdG9TdHJpbmdUYWdTeW1ib2xdID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLlxuICBydW50aW1lLmF3cmFwID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZztcbiAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgaW52b2tlKFwibmV4dFwiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi5cbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgIC8vIElmIGEgcmVqZWN0ZWQgUHJvbWlzZSB3YXMgeWllbGRlZCwgdGhyb3cgdGhlIHJlamVjdGlvbiBiYWNrXG4gICAgICAgICAgLy8gaW50byB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSBoYW5kbGVkIHRoZXJlLlxuICAgICAgICAgIHJldHVybiBpbnZva2UoXCJ0aHJvd1wiLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9XG4gICAgICAgIC8vIElmIGVucXVldWUgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIHdhaXQgdW50aWxcbiAgICAgICAgLy8gYWxsIHByZXZpb3VzIFByb21pc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyBpbnZva2UsXG4gICAgICAgIC8vIHNvIHRoYXQgcmVzdWx0cyBhcmUgYWx3YXlzIGRlbGl2ZXJlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4gSWZcbiAgICAgICAgLy8gZW5xdWV1ZSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiBpdCBpcyBpbXBvcnRhbnQgdG9cbiAgICAgICAgLy8gY2FsbCBpbnZva2UgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGZpcmUsXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBoYXMgdGhlIG9wcG9ydHVuaXR5IHRvIGRvXG4gICAgICAgIC8vIGFueSBuZWNlc3Nhcnkgc2V0dXAgaW4gYSBwcmVkaWN0YWJsZSB3YXkuIFRoaXMgcHJlZGljdGFiaWxpdHlcbiAgICAgICAgLy8gaXMgd2h5IHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkgaW52b2tlcyBpdHNcbiAgICAgICAgLy8gZXhlY3V0b3IgY2FsbGJhY2ssIGFuZCB3aHkgYXN5bmMgZnVuY3Rpb25zIHN5bmNocm9ub3VzbHlcbiAgICAgICAgLy8gZXhlY3V0ZSBjb2RlIGJlZm9yZSB0aGUgZmlyc3QgYXdhaXQuIFNpbmNlIHdlIGltcGxlbWVudCBzaW1wbGVcbiAgICAgICAgLy8gYXN5bmMgZnVuY3Rpb25zIGluIHRlcm1zIG9mIGFzeW5jIGdlbmVyYXRvcnMsIGl0IGlzIGVzcGVjaWFsbHlcbiAgICAgICAgLy8gaW1wb3J0YW50IHRvIGdldCB0aGlzIHJpZ2h0LCBldmVuIHRob3VnaCBpdCByZXF1aXJlcyBjYXJlLlxuICAgICAgICBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihcbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyxcbiAgICAgICAgICAvLyBBdm9pZCBwcm9wYWdhdGluZyBmYWlsdXJlcyB0byBQcm9taXNlcyByZXR1cm5lZCBieSBsYXRlclxuICAgICAgICAgIC8vIGludm9jYXRpb25zIG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZ1xuICAgICAgICApIDogY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgdGhlIHVuaWZpZWQgaGVscGVyIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gaW1wbGVtZW50IC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gKHNlZSBkZWZpbmVJdGVyYXRvck1ldGhvZHMpLlxuICAgIHRoaXMuX2ludm9rZSA9IGVucXVldWU7XG4gIH1cblxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO1xuICBBc3luY0l0ZXJhdG9yLnByb3RvdHlwZVthc3luY0l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgcnVudGltZS5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvcjtcblxuICAvLyBOb3RlIHRoYXQgc2ltcGxlIGFzeW5jIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mXG4gIC8vIEFzeW5jSXRlcmF0b3Igb2JqZWN0czsgdGhleSBqdXN0IHJldHVybiBhIFByb21pc2UgZm9yIHRoZSB2YWx1ZSBvZlxuICAvLyB0aGUgZmluYWwgcmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBpdGVyYXRvci5cbiAgcnVudGltZS5hc3luYyA9IGZ1bmN0aW9uKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpXG4gICAgKTtcblxuICAgIHJldHVybiBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbilcbiAgICAgID8gaXRlciAvLyBJZiBvdXRlckZuIGlzIGEgZ2VuZXJhdG9yLCByZXR1cm4gdGhlIGZ1bGwgaXRlcmF0b3IuXG4gICAgICA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQ7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlRXhlY3V0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHtcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgdGhyb3cgYXJnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmUgZm9yZ2l2aW5nLCBwZXIgMjUuMy4zLjMuMyBvZiB0aGUgc3BlYzpcbiAgICAgICAgLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWdlbmVyYXRvcnJlc3VtZVxuICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIGNvbnRleHQuYXJnID0gYXJnO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlO1xuICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7XG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgIC8vIFNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAgIHRocm93IGNvbnRleHQuYXJnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgICBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjb250ZXh0LmFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZSA9IEdlblN0YXRlRXhlY3V0aW5nO1xuXG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGlubmVyRm4sIHdlIGxlYXZlIHN0YXRlID09PVxuICAgICAgICAgIC8vIEdlblN0YXRlRXhlY3V0aW5nIGFuZCBsb29wIGJhY2sgZm9yIGFub3RoZXIgaW52b2NhdGlvbi5cbiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZVxuICAgICAgICAgICAgPyBHZW5TdGF0ZUNvbXBsZXRlZFxuICAgICAgICAgICAgOiBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuXG4gICAgICAgICAgaWYgKHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZXhjZXB0aW9uIGJ5IGxvb3BpbmcgYmFjayBhcm91bmQgdG8gdGhlXG4gICAgICAgICAgLy8gY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZykgY2FsbCBhYm92ZS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gQ2FsbCBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF0oY29udGV4dC5hcmcpIGFuZCBoYW5kbGUgdGhlXG4gIC8vIHJlc3VsdCwgZWl0aGVyIGJ5IHJldHVybmluZyBhIHsgdmFsdWUsIGRvbmUgfSByZXN1bHQgZnJvbSB0aGVcbiAgLy8gZGVsZWdhdGUgaXRlcmF0b3IsIG9yIGJ5IG1vZGlmeWluZyBjb250ZXh0Lm1ldGhvZCBhbmQgY29udGV4dC5hcmcsXG4gIC8vIHNldHRpbmcgY29udGV4dC5kZWxlZ2F0ZSB0byBudWxsLCBhbmQgcmV0dXJuaW5nIHRoZSBDb250aW51ZVNlbnRpbmVsLlxuICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXTtcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEEgLnRocm93IG9yIC5yZXR1cm4gd2hlbiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIG5vIC50aHJvd1xuICAgICAgLy8gbWV0aG9kIGFsd2F5cyB0ZXJtaW5hdGVzIHRoZSB5aWVsZCogbG9vcC5cbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICBpZiAoZGVsZWdhdGUuaXRlcmF0b3IucmV0dXJuKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBhIHJldHVybiBtZXRob2QsIGdpdmUgaXQgYVxuICAgICAgICAgIC8vIGNoYW5jZSB0byBjbGVhbiB1cC5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG5cbiAgICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgLy8gSWYgbWF5YmVJbnZva2VEZWxlZ2F0ZShjb250ZXh0KSBjaGFuZ2VkIGNvbnRleHQubWV0aG9kIGZyb21cbiAgICAgICAgICAgIC8vIFwicmV0dXJuXCIgdG8gXCJ0aHJvd1wiLCBsZXQgdGhhdCBvdmVycmlkZSB0aGUgVHlwZUVycm9yIGJlbG93LlxuICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBcIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJ3Rocm93JyBtZXRob2RcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7XG5cbiAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZztcblxuICAgIGlmICghIGluZm8pIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3RcIik7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgIC8vIEFzc2lnbiB0aGUgcmVzdWx0IG9mIHRoZSBmaW5pc2hlZCBkZWxlZ2F0ZSB0byB0aGUgdGVtcG9yYXJ5XG4gICAgICAvLyB2YXJpYWJsZSBzcGVjaWZpZWQgYnkgZGVsZWdhdGUucmVzdWx0TmFtZSAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWU7XG5cbiAgICAgIC8vIFJlc3VtZSBleGVjdXRpb24gYXQgdGhlIGRlc2lyZWQgbG9jYXRpb24gKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7XG5cbiAgICAgIC8vIElmIGNvbnRleHQubWV0aG9kIHdhcyBcInRocm93XCIgYnV0IHRoZSBkZWxlZ2F0ZSBoYW5kbGVkIHRoZVxuICAgICAgLy8gZXhjZXB0aW9uLCBsZXQgdGhlIG91dGVyIGdlbmVyYXRvciBwcm9jZWVkIG5vcm1hbGx5LiBJZlxuICAgICAgLy8gY29udGV4dC5tZXRob2Qgd2FzIFwibmV4dFwiLCBmb3JnZXQgY29udGV4dC5hcmcgc2luY2UgaXQgaGFzIGJlZW5cbiAgICAgIC8vIFwiY29uc3VtZWRcIiBieSB0aGUgZGVsZWdhdGUgaXRlcmF0b3IuIElmIGNvbnRleHQubWV0aG9kIHdhc1xuICAgICAgLy8gXCJyZXR1cm5cIiwgYWxsb3cgdGhlIG9yaWdpbmFsIC5yZXR1cm4gY2FsbCB0byBjb250aW51ZSBpbiB0aGVcbiAgICAgIC8vIG91dGVyIGdlbmVyYXRvci5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCAhPT0gXCJyZXR1cm5cIikge1xuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZS15aWVsZCB0aGUgcmVzdWx0IHJldHVybmVkIGJ5IHRoZSBkZWxlZ2F0ZSBtZXRob2QuXG4gICAgICByZXR1cm4gaW5mbztcbiAgICB9XG5cbiAgICAvLyBUaGUgZGVsZWdhdGUgaXRlcmF0b3IgaXMgZmluaXNoZWQsIHNvIGZvcmdldCBpdCBhbmQgY29udGludWUgd2l0aFxuICAgIC8vIHRoZSBvdXRlciBnZW5lcmF0b3IuXG4gICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gIH1cblxuICAvLyBEZWZpbmUgR2VuZXJhdG9yLnByb3RvdHlwZS57bmV4dCx0aHJvdyxyZXR1cm59IGluIHRlcm1zIG9mIHRoZVxuICAvLyB1bmlmaWVkIC5faW52b2tlIGhlbHBlciBtZXRob2QuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCk7XG5cbiAgR3BbdG9TdHJpbmdUYWdTeW1ib2xdID0gXCJHZW5lcmF0b3JcIjtcblxuICAvLyBBIEdlbmVyYXRvciBzaG91bGQgYWx3YXlzIHJldHVybiBpdHNlbGYgYXMgdGhlIGl0ZXJhdG9yIG9iamVjdCB3aGVuIHRoZVxuICAvLyBAQGl0ZXJhdG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBpdC4gU29tZSBicm93c2VycycgaW1wbGVtZW50YXRpb25zIG9mIHRoZVxuICAvLyBpdGVyYXRvciBwcm90b3R5cGUgY2hhaW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50IHRoaXMsIGNhdXNpbmcgdGhlIEdlbmVyYXRvclxuICAvLyBvYmplY3QgdG8gbm90IGJlIHJldHVybmVkIGZyb20gdGhpcyBjYWxsLiBUaGlzIGVuc3VyZXMgdGhhdCBkb2Vzbid0IGhhcHBlbi5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9pc3N1ZXMvMjc0IGZvciBtb3JlIGRldGFpbHMuXG4gIEdwW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEdwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gIH07XG5cbiAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHtcbiAgICB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9O1xuXG4gICAgaWYgKDEgaW4gbG9jcykge1xuICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdO1xuICAgIH1cblxuICAgIGlmICgyIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdO1xuICAgICAgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdO1xuICAgIH1cblxuICAgIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICByZWNvcmQudHlwZSA9IFwibm9ybWFsXCI7XG4gICAgZGVsZXRlIHJlY29yZC5hcmc7XG4gICAgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBUaGUgcm9vdCBlbnRyeSBvYmplY3QgKGVmZmVjdGl2ZWx5IGEgdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgY2F0Y2hcbiAgICAvLyBvciBhIGZpbmFsbHkgYmxvY2spIGdpdmVzIHVzIGEgcGxhY2UgdG8gc3RvcmUgdmFsdWVzIHRocm93biBmcm9tXG4gICAgLy8gbG9jYXRpb25zIHdoZXJlIHRoZXJlIGlzIG5vIGVuY2xvc2luZyB0cnkgc3RhdGVtZW50LlxuICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogXCJyb290XCIgfV07XG4gICAgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpO1xuICAgIHRoaXMucmVzZXQodHJ1ZSk7XG4gIH1cblxuICBydW50aW1lLmtleXMgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBrZXlzLnJldmVyc2UoKTtcblxuICAgIC8vIFJhdGhlciB0aGFuIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBhIG5leHQgbWV0aG9kLCB3ZSBrZWVwXG4gICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi5cbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICBuZXh0LnZhbHVlID0ga2V5O1xuICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRvIGF2b2lkIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgb2JqZWN0LCB3ZSBqdXN0IGhhbmcgdGhlIC52YWx1ZVxuICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXNcbiAgICAgIC8vIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBtaW5pZmllciB3aWxsIG5vdCBhbm9ueW1pemUgdGhlIGZ1bmN0aW9uLlxuICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07XG4gICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgaXRlcmFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7XG4gICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBhbiBpdGVyYXRvciB3aXRoIG5vIHZhbHVlcy5cbiAgICByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07XG4gIH1cbiAgcnVudGltZS52YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcblxuICAgIHJlc2V0OiBmdW5jdGlvbihza2lwVGVtcFJlc2V0KSB7XG4gICAgICB0aGlzLnByZXYgPSAwO1xuICAgICAgdGhpcy5uZXh0ID0gMDtcbiAgICAgIC8vIFJlc2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcblxuICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7XG5cbiAgICAgIGlmICghc2tpcFRlbXBSZXNldCkge1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcbiAgICAgICAgICAvLyBOb3Qgc3VyZSBhYm91dCB0aGUgb3B0aW1hbCBvcmRlciBvZiB0aGVzZSBjb25kaXRpb25zOlxuICAgICAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gXCJ0XCIgJiZcbiAgICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiZcbiAgICAgICAgICAgICAgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSkge1xuICAgICAgICAgICAgdGhpc1tuYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuXG4gICAgICB2YXIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdO1xuICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjtcbiAgICAgIGlmIChyb290UmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuXG4gICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkge1xuICAgICAgICByZWNvcmQudHlwZSA9IFwidGhyb3dcIjtcbiAgICAgICAgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbjtcbiAgICAgICAgY29udGV4dC5uZXh0ID0gbG9jO1xuXG4gICAgICAgIGlmIChjYXVnaHQpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgIC8vIHRoZW4gbGV0IHRoYXQgY2F0Y2ggYmxvY2sgaGFuZGxlIHRoZSBleGNlcHRpb24gbm9ybWFsbHkuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhISBjYXVnaHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSBcInJvb3RcIikge1xuICAgICAgICAgIC8vIEV4Y2VwdGlvbiB0aHJvd24gb3V0c2lkZSBvZiBhbnkgdHJ5IGJsb2NrIHRoYXQgY291bGQgaGFuZGxlXG4gICAgICAgICAgLy8gaXQsIHNvIHNldCB0aGUgY29tcGxldGlvbiB2YWx1ZSBvZiB0aGUgZW50aXJlIGZ1bmN0aW9uIHRvXG4gICAgICAgICAgLy8gdGhyb3cgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXR1cm4gaGFuZGxlKFwiZW5kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKTtcbiAgICAgICAgICB2YXIgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7XG5cbiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFicnVwdDogZnVuY3Rpb24odHlwZSwgYXJnKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIikgJiZcbiAgICAgICAgICAgIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSAmJlxuICAgICAgICAgICh0eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICAgdHlwZSA9PT0gXCJjb250aW51ZVwiKSAmJlxuICAgICAgICAgIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmXG4gICAgICAgICAgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgIC8vIElnbm9yZSB0aGUgZmluYWxseSBlbnRyeSBpZiBjb250cm9sIGlzIG5vdCBqdW1waW5nIHRvIGFcbiAgICAgICAgLy8gbG9jYXRpb24gb3V0c2lkZSB0aGUgdHJ5L2NhdGNoIGJsb2NrLlxuICAgICAgICBmaW5hbGx5RW50cnkgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgIHJlY29yZC50eXBlID0gdHlwZTtcbiAgICAgIHJlY29yZC5hcmcgPSBhcmc7XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7XG4gICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgIH0sXG5cbiAgICBjb21wbGV0ZTogZnVuY3Rpb24ocmVjb3JkLCBhZnRlckxvYykge1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICByZWNvcmQudHlwZSA9PT0gXCJjb250aW51ZVwiKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IHJlY29yZC5hcmc7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInJldHVyblwiKSB7XG4gICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICB0aGlzLm5leHQgPSBcImVuZFwiO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBhZnRlckxvYykge1xuICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbih0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb25cbiAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24oaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgIC8vIERlbGliZXJhdGVseSBmb3JnZXQgdGhlIGxhc3Qgc2VudCB2YWx1ZSBzbyB0aGF0IHdlIGRvbid0XG4gICAgICAgIC8vIGFjY2lkZW50YWxseSBwYXNzIGl0IG9uIHRvIHRoZSBkZWxlZ2F0ZS5cbiAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cbiAgfTtcbn0pKFxuICAvLyBJbiBzbG9wcHkgbW9kZSwgdW5ib3VuZCBgdGhpc2AgcmVmZXJzIHRvIHRoZSBnbG9iYWwgb2JqZWN0LCBmYWxsYmFjayB0b1xuICAvLyBGdW5jdGlvbiBjb25zdHJ1Y3RvciBpZiB3ZSdyZSBpbiBnbG9iYWwgc3RyaWN0IG1vZGUuIFRoYXQgaXMgc2FkbHkgYSBmb3JtXG4gIC8vIG9mIGluZGlyZWN0IGV2YWwgd2hpY2ggdmlvbGF0ZXMgQ29udGVudCBTZWN1cml0eSBQb2xpY3kuXG4gIChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcyB8fCAodHlwZW9mIHNlbGYgPT09IFwib2JqZWN0XCIgJiYgc2VsZik7XG4gIH0pKCkgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpXG4pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZVwiKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR3byBhcnJheXMgYXJlIHNoYWxsb3cgZXF1YWwsIG9yIGZhbHNlIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhIEZpcnN0IGFycmF5IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge0FycmF5fSBiIFNlY29uZCBhcnJheSB0byBjb21wYXJlLlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHR3byBhcnJheXMgYXJlIHNoYWxsb3cgZXF1YWwuXG4gKi9cbmZ1bmN0aW9uIGlzU2hhbGxvd0VxdWFsQXJyYXlzKCBhLCBiICkge1xuXHR2YXIgaTtcblxuXHRpZiAoIGEgPT09IGIgKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRpZiAoIGEubGVuZ3RoICE9PSBiLmxlbmd0aCApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRmb3IgKCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKysgKSB7XG5cdFx0aWYgKCBhWyBpIF0gIT09IGJbIGkgXSApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1NoYWxsb3dFcXVhbEFycmF5cztcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBJbnRlcm5hbCBkZXBlbmRlbmNpZXM7XG4gKi9cbnZhciBpc1NoYWxsb3dFcXVhbE9iamVjdHMgPSByZXF1aXJlKCAnLi9vYmplY3RzJyApO1xudmFyIGlzU2hhbGxvd0VxdWFsQXJyYXlzID0gcmVxdWlyZSggJy4vYXJyYXlzJyApO1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gYXJyYXlzIG9yIG9iamVjdHMgYXJlIHNoYWxsb3cgZXF1YWwsIG9yIGZhbHNlXG4gKiBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHsoQXJyYXl8T2JqZWN0KX0gYSBGaXJzdCBvYmplY3Qgb3IgYXJyYXkgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7KEFycmF5fE9iamVjdCl9IGIgU2Vjb25kIG9iamVjdCBvciBhcnJheSB0byBjb21wYXJlLlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHR3byB2YWx1ZXMgYXJlIHNoYWxsb3cgZXF1YWwuXG4gKi9cbmZ1bmN0aW9uIGlzU2hhbGxvd0VxdWFsKCBhLCBiICkge1xuXHRpZiAoIGEgJiYgYiApIHtcblx0XHRpZiAoIGEuY29uc3RydWN0b3IgPT09IE9iamVjdCAmJiBiLmNvbnN0cnVjdG9yID09PSBPYmplY3QgKSB7XG5cdFx0XHRyZXR1cm4gaXNTaGFsbG93RXF1YWxPYmplY3RzKCBhLCBiICk7XG5cdFx0fSBlbHNlIGlmICggaXNBcnJheSggYSApICYmIGlzQXJyYXkoIGIgKSApIHtcblx0XHRcdHJldHVybiBpc1NoYWxsb3dFcXVhbEFycmF5cyggYSwgYiApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhID09PSBiO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU2hhbGxvd0VxdWFsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIga2V5cyA9IE9iamVjdC5rZXlzO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIG9iamVjdHMgYXJlIHNoYWxsb3cgZXF1YWwsIG9yIGZhbHNlIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYSBGaXJzdCBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBiIFNlY29uZCBvYmplY3QgdG8gY29tcGFyZS5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSB0d28gb2JqZWN0cyBhcmUgc2hhbGxvdyBlcXVhbC5cbiAqL1xuZnVuY3Rpb24gaXNTaGFsbG93RXF1YWxPYmplY3RzKCBhLCBiICkge1xuXHR2YXIgYUtleXMsIGJLZXlzLCBpLCBrZXk7XG5cblx0aWYgKCBhID09PSBiICkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0YUtleXMgPSBrZXlzKCBhICk7XG5cdGJLZXlzID0ga2V5cyggYiApO1xuXG5cdGlmICggYUtleXMubGVuZ3RoICE9PSBiS2V5cy5sZW5ndGggKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0aSA9IDA7XG5cblx0d2hpbGUgKCBpIDwgYUtleXMubGVuZ3RoICkge1xuXHRcdGtleSA9IGFLZXlzWyBpIF07XG5cdFx0aWYgKCBhWyBrZXkgXSAhPT0gYlsga2V5IF0gKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aSsrO1xuXHR9XG5cblx0cmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTaGFsbG93RXF1YWxPYmplY3RzO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5hcnJheS5mcm9tJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5BcnJheS5mcm9tO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYuYXJyYXkuaXMtYXJyYXknKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLkFycmF5LmlzQXJyYXk7XG4iLCJyZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9tb2R1bGVzL2NvcmUuZ2V0LWl0ZXJhdG9yJyk7XG4iLCJyZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9tb2R1bGVzL2NvcmUuaXMtaXRlcmFibGUnKTtcbiIsInZhciBjb3JlID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpO1xudmFyICRKU09OID0gY29yZS5KU09OIHx8IChjb3JlLkpTT04gPSB7IHN0cmluZ2lmeTogSlNPTi5zdHJpbmdpZnkgfSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHJldHVybiAkSlNPTi5zdHJpbmdpZnkuYXBwbHkoJEpTT04sIGFyZ3VtZW50cyk7XG59O1xuIiwicmVxdWlyZSgnLi4vbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm1hcCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczcubWFwLnRvLWpzb24nKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM3Lm1hcC5vZicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczcubWFwLmZyb20nKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vbW9kdWxlcy9fY29yZScpLk1hcDtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5jcmVhdGUnKTtcbnZhciAkT2JqZWN0ID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdDtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JlYXRlKFAsIEQpIHtcbiAgcmV0dXJuICRPYmplY3QuY3JlYXRlKFAsIEQpO1xufTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydHknKTtcbnZhciAkT2JqZWN0ID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdDtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgZGVzYykge1xuICByZXR1cm4gJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBkZXNjKTtcbn07XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgJE9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KSB7XG4gIHJldHVybiAkT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KTtcbn07XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5zeW1ib2wnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LXByb3RvdHlwZS1vZicpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LmtleXMnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdC5rZXlzO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LnNldC1wcm90b3R5cGUtb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdC5zZXRQcm90b3R5cGVPZjtcbiIsInJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnBhcnNlLWludCcpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9tb2R1bGVzL19jb3JlJykucGFyc2VJbnQ7XG4iLCJyZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYucHJvbWlzZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczcucHJvbWlzZS5maW5hbGx5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNy5wcm9taXNlLnRyeScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9tb2R1bGVzL19jb3JlJykuUHJvbWlzZTtcbiIsInJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zZXQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM3LnNldC50by1qc29uJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNy5zZXQub2YnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM3LnNldC5mcm9tJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvX2NvcmUnKS5TZXQ7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5zeW1ib2wnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM3LnN5bWJvbC5hc3luYy1pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczcuc3ltYm9sLm9ic2VydmFibGUnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLlN5bWJvbDtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX3drcy1leHQnKS5mKCdpdGVyYXRvcicpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgQ29uc3RydWN0b3IsIG5hbWUsIGZvcmJpZGRlbkZpZWxkKSB7XG4gIGlmICghKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpIHx8IChmb3JiaWRkZW5GaWVsZCAhPT0gdW5kZWZpbmVkICYmIGZvcmJpZGRlbkZpZWxkIGluIGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihuYW1lICsgJzogaW5jb3JyZWN0IGludm9jYXRpb24hJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsInZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyLCBJVEVSQVRPUikge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGZvck9mKGl0ZXIsIGZhbHNlLCByZXN1bHQucHVzaCwgcmVzdWx0LCBJVEVSQVRPUik7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gdG9JT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIGlmICh2YWx1ZSAhPSB2YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjaW5kZXhPZiBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pIHtcbiAgICAgIGlmIChPW2luZGV4XSA9PT0gZWwpIHJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG4iLCIvLyAwIC0+IEFycmF5I2ZvckVhY2hcbi8vIDEgLT4gQXJyYXkjbWFwXG4vLyAyIC0+IEFycmF5I2ZpbHRlclxuLy8gMyAtPiBBcnJheSNzb21lXG4vLyA0IC0+IEFycmF5I2V2ZXJ5XG4vLyA1IC0+IEFycmF5I2ZpbmRcbi8vIDYgLT4gQXJyYXkjZmluZEluZGV4XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgYXNjID0gcmVxdWlyZSgnLi9fYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFRZUEUsICRjcmVhdGUpIHtcbiAgdmFyIElTX01BUCA9IFRZUEUgPT0gMTtcbiAgdmFyIElTX0ZJTFRFUiA9IFRZUEUgPT0gMjtcbiAgdmFyIElTX1NPTUUgPSBUWVBFID09IDM7XG4gIHZhciBJU19FVkVSWSA9IFRZUEUgPT0gNDtcbiAgdmFyIElTX0ZJTkRfSU5ERVggPSBUWVBFID09IDY7XG4gIHZhciBOT19IT0xFUyA9IFRZUEUgPT0gNSB8fCBJU19GSU5EX0lOREVYO1xuICB2YXIgY3JlYXRlID0gJGNyZWF0ZSB8fCBhc2M7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQpIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgc2VsZiA9IElPYmplY3QoTyk7XG4gICAgdmFyIGYgPSBjdHgoY2FsbGJhY2tmbiwgdGhhdCwgMyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKHNlbGYubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciByZXN1bHQgPSBJU19NQVAgPyBjcmVhdGUoJHRoaXMsIGxlbmd0aCkgOiBJU19GSUxURVIgPyBjcmVhdGUoJHRoaXMsIDApIDogdW5kZWZpbmVkO1xuICAgIHZhciB2YWwsIHJlcztcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKE5PX0hPTEVTIHx8IGluZGV4IGluIHNlbGYpIHtcbiAgICAgIHZhbCA9IHNlbGZbaW5kZXhdO1xuICAgICAgcmVzID0gZih2YWwsIGluZGV4LCBPKTtcbiAgICAgIGlmIChUWVBFKSB7XG4gICAgICAgIGlmIChJU19NQVApIHJlc3VsdFtpbmRleF0gPSByZXM7ICAgLy8gbWFwXG4gICAgICAgIGVsc2UgaWYgKHJlcykgc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgLy8gc29tZVxuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIHZhbDsgICAgICAgICAgICAgIC8vIGZpbmRcbiAgICAgICAgICBjYXNlIDY6IHJldHVybiBpbmRleDsgICAgICAgICAgICAvLyBmaW5kSW5kZXhcbiAgICAgICAgICBjYXNlIDI6IHJlc3VsdC5wdXNoKHZhbCk7ICAgICAgICAvLyBmaWx0ZXJcbiAgICAgICAgfSBlbHNlIGlmIChJU19FVkVSWSkgcmV0dXJuIGZhbHNlOyAvLyBldmVyeVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSVNfRklORF9JTkRFWCA/IC0xIDogSVNfU09NRSB8fCBJU19FVkVSWSA/IElTX0VWRVJZIDogcmVzdWx0O1xuICB9O1xufTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuL19pcy1hcnJheScpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbCkge1xuICB2YXIgQztcbiAgaWYgKGlzQXJyYXkob3JpZ2luYWwpKSB7XG4gICAgQyA9IG9yaWdpbmFsLmNvbnN0cnVjdG9yO1xuICAgIC8vIGNyb3NzLXJlYWxtIGZhbGxiYWNrXG4gICAgaWYgKHR5cGVvZiBDID09ICdmdW5jdGlvbicgJiYgKEMgPT09IEFycmF5IHx8IGlzQXJyYXkoQy5wcm90b3R5cGUpKSkgQyA9IHVuZGVmaW5lZDtcbiAgICBpZiAoaXNPYmplY3QoQykpIHtcbiAgICAgIEMgPSBDW1NQRUNJRVNdO1xuICAgICAgaWYgKEMgPT09IG51bGwpIEMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9IHJldHVybiBDID09PSB1bmRlZmluZWQgPyBBcnJheSA6IEM7XG59O1xuIiwiLy8gOS40LjIuMyBBcnJheVNwZWNpZXNDcmVhdGUob3JpZ2luYWxBcnJheSwgbGVuZ3RoKVxudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWwsIGxlbmd0aCkge1xuICByZXR1cm4gbmV3IChzcGVjaWVzQ29uc3RydWN0b3Iob3JpZ2luYWwpKShsZW5ndGgpO1xufTtcbiIsIi8vIGdldHRpbmcgdGFnIGZyb20gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG4vLyBFUzMgd3JvbmcgaGVyZVxudmFyIEFSRyA9IGNvZihmdW5jdGlvbiAoKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT0gJ0FyZ3VtZW50cyc7XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yXG52YXIgdHJ5R2V0ID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gaXRba2V5XTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgTywgVCwgQjtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKFQgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRBRykpID09ICdzdHJpbmcnID8gVFxuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQVJHID8gY29mKE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKEIgPSBjb2YoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiBCO1xufTtcbiIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJyk7XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG52YXIgZm9yT2YgPSByZXF1aXJlKCcuL19mb3Itb2YnKTtcbnZhciAkaXRlckRlZmluZSA9IHJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJyk7XG52YXIgc3RlcCA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpO1xudmFyIHNldFNwZWNpZXMgPSByZXF1aXJlKCcuL19zZXQtc3BlY2llcycpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciBmYXN0S2V5ID0gcmVxdWlyZSgnLi9fbWV0YScpLmZhc3RLZXk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgU0laRSA9IERFU0NSSVBUT1JTID8gJ19zJyA6ICdzaXplJztcblxudmFyIGdldEVudHJ5ID0gZnVuY3Rpb24gKHRoYXQsIGtleSkge1xuICAvLyBmYXN0IGNhc2VcbiAgdmFyIGluZGV4ID0gZmFzdEtleShrZXkpO1xuICB2YXIgZW50cnk7XG4gIGlmIChpbmRleCAhPT0gJ0YnKSByZXR1cm4gdGhhdC5faVtpbmRleF07XG4gIC8vIGZyb3plbiBvYmplY3QgY2FzZVxuICBmb3IgKGVudHJ5ID0gdGhhdC5fZjsgZW50cnk7IGVudHJ5ID0gZW50cnkubikge1xuICAgIGlmIChlbnRyeS5rID09IGtleSkgcmV0dXJuIGVudHJ5O1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uICh3cmFwcGVyLCBOQU1FLCBJU19NQVAsIEFEREVSKSB7XG4gICAgdmFyIEMgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBpdGVyYWJsZSkge1xuICAgICAgYW5JbnN0YW5jZSh0aGF0LCBDLCBOQU1FLCAnX2knKTtcbiAgICAgIHRoYXQuX3QgPSBOQU1FOyAgICAgICAgIC8vIGNvbGxlY3Rpb24gdHlwZVxuICAgICAgdGhhdC5faSA9IGNyZWF0ZShudWxsKTsgLy8gaW5kZXhcbiAgICAgIHRoYXQuX2YgPSB1bmRlZmluZWQ7ICAgIC8vIGZpcnN0IGVudHJ5XG4gICAgICB0aGF0Ll9sID0gdW5kZWZpbmVkOyAgICAvLyBsYXN0IGVudHJ5XG4gICAgICB0aGF0W1NJWkVdID0gMDsgICAgICAgICAvLyBzaXplXG4gICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBmb3JPZihpdGVyYWJsZSwgSVNfTUFQLCB0aGF0W0FEREVSXSwgdGhhdCk7XG4gICAgfSk7XG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIHtcbiAgICAgIC8vIDIzLjEuMy4xIE1hcC5wcm90b3R5cGUuY2xlYXIoKVxuICAgICAgLy8gMjMuMi4zLjIgU2V0LnByb3RvdHlwZS5jbGVhcigpXG4gICAgICBjbGVhcjogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICAgIGZvciAodmFyIHRoYXQgPSB2YWxpZGF0ZSh0aGlzLCBOQU1FKSwgZGF0YSA9IHRoYXQuX2ksIGVudHJ5ID0gdGhhdC5fZjsgZW50cnk7IGVudHJ5ID0gZW50cnkubikge1xuICAgICAgICAgIGVudHJ5LnIgPSB0cnVlO1xuICAgICAgICAgIGlmIChlbnRyeS5wKSBlbnRyeS5wID0gZW50cnkucC5uID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGRlbGV0ZSBkYXRhW2VudHJ5LmldO1xuICAgICAgICB9XG4gICAgICAgIHRoYXQuX2YgPSB0aGF0Ll9sID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGF0W1NJWkVdID0gMDtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4xLjMuMyBNYXAucHJvdG90eXBlLmRlbGV0ZShrZXkpXG4gICAgICAvLyAyMy4yLjMuNCBTZXQucHJvdG90eXBlLmRlbGV0ZSh2YWx1ZSlcbiAgICAgICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB0aGF0ID0gdmFsaWRhdGUodGhpcywgTkFNRSk7XG4gICAgICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgIHZhciBuZXh0ID0gZW50cnkubjtcbiAgICAgICAgICB2YXIgcHJldiA9IGVudHJ5LnA7XG4gICAgICAgICAgZGVsZXRlIHRoYXQuX2lbZW50cnkuaV07XG4gICAgICAgICAgZW50cnkuciA9IHRydWU7XG4gICAgICAgICAgaWYgKHByZXYpIHByZXYubiA9IG5leHQ7XG4gICAgICAgICAgaWYgKG5leHQpIG5leHQucCA9IHByZXY7XG4gICAgICAgICAgaWYgKHRoYXQuX2YgPT0gZW50cnkpIHRoYXQuX2YgPSBuZXh0O1xuICAgICAgICAgIGlmICh0aGF0Ll9sID09IGVudHJ5KSB0aGF0Ll9sID0gcHJldjtcbiAgICAgICAgICB0aGF0W1NJWkVdLS07XG4gICAgICAgIH0gcmV0dXJuICEhZW50cnk7XG4gICAgICB9LFxuICAgICAgLy8gMjMuMi4zLjYgU2V0LnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gICAgICAvLyAyMy4xLjMuNSBNYXAucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgICAgIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2tmbiAvKiAsIHRoYXQgPSB1bmRlZmluZWQgKi8pIHtcbiAgICAgICAgdmFsaWRhdGUodGhpcywgTkFNRSk7XG4gICAgICAgIHZhciBmID0gY3R4KGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCAzKTtcbiAgICAgICAgdmFyIGVudHJ5O1xuICAgICAgICB3aGlsZSAoZW50cnkgPSBlbnRyeSA/IGVudHJ5Lm4gOiB0aGlzLl9mKSB7XG4gICAgICAgICAgZihlbnRyeS52LCBlbnRyeS5rLCB0aGlzKTtcbiAgICAgICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgICAgICB3aGlsZSAoZW50cnkgJiYgZW50cnkucikgZW50cnkgPSBlbnRyeS5wO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjcgTWFwLnByb3RvdHlwZS5oYXMoa2V5KVxuICAgICAgLy8gMjMuMi4zLjcgU2V0LnByb3RvdHlwZS5oYXModmFsdWUpXG4gICAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuICEhZ2V0RW50cnkodmFsaWRhdGUodGhpcywgTkFNRSksIGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKERFU0NSSVBUT1JTKSBkUChDLnByb3RvdHlwZSwgJ3NpemUnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlKHRoaXMsIE5BTUUpW1NJWkVdO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBDO1xuICB9LFxuICBkZWY6IGZ1bmN0aW9uICh0aGF0LCBrZXksIHZhbHVlKSB7XG4gICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTtcbiAgICB2YXIgcHJldiwgaW5kZXg7XG4gICAgLy8gY2hhbmdlIGV4aXN0aW5nIGVudHJ5XG4gICAgaWYgKGVudHJ5KSB7XG4gICAgICBlbnRyeS52ID0gdmFsdWU7XG4gICAgLy8gY3JlYXRlIG5ldyBlbnRyeVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGF0Ll9sID0gZW50cnkgPSB7XG4gICAgICAgIGk6IGluZGV4ID0gZmFzdEtleShrZXksIHRydWUpLCAvLyA8LSBpbmRleFxuICAgICAgICBrOiBrZXksICAgICAgICAgICAgICAgICAgICAgICAgLy8gPC0ga2V5XG4gICAgICAgIHY6IHZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAvLyA8LSB2YWx1ZVxuICAgICAgICBwOiBwcmV2ID0gdGhhdC5fbCwgICAgICAgICAgICAgLy8gPC0gcHJldmlvdXMgZW50cnlcbiAgICAgICAgbjogdW5kZWZpbmVkLCAgICAgICAgICAgICAgICAgIC8vIDwtIG5leHQgZW50cnlcbiAgICAgICAgcjogZmFsc2UgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIHJlbW92ZWRcbiAgICAgIH07XG4gICAgICBpZiAoIXRoYXQuX2YpIHRoYXQuX2YgPSBlbnRyeTtcbiAgICAgIGlmIChwcmV2KSBwcmV2Lm4gPSBlbnRyeTtcbiAgICAgIHRoYXRbU0laRV0rKztcbiAgICAgIC8vIGFkZCB0byBpbmRleFxuICAgICAgaWYgKGluZGV4ICE9PSAnRicpIHRoYXQuX2lbaW5kZXhdID0gZW50cnk7XG4gICAgfSByZXR1cm4gdGhhdDtcbiAgfSxcbiAgZ2V0RW50cnk6IGdldEVudHJ5LFxuICBzZXRTdHJvbmc6IGZ1bmN0aW9uIChDLCBOQU1FLCBJU19NQVApIHtcbiAgICAvLyBhZGQgLmtleXMsIC52YWx1ZXMsIC5lbnRyaWVzLCBbQEBpdGVyYXRvcl1cbiAgICAvLyAyMy4xLjMuNCwgMjMuMS4zLjgsIDIzLjEuMy4xMSwgMjMuMS4zLjEyLCAyMy4yLjMuNSwgMjMuMi4zLjgsIDIzLjIuMy4xMCwgMjMuMi4zLjExXG4gICAgJGl0ZXJEZWZpbmUoQywgTkFNRSwgZnVuY3Rpb24gKGl0ZXJhdGVkLCBraW5kKSB7XG4gICAgICB0aGlzLl90ID0gdmFsaWRhdGUoaXRlcmF0ZWQsIE5BTUUpOyAvLyB0YXJnZXRcbiAgICAgIHRoaXMuX2sgPSBraW5kOyAgICAgICAgICAgICAgICAgICAgIC8vIGtpbmRcbiAgICAgIHRoaXMuX2wgPSB1bmRlZmluZWQ7ICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzXG4gICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgdmFyIGtpbmQgPSB0aGF0Ll9rO1xuICAgICAgdmFyIGVudHJ5ID0gdGhhdC5fbDtcbiAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgd2hpbGUgKGVudHJ5ICYmIGVudHJ5LnIpIGVudHJ5ID0gZW50cnkucDtcbiAgICAgIC8vIGdldCBuZXh0IGVudHJ5XG4gICAgICBpZiAoIXRoYXQuX3QgfHwgISh0aGF0Ll9sID0gZW50cnkgPSBlbnRyeSA/IGVudHJ5Lm4gOiB0aGF0Ll90Ll9mKSkge1xuICAgICAgICAvLyBvciBmaW5pc2ggdGhlIGl0ZXJhdGlvblxuICAgICAgICB0aGF0Ll90ID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gc3RlcCgxKTtcbiAgICAgIH1cbiAgICAgIC8vIHJldHVybiBzdGVwIGJ5IGtpbmRcbiAgICAgIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIHN0ZXAoMCwgZW50cnkuayk7XG4gICAgICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHN0ZXAoMCwgZW50cnkudik7XG4gICAgICByZXR1cm4gc3RlcCgwLCBbZW50cnkuaywgZW50cnkudl0pO1xuICAgIH0sIElTX01BUCA/ICdlbnRyaWVzJyA6ICd2YWx1ZXMnLCAhSVNfTUFQLCB0cnVlKTtcblxuICAgIC8vIGFkZCBbQEBzcGVjaWVzXSwgMjMuMS4yLjIsIDIzLjIuMi4yXG4gICAgc2V0U3BlY2llcyhOQU1FKTtcbiAgfVxufTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EYXZpZEJydWFudC9NYXAtU2V0LnByb3RvdHlwZS50b0pTT05cbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIGZyb20gPSByZXF1aXJlKCcuL19hcnJheS1mcm9tLWl0ZXJhYmxlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChOQU1FKSB7XG4gIHJldHVybiBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgaWYgKGNsYXNzb2YodGhpcykgIT0gTkFNRSkgdGhyb3cgVHlwZUVycm9yKE5BTUUgKyBcIiN0b0pTT04gaXNuJ3QgZ2VuZXJpY1wiKTtcbiAgICByZXR1cm4gZnJvbSh0aGlzKTtcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIG1ldGEgPSByZXF1aXJlKCcuL19tZXRhJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBlYWNoID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDApO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTkFNRSwgd3JhcHBlciwgbWV0aG9kcywgY29tbW9uLCBJU19NQVAsIElTX1dFQUspIHtcbiAgdmFyIEJhc2UgPSBnbG9iYWxbTkFNRV07XG4gIHZhciBDID0gQmFzZTtcbiAgdmFyIEFEREVSID0gSVNfTUFQID8gJ3NldCcgOiAnYWRkJztcbiAgdmFyIHByb3RvID0gQyAmJiBDLnByb3RvdHlwZTtcbiAgdmFyIE8gPSB7fTtcbiAgaWYgKCFERVNDUklQVE9SUyB8fCB0eXBlb2YgQyAhPSAnZnVuY3Rpb24nIHx8ICEoSVNfV0VBSyB8fCBwcm90by5mb3JFYWNoICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgbmV3IEMoKS5lbnRyaWVzKCkubmV4dCgpO1xuICB9KSkpIHtcbiAgICAvLyBjcmVhdGUgY29sbGVjdGlvbiBjb25zdHJ1Y3RvclxuICAgIEMgPSBjb21tb24uZ2V0Q29uc3RydWN0b3Iod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUik7XG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIG1ldGhvZHMpO1xuICAgIG1ldGEuTkVFRCA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgQyA9IHdyYXBwZXIoZnVuY3Rpb24gKHRhcmdldCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGFyZ2V0LCBDLCBOQU1FLCAnX2MnKTtcbiAgICAgIHRhcmdldC5fYyA9IG5ldyBCYXNlKCk7XG4gICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBmb3JPZihpdGVyYWJsZSwgSVNfTUFQLCB0YXJnZXRbQURERVJdLCB0YXJnZXQpO1xuICAgIH0pO1xuICAgIGVhY2goJ2FkZCxjbGVhcixkZWxldGUsZm9yRWFjaCxnZXQsaGFzLHNldCxrZXlzLHZhbHVlcyxlbnRyaWVzLHRvSlNPTicuc3BsaXQoJywnKSwgZnVuY3Rpb24gKEtFWSkge1xuICAgICAgdmFyIElTX0FEREVSID0gS0VZID09ICdhZGQnIHx8IEtFWSA9PSAnc2V0JztcbiAgICAgIGlmIChLRVkgaW4gcHJvdG8gJiYgIShJU19XRUFLICYmIEtFWSA9PSAnY2xlYXInKSkgaGlkZShDLnByb3RvdHlwZSwgS0VZLCBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICBhbkluc3RhbmNlKHRoaXMsIEMsIEtFWSk7XG4gICAgICAgIGlmICghSVNfQURERVIgJiYgSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkpIHJldHVybiBLRVkgPT0gJ2dldCcgPyB1bmRlZmluZWQgOiBmYWxzZTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2NbS0VZXShhID09PSAwID8gMCA6IGEsIGIpO1xuICAgICAgICByZXR1cm4gSVNfQURERVIgPyB0aGlzIDogcmVzdWx0O1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgSVNfV0VBSyB8fCBkUChDLnByb3RvdHlwZSwgJ3NpemUnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Muc2l6ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldFRvU3RyaW5nVGFnKEMsIE5BTUUpO1xuXG4gIE9bTkFNRV0gPSBDO1xuICAkZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiwgTyk7XG5cbiAgaWYgKCFJU19XRUFLKSBjb21tb24uc2V0U3Ryb25nKEMsIE5BTUUsIElTX01BUCk7XG5cbiAgcmV0dXJuIEM7XG59O1xuIiwidmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHsgdmVyc2lvbjogJzIuNS43JyB9O1xuaWYgKHR5cGVvZiBfX2UgPT0gJ251bWJlcicpIF9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIGluZGV4LCB2YWx1ZSkge1xuICBpZiAoaW5kZXggaW4gb2JqZWN0KSAkZGVmaW5lUHJvcGVydHkuZihvYmplY3QsIGluZGV4LCBjcmVhdGVEZXNjKDAsIHZhbHVlKSk7XG4gIGVsc2Ugb2JqZWN0W2luZGV4XSA9IHZhbHVlO1xufTtcbiIsIi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0LCBsZW5ndGgpIHtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uIChhKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoLyogLi4uYXJncyAqLykge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsIi8vIDcuMi4xIFJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07XG4iLCIvLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBpcyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpcyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59O1xuIiwiLy8gSUUgOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSAoXG4gICdjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YnXG4pLnNwbGl0KCcsJyk7XG4iLCIvLyBhbGwgZW51bWVyYWJsZSBvYmplY3Qga2V5cywgaW5jbHVkZXMgc3ltYm9sc1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIGdPUFMgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpO1xudmFyIHBJRSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciByZXN1bHQgPSBnZXRLZXlzKGl0KTtcbiAgdmFyIGdldFN5bWJvbHMgPSBnT1BTLmY7XG4gIGlmIChnZXRTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBnZXRTeW1ib2xzKGl0KTtcbiAgICB2YXIgaXNFbnVtID0gcElFLmY7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKHN5bWJvbHMubGVuZ3RoID4gaSkgaWYgKGlzRW51bS5jYWxsKGl0LCBrZXkgPSBzeW1ib2xzW2krK10pKSByZXN1bHQucHVzaChrZXkpO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxudmFyICRleHBvcnQgPSBmdW5jdGlvbiAodHlwZSwgbmFtZSwgc291cmNlKSB7XG4gIHZhciBJU19GT1JDRUQgPSB0eXBlICYgJGV4cG9ydC5GO1xuICB2YXIgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuRztcbiAgdmFyIElTX1NUQVRJQyA9IHR5cGUgJiAkZXhwb3J0LlM7XG4gIHZhciBJU19QUk9UTyA9IHR5cGUgJiAkZXhwb3J0LlA7XG4gIHZhciBJU19CSU5EID0gdHlwZSAmICRleHBvcnQuQjtcbiAgdmFyIElTX1dSQVAgPSB0eXBlICYgJGV4cG9ydC5XO1xuICB2YXIgZXhwb3J0cyA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pO1xuICB2YXIgZXhwUHJvdG8gPSBleHBvcnRzW1BST1RPVFlQRV07XG4gIHZhciB0YXJnZXQgPSBJU19HTE9CQUwgPyBnbG9iYWwgOiBJU19TVEFUSUMgPyBnbG9iYWxbbmFtZV0gOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdO1xuICB2YXIga2V5LCBvd24sIG91dDtcbiAgaWYgKElTX0dMT0JBTCkgc291cmNlID0gbmFtZTtcbiAgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG4gICAgb3duID0gIUlTX0ZPUkNFRCAmJiB0YXJnZXQgJiYgdGFyZ2V0W2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICBpZiAob3duICYmIGhhcyhleHBvcnRzLCBrZXkpKSBjb250aW51ZTtcbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuICAgIG91dCA9IG93biA/IHRhcmdldFtrZXldIDogc291cmNlW2tleV07XG4gICAgLy8gcHJldmVudCBnbG9iYWwgcG9sbHV0aW9uIGZvciBuYW1lc3BhY2VzXG4gICAgZXhwb3J0c1trZXldID0gSVNfR0xPQkFMICYmIHR5cGVvZiB0YXJnZXRba2V5XSAhPSAnZnVuY3Rpb24nID8gc291cmNlW2tleV1cbiAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuICAgIDogSVNfQklORCAmJiBvd24gPyBjdHgob3V0LCBnbG9iYWwpXG4gICAgLy8gd3JhcCBnbG9iYWwgY29uc3RydWN0b3JzIGZvciBwcmV2ZW50IGNoYW5nZSB0aGVtIGluIGxpYnJhcnlcbiAgICA6IElTX1dSQVAgJiYgdGFyZ2V0W2tleV0gPT0gb3V0ID8gKGZ1bmN0aW9uIChDKSB7XG4gICAgICB2YXIgRiA9IGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQykge1xuICAgICAgICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEMoKTtcbiAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBDKGEpO1xuICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IEMoYSwgYik7XG4gICAgICAgICAgfSByZXR1cm4gbmV3IEMoYSwgYiwgYyk7XG4gICAgICAgIH0gcmV0dXJuIEMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgICBGW1BST1RPVFlQRV0gPSBDW1BST1RPVFlQRV07XG4gICAgICByZXR1cm4gRjtcbiAgICAvLyBtYWtlIHN0YXRpYyB2ZXJzaW9ucyBmb3IgcHJvdG90eXBlIG1ldGhvZHNcbiAgICB9KShvdXQpIDogSVNfUFJPVE8gJiYgdHlwZW9mIG91dCA9PSAnZnVuY3Rpb24nID8gY3R4KEZ1bmN0aW9uLmNhbGwsIG91dCkgOiBvdXQ7XG4gICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLm1ldGhvZHMuJU5BTUUlXG4gICAgaWYgKElTX1BST1RPKSB7XG4gICAgICAoZXhwb3J0cy52aXJ0dWFsIHx8IChleHBvcnRzLnZpcnR1YWwgPSB7fSkpW2tleV0gPSBvdXQ7XG4gICAgICAvLyBleHBvcnQgcHJvdG8gbWV0aG9kcyB0byBjb3JlLiVDT05TVFJVQ1RPUiUucHJvdG90eXBlLiVOQU1FJVxuICAgICAgaWYgKHR5cGUgJiAkZXhwb3J0LlIgJiYgZXhwUHJvdG8gJiYgIWV4cFByb3RvW2tleV0pIGhpZGUoZXhwUHJvdG8sIGtleSwgb3V0KTtcbiAgICB9XG4gIH1cbn07XG4vLyB0eXBlIGJpdG1hcFxuJGV4cG9ydC5GID0gMTsgICAvLyBmb3JjZWRcbiRleHBvcnQuRyA9IDI7ICAgLy8gZ2xvYmFsXG4kZXhwb3J0LlMgPSA0OyAgIC8vIHN0YXRpY1xuJGV4cG9ydC5QID0gODsgICAvLyBwcm90b1xuJGV4cG9ydC5CID0gMTY7ICAvLyBiaW5kXG4kZXhwb3J0LlcgPSAzMjsgIC8vIHdyYXBcbiRleHBvcnQuVSA9IDY0OyAgLy8gc2FmZVxuJGV4cG9ydC5SID0gMTI4OyAvLyByZWFsIHByb3RvIG1ldGhvZCBmb3IgYGxpYnJhcnlgXG5tb2R1bGUuZXhwb3J0cyA9ICRleHBvcnQ7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG4iLCJ2YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4vX2l0ZXItY2FsbCcpO1xudmFyIGlzQXJyYXlJdGVyID0gcmVxdWlyZSgnLi9faXMtYXJyYXktaXRlcicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBnZXRJdGVyRm4gPSByZXF1aXJlKCcuL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIEJSRUFLID0ge307XG52YXIgUkVUVVJOID0ge307XG52YXIgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCBlbnRyaWVzLCBmbiwgdGhhdCwgSVRFUkFUT1IpIHtcbiAgdmFyIGl0ZXJGbiA9IElURVJBVE9SID8gZnVuY3Rpb24gKCkgeyByZXR1cm4gaXRlcmFibGU7IH0gOiBnZXRJdGVyRm4oaXRlcmFibGUpO1xuICB2YXIgZiA9IGN0eChmbiwgdGhhdCwgZW50cmllcyA/IDIgOiAxKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCwgc3RlcCwgaXRlcmF0b3IsIHJlc3VsdDtcbiAgaWYgKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKGl0ZXJhYmxlICsgJyBpcyBub3QgaXRlcmFibGUhJyk7XG4gIC8vIGZhc3QgY2FzZSBmb3IgYXJyYXlzIHdpdGggZGVmYXVsdCBpdGVyYXRvclxuICBpZiAoaXNBcnJheUl0ZXIoaXRlckZuKSkgZm9yIChsZW5ndGggPSB0b0xlbmd0aChpdGVyYWJsZS5sZW5ndGgpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgIHJlc3VsdCA9IGVudHJpZXMgPyBmKGFuT2JqZWN0KHN0ZXAgPSBpdGVyYWJsZVtpbmRleF0pWzBdLCBzdGVwWzFdKSA6IGYoaXRlcmFibGVbaW5kZXhdKTtcbiAgICBpZiAocmVzdWx0ID09PSBCUkVBSyB8fCByZXN1bHQgPT09IFJFVFVSTikgcmV0dXJuIHJlc3VsdDtcbiAgfSBlbHNlIGZvciAoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTspIHtcbiAgICByZXN1bHQgPSBjYWxsKGl0ZXJhdG9yLCBmLCBzdGVwLnZhbHVlLCBlbnRyaWVzKTtcbiAgICBpZiAocmVzdWx0ID09PSBCUkVBSyB8fCByZXN1bHQgPT09IFJFVFVSTikgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcbmV4cG9ydHMuQlJFQUsgPSBCUkVBSztcbmV4cG9ydHMuUkVUVVJOID0gUkVUVVJOO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbnZhciBnbG9iYWwgPSBtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lk1hdGggPT0gTWF0aFxuICA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuaWYgKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpIF9fZyA9IGdsb2JhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuIiwidmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xufTtcbiIsInZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkUC5mKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcbiIsInZhciBkb2N1bWVudCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50O1xubW9kdWxlLmV4cG9ydHMgPSBkb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4iLCJtb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2RpdicpLCAnYScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pLmEgIT0gNztcbn0pO1xuIiwiLy8gZmFzdCBhcHBseSwgaHR0cDovL2pzcGVyZi5sbmtpdC5jb20vZmFzdC1hcHBseS81XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgYXJncywgdGhhdCkge1xuICB2YXIgdW4gPSB0aGF0ID09PSB1bmRlZmluZWQ7XG4gIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiB1biA/IGZuKClcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCk7XG4gICAgY2FzZSAxOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdKTtcbiAgICBjYXNlIDI6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIGNhc2UgMzogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgY2FzZSA0OiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgfSByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJncyk7XG59O1xuIiwiLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xufTtcbiIsIi8vIGNoZWNrIG9uIGRlZmF1bHQgQXJyYXkgaXRlcmF0b3JcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCAhPT0gdW5kZWZpbmVkICYmIChJdGVyYXRvcnMuQXJyYXkgPT09IGl0IHx8IEFycmF5UHJvdG9bSVRFUkFUT1JdID09PSBpdCk7XG59O1xuIiwiLy8gNy4yLjIgSXNBcnJheShhcmd1bWVudClcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KGFyZykge1xuICByZXR1cm4gY29mKGFyZykgPT0gJ0FycmF5Jztcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xufTtcbiIsIi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3JcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGZuLCB2YWx1ZSwgZW50cmllcykge1xuICB0cnkge1xuICAgIHJldHVybiBlbnRyaWVzID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB2YXIgcmV0ID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICAgIGlmIChyZXQgIT09IHVuZGVmaW5lZCkgYW5PYmplY3QocmV0LmNhbGwoaXRlcmF0b3IpKTtcbiAgICB0aHJvdyBlO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciBkZXNjcmlwdG9yID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faGlkZScpKEl0ZXJhdG9yUHJvdG90eXBlLCByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7XG4gIENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBkZXNjcmlwdG9yKDEsIG5leHQpIH0pO1xuICBzZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgTkFNRSArICcgSXRlcmF0b3InKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgJGl0ZXJDcmVhdGUgPSByZXF1aXJlKCcuL19pdGVyLWNyZWF0ZScpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIEJVR0dZID0gIShbXS5rZXlzICYmICduZXh0JyBpbiBbXS5rZXlzKCkpOyAvLyBTYWZhcmkgaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG52YXIgRkZfSVRFUkFUT1IgPSAnQEBpdGVyYXRvcic7XG52YXIgS0VZUyA9ICdrZXlzJztcbnZhciBWQUxVRVMgPSAndmFsdWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChCYXNlLCBOQU1FLCBDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpIHtcbiAgJGl0ZXJDcmVhdGUoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpO1xuICB2YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24gKGtpbmQpIHtcbiAgICBpZiAoIUJVR0dZICYmIGtpbmQgaW4gcHJvdG8pIHJldHVybiBwcm90b1traW5kXTtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICB9IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICB9O1xuICB2YXIgVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgREVGX1ZBTFVFUyA9IERFRkFVTFQgPT0gVkFMVUVTO1xuICB2YXIgVkFMVUVTX0JVRyA9IGZhbHNlO1xuICB2YXIgcHJvdG8gPSBCYXNlLnByb3RvdHlwZTtcbiAgdmFyICRuYXRpdmUgPSBwcm90b1tJVEVSQVRPUl0gfHwgcHJvdG9bRkZfSVRFUkFUT1JdIHx8IERFRkFVTFQgJiYgcHJvdG9bREVGQVVMVF07XG4gIHZhciAkZGVmYXVsdCA9ICRuYXRpdmUgfHwgZ2V0TWV0aG9kKERFRkFVTFQpO1xuICB2YXIgJGVudHJpZXMgPSBERUZBVUxUID8gIURFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZCgnZW50cmllcycpIDogdW5kZWZpbmVkO1xuICB2YXIgJGFueU5hdGl2ZSA9IE5BTUUgPT0gJ0FycmF5JyA/IHByb3RvLmVudHJpZXMgfHwgJG5hdGl2ZSA6ICRuYXRpdmU7XG4gIHZhciBtZXRob2RzLCBrZXksIEl0ZXJhdG9yUHJvdG90eXBlO1xuICAvLyBGaXggbmF0aXZlXG4gIGlmICgkYW55TmF0aXZlKSB7XG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZigkYW55TmF0aXZlLmNhbGwobmV3IEJhc2UoKSkpO1xuICAgIGlmIChJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBJdGVyYXRvclByb3RvdHlwZS5uZXh0KSB7XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvclByb3RvdHlwZSwgVEFHLCB0cnVlKTtcbiAgICAgIC8vIGZpeCBmb3Igc29tZSBvbGQgZW5naW5lc1xuICAgICAgaWYgKCFMSUJSQVJZICYmIHR5cGVvZiBJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0gIT0gJ2Z1bmN0aW9uJykgaGlkZShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgIH1cbiAgfVxuICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGXG4gIGlmIChERUZfVkFMVUVTICYmICRuYXRpdmUgJiYgJG5hdGl2ZS5uYW1lICE9PSBWQUxVRVMpIHtcbiAgICBWQUxVRVNfQlVHID0gdHJ1ZTtcbiAgICAkZGVmYXVsdCA9IGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuICRuYXRpdmUuY2FsbCh0aGlzKTsgfTtcbiAgfVxuICAvLyBEZWZpbmUgaXRlcmF0b3JcbiAgaWYgKCghTElCUkFSWSB8fCBGT1JDRUQpICYmIChCVUdHWSB8fCBWQUxVRVNfQlVHIHx8ICFwcm90b1tJVEVSQVRPUl0pKSB7XG4gICAgaGlkZShwcm90bywgSVRFUkFUT1IsICRkZWZhdWx0KTtcbiAgfVxuICAvLyBQbHVnIGZvciBsaWJyYXJ5XG4gIEl0ZXJhdG9yc1tOQU1FXSA9ICRkZWZhdWx0O1xuICBJdGVyYXRvcnNbVEFHXSA9IHJldHVyblRoaXM7XG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChLRVlTKSxcbiAgICAgIGVudHJpZXM6ICRlbnRyaWVzXG4gICAgfTtcbiAgICBpZiAoRk9SQ0VEKSBmb3IgKGtleSBpbiBtZXRob2RzKSB7XG4gICAgICBpZiAoIShrZXkgaW4gcHJvdG8pKSByZWRlZmluZShwcm90bywga2V5LCBtZXRob2RzW2tleV0pO1xuICAgIH0gZWxzZSAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChCVUdHWSB8fCBWQUxVRVNfQlVHKSwgTkFNRSwgbWV0aG9kcyk7XG4gIH1cbiAgcmV0dXJuIG1ldGhvZHM7XG59O1xuIiwidmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciByaXRlciA9IFs3XVtJVEVSQVRPUl0oKTtcbiAgcml0ZXJbJ3JldHVybiddID0gZnVuY3Rpb24gKCkgeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuICBBcnJheS5mcm9tKHJpdGVyLCBmdW5jdGlvbiAoKSB7IHRocm93IDI7IH0pO1xufSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIHNraXBDbG9zaW5nKSB7XG4gIGlmICghc2tpcENsb3NpbmcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB2YXIgc2FmZSA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBbN107XG4gICAgdmFyIGl0ZXIgPSBhcnJbSVRFUkFUT1JdKCk7XG4gICAgaXRlci5uZXh0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4geyBkb25lOiBzYWZlID0gdHJ1ZSB9OyB9O1xuICAgIGFycltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyOyB9O1xuICAgIGV4ZWMoYXJyKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBzYWZlO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRvbmUsIHZhbHVlKSB7XG4gIHJldHVybiB7IHZhbHVlOiB2YWx1ZSwgZG9uZTogISFkb25lIH07XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsIm1vZHVsZS5leHBvcnRzID0gdHJ1ZTtcbiIsInZhciBNRVRBID0gcmVxdWlyZSgnLi9fdWlkJykoJ21ldGEnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHNldERlc2MgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGlkID0gMDtcbnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIEZSRUVaRSA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcbn0pO1xudmFyIHNldE1ldGEgPSBmdW5jdGlvbiAoaXQpIHtcbiAgc2V0RGVzYyhpdCwgTUVUQSwgeyB2YWx1ZToge1xuICAgIGk6ICdPJyArICsraWQsIC8vIG9iamVjdCBJRFxuICAgIHc6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gfSk7XG59O1xudmFyIGZhc3RLZXkgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICAvLyByZXR1cm4gcHJpbWl0aXZlIHdpdGggcHJlZml4XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuICBpZiAoIWhhcyhpdCwgTUVUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuICdGJztcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gJ0UnO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQV0uaTtcbn07XG52YXIgZ2V0V2VhayA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIGlmICghaGFzKGl0LCBNRVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhKGl0KTtcbiAgLy8gcmV0dXJuIGhhc2ggd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSByZXR1cm4gaXRbTUVUQV0udztcbn07XG4vLyBhZGQgbWV0YWRhdGEgb24gZnJlZXplLWZhbWlseSBtZXRob2RzIGNhbGxpbmdcbnZhciBvbkZyZWV6ZSA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoRlJFRVpFICYmIG1ldGEuTkVFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXMoaXQsIE1FVEEpKSBzZXRNZXRhKGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbnZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gIEtFWTogTUVUQSxcbiAgTkVFRDogZmFsc2UsXG4gIGZhc3RLZXk6IGZhc3RLZXksXG4gIGdldFdlYWs6IGdldFdlYWssXG4gIG9uRnJlZXplOiBvbkZyZWV6ZVxufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBtYWNyb3Rhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0O1xudmFyIE9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIFByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcbnZhciBpc05vZGUgPSByZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaGVhZCwgbGFzdCwgbm90aWZ5O1xuXG4gIHZhciBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZiAoaXNOb2RlICYmIChwYXJlbnQgPSBwcm9jZXNzLmRvbWFpbikpIHBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUgKGhlYWQpIHtcbiAgICAgIGZuID0gaGVhZC5mbjtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoaGVhZCkgbm90aWZ5KCk7XG4gICAgICAgIGVsc2UgbGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gTm9kZS5qc1xuICBpZiAoaXNOb2RlKSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyLCBleGNlcHQgaU9TIFNhZmFyaSAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8zMzlcbiAgfSBlbHNlIGlmIChPYnNlcnZlciAmJiAhKGdsb2JhbC5uYXZpZ2F0b3IgJiYgZ2xvYmFsLm5hdmlnYXRvci5zdGFuZGFsb25lKSkge1xuICAgIHZhciB0b2dnbGUgPSB0cnVlO1xuICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgIG5ldyBPYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTtcbiAgICB9O1xuICAvLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxuICB9IGVsc2UgaWYgKFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKSB7XG4gICAgLy8gUHJvbWlzZS5yZXNvbHZlIHdpdGhvdXQgYW4gYXJndW1lbnQgdGhyb3dzIGFuIGVycm9yIGluIExHIFdlYk9TIDJcbiAgICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb21pc2UudGhlbihmbHVzaCk7XG4gICAgfTtcbiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjpcbiAgLy8gLSBzZXRJbW1lZGlhdGVcbiAgLy8gLSBNZXNzYWdlQ2hhbm5lbFxuICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnXG4gIC8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4gIC8vIC0gc2V0VGltZW91dFxuICB9IGVsc2Uge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHN0cmFuZ2UgSUUgKyB3ZWJwYWNrIGRldiBzZXJ2ZXIgYnVnIC0gdXNlIC5jYWxsKGdsb2JhbClcbiAgICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7XG4gICAgdmFyIHRhc2sgPSB7IGZuOiBmbiwgbmV4dDogdW5kZWZpbmVkIH07XG4gICAgaWYgKGxhc3QpIGxhc3QubmV4dCA9IHRhc2s7XG4gICAgaWYgKCFoZWFkKSB7XG4gICAgICBoZWFkID0gdGFzaztcbiAgICAgIG5vdGlmeSgpO1xuICAgIH0gbGFzdCA9IHRhc2s7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjUuNC4xLjUgTmV3UHJvbWlzZUNhcGFiaWxpdHkoQylcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5cbmZ1bmN0aW9uIFByb21pc2VDYXBhYmlsaXR5KEMpIHtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24gKCQkcmVzb2x2ZSwgJCRyZWplY3QpIHtcbiAgICBpZiAocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoJ0JhZCBQcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgcmVzb2x2ZSA9ICQkcmVzb2x2ZTtcbiAgICByZWplY3QgPSAkJHJlamVjdDtcbiAgfSk7XG4gIHRoaXMucmVzb2x2ZSA9IGFGdW5jdGlvbihyZXNvbHZlKTtcbiAgdGhpcy5yZWplY3QgPSBhRnVuY3Rpb24ocmVqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIChDKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG59O1xuIiwiLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBkUHMgPSByZXF1aXJlKCcuL19vYmplY3QtZHBzJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgRW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdpZnJhbWUnKTtcbiAgdmFyIGkgPSBlbnVtQnVnS2V5cy5sZW5ndGg7XG4gIHZhciBsdCA9ICc8JztcbiAgdmFyIGd0ID0gJz4nO1xuICB2YXIgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXF1aXJlKCcuL19odG1sJykuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxuICAvLyBjcmVhdGVEaWN0ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuT2JqZWN0O1xuICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyAnc2NyaXB0JyArIGd0ICsgJ2RvY3VtZW50LkY9T2JqZWN0JyArIGx0ICsgJy9zY3JpcHQnICsgZ3QpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICBjcmVhdGVEaWN0ID0gaWZyYW1lRG9jdW1lbnQuRjtcbiAgd2hpbGUgKGktLSkgZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tpXV07XG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKE8gIT09IG51bGwpIHtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5KCk7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IG51bGw7XG4gICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbFxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZFBzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuL19pZTgtZG9tLWRlZmluZScpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgZFAgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbmV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuIGRQKE8sIFAsIEF0dHJpYnV0ZXMpO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcykgdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEnKTtcbiAgaWYgKCd2YWx1ZScgaW4gQXR0cmlidXRlcykgT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gIHJldHVybiBPO1xufTtcbiIsInZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIga2V5cyA9IGdldEtleXMoUHJvcGVydGllcyk7XG4gIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGkgPSAwO1xuICB2YXIgUDtcbiAgd2hpbGUgKGxlbmd0aCA+IGkpIGRQLmYoTywgUCA9IGtleXNbaSsrXSwgUHJvcGVydGllc1tQXSk7XG4gIHJldHVybiBPO1xufTtcbiIsInZhciBwSUUgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJyk7XG52YXIgZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbmV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBnT1BEIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApIHtcbiAgTyA9IHRvSU9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuIGdPUEQoTywgUCk7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoaGFzKE8sIFApKSByZXR1cm4gY3JlYXRlRGVzYyghcElFLmYuY2FsbChPLCBQKSwgT1tQXSk7XG59O1xuIiwiLy8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciBnT1BOID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mO1xudmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbnZhciB3aW5kb3dOYW1lcyA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzXG4gID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KSA6IFtdO1xuXG52YXIgZ2V0V2luZG93TmFtZXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ09QTihpdCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gd2luZG93TmFtZXMuc2xpY2UoKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgcmV0dXJuIHdpbmRvd05hbWVzICYmIHRvU3RyaW5nLmNhbGwoaXQpID09ICdbb2JqZWN0IFdpbmRvd10nID8gZ2V0V2luZG93TmFtZXMoaXQpIDogZ09QTih0b0lPYmplY3QoaXQpKTtcbn07XG4iLCIvLyAxOS4xLjIuNyAvIDE1LjIuMy40IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJykuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoTykge1xuICByZXR1cm4gJGtleXMoTywgaGlkZGVuS2V5cyk7XG59O1xuIiwiZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbiIsIi8vIDE5LjEuMi45IC8gMTUuMi4zLjIgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBJRV9QUk9UTyA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcbnZhciBPYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIChPKSB7XG4gIE8gPSB0b09iamVjdChPKTtcbiAgaWYgKGhhcyhPLCBJRV9QUk9UTykpIHJldHVybiBPW0lFX1BST1RPXTtcbiAgaWYgKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90byA6IG51bGw7XG59O1xuIiwidmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciBhcnJheUluZGV4T2YgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpKGZhbHNlKTtcbnZhciBJRV9QUk9UTyA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSU9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgaWYgKGtleSAhPSBJRV9QUk9UTykgaGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkgaWYgKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSkge1xuICAgIH5hcnJheUluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIvLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKSB7XG4gIHJldHVybiAka2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuIiwiZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG4iLCIvLyBtb3N0IE9iamVjdCBtZXRob2RzIGJ5IEVTNiBzaG91bGQgYWNjZXB0IHByaW1pdGl2ZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVksIGV4ZWMpIHtcbiAgdmFyIGZuID0gKGNvcmUuT2JqZWN0IHx8IHt9KVtLRVldIHx8IE9iamVjdFtLRVldO1xuICB2YXIgZXhwID0ge307XG4gIGV4cFtLRVldID0gZXhlYyhmbik7XG4gICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24gKCkgeyBmbigxKTsgfSksICdPYmplY3QnLCBleHApO1xufTtcbiIsInZhciAkcGFyc2VJbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5wYXJzZUludDtcbnZhciAkdHJpbSA9IHJlcXVpcmUoJy4vX3N0cmluZy10cmltJykudHJpbTtcbnZhciB3cyA9IHJlcXVpcmUoJy4vX3N0cmluZy13cycpO1xudmFyIGhleCA9IC9eWy0rXT8wW3hYXS87XG5cbm1vZHVsZS5leHBvcnRzID0gJHBhcnNlSW50KHdzICsgJzA4JykgIT09IDggfHwgJHBhcnNlSW50KHdzICsgJzB4MTYnKSAhPT0gMjIgPyBmdW5jdGlvbiBwYXJzZUludChzdHIsIHJhZGl4KSB7XG4gIHZhciBzdHJpbmcgPSAkdHJpbShTdHJpbmcoc3RyKSwgMyk7XG4gIHJldHVybiAkcGFyc2VJbnQoc3RyaW5nLCAocmFkaXggPj4+IDApIHx8IChoZXgudGVzdChzdHJpbmcpID8gMTYgOiAxMCkpO1xufSA6ICRwYXJzZUludDtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlOiBmYWxzZSwgdjogZXhlYygpIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4geyBlOiB0cnVlLCB2OiBlIH07XG4gIH1cbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi9fbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDLCB4KSB7XG4gIGFuT2JqZWN0KEMpO1xuICBpZiAoaXNPYmplY3QoeCkgJiYgeC5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIHg7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7XG4gIHZhciByZXNvbHZlID0gcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgcmVzb2x2ZSh4KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiIsInZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzcmMsIHNhZmUpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgIGlmIChzYWZlICYmIHRhcmdldFtrZXldKSB0YXJnZXRba2V5XSA9IHNyY1trZXldO1xuICAgIGVsc2UgaGlkZSh0YXJnZXQsIGtleSwgc3JjW2tleV0pO1xuICB9IHJldHVybiB0YXJnZXQ7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19oaWRlJyk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT0xMRUNUSU9OKSB7XG4gICRleHBvcnQoJGV4cG9ydC5TLCBDT0xMRUNUSU9OLCB7IGZyb206IGZ1bmN0aW9uIGZyb20oc291cmNlIC8qICwgbWFwRm4sIHRoaXNBcmcgKi8pIHtcbiAgICB2YXIgbWFwRm4gPSBhcmd1bWVudHNbMV07XG4gICAgdmFyIG1hcHBpbmcsIEEsIG4sIGNiO1xuICAgIGFGdW5jdGlvbih0aGlzKTtcbiAgICBtYXBwaW5nID0gbWFwRm4gIT09IHVuZGVmaW5lZDtcbiAgICBpZiAobWFwcGluZykgYUZ1bmN0aW9uKG1hcEZuKTtcbiAgICBpZiAoc291cmNlID09IHVuZGVmaW5lZCkgcmV0dXJuIG5ldyB0aGlzKCk7XG4gICAgQSA9IFtdO1xuICAgIGlmIChtYXBwaW5nKSB7XG4gICAgICBuID0gMDtcbiAgICAgIGNiID0gY3R4KG1hcEZuLCBhcmd1bWVudHNbMl0sIDIpO1xuICAgICAgZm9yT2Yoc291cmNlLCBmYWxzZSwgZnVuY3Rpb24gKG5leHRJdGVtKSB7XG4gICAgICAgIEEucHVzaChjYihuZXh0SXRlbSwgbisrKSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yT2Yoc291cmNlLCBmYWxzZSwgQS5wdXNoLCBBKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyB0aGlzKEEpO1xuICB9IH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTExFQ1RJT04pIHtcbiAgJGV4cG9ydCgkZXhwb3J0LlMsIENPTExFQ1RJT04sIHsgb2Y6IGZ1bmN0aW9uIG9mKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBBID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gICAgd2hpbGUgKGxlbmd0aC0tKSBBW2xlbmd0aF0gPSBhcmd1bWVudHNbbGVuZ3RoXTtcbiAgICByZXR1cm4gbmV3IHRoaXMoQSk7XG4gIH0gfSk7XG59O1xuIiwiLy8gV29ya3Mgd2l0aCBfX3Byb3RvX18gb25seS4gT2xkIHY4IGNhbid0IHdvcmsgd2l0aCBudWxsIHByb3RvIG9iamVjdHMuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBjaGVjayA9IGZ1bmN0aW9uIChPLCBwcm90bykge1xuICBhbk9iamVjdChPKTtcbiAgaWYgKCFpc09iamVjdChwcm90bykgJiYgcHJvdG8gIT09IG51bGwpIHRocm93IFR5cGVFcnJvcihwcm90byArIFwiOiBjYW4ndCBzZXQgYXMgcHJvdG90eXBlIVwiKTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKCdfX3Byb3RvX18nIGluIHt9ID8gLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgIGZ1bmN0aW9uICh0ZXN0LCBidWdneSwgc2V0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXQgPSByZXF1aXJlKCcuL19jdHgnKShGdW5jdGlvbi5jYWxsLCByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpLmYoT2JqZWN0LnByb3RvdHlwZSwgJ19fcHJvdG9fXycpLnNldCwgMik7XG4gICAgICAgIHNldCh0ZXN0LCBbXSk7XG4gICAgICAgIGJ1Z2d5ID0gISh0ZXN0IGluc3RhbmNlb2YgQXJyYXkpO1xuICAgICAgfSBjYXRjaCAoZSkgeyBidWdneSA9IHRydWU7IH1cbiAgICAgIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90bykge1xuICAgICAgICBjaGVjayhPLCBwcm90byk7XG4gICAgICAgIGlmIChidWdneSkgTy5fX3Byb3RvX18gPSBwcm90bztcbiAgICAgICAgZWxzZSBzZXQoTywgcHJvdG8pO1xuICAgICAgICByZXR1cm4gTztcbiAgICAgIH07XG4gICAgfSh7fSwgZmFsc2UpIDogdW5kZWZpbmVkKSxcbiAgY2hlY2s6IGNoZWNrXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgU1BFQ0lFUyA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEtFWSkge1xuICB2YXIgQyA9IHR5cGVvZiBjb3JlW0tFWV0gPT0gJ2Z1bmN0aW9uJyA/IGNvcmVbS0VZXSA6IGdsb2JhbFtLRVldO1xuICBpZiAoREVTQ1JJUFRPUlMgJiYgQyAmJiAhQ1tTUEVDSUVTXSkgZFAuZihDLCBTUEVDSUVTLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfVxuICB9KTtcbn07XG4iLCJ2YXIgZGVmID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIHRhZywgc3RhdCkge1xuICBpZiAoaXQgJiYgIWhhcyhpdCA9IHN0YXQgPyBpdCA6IGl0LnByb3RvdHlwZSwgVEFHKSkgZGVmKGl0LCBUQUcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdGFnIH0pO1xufTtcbiIsInZhciBzaGFyZWQgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgna2V5cycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBzaGFyZWRba2V5XSB8fCAoc2hhcmVkW2tleV0gPSB1aWQoa2V5KSk7XG59O1xuIiwidmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXyc7XG52YXIgc3RvcmUgPSBnbG9iYWxbU0hBUkVEXSB8fCAoZ2xvYmFsW1NIQVJFRF0gPSB7fSk7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pO1xufSkoJ3ZlcnNpb25zJywgW10pLnB1c2goe1xuICB2ZXJzaW9uOiBjb3JlLnZlcnNpb24sXG4gIG1vZGU6IHJlcXVpcmUoJy4vX2xpYnJhcnknKSA/ICdwdXJlJyA6ICdnbG9iYWwnLFxuICBjb3B5cmlnaHQ6ICfCqSAyMDE4IERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpJ1xufSk7XG4iLCIvLyA3LjMuMjAgU3BlY2llc0NvbnN0cnVjdG9yKE8sIGRlZmF1bHRDb25zdHJ1Y3RvcilcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBTUEVDSUVTID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIEQpIHtcbiAgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvcjtcbiAgdmFyIFM7XG4gIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgKFMgPSBhbk9iamVjdChDKVtTUEVDSUVTXSkgPT0gdW5kZWZpbmVkID8gRCA6IGFGdW5jdGlvbihTKTtcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG4vLyB0cnVlICAtPiBTdHJpbmcjYXRcbi8vIGZhbHNlIC0+IFN0cmluZyNjb2RlUG9pbnRBdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVE9fU1RSSU5HKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGhhdCwgcG9zKSB7XG4gICAgdmFyIHMgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSk7XG4gICAgdmFyIGkgPSB0b0ludGVnZXIocG9zKTtcbiAgICB2YXIgbCA9IHMubGVuZ3RoO1xuICAgIHZhciBhLCBiO1xuICAgIGlmIChpIDwgMCB8fCBpID49IGwpIHJldHVybiBUT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBhID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBhIDwgMHhkODAwIHx8IGEgPiAweGRiZmYgfHwgaSArIDEgPT09IGwgfHwgKGIgPSBzLmNoYXJDb2RlQXQoaSArIDEpKSA8IDB4ZGMwMCB8fCBiID4gMHhkZmZmXG4gICAgICA/IFRPX1NUUklORyA/IHMuY2hhckF0KGkpIDogYVxuICAgICAgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gMHhkODAwIDw8IDEwKSArIChiIC0gMHhkYzAwKSArIDB4MTAwMDA7XG4gIH07XG59O1xuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBzcGFjZXMgPSByZXF1aXJlKCcuL19zdHJpbmctd3MnKTtcbnZhciBzcGFjZSA9ICdbJyArIHNwYWNlcyArICddJztcbnZhciBub24gPSAnXFx1MjAwYlxcdTAwODUnO1xudmFyIGx0cmltID0gUmVnRXhwKCdeJyArIHNwYWNlICsgc3BhY2UgKyAnKicpO1xudmFyIHJ0cmltID0gUmVnRXhwKHNwYWNlICsgc3BhY2UgKyAnKiQnKTtcblxudmFyIGV4cG9ydGVyID0gZnVuY3Rpb24gKEtFWSwgZXhlYywgQUxJQVMpIHtcbiAgdmFyIGV4cCA9IHt9O1xuICB2YXIgRk9SQ0UgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICEhc3BhY2VzW0tFWV0oKSB8fCBub25bS0VZXSgpICE9IG5vbjtcbiAgfSk7XG4gIHZhciBmbiA9IGV4cFtLRVldID0gRk9SQ0UgPyBleGVjKHRyaW0pIDogc3BhY2VzW0tFWV07XG4gIGlmIChBTElBUykgZXhwW0FMSUFTXSA9IGZuO1xuICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIEZPUkNFLCAnU3RyaW5nJywgZXhwKTtcbn07XG5cbi8vIDEgLT4gU3RyaW5nI3RyaW1MZWZ0XG4vLyAyIC0+IFN0cmluZyN0cmltUmlnaHRcbi8vIDMgLT4gU3RyaW5nI3RyaW1cbnZhciB0cmltID0gZXhwb3J0ZXIudHJpbSA9IGZ1bmN0aW9uIChzdHJpbmcsIFRZUEUpIHtcbiAgc3RyaW5nID0gU3RyaW5nKGRlZmluZWQoc3RyaW5nKSk7XG4gIGlmIChUWVBFICYgMSkgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UobHRyaW0sICcnKTtcbiAgaWYgKFRZUEUgJiAyKSBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShydHJpbSwgJycpO1xuICByZXR1cm4gc3RyaW5nO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRlcjtcbiIsIm1vZHVsZS5leHBvcnRzID0gJ1xceDA5XFx4MEFcXHgwQlxceDBDXFx4MERcXHgyMFxceEEwXFx1MTY4MFxcdTE4MEVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzJyArXG4gICdcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBBXFx1MjAyRlxcdTIwNUZcXHUzMDAwXFx1MjAyOFxcdTIwMjlcXHVGRUZGJztcbiIsInZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBpbnZva2UgPSByZXF1aXJlKCcuL19pbnZva2UnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi9faHRtbCcpO1xudmFyIGNlbCA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgc2V0VGFzayA9IGdsb2JhbC5zZXRJbW1lZGlhdGU7XG52YXIgY2xlYXJUYXNrID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlO1xudmFyIE1lc3NhZ2VDaGFubmVsID0gZ2xvYmFsLk1lc3NhZ2VDaGFubmVsO1xudmFyIERpc3BhdGNoID0gZ2xvYmFsLkRpc3BhdGNoO1xudmFyIGNvdW50ZXIgPSAwO1xudmFyIHF1ZXVlID0ge307XG52YXIgT05SRUFEWVNUQVRFQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSc7XG52YXIgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG52YXIgcnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaWQgPSArdGhpcztcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICBpZiAocXVldWUuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgdmFyIGZuID0gcXVldWVbaWRdO1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gICAgZm4oKTtcbiAgfVxufTtcbnZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCkge1xuICBydW4uY2FsbChldmVudC5kYXRhKTtcbn07XG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZiAoIXNldFRhc2sgfHwgIWNsZWFyVGFzaykge1xuICBzZXRUYXNrID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICB2YXIgaSA9IDE7XG4gICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgICAgIGludm9rZSh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhclRhc2sgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCkge1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZiAocmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY3R4KHJ1biwgaWQsIDEpKTtcbiAgICB9O1xuICAvLyBTcGhlcmUgKEpTIGdhbWUgZW5naW5lKSBEaXNwYXRjaCBBUElcbiAgfSBlbHNlIGlmIChEaXNwYXRjaCAmJiBEaXNwYXRjaC5ub3cpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgRGlzcGF0Y2gubm93KGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsKSB7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGlzdGVuZXI7XG4gICAgZGVmZXIgPSBjdHgocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCwgMSk7XG4gIC8vIEJyb3dzZXJzIHdpdGggcG9zdE1lc3NhZ2UsIHNraXAgV2ViV29ya2Vyc1xuICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0J1xuICB9IGVsc2UgaWYgKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyICYmIHR5cGVvZiBwb3N0TWVzc2FnZSA9PSAnZnVuY3Rpb24nICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoaWQgKyAnJywgJyonKTtcbiAgICB9O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjZWwoJ3NjcmlwdCcpKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoY2VsKCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaHRtbC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgICAgcnVuLmNhbGwoaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBzZXRUaW1lb3V0KGN0eChydW4sIGlkLCAxKSwgMCk7XG4gICAgfTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0VGFzayxcbiAgY2xlYXI6IGNsZWFyVGFza1xufTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGluZGV4IDwgMCA/IG1heChpbmRleCArIGxlbmd0aCwgMCkgOiBtaW4oaW5kZXgsIGxlbmd0aCk7XG59O1xuIiwiLy8gNy4xLjQgVG9JbnRlZ2VyXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXNOYU4oaXQgPSAraXQpID8gMCA6IChpdCA+IDAgPyBmbG9vciA6IGNlaWwpKGl0KTtcbn07XG4iLCIvLyB0byBpbmRleGVkIG9iamVjdCwgdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi9faW9iamVjdCcpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gSU9iamVjdChkZWZpbmVkKGl0KSk7XG59O1xuIiwiLy8gNy4xLjE1IFRvTGVuZ3RoXG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIG1pbiA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID4gMCA/IG1pbih0b0ludGVnZXIoaXQpLCAweDFmZmZmZmZmZmZmZmZmKSA6IDA7IC8vIHBvdygyLCA1MykgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG4iLCIvLyA3LjEuMTMgVG9PYmplY3QoYXJndW1lbnQpXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiIsIi8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBTKSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gaXQ7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICghUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTtcbiIsInZhciBpZCA9IDA7XG52YXIgcHggPSBNYXRoLnJhbmRvbSgpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcuY29uY2F0KGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXksICcpXycsICgrK2lkICsgcHgpLnRvU3RyaW5nKDM2KSk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIG5hdmlnYXRvciA9IGdsb2JhbC5uYXZpZ2F0b3I7XG5cbm1vZHVsZS5leHBvcnRzID0gbmF2aWdhdG9yICYmIG5hdmlnYXRvci51c2VyQWdlbnQgfHwgJyc7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBUWVBFKSB7XG4gIGlmICghaXNPYmplY3QoaXQpIHx8IGl0Ll90ICE9PSBUWVBFKSB0aHJvdyBUeXBlRXJyb3IoJ0luY29tcGF0aWJsZSByZWNlaXZlciwgJyArIFRZUEUgKyAnIHJlcXVpcmVkIScpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbnZhciB3a3NFeHQgPSByZXF1aXJlKCcuL193a3MtZXh0Jyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICB2YXIgJFN5bWJvbCA9IGNvcmUuU3ltYm9sIHx8IChjb3JlLlN5bWJvbCA9IExJQlJBUlkgPyB7fSA6IGdsb2JhbC5TeW1ib2wgfHwge30pO1xuICBpZiAobmFtZS5jaGFyQXQoMCkgIT0gJ18nICYmICEobmFtZSBpbiAkU3ltYm9sKSkgZGVmaW5lUHJvcGVydHkoJFN5bWJvbCwgbmFtZSwgeyB2YWx1ZTogd2tzRXh0LmYobmFtZSkgfSk7XG59O1xuIiwiZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fd2tzJyk7XG4iLCJ2YXIgc3RvcmUgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgnd2tzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG52YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuU3ltYm9sO1xudmFyIFVTRV9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09ICdmdW5jdGlvbic7XG5cbnZhciAkZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9XG4gICAgVVNFX1NZTUJPTCAmJiBTeW1ib2xbbmFtZV0gfHwgKFVTRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG5cbiRleHBvcnRzLnN0b3JlID0gc3RvcmU7XG4iLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb3JlJykuZ2V0SXRlcmF0b3JNZXRob2QgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGl0W0lURVJBVE9SXVxuICAgIHx8IGl0WydAQGl0ZXJhdG9yJ11cbiAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldO1xufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGdldCA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvciA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgaXRlckZuID0gZ2V0KGl0KTtcbiAgaWYgKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgaXRlcmFibGUhJyk7XG4gIHJldHVybiBhbk9iamVjdChpdGVyRm4uY2FsbChpdCkpO1xufTtcbiIsInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5pc0l0ZXJhYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBPID0gT2JqZWN0KGl0KTtcbiAgcmV0dXJuIE9bSVRFUkFUT1JdICE9PSB1bmRlZmluZWRcbiAgICB8fCAnQEBpdGVyYXRvcicgaW4gT1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICB8fCBJdGVyYXRvcnMuaGFzT3duUHJvcGVydHkoY2xhc3NvZihPKSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuL19pdGVyLWNhbGwnKTtcbnZhciBpc0FycmF5SXRlciA9IHJlcXVpcmUoJy4vX2lzLWFycmF5LWl0ZXInKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fY3JlYXRlLXByb3BlcnR5Jyk7XG52YXIgZ2V0SXRlckZuID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9faXRlci1kZXRlY3QnKShmdW5jdGlvbiAoaXRlcikgeyBBcnJheS5mcm9tKGl0ZXIpOyB9KSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjIuMSBBcnJheS5mcm9tKGFycmF5TGlrZSwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gIGZyb206IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlIC8qICwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQgKi8pIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KGFycmF5TGlrZSk7XG4gICAgdmFyIEMgPSB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5O1xuICAgIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgbWFwZm4gPSBhTGVuID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgaXRlckZuID0gZ2V0SXRlckZuKE8pO1xuICAgIHZhciBsZW5ndGgsIHJlc3VsdCwgc3RlcCwgaXRlcmF0b3I7XG4gICAgaWYgKG1hcHBpbmcpIG1hcGZuID0gY3R4KG1hcGZuLCBhTGVuID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCwgMik7XG4gICAgLy8gaWYgb2JqZWN0IGlzbid0IGl0ZXJhYmxlIG9yIGl0J3MgYXJyYXkgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yIC0gdXNlIHNpbXBsZSBjYXNlXG4gICAgaWYgKGl0ZXJGbiAhPSB1bmRlZmluZWQgJiYgIShDID09IEFycmF5ICYmIGlzQXJyYXlJdGVyKGl0ZXJGbikpKSB7XG4gICAgICBmb3IgKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoTyksIHJlc3VsdCA9IG5ldyBDKCk7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgaW5kZXgrKykge1xuICAgICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCBtYXBwaW5nID8gY2FsbChpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpIDogc3RlcC52YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICAgIGZvciAocmVzdWx0ID0gbmV3IEMobGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZyA/IG1hcGZuKE9baW5kZXhdLCBpbmRleCkgOiBPW2luZGV4XSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5sZW5ndGggPSBpbmRleDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcbiIsIi8vIDIyLjEuMi4yIC8gMTUuNC4zLjIgQXJyYXkuaXNBcnJheShhcmcpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ0FycmF5JywgeyBpc0FycmF5OiByZXF1aXJlKCcuL19pcy1hcnJheScpIH0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKTtcbnZhciBzdGVwID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xuXG4vLyAyMi4xLjMuNCBBcnJheS5wcm90b3R5cGUuZW50cmllcygpXG4vLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmtleXMoKVxuLy8gMjIuMS4zLjI5IEFycmF5LnByb3RvdHlwZS52YWx1ZXMoKVxuLy8gMjIuMS4zLjMwIEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICB0aGlzLl90ID0gdG9JT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4gIHRoaXMuX2sgPSBraW5kOyAgICAgICAgICAgICAgICAvLyBraW5kXG4vLyAyMi4xLjUuMi4xICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIE8gPSB0aGlzLl90O1xuICB2YXIga2luZCA9IHRoaXMuX2s7XG4gIHZhciBpbmRleCA9IHRoaXMuX2krKztcbiAgaWYgKCFPIHx8IGluZGV4ID49IE8ubGVuZ3RoKSB7XG4gICAgdGhpcy5fdCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gc3RlcCgxKTtcbiAgfVxuICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiBzdGVwKDAsIGluZGV4KTtcbiAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiBzdGVwKDAsIE9baW5kZXhdKTtcbiAgcmV0dXJuIHN0ZXAoMCwgW2luZGV4LCBPW2luZGV4XV0pO1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyUgKDkuNC40LjYsIDkuNC40LjcpXG5JdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBzdHJvbmcgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uLXN0cm9uZycpO1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIE1BUCA9ICdNYXAnO1xuXG4vLyAyMy4xIE1hcCBPYmplY3RzXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24nKShNQVAsIGZ1bmN0aW9uIChnZXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIE1hcCgpIHsgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCB7XG4gIC8vIDIzLjEuMy42IE1hcC5wcm90b3R5cGUuZ2V0KGtleSlcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gc3Ryb25nLmdldEVudHJ5KHZhbGlkYXRlKHRoaXMsIE1BUCksIGtleSk7XG4gICAgcmV0dXJuIGVudHJ5ICYmIGVudHJ5LnY7XG4gIH0sXG4gIC8vIDIzLjEuMy45IE1hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpXG4gIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gc3Ryb25nLmRlZih2YWxpZGF0ZSh0aGlzLCBNQVApLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7XG4gIH1cbn0sIHN0cm9uZywgdHJ1ZSk7XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHsgY3JlYXRlOiByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJykgfSk7XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuLy8gMTkuMS4yLjQgLyAxNS4yLjMuNiBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyksICdPYmplY3QnLCB7IGRlZmluZVByb3BlcnR5OiByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mIH0pO1xuIiwiLy8gMTkuMS4yLjYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKVxudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2dldE93blByb3BlcnR5RGVzY3JpcHRvcicsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KSB7XG4gICAgcmV0dXJuICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodG9JT2JqZWN0KGl0KSwga2V5KTtcbiAgfTtcbn0pO1xuIiwiLy8gMTkuMS4yLjkgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciAkZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnZ2V0UHJvdG90eXBlT2YnLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZihpdCkge1xuICAgIHJldHVybiAkZ2V0UHJvdG90eXBlT2YodG9PYmplY3QoaXQpKTtcbiAgfTtcbn0pO1xuIiwiLy8gMTkuMS4yLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgna2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGtleXMoaXQpIHtcbiAgICByZXR1cm4gJGtleXModG9PYmplY3QoaXQpKTtcbiAgfTtcbn0pO1xuIiwiLy8gMTkuMS4zLjE5IE9iamVjdC5zZXRQcm90b3R5cGVPZihPLCBwcm90bylcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHsgc2V0UHJvdG90eXBlT2Y6IHJlcXVpcmUoJy4vX3NldC1wcm90bycpLnNldCB9KTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHBhcnNlSW50ID0gcmVxdWlyZSgnLi9fcGFyc2UtaW50Jyk7XG4vLyAxOC4yLjUgcGFyc2VJbnQoc3RyaW5nLCByYWRpeClcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5GICogKHBhcnNlSW50ICE9ICRwYXJzZUludCksIHsgcGFyc2VJbnQ6ICRwYXJzZUludCB9KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHRhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4vX21pY3JvdGFzaycpKCk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4vX3BlcmZvcm0nKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuL191c2VyLWFnZW50Jyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuL19wcm9taXNlLXJlc29sdmUnKTtcbnZhciBQUk9NSVNFID0gJ1Byb21pc2UnO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIHZlcnNpb25zID0gcHJvY2VzcyAmJiBwcm9jZXNzLnZlcnNpb25zO1xudmFyIHY4ID0gdmVyc2lvbnMgJiYgdmVyc2lvbnMudjggfHwgJyc7XG52YXIgJFByb21pc2UgPSBnbG9iYWxbUFJPTUlTRV07XG52YXIgaXNOb2RlID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG52YXIgZW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgSW50ZXJuYWwsIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFdyYXBwZXI7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mO1xuXG52YXIgVVNFX05BVElWRSA9ICEhZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIC8vIGNvcnJlY3Qgc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICAgIHZhciBwcm9taXNlID0gJFByb21pc2UucmVzb2x2ZSgxKTtcbiAgICB2YXIgRmFrZVByb21pc2UgPSAocHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9KVtyZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpXSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gICAgICBleGVjKGVtcHR5LCBlbXB0eSk7XG4gICAgfTtcbiAgICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gICAgcmV0dXJuIChpc05vZGUgfHwgdHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCA9PSAnZnVuY3Rpb24nKVxuICAgICAgJiYgcHJvbWlzZS50aGVuKGVtcHR5KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlXG4gICAgICAvLyB2OCA2LjYgKE5vZGUgMTAgYW5kIENocm9tZSA2NikgaGF2ZSBhIGJ1ZyB3aXRoIHJlc29sdmluZyBjdXN0b20gdGhlbmFibGVzXG4gICAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD04MzA1NjVcbiAgICAgIC8vIHdlIGNhbid0IGRldGVjdCBpdCBzeW5jaHJvbm91c2x5LCBzbyBqdXN0IGNoZWNrIHZlcnNpb25zXG4gICAgICAmJiB2OC5pbmRleE9mKCc2LjYnKSAhPT0gMFxuICAgICAgJiYgdXNlckFnZW50LmluZGV4T2YoJ0Nocm9tZS82NicpID09PSAtMTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG59KCk7XG5cbi8vIGhlbHBlcnNcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7XG59O1xudmFyIG5vdGlmeSA9IGZ1bmN0aW9uIChwcm9taXNlLCBpc1JlamVjdCkge1xuICBpZiAocHJvbWlzZS5fbikgcmV0dXJuO1xuICBwcm9taXNlLl9uID0gdHJ1ZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYztcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciBvayA9IHByb21pc2UuX3MgPT0gMTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHJ1biA9IGZ1bmN0aW9uIChyZWFjdGlvbikge1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgICAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTtcbiAgICAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7XG4gICAgICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICAgICAgdmFyIHJlc3VsdCwgdGhlbiwgZXhpdGVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZS5faCA9PSAyKSBvbkhhbmRsZVVuaGFuZGxlZChwcm9taXNlKTtcbiAgICAgICAgICAgIHByb21pc2UuX2ggPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGFuZGxlciA9PT0gdHJ1ZSkgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoZG9tYWluKSBkb21haW4uZW50ZXIoKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZXIodmFsdWUpOyAvLyBtYXkgdGhyb3dcbiAgICAgICAgICAgIGlmIChkb21haW4pIHtcbiAgICAgICAgICAgICAgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgICAgICAgZXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSkge1xuICAgICAgICAgICAgcmVqZWN0KFR5cGVFcnJvcignUHJvbWlzZS1jaGFpbiBjeWNsZScpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRoZW4uY2FsbChyZXN1bHQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHJlamVjdCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChkb21haW4gJiYgIWV4aXRlZCkgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2hpbGUgKGNoYWluLmxlbmd0aCA+IGkpIHJ1bihjaGFpbltpKytdKTsgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICBwcm9taXNlLl9jID0gW107XG4gICAgcHJvbWlzZS5fbiA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhcHJvbWlzZS5faCkgb25VbmhhbmRsZWQocHJvbWlzZSk7XG4gIH0pO1xufTtcbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciB1bmhhbmRsZWQgPSBpc1VuaGFuZGxlZChwcm9taXNlKTtcbiAgICB2YXIgcmVzdWx0LCBoYW5kbGVyLCBjb25zb2xlO1xuICAgIGlmICh1bmhhbmRsZWQpIHtcbiAgICAgIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaXNOb2RlKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9IGdsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbikge1xuICAgICAgICAgIGhhbmRsZXIoeyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHZhbHVlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKChjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGUpICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHByb21pc2UuX2ggPSBpc05vZGUgfHwgaXNVbmhhbmRsZWQocHJvbWlzZSkgPyAyIDogMTtcbiAgICB9IHByb21pc2UuX2EgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHVuaGFuZGxlZCAmJiByZXN1bHQuZSkgdGhyb3cgcmVzdWx0LnY7XG4gIH0pO1xufTtcbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHJldHVybiBwcm9taXNlLl9oICE9PSAxICYmIChwcm9taXNlLl9hIHx8IHByb21pc2UuX2MpLmxlbmd0aCA9PT0gMDtcbn07XG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhhbmRsZXI7XG4gICAgaWYgKGlzTm9kZSkge1xuICAgICAgcHJvY2Vzcy5lbWl0KCdyZWplY3Rpb25IYW5kbGVkJywgcHJvbWlzZSk7XG4gICAgfSBlbHNlIGlmIChoYW5kbGVyID0gZ2xvYmFsLm9ucmVqZWN0aW9uaGFuZGxlZCkge1xuICAgICAgaGFuZGxlcih7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcHJvbWlzZS5fdiB9KTtcbiAgICB9XG4gIH0pO1xufTtcbnZhciAkcmVqZWN0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICBwcm9taXNlLl92ID0gdmFsdWU7XG4gIHByb21pc2UuX3MgPSAyO1xuICBpZiAoIXByb21pc2UuX2EpIHByb21pc2UuX2EgPSBwcm9taXNlLl9jLnNsaWNlKCk7XG4gIG5vdGlmeShwcm9taXNlLCB0cnVlKTtcbn07XG52YXIgJHJlc29sdmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICB2YXIgdGhlbjtcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICB0cnkge1xuICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkgdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKSkge1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7IF93OiBwcm9taXNlLCBfZDogZmFsc2UgfTsgLy8gd3JhcFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgY3R4KCRyZXNvbHZlLCB3cmFwcGVyLCAxKSwgY3R4KCRyZWplY3QsIHdyYXBwZXIsIDEpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICRyZWplY3QuY2FsbCh3cmFwcGVyLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgICAgIHByb21pc2UuX3MgPSAxO1xuICAgICAgbm90aWZ5KHByb21pc2UsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAkcmVqZWN0LmNhbGwoeyBfdzogcHJvbWlzZSwgX2Q6IGZhbHNlIH0sIGUpOyAvLyB3cmFwXG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZiAoIVVTRV9OQVRJVkUpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgJFByb21pc2UgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkUHJvbWlzZSwgUFJPTUlTRSwgJ19oJyk7XG4gICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTtcbiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihjdHgoJHJlc29sdmUsIHRoaXMsIDEpLCBjdHgoJHJlamVjdCwgdGhpcywgMSkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgJHJlamVjdC5jYWxsKHRoaXMsIGVycik7XG4gICAgfVxuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgdGhpcy5fYyA9IFtdOyAgICAgICAgICAgICAvLyA8LSBhd2FpdGluZyByZWFjdGlvbnNcbiAgICB0aGlzLl9hID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIGNoZWNrZWQgaW4gaXNVbmhhbmRsZWQgcmVhY3Rpb25zXG4gICAgdGhpcy5fcyA9IDA7ICAgICAgICAgICAgICAvLyA8LSBzdGF0ZVxuICAgIHRoaXMuX2QgPSBmYWxzZTsgICAgICAgICAgLy8gPC0gZG9uZVxuICAgIHRoaXMuX3YgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gdmFsdWVcbiAgICB0aGlzLl9oID0gMDsgICAgICAgICAgICAgIC8vIDwtIHJlamVjdGlvbiBzdGF0ZSwgMCAtIGRlZmF1bHQsIDEgLSBoYW5kbGVkLCAyIC0gdW5oYW5kbGVkXG4gICAgdGhpcy5fbiA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBub3RpZnlcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJykoJFByb21pc2UucHJvdG90eXBlLCB7XG4gICAgLy8gMjUuNC41LjMgUHJvbWlzZS5wcm90b3R5cGUudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZClcbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2YXIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJFByb21pc2UpKTtcbiAgICAgIHJlYWN0aW9uLm9rID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gaXNOb2RlID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHRoaXMuX2EpIHRoaXMuX2EucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAodGhpcy5fcykgbm90aWZ5KHRoaXMsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gMjUuNC41LjEgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2gob25SZWplY3RlZClcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbiAob25SZWplY3RlZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IEludGVybmFsKCk7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBjdHgoJHJlc29sdmUsIHByb21pc2UsIDEpO1xuICAgIHRoaXMucmVqZWN0ID0gY3R4KCRyZWplY3QsIHByb21pc2UsIDEpO1xuICB9O1xuICBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICAgIHJldHVybiBDID09PSAkUHJvbWlzZSB8fCBDID09PSBXcmFwcGVyXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHsgUHJvbWlzZTogJFByb21pc2UgfSk7XG5yZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpKCRQcm9taXNlLCBQUk9NSVNFKTtcbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoUFJPTUlTRSk7XG5XcmFwcGVyID0gcmVxdWlyZSgnLi9fY29yZScpW1BST01JU0VdO1xuXG4vLyBzdGF0aWNzXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC41IFByb21pc2UucmVqZWN0KHIpXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpO1xuICAgIHZhciAkJHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgICQkcmVqZWN0KHIpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTElCUkFSWSB8fCAhVVNFX05BVElWRSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjYgUHJvbWlzZS5yZXNvbHZlKHgpXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCkge1xuICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShMSUJSQVJZICYmIHRoaXMgPT09IFdyYXBwZXIgPyAkUHJvbWlzZSA6IHRoaXMsIHgpO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIShVU0VfTkFUSVZFICYmIHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24gKGl0ZXIpIHtcbiAgJFByb21pc2UuYWxsKGl0ZXIpWydjYXRjaCddKGVtcHR5KTtcbn0pKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuMSBQcm9taXNlLmFsbChpdGVyYWJsZSlcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgJGluZGV4ID0gaW5kZXgrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzWyRpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmUpIHJlamVjdChyZXN1bHQudik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gMjUuNC40LjQgUHJvbWlzZS5yYWNlKGl0ZXJhYmxlKVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lKSByZWplY3QocmVzdWx0LnYpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHN0cm9uZyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tc3Ryb25nJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgU0VUID0gJ1NldCc7XG5cbi8vIDIzLjIgU2V0IE9iamVjdHNcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKFNFVCwgZnVuY3Rpb24gKGdldCkge1xuICByZXR1cm4gZnVuY3Rpb24gU2V0KCkgeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuMi4zLjEgU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpXG4gIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgcmV0dXJuIHN0cm9uZy5kZWYodmFsaWRhdGUodGhpcywgU0VUKSwgdmFsdWUgPSB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSwgdmFsdWUpO1xuICB9XG59LCBzdHJvbmcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRhdCA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKHRydWUpO1xuXG4vLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uIChpdGVyYXRlZCkge1xuICB0aGlzLl90ID0gU3RyaW5nKGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4vLyAyMS4xLjUuMi4xICVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGluZGV4ID0gdGhpcy5faTtcbiAgdmFyIHBvaW50O1xuICBpZiAoaW5kZXggPj0gTy5sZW5ndGgpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgcG9pbnQgPSAkYXQoTywgaW5kZXgpO1xuICB0aGlzLl9pICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHsgdmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZSB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBFQ01BU2NyaXB0IDYgc3ltYm9scyBzaGltXG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgTUVUQSA9IHJlcXVpcmUoJy4vX21ldGEnKS5LRVk7XG52YXIgJGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuL19zaGFyZWQnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG52YXIgd2tzID0gcmVxdWlyZSgnLi9fd2tzJyk7XG52YXIgd2tzRXh0ID0gcmVxdWlyZSgnLi9fd2tzLWV4dCcpO1xudmFyIHdrc0RlZmluZSA9IHJlcXVpcmUoJy4vX3drcy1kZWZpbmUnKTtcbnZhciBlbnVtS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0ta2V5cycpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuL19pcy1hcnJheScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIF9jcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgZ09QTkV4dCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuLWV4dCcpO1xudmFyICRHT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKTtcbnZhciAkRFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgZ09QRCA9ICRHT1BELmY7XG52YXIgZFAgPSAkRFAuZjtcbnZhciBnT1BOID0gZ09QTkV4dC5mO1xudmFyICRTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyICRKU09OID0gZ2xvYmFsLkpTT047XG52YXIgX3N0cmluZ2lmeSA9ICRKU09OICYmICRKU09OLnN0cmluZ2lmeTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBISURERU4gPSB3a3MoJ19oaWRkZW4nKTtcbnZhciBUT19QUklNSVRJVkUgPSB3a3MoJ3RvUHJpbWl0aXZlJyk7XG52YXIgaXNFbnVtID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG52YXIgU3ltYm9sUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC1yZWdpc3RyeScpO1xudmFyIEFsbFN5bWJvbHMgPSBzaGFyZWQoJ3N5bWJvbHMnKTtcbnZhciBPUFN5bWJvbHMgPSBzaGFyZWQoJ29wLXN5bWJvbHMnKTtcbnZhciBPYmplY3RQcm90byA9IE9iamVjdFtQUk9UT1RZUEVdO1xudmFyIFVTRV9OQVRJVkUgPSB0eXBlb2YgJFN5bWJvbCA9PSAnZnVuY3Rpb24nO1xudmFyIFFPYmplY3QgPSBnbG9iYWwuUU9iamVjdDtcbi8vIERvbid0IHVzZSBzZXR0ZXJzIGluIFF0IFNjcmlwdCwgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzE3M1xudmFyIHNldHRlciA9ICFRT2JqZWN0IHx8ICFRT2JqZWN0W1BST1RPVFlQRV0gfHwgIVFPYmplY3RbUFJPVE9UWVBFXS5maW5kQ2hpbGQ7XG5cbi8vIGZhbGxiYWNrIGZvciBvbGQgQW5kcm9pZCwgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTY4N1xudmFyIHNldFN5bWJvbERlc2MgPSBERVNDUklQVE9SUyAmJiAkZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gX2NyZWF0ZShkUCh7fSwgJ2EnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBkUCh0aGlzLCAnYScsIHsgdmFsdWU6IDcgfSkuYTsgfVxuICB9KSkuYSAhPSA3O1xufSkgPyBmdW5jdGlvbiAoaXQsIGtleSwgRCkge1xuICB2YXIgcHJvdG9EZXNjID0gZ09QRChPYmplY3RQcm90bywga2V5KTtcbiAgaWYgKHByb3RvRGVzYykgZGVsZXRlIE9iamVjdFByb3RvW2tleV07XG4gIGRQKGl0LCBrZXksIEQpO1xuICBpZiAocHJvdG9EZXNjICYmIGl0ICE9PSBPYmplY3RQcm90bykgZFAoT2JqZWN0UHJvdG8sIGtleSwgcHJvdG9EZXNjKTtcbn0gOiBkUDtcblxudmFyIHdyYXAgPSBmdW5jdGlvbiAodGFnKSB7XG4gIHZhciBzeW0gPSBBbGxTeW1ib2xzW3RhZ10gPSBfY3JlYXRlKCRTeW1ib2xbUFJPVE9UWVBFXSk7XG4gIHN5bS5fayA9IHRhZztcbiAgcmV0dXJuIHN5bTtcbn07XG5cbnZhciBpc1N5bWJvbCA9IFVTRV9OQVRJVkUgJiYgdHlwZW9mICRTeW1ib2wuaXRlcmF0b3IgPT0gJ3N5bWJvbCcgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJztcbn0gOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0IGluc3RhbmNlb2YgJFN5bWJvbDtcbn07XG5cbnZhciAkZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBEKSB7XG4gIGlmIChpdCA9PT0gT2JqZWN0UHJvdG8pICRkZWZpbmVQcm9wZXJ0eShPUFN5bWJvbHMsIGtleSwgRCk7XG4gIGFuT2JqZWN0KGl0KTtcbiAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcbiAgYW5PYmplY3QoRCk7XG4gIGlmIChoYXMoQWxsU3ltYm9scywga2V5KSkge1xuICAgIGlmICghRC5lbnVtZXJhYmxlKSB7XG4gICAgICBpZiAoIWhhcyhpdCwgSElEREVOKSkgZFAoaXQsIEhJRERFTiwgY3JlYXRlRGVzYygxLCB7fSkpO1xuICAgICAgaXRbSElEREVOXVtrZXldID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pIGl0W0hJRERFTl1ba2V5XSA9IGZhbHNlO1xuICAgICAgRCA9IF9jcmVhdGUoRCwgeyBlbnVtZXJhYmxlOiBjcmVhdGVEZXNjKDAsIGZhbHNlKSB9KTtcbiAgICB9IHJldHVybiBzZXRTeW1ib2xEZXNjKGl0LCBrZXksIEQpO1xuICB9IHJldHVybiBkUChpdCwga2V5LCBEKTtcbn07XG52YXIgJGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKGl0LCBQKSB7XG4gIGFuT2JqZWN0KGl0KTtcbiAgdmFyIGtleXMgPSBlbnVtS2V5cyhQID0gdG9JT2JqZWN0KFApKTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbCA9IGtleXMubGVuZ3RoO1xuICB2YXIga2V5O1xuICB3aGlsZSAobCA+IGkpICRkZWZpbmVQcm9wZXJ0eShpdCwga2V5ID0ga2V5c1tpKytdLCBQW2tleV0pO1xuICByZXR1cm4gaXQ7XG59O1xudmFyICRjcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaXQsIFApIHtcbiAgcmV0dXJuIFAgPT09IHVuZGVmaW5lZCA/IF9jcmVhdGUoaXQpIDogJGRlZmluZVByb3BlcnRpZXMoX2NyZWF0ZShpdCksIFApO1xufTtcbnZhciAkcHJvcGVydHlJc0VudW1lcmFibGUgPSBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShrZXkpIHtcbiAgdmFyIEUgPSBpc0VudW0uY2FsbCh0aGlzLCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKTtcbiAgaWYgKHRoaXMgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBFIHx8ICFoYXModGhpcywga2V5KSB8fCAhaGFzKEFsbFN5bWJvbHMsIGtleSkgfHwgaGFzKHRoaXMsIEhJRERFTikgJiYgdGhpc1tISURERU5dW2tleV0gPyBFIDogdHJ1ZTtcbn07XG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KSB7XG4gIGl0ID0gdG9JT2JqZWN0KGl0KTtcbiAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcbiAgaWYgKGl0ID09PSBPYmplY3RQcm90byAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9QU3ltYm9scywga2V5KSkgcmV0dXJuO1xuICB2YXIgRCA9IGdPUEQoaXQsIGtleSk7XG4gIGlmIChEICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICEoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkpIEQuZW51bWVyYWJsZSA9IHRydWU7XG4gIHJldHVybiBEO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgdmFyIG5hbWVzID0gZ09QTih0b0lPYmplY3QoaXQpKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgaSA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSB7XG4gICAgaWYgKCFoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYga2V5ICE9IEhJRERFTiAmJiBrZXkgIT0gTUVUQSkgcmVzdWx0LnB1c2goa2V5KTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSB7XG4gIHZhciBJU19PUCA9IGl0ID09PSBPYmplY3RQcm90bztcbiAgdmFyIG5hbWVzID0gZ09QTihJU19PUCA/IE9QU3ltYm9scyA6IHRvSU9iamVjdChpdCkpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpID0gMDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIHtcbiAgICBpZiAoaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pICYmIChJU19PUCA/IGhhcyhPYmplY3RQcm90bywga2V5KSA6IHRydWUpKSByZXN1bHQucHVzaChBbGxTeW1ib2xzW2tleV0pO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyAxOS40LjEuMSBTeW1ib2woW2Rlc2NyaXB0aW9uXSlcbmlmICghVVNFX05BVElWRSkge1xuICAkU3ltYm9sID0gZnVuY3Rpb24gU3ltYm9sKCkge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgJFN5bWJvbCkgdGhyb3cgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IhJyk7XG4gICAgdmFyIHRhZyA9IHVpZChhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7XG4gICAgdmFyICRzZXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh0aGlzID09PSBPYmplY3RQcm90bykgJHNldC5jYWxsKE9QU3ltYm9scywgdmFsdWUpO1xuICAgICAgaWYgKGhhcyh0aGlzLCBISURERU4pICYmIGhhcyh0aGlzW0hJRERFTl0sIHRhZykpIHRoaXNbSElEREVOXVt0YWddID0gZmFsc2U7XG4gICAgICBzZXRTeW1ib2xEZXNjKHRoaXMsIHRhZywgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xuICAgIH07XG4gICAgaWYgKERFU0NSSVBUT1JTICYmIHNldHRlcikgc2V0U3ltYm9sRGVzYyhPYmplY3RQcm90bywgdGFnLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgc2V0OiAkc2V0IH0pO1xuICAgIHJldHVybiB3cmFwKHRhZyk7XG4gIH07XG4gIHJlZGVmaW5lKCRTeW1ib2xbUFJPVE9UWVBFXSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2s7XG4gIH0pO1xuXG4gICRHT1BELmYgPSAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuICAkRFAuZiA9ICRkZWZpbmVQcm9wZXJ0eTtcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mID0gZ09QTkV4dC5mID0gJGdldE93blByb3BlcnR5TmFtZXM7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1waWUnKS5mID0gJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuICByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpLmYgPSAkZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4gIGlmIChERVNDUklQVE9SUyAmJiAhcmVxdWlyZSgnLi9fbGlicmFyeScpKSB7XG4gICAgcmVkZWZpbmUoT2JqZWN0UHJvdG8sICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICRwcm9wZXJ0eUlzRW51bWVyYWJsZSwgdHJ1ZSk7XG4gIH1cblxuICB3a3NFeHQuZiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIHdyYXAod2tzKG5hbWUpKTtcbiAgfTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgeyBTeW1ib2w6ICRTeW1ib2wgfSk7XG5cbmZvciAodmFyIGVzNlN5bWJvbHMgPSAoXG4gIC8vIDE5LjQuMi4yLCAxOS40LjIuMywgMTkuNC4yLjQsIDE5LjQuMi42LCAxOS40LjIuOCwgMTkuNC4yLjksIDE5LjQuMi4xMCwgMTkuNC4yLjExLCAxOS40LjIuMTIsIDE5LjQuMi4xMywgMTkuNC4yLjE0XG4gICdoYXNJbnN0YW5jZSxpc0NvbmNhdFNwcmVhZGFibGUsaXRlcmF0b3IsbWF0Y2gscmVwbGFjZSxzZWFyY2gsc3BlY2llcyxzcGxpdCx0b1ByaW1pdGl2ZSx0b1N0cmluZ1RhZyx1bnNjb3BhYmxlcydcbikuc3BsaXQoJywnKSwgaiA9IDA7IGVzNlN5bWJvbHMubGVuZ3RoID4gajspd2tzKGVzNlN5bWJvbHNbaisrXSk7XG5cbmZvciAodmFyIHdlbGxLbm93blN5bWJvbHMgPSAka2V5cyh3a3Muc3RvcmUpLCBrID0gMDsgd2VsbEtub3duU3ltYm9scy5sZW5ndGggPiBrOykgd2tzRGVmaW5lKHdlbGxLbm93blN5bWJvbHNbaysrXSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdTeW1ib2wnLCB7XG4gIC8vIDE5LjQuMi4xIFN5bWJvbC5mb3Ioa2V5KVxuICAnZm9yJzogZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBoYXMoU3ltYm9sUmVnaXN0cnksIGtleSArPSAnJylcbiAgICAgID8gU3ltYm9sUmVnaXN0cnlba2V5XVxuICAgICAgOiBTeW1ib2xSZWdpc3RyeVtrZXldID0gJFN5bWJvbChrZXkpO1xuICB9LFxuICAvLyAxOS40LjIuNSBTeW1ib2wua2V5Rm9yKHN5bSlcbiAga2V5Rm9yOiBmdW5jdGlvbiBrZXlGb3Ioc3ltKSB7XG4gICAgaWYgKCFpc1N5bWJvbChzeW0pKSB0aHJvdyBUeXBlRXJyb3Ioc3ltICsgJyBpcyBub3QgYSBzeW1ib2whJyk7XG4gICAgZm9yICh2YXIga2V5IGluIFN5bWJvbFJlZ2lzdHJ5KSBpZiAoU3ltYm9sUmVnaXN0cnlba2V5XSA9PT0gc3ltKSByZXR1cm4ga2V5O1xuICB9LFxuICB1c2VTZXR0ZXI6IGZ1bmN0aW9uICgpIHsgc2V0dGVyID0gdHJ1ZTsgfSxcbiAgdXNlU2ltcGxlOiBmdW5jdGlvbiAoKSB7IHNldHRlciA9IGZhbHNlOyB9XG59KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ09iamVjdCcsIHtcbiAgLy8gMTkuMS4yLjIgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuICBjcmVhdGU6ICRjcmVhdGUsXG4gIC8vIDE5LjEuMi40IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuICBkZWZpbmVQcm9wZXJ0eTogJGRlZmluZVByb3BlcnR5LFxuICAvLyAxOS4xLjIuMyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKVxuICBkZWZpbmVQcm9wZXJ0aWVzOiAkZGVmaW5lUHJvcGVydGllcyxcbiAgLy8gMTkuMS4yLjYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKVxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIC8vIDE5LjEuMi43IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG4gIGdldE93blByb3BlcnR5TmFtZXM6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzLFxuICAvLyAxOS4xLjIuOCBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKE8pXG4gIGdldE93blByb3BlcnR5U3ltYm9sczogJGdldE93blByb3BlcnR5U3ltYm9sc1xufSk7XG5cbi8vIDI0LjMuMiBKU09OLnN0cmluZ2lmeSh2YWx1ZSBbLCByZXBsYWNlciBbLCBzcGFjZV1dKVxuJEpTT04gJiYgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoIVVTRV9OQVRJVkUgfHwgJGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIFMgPSAkU3ltYm9sKCk7XG4gIC8vIE1TIEVkZ2UgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIHt9XG4gIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuICAvLyBWOCB0aHJvd3Mgb24gYm94ZWQgc3ltYm9sc1xuICByZXR1cm4gX3N0cmluZ2lmeShbU10pICE9ICdbbnVsbF0nIHx8IF9zdHJpbmdpZnkoeyBhOiBTIH0pICE9ICd7fScgfHwgX3N0cmluZ2lmeShPYmplY3QoUykpICE9ICd7fSc7XG59KSksICdKU09OJywge1xuICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCkge1xuICAgIHZhciBhcmdzID0gW2l0XTtcbiAgICB2YXIgaSA9IDE7XG4gICAgdmFyIHJlcGxhY2VyLCAkcmVwbGFjZXI7XG4gICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgICRyZXBsYWNlciA9IHJlcGxhY2VyID0gYXJnc1sxXTtcbiAgICBpZiAoIWlzT2JqZWN0KHJlcGxhY2VyKSAmJiBpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSkgcmV0dXJuOyAvLyBJRTggcmV0dXJucyBzdHJpbmcgb24gdW5kZWZpbmVkXG4gICAgaWYgKCFpc0FycmF5KHJlcGxhY2VyKSkgcmVwbGFjZXIgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiAkcmVwbGFjZXIgPT0gJ2Z1bmN0aW9uJykgdmFsdWUgPSAkcmVwbGFjZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICAgIGlmICghaXNTeW1ib2wodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBhcmdzWzFdID0gcmVwbGFjZXI7XG4gICAgcmV0dXJuIF9zdHJpbmdpZnkuYXBwbHkoJEpTT04sIGFyZ3MpO1xuICB9XG59KTtcblxuLy8gMTkuNC4zLjQgU3ltYm9sLnByb3RvdHlwZVtAQHRvUHJpbWl0aXZlXShoaW50KVxuJFN5bWJvbFtQUk9UT1RZUEVdW1RPX1BSSU1JVElWRV0gfHwgcmVxdWlyZSgnLi9faGlkZScpKCRTeW1ib2xbUFJPVE9UWVBFXSwgVE9fUFJJTUlUSVZFLCAkU3ltYm9sW1BST1RPVFlQRV0udmFsdWVPZik7XG4vLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZygkU3ltYm9sLCAnU3ltYm9sJyk7XG4vLyAyMC4yLjEuOSBNYXRoW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZyhNYXRoLCAnTWF0aCcsIHRydWUpO1xuLy8gMjQuMy4zIEpTT05bQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKGdsb2JhbC5KU09OLCAnSlNPTicsIHRydWUpO1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtbWFwLmZyb21cbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLWZyb20nKSgnTWFwJyk7XG4iLCIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy1tYXAub2ZcbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLW9mJykoJ01hcCcpO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQnJ1YW50L01hcC1TZXQucHJvdG90eXBlLnRvSlNPTlxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LlIsICdNYXAnLCB7IHRvSlNPTjogcmVxdWlyZSgnLi9fY29sbGVjdGlvbi10by1qc29uJykoJ01hcCcpIH0pO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS1maW5hbGx5XG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHByb21pc2VSZXNvbHZlID0gcmVxdWlyZSgnLi9fcHJvbWlzZS1yZXNvbHZlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5SLCAnUHJvbWlzZScsIHsgJ2ZpbmFsbHknOiBmdW5jdGlvbiAob25GaW5hbGx5KSB7XG4gIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIGNvcmUuUHJvbWlzZSB8fCBnbG9iYWwuUHJvbWlzZSk7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIG9uRmluYWxseSA9PSAnZnVuY3Rpb24nO1xuICByZXR1cm4gdGhpcy50aGVuKFxuICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoeCkge1xuICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHg7IH0pO1xuICAgIH0gOiBvbkZpbmFsbHksXG4gICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyB0aHJvdyBlOyB9KTtcbiAgICB9IDogb25GaW5hbGx5XG4gICk7XG59IH0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS10cnlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4vX3BlcmZvcm0nKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdQcm9taXNlJywgeyAndHJ5JzogZnVuY3Rpb24gKGNhbGxiYWNrZm4pIHtcbiAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkuZih0aGlzKTtcbiAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oY2FsbGJhY2tmbik7XG4gIChyZXN1bHQuZSA/IHByb21pc2VDYXBhYmlsaXR5LnJlamVjdCA6IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmUpKHJlc3VsdC52KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59IH0pO1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtc2V0LmZyb21cbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLWZyb20nKSgnU2V0Jyk7XG4iLCIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy1zZXQub2ZcbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLW9mJykoJ1NldCcpO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQnJ1YW50L01hcC1TZXQucHJvdG90eXBlLnRvSlNPTlxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LlIsICdTZXQnLCB7IHRvSlNPTjogcmVxdWlyZSgnLi9fY29sbGVjdGlvbi10by1qc29uJykoJ1NldCcpIH0pO1xuIiwicmVxdWlyZSgnLi9fd2tzLWRlZmluZScpKCdhc3luY0l0ZXJhdG9yJyk7XG4iLCJyZXF1aXJlKCcuL193a3MtZGVmaW5lJykoJ29ic2VydmFibGUnKTtcbiIsInJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciBUT19TVFJJTkdfVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG5cbnZhciBET01JdGVyYWJsZXMgPSAoJ0NTU1J1bGVMaXN0LENTU1N0eWxlRGVjbGFyYXRpb24sQ1NTVmFsdWVMaXN0LENsaWVudFJlY3RMaXN0LERPTVJlY3RMaXN0LERPTVN0cmluZ0xpc3QsJyArXG4gICdET01Ub2tlbkxpc3QsRGF0YVRyYW5zZmVySXRlbUxpc3QsRmlsZUxpc3QsSFRNTEFsbENvbGxlY3Rpb24sSFRNTENvbGxlY3Rpb24sSFRNTEZvcm1FbGVtZW50LEhUTUxTZWxlY3RFbGVtZW50LCcgK1xuICAnTWVkaWFMaXN0LE1pbWVUeXBlQXJyYXksTmFtZWROb2RlTWFwLE5vZGVMaXN0LFBhaW50UmVxdWVzdExpc3QsUGx1Z2luLFBsdWdpbkFycmF5LFNWR0xlbmd0aExpc3QsU1ZHTnVtYmVyTGlzdCwnICtcbiAgJ1NWR1BhdGhTZWdMaXN0LFNWR1BvaW50TGlzdCxTVkdTdHJpbmdMaXN0LFNWR1RyYW5zZm9ybUxpc3QsU291cmNlQnVmZmVyTGlzdCxTdHlsZVNoZWV0TGlzdCxUZXh0VHJhY2tDdWVMaXN0LCcgK1xuICAnVGV4dFRyYWNrTGlzdCxUb3VjaExpc3QnKS5zcGxpdCgnLCcpO1xuXG5mb3IgKHZhciBpID0gMDsgaSA8IERPTUl0ZXJhYmxlcy5sZW5ndGg7IGkrKykge1xuICB2YXIgTkFNRSA9IERPTUl0ZXJhYmxlc1tpXTtcbiAgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbTkFNRV07XG4gIHZhciBwcm90byA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7XG4gIGlmIChwcm90byAmJiAhcHJvdG9bVE9fU1RSSU5HX1RBR10pIGhpZGUocHJvdG8sIFRPX1NUUklOR19UQUcsIE5BTUUpO1xuICBJdGVyYXRvcnNbTkFNRV0gPSBJdGVyYXRvcnMuQXJyYXk7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGEgZnVuY3Rpb24hJyk7XG4gIHJldHVybiBpdDtcbn07XG4iLCIvLyAyMi4xLjMuMzEgQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG52YXIgVU5TQ09QQUJMRVMgPSByZXF1aXJlKCcuL193a3MnKSgndW5zY29wYWJsZXMnKTtcbnZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuaWYgKEFycmF5UHJvdG9bVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZCkgcmVxdWlyZSgnLi9faGlkZScpKEFycmF5UHJvdG8sIFVOU0NPUEFCTEVTLCB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgQXJyYXlQcm90b1tVTlNDT1BBQkxFU11ba2V5XSA9IHRydWU7XG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYW4gb2JqZWN0IScpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwiLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gdG9JT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIGlmICh2YWx1ZSAhPSB2YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjaW5kZXhPZiBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pIHtcbiAgICAgIGlmIChPW2luZGV4XSA9PT0gZWwpIHJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG4iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07XG4iLCJ2YXIgY29yZSA9IG1vZHVsZS5leHBvcnRzID0geyB2ZXJzaW9uOiAnMi41LjcnIH07XG5pZiAodHlwZW9mIF9fZSA9PSAnbnVtYmVyJykgX19lID0gY29yZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuIiwiLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIHRoYXQsIGxlbmd0aCkge1xuICBhRnVuY3Rpb24oZm4pO1xuICBpZiAodGhhdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZm47XG4gIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuIiwiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsIi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnYScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pLmEgIT0gNztcbn0pO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iLCIvLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcbikuc3BsaXQoJywnKTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG52YXIgJGV4cG9ydCA9IGZ1bmN0aW9uICh0eXBlLCBuYW1lLCBzb3VyY2UpIHtcbiAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkY7XG4gIHZhciBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HO1xuICB2YXIgSVNfU1RBVElDID0gdHlwZSAmICRleHBvcnQuUztcbiAgdmFyIElTX1BST1RPID0gdHlwZSAmICRleHBvcnQuUDtcbiAgdmFyIElTX0JJTkQgPSB0eXBlICYgJGV4cG9ydC5CO1xuICB2YXIgdGFyZ2V0ID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIHx8IChnbG9iYWxbbmFtZV0gPSB7fSkgOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdO1xuICB2YXIgZXhwb3J0cyA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pO1xuICB2YXIgZXhwUHJvdG8gPSBleHBvcnRzW1BST1RPVFlQRV0gfHwgKGV4cG9ydHNbUFJPVE9UWVBFXSA9IHt9KTtcbiAgdmFyIGtleSwgb3duLCBvdXQsIGV4cDtcbiAgaWYgKElTX0dMT0JBTCkgc291cmNlID0gbmFtZTtcbiAgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG4gICAgb3duID0gIUlTX0ZPUkNFRCAmJiB0YXJnZXQgJiYgdGFyZ2V0W2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuICAgIG91dCA9IChvd24gPyB0YXJnZXQgOiBzb3VyY2UpW2tleV07XG4gICAgLy8gYmluZCB0aW1lcnMgdG8gZ2xvYmFsIGZvciBjYWxsIGZyb20gZXhwb3J0IGNvbnRleHRcbiAgICBleHAgPSBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbCkgOiBJU19QUk9UTyAmJiB0eXBlb2Ygb3V0ID09ICdmdW5jdGlvbicgPyBjdHgoRnVuY3Rpb24uY2FsbCwgb3V0KSA6IG91dDtcbiAgICAvLyBleHRlbmQgZ2xvYmFsXG4gICAgaWYgKHRhcmdldCkgcmVkZWZpbmUodGFyZ2V0LCBrZXksIG91dCwgdHlwZSAmICRleHBvcnQuVSk7XG4gICAgLy8gZXhwb3J0XG4gICAgaWYgKGV4cG9ydHNba2V5XSAhPSBvdXQpIGhpZGUoZXhwb3J0cywga2V5LCBleHApO1xuICAgIGlmIChJU19QUk9UTyAmJiBleHBQcm90b1trZXldICE9IG91dCkgZXhwUHJvdG9ba2V5XSA9IG91dDtcbiAgfVxufTtcbmdsb2JhbC5jb3JlID0gY29yZTtcbi8vIHR5cGUgYml0bWFwXG4kZXhwb3J0LkYgPSAxOyAgIC8vIGZvcmNlZFxuJGV4cG9ydC5HID0gMjsgICAvLyBnbG9iYWxcbiRleHBvcnQuUyA9IDQ7ICAgLy8gc3RhdGljXG4kZXhwb3J0LlAgPSA4OyAgIC8vIHByb3RvXG4kZXhwb3J0LkIgPSAxNjsgIC8vIGJpbmRcbiRleHBvcnQuVyA9IDMyOyAgLy8gd3JhcFxuJGV4cG9ydC5VID0gNjQ7ICAvLyBzYWZlXG4kZXhwb3J0LlIgPSAxMjg7IC8vIHJlYWwgcHJvdG8gbWV0aG9kIGZvciBgbGlicmFyeWBcbm1vZHVsZS5leHBvcnRzID0gJGV4cG9ydDtcbiIsInZhciBNQVRDSCA9IHJlcXVpcmUoJy4vX3drcycpKCdtYXRjaCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZKSB7XG4gIHZhciByZSA9IC8uLztcbiAgdHJ5IHtcbiAgICAnLy4vJ1tLRVldKHJlKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRyeSB7XG4gICAgICByZVtNQVRDSF0gPSBmYWxzZTtcbiAgICAgIHJldHVybiAhJy8uLydbS0VZXShyZSk7XG4gICAgfSBjYXRjaCAoZikgeyAvKiBlbXB0eSAqLyB9XG4gIH0gcmV0dXJuIHRydWU7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xudmFyIHdrcyA9IHJlcXVpcmUoJy4vX3drcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVksIGxlbmd0aCwgZXhlYykge1xuICB2YXIgU1lNQk9MID0gd2tzKEtFWSk7XG4gIHZhciBmbnMgPSBleGVjKGRlZmluZWQsIFNZTUJPTCwgJydbS0VZXSk7XG4gIHZhciBzdHJmbiA9IGZuc1swXTtcbiAgdmFyIHJ4Zm4gPSBmbnNbMV07XG4gIGlmIChmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIE8gPSB7fTtcbiAgICBPW1NZTUJPTF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9O1xuICAgIHJldHVybiAnJ1tLRVldKE8pICE9IDc7XG4gIH0pKSB7XG4gICAgcmVkZWZpbmUoU3RyaW5nLnByb3RvdHlwZSwgS0VZLCBzdHJmbik7XG4gICAgaGlkZShSZWdFeHAucHJvdG90eXBlLCBTWU1CT0wsIGxlbmd0aCA9PSAyXG4gICAgICAvLyAyMS4yLjUuOCBSZWdFeHAucHJvdG90eXBlW0BAcmVwbGFjZV0oc3RyaW5nLCByZXBsYWNlVmFsdWUpXG4gICAgICAvLyAyMS4yLjUuMTEgUmVnRXhwLnByb3RvdHlwZVtAQHNwbGl0XShzdHJpbmcsIGxpbWl0KVxuICAgICAgPyBmdW5jdGlvbiAoc3RyaW5nLCBhcmcpIHsgcmV0dXJuIHJ4Zm4uY2FsbChzdHJpbmcsIHRoaXMsIGFyZyk7IH1cbiAgICAgIC8vIDIxLjIuNS42IFJlZ0V4cC5wcm90b3R5cGVbQEBtYXRjaF0oc3RyaW5nKVxuICAgICAgLy8gMjEuMi41LjkgUmVnRXhwLnByb3RvdHlwZVtAQHNlYXJjaF0oc3RyaW5nKVxuICAgICAgOiBmdW5jdGlvbiAoc3RyaW5nKSB7IHJldHVybiByeGZuLmNhbGwoc3RyaW5nLCB0aGlzKTsgfVxuICAgICk7XG4gIH1cbn07XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxudmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5pZiAodHlwZW9mIF9fZyA9PSAnbnVtYmVyJykgX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4iLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59O1xuIiwidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIGRQLmYob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwidmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiIsIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iLCIvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG4iLCIvLyA3LjIuOCBJc1JlZ0V4cChhcmd1bWVudClcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xudmFyIE1BVENIID0gcmVxdWlyZSgnLi9fd2tzJykoJ21hdGNoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgaXNSZWdFeHA7XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgKChpc1JlZ0V4cCA9IGl0W01BVENIXSkgIT09IHVuZGVmaW5lZCA/ICEhaXNSZWdFeHAgOiBjb2YoaXQpID09ICdSZWdFeHAnKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xudmFyIGRlc2NyaXB0b3IgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19oaWRlJykoSXRlcmF0b3JQcm90b3R5cGUsIHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHtcbiAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGRlc2NyaXB0b3IoMSwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciAkaXRlckNyZWF0ZSA9IHJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1kgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSk7IC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbnZhciBGRl9JVEVSQVRPUiA9ICdAQGl0ZXJhdG9yJztcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoa2luZCkge1xuICAgIGlmICghQlVHR1kgJiYga2luZCBpbiBwcm90bykgcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVM7XG4gIHZhciBWQUxVRVNfQlVHID0gZmFsc2U7XG4gIHZhciBwcm90byA9IEJhc2UucHJvdG90eXBlO1xuICB2YXIgJG5hdGl2ZSA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXTtcbiAgdmFyICRkZWZhdWx0ID0gJG5hdGl2ZSB8fCBnZXRNZXRob2QoREVGQVVMVCk7XG4gIHZhciAkZW50cmllcyA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWQ7XG4gIHZhciAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZTtcbiAgdmFyIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYgKCRhbnlOYXRpdmUpIHtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZiAoIUxJQlJBUlkgJiYgdHlwZW9mIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSAhPSAnZnVuY3Rpb24nKSBoaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUykge1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZiAoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpIHtcbiAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddID0gcmV0dXJuVGhpcztcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoa2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGlmICghKGtleSBpbiBwcm90bykpIHJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChkb25lLCB2YWx1ZSkge1xuICByZXR1cm4geyB2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZSB9O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge307XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZhbHNlO1xuIiwiLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBkUHMgPSByZXF1aXJlKCcuL19vYmplY3QtZHBzJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgRW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdpZnJhbWUnKTtcbiAgdmFyIGkgPSBlbnVtQnVnS2V5cy5sZW5ndGg7XG4gIHZhciBsdCA9ICc8JztcbiAgdmFyIGd0ID0gJz4nO1xuICB2YXIgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXF1aXJlKCcuL19odG1sJykuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxuICAvLyBjcmVhdGVEaWN0ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuT2JqZWN0O1xuICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyAnc2NyaXB0JyArIGd0ICsgJ2RvY3VtZW50LkY9T2JqZWN0JyArIGx0ICsgJy9zY3JpcHQnICsgZ3QpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICBjcmVhdGVEaWN0ID0gaWZyYW1lRG9jdW1lbnQuRjtcbiAgd2hpbGUgKGktLSkgZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tpXV07XG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKE8gIT09IG51bGwpIHtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5KCk7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IG51bGw7XG4gICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbFxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZFBzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuL19pZTgtZG9tLWRlZmluZScpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgZFAgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbmV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuIGRQKE8sIFAsIEF0dHJpYnV0ZXMpO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcykgdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEnKTtcbiAgaWYgKCd2YWx1ZScgaW4gQXR0cmlidXRlcykgT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gIHJldHVybiBPO1xufTtcbiIsInZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIga2V5cyA9IGdldEtleXMoUHJvcGVydGllcyk7XG4gIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGkgPSAwO1xuICB2YXIgUDtcbiAgd2hpbGUgKGxlbmd0aCA+IGkpIGRQLmYoTywgUCA9IGtleXNbaSsrXSwgUHJvcGVydGllc1tQXSk7XG4gIHJldHVybiBPO1xufTtcbiIsIi8vIDE5LjEuMi45IC8gMTUuMi4zLjIgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBJRV9QUk9UTyA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcbnZhciBPYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIChPKSB7XG4gIE8gPSB0b09iamVjdChPKTtcbiAgaWYgKGhhcyhPLCBJRV9QUk9UTykpIHJldHVybiBPW0lFX1BST1RPXTtcbiAgaWYgKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90byA6IG51bGw7XG59O1xuIiwidmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciBhcnJheUluZGV4T2YgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpKGZhbHNlKTtcbnZhciBJRV9QUk9UTyA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSU9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgaWYgKGtleSAhPSBJRV9QUk9UTykgaGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkgaWYgKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSkge1xuICAgIH5hcnJheUluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIvLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKSB7XG4gIHJldHVybiAka2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFNSQyA9IHJlcXVpcmUoJy4vX3VpZCcpKCdzcmMnKTtcbnZhciBUT19TVFJJTkcgPSAndG9TdHJpbmcnO1xudmFyICR0b1N0cmluZyA9IEZ1bmN0aW9uW1RPX1NUUklOR107XG52YXIgVFBMID0gKCcnICsgJHRvU3RyaW5nKS5zcGxpdChUT19TVFJJTkcpO1xuXG5yZXF1aXJlKCcuL19jb3JlJykuaW5zcGVjdFNvdXJjZSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gJHRvU3RyaW5nLmNhbGwoaXQpO1xufTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsLCBzYWZlKSB7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIHZhbCA9PSAnZnVuY3Rpb24nO1xuICBpZiAoaXNGdW5jdGlvbikgaGFzKHZhbCwgJ25hbWUnKSB8fCBoaWRlKHZhbCwgJ25hbWUnLCBrZXkpO1xuICBpZiAoT1trZXldID09PSB2YWwpIHJldHVybjtcbiAgaWYgKGlzRnVuY3Rpb24pIGhhcyh2YWwsIFNSQykgfHwgaGlkZSh2YWwsIFNSQywgT1trZXldID8gJycgKyBPW2tleV0gOiBUUEwuam9pbihTdHJpbmcoa2V5KSkpO1xuICBpZiAoTyA9PT0gZ2xvYmFsKSB7XG4gICAgT1trZXldID0gdmFsO1xuICB9IGVsc2UgaWYgKCFzYWZlKSB7XG4gICAgZGVsZXRlIE9ba2V5XTtcbiAgICBoaWRlKE8sIGtleSwgdmFsKTtcbiAgfSBlbHNlIGlmIChPW2tleV0pIHtcbiAgICBPW2tleV0gPSB2YWw7XG4gIH0gZWxzZSB7XG4gICAgaGlkZShPLCBrZXksIHZhbCk7XG4gIH1cbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyAmJiB0aGlzW1NSQ10gfHwgJHRvU3RyaW5nLmNhbGwodGhpcyk7XG59KTtcbiIsInZhciBkZWYgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgdGFnLCBzdGF0KSB7XG4gIGlmIChpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKSBkZWYoaXQsIFRBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWcgfSk7XG59O1xuIiwidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdrZXlzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHNoYXJlZFtrZXldIHx8IChzaGFyZWRba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iLCJ2YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IChnbG9iYWxbU0hBUkVEXSA9IHt9KTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7XG59KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7XG4gIHZlcnNpb246IGNvcmUudmVyc2lvbixcbiAgbW9kZTogcmVxdWlyZSgnLi9fbGlicmFyeScpID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMTggRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiIsIi8vIGhlbHBlciBmb3IgU3RyaW5nI3tzdGFydHNXaXRoLCBlbmRzV2l0aCwgaW5jbHVkZXN9XG52YXIgaXNSZWdFeHAgPSByZXF1aXJlKCcuL19pcy1yZWdleHAnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCBzZWFyY2hTdHJpbmcsIE5BTUUpIHtcbiAgaWYgKGlzUmVnRXhwKHNlYXJjaFN0cmluZykpIHRocm93IFR5cGVFcnJvcignU3RyaW5nIycgKyBOQU1FICsgXCIgZG9lc24ndCBhY2NlcHQgcmVnZXghXCIpO1xuICByZXR1cm4gU3RyaW5nKGRlZmluZWQodGhhdCkpO1xufTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGluZGV4IDwgMCA/IG1heChpbmRleCArIGxlbmd0aCwgMCkgOiBtaW4oaW5kZXgsIGxlbmd0aCk7XG59O1xuIiwiLy8gNy4xLjQgVG9JbnRlZ2VyXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXNOYU4oaXQgPSAraXQpID8gMCA6IChpdCA+IDAgPyBmbG9vciA6IGNlaWwpKGl0KTtcbn07XG4iLCIvLyB0byBpbmRleGVkIG9iamVjdCwgdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi9faW9iamVjdCcpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gSU9iamVjdChkZWZpbmVkKGl0KSk7XG59O1xuIiwiLy8gNy4xLjE1IFRvTGVuZ3RoXG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIG1pbiA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID4gMCA/IG1pbih0b0ludGVnZXIoaXQpLCAweDFmZmZmZmZmZmZmZmZmKSA6IDA7IC8vIHBvdygyLCA1MykgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG4iLCIvLyA3LjEuMTMgVG9PYmplY3QoYXJndW1lbnQpXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiIsIi8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBTKSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gaXQ7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICghUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTtcbiIsInZhciBpZCA9IDA7XG52YXIgcHggPSBNYXRoLnJhbmRvbSgpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcuY29uY2F0KGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXksICcpXycsICgrK2lkICsgcHgpLnRvU3RyaW5nKDM2KSk7XG59O1xuIiwidmFyIHN0b3JlID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ3drcycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xudmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLlN5bWJvbDtcbnZhciBVU0VfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PSAnZnVuY3Rpb24nO1xuXG52YXIgJGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiBzdG9yZVtuYW1lXSB8fCAoc3RvcmVbbmFtZV0gPVxuICAgIFVTRV9TWU1CT0wgJiYgU3ltYm9sW25hbWVdIHx8IChVU0VfU1lNQk9MID8gU3ltYm9sIDogdWlkKSgnU3ltYm9sLicgKyBuYW1lKSk7XG59O1xuXG4kZXhwb3J0cy5zdG9yZSA9IHN0b3JlO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKTtcbnZhciBzdGVwID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xuXG4vLyAyMi4xLjMuNCBBcnJheS5wcm90b3R5cGUuZW50cmllcygpXG4vLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmtleXMoKVxuLy8gMjIuMS4zLjI5IEFycmF5LnByb3RvdHlwZS52YWx1ZXMoKVxuLy8gMjIuMS4zLjMwIEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICB0aGlzLl90ID0gdG9JT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4gIHRoaXMuX2sgPSBraW5kOyAgICAgICAgICAgICAgICAvLyBraW5kXG4vLyAyMi4xLjUuMi4xICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIE8gPSB0aGlzLl90O1xuICB2YXIga2luZCA9IHRoaXMuX2s7XG4gIHZhciBpbmRleCA9IHRoaXMuX2krKztcbiAgaWYgKCFPIHx8IGluZGV4ID49IE8ubGVuZ3RoKSB7XG4gICAgdGhpcy5fdCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gc3RlcCgxKTtcbiAgfVxuICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiBzdGVwKDAsIGluZGV4KTtcbiAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiBzdGVwKDAsIE9baW5kZXhdKTtcbiAgcmV0dXJuIHN0ZXAoMCwgW2luZGV4LCBPW2luZGV4XV0pO1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyUgKDkuNC40LjYsIDkuNC40LjcpXG5JdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcbiIsIi8vIEBAcmVwbGFjZSBsb2dpY1xucmVxdWlyZSgnLi9fZml4LXJlLXdrcycpKCdyZXBsYWNlJywgMiwgZnVuY3Rpb24gKGRlZmluZWQsIFJFUExBQ0UsICRyZXBsYWNlKSB7XG4gIC8vIDIxLjEuMy4xNCBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2Uoc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSlcbiAgcmV0dXJuIFtmdW5jdGlvbiByZXBsYWNlKHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgdmFyIE8gPSBkZWZpbmVkKHRoaXMpO1xuICAgIHZhciBmbiA9IHNlYXJjaFZhbHVlID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNlYXJjaFZhbHVlW1JFUExBQ0VdO1xuICAgIHJldHVybiBmbiAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGZuLmNhbGwoc2VhcmNoVmFsdWUsIE8sIHJlcGxhY2VWYWx1ZSlcbiAgICAgIDogJHJlcGxhY2UuY2FsbChTdHJpbmcoTyksIHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpO1xuICB9LCAkcmVwbGFjZV07XG59KTtcbiIsIi8vIEBAc3BsaXQgbG9naWNcbnJlcXVpcmUoJy4vX2ZpeC1yZS13a3MnKSgnc3BsaXQnLCAyLCBmdW5jdGlvbiAoZGVmaW5lZCwgU1BMSVQsICRzcGxpdCkge1xuICAndXNlIHN0cmljdCc7XG4gIHZhciBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4vX2lzLXJlZ2V4cCcpO1xuICB2YXIgX3NwbGl0ID0gJHNwbGl0O1xuICB2YXIgJHB1c2ggPSBbXS5wdXNoO1xuICB2YXIgJFNQTElUID0gJ3NwbGl0JztcbiAgdmFyIExFTkdUSCA9ICdsZW5ndGgnO1xuICB2YXIgTEFTVF9JTkRFWCA9ICdsYXN0SW5kZXgnO1xuICBpZiAoXG4gICAgJ2FiYmMnWyRTUExJVF0oLyhiKSovKVsxXSA9PSAnYycgfHxcbiAgICAndGVzdCdbJFNQTElUXSgvKD86KS8sIC0xKVtMRU5HVEhdICE9IDQgfHxcbiAgICAnYWInWyRTUExJVF0oLyg/OmFiKSovKVtMRU5HVEhdICE9IDIgfHxcbiAgICAnLidbJFNQTElUXSgvKC4/KSguPykvKVtMRU5HVEhdICE9IDQgfHxcbiAgICAnLidbJFNQTElUXSgvKCkoKS8pW0xFTkdUSF0gPiAxIHx8XG4gICAgJydbJFNQTElUXSgvLj8vKVtMRU5HVEhdXG4gICkge1xuICAgIHZhciBOUENHID0gLygpPz8vLmV4ZWMoJycpWzFdID09PSB1bmRlZmluZWQ7IC8vIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3VwXG4gICAgLy8gYmFzZWQgb24gZXM1LXNoaW0gaW1wbGVtZW50YXRpb24sIG5lZWQgdG8gcmV3b3JrIGl0XG4gICAgJHNwbGl0ID0gZnVuY3Rpb24gKHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICAgIHZhciBzdHJpbmcgPSBTdHJpbmcodGhpcyk7XG4gICAgICBpZiAoc2VwYXJhdG9yID09PSB1bmRlZmluZWQgJiYgbGltaXQgPT09IDApIHJldHVybiBbXTtcbiAgICAgIC8vIElmIGBzZXBhcmF0b3JgIGlzIG5vdCBhIHJlZ2V4LCB1c2UgbmF0aXZlIHNwbGl0XG4gICAgICBpZiAoIWlzUmVnRXhwKHNlcGFyYXRvcikpIHJldHVybiBfc3BsaXQuY2FsbChzdHJpbmcsIHNlcGFyYXRvciwgbGltaXQpO1xuICAgICAgdmFyIG91dHB1dCA9IFtdO1xuICAgICAgdmFyIGZsYWdzID0gKHNlcGFyYXRvci5pZ25vcmVDYXNlID8gJ2knIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3IubXVsdGlsaW5lID8gJ20nIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3IudW5pY29kZSA/ICd1JyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAoc2VwYXJhdG9yLnN0aWNreSA/ICd5JyA6ICcnKTtcbiAgICAgIHZhciBsYXN0TGFzdEluZGV4ID0gMDtcbiAgICAgIHZhciBzcGxpdExpbWl0ID0gbGltaXQgPT09IHVuZGVmaW5lZCA/IDQyOTQ5NjcyOTUgOiBsaW1pdCA+Pj4gMDtcbiAgICAgIC8vIE1ha2UgYGdsb2JhbGAgYW5kIGF2b2lkIGBsYXN0SW5kZXhgIGlzc3VlcyBieSB3b3JraW5nIHdpdGggYSBjb3B5XG4gICAgICB2YXIgc2VwYXJhdG9yQ29weSA9IG5ldyBSZWdFeHAoc2VwYXJhdG9yLnNvdXJjZSwgZmxhZ3MgKyAnZycpO1xuICAgICAgdmFyIHNlcGFyYXRvcjIsIG1hdGNoLCBsYXN0SW5kZXgsIGxhc3RMZW5ndGgsIGk7XG4gICAgICAvLyBEb2Vzbid0IG5lZWQgZmxhZ3MgZ3ksIGJ1dCB0aGV5IGRvbid0IGh1cnRcbiAgICAgIGlmICghTlBDRykgc2VwYXJhdG9yMiA9IG5ldyBSZWdFeHAoJ14nICsgc2VwYXJhdG9yQ29weS5zb3VyY2UgKyAnJCg/IVxcXFxzKScsIGZsYWdzKTtcbiAgICAgIHdoaWxlIChtYXRjaCA9IHNlcGFyYXRvckNvcHkuZXhlYyhzdHJpbmcpKSB7XG4gICAgICAgIC8vIGBzZXBhcmF0b3JDb3B5Lmxhc3RJbmRleGAgaXMgbm90IHJlbGlhYmxlIGNyb3NzLWJyb3dzZXJcbiAgICAgICAgbGFzdEluZGV4ID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXVtMRU5HVEhdO1xuICAgICAgICBpZiAobGFzdEluZGV4ID4gbGFzdExhc3RJbmRleCkge1xuICAgICAgICAgIG91dHB1dC5wdXNoKHN0cmluZy5zbGljZShsYXN0TGFzdEluZGV4LCBtYXRjaC5pbmRleCkpO1xuICAgICAgICAgIC8vIEZpeCBicm93c2VycyB3aG9zZSBgZXhlY2AgbWV0aG9kcyBkb24ndCBjb25zaXN0ZW50bHkgcmV0dXJuIGB1bmRlZmluZWRgIGZvciBOUENHXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3AtZnVuY1xuICAgICAgICAgIGlmICghTlBDRyAmJiBtYXRjaFtMRU5HVEhdID4gMSkgbWF0Y2hbMF0ucmVwbGFjZShzZXBhcmF0b3IyLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgYXJndW1lbnRzW0xFTkdUSF0gLSAyOyBpKyspIGlmIChhcmd1bWVudHNbaV0gPT09IHVuZGVmaW5lZCkgbWF0Y2hbaV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKG1hdGNoW0xFTkdUSF0gPiAxICYmIG1hdGNoLmluZGV4IDwgc3RyaW5nW0xFTkdUSF0pICRwdXNoLmFwcGx5KG91dHB1dCwgbWF0Y2guc2xpY2UoMSkpO1xuICAgICAgICAgIGxhc3RMZW5ndGggPSBtYXRjaFswXVtMRU5HVEhdO1xuICAgICAgICAgIGxhc3RMYXN0SW5kZXggPSBsYXN0SW5kZXg7XG4gICAgICAgICAgaWYgKG91dHB1dFtMRU5HVEhdID49IHNwbGl0TGltaXQpIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXBhcmF0b3JDb3B5W0xBU1RfSU5ERVhdID09PSBtYXRjaC5pbmRleCkgc2VwYXJhdG9yQ29weVtMQVNUX0lOREVYXSsrOyAvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wXG4gICAgICB9XG4gICAgICBpZiAobGFzdExhc3RJbmRleCA9PT0gc3RyaW5nW0xFTkdUSF0pIHtcbiAgICAgICAgaWYgKGxhc3RMZW5ndGggfHwgIXNlcGFyYXRvckNvcHkudGVzdCgnJykpIG91dHB1dC5wdXNoKCcnKTtcbiAgICAgIH0gZWxzZSBvdXRwdXQucHVzaChzdHJpbmcuc2xpY2UobGFzdExhc3RJbmRleCkpO1xuICAgICAgcmV0dXJuIG91dHB1dFtMRU5HVEhdID4gc3BsaXRMaW1pdCA/IG91dHB1dC5zbGljZSgwLCBzcGxpdExpbWl0KSA6IG91dHB1dDtcbiAgICB9O1xuICAvLyBDaGFrcmEsIFY4XG4gIH0gZWxzZSBpZiAoJzAnWyRTUExJVF0odW5kZWZpbmVkLCAwKVtMRU5HVEhdKSB7XG4gICAgJHNwbGl0ID0gZnVuY3Rpb24gKHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICAgIHJldHVybiBzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCAmJiBsaW1pdCA9PT0gMCA/IFtdIDogX3NwbGl0LmNhbGwodGhpcywgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgfTtcbiAgfVxuICAvLyAyMS4xLjMuMTcgU3RyaW5nLnByb3RvdHlwZS5zcGxpdChzZXBhcmF0b3IsIGxpbWl0KVxuICByZXR1cm4gW2Z1bmN0aW9uIHNwbGl0KHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICB2YXIgTyA9IGRlZmluZWQodGhpcyk7XG4gICAgdmFyIGZuID0gc2VwYXJhdG9yID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNlcGFyYXRvcltTUExJVF07XG4gICAgcmV0dXJuIGZuICE9PSB1bmRlZmluZWQgPyBmbi5jYWxsKHNlcGFyYXRvciwgTywgbGltaXQpIDogJHNwbGl0LmNhbGwoU3RyaW5nKE8pLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgfSwgJHNwbGl0XTtcbn0pO1xuIiwiLy8gMjEuMS4zLjcgU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlcyhzZWFyY2hTdHJpbmcsIHBvc2l0aW9uID0gMClcbid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY29udGV4dCA9IHJlcXVpcmUoJy4vX3N0cmluZy1jb250ZXh0Jyk7XG52YXIgSU5DTFVERVMgPSAnaW5jbHVkZXMnO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzLWlzLXJlZ2V4cCcpKElOQ0xVREVTKSwgJ1N0cmluZycsIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKHNlYXJjaFN0cmluZyAvKiAsIHBvc2l0aW9uID0gMCAqLykge1xuICAgIHJldHVybiAhIX5jb250ZXh0KHRoaXMsIHNlYXJjaFN0cmluZywgSU5DTFVERVMpXG4gICAgICAuaW5kZXhPZihzZWFyY2hTdHJpbmcsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9BcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGluY2x1ZGVzID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKSh0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdBcnJheScsIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKGVsIC8qICwgZnJvbUluZGV4ID0gMCAqLykge1xuICAgIHJldHVybiAkaW5jbHVkZXModGhpcywgZWwsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdpbmNsdWRlcycpO1xuIiwidmFyICRpdGVyYXRvcnMgPSByZXF1aXJlKCcuL2VzNi5hcnJheS5pdGVyYXRvcicpO1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIHdrcyA9IHJlcXVpcmUoJy4vX3drcycpO1xudmFyIElURVJBVE9SID0gd2tzKCdpdGVyYXRvcicpO1xudmFyIFRPX1NUUklOR19UQUcgPSB3a3MoJ3RvU3RyaW5nVGFnJyk7XG52YXIgQXJyYXlWYWx1ZXMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbnZhciBET01JdGVyYWJsZXMgPSB7XG4gIENTU1J1bGVMaXN0OiB0cnVlLCAvLyBUT0RPOiBOb3Qgc3BlYyBjb21wbGlhbnQsIHNob3VsZCBiZSBmYWxzZS5cbiAgQ1NTU3R5bGVEZWNsYXJhdGlvbjogZmFsc2UsXG4gIENTU1ZhbHVlTGlzdDogZmFsc2UsXG4gIENsaWVudFJlY3RMaXN0OiBmYWxzZSxcbiAgRE9NUmVjdExpc3Q6IGZhbHNlLFxuICBET01TdHJpbmdMaXN0OiBmYWxzZSxcbiAgRE9NVG9rZW5MaXN0OiB0cnVlLFxuICBEYXRhVHJhbnNmZXJJdGVtTGlzdDogZmFsc2UsXG4gIEZpbGVMaXN0OiBmYWxzZSxcbiAgSFRNTEFsbENvbGxlY3Rpb246IGZhbHNlLFxuICBIVE1MQ29sbGVjdGlvbjogZmFsc2UsXG4gIEhUTUxGb3JtRWxlbWVudDogZmFsc2UsXG4gIEhUTUxTZWxlY3RFbGVtZW50OiBmYWxzZSxcbiAgTWVkaWFMaXN0OiB0cnVlLCAvLyBUT0RPOiBOb3Qgc3BlYyBjb21wbGlhbnQsIHNob3VsZCBiZSBmYWxzZS5cbiAgTWltZVR5cGVBcnJheTogZmFsc2UsXG4gIE5hbWVkTm9kZU1hcDogZmFsc2UsXG4gIE5vZGVMaXN0OiB0cnVlLFxuICBQYWludFJlcXVlc3RMaXN0OiBmYWxzZSxcbiAgUGx1Z2luOiBmYWxzZSxcbiAgUGx1Z2luQXJyYXk6IGZhbHNlLFxuICBTVkdMZW5ndGhMaXN0OiBmYWxzZSxcbiAgU1ZHTnVtYmVyTGlzdDogZmFsc2UsXG4gIFNWR1BhdGhTZWdMaXN0OiBmYWxzZSxcbiAgU1ZHUG9pbnRMaXN0OiBmYWxzZSxcbiAgU1ZHU3RyaW5nTGlzdDogZmFsc2UsXG4gIFNWR1RyYW5zZm9ybUxpc3Q6IGZhbHNlLFxuICBTb3VyY2VCdWZmZXJMaXN0OiBmYWxzZSxcbiAgU3R5bGVTaGVldExpc3Q6IHRydWUsIC8vIFRPRE86IE5vdCBzcGVjIGNvbXBsaWFudCwgc2hvdWxkIGJlIGZhbHNlLlxuICBUZXh0VHJhY2tDdWVMaXN0OiBmYWxzZSxcbiAgVGV4dFRyYWNrTGlzdDogZmFsc2UsXG4gIFRvdWNoTGlzdDogZmFsc2Vcbn07XG5cbmZvciAodmFyIGNvbGxlY3Rpb25zID0gZ2V0S2V5cyhET01JdGVyYWJsZXMpLCBpID0gMDsgaSA8IGNvbGxlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gIHZhciBOQU1FID0gY29sbGVjdGlvbnNbaV07XG4gIHZhciBleHBsaWNpdCA9IERPTUl0ZXJhYmxlc1tOQU1FXTtcbiAgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbTkFNRV07XG4gIHZhciBwcm90byA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7XG4gIHZhciBrZXk7XG4gIGlmIChwcm90bykge1xuICAgIGlmICghcHJvdG9bSVRFUkFUT1JdKSBoaWRlKHByb3RvLCBJVEVSQVRPUiwgQXJyYXlWYWx1ZXMpO1xuICAgIGlmICghcHJvdG9bVE9fU1RSSU5HX1RBR10pIGhpZGUocHJvdG8sIFRPX1NUUklOR19UQUcsIE5BTUUpO1xuICAgIEl0ZXJhdG9yc1tOQU1FXSA9IEFycmF5VmFsdWVzO1xuICAgIGlmIChleHBsaWNpdCkgZm9yIChrZXkgaW4gJGl0ZXJhdG9ycykgaWYgKCFwcm90b1trZXldKSByZWRlZmluZShwcm90bywga2V5LCAkaXRlcmF0b3JzW2tleV0sIHRydWUpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbi8vIFVzZWQgZm9yIHNldHRpbmcgcHJvdG90eXBlIG1ldGhvZHMgdGhhdCBJRTggY2hva2VzIG9uLlxudmFyIERFTEVURSA9ICdkZWxldGUnO1xuXG4vLyBDb25zdGFudHMgZGVzY3JpYmluZyB0aGUgc2l6ZSBvZiB0cmllIG5vZGVzLlxudmFyIFNISUZUID0gNTsgLy8gUmVzdWx0ZWQgaW4gYmVzdCBwZXJmb3JtYW5jZSBhZnRlciBfX19fX18/XG52YXIgU0laRSA9IDEgPDwgU0hJRlQ7XG52YXIgTUFTSyA9IFNJWkUgLSAxO1xuXG4vLyBBIGNvbnNpc3RlbnQgc2hhcmVkIHZhbHVlIHJlcHJlc2VudGluZyBcIm5vdCBzZXRcIiB3aGljaCBlcXVhbHMgbm90aGluZyBvdGhlclxuLy8gdGhhbiBpdHNlbGYsIGFuZCBub3RoaW5nIHRoYXQgY291bGQgYmUgcHJvdmlkZWQgZXh0ZXJuYWxseS5cbnZhciBOT1RfU0VUID0ge307XG5cbi8vIEJvb2xlYW4gcmVmZXJlbmNlcywgUm91Z2ggZXF1aXZhbGVudCBvZiBgYm9vbCAmYC5cbmZ1bmN0aW9uIE1ha2VSZWYoKSB7XG4gIHJldHVybiB7IHZhbHVlOiBmYWxzZSB9O1xufVxuXG5mdW5jdGlvbiBTZXRSZWYocmVmKSB7XG4gIGlmIChyZWYpIHtcbiAgICByZWYudmFsdWUgPSB0cnVlO1xuICB9XG59XG5cbi8vIEEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhIHZhbHVlIHJlcHJlc2VudGluZyBhbiBcIm93bmVyXCIgZm9yIHRyYW5zaWVudCB3cml0ZXNcbi8vIHRvIHRyaWVzLiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgb25seSBldmVyIGVxdWFsIGl0c2VsZiwgYW5kIHdpbGwgbm90IGVxdWFsXG4vLyB0aGUgcmV0dXJuIG9mIGFueSBzdWJzZXF1ZW50IGNhbGwgb2YgdGhpcyBmdW5jdGlvbi5cbmZ1bmN0aW9uIE93bmVySUQoKSB7fVxuXG5mdW5jdGlvbiBlbnN1cmVTaXplKGl0ZXIpIHtcbiAgaWYgKGl0ZXIuc2l6ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaXRlci5zaXplID0gaXRlci5fX2l0ZXJhdGUocmV0dXJuVHJ1ZSk7XG4gIH1cbiAgcmV0dXJuIGl0ZXIuc2l6ZTtcbn1cblxuZnVuY3Rpb24gd3JhcEluZGV4KGl0ZXIsIGluZGV4KSB7XG4gIC8vIFRoaXMgaW1wbGVtZW50cyBcImlzIGFycmF5IGluZGV4XCIgd2hpY2ggdGhlIEVDTUFTdHJpbmcgc3BlYyBkZWZpbmVzIGFzOlxuICAvL1xuICAvLyAgICAgQSBTdHJpbmcgcHJvcGVydHkgbmFtZSBQIGlzIGFuIGFycmF5IGluZGV4IGlmIGFuZCBvbmx5IGlmXG4gIC8vICAgICBUb1N0cmluZyhUb1VpbnQzMihQKSkgaXMgZXF1YWwgdG8gUCBhbmQgVG9VaW50MzIoUCkgaXMgbm90IGVxdWFsXG4gIC8vICAgICB0byAyXjMy4oiSMS5cbiAgLy9cbiAgLy8gaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWFycmF5LWV4b3RpYy1vYmplY3RzXG4gIGlmICh0eXBlb2YgaW5kZXggIT09ICdudW1iZXInKSB7XG4gICAgdmFyIHVpbnQzMkluZGV4ID0gaW5kZXggPj4+IDA7IC8vIE4gPj4+IDAgaXMgc2hvcnRoYW5kIGZvciBUb1VpbnQzMlxuICAgIGlmICgnJyArIHVpbnQzMkluZGV4ICE9PSBpbmRleCB8fCB1aW50MzJJbmRleCA9PT0gNDI5NDk2NzI5NSkge1xuICAgICAgcmV0dXJuIE5hTjtcbiAgICB9XG4gICAgaW5kZXggPSB1aW50MzJJbmRleDtcbiAgfVxuICByZXR1cm4gaW5kZXggPCAwID8gZW5zdXJlU2l6ZShpdGVyKSArIGluZGV4IDogaW5kZXg7XG59XG5cbmZ1bmN0aW9uIHJldHVyblRydWUoKSB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB3aG9sZVNsaWNlKGJlZ2luLCBlbmQsIHNpemUpIHtcbiAgcmV0dXJuIChcbiAgICAoKGJlZ2luID09PSAwICYmICFpc05lZyhiZWdpbikpIHx8XG4gICAgICAoc2l6ZSAhPT0gdW5kZWZpbmVkICYmIGJlZ2luIDw9IC1zaXplKSkgJiZcbiAgICAoZW5kID09PSB1bmRlZmluZWQgfHwgKHNpemUgIT09IHVuZGVmaW5lZCAmJiBlbmQgPj0gc2l6ZSkpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVCZWdpbihiZWdpbiwgc2l6ZSkge1xuICByZXR1cm4gcmVzb2x2ZUluZGV4KGJlZ2luLCBzaXplLCAwKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUVuZChlbmQsIHNpemUpIHtcbiAgcmV0dXJuIHJlc29sdmVJbmRleChlbmQsIHNpemUsIHNpemUpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlSW5kZXgoaW5kZXgsIHNpemUsIGRlZmF1bHRJbmRleCkge1xuICAvLyBTYW5pdGl6ZSBpbmRpY2VzIHVzaW5nIHRoaXMgc2hvcnRoYW5kIGZvciBUb0ludDMyKGFyZ3VtZW50KVxuICAvLyBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtdG9pbnQzMlxuICByZXR1cm4gaW5kZXggPT09IHVuZGVmaW5lZFxuICAgID8gZGVmYXVsdEluZGV4XG4gICAgOiBpc05lZyhpbmRleClcbiAgICAgID8gc2l6ZSA9PT0gSW5maW5pdHlcbiAgICAgICAgPyBzaXplXG4gICAgICAgIDogTWF0aC5tYXgoMCwgc2l6ZSArIGluZGV4KSB8IDBcbiAgICAgIDogc2l6ZSA9PT0gdW5kZWZpbmVkIHx8IHNpemUgPT09IGluZGV4XG4gICAgICAgID8gaW5kZXhcbiAgICAgICAgOiBNYXRoLm1pbihzaXplLCBpbmRleCkgfCAwO1xufVxuXG5mdW5jdGlvbiBpc05lZyh2YWx1ZSkge1xuICAvLyBBY2NvdW50IGZvciAtMCB3aGljaCBpcyBuZWdhdGl2ZSwgYnV0IG5vdCBsZXNzIHRoYW4gMC5cbiAgcmV0dXJuIHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlID09PSAtSW5maW5pdHkpO1xufVxuXG4vLyBOb3RlOiB2YWx1ZSBpcyB1bmNoYW5nZWQgdG8gbm90IGJyZWFrIGltbXV0YWJsZS1kZXZ0b29scy5cbnZhciBJU19DT0xMRUNUSU9OX1NZTUJPTCA9ICdAQF9fSU1NVVRBQkxFX0lURVJBQkxFX19AQCc7XG5cbmZ1bmN0aW9uIGlzQ29sbGVjdGlvbihtYXliZUNvbGxlY3Rpb24pIHtcbiAgcmV0dXJuIEJvb2xlYW4obWF5YmVDb2xsZWN0aW9uICYmIG1heWJlQ29sbGVjdGlvbltJU19DT0xMRUNUSU9OX1NZTUJPTF0pO1xufVxuXG52YXIgSVNfS0VZRURfU1lNQk9MID0gJ0BAX19JTU1VVEFCTEVfS0VZRURfX0BAJztcblxuZnVuY3Rpb24gaXNLZXllZChtYXliZUtleWVkKSB7XG4gIHJldHVybiBCb29sZWFuKG1heWJlS2V5ZWQgJiYgbWF5YmVLZXllZFtJU19LRVlFRF9TWU1CT0xdKTtcbn1cblxudmFyIElTX0lOREVYRURfU1lNQk9MID0gJ0BAX19JTU1VVEFCTEVfSU5ERVhFRF9fQEAnO1xuXG5mdW5jdGlvbiBpc0luZGV4ZWQobWF5YmVJbmRleGVkKSB7XG4gIHJldHVybiBCb29sZWFuKG1heWJlSW5kZXhlZCAmJiBtYXliZUluZGV4ZWRbSVNfSU5ERVhFRF9TWU1CT0xdKTtcbn1cblxuZnVuY3Rpb24gaXNBc3NvY2lhdGl2ZShtYXliZUFzc29jaWF0aXZlKSB7XG4gIHJldHVybiBpc0tleWVkKG1heWJlQXNzb2NpYXRpdmUpIHx8IGlzSW5kZXhlZChtYXliZUFzc29jaWF0aXZlKTtcbn1cblxudmFyIENvbGxlY3Rpb24gPSBmdW5jdGlvbiBDb2xsZWN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBpc0NvbGxlY3Rpb24odmFsdWUpID8gdmFsdWUgOiBTZXEodmFsdWUpO1xufTtcblxudmFyIEtleWVkQ29sbGVjdGlvbiA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKENvbGxlY3Rpb24pIHtcbiAgZnVuY3Rpb24gS2V5ZWRDb2xsZWN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGlzS2V5ZWQodmFsdWUpID8gdmFsdWUgOiBLZXllZFNlcSh2YWx1ZSk7XG4gIH1cblxuICBpZiAoIENvbGxlY3Rpb24gKSBLZXllZENvbGxlY3Rpb24uX19wcm90b19fID0gQ29sbGVjdGlvbjtcbiAgS2V5ZWRDb2xsZWN0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGUgKTtcbiAgS2V5ZWRDb2xsZWN0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEtleWVkQ29sbGVjdGlvbjtcblxuICByZXR1cm4gS2V5ZWRDb2xsZWN0aW9uO1xufShDb2xsZWN0aW9uKSk7XG5cbnZhciBJbmRleGVkQ29sbGVjdGlvbiA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKENvbGxlY3Rpb24pIHtcbiAgZnVuY3Rpb24gSW5kZXhlZENvbGxlY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gaXNJbmRleGVkKHZhbHVlKSA/IHZhbHVlIDogSW5kZXhlZFNlcSh2YWx1ZSk7XG4gIH1cblxuICBpZiAoIENvbGxlY3Rpb24gKSBJbmRleGVkQ29sbGVjdGlvbi5fX3Byb3RvX18gPSBDb2xsZWN0aW9uO1xuICBJbmRleGVkQ29sbGVjdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlICk7XG4gIEluZGV4ZWRDb2xsZWN0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEluZGV4ZWRDb2xsZWN0aW9uO1xuXG4gIHJldHVybiBJbmRleGVkQ29sbGVjdGlvbjtcbn0oQ29sbGVjdGlvbikpO1xuXG52YXIgU2V0Q29sbGVjdGlvbiA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKENvbGxlY3Rpb24pIHtcbiAgZnVuY3Rpb24gU2V0Q29sbGVjdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBpc0NvbGxlY3Rpb24odmFsdWUpICYmICFpc0Fzc29jaWF0aXZlKHZhbHVlKSA/IHZhbHVlIDogU2V0U2VxKHZhbHVlKTtcbiAgfVxuXG4gIGlmICggQ29sbGVjdGlvbiApIFNldENvbGxlY3Rpb24uX19wcm90b19fID0gQ29sbGVjdGlvbjtcbiAgU2V0Q29sbGVjdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlICk7XG4gIFNldENvbGxlY3Rpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2V0Q29sbGVjdGlvbjtcblxuICByZXR1cm4gU2V0Q29sbGVjdGlvbjtcbn0oQ29sbGVjdGlvbikpO1xuXG5Db2xsZWN0aW9uLktleWVkID0gS2V5ZWRDb2xsZWN0aW9uO1xuQ29sbGVjdGlvbi5JbmRleGVkID0gSW5kZXhlZENvbGxlY3Rpb247XG5Db2xsZWN0aW9uLlNldCA9IFNldENvbGxlY3Rpb247XG5cbnZhciBJU19TRVFfU1lNQk9MID0gJ0BAX19JTU1VVEFCTEVfU0VRX19AQCc7XG5cbmZ1bmN0aW9uIGlzU2VxKG1heWJlU2VxKSB7XG4gIHJldHVybiBCb29sZWFuKG1heWJlU2VxICYmIG1heWJlU2VxW0lTX1NFUV9TWU1CT0xdKTtcbn1cblxudmFyIElTX1JFQ09SRF9TWU1CT0wgPSAnQEBfX0lNTVVUQUJMRV9SRUNPUkRfX0BAJztcblxuZnVuY3Rpb24gaXNSZWNvcmQobWF5YmVSZWNvcmQpIHtcbiAgcmV0dXJuIEJvb2xlYW4obWF5YmVSZWNvcmQgJiYgbWF5YmVSZWNvcmRbSVNfUkVDT1JEX1NZTUJPTF0pO1xufVxuXG5mdW5jdGlvbiBpc0ltbXV0YWJsZShtYXliZUltbXV0YWJsZSkge1xuICByZXR1cm4gaXNDb2xsZWN0aW9uKG1heWJlSW1tdXRhYmxlKSB8fCBpc1JlY29yZChtYXliZUltbXV0YWJsZSk7XG59XG5cbnZhciBJU19PUkRFUkVEX1NZTUJPTCA9ICdAQF9fSU1NVVRBQkxFX09SREVSRURfX0BAJztcblxuZnVuY3Rpb24gaXNPcmRlcmVkKG1heWJlT3JkZXJlZCkge1xuICByZXR1cm4gQm9vbGVhbihtYXliZU9yZGVyZWQgJiYgbWF5YmVPcmRlcmVkW0lTX09SREVSRURfU1lNQk9MXSk7XG59XG5cbnZhciBJVEVSQVRFX0tFWVMgPSAwO1xudmFyIElURVJBVEVfVkFMVUVTID0gMTtcbnZhciBJVEVSQVRFX0VOVFJJRVMgPSAyO1xuXG52YXIgUkVBTF9JVEVSQVRPUl9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcblxudmFyIElURVJBVE9SX1NZTUJPTCA9IFJFQUxfSVRFUkFUT1JfU1lNQk9MIHx8IEZBVVhfSVRFUkFUT1JfU1lNQk9MO1xuXG52YXIgSXRlcmF0b3IgPSBmdW5jdGlvbiBJdGVyYXRvcihuZXh0KSB7XG4gIHRoaXMubmV4dCA9IG5leHQ7XG59O1xuXG5JdGVyYXRvci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIHJldHVybiAnW0l0ZXJhdG9yXSc7XG59O1xuXG5JdGVyYXRvci5LRVlTID0gSVRFUkFURV9LRVlTO1xuSXRlcmF0b3IuVkFMVUVTID0gSVRFUkFURV9WQUxVRVM7XG5JdGVyYXRvci5FTlRSSUVTID0gSVRFUkFURV9FTlRSSUVTO1xuXG5JdGVyYXRvci5wcm90b3R5cGUuaW5zcGVjdCA9IEl0ZXJhdG9yLnByb3RvdHlwZS50b1NvdXJjZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy50b1N0cmluZygpO1xufTtcbkl0ZXJhdG9yLnByb3RvdHlwZVtJVEVSQVRPUl9TWU1CT0xdID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gaXRlcmF0b3JWYWx1ZSh0eXBlLCBrLCB2LCBpdGVyYXRvclJlc3VsdCkge1xuICB2YXIgdmFsdWUgPSB0eXBlID09PSAwID8gayA6IHR5cGUgPT09IDEgPyB2IDogW2ssIHZdO1xuICBpdGVyYXRvclJlc3VsdFxuICAgID8gKGl0ZXJhdG9yUmVzdWx0LnZhbHVlID0gdmFsdWUpXG4gICAgOiAoaXRlcmF0b3JSZXN1bHQgPSB7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICB9KTtcbiAgcmV0dXJuIGl0ZXJhdG9yUmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpdGVyYXRvckRvbmUoKSB7XG4gIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbn1cblxuZnVuY3Rpb24gaGFzSXRlcmF0b3IobWF5YmVJdGVyYWJsZSkge1xuICByZXR1cm4gISFnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpO1xufVxuXG5mdW5jdGlvbiBpc0l0ZXJhdG9yKG1heWJlSXRlcmF0b3IpIHtcbiAgcmV0dXJuIG1heWJlSXRlcmF0b3IgJiYgdHlwZW9mIG1heWJlSXRlcmF0b3IubmV4dCA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gZ2V0SXRlcmF0b3IoaXRlcmFibGUpIHtcbiAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKGl0ZXJhYmxlKTtcbiAgcmV0dXJuIGl0ZXJhdG9yRm4gJiYgaXRlcmF0b3JGbi5jYWxsKGl0ZXJhYmxlKTtcbn1cblxuZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihpdGVyYWJsZSkge1xuICB2YXIgaXRlcmF0b3JGbiA9XG4gICAgaXRlcmFibGUgJiZcbiAgICAoKFJFQUxfSVRFUkFUT1JfU1lNQk9MICYmIGl0ZXJhYmxlW1JFQUxfSVRFUkFUT1JfU1lNQk9MXSkgfHxcbiAgICAgIGl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXSk7XG4gIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBpdGVyYXRvckZuO1xuICB9XG59XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIHZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgIE51bWJlci5pc0ludGVnZXIodmFsdWUubGVuZ3RoKSAmJlxuICAgIHZhbHVlLmxlbmd0aCA+PSAwICYmXG4gICAgKHZhbHVlLmxlbmd0aCA9PT0gMFxuICAgICAgPyAvLyBPbmx5IHtsZW5ndGg6IDB9IGlzIGNvbnNpZGVyZWQgQXJyYXktbGlrZS5cbiAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMVxuICAgICAgOiAvLyBBbiBvYmplY3QgaXMgb25seSBBcnJheS1saWtlIGlmIGl0IGhhcyBhIHByb3BlcnR5IHdoZXJlIHRoZSBsYXN0IHZhbHVlXG4gICAgICAgIC8vIGluIHRoZSBhcnJheS1saWtlIG1heSBiZSBmb3VuZCAod2hpY2ggY291bGQgYmUgdW5kZWZpbmVkKS5cbiAgICAgICAgdmFsdWUuaGFzT3duUHJvcGVydHkodmFsdWUubGVuZ3RoIC0gMSkpXG4gICk7XG59XG5cbnZhciBTZXEgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChDb2xsZWN0aW9uJCQxKSB7XG4gIGZ1bmN0aW9uIFNlcSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICA/IGVtcHR5U2VxdWVuY2UoKVxuICAgICAgOiBpc0ltbXV0YWJsZSh2YWx1ZSlcbiAgICAgICAgPyB2YWx1ZS50b1NlcSgpXG4gICAgICAgIDogc2VxRnJvbVZhbHVlKHZhbHVlKTtcbiAgfVxuXG4gIGlmICggQ29sbGVjdGlvbiQkMSApIFNlcS5fX3Byb3RvX18gPSBDb2xsZWN0aW9uJCQxO1xuICBTZXEucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ29sbGVjdGlvbiQkMSAmJiBDb2xsZWN0aW9uJCQxLnByb3RvdHlwZSApO1xuICBTZXEucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2VxO1xuXG4gIFNlcS5wcm90b3R5cGUudG9TZXEgPSBmdW5jdGlvbiB0b1NlcSAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgU2VxLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCdTZXEgeycsICd9Jyk7XG4gIH07XG5cbiAgU2VxLnByb3RvdHlwZS5jYWNoZVJlc3VsdCA9IGZ1bmN0aW9uIGNhY2hlUmVzdWx0ICgpIHtcbiAgICBpZiAoIXRoaXMuX2NhY2hlICYmIHRoaXMuX19pdGVyYXRlVW5jYWNoZWQpIHtcbiAgICAgIHRoaXMuX2NhY2hlID0gdGhpcy5lbnRyeVNlcSgpLnRvQXJyYXkoKTtcbiAgICAgIHRoaXMuc2l6ZSA9IHRoaXMuX2NhY2hlLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLy8gYWJzdHJhY3QgX19pdGVyYXRlVW5jYWNoZWQoZm4sIHJldmVyc2UpXG5cbiAgU2VxLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbiBfX2l0ZXJhdGUgKGZuLCByZXZlcnNlKSB7XG4gICAgdmFyIGNhY2hlID0gdGhpcy5fY2FjaGU7XG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICB2YXIgc2l6ZSA9IGNhY2hlLmxlbmd0aDtcbiAgICAgIHZhciBpID0gMDtcbiAgICAgIHdoaWxlIChpICE9PSBzaXplKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGNhY2hlW3JldmVyc2UgPyBzaXplIC0gKytpIDogaSsrXTtcbiAgICAgICAgaWYgKGZuKGVudHJ5WzFdLCBlbnRyeVswXSwgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX2l0ZXJhdGVVbmNhY2hlZChmbiwgcmV2ZXJzZSk7XG4gIH07XG5cbiAgLy8gYWJzdHJhY3QgX19pdGVyYXRvclVuY2FjaGVkKHR5cGUsIHJldmVyc2UpXG5cbiAgU2VxLnByb3RvdHlwZS5fX2l0ZXJhdG9yID0gZnVuY3Rpb24gX19pdGVyYXRvciAodHlwZSwgcmV2ZXJzZSkge1xuICAgIHZhciBjYWNoZSA9IHRoaXMuX2NhY2hlO1xuICAgIGlmIChjYWNoZSkge1xuICAgICAgdmFyIHNpemUgPSBjYWNoZS5sZW5ndGg7XG4gICAgICB2YXIgaSA9IDA7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGkgPT09IHNpemUpIHtcbiAgICAgICAgICByZXR1cm4gaXRlcmF0b3JEb25lKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVudHJ5ID0gY2FjaGVbcmV2ZXJzZSA/IHNpemUgLSArK2kgOiBpKytdO1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZSh0eXBlLCBlbnRyeVswXSwgZW50cnlbMV0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9faXRlcmF0b3JVbmNhY2hlZCh0eXBlLCByZXZlcnNlKTtcbiAgfTtcblxuICByZXR1cm4gU2VxO1xufShDb2xsZWN0aW9uKSk7XG5cbnZhciBLZXllZFNlcSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKFNlcSkge1xuICBmdW5jdGlvbiBLZXllZFNlcSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICA/IGVtcHR5U2VxdWVuY2UoKS50b0tleWVkU2VxKClcbiAgICAgIDogaXNDb2xsZWN0aW9uKHZhbHVlKVxuICAgICAgICA/IGlzS2V5ZWQodmFsdWUpXG4gICAgICAgICAgPyB2YWx1ZS50b1NlcSgpXG4gICAgICAgICAgOiB2YWx1ZS5mcm9tRW50cnlTZXEoKVxuICAgICAgICA6IGlzUmVjb3JkKHZhbHVlKVxuICAgICAgICAgID8gdmFsdWUudG9TZXEoKVxuICAgICAgICAgIDoga2V5ZWRTZXFGcm9tVmFsdWUodmFsdWUpO1xuICB9XG5cbiAgaWYgKCBTZXEgKSBLZXllZFNlcS5fX3Byb3RvX18gPSBTZXE7XG4gIEtleWVkU2VxLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFNlcSAmJiBTZXEucHJvdG90eXBlICk7XG4gIEtleWVkU2VxLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEtleWVkU2VxO1xuXG4gIEtleWVkU2VxLnByb3RvdHlwZS50b0tleWVkU2VxID0gZnVuY3Rpb24gdG9LZXllZFNlcSAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgcmV0dXJuIEtleWVkU2VxO1xufShTZXEpKTtcblxudmFyIEluZGV4ZWRTZXEgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChTZXEpIHtcbiAgZnVuY3Rpb24gSW5kZXhlZFNlcSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICA/IGVtcHR5U2VxdWVuY2UoKVxuICAgICAgOiBpc0NvbGxlY3Rpb24odmFsdWUpXG4gICAgICAgID8gaXNLZXllZCh2YWx1ZSlcbiAgICAgICAgICA/IHZhbHVlLmVudHJ5U2VxKClcbiAgICAgICAgICA6IHZhbHVlLnRvSW5kZXhlZFNlcSgpXG4gICAgICAgIDogaXNSZWNvcmQodmFsdWUpXG4gICAgICAgICAgPyB2YWx1ZS50b1NlcSgpLmVudHJ5U2VxKClcbiAgICAgICAgICA6IGluZGV4ZWRTZXFGcm9tVmFsdWUodmFsdWUpO1xuICB9XG5cbiAgaWYgKCBTZXEgKSBJbmRleGVkU2VxLl9fcHJvdG9fXyA9IFNlcTtcbiAgSW5kZXhlZFNlcS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTZXEgJiYgU2VxLnByb3RvdHlwZSApO1xuICBJbmRleGVkU2VxLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEluZGV4ZWRTZXE7XG5cbiAgSW5kZXhlZFNlcS5vZiA9IGZ1bmN0aW9uIG9mICgvKi4uLnZhbHVlcyovKSB7XG4gICAgcmV0dXJuIEluZGV4ZWRTZXEoYXJndW1lbnRzKTtcbiAgfTtcblxuICBJbmRleGVkU2VxLnByb3RvdHlwZS50b0luZGV4ZWRTZXEgPSBmdW5jdGlvbiB0b0luZGV4ZWRTZXEgKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEluZGV4ZWRTZXEucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiB0aGlzLl9fdG9TdHJpbmcoJ1NlcSBbJywgJ10nKTtcbiAgfTtcblxuICByZXR1cm4gSW5kZXhlZFNlcTtcbn0oU2VxKSk7XG5cbnZhciBTZXRTZXEgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChTZXEpIHtcbiAgZnVuY3Rpb24gU2V0U2VxKHZhbHVlKSB7XG4gICAgcmV0dXJuIChpc0NvbGxlY3Rpb24odmFsdWUpICYmICFpc0Fzc29jaWF0aXZlKHZhbHVlKVxuICAgICAgPyB2YWx1ZVxuICAgICAgOiBJbmRleGVkU2VxKHZhbHVlKVxuICAgICkudG9TZXRTZXEoKTtcbiAgfVxuXG4gIGlmICggU2VxICkgU2V0U2VxLl9fcHJvdG9fXyA9IFNlcTtcbiAgU2V0U2VxLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFNlcSAmJiBTZXEucHJvdG90eXBlICk7XG4gIFNldFNlcS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTZXRTZXE7XG5cbiAgU2V0U2VxLm9mID0gZnVuY3Rpb24gb2YgKC8qLi4udmFsdWVzKi8pIHtcbiAgICByZXR1cm4gU2V0U2VxKGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgU2V0U2VxLnByb3RvdHlwZS50b1NldFNlcSA9IGZ1bmN0aW9uIHRvU2V0U2VxICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICByZXR1cm4gU2V0U2VxO1xufShTZXEpKTtcblxuU2VxLmlzU2VxID0gaXNTZXE7XG5TZXEuS2V5ZWQgPSBLZXllZFNlcTtcblNlcS5TZXQgPSBTZXRTZXE7XG5TZXEuSW5kZXhlZCA9IEluZGV4ZWRTZXE7XG5cblNlcS5wcm90b3R5cGVbSVNfU0VRX1NZTUJPTF0gPSB0cnVlO1xuXG4vLyAjcHJhZ21hIFJvb3QgU2VxdWVuY2VzXG5cbnZhciBBcnJheVNlcSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEluZGV4ZWRTZXEpIHtcbiAgZnVuY3Rpb24gQXJyYXlTZXEoYXJyYXkpIHtcbiAgICB0aGlzLl9hcnJheSA9IGFycmF5O1xuICAgIHRoaXMuc2l6ZSA9IGFycmF5Lmxlbmd0aDtcbiAgfVxuXG4gIGlmICggSW5kZXhlZFNlcSApIEFycmF5U2VxLl9fcHJvdG9fXyA9IEluZGV4ZWRTZXE7XG4gIEFycmF5U2VxLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEluZGV4ZWRTZXEgJiYgSW5kZXhlZFNlcS5wcm90b3R5cGUgKTtcbiAgQXJyYXlTZXEucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXJyYXlTZXE7XG5cbiAgQXJyYXlTZXEucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCAoaW5kZXgsIG5vdFNldFZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzKGluZGV4KSA/IHRoaXMuX2FycmF5W3dyYXBJbmRleCh0aGlzLCBpbmRleCldIDogbm90U2V0VmFsdWU7XG4gIH07XG5cbiAgQXJyYXlTZXEucHJvdG90eXBlLl9faXRlcmF0ZSA9IGZ1bmN0aW9uIF9faXRlcmF0ZSAoZm4sIHJldmVyc2UpIHtcbiAgICB2YXIgYXJyYXkgPSB0aGlzLl9hcnJheTtcbiAgICB2YXIgc2l6ZSA9IGFycmF5Lmxlbmd0aDtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGkgIT09IHNpemUpIHtcbiAgICAgIHZhciBpaSA9IHJldmVyc2UgPyBzaXplIC0gKytpIDogaSsrO1xuICAgICAgaWYgKGZuKGFycmF5W2lpXSwgaWksIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGk7XG4gIH07XG5cbiAgQXJyYXlTZXEucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbiBfX2l0ZXJhdG9yICh0eXBlLCByZXZlcnNlKSB7XG4gICAgdmFyIGFycmF5ID0gdGhpcy5fYXJyYXk7XG4gICAgdmFyIHNpemUgPSBhcnJheS5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGkgPT09IHNpemUpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yRG9uZSgpO1xuICAgICAgfVxuICAgICAgdmFyIGlpID0gcmV2ZXJzZSA/IHNpemUgLSArK2kgOiBpKys7XG4gICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZSh0eXBlLCBpaSwgYXJyYXlbaWldKTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gQXJyYXlTZXE7XG59KEluZGV4ZWRTZXEpKTtcblxudmFyIE9iamVjdFNlcSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEtleWVkU2VxKSB7XG4gIGZ1bmN0aW9uIE9iamVjdFNlcShvYmplY3QpIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG4gICAgdGhpcy5fb2JqZWN0ID0gb2JqZWN0O1xuICAgIHRoaXMuX2tleXMgPSBrZXlzO1xuICAgIHRoaXMuc2l6ZSA9IGtleXMubGVuZ3RoO1xuICB9XG5cbiAgaWYgKCBLZXllZFNlcSApIE9iamVjdFNlcS5fX3Byb3RvX18gPSBLZXllZFNlcTtcbiAgT2JqZWN0U2VxLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEtleWVkU2VxICYmIEtleWVkU2VxLnByb3RvdHlwZSApO1xuICBPYmplY3RTZXEucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gT2JqZWN0U2VxO1xuXG4gIE9iamVjdFNlcS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChrZXksIG5vdFNldFZhbHVlKSB7XG4gICAgaWYgKG5vdFNldFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIXRoaXMuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiBub3RTZXRWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX29iamVjdFtrZXldO1xuICB9O1xuXG4gIE9iamVjdFNlcS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gaGFzIChrZXkpIHtcbiAgICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl9vYmplY3QsIGtleSk7XG4gIH07XG5cbiAgT2JqZWN0U2VxLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbiBfX2l0ZXJhdGUgKGZuLCByZXZlcnNlKSB7XG4gICAgdmFyIG9iamVjdCA9IHRoaXMuX29iamVjdDtcbiAgICB2YXIga2V5cyA9IHRoaXMuX2tleXM7XG4gICAgdmFyIHNpemUgPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGkgIT09IHNpemUpIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW3JldmVyc2UgPyBzaXplIC0gKytpIDogaSsrXTtcbiAgICAgIGlmIChmbihvYmplY3Rba2V5XSwga2V5LCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpO1xuICB9O1xuXG4gIE9iamVjdFNlcS5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uIF9faXRlcmF0b3IgKHR5cGUsIHJldmVyc2UpIHtcbiAgICB2YXIgb2JqZWN0ID0gdGhpcy5fb2JqZWN0O1xuICAgIHZhciBrZXlzID0gdGhpcy5fa2V5cztcbiAgICB2YXIgc2l6ZSA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBpID0gMDtcbiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChpID09PSBzaXplKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvckRvbmUoKTtcbiAgICAgIH1cbiAgICAgIHZhciBrZXkgPSBrZXlzW3JldmVyc2UgPyBzaXplIC0gKytpIDogaSsrXTtcbiAgICAgIHJldHVybiBpdGVyYXRvclZhbHVlKHR5cGUsIGtleSwgb2JqZWN0W2tleV0pO1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBPYmplY3RTZXE7XG59KEtleWVkU2VxKSk7XG5PYmplY3RTZXEucHJvdG90eXBlW0lTX09SREVSRURfU1lNQk9MXSA9IHRydWU7XG5cbnZhciBDb2xsZWN0aW9uU2VxID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoSW5kZXhlZFNlcSkge1xuICBmdW5jdGlvbiBDb2xsZWN0aW9uU2VxKGNvbGxlY3Rpb24pIHtcbiAgICB0aGlzLl9jb2xsZWN0aW9uID0gY29sbGVjdGlvbjtcbiAgICB0aGlzLnNpemUgPSBjb2xsZWN0aW9uLmxlbmd0aCB8fCBjb2xsZWN0aW9uLnNpemU7XG4gIH1cblxuICBpZiAoIEluZGV4ZWRTZXEgKSBDb2xsZWN0aW9uU2VxLl9fcHJvdG9fXyA9IEluZGV4ZWRTZXE7XG4gIENvbGxlY3Rpb25TZXEucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggSW5kZXhlZFNlcSAmJiBJbmRleGVkU2VxLnByb3RvdHlwZSApO1xuICBDb2xsZWN0aW9uU2VxLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbGxlY3Rpb25TZXE7XG5cbiAgQ29sbGVjdGlvblNlcS5wcm90b3R5cGUuX19pdGVyYXRlVW5jYWNoZWQgPSBmdW5jdGlvbiBfX2l0ZXJhdGVVbmNhY2hlZCAoZm4sIHJldmVyc2UpIHtcbiAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVSZXN1bHQoKS5fX2l0ZXJhdGUoZm4sIHJldmVyc2UpO1xuICAgIH1cbiAgICB2YXIgY29sbGVjdGlvbiA9IHRoaXMuX2NvbGxlY3Rpb247XG4gICAgdmFyIGl0ZXJhdG9yID0gZ2V0SXRlcmF0b3IoY29sbGVjdGlvbik7XG4gICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgIGlmIChpc0l0ZXJhdG9yKGl0ZXJhdG9yKSkge1xuICAgICAgdmFyIHN0ZXA7XG4gICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgIGlmIChmbihzdGVwLnZhbHVlLCBpdGVyYXRpb25zKyssIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpdGVyYXRpb25zO1xuICB9O1xuXG4gIENvbGxlY3Rpb25TZXEucHJvdG90eXBlLl9faXRlcmF0b3JVbmNhY2hlZCA9IGZ1bmN0aW9uIF9faXRlcmF0b3JVbmNhY2hlZCAodHlwZSwgcmV2ZXJzZSkge1xuICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0b3IodHlwZSwgcmV2ZXJzZSk7XG4gICAgfVxuICAgIHZhciBjb2xsZWN0aW9uID0gdGhpcy5fY29sbGVjdGlvbjtcbiAgICB2YXIgaXRlcmF0b3IgPSBnZXRJdGVyYXRvcihjb2xsZWN0aW9uKTtcbiAgICBpZiAoIWlzSXRlcmF0b3IoaXRlcmF0b3IpKSB7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGl0ZXJhdG9yRG9uZSk7XG4gICAgfVxuICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgcmV0dXJuIHN0ZXAuZG9uZSA/IHN0ZXAgOiBpdGVyYXRvclZhbHVlKHR5cGUsIGl0ZXJhdGlvbnMrKywgc3RlcC52YWx1ZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIENvbGxlY3Rpb25TZXE7XG59KEluZGV4ZWRTZXEpKTtcblxuLy8gIyBwcmFnbWEgSGVscGVyIGZ1bmN0aW9uc1xuXG52YXIgRU1QVFlfU0VRO1xuXG5mdW5jdGlvbiBlbXB0eVNlcXVlbmNlKCkge1xuICByZXR1cm4gRU1QVFlfU0VRIHx8IChFTVBUWV9TRVEgPSBuZXcgQXJyYXlTZXEoW10pKTtcbn1cblxuZnVuY3Rpb24ga2V5ZWRTZXFGcm9tVmFsdWUodmFsdWUpIHtcbiAgdmFyIHNlcSA9IEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgPyBuZXcgQXJyYXlTZXEodmFsdWUpXG4gICAgOiBoYXNJdGVyYXRvcih2YWx1ZSlcbiAgICAgID8gbmV3IENvbGxlY3Rpb25TZXEodmFsdWUpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgaWYgKHNlcSkge1xuICAgIHJldHVybiBzZXEuZnJvbUVudHJ5U2VxKCk7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbmV3IE9iamVjdFNlcSh2YWx1ZSk7XG4gIH1cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAnRXhwZWN0ZWQgQXJyYXkgb3IgY29sbGVjdGlvbiBvYmplY3Qgb2YgW2ssIHZdIGVudHJpZXMsIG9yIGtleWVkIG9iamVjdDogJyArXG4gICAgICB2YWx1ZVxuICApO1xufVxuXG5mdW5jdGlvbiBpbmRleGVkU2VxRnJvbVZhbHVlKHZhbHVlKSB7XG4gIHZhciBzZXEgPSBtYXliZUluZGV4ZWRTZXFGcm9tVmFsdWUodmFsdWUpO1xuICBpZiAoc2VxKSB7XG4gICAgcmV0dXJuIHNlcTtcbiAgfVxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICdFeHBlY3RlZCBBcnJheSBvciBjb2xsZWN0aW9uIG9iamVjdCBvZiB2YWx1ZXM6ICcgKyB2YWx1ZVxuICApO1xufVxuXG5mdW5jdGlvbiBzZXFGcm9tVmFsdWUodmFsdWUpIHtcbiAgdmFyIHNlcSA9IG1heWJlSW5kZXhlZFNlcUZyb21WYWx1ZSh2YWx1ZSk7XG4gIGlmIChzZXEpIHtcbiAgICByZXR1cm4gc2VxO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG5ldyBPYmplY3RTZXEodmFsdWUpO1xuICB9XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgJ0V4cGVjdGVkIEFycmF5IG9yIGNvbGxlY3Rpb24gb2JqZWN0IG9mIHZhbHVlcywgb3Iga2V5ZWQgb2JqZWN0OiAnICsgdmFsdWVcbiAgKTtcbn1cblxuZnVuY3Rpb24gbWF5YmVJbmRleGVkU2VxRnJvbVZhbHVlKHZhbHVlKSB7XG4gIHJldHVybiBpc0FycmF5TGlrZSh2YWx1ZSlcbiAgICA/IG5ldyBBcnJheVNlcSh2YWx1ZSlcbiAgICA6IGhhc0l0ZXJhdG9yKHZhbHVlKVxuICAgICAgPyBuZXcgQ29sbGVjdGlvblNlcSh2YWx1ZSlcbiAgICAgIDogdW5kZWZpbmVkO1xufVxuXG52YXIgSVNfTUFQX1NZTUJPTCA9ICdAQF9fSU1NVVRBQkxFX01BUF9fQEAnO1xuXG5mdW5jdGlvbiBpc01hcChtYXliZU1hcCkge1xuICByZXR1cm4gQm9vbGVhbihtYXliZU1hcCAmJiBtYXliZU1hcFtJU19NQVBfU1lNQk9MXSk7XG59XG5cbmZ1bmN0aW9uIGlzT3JkZXJlZE1hcChtYXliZU9yZGVyZWRNYXApIHtcbiAgcmV0dXJuIGlzTWFwKG1heWJlT3JkZXJlZE1hcCkgJiYgaXNPcmRlcmVkKG1heWJlT3JkZXJlZE1hcCk7XG59XG5cbmZ1bmN0aW9uIGlzVmFsdWVPYmplY3QobWF5YmVWYWx1ZSkge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICBtYXliZVZhbHVlICYmXG4gICAgICB0eXBlb2YgbWF5YmVWYWx1ZS5lcXVhbHMgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIHR5cGVvZiBtYXliZVZhbHVlLmhhc2hDb2RlID09PSAnZnVuY3Rpb24nXG4gICk7XG59XG5cbi8qKlxuICogQW4gZXh0ZW5zaW9uIG9mIHRoZSBcInNhbWUtdmFsdWVcIiBhbGdvcml0aG0gYXMgW2Rlc2NyaWJlZCBmb3IgdXNlIGJ5IEVTNiBNYXBcbiAqIGFuZCBTZXRdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hcCNLZXlfZXF1YWxpdHkpXG4gKlxuICogTmFOIGlzIGNvbnNpZGVyZWQgdGhlIHNhbWUgYXMgTmFOLCBob3dldmVyIC0wIGFuZCAwIGFyZSBjb25zaWRlcmVkIHRoZSBzYW1lXG4gKiB2YWx1ZSwgd2hpY2ggaXMgZGlmZmVyZW50IGZyb20gdGhlIGFsZ29yaXRobSBkZXNjcmliZWQgYnlcbiAqIFtgT2JqZWN0LmlzYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzKS5cbiAqXG4gKiBUaGlzIGlzIGV4dGVuZGVkIGZ1cnRoZXIgdG8gYWxsb3cgT2JqZWN0cyB0byBkZXNjcmliZSB0aGUgdmFsdWVzIHRoZXlcbiAqIHJlcHJlc2VudCwgYnkgd2F5IG9mIGB2YWx1ZU9mYCBvciBgZXF1YWxzYCAoYW5kIGBoYXNoQ29kZWApLlxuICpcbiAqIE5vdGU6IGJlY2F1c2Ugb2YgdGhpcyBleHRlbnNpb24sIHRoZSBrZXkgZXF1YWxpdHkgb2YgSW1tdXRhYmxlLk1hcCBhbmQgdGhlXG4gKiB2YWx1ZSBlcXVhbGl0eSBvZiBJbW11dGFibGUuU2V0IHdpbGwgZGlmZmVyIGZyb20gRVM2IE1hcCBhbmQgU2V0LlxuICpcbiAqICMjIyBEZWZpbmluZyBjdXN0b20gdmFsdWVzXG4gKlxuICogVGhlIGVhc2llc3Qgd2F5IHRvIGRlc2NyaWJlIHRoZSB2YWx1ZSBhbiBvYmplY3QgcmVwcmVzZW50cyBpcyBieSBpbXBsZW1lbnRpbmdcbiAqIGB2YWx1ZU9mYC4gRm9yIGV4YW1wbGUsIGBEYXRlYCByZXByZXNlbnRzIGEgdmFsdWUgYnkgcmV0dXJuaW5nIGEgdW5peFxuICogdGltZXN0YW1wIGZvciBgdmFsdWVPZmA6XG4gKlxuICogICAgIHZhciBkYXRlMSA9IG5ldyBEYXRlKDEyMzQ1Njc4OTAwMDApOyAvLyBGcmkgRmViIDEzIDIwMDkgLi4uXG4gKiAgICAgdmFyIGRhdGUyID0gbmV3IERhdGUoMTIzNDU2Nzg5MDAwMCk7XG4gKiAgICAgZGF0ZTEudmFsdWVPZigpOyAvLyAxMjM0NTY3ODkwMDAwXG4gKiAgICAgYXNzZXJ0KCBkYXRlMSAhPT0gZGF0ZTIgKTtcbiAqICAgICBhc3NlcnQoIEltbXV0YWJsZS5pcyggZGF0ZTEsIGRhdGUyICkgKTtcbiAqXG4gKiBOb3RlOiBvdmVycmlkaW5nIGB2YWx1ZU9mYCBtYXkgaGF2ZSBvdGhlciBpbXBsaWNhdGlvbnMgaWYgeW91IHVzZSB0aGlzIG9iamVjdFxuICogd2hlcmUgSmF2YVNjcmlwdCBleHBlY3RzIGEgcHJpbWl0aXZlLCBzdWNoIGFzIGltcGxpY2l0IHN0cmluZyBjb2VyY2lvbi5cbiAqXG4gKiBGb3IgbW9yZSBjb21wbGV4IHR5cGVzLCBlc3BlY2lhbGx5IGNvbGxlY3Rpb25zLCBpbXBsZW1lbnRpbmcgYHZhbHVlT2ZgIG1heVxuICogbm90IGJlIHBlcmZvcm1hbnQuIEFuIGFsdGVybmF0aXZlIGlzIHRvIGltcGxlbWVudCBgZXF1YWxzYCBhbmQgYGhhc2hDb2RlYC5cbiAqXG4gKiBgZXF1YWxzYCB0YWtlcyBhbm90aGVyIG9iamVjdCwgcHJlc3VtYWJseSBvZiBzaW1pbGFyIHR5cGUsIGFuZCByZXR1cm5zIHRydWVcbiAqIGlmIGl0IGlzIGVxdWFsLiBFcXVhbGl0eSBpcyBzeW1tZXRyaWNhbCwgc28gdGhlIHNhbWUgcmVzdWx0IHNob3VsZCBiZVxuICogcmV0dXJuZWQgaWYgdGhpcyBhbmQgdGhlIGFyZ3VtZW50IGFyZSBmbGlwcGVkLlxuICpcbiAqICAgICBhc3NlcnQoIGEuZXF1YWxzKGIpID09PSBiLmVxdWFscyhhKSApO1xuICpcbiAqIGBoYXNoQ29kZWAgcmV0dXJucyBhIDMyYml0IGludGVnZXIgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgb2JqZWN0IHdoaWNoIHdpbGxcbiAqIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGhvdyB0byBzdG9yZSB0aGUgdmFsdWUgb2JqZWN0IGluIGEgTWFwIG9yIFNldC4gWW91IG11c3RcbiAqIHByb3ZpZGUgYm90aCBvciBuZWl0aGVyIG1ldGhvZHMsIG9uZSBtdXN0IG5vdCBleGlzdCB3aXRob3V0IHRoZSBvdGhlci5cbiAqXG4gKiBBbHNvLCBhbiBpbXBvcnRhbnQgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlc2UgbWV0aG9kcyBtdXN0IGJlIHVwaGVsZDogaWYgdHdvXG4gKiB2YWx1ZXMgYXJlIGVxdWFsLCB0aGV5ICptdXN0KiByZXR1cm4gdGhlIHNhbWUgaGFzaENvZGUuIElmIHRoZSB2YWx1ZXMgYXJlIG5vdFxuICogZXF1YWwsIHRoZXkgbWlnaHQgaGF2ZSB0aGUgc2FtZSBoYXNoQ29kZTsgdGhpcyBpcyBjYWxsZWQgYSBoYXNoIGNvbGxpc2lvbixcbiAqIGFuZCB3aGlsZSB1bmRlc2lyYWJsZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgaXQgaXMgYWNjZXB0YWJsZS5cbiAqXG4gKiAgICAgaWYgKGEuZXF1YWxzKGIpKSB7XG4gKiAgICAgICBhc3NlcnQoIGEuaGFzaENvZGUoKSA9PT0gYi5oYXNoQ29kZSgpICk7XG4gKiAgICAgfVxuICpcbiAqIEFsbCBJbW11dGFibGUgY29sbGVjdGlvbnMgYXJlIFZhbHVlIE9iamVjdHM6IHRoZXkgaW1wbGVtZW50IGBlcXVhbHMoKWBcbiAqIGFuZCBgaGFzaENvZGUoKWAuXG4gKi9cbmZ1bmN0aW9uIGlzKHZhbHVlQSwgdmFsdWVCKSB7XG4gIGlmICh2YWx1ZUEgPT09IHZhbHVlQiB8fCAodmFsdWVBICE9PSB2YWx1ZUEgJiYgdmFsdWVCICE9PSB2YWx1ZUIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCF2YWx1ZUEgfHwgIXZhbHVlQikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoXG4gICAgdHlwZW9mIHZhbHVlQS52YWx1ZU9mID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIHZhbHVlQi52YWx1ZU9mID09PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIHZhbHVlQSA9IHZhbHVlQS52YWx1ZU9mKCk7XG4gICAgdmFsdWVCID0gdmFsdWVCLnZhbHVlT2YoKTtcbiAgICBpZiAodmFsdWVBID09PSB2YWx1ZUIgfHwgKHZhbHVlQSAhPT0gdmFsdWVBICYmIHZhbHVlQiAhPT0gdmFsdWVCKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghdmFsdWVBIHx8ICF2YWx1ZUIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuICEhKFxuICAgIGlzVmFsdWVPYmplY3QodmFsdWVBKSAmJlxuICAgIGlzVmFsdWVPYmplY3QodmFsdWVCKSAmJlxuICAgIHZhbHVlQS5lcXVhbHModmFsdWVCKVxuICApO1xufVxuXG52YXIgaW11bCA9XG4gIHR5cGVvZiBNYXRoLmltdWwgPT09ICdmdW5jdGlvbicgJiYgTWF0aC5pbXVsKDB4ZmZmZmZmZmYsIDIpID09PSAtMlxuICAgID8gTWF0aC5pbXVsXG4gICAgOiBmdW5jdGlvbiBpbXVsKGEsIGIpIHtcbiAgICAgICAgYSB8PSAwOyAvLyBpbnRcbiAgICAgICAgYiB8PSAwOyAvLyBpbnRcbiAgICAgICAgdmFyIGMgPSBhICYgMHhmZmZmO1xuICAgICAgICB2YXIgZCA9IGIgJiAweGZmZmY7XG4gICAgICAgIC8vIFNoaWZ0IGJ5IDAgZml4ZXMgdGhlIHNpZ24gb24gdGhlIGhpZ2ggcGFydC5cbiAgICAgICAgcmV0dXJuIChjICogZCArICgoKChhID4+PiAxNikgKiBkICsgYyAqIChiID4+PiAxNikpIDw8IDE2KSA+Pj4gMCkpIHwgMDsgLy8gaW50XG4gICAgICB9O1xuXG4vLyB2OCBoYXMgYW4gb3B0aW1pemF0aW9uIGZvciBzdG9yaW5nIDMxLWJpdCBzaWduZWQgbnVtYmVycy5cbi8vIFZhbHVlcyB3aGljaCBoYXZlIGVpdGhlciAwMCBvciAxMSBhcyB0aGUgaGlnaCBvcmRlciBiaXRzIHF1YWxpZnkuXG4vLyBUaGlzIGZ1bmN0aW9uIGRyb3BzIHRoZSBoaWdoZXN0IG9yZGVyIGJpdCBpbiBhIHNpZ25lZCBudW1iZXIsIG1haW50YWluaW5nXG4vLyB0aGUgc2lnbiBiaXQuXG5mdW5jdGlvbiBzbWkoaTMyKSB7XG4gIHJldHVybiAoKGkzMiA+Pj4gMSkgJiAweDQwMDAwMDAwKSB8IChpMzIgJiAweGJmZmZmZmZmKTtcbn1cblxudmFyIGRlZmF1bHRWYWx1ZU9mID0gT2JqZWN0LnByb3RvdHlwZS52YWx1ZU9mO1xuXG5mdW5jdGlvbiBoYXNoKG8pIHtcbiAgc3dpdGNoICh0eXBlb2Ygbykge1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgLy8gVGhlIGhhc2ggdmFsdWVzIGZvciBidWlsdC1pbiBjb25zdGFudHMgYXJlIGEgMSB2YWx1ZSBmb3IgZWFjaCA1LWJ5dGVcbiAgICAgIC8vIHNoaWZ0IHJlZ2lvbiBleHBlY3QgZm9yIHRoZSBmaXJzdCwgd2hpY2ggZW5jb2RlcyB0aGUgdmFsdWUuIFRoaXNcbiAgICAgIC8vIHJlZHVjZXMgdGhlIG9kZHMgb2YgYSBoYXNoIGNvbGxpc2lvbiBmb3IgdGhlc2UgY29tbW9uIHZhbHVlcy5cbiAgICAgIHJldHVybiBvID8gMHg0MjEwODQyMSA6IDB4NDIxMDg0MjA7XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHJldHVybiBoYXNoTnVtYmVyKG8pO1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICByZXR1cm4gby5sZW5ndGggPiBTVFJJTkdfSEFTSF9DQUNIRV9NSU5fU1RSTEVOXG4gICAgICAgID8gY2FjaGVkSGFzaFN0cmluZyhvKVxuICAgICAgICA6IGhhc2hTdHJpbmcobyk7XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICBpZiAobyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gMHg0MjEwODQyMjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygby5oYXNoQ29kZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBEcm9wIGFueSBoaWdoIGJpdHMgZnJvbSBhY2NpZGVudGFsbHkgbG9uZyBoYXNoIGNvZGVzLlxuICAgICAgICByZXR1cm4gc21pKG8uaGFzaENvZGUobykpO1xuICAgICAgfVxuICAgICAgaWYgKG8udmFsdWVPZiAhPT0gZGVmYXVsdFZhbHVlT2YgJiYgdHlwZW9mIG8udmFsdWVPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvID0gby52YWx1ZU9mKG8pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhc2hKU09iaihvKTtcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgcmV0dXJuIDB4NDIxMDg0MjM7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh0eXBlb2Ygby50b1N0cmluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gaGFzaFN0cmluZyhvLnRvU3RyaW5nKCkpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSB0eXBlICcgKyB0eXBlb2YgbyArICcgY2Fubm90IGJlIGhhc2hlZC4nKTtcbiAgfVxufVxuXG4vLyBDb21wcmVzcyBhcmJpdHJhcmlseSBsYXJnZSBudW1iZXJzIGludG8gc21pIGhhc2hlcy5cbmZ1bmN0aW9uIGhhc2hOdW1iZXIobikge1xuICBpZiAobiAhPT0gbiB8fCBuID09PSBJbmZpbml0eSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHZhciBoYXNoID0gbiB8IDA7XG4gIGlmIChoYXNoICE9PSBuKSB7XG4gICAgaGFzaCBePSBuICogMHhmZmZmZmZmZjtcbiAgfVxuICB3aGlsZSAobiA+IDB4ZmZmZmZmZmYpIHtcbiAgICBuIC89IDB4ZmZmZmZmZmY7XG4gICAgaGFzaCBePSBuO1xuICB9XG4gIHJldHVybiBzbWkoaGFzaCk7XG59XG5cbmZ1bmN0aW9uIGNhY2hlZEhhc2hTdHJpbmcoc3RyaW5nKSB7XG4gIHZhciBoYXNoZWQgPSBzdHJpbmdIYXNoQ2FjaGVbc3RyaW5nXTtcbiAgaWYgKGhhc2hlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaGFzaGVkID0gaGFzaFN0cmluZyhzdHJpbmcpO1xuICAgIGlmIChTVFJJTkdfSEFTSF9DQUNIRV9TSVpFID09PSBTVFJJTkdfSEFTSF9DQUNIRV9NQVhfU0laRSkge1xuICAgICAgU1RSSU5HX0hBU0hfQ0FDSEVfU0laRSA9IDA7XG4gICAgICBzdHJpbmdIYXNoQ2FjaGUgPSB7fTtcbiAgICB9XG4gICAgU1RSSU5HX0hBU0hfQ0FDSEVfU0laRSsrO1xuICAgIHN0cmluZ0hhc2hDYWNoZVtzdHJpbmddID0gaGFzaGVkO1xuICB9XG4gIHJldHVybiBoYXNoZWQ7XG59XG5cbi8vIGh0dHA6Ly9qc3BlcmYuY29tL2hhc2hpbmctc3RyaW5nc1xuZnVuY3Rpb24gaGFzaFN0cmluZyhzdHJpbmcpIHtcbiAgLy8gVGhpcyBpcyB0aGUgaGFzaCBmcm9tIEpWTVxuICAvLyBUaGUgaGFzaCBjb2RlIGZvciBhIHN0cmluZyBpcyBjb21wdXRlZCBhc1xuICAvLyBzWzBdICogMzEgXiAobiAtIDEpICsgc1sxXSAqIDMxIF4gKG4gLSAyKSArIC4uLiArIHNbbiAtIDFdLFxuICAvLyB3aGVyZSBzW2ldIGlzIHRoZSBpdGggY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgYW5kIG4gaXMgdGhlIGxlbmd0aCBvZlxuICAvLyB0aGUgc3RyaW5nLiBXZSBcIm1vZFwiIHRoZSByZXN1bHQgdG8gbWFrZSBpdCBiZXR3ZWVuIDAgKGluY2x1c2l2ZSkgYW5kIDJeMzFcbiAgLy8gKGV4Y2x1c2l2ZSkgYnkgZHJvcHBpbmcgaGlnaCBiaXRzLlxuICB2YXIgaGFzaGVkID0gMDtcbiAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IHN0cmluZy5sZW5ndGg7IGlpKyspIHtcbiAgICBoYXNoZWQgPSAoMzEgKiBoYXNoZWQgKyBzdHJpbmcuY2hhckNvZGVBdChpaSkpIHwgMDtcbiAgfVxuICByZXR1cm4gc21pKGhhc2hlZCk7XG59XG5cbmZ1bmN0aW9uIGhhc2hKU09iaihvYmopIHtcbiAgdmFyIGhhc2hlZDtcbiAgaWYgKHVzaW5nV2Vha01hcCkge1xuICAgIGhhc2hlZCA9IHdlYWtNYXAuZ2V0KG9iaik7XG4gICAgaWYgKGhhc2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gaGFzaGVkO1xuICAgIH1cbiAgfVxuXG4gIGhhc2hlZCA9IG9ialtVSURfSEFTSF9LRVldO1xuICBpZiAoaGFzaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gaGFzaGVkO1xuICB9XG5cbiAgaWYgKCFjYW5EZWZpbmVQcm9wZXJ0eSkge1xuICAgIGhhc2hlZCA9IG9iai5wcm9wZXJ0eUlzRW51bWVyYWJsZSAmJiBvYmoucHJvcGVydHlJc0VudW1lcmFibGVbVUlEX0hBU0hfS0VZXTtcbiAgICBpZiAoaGFzaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBoYXNoZWQ7XG4gICAgfVxuXG4gICAgaGFzaGVkID0gZ2V0SUVOb2RlSGFzaChvYmopO1xuICAgIGlmIChoYXNoZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGhhc2hlZDtcbiAgICB9XG4gIH1cblxuICBoYXNoZWQgPSArK29iakhhc2hVSUQ7XG4gIGlmIChvYmpIYXNoVUlEICYgMHg0MDAwMDAwMCkge1xuICAgIG9iakhhc2hVSUQgPSAwO1xuICB9XG5cbiAgaWYgKHVzaW5nV2Vha01hcCkge1xuICAgIHdlYWtNYXAuc2V0KG9iaiwgaGFzaGVkKTtcbiAgfSBlbHNlIGlmIChpc0V4dGVuc2libGUgIT09IHVuZGVmaW5lZCAmJiBpc0V4dGVuc2libGUob2JqKSA9PT0gZmFsc2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vbi1leHRlbnNpYmxlIG9iamVjdHMgYXJlIG5vdCBhbGxvd2VkIGFzIGtleXMuJyk7XG4gIH0gZWxzZSBpZiAoY2FuRGVmaW5lUHJvcGVydHkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBVSURfSEFTSF9LRVksIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBoYXNoZWQsXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoXG4gICAgb2JqLnByb3BlcnR5SXNFbnVtZXJhYmxlICE9PSB1bmRlZmluZWQgJiZcbiAgICBvYmoucHJvcGVydHlJc0VudW1lcmFibGUgPT09IG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGVcbiAgKSB7XG4gICAgLy8gU2luY2Ugd2UgY2FuJ3QgZGVmaW5lIGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHkgb24gdGhlIG9iamVjdFxuICAgIC8vIHdlJ2xsIGhpamFjayBvbmUgb2YgdGhlIGxlc3MtdXNlZCBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzIHRvXG4gICAgLy8gc2F2ZSBvdXIgaGFzaCBvbiBpdC4gU2luY2UgdGhpcyBpcyBhIGZ1bmN0aW9uIGl0IHdpbGwgbm90IHNob3cgdXAgaW5cbiAgICAvLyBgSlNPTi5zdHJpbmdpZnlgIHdoaWNoIGlzIHdoYXQgd2Ugd2FudC5cbiAgICBvYmoucHJvcGVydHlJc0VudW1lcmFibGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5hcHBseShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYXJndW1lbnRzXG4gICAgICApO1xuICAgIH07XG4gICAgb2JqLnByb3BlcnR5SXNFbnVtZXJhYmxlW1VJRF9IQVNIX0tFWV0gPSBoYXNoZWQ7XG4gIH0gZWxzZSBpZiAob2JqLm5vZGVUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGNvdWxkbid0IGdldCB0aGUgSUUgYHVuaXF1ZUlEYCB0byB1c2UgYXMgYSBoYXNoXG4gICAgLy8gYW5kIHdlIGNvdWxkbid0IHVzZSBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5IHRvIGV4cGxvaXQgdGhlXG4gICAgLy8gZG9udEVudW0gYnVnIHNvIHdlIHNpbXBseSBhZGQgdGhlIGBVSURfSEFTSF9LRVlgIG9uIHRoZSBub2RlXG4gICAgLy8gaXRzZWxmLlxuICAgIG9ialtVSURfSEFTSF9LRVldID0gaGFzaGVkO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHNldCBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5IG9uIG9iamVjdC4nKTtcbiAgfVxuXG4gIHJldHVybiBoYXNoZWQ7XG59XG5cbi8vIEdldCByZWZlcmVuY2VzIHRvIEVTNSBvYmplY3QgbWV0aG9kcy5cbnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlO1xuXG4vLyBUcnVlIGlmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB3b3JrcyBhcyBleHBlY3RlZC4gSUU4IGZhaWxzIHRoaXMgdGVzdC5cbnZhciBjYW5EZWZpbmVQcm9wZXJ0eSA9IChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdAJywge30pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59KSgpO1xuXG4vLyBJRSBoYXMgYSBgdW5pcXVlSURgIHByb3BlcnR5IG9uIERPTSBub2Rlcy4gV2UgY2FuIGNvbnN0cnVjdCB0aGUgaGFzaCBmcm9tIGl0XG4vLyBhbmQgYXZvaWQgbWVtb3J5IGxlYWtzIGZyb20gdGhlIElFIGNsb25lTm9kZSBidWcuXG5mdW5jdGlvbiBnZXRJRU5vZGVIYXNoKG5vZGUpIHtcbiAgaWYgKG5vZGUgJiYgbm9kZS5ub2RlVHlwZSA+IDApIHtcbiAgICBzd2l0Y2ggKG5vZGUubm9kZVR5cGUpIHtcbiAgICAgIGNhc2UgMTogLy8gRWxlbWVudFxuICAgICAgICByZXR1cm4gbm9kZS51bmlxdWVJRDtcbiAgICAgIGNhc2UgOTogLy8gRG9jdW1lbnRcbiAgICAgICAgcmV0dXJuIG5vZGUuZG9jdW1lbnRFbGVtZW50ICYmIG5vZGUuZG9jdW1lbnRFbGVtZW50LnVuaXF1ZUlEO1xuICAgIH1cbiAgfVxufVxuXG4vLyBJZiBwb3NzaWJsZSwgdXNlIGEgV2Vha01hcC5cbnZhciB1c2luZ1dlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJztcbnZhciB3ZWFrTWFwO1xuaWYgKHVzaW5nV2Vha01hcCkge1xuICB3ZWFrTWFwID0gbmV3IFdlYWtNYXAoKTtcbn1cblxudmFyIG9iakhhc2hVSUQgPSAwO1xuXG52YXIgVUlEX0hBU0hfS0VZID0gJ19faW1tdXRhYmxlaGFzaF9fJztcbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XG4gIFVJRF9IQVNIX0tFWSA9IFN5bWJvbChVSURfSEFTSF9LRVkpO1xufVxuXG52YXIgU1RSSU5HX0hBU0hfQ0FDSEVfTUlOX1NUUkxFTiA9IDE2O1xudmFyIFNUUklOR19IQVNIX0NBQ0hFX01BWF9TSVpFID0gMjU1O1xudmFyIFNUUklOR19IQVNIX0NBQ0hFX1NJWkUgPSAwO1xudmFyIHN0cmluZ0hhc2hDYWNoZSA9IHt9O1xuXG52YXIgVG9LZXllZFNlcXVlbmNlID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoS2V5ZWRTZXEkJDEpIHtcbiAgZnVuY3Rpb24gVG9LZXllZFNlcXVlbmNlKGluZGV4ZWQsIHVzZUtleXMpIHtcbiAgICB0aGlzLl9pdGVyID0gaW5kZXhlZDtcbiAgICB0aGlzLl91c2VLZXlzID0gdXNlS2V5cztcbiAgICB0aGlzLnNpemUgPSBpbmRleGVkLnNpemU7XG4gIH1cblxuICBpZiAoIEtleWVkU2VxJCQxICkgVG9LZXllZFNlcXVlbmNlLl9fcHJvdG9fXyA9IEtleWVkU2VxJCQxO1xuICBUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggS2V5ZWRTZXEkJDEgJiYgS2V5ZWRTZXEkJDEucHJvdG90eXBlICk7XG4gIFRvS2V5ZWRTZXF1ZW5jZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb0tleWVkU2VxdWVuY2U7XG5cbiAgVG9LZXllZFNlcXVlbmNlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKGtleSwgbm90U2V0VmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5faXRlci5nZXQoa2V5LCBub3RTZXRWYWx1ZSk7XG4gIH07XG5cbiAgVG9LZXllZFNlcXVlbmNlLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBoYXMgKGtleSkge1xuICAgIHJldHVybiB0aGlzLl9pdGVyLmhhcyhrZXkpO1xuICB9O1xuXG4gIFRvS2V5ZWRTZXF1ZW5jZS5wcm90b3R5cGUudmFsdWVTZXEgPSBmdW5jdGlvbiB2YWx1ZVNlcSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZXIudmFsdWVTZXEoKTtcbiAgfTtcblxuICBUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlLnJldmVyc2UgPSBmdW5jdGlvbiByZXZlcnNlICgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciByZXZlcnNlZFNlcXVlbmNlID0gcmV2ZXJzZUZhY3RvcnkodGhpcywgdHJ1ZSk7XG4gICAgaWYgKCF0aGlzLl91c2VLZXlzKSB7XG4gICAgICByZXZlcnNlZFNlcXVlbmNlLnZhbHVlU2VxID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcyQxLl9pdGVyLnRvU2VxKCkucmV2ZXJzZSgpOyB9O1xuICAgIH1cbiAgICByZXR1cm4gcmV2ZXJzZWRTZXF1ZW5jZTtcbiAgfTtcblxuICBUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIG1hcCAobWFwcGVyLCBjb250ZXh0KSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgbWFwcGVkU2VxdWVuY2UgPSBtYXBGYWN0b3J5KHRoaXMsIG1hcHBlciwgY29udGV4dCk7XG4gICAgaWYgKCF0aGlzLl91c2VLZXlzKSB7XG4gICAgICBtYXBwZWRTZXF1ZW5jZS52YWx1ZVNlcSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMkMS5faXRlci50b1NlcSgpLm1hcChtYXBwZXIsIGNvbnRleHQpOyB9O1xuICAgIH1cbiAgICByZXR1cm4gbWFwcGVkU2VxdWVuY2U7XG4gIH07XG5cbiAgVG9LZXllZFNlcXVlbmNlLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbiBfX2l0ZXJhdGUgKGZuLCByZXZlcnNlKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICByZXR1cm4gdGhpcy5faXRlci5fX2l0ZXJhdGUoZnVuY3Rpb24gKHYsIGspIHsgcmV0dXJuIGZuKHYsIGssIHRoaXMkMSk7IH0sIHJldmVyc2UpO1xuICB9O1xuXG4gIFRvS2V5ZWRTZXF1ZW5jZS5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uIF9faXRlcmF0b3IgKHR5cGUsIHJldmVyc2UpIHtcbiAgICByZXR1cm4gdGhpcy5faXRlci5fX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpO1xuICB9O1xuXG4gIHJldHVybiBUb0tleWVkU2VxdWVuY2U7XG59KEtleWVkU2VxKSk7XG5Ub0tleWVkU2VxdWVuY2UucHJvdG90eXBlW0lTX09SREVSRURfU1lNQk9MXSA9IHRydWU7XG5cbnZhciBUb0luZGV4ZWRTZXF1ZW5jZSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEluZGV4ZWRTZXEkJDEpIHtcbiAgZnVuY3Rpb24gVG9JbmRleGVkU2VxdWVuY2UoaXRlcikge1xuICAgIHRoaXMuX2l0ZXIgPSBpdGVyO1xuICAgIHRoaXMuc2l6ZSA9IGl0ZXIuc2l6ZTtcbiAgfVxuXG4gIGlmICggSW5kZXhlZFNlcSQkMSApIFRvSW5kZXhlZFNlcXVlbmNlLl9fcHJvdG9fXyA9IEluZGV4ZWRTZXEkJDE7XG4gIFRvSW5kZXhlZFNlcXVlbmNlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEluZGV4ZWRTZXEkJDEgJiYgSW5kZXhlZFNlcSQkMS5wcm90b3R5cGUgKTtcbiAgVG9JbmRleGVkU2VxdWVuY2UucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVG9JbmRleGVkU2VxdWVuY2U7XG5cbiAgVG9JbmRleGVkU2VxdWVuY2UucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZXIuaW5jbHVkZXModmFsdWUpO1xuICB9O1xuXG4gIFRvSW5kZXhlZFNlcXVlbmNlLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbiBfX2l0ZXJhdGUgKGZuLCByZXZlcnNlKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgaSA9IDA7XG4gICAgcmV2ZXJzZSAmJiBlbnN1cmVTaXplKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLl9pdGVyLl9faXRlcmF0ZShcbiAgICAgIGZ1bmN0aW9uICh2KSB7IHJldHVybiBmbih2LCByZXZlcnNlID8gdGhpcyQxLnNpemUgLSArK2kgOiBpKyssIHRoaXMkMSk7IH0sXG4gICAgICByZXZlcnNlXG4gICAgKTtcbiAgfTtcblxuICBUb0luZGV4ZWRTZXF1ZW5jZS5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uIF9faXRlcmF0b3IgKHR5cGUsIHJldmVyc2UpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciBpdGVyYXRvciA9IHRoaXMuX2l0ZXIuX19pdGVyYXRvcihJVEVSQVRFX1ZBTFVFUywgcmV2ZXJzZSk7XG4gICAgdmFyIGkgPSAwO1xuICAgIHJldmVyc2UgJiYgZW5zdXJlU2l6ZSh0aGlzKTtcbiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgcmV0dXJuIHN0ZXAuZG9uZVxuICAgICAgICA/IHN0ZXBcbiAgICAgICAgOiBpdGVyYXRvclZhbHVlKFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIHJldmVyc2UgPyB0aGlzJDEuc2l6ZSAtICsraSA6IGkrKyxcbiAgICAgICAgICAgIHN0ZXAudmFsdWUsXG4gICAgICAgICAgICBzdGVwXG4gICAgICAgICAgKTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gVG9JbmRleGVkU2VxdWVuY2U7XG59KEluZGV4ZWRTZXEpKTtcblxudmFyIFRvU2V0U2VxdWVuY2UgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChTZXRTZXEkJDEpIHtcbiAgZnVuY3Rpb24gVG9TZXRTZXF1ZW5jZShpdGVyKSB7XG4gICAgdGhpcy5faXRlciA9IGl0ZXI7XG4gICAgdGhpcy5zaXplID0gaXRlci5zaXplO1xuICB9XG5cbiAgaWYgKCBTZXRTZXEkJDEgKSBUb1NldFNlcXVlbmNlLl9fcHJvdG9fXyA9IFNldFNlcSQkMTtcbiAgVG9TZXRTZXF1ZW5jZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTZXRTZXEkJDEgJiYgU2V0U2VxJCQxLnByb3RvdHlwZSApO1xuICBUb1NldFNlcXVlbmNlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRvU2V0U2VxdWVuY2U7XG5cbiAgVG9TZXRTZXF1ZW5jZS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gaGFzIChrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5faXRlci5pbmNsdWRlcyhrZXkpO1xuICB9O1xuXG4gIFRvU2V0U2VxdWVuY2UucHJvdG90eXBlLl9faXRlcmF0ZSA9IGZ1bmN0aW9uIF9faXRlcmF0ZSAoZm4sIHJldmVyc2UpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHJldHVybiB0aGlzLl9pdGVyLl9faXRlcmF0ZShmdW5jdGlvbiAodikgeyByZXR1cm4gZm4odiwgdiwgdGhpcyQxKTsgfSwgcmV2ZXJzZSk7XG4gIH07XG5cbiAgVG9TZXRTZXF1ZW5jZS5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uIF9faXRlcmF0b3IgKHR5cGUsIHJldmVyc2UpIHtcbiAgICB2YXIgaXRlcmF0b3IgPSB0aGlzLl9pdGVyLl9faXRlcmF0b3IoSVRFUkFURV9WQUxVRVMsIHJldmVyc2UpO1xuICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICByZXR1cm4gc3RlcC5kb25lXG4gICAgICAgID8gc3RlcFxuICAgICAgICA6IGl0ZXJhdG9yVmFsdWUodHlwZSwgc3RlcC52YWx1ZSwgc3RlcC52YWx1ZSwgc3RlcCk7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIFRvU2V0U2VxdWVuY2U7XG59KFNldFNlcSkpO1xuXG52YXIgRnJvbUVudHJpZXNTZXF1ZW5jZSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEtleWVkU2VxJCQxKSB7XG4gIGZ1bmN0aW9uIEZyb21FbnRyaWVzU2VxdWVuY2UoZW50cmllcykge1xuICAgIHRoaXMuX2l0ZXIgPSBlbnRyaWVzO1xuICAgIHRoaXMuc2l6ZSA9IGVudHJpZXMuc2l6ZTtcbiAgfVxuXG4gIGlmICggS2V5ZWRTZXEkJDEgKSBGcm9tRW50cmllc1NlcXVlbmNlLl9fcHJvdG9fXyA9IEtleWVkU2VxJCQxO1xuICBGcm9tRW50cmllc1NlcXVlbmNlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEtleWVkU2VxJCQxICYmIEtleWVkU2VxJCQxLnByb3RvdHlwZSApO1xuICBGcm9tRW50cmllc1NlcXVlbmNlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEZyb21FbnRyaWVzU2VxdWVuY2U7XG5cbiAgRnJvbUVudHJpZXNTZXF1ZW5jZS5wcm90b3R5cGUuZW50cnlTZXEgPSBmdW5jdGlvbiBlbnRyeVNlcSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZXIudG9TZXEoKTtcbiAgfTtcblxuICBGcm9tRW50cmllc1NlcXVlbmNlLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbiBfX2l0ZXJhdGUgKGZuLCByZXZlcnNlKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICByZXR1cm4gdGhpcy5faXRlci5fX2l0ZXJhdGUoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAvLyBDaGVjayBpZiBlbnRyeSBleGlzdHMgZmlyc3Qgc28gYXJyYXkgYWNjZXNzIGRvZXNuJ3QgdGhyb3cgZm9yIGhvbGVzXG4gICAgICAvLyBpbiB0aGUgcGFyZW50IGl0ZXJhdGlvbi5cbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICB2YWxpZGF0ZUVudHJ5KGVudHJ5KTtcbiAgICAgICAgdmFyIGluZGV4ZWRDb2xsZWN0aW9uID0gaXNDb2xsZWN0aW9uKGVudHJ5KTtcbiAgICAgICAgcmV0dXJuIGZuKFxuICAgICAgICAgIGluZGV4ZWRDb2xsZWN0aW9uID8gZW50cnkuZ2V0KDEpIDogZW50cnlbMV0sXG4gICAgICAgICAgaW5kZXhlZENvbGxlY3Rpb24gPyBlbnRyeS5nZXQoMCkgOiBlbnRyeVswXSxcbiAgICAgICAgICB0aGlzJDFcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LCByZXZlcnNlKTtcbiAgfTtcblxuICBGcm9tRW50cmllc1NlcXVlbmNlLnByb3RvdHlwZS5fX2l0ZXJhdG9yID0gZnVuY3Rpb24gX19pdGVyYXRvciAodHlwZSwgcmV2ZXJzZSkge1xuICAgIHZhciBpdGVyYXRvciA9IHRoaXMuX2l0ZXIuX19pdGVyYXRvcihJVEVSQVRFX1ZBTFVFUywgcmV2ZXJzZSk7XG4gICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgc3RlcCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgICAgIHJldHVybiBzdGVwO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgIC8vIENoZWNrIGlmIGVudHJ5IGV4aXN0cyBmaXJzdCBzbyBhcnJheSBhY2Nlc3MgZG9lc24ndCB0aHJvdyBmb3IgaG9sZXNcbiAgICAgICAgLy8gaW4gdGhlIHBhcmVudCBpdGVyYXRpb24uXG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgIHZhbGlkYXRlRW50cnkoZW50cnkpO1xuICAgICAgICAgIHZhciBpbmRleGVkQ29sbGVjdGlvbiA9IGlzQ29sbGVjdGlvbihlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yVmFsdWUoXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgaW5kZXhlZENvbGxlY3Rpb24gPyBlbnRyeS5nZXQoMCkgOiBlbnRyeVswXSxcbiAgICAgICAgICAgIGluZGV4ZWRDb2xsZWN0aW9uID8gZW50cnkuZ2V0KDEpIDogZW50cnlbMV0sXG4gICAgICAgICAgICBzdGVwXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBGcm9tRW50cmllc1NlcXVlbmNlO1xufShLZXllZFNlcSkpO1xuXG5Ub0luZGV4ZWRTZXF1ZW5jZS5wcm90b3R5cGUuY2FjaGVSZXN1bHQgPSBUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlLmNhY2hlUmVzdWx0ID0gVG9TZXRTZXF1ZW5jZS5wcm90b3R5cGUuY2FjaGVSZXN1bHQgPSBGcm9tRW50cmllc1NlcXVlbmNlLnByb3RvdHlwZS5jYWNoZVJlc3VsdCA9IGNhY2hlUmVzdWx0VGhyb3VnaDtcblxuZnVuY3Rpb24gZmxpcEZhY3RvcnkoY29sbGVjdGlvbikge1xuICB2YXIgZmxpcFNlcXVlbmNlID0gbWFrZVNlcXVlbmNlKGNvbGxlY3Rpb24pO1xuICBmbGlwU2VxdWVuY2UuX2l0ZXIgPSBjb2xsZWN0aW9uO1xuICBmbGlwU2VxdWVuY2Uuc2l6ZSA9IGNvbGxlY3Rpb24uc2l6ZTtcbiAgZmxpcFNlcXVlbmNlLmZsaXAgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBjb2xsZWN0aW9uOyB9O1xuICBmbGlwU2VxdWVuY2UucmV2ZXJzZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciByZXZlcnNlZFNlcXVlbmNlID0gY29sbGVjdGlvbi5yZXZlcnNlLmFwcGx5KHRoaXMpOyAvLyBzdXBlci5yZXZlcnNlKClcbiAgICByZXZlcnNlZFNlcXVlbmNlLmZsaXAgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBjb2xsZWN0aW9uLnJldmVyc2UoKTsgfTtcbiAgICByZXR1cm4gcmV2ZXJzZWRTZXF1ZW5jZTtcbiAgfTtcbiAgZmxpcFNlcXVlbmNlLmhhcyA9IGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGNvbGxlY3Rpb24uaW5jbHVkZXMoa2V5KTsgfTtcbiAgZmxpcFNlcXVlbmNlLmluY2x1ZGVzID0gZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gY29sbGVjdGlvbi5oYXMoa2V5KTsgfTtcbiAgZmxpcFNlcXVlbmNlLmNhY2hlUmVzdWx0ID0gY2FjaGVSZXN1bHRUaHJvdWdoO1xuICBmbGlwU2VxdWVuY2UuX19pdGVyYXRlVW5jYWNoZWQgPSBmdW5jdGlvbihmbiwgcmV2ZXJzZSkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgcmV0dXJuIGNvbGxlY3Rpb24uX19pdGVyYXRlKGZ1bmN0aW9uICh2LCBrKSB7IHJldHVybiBmbihrLCB2LCB0aGlzJDEpICE9PSBmYWxzZTsgfSwgcmV2ZXJzZSk7XG4gIH07XG4gIGZsaXBTZXF1ZW5jZS5fX2l0ZXJhdG9yVW5jYWNoZWQgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7XG4gICAgaWYgKHR5cGUgPT09IElURVJBVEVfRU5UUklFUykge1xuICAgICAgdmFyIGl0ZXJhdG9yID0gY29sbGVjdGlvbi5fX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpO1xuICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICBpZiAoIXN0ZXAuZG9uZSkge1xuICAgICAgICAgIHZhciBrID0gc3RlcC52YWx1ZVswXTtcbiAgICAgICAgICBzdGVwLnZhbHVlWzBdID0gc3RlcC52YWx1ZVsxXTtcbiAgICAgICAgICBzdGVwLnZhbHVlWzFdID0gaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RlcDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY29sbGVjdGlvbi5fX2l0ZXJhdG9yKFxuICAgICAgdHlwZSA9PT0gSVRFUkFURV9WQUxVRVMgPyBJVEVSQVRFX0tFWVMgOiBJVEVSQVRFX1ZBTFVFUyxcbiAgICAgIHJldmVyc2VcbiAgICApO1xuICB9O1xuICByZXR1cm4gZmxpcFNlcXVlbmNlO1xufVxuXG5mdW5jdGlvbiBtYXBGYWN0b3J5KGNvbGxlY3Rpb24sIG1hcHBlciwgY29udGV4dCkge1xuICB2YXIgbWFwcGVkU2VxdWVuY2UgPSBtYWtlU2VxdWVuY2UoY29sbGVjdGlvbik7XG4gIG1hcHBlZFNlcXVlbmNlLnNpemUgPSBjb2xsZWN0aW9uLnNpemU7XG4gIG1hcHBlZFNlcXVlbmNlLmhhcyA9IGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGNvbGxlY3Rpb24uaGFzKGtleSk7IH07XG4gIG1hcHBlZFNlcXVlbmNlLmdldCA9IGZ1bmN0aW9uIChrZXksIG5vdFNldFZhbHVlKSB7XG4gICAgdmFyIHYgPSBjb2xsZWN0aW9uLmdldChrZXksIE5PVF9TRVQpO1xuICAgIHJldHVybiB2ID09PSBOT1RfU0VUXG4gICAgICA/IG5vdFNldFZhbHVlXG4gICAgICA6IG1hcHBlci5jYWxsKGNvbnRleHQsIHYsIGtleSwgY29sbGVjdGlvbik7XG4gIH07XG4gIG1hcHBlZFNlcXVlbmNlLl9faXRlcmF0ZVVuY2FjaGVkID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHJldHVybiBjb2xsZWN0aW9uLl9faXRlcmF0ZShcbiAgICAgIGZ1bmN0aW9uICh2LCBrLCBjKSB7IHJldHVybiBmbihtYXBwZXIuY2FsbChjb250ZXh0LCB2LCBrLCBjKSwgaywgdGhpcyQxKSAhPT0gZmFsc2U7IH0sXG4gICAgICByZXZlcnNlXG4gICAgKTtcbiAgfTtcbiAgbWFwcGVkU2VxdWVuY2UuX19pdGVyYXRvclVuY2FjaGVkID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge1xuICAgIHZhciBpdGVyYXRvciA9IGNvbGxlY3Rpb24uX19pdGVyYXRvcihJVEVSQVRFX0VOVFJJRVMsIHJldmVyc2UpO1xuICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICBpZiAoc3RlcC5kb25lKSB7XG4gICAgICAgIHJldHVybiBzdGVwO1xuICAgICAgfVxuICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgIHZhciBrZXkgPSBlbnRyeVswXTtcbiAgICAgIHJldHVybiBpdGVyYXRvclZhbHVlKFxuICAgICAgICB0eXBlLFxuICAgICAgICBrZXksXG4gICAgICAgIG1hcHBlci5jYWxsKGNvbnRleHQsIGVudHJ5WzFdLCBrZXksIGNvbGxlY3Rpb24pLFxuICAgICAgICBzdGVwXG4gICAgICApO1xuICAgIH0pO1xuICB9O1xuICByZXR1cm4gbWFwcGVkU2VxdWVuY2U7XG59XG5cbmZ1bmN0aW9uIHJldmVyc2VGYWN0b3J5KGNvbGxlY3Rpb24sIHVzZUtleXMpIHtcbiAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgdmFyIHJldmVyc2VkU2VxdWVuY2UgPSBtYWtlU2VxdWVuY2UoY29sbGVjdGlvbik7XG4gIHJldmVyc2VkU2VxdWVuY2UuX2l0ZXIgPSBjb2xsZWN0aW9uO1xuICByZXZlcnNlZFNlcXVlbmNlLnNpemUgPSBjb2xsZWN0aW9uLnNpemU7XG4gIHJldmVyc2VkU2VxdWVuY2UucmV2ZXJzZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbGxlY3Rpb247IH07XG4gIGlmIChjb2xsZWN0aW9uLmZsaXApIHtcbiAgICByZXZlcnNlZFNlcXVlbmNlLmZsaXAgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBmbGlwU2VxdWVuY2UgPSBmbGlwRmFjdG9yeShjb2xsZWN0aW9uKTtcbiAgICAgIGZsaXBTZXF1ZW5jZS5yZXZlcnNlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gY29sbGVjdGlvbi5mbGlwKCk7IH07XG4gICAgICByZXR1cm4gZmxpcFNlcXVlbmNlO1xuICAgIH07XG4gIH1cbiAgcmV2ZXJzZWRTZXF1ZW5jZS5nZXQgPSBmdW5jdGlvbiAoa2V5LCBub3RTZXRWYWx1ZSkgeyByZXR1cm4gY29sbGVjdGlvbi5nZXQodXNlS2V5cyA/IGtleSA6IC0xIC0ga2V5LCBub3RTZXRWYWx1ZSk7IH07XG4gIHJldmVyc2VkU2VxdWVuY2UuaGFzID0gZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gY29sbGVjdGlvbi5oYXModXNlS2V5cyA/IGtleSA6IC0xIC0ga2V5KTsgfTtcbiAgcmV2ZXJzZWRTZXF1ZW5jZS5pbmNsdWRlcyA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gY29sbGVjdGlvbi5pbmNsdWRlcyh2YWx1ZSk7IH07XG4gIHJldmVyc2VkU2VxdWVuY2UuY2FjaGVSZXN1bHQgPSBjYWNoZVJlc3VsdFRocm91Z2g7XG4gIHJldmVyc2VkU2VxdWVuY2UuX19pdGVyYXRlID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciBpID0gMDtcbiAgICByZXZlcnNlICYmIGVuc3VyZVNpemUoY29sbGVjdGlvbik7XG4gICAgcmV0dXJuIGNvbGxlY3Rpb24uX19pdGVyYXRlKFxuICAgICAgZnVuY3Rpb24gKHYsIGspIHsgcmV0dXJuIGZuKHYsIHVzZUtleXMgPyBrIDogcmV2ZXJzZSA/IHRoaXMkMS5zaXplIC0gKytpIDogaSsrLCB0aGlzJDEpOyB9LFxuICAgICAgIXJldmVyc2VcbiAgICApO1xuICB9O1xuICByZXZlcnNlZFNlcXVlbmNlLl9faXRlcmF0b3IgPSBmdW5jdGlvbiAodHlwZSwgcmV2ZXJzZSkge1xuICAgIHZhciBpID0gMDtcbiAgICByZXZlcnNlICYmIGVuc3VyZVNpemUoY29sbGVjdGlvbik7XG4gICAgdmFyIGl0ZXJhdG9yID0gY29sbGVjdGlvbi5fX2l0ZXJhdG9yKElURVJBVEVfRU5UUklFUywgIXJldmVyc2UpO1xuICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICBpZiAoc3RlcC5kb25lKSB7XG4gICAgICAgIHJldHVybiBzdGVwO1xuICAgICAgfVxuICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgIHJldHVybiBpdGVyYXRvclZhbHVlKFxuICAgICAgICB0eXBlLFxuICAgICAgICB1c2VLZXlzID8gZW50cnlbMF0gOiByZXZlcnNlID8gdGhpcyQxLnNpemUgLSArK2kgOiBpKyssXG4gICAgICAgIGVudHJ5WzFdLFxuICAgICAgICBzdGVwXG4gICAgICApO1xuICAgIH0pO1xuICB9O1xuICByZXR1cm4gcmV2ZXJzZWRTZXF1ZW5jZTtcbn1cblxuZnVuY3Rpb24gZmlsdGVyRmFjdG9yeShjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGNvbnRleHQsIHVzZUtleXMpIHtcbiAgdmFyIGZpbHRlclNlcXVlbmNlID0gbWFrZVNlcXVlbmNlKGNvbGxlY3Rpb24pO1xuICBpZiAodXNlS2V5cykge1xuICAgIGZpbHRlclNlcXVlbmNlLmhhcyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciB2ID0gY29sbGVjdGlvbi5nZXQoa2V5LCBOT1RfU0VUKTtcbiAgICAgIHJldHVybiB2ICE9PSBOT1RfU0VUICYmICEhcHJlZGljYXRlLmNhbGwoY29udGV4dCwgdiwga2V5LCBjb2xsZWN0aW9uKTtcbiAgICB9O1xuICAgIGZpbHRlclNlcXVlbmNlLmdldCA9IGZ1bmN0aW9uIChrZXksIG5vdFNldFZhbHVlKSB7XG4gICAgICB2YXIgdiA9IGNvbGxlY3Rpb24uZ2V0KGtleSwgTk9UX1NFVCk7XG4gICAgICByZXR1cm4gdiAhPT0gTk9UX1NFVCAmJiBwcmVkaWNhdGUuY2FsbChjb250ZXh0LCB2LCBrZXksIGNvbGxlY3Rpb24pXG4gICAgICAgID8gdlxuICAgICAgICA6IG5vdFNldFZhbHVlO1xuICAgIH07XG4gIH1cbiAgZmlsdGVyU2VxdWVuY2UuX19pdGVyYXRlVW5jYWNoZWQgPSBmdW5jdGlvbihmbiwgcmV2ZXJzZSkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgIGNvbGxlY3Rpb24uX19pdGVyYXRlKGZ1bmN0aW9uICh2LCBrLCBjKSB7XG4gICAgICBpZiAocHJlZGljYXRlLmNhbGwoY29udGV4dCwgdiwgaywgYykpIHtcbiAgICAgICAgaXRlcmF0aW9ucysrO1xuICAgICAgICByZXR1cm4gZm4odiwgdXNlS2V5cyA/IGsgOiBpdGVyYXRpb25zIC0gMSwgdGhpcyQxKTtcbiAgICAgIH1cbiAgICB9LCByZXZlcnNlKTtcbiAgICByZXR1cm4gaXRlcmF0aW9ucztcbiAgfTtcbiAgZmlsdGVyU2VxdWVuY2UuX19pdGVyYXRvclVuY2FjaGVkID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge1xuICAgIHZhciBpdGVyYXRvciA9IGNvbGxlY3Rpb24uX19pdGVyYXRvcihJVEVSQVRFX0VOVFJJRVMsIHJldmVyc2UpO1xuICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICBpZiAoc3RlcC5kb25lKSB7XG4gICAgICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgdmFyIGtleSA9IGVudHJ5WzBdO1xuICAgICAgICB2YXIgdmFsdWUgPSBlbnRyeVsxXTtcbiAgICAgICAgaWYgKHByZWRpY2F0ZS5jYWxsKGNvbnRleHQsIHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yVmFsdWUodHlwZSwgdXNlS2V5cyA/IGtleSA6IGl0ZXJhdGlvbnMrKywgdmFsdWUsIHN0ZXApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIHJldHVybiBmaWx0ZXJTZXF1ZW5jZTtcbn1cblxuZnVuY3Rpb24gY291bnRCeUZhY3RvcnkoY29sbGVjdGlvbiwgZ3JvdXBlciwgY29udGV4dCkge1xuICB2YXIgZ3JvdXBzID0gTWFwKCkuYXNNdXRhYmxlKCk7XG4gIGNvbGxlY3Rpb24uX19pdGVyYXRlKGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgZ3JvdXBzLnVwZGF0ZShncm91cGVyLmNhbGwoY29udGV4dCwgdiwgaywgY29sbGVjdGlvbiksIDAsIGZ1bmN0aW9uIChhKSB7IHJldHVybiBhICsgMTsgfSk7XG4gIH0pO1xuICByZXR1cm4gZ3JvdXBzLmFzSW1tdXRhYmxlKCk7XG59XG5cbmZ1bmN0aW9uIGdyb3VwQnlGYWN0b3J5KGNvbGxlY3Rpb24sIGdyb3VwZXIsIGNvbnRleHQpIHtcbiAgdmFyIGlzS2V5ZWRJdGVyID0gaXNLZXllZChjb2xsZWN0aW9uKTtcbiAgdmFyIGdyb3VwcyA9IChpc09yZGVyZWQoY29sbGVjdGlvbikgPyBPcmRlcmVkTWFwKCkgOiBNYXAoKSkuYXNNdXRhYmxlKCk7XG4gIGNvbGxlY3Rpb24uX19pdGVyYXRlKGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgZ3JvdXBzLnVwZGF0ZShcbiAgICAgIGdyb3VwZXIuY2FsbChjb250ZXh0LCB2LCBrLCBjb2xsZWN0aW9uKSxcbiAgICAgIGZ1bmN0aW9uIChhKSB7IHJldHVybiAoKGEgPSBhIHx8IFtdKSwgYS5wdXNoKGlzS2V5ZWRJdGVyID8gW2ssIHZdIDogdiksIGEpOyB9XG4gICAgKTtcbiAgfSk7XG4gIHZhciBjb2VyY2UgPSBjb2xsZWN0aW9uQ2xhc3MoY29sbGVjdGlvbik7XG4gIHJldHVybiBncm91cHMubWFwKGZ1bmN0aW9uIChhcnIpIHsgcmV0dXJuIHJlaWZ5KGNvbGxlY3Rpb24sIGNvZXJjZShhcnIpKTsgfSkuYXNJbW11dGFibGUoKTtcbn1cblxuZnVuY3Rpb24gc2xpY2VGYWN0b3J5KGNvbGxlY3Rpb24sIGJlZ2luLCBlbmQsIHVzZUtleXMpIHtcbiAgdmFyIG9yaWdpbmFsU2l6ZSA9IGNvbGxlY3Rpb24uc2l6ZTtcblxuICBpZiAod2hvbGVTbGljZShiZWdpbiwgZW5kLCBvcmlnaW5hbFNpemUpKSB7XG4gICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gIH1cblxuICB2YXIgcmVzb2x2ZWRCZWdpbiA9IHJlc29sdmVCZWdpbihiZWdpbiwgb3JpZ2luYWxTaXplKTtcbiAgdmFyIHJlc29sdmVkRW5kID0gcmVzb2x2ZUVuZChlbmQsIG9yaWdpbmFsU2l6ZSk7XG5cbiAgLy8gYmVnaW4gb3IgZW5kIHdpbGwgYmUgTmFOIGlmIHRoZXkgd2VyZSBwcm92aWRlZCBhcyBuZWdhdGl2ZSBudW1iZXJzIGFuZFxuICAvLyB0aGlzIGNvbGxlY3Rpb24ncyBzaXplIGlzIHVua25vd24uIEluIHRoYXQgY2FzZSwgY2FjaGUgZmlyc3Qgc28gdGhlcmUgaXNcbiAgLy8gYSBrbm93biBzaXplIGFuZCB0aGVzZSBkbyBub3QgcmVzb2x2ZSB0byBOYU4uXG4gIGlmIChyZXNvbHZlZEJlZ2luICE9PSByZXNvbHZlZEJlZ2luIHx8IHJlc29sdmVkRW5kICE9PSByZXNvbHZlZEVuZCkge1xuICAgIHJldHVybiBzbGljZUZhY3RvcnkoY29sbGVjdGlvbi50b1NlcSgpLmNhY2hlUmVzdWx0KCksIGJlZ2luLCBlbmQsIHVzZUtleXMpO1xuICB9XG5cbiAgLy8gTm90ZTogcmVzb2x2ZWRFbmQgaXMgdW5kZWZpbmVkIHdoZW4gdGhlIG9yaWdpbmFsIHNlcXVlbmNlJ3MgbGVuZ3RoIGlzXG4gIC8vIHVua25vd24gYW5kIHRoaXMgc2xpY2UgZGlkIG5vdCBzdXBwbHkgYW4gZW5kIGFuZCBzaG91bGQgY29udGFpbiBhbGxcbiAgLy8gZWxlbWVudHMgYWZ0ZXIgcmVzb2x2ZWRCZWdpbi5cbiAgLy8gSW4gdGhhdCBjYXNlLCByZXNvbHZlZFNpemUgd2lsbCBiZSBOYU4gYW5kIHNsaWNlU2l6ZSB3aWxsIHJlbWFpbiB1bmRlZmluZWQuXG4gIHZhciByZXNvbHZlZFNpemUgPSByZXNvbHZlZEVuZCAtIHJlc29sdmVkQmVnaW47XG4gIHZhciBzbGljZVNpemU7XG4gIGlmIChyZXNvbHZlZFNpemUgPT09IHJlc29sdmVkU2l6ZSkge1xuICAgIHNsaWNlU2l6ZSA9IHJlc29sdmVkU2l6ZSA8IDAgPyAwIDogcmVzb2x2ZWRTaXplO1xuICB9XG5cbiAgdmFyIHNsaWNlU2VxID0gbWFrZVNlcXVlbmNlKGNvbGxlY3Rpb24pO1xuXG4gIC8vIElmIGNvbGxlY3Rpb24uc2l6ZSBpcyB1bmRlZmluZWQsIHRoZSBzaXplIG9mIHRoZSByZWFsaXplZCBzbGljZVNlcSBpc1xuICAvLyB1bmtub3duIGF0IHRoaXMgcG9pbnQgdW5sZXNzIHRoZSBudW1iZXIgb2YgaXRlbXMgdG8gc2xpY2UgaXMgMFxuICBzbGljZVNlcS5zaXplID1cbiAgICBzbGljZVNpemUgPT09IDAgPyBzbGljZVNpemUgOiAoY29sbGVjdGlvbi5zaXplICYmIHNsaWNlU2l6ZSkgfHwgdW5kZWZpbmVkO1xuXG4gIGlmICghdXNlS2V5cyAmJiBpc1NlcShjb2xsZWN0aW9uKSAmJiBzbGljZVNpemUgPj0gMCkge1xuICAgIHNsaWNlU2VxLmdldCA9IGZ1bmN0aW9uKGluZGV4LCBub3RTZXRWYWx1ZSkge1xuICAgICAgaW5kZXggPSB3cmFwSW5kZXgodGhpcywgaW5kZXgpO1xuICAgICAgcmV0dXJuIGluZGV4ID49IDAgJiYgaW5kZXggPCBzbGljZVNpemVcbiAgICAgICAgPyBjb2xsZWN0aW9uLmdldChpbmRleCArIHJlc29sdmVkQmVnaW4sIG5vdFNldFZhbHVlKVxuICAgICAgICA6IG5vdFNldFZhbHVlO1xuICAgIH07XG4gIH1cblxuICBzbGljZVNlcS5fX2l0ZXJhdGVVbmNhY2hlZCA9IGZ1bmN0aW9uKGZuLCByZXZlcnNlKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICBpZiAoc2xpY2VTaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKHJldmVyc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlUmVzdWx0KCkuX19pdGVyYXRlKGZuLCByZXZlcnNlKTtcbiAgICB9XG4gICAgdmFyIHNraXBwZWQgPSAwO1xuICAgIHZhciBpc1NraXBwaW5nID0gdHJ1ZTtcbiAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgY29sbGVjdGlvbi5fX2l0ZXJhdGUoZnVuY3Rpb24gKHYsIGspIHtcbiAgICAgIGlmICghKGlzU2tpcHBpbmcgJiYgKGlzU2tpcHBpbmcgPSBza2lwcGVkKysgPCByZXNvbHZlZEJlZ2luKSkpIHtcbiAgICAgICAgaXRlcmF0aW9ucysrO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGZuKHYsIHVzZUtleXMgPyBrIDogaXRlcmF0aW9ucyAtIDEsIHRoaXMkMSkgIT09IGZhbHNlICYmXG4gICAgICAgICAgaXRlcmF0aW9ucyAhPT0gc2xpY2VTaXplXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGl0ZXJhdGlvbnM7XG4gIH07XG5cbiAgc2xpY2VTZXEuX19pdGVyYXRvclVuY2FjaGVkID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge1xuICAgIGlmIChzbGljZVNpemUgIT09IDAgJiYgcmV2ZXJzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVSZXN1bHQoKS5fX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpO1xuICAgIH1cbiAgICAvLyBEb24ndCBib3RoZXIgaW5zdGFudGlhdGluZyBwYXJlbnQgaXRlcmF0b3IgaWYgdGFraW5nIDAuXG4gICAgaWYgKHNsaWNlU2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihpdGVyYXRvckRvbmUpO1xuICAgIH1cbiAgICB2YXIgaXRlcmF0b3IgPSBjb2xsZWN0aW9uLl9faXRlcmF0b3IodHlwZSwgcmV2ZXJzZSk7XG4gICAgdmFyIHNraXBwZWQgPSAwO1xuICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgIHdoaWxlIChza2lwcGVkKysgPCByZXNvbHZlZEJlZ2luKSB7XG4gICAgICAgIGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgIH1cbiAgICAgIGlmICgrK2l0ZXJhdGlvbnMgPiBzbGljZVNpemUpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yRG9uZSgpO1xuICAgICAgfVxuICAgICAgdmFyIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICBpZiAodXNlS2V5cyB8fCB0eXBlID09PSBJVEVSQVRFX1ZBTFVFUyB8fCBzdGVwLmRvbmUpIHtcbiAgICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgICB9XG4gICAgICBpZiAodHlwZSA9PT0gSVRFUkFURV9LRVlTKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvclZhbHVlKHR5cGUsIGl0ZXJhdGlvbnMgLSAxLCB1bmRlZmluZWQsIHN0ZXApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZXJhdG9yVmFsdWUodHlwZSwgaXRlcmF0aW9ucyAtIDEsIHN0ZXAudmFsdWVbMV0sIHN0ZXApO1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBzbGljZVNlcTtcbn1cblxuZnVuY3Rpb24gdGFrZVdoaWxlRmFjdG9yeShjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgdmFyIHRha2VTZXF1ZW5jZSA9IG1ha2VTZXF1ZW5jZShjb2xsZWN0aW9uKTtcbiAgdGFrZVNlcXVlbmNlLl9faXRlcmF0ZVVuY2FjaGVkID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZShmbiwgcmV2ZXJzZSk7XG4gICAgfVxuICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICBjb2xsZWN0aW9uLl9faXRlcmF0ZShcbiAgICAgIGZ1bmN0aW9uICh2LCBrLCBjKSB7IHJldHVybiBwcmVkaWNhdGUuY2FsbChjb250ZXh0LCB2LCBrLCBjKSAmJiArK2l0ZXJhdGlvbnMgJiYgZm4odiwgaywgdGhpcyQxKTsgfVxuICAgICk7XG4gICAgcmV0dXJuIGl0ZXJhdGlvbnM7XG4gIH07XG4gIHRha2VTZXF1ZW5jZS5fX2l0ZXJhdG9yVW5jYWNoZWQgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVSZXN1bHQoKS5fX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpO1xuICAgIH1cbiAgICB2YXIgaXRlcmF0b3IgPSBjb2xsZWN0aW9uLl9faXRlcmF0b3IoSVRFUkFURV9FTlRSSUVTLCByZXZlcnNlKTtcbiAgICB2YXIgaXRlcmF0aW5nID0gdHJ1ZTtcbiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghaXRlcmF0aW5nKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvckRvbmUoKTtcbiAgICAgIH1cbiAgICAgIHZhciBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgICByZXR1cm4gc3RlcDtcbiAgICAgIH1cbiAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICB2YXIgayA9IGVudHJ5WzBdO1xuICAgICAgdmFyIHYgPSBlbnRyeVsxXTtcbiAgICAgIGlmICghcHJlZGljYXRlLmNhbGwoY29udGV4dCwgdiwgaywgdGhpcyQxKSkge1xuICAgICAgICBpdGVyYXRpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yRG9uZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHR5cGUgPT09IElURVJBVEVfRU5UUklFUyA/IHN0ZXAgOiBpdGVyYXRvclZhbHVlKHR5cGUsIGssIHYsIHN0ZXApO1xuICAgIH0pO1xuICB9O1xuICByZXR1cm4gdGFrZVNlcXVlbmNlO1xufVxuXG5mdW5jdGlvbiBza2lwV2hpbGVGYWN0b3J5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgY29udGV4dCwgdXNlS2V5cykge1xuICB2YXIgc2tpcFNlcXVlbmNlID0gbWFrZVNlcXVlbmNlKGNvbGxlY3Rpb24pO1xuICBza2lwU2VxdWVuY2UuX19pdGVyYXRlVW5jYWNoZWQgPSBmdW5jdGlvbihmbiwgcmV2ZXJzZSkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgaWYgKHJldmVyc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlUmVzdWx0KCkuX19pdGVyYXRlKGZuLCByZXZlcnNlKTtcbiAgICB9XG4gICAgdmFyIGlzU2tpcHBpbmcgPSB0cnVlO1xuICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICBjb2xsZWN0aW9uLl9faXRlcmF0ZShmdW5jdGlvbiAodiwgaywgYykge1xuICAgICAgaWYgKCEoaXNTa2lwcGluZyAmJiAoaXNTa2lwcGluZyA9IHByZWRpY2F0ZS5jYWxsKGNvbnRleHQsIHYsIGssIGMpKSkpIHtcbiAgICAgICAgaXRlcmF0aW9ucysrO1xuICAgICAgICByZXR1cm4gZm4odiwgdXNlS2V5cyA/IGsgOiBpdGVyYXRpb25zIC0gMSwgdGhpcyQxKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gaXRlcmF0aW9ucztcbiAgfTtcbiAgc2tpcFNlcXVlbmNlLl9faXRlcmF0b3JVbmNhY2hlZCA9IGZ1bmN0aW9uKHR5cGUsIHJldmVyc2UpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0b3IodHlwZSwgcmV2ZXJzZSk7XG4gICAgfVxuICAgIHZhciBpdGVyYXRvciA9IGNvbGxlY3Rpb24uX19pdGVyYXRvcihJVEVSQVRFX0VOVFJJRVMsIHJldmVyc2UpO1xuICAgIHZhciBza2lwcGluZyA9IHRydWU7XG4gICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0ZXA7XG4gICAgICB2YXIgaztcbiAgICAgIHZhciB2O1xuICAgICAgZG8ge1xuICAgICAgICBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICBpZiAoc3RlcC5kb25lKSB7XG4gICAgICAgICAgaWYgKHVzZUtleXMgfHwgdHlwZSA9PT0gSVRFUkFURV9WQUxVRVMpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGVwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZSA9PT0gSVRFUkFURV9LRVlTKSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZSh0eXBlLCBpdGVyYXRpb25zKyssIHVuZGVmaW5lZCwgc3RlcCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpdGVyYXRvclZhbHVlKHR5cGUsIGl0ZXJhdGlvbnMrKywgc3RlcC52YWx1ZVsxXSwgc3RlcCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgayA9IGVudHJ5WzBdO1xuICAgICAgICB2ID0gZW50cnlbMV07XG4gICAgICAgIHNraXBwaW5nICYmIChza2lwcGluZyA9IHByZWRpY2F0ZS5jYWxsKGNvbnRleHQsIHYsIGssIHRoaXMkMSkpO1xuICAgICAgfSB3aGlsZSAoc2tpcHBpbmcpO1xuICAgICAgcmV0dXJuIHR5cGUgPT09IElURVJBVEVfRU5UUklFUyA/IHN0ZXAgOiBpdGVyYXRvclZhbHVlKHR5cGUsIGssIHYsIHN0ZXApO1xuICAgIH0pO1xuICB9O1xuICByZXR1cm4gc2tpcFNlcXVlbmNlO1xufVxuXG5mdW5jdGlvbiBjb25jYXRGYWN0b3J5KGNvbGxlY3Rpb24sIHZhbHVlcykge1xuICB2YXIgaXNLZXllZENvbGxlY3Rpb24gPSBpc0tleWVkKGNvbGxlY3Rpb24pO1xuICB2YXIgaXRlcnMgPSBbY29sbGVjdGlvbl1cbiAgICAuY29uY2F0KHZhbHVlcylcbiAgICAubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICBpZiAoIWlzQ29sbGVjdGlvbih2KSkge1xuICAgICAgICB2ID0gaXNLZXllZENvbGxlY3Rpb25cbiAgICAgICAgICA/IGtleWVkU2VxRnJvbVZhbHVlKHYpXG4gICAgICAgICAgOiBpbmRleGVkU2VxRnJvbVZhbHVlKEFycmF5LmlzQXJyYXkodikgPyB2IDogW3ZdKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNLZXllZENvbGxlY3Rpb24pIHtcbiAgICAgICAgdiA9IEtleWVkQ29sbGVjdGlvbih2KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2O1xuICAgIH0pXG4gICAgLmZpbHRlcihmdW5jdGlvbiAodikgeyByZXR1cm4gdi5zaXplICE9PSAwOyB9KTtcblxuICBpZiAoaXRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gIH1cblxuICBpZiAoaXRlcnMubGVuZ3RoID09PSAxKSB7XG4gICAgdmFyIHNpbmdsZXRvbiA9IGl0ZXJzWzBdO1xuICAgIGlmIChcbiAgICAgIHNpbmdsZXRvbiA9PT0gY29sbGVjdGlvbiB8fFxuICAgICAgKGlzS2V5ZWRDb2xsZWN0aW9uICYmIGlzS2V5ZWQoc2luZ2xldG9uKSkgfHxcbiAgICAgIChpc0luZGV4ZWQoY29sbGVjdGlvbikgJiYgaXNJbmRleGVkKHNpbmdsZXRvbikpXG4gICAgKSB7XG4gICAgICByZXR1cm4gc2luZ2xldG9uO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjb25jYXRTZXEgPSBuZXcgQXJyYXlTZXEoaXRlcnMpO1xuICBpZiAoaXNLZXllZENvbGxlY3Rpb24pIHtcbiAgICBjb25jYXRTZXEgPSBjb25jYXRTZXEudG9LZXllZFNlcSgpO1xuICB9IGVsc2UgaWYgKCFpc0luZGV4ZWQoY29sbGVjdGlvbikpIHtcbiAgICBjb25jYXRTZXEgPSBjb25jYXRTZXEudG9TZXRTZXEoKTtcbiAgfVxuICBjb25jYXRTZXEgPSBjb25jYXRTZXEuZmxhdHRlbih0cnVlKTtcbiAgY29uY2F0U2VxLnNpemUgPSBpdGVycy5yZWR1Y2UoZnVuY3Rpb24gKHN1bSwgc2VxKSB7XG4gICAgaWYgKHN1bSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgc2l6ZSA9IHNlcS5zaXplO1xuICAgICAgaWYgKHNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gc3VtICsgc2l6ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIDApO1xuICByZXR1cm4gY29uY2F0U2VxO1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuRmFjdG9yeShjb2xsZWN0aW9uLCBkZXB0aCwgdXNlS2V5cykge1xuICB2YXIgZmxhdFNlcXVlbmNlID0gbWFrZVNlcXVlbmNlKGNvbGxlY3Rpb24pO1xuICBmbGF0U2VxdWVuY2UuX19pdGVyYXRlVW5jYWNoZWQgPSBmdW5jdGlvbihmbiwgcmV2ZXJzZSkge1xuICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZShmbiwgcmV2ZXJzZSk7XG4gICAgfVxuICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICB2YXIgc3RvcHBlZCA9IGZhbHNlO1xuICAgIGZ1bmN0aW9uIGZsYXREZWVwKGl0ZXIsIGN1cnJlbnREZXB0aCkge1xuICAgICAgaXRlci5fX2l0ZXJhdGUoZnVuY3Rpb24gKHYsIGspIHtcbiAgICAgICAgaWYgKCghZGVwdGggfHwgY3VycmVudERlcHRoIDwgZGVwdGgpICYmIGlzQ29sbGVjdGlvbih2KSkge1xuICAgICAgICAgIGZsYXREZWVwKHYsIGN1cnJlbnREZXB0aCArIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZXJhdGlvbnMrKztcbiAgICAgICAgICBpZiAoZm4odiwgdXNlS2V5cyA/IGsgOiBpdGVyYXRpb25zIC0gMSwgZmxhdFNlcXVlbmNlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXN0b3BwZWQ7XG4gICAgICB9LCByZXZlcnNlKTtcbiAgICB9XG4gICAgZmxhdERlZXAoY29sbGVjdGlvbiwgMCk7XG4gICAgcmV0dXJuIGl0ZXJhdGlvbnM7XG4gIH07XG4gIGZsYXRTZXF1ZW5jZS5fX2l0ZXJhdG9yVW5jYWNoZWQgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7XG4gICAgaWYgKHJldmVyc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlUmVzdWx0KCkuX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbiAgICB9XG4gICAgdmFyIGl0ZXJhdG9yID0gY29sbGVjdGlvbi5fX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpO1xuICAgIHZhciBzdGFjayA9IFtdO1xuICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgIHdoaWxlIChpdGVyYXRvcikge1xuICAgICAgICB2YXIgc3RlcCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgaWYgKHN0ZXAuZG9uZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBpdGVyYXRvciA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciB2ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgaWYgKHR5cGUgPT09IElURVJBVEVfRU5UUklFUykge1xuICAgICAgICAgIHYgPSB2WzFdO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoIWRlcHRoIHx8IHN0YWNrLmxlbmd0aCA8IGRlcHRoKSAmJiBpc0NvbGxlY3Rpb24odikpIHtcbiAgICAgICAgICBzdGFjay5wdXNoKGl0ZXJhdG9yKTtcbiAgICAgICAgICBpdGVyYXRvciA9IHYuX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdXNlS2V5cyA/IHN0ZXAgOiBpdGVyYXRvclZhbHVlKHR5cGUsIGl0ZXJhdGlvbnMrKywgdiwgc3RlcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVyYXRvckRvbmUoKTtcbiAgICB9KTtcbiAgfTtcbiAgcmV0dXJuIGZsYXRTZXF1ZW5jZTtcbn1cblxuZnVuY3Rpb24gZmxhdE1hcEZhY3RvcnkoY29sbGVjdGlvbiwgbWFwcGVyLCBjb250ZXh0KSB7XG4gIHZhciBjb2VyY2UgPSBjb2xsZWN0aW9uQ2xhc3MoY29sbGVjdGlvbik7XG4gIHJldHVybiBjb2xsZWN0aW9uXG4gICAgLnRvU2VxKClcbiAgICAubWFwKGZ1bmN0aW9uICh2LCBrKSB7IHJldHVybiBjb2VyY2UobWFwcGVyLmNhbGwoY29udGV4dCwgdiwgaywgY29sbGVjdGlvbikpOyB9KVxuICAgIC5mbGF0dGVuKHRydWUpO1xufVxuXG5mdW5jdGlvbiBpbnRlcnBvc2VGYWN0b3J5KGNvbGxlY3Rpb24sIHNlcGFyYXRvcikge1xuICB2YXIgaW50ZXJwb3NlZFNlcXVlbmNlID0gbWFrZVNlcXVlbmNlKGNvbGxlY3Rpb24pO1xuICBpbnRlcnBvc2VkU2VxdWVuY2Uuc2l6ZSA9IGNvbGxlY3Rpb24uc2l6ZSAmJiBjb2xsZWN0aW9uLnNpemUgKiAyIC0gMTtcbiAgaW50ZXJwb3NlZFNlcXVlbmNlLl9faXRlcmF0ZVVuY2FjaGVkID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICBjb2xsZWN0aW9uLl9faXRlcmF0ZShcbiAgICAgIGZ1bmN0aW9uICh2KSB7IHJldHVybiAoIWl0ZXJhdGlvbnMgfHwgZm4oc2VwYXJhdG9yLCBpdGVyYXRpb25zKyssIHRoaXMkMSkgIT09IGZhbHNlKSAmJlxuICAgICAgICBmbih2LCBpdGVyYXRpb25zKyssIHRoaXMkMSkgIT09IGZhbHNlOyB9LFxuICAgICAgcmV2ZXJzZVxuICAgICk7XG4gICAgcmV0dXJuIGl0ZXJhdGlvbnM7XG4gIH07XG4gIGludGVycG9zZWRTZXF1ZW5jZS5fX2l0ZXJhdG9yVW5jYWNoZWQgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7XG4gICAgdmFyIGl0ZXJhdG9yID0gY29sbGVjdGlvbi5fX2l0ZXJhdG9yKElURVJBVEVfVkFMVUVTLCByZXZlcnNlKTtcbiAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgdmFyIHN0ZXA7XG4gICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXN0ZXAgfHwgaXRlcmF0aW9ucyAlIDIpIHtcbiAgICAgICAgc3RlcCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgICAgIHJldHVybiBzdGVwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlcmF0aW9ucyAlIDJcbiAgICAgICAgPyBpdGVyYXRvclZhbHVlKHR5cGUsIGl0ZXJhdGlvbnMrKywgc2VwYXJhdG9yKVxuICAgICAgICA6IGl0ZXJhdG9yVmFsdWUodHlwZSwgaXRlcmF0aW9ucysrLCBzdGVwLnZhbHVlLCBzdGVwKTtcbiAgICB9KTtcbiAgfTtcbiAgcmV0dXJuIGludGVycG9zZWRTZXF1ZW5jZTtcbn1cblxuZnVuY3Rpb24gc29ydEZhY3RvcnkoY29sbGVjdGlvbiwgY29tcGFyYXRvciwgbWFwcGVyKSB7XG4gIGlmICghY29tcGFyYXRvcikge1xuICAgIGNvbXBhcmF0b3IgPSBkZWZhdWx0Q29tcGFyYXRvcjtcbiAgfVxuICB2YXIgaXNLZXllZENvbGxlY3Rpb24gPSBpc0tleWVkKGNvbGxlY3Rpb24pO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgZW50cmllcyA9IGNvbGxlY3Rpb25cbiAgICAudG9TZXEoKVxuICAgIC5tYXAoZnVuY3Rpb24gKHYsIGspIHsgcmV0dXJuIFtrLCB2LCBpbmRleCsrLCBtYXBwZXIgPyBtYXBwZXIodiwgaywgY29sbGVjdGlvbikgOiB2XTsgfSlcbiAgICAudmFsdWVTZXEoKVxuICAgIC50b0FycmF5KCk7XG4gIGVudHJpZXMuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gY29tcGFyYXRvcihhWzNdLCBiWzNdKSB8fCBhWzJdIC0gYlsyXTsgfSkuZm9yRWFjaChcbiAgICBpc0tleWVkQ29sbGVjdGlvblxuICAgICAgPyBmdW5jdGlvbiAodiwgaSkge1xuICAgICAgICAgIGVudHJpZXNbaV0ubGVuZ3RoID0gMjtcbiAgICAgICAgfVxuICAgICAgOiBmdW5jdGlvbiAodiwgaSkge1xuICAgICAgICAgIGVudHJpZXNbaV0gPSB2WzFdO1xuICAgICAgICB9XG4gICk7XG4gIHJldHVybiBpc0tleWVkQ29sbGVjdGlvblxuICAgID8gS2V5ZWRTZXEoZW50cmllcylcbiAgICA6IGlzSW5kZXhlZChjb2xsZWN0aW9uKVxuICAgICAgPyBJbmRleGVkU2VxKGVudHJpZXMpXG4gICAgICA6IFNldFNlcShlbnRyaWVzKTtcbn1cblxuZnVuY3Rpb24gbWF4RmFjdG9yeShjb2xsZWN0aW9uLCBjb21wYXJhdG9yLCBtYXBwZXIpIHtcbiAgaWYgKCFjb21wYXJhdG9yKSB7XG4gICAgY29tcGFyYXRvciA9IGRlZmF1bHRDb21wYXJhdG9yO1xuICB9XG4gIGlmIChtYXBwZXIpIHtcbiAgICB2YXIgZW50cnkgPSBjb2xsZWN0aW9uXG4gICAgICAudG9TZXEoKVxuICAgICAgLm1hcChmdW5jdGlvbiAodiwgaykgeyByZXR1cm4gW3YsIG1hcHBlcih2LCBrLCBjb2xsZWN0aW9uKV07IH0pXG4gICAgICAucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiAobWF4Q29tcGFyZShjb21wYXJhdG9yLCBhWzFdLCBiWzFdKSA/IGIgOiBhKTsgfSk7XG4gICAgcmV0dXJuIGVudHJ5ICYmIGVudHJ5WzBdO1xuICB9XG4gIHJldHVybiBjb2xsZWN0aW9uLnJlZHVjZShmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gKG1heENvbXBhcmUoY29tcGFyYXRvciwgYSwgYikgPyBiIDogYSk7IH0pO1xufVxuXG5mdW5jdGlvbiBtYXhDb21wYXJlKGNvbXBhcmF0b3IsIGEsIGIpIHtcbiAgdmFyIGNvbXAgPSBjb21wYXJhdG9yKGIsIGEpO1xuICAvLyBiIGlzIGNvbnNpZGVyZWQgdGhlIG5ldyBtYXggaWYgdGhlIGNvbXBhcmF0b3IgZGVjbGFyZXMgdGhlbSBlcXVhbCwgYnV0XG4gIC8vIHRoZXkgYXJlIG5vdCBlcXVhbCBhbmQgYiBpcyBpbiBmYWN0IGEgbnVsbGlzaCB2YWx1ZS5cbiAgcmV0dXJuIChcbiAgICAoY29tcCA9PT0gMCAmJiBiICE9PSBhICYmIChiID09PSB1bmRlZmluZWQgfHwgYiA9PT0gbnVsbCB8fCBiICE9PSBiKSkgfHxcbiAgICBjb21wID4gMFxuICApO1xufVxuXG5mdW5jdGlvbiB6aXBXaXRoRmFjdG9yeShrZXlJdGVyLCB6aXBwZXIsIGl0ZXJzLCB6aXBBbGwpIHtcbiAgdmFyIHppcFNlcXVlbmNlID0gbWFrZVNlcXVlbmNlKGtleUl0ZXIpO1xuICB2YXIgc2l6ZXMgPSBuZXcgQXJyYXlTZXEoaXRlcnMpLm1hcChmdW5jdGlvbiAoaSkgeyByZXR1cm4gaS5zaXplOyB9KTtcbiAgemlwU2VxdWVuY2Uuc2l6ZSA9IHppcEFsbCA/IHNpemVzLm1heCgpIDogc2l6ZXMubWluKCk7XG4gIC8vIE5vdGU6IHRoaXMgYSBnZW5lcmljIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgX19pdGVyYXRlIGluIHRlcm1zIG9mXG4gIC8vIF9faXRlcmF0b3Igd2hpY2ggbWF5IGJlIG1vcmUgZ2VuZXJpY2FsbHkgdXNlZnVsIGluIHRoZSBmdXR1cmUuXG4gIHppcFNlcXVlbmNlLl9faXRlcmF0ZSA9IGZ1bmN0aW9uKGZuLCByZXZlcnNlKSB7XG4gICAgLyogZ2VuZXJpYzpcbiAgICB2YXIgaXRlcmF0b3IgPSB0aGlzLl9faXRlcmF0b3IoSVRFUkFURV9FTlRSSUVTLCByZXZlcnNlKTtcbiAgICB2YXIgc3RlcDtcbiAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgaXRlcmF0aW9ucysrO1xuICAgICAgaWYgKGZuKHN0ZXAudmFsdWVbMV0sIHN0ZXAudmFsdWVbMF0sIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGl0ZXJhdGlvbnM7XG4gICAgKi9cbiAgICAvLyBpbmRleGVkOlxuICAgIHZhciBpdGVyYXRvciA9IHRoaXMuX19pdGVyYXRvcihJVEVSQVRFX1ZBTFVFUywgcmV2ZXJzZSk7XG4gICAgdmFyIHN0ZXA7XG4gICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgIGlmIChmbihzdGVwLnZhbHVlLCBpdGVyYXRpb25zKyssIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGl0ZXJhdGlvbnM7XG4gIH07XG4gIHppcFNlcXVlbmNlLl9faXRlcmF0b3JVbmNhY2hlZCA9IGZ1bmN0aW9uKHR5cGUsIHJldmVyc2UpIHtcbiAgICB2YXIgaXRlcmF0b3JzID0gaXRlcnMubWFwKFxuICAgICAgZnVuY3Rpb24gKGkpIHsgcmV0dXJuICgoaSA9IENvbGxlY3Rpb24oaSkpLCBnZXRJdGVyYXRvcihyZXZlcnNlID8gaS5yZXZlcnNlKCkgOiBpKSk7IH1cbiAgICApO1xuICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICB2YXIgaXNEb25lID0gZmFsc2U7XG4gICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc3RlcHM7XG4gICAgICBpZiAoIWlzRG9uZSkge1xuICAgICAgICBzdGVwcyA9IGl0ZXJhdG9ycy5tYXAoZnVuY3Rpb24gKGkpIHsgcmV0dXJuIGkubmV4dCgpOyB9KTtcbiAgICAgICAgaXNEb25lID0gemlwQWxsID8gc3RlcHMuZXZlcnkoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIHMuZG9uZTsgfSkgOiBzdGVwcy5zb21lKGZ1bmN0aW9uIChzKSB7IHJldHVybiBzLmRvbmU7IH0pO1xuICAgICAgfVxuICAgICAgaWYgKGlzRG9uZSkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JEb25lKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZShcbiAgICAgICAgdHlwZSxcbiAgICAgICAgaXRlcmF0aW9ucysrLFxuICAgICAgICB6aXBwZXIuYXBwbHkobnVsbCwgc3RlcHMubWFwKGZ1bmN0aW9uIChzKSB7IHJldHVybiBzLnZhbHVlOyB9KSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH07XG4gIHJldHVybiB6aXBTZXF1ZW5jZTtcbn1cblxuLy8gI3ByYWdtYSBIZWxwZXIgRnVuY3Rpb25zXG5cbmZ1bmN0aW9uIHJlaWZ5KGl0ZXIsIHNlcSkge1xuICByZXR1cm4gaXRlciA9PT0gc2VxID8gaXRlciA6IGlzU2VxKGl0ZXIpID8gc2VxIDogaXRlci5jb25zdHJ1Y3RvcihzZXEpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUVudHJ5KGVudHJ5KSB7XG4gIGlmIChlbnRyeSAhPT0gT2JqZWN0KGVudHJ5KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFtLLCBWXSB0dXBsZTogJyArIGVudHJ5KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2xsZWN0aW9uQ2xhc3MoY29sbGVjdGlvbikge1xuICByZXR1cm4gaXNLZXllZChjb2xsZWN0aW9uKVxuICAgID8gS2V5ZWRDb2xsZWN0aW9uXG4gICAgOiBpc0luZGV4ZWQoY29sbGVjdGlvbilcbiAgICAgID8gSW5kZXhlZENvbGxlY3Rpb25cbiAgICAgIDogU2V0Q29sbGVjdGlvbjtcbn1cblxuZnVuY3Rpb24gbWFrZVNlcXVlbmNlKGNvbGxlY3Rpb24pIHtcbiAgcmV0dXJuIE9iamVjdC5jcmVhdGUoXG4gICAgKGlzS2V5ZWQoY29sbGVjdGlvbilcbiAgICAgID8gS2V5ZWRTZXFcbiAgICAgIDogaXNJbmRleGVkKGNvbGxlY3Rpb24pXG4gICAgICAgID8gSW5kZXhlZFNlcVxuICAgICAgICA6IFNldFNlcVxuICAgICkucHJvdG90eXBlXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNhY2hlUmVzdWx0VGhyb3VnaCgpIHtcbiAgaWYgKHRoaXMuX2l0ZXIuY2FjaGVSZXN1bHQpIHtcbiAgICB0aGlzLl9pdGVyLmNhY2hlUmVzdWx0KCk7XG4gICAgdGhpcy5zaXplID0gdGhpcy5faXRlci5zaXplO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHJldHVybiBTZXEucHJvdG90eXBlLmNhY2hlUmVzdWx0LmNhbGwodGhpcyk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRDb21wYXJhdG9yKGEsIGIpIHtcbiAgaWYgKGEgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlmIChhID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGlmIChiID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICByZXR1cm4gYSA+IGIgPyAxIDogYSA8IGIgPyAtMSA6IDA7XG59XG5cbi8vIGh0dHA6Ly9qc3BlcmYuY29tL2NvcHktYXJyYXktaW5saW5lXG5mdW5jdGlvbiBhcnJDb3B5KGFyciwgb2Zmc2V0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuICB2YXIgbGVuID0gTWF0aC5tYXgoMCwgYXJyLmxlbmd0aCAtIG9mZnNldCk7XG4gIHZhciBuZXdBcnIgPSBuZXcgQXJyYXkobGVuKTtcbiAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IGxlbjsgaWkrKykge1xuICAgIG5ld0FycltpaV0gPSBhcnJbaWkgKyBvZmZzZXRdO1xuICB9XG4gIHJldHVybiBuZXdBcnI7XG59XG5cbmZ1bmN0aW9uIGludmFyaWFudChjb25kaXRpb24sIGVycm9yKSB7XG4gIGlmICghY29uZGl0aW9uKSB7IHRocm93IG5ldyBFcnJvcihlcnJvcik7IH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0Tm90SW5maW5pdGUoc2l6ZSkge1xuICBpbnZhcmlhbnQoXG4gICAgc2l6ZSAhPT0gSW5maW5pdHksXG4gICAgJ0Nhbm5vdCBwZXJmb3JtIHRoaXMgYWN0aW9uIHdpdGggYW4gaW5maW5pdGUgc2l6ZS4nXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNvZXJjZUtleVBhdGgoa2V5UGF0aCkge1xuICBpZiAoaXNBcnJheUxpa2Uoa2V5UGF0aCkgJiYgdHlwZW9mIGtleVBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGtleVBhdGg7XG4gIH1cbiAgaWYgKGlzT3JkZXJlZChrZXlQYXRoKSkge1xuICAgIHJldHVybiBrZXlQYXRoLnRvQXJyYXkoKTtcbiAgfVxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICdJbnZhbGlkIGtleVBhdGg6IGV4cGVjdGVkIE9yZGVyZWQgQ29sbGVjdGlvbiBvciBBcnJheTogJyArIGtleVBhdGhcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNQbGFpbk9iaih2YWx1ZSkge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICYmXG4gICAgKHR5cGVvZiB2YWx1ZS5jb25zdHJ1Y3RvciAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgdmFsdWUuY29uc3RydWN0b3IubmFtZSA9PT0gJ09iamVjdCcpXG4gICk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHBvdGVudGlhbGx5LXBlcnNpc3RlbnQgZGF0YSBzdHJ1Y3R1cmUsIGVpdGhlclxuICogcHJvdmlkZWQgYnkgSW1tdXRhYmxlLmpzIG9yIGEgcGxhaW4gQXJyYXkgb3IgT2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc0RhdGFTdHJ1Y3R1cmUodmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgKGlzSW1tdXRhYmxlKHZhbHVlKSB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBpc1BsYWluT2JqKHZhbHVlKSlcbiAgKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHZhbHVlIHRvIGEgc3RyaW5nLCBhZGRpbmcgcXVvdGVzIGlmIGEgc3RyaW5nIHdhcyBwcm92aWRlZC5cbiAqL1xuZnVuY3Rpb24gcXVvdGVTdHJpbmcodmFsdWUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IEpTT04uc3RyaW5naWZ5KHZhbHVlKSA6IFN0cmluZyh2YWx1ZSk7XG4gIH0gY2F0Y2ggKF9pZ25vcmVFcnJvcikge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzKGNvbGxlY3Rpb24sIGtleSkge1xuICByZXR1cm4gaXNJbW11dGFibGUoY29sbGVjdGlvbilcbiAgICA/IGNvbGxlY3Rpb24uaGFzKGtleSlcbiAgICA6IGlzRGF0YVN0cnVjdHVyZShjb2xsZWN0aW9uKSAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbGxlY3Rpb24sIGtleSk7XG59XG5cbmZ1bmN0aW9uIGdldChjb2xsZWN0aW9uLCBrZXksIG5vdFNldFZhbHVlKSB7XG4gIHJldHVybiBpc0ltbXV0YWJsZShjb2xsZWN0aW9uKVxuICAgID8gY29sbGVjdGlvbi5nZXQoa2V5LCBub3RTZXRWYWx1ZSlcbiAgICA6ICFoYXMoY29sbGVjdGlvbiwga2V5KVxuICAgICAgPyBub3RTZXRWYWx1ZVxuICAgICAgOiB0eXBlb2YgY29sbGVjdGlvbi5nZXQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyBjb2xsZWN0aW9uLmdldChrZXkpXG4gICAgICAgIDogY29sbGVjdGlvbltrZXldO1xufVxuXG5mdW5jdGlvbiBzaGFsbG93Q29weShmcm9tKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGZyb20pKSB7XG4gICAgcmV0dXJuIGFyckNvcHkoZnJvbSk7XG4gIH1cbiAgdmFyIHRvID0ge307XG4gIGZvciAodmFyIGtleSBpbiBmcm9tKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuICAgICAgdG9ba2V5XSA9IGZyb21ba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvO1xufVxuXG5mdW5jdGlvbiByZW1vdmUoY29sbGVjdGlvbiwga2V5KSB7XG4gIGlmICghaXNEYXRhU3RydWN0dXJlKGNvbGxlY3Rpb24pKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdDYW5ub3QgdXBkYXRlIG5vbi1kYXRhLXN0cnVjdHVyZSB2YWx1ZTogJyArIGNvbGxlY3Rpb25cbiAgICApO1xuICB9XG4gIGlmIChpc0ltbXV0YWJsZShjb2xsZWN0aW9uKSkge1xuICAgIGlmICghY29sbGVjdGlvbi5yZW1vdmUpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdDYW5ub3QgdXBkYXRlIGltbXV0YWJsZSB2YWx1ZSB3aXRob3V0IC5yZW1vdmUoKSBtZXRob2Q6ICcgKyBjb2xsZWN0aW9uXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gY29sbGVjdGlvbi5yZW1vdmUoa2V5KTtcbiAgfVxuICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwoY29sbGVjdGlvbiwga2V5KSkge1xuICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICB9XG4gIHZhciBjb2xsZWN0aW9uQ29weSA9IHNoYWxsb3dDb3B5KGNvbGxlY3Rpb24pO1xuICBpZiAoQXJyYXkuaXNBcnJheShjb2xsZWN0aW9uQ29weSkpIHtcbiAgICBjb2xsZWN0aW9uQ29weS5zcGxpY2Uoa2V5LCAxKTtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgY29sbGVjdGlvbkNvcHlba2V5XTtcbiAgfVxuICByZXR1cm4gY29sbGVjdGlvbkNvcHk7XG59XG5cbmZ1bmN0aW9uIHNldChjb2xsZWN0aW9uLCBrZXksIHZhbHVlKSB7XG4gIGlmICghaXNEYXRhU3RydWN0dXJlKGNvbGxlY3Rpb24pKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdDYW5ub3QgdXBkYXRlIG5vbi1kYXRhLXN0cnVjdHVyZSB2YWx1ZTogJyArIGNvbGxlY3Rpb25cbiAgICApO1xuICB9XG4gIGlmIChpc0ltbXV0YWJsZShjb2xsZWN0aW9uKSkge1xuICAgIGlmICghY29sbGVjdGlvbi5zZXQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdDYW5ub3QgdXBkYXRlIGltbXV0YWJsZSB2YWx1ZSB3aXRob3V0IC5zZXQoKSBtZXRob2Q6ICcgKyBjb2xsZWN0aW9uXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gY29sbGVjdGlvbi5zZXQoa2V5LCB2YWx1ZSk7XG4gIH1cbiAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29sbGVjdGlvbiwga2V5KSAmJiB2YWx1ZSA9PT0gY29sbGVjdGlvbltrZXldKSB7XG4gICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gIH1cbiAgdmFyIGNvbGxlY3Rpb25Db3B5ID0gc2hhbGxvd0NvcHkoY29sbGVjdGlvbik7XG4gIGNvbGxlY3Rpb25Db3B5W2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIGNvbGxlY3Rpb25Db3B5O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVJbihjb2xsZWN0aW9uLCBrZXlQYXRoLCBub3RTZXRWYWx1ZSwgdXBkYXRlcikge1xuICBpZiAoIXVwZGF0ZXIpIHtcbiAgICB1cGRhdGVyID0gbm90U2V0VmFsdWU7XG4gICAgbm90U2V0VmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgdmFyIHVwZGF0ZWRWYWx1ZSA9IHVwZGF0ZUluRGVlcGx5KFxuICAgIGlzSW1tdXRhYmxlKGNvbGxlY3Rpb24pLFxuICAgIGNvbGxlY3Rpb24sXG4gICAgY29lcmNlS2V5UGF0aChrZXlQYXRoKSxcbiAgICAwLFxuICAgIG5vdFNldFZhbHVlLFxuICAgIHVwZGF0ZXJcbiAgKTtcbiAgcmV0dXJuIHVwZGF0ZWRWYWx1ZSA9PT0gTk9UX1NFVCA/IG5vdFNldFZhbHVlIDogdXBkYXRlZFZhbHVlO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVJbkRlZXBseShcbiAgaW5JbW11dGFibGUsXG4gIGV4aXN0aW5nLFxuICBrZXlQYXRoLFxuICBpLFxuICBub3RTZXRWYWx1ZSxcbiAgdXBkYXRlclxuKSB7XG4gIHZhciB3YXNOb3RTZXQgPSBleGlzdGluZyA9PT0gTk9UX1NFVDtcbiAgaWYgKGkgPT09IGtleVBhdGgubGVuZ3RoKSB7XG4gICAgdmFyIGV4aXN0aW5nVmFsdWUgPSB3YXNOb3RTZXQgPyBub3RTZXRWYWx1ZSA6IGV4aXN0aW5nO1xuICAgIHZhciBuZXdWYWx1ZSA9IHVwZGF0ZXIoZXhpc3RpbmdWYWx1ZSk7XG4gICAgcmV0dXJuIG5ld1ZhbHVlID09PSBleGlzdGluZ1ZhbHVlID8gZXhpc3RpbmcgOiBuZXdWYWx1ZTtcbiAgfVxuICBpZiAoIXdhc05vdFNldCAmJiAhaXNEYXRhU3RydWN0dXJlKGV4aXN0aW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnQ2Fubm90IHVwZGF0ZSB3aXRoaW4gbm9uLWRhdGEtc3RydWN0dXJlIHZhbHVlIGluIHBhdGggWycgK1xuICAgICAgICBrZXlQYXRoLnNsaWNlKDAsIGkpLm1hcChxdW90ZVN0cmluZykgK1xuICAgICAgICAnXTogJyArXG4gICAgICAgIGV4aXN0aW5nXG4gICAgKTtcbiAgfVxuICB2YXIga2V5ID0ga2V5UGF0aFtpXTtcbiAgdmFyIG5leHRFeGlzdGluZyA9IHdhc05vdFNldCA/IE5PVF9TRVQgOiBnZXQoZXhpc3RpbmcsIGtleSwgTk9UX1NFVCk7XG4gIHZhciBuZXh0VXBkYXRlZCA9IHVwZGF0ZUluRGVlcGx5KFxuICAgIG5leHRFeGlzdGluZyA9PT0gTk9UX1NFVCA/IGluSW1tdXRhYmxlIDogaXNJbW11dGFibGUobmV4dEV4aXN0aW5nKSxcbiAgICBuZXh0RXhpc3RpbmcsXG4gICAga2V5UGF0aCxcbiAgICBpICsgMSxcbiAgICBub3RTZXRWYWx1ZSxcbiAgICB1cGRhdGVyXG4gICk7XG4gIHJldHVybiBuZXh0VXBkYXRlZCA9PT0gbmV4dEV4aXN0aW5nXG4gICAgPyBleGlzdGluZ1xuICAgIDogbmV4dFVwZGF0ZWQgPT09IE5PVF9TRVRcbiAgICAgID8gcmVtb3ZlKGV4aXN0aW5nLCBrZXkpXG4gICAgICA6IHNldChcbiAgICAgICAgICB3YXNOb3RTZXQgPyAoaW5JbW11dGFibGUgPyBlbXB0eU1hcCgpIDoge30pIDogZXhpc3RpbmcsXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIG5leHRVcGRhdGVkXG4gICAgICAgICk7XG59XG5cbmZ1bmN0aW9uIHNldEluKGNvbGxlY3Rpb24sIGtleVBhdGgsIHZhbHVlKSB7XG4gIHJldHVybiB1cGRhdGVJbihjb2xsZWN0aW9uLCBrZXlQYXRoLCBOT1RfU0VULCBmdW5jdGlvbiAoKSB7IHJldHVybiB2YWx1ZTsgfSk7XG59XG5cbmZ1bmN0aW9uIHNldEluJDEoa2V5UGF0aCwgdikge1xuICByZXR1cm4gc2V0SW4odGhpcywga2V5UGF0aCwgdik7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUluKGNvbGxlY3Rpb24sIGtleVBhdGgpIHtcbiAgcmV0dXJuIHVwZGF0ZUluKGNvbGxlY3Rpb24sIGtleVBhdGgsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIE5PVF9TRVQ7IH0pO1xufVxuXG5mdW5jdGlvbiBkZWxldGVJbihrZXlQYXRoKSB7XG4gIHJldHVybiByZW1vdmVJbih0aGlzLCBrZXlQYXRoKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlKGNvbGxlY3Rpb24sIGtleSwgbm90U2V0VmFsdWUsIHVwZGF0ZXIpIHtcbiAgcmV0dXJuIHVwZGF0ZUluKGNvbGxlY3Rpb24sIFtrZXldLCBub3RTZXRWYWx1ZSwgdXBkYXRlcik7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZSQxKGtleSwgbm90U2V0VmFsdWUsIHVwZGF0ZXIpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDFcbiAgICA/IGtleSh0aGlzKVxuICAgIDogdXBkYXRlKHRoaXMsIGtleSwgbm90U2V0VmFsdWUsIHVwZGF0ZXIpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVJbiQxKGtleVBhdGgsIG5vdFNldFZhbHVlLCB1cGRhdGVyKSB7XG4gIHJldHVybiB1cGRhdGVJbih0aGlzLCBrZXlQYXRoLCBub3RTZXRWYWx1ZSwgdXBkYXRlcik7XG59XG5cbmZ1bmN0aW9uIG1lcmdlKCkge1xuICB2YXIgaXRlcnMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgd2hpbGUgKCBsZW4tLSApIGl0ZXJzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgcmV0dXJuIG1lcmdlSW50b0tleWVkV2l0aCh0aGlzLCBpdGVycyk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlV2l0aChtZXJnZXIpIHtcbiAgdmFyIGl0ZXJzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGggLSAxO1xuICB3aGlsZSAoIGxlbi0tID4gMCApIGl0ZXJzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuICsgMSBdO1xuXG4gIGlmICh0eXBlb2YgbWVyZ2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBtZXJnZXIgZnVuY3Rpb246ICcgKyBtZXJnZXIpO1xuICB9XG4gIHJldHVybiBtZXJnZUludG9LZXllZFdpdGgodGhpcywgaXRlcnMsIG1lcmdlcik7XG59XG5cbmZ1bmN0aW9uIG1lcmdlSW50b0tleWVkV2l0aChjb2xsZWN0aW9uLCBjb2xsZWN0aW9ucywgbWVyZ2VyKSB7XG4gIHZhciBpdGVycyA9IFtdO1xuICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgY29sbGVjdGlvbnMubGVuZ3RoOyBpaSsrKSB7XG4gICAgdmFyIGNvbGxlY3Rpb24kMSA9IEtleWVkQ29sbGVjdGlvbihjb2xsZWN0aW9uc1tpaV0pO1xuICAgIGlmIChjb2xsZWN0aW9uJDEuc2l6ZSAhPT0gMCkge1xuICAgICAgaXRlcnMucHVzaChjb2xsZWN0aW9uJDEpO1xuICAgIH1cbiAgfVxuICBpZiAoaXRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gIH1cbiAgaWYgKFxuICAgIGNvbGxlY3Rpb24udG9TZXEoKS5zaXplID09PSAwICYmXG4gICAgIWNvbGxlY3Rpb24uX19vd25lcklEICYmXG4gICAgaXRlcnMubGVuZ3RoID09PSAxXG4gICkge1xuICAgIHJldHVybiBjb2xsZWN0aW9uLmNvbnN0cnVjdG9yKGl0ZXJzWzBdKTtcbiAgfVxuICByZXR1cm4gY29sbGVjdGlvbi53aXRoTXV0YXRpb25zKGZ1bmN0aW9uIChjb2xsZWN0aW9uKSB7XG4gICAgdmFyIG1lcmdlSW50b0NvbGxlY3Rpb24gPSBtZXJnZXJcbiAgICAgID8gZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICB1cGRhdGUoXG4gICAgICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgTk9UX1NFVCxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChvbGRWYWwpIHsgcmV0dXJuIChvbGRWYWwgPT09IE5PVF9TRVQgPyB2YWx1ZSA6IG1lcmdlcihvbGRWYWwsIHZhbHVlLCBrZXkpKTsgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIDogZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICBjb2xsZWN0aW9uLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfTtcbiAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgaXRlcnMubGVuZ3RoOyBpaSsrKSB7XG4gICAgICBpdGVyc1tpaV0uZm9yRWFjaChtZXJnZUludG9Db2xsZWN0aW9uKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtZXJnZSQxKGNvbGxlY3Rpb24pIHtcbiAgdmFyIHNvdXJjZXMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gIHdoaWxlICggbGVuLS0gPiAwICkgc291cmNlc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiArIDEgXTtcblxuICByZXR1cm4gbWVyZ2VXaXRoU291cmNlcyhjb2xsZWN0aW9uLCBzb3VyY2VzKTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VXaXRoJDEobWVyZ2VyLCBjb2xsZWN0aW9uKSB7XG4gIHZhciBzb3VyY2VzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuICB3aGlsZSAoIGxlbi0tID4gMCApIHNvdXJjZXNbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gKyAyIF07XG5cbiAgcmV0dXJuIG1lcmdlV2l0aFNvdXJjZXMoY29sbGVjdGlvbiwgc291cmNlcywgbWVyZ2VyKTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VEZWVwKGNvbGxlY3Rpb24pIHtcbiAgdmFyIHNvdXJjZXMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gIHdoaWxlICggbGVuLS0gPiAwICkgc291cmNlc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiArIDEgXTtcblxuICByZXR1cm4gbWVyZ2VEZWVwV2l0aFNvdXJjZXMoY29sbGVjdGlvbiwgc291cmNlcyk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlRGVlcFdpdGgobWVyZ2VyLCBjb2xsZWN0aW9uKSB7XG4gIHZhciBzb3VyY2VzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuICB3aGlsZSAoIGxlbi0tID4gMCApIHNvdXJjZXNbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gKyAyIF07XG5cbiAgcmV0dXJuIG1lcmdlRGVlcFdpdGhTb3VyY2VzKGNvbGxlY3Rpb24sIHNvdXJjZXMsIG1lcmdlcik7XG59XG5cbmZ1bmN0aW9uIG1lcmdlRGVlcFdpdGhTb3VyY2VzKGNvbGxlY3Rpb24sIHNvdXJjZXMsIG1lcmdlcikge1xuICByZXR1cm4gbWVyZ2VXaXRoU291cmNlcyhjb2xsZWN0aW9uLCBzb3VyY2VzLCBkZWVwTWVyZ2VyV2l0aChtZXJnZXIpKTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VXaXRoU291cmNlcyhjb2xsZWN0aW9uLCBzb3VyY2VzLCBtZXJnZXIpIHtcbiAgaWYgKCFpc0RhdGFTdHJ1Y3R1cmUoY29sbGVjdGlvbikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ0Nhbm5vdCBtZXJnZSBpbnRvIG5vbi1kYXRhLXN0cnVjdHVyZSB2YWx1ZTogJyArIGNvbGxlY3Rpb25cbiAgICApO1xuICB9XG4gIGlmIChpc0ltbXV0YWJsZShjb2xsZWN0aW9uKSkge1xuICAgIHJldHVybiB0eXBlb2YgbWVyZ2VyID09PSAnZnVuY3Rpb24nICYmIGNvbGxlY3Rpb24ubWVyZ2VXaXRoXG4gICAgICA/IGNvbGxlY3Rpb24ubWVyZ2VXaXRoLmFwcGx5KGNvbGxlY3Rpb24sIFsgbWVyZ2VyIF0uY29uY2F0KCBzb3VyY2VzICkpXG4gICAgICA6IGNvbGxlY3Rpb24ubWVyZ2VcbiAgICAgICAgPyBjb2xsZWN0aW9uLm1lcmdlLmFwcGx5KGNvbGxlY3Rpb24sIHNvdXJjZXMpXG4gICAgICAgIDogY29sbGVjdGlvbi5jb25jYXQuYXBwbHkoY29sbGVjdGlvbiwgc291cmNlcyk7XG4gIH1cbiAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KGNvbGxlY3Rpb24pO1xuICB2YXIgbWVyZ2VkID0gY29sbGVjdGlvbjtcbiAgdmFyIENvbGxlY3Rpb24kJDEgPSBpc0FycmF5ID8gSW5kZXhlZENvbGxlY3Rpb24gOiBLZXllZENvbGxlY3Rpb247XG4gIHZhciBtZXJnZUl0ZW0gPSBpc0FycmF5XG4gICAgPyBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgLy8gQ29weSBvbiB3cml0ZVxuICAgICAgICBpZiAobWVyZ2VkID09PSBjb2xsZWN0aW9uKSB7XG4gICAgICAgICAgbWVyZ2VkID0gc2hhbGxvd0NvcHkobWVyZ2VkKTtcbiAgICAgICAgfVxuICAgICAgICBtZXJnZWQucHVzaCh2YWx1ZSk7XG4gICAgICB9XG4gICAgOiBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICB2YXIgaGFzVmFsID0gaGFzT3duUHJvcGVydHkuY2FsbChtZXJnZWQsIGtleSk7XG4gICAgICAgIHZhciBuZXh0VmFsID1cbiAgICAgICAgICBoYXNWYWwgJiYgbWVyZ2VyID8gbWVyZ2VyKG1lcmdlZFtrZXldLCB2YWx1ZSwga2V5KSA6IHZhbHVlO1xuICAgICAgICBpZiAoIWhhc1ZhbCB8fCBuZXh0VmFsICE9PSBtZXJnZWRba2V5XSkge1xuICAgICAgICAgIC8vIENvcHkgb24gd3JpdGVcbiAgICAgICAgICBpZiAobWVyZ2VkID09PSBjb2xsZWN0aW9uKSB7XG4gICAgICAgICAgICBtZXJnZWQgPSBzaGFsbG93Q29weShtZXJnZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtZXJnZWRba2V5XSA9IG5leHRWYWw7XG4gICAgICAgIH1cbiAgICAgIH07XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgIENvbGxlY3Rpb24kJDEoc291cmNlc1tpXSkuZm9yRWFjaChtZXJnZUl0ZW0pO1xuICB9XG4gIHJldHVybiBtZXJnZWQ7XG59XG5cbmZ1bmN0aW9uIGRlZXBNZXJnZXJXaXRoKG1lcmdlcikge1xuICBmdW5jdGlvbiBkZWVwTWVyZ2VyKG9sZFZhbHVlLCBuZXdWYWx1ZSwga2V5KSB7XG4gICAgcmV0dXJuIGlzRGF0YVN0cnVjdHVyZShvbGRWYWx1ZSkgJiYgaXNEYXRhU3RydWN0dXJlKG5ld1ZhbHVlKVxuICAgICAgPyBtZXJnZVdpdGhTb3VyY2VzKG9sZFZhbHVlLCBbbmV3VmFsdWVdLCBkZWVwTWVyZ2VyKVxuICAgICAgOiBtZXJnZXJcbiAgICAgICAgPyBtZXJnZXIob2xkVmFsdWUsIG5ld1ZhbHVlLCBrZXkpXG4gICAgICAgIDogbmV3VmFsdWU7XG4gIH1cbiAgcmV0dXJuIGRlZXBNZXJnZXI7XG59XG5cbmZ1bmN0aW9uIG1lcmdlRGVlcCQxKCkge1xuICB2YXIgaXRlcnMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgd2hpbGUgKCBsZW4tLSApIGl0ZXJzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgcmV0dXJuIG1lcmdlRGVlcFdpdGhTb3VyY2VzKHRoaXMsIGl0ZXJzKTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VEZWVwV2l0aCQxKG1lcmdlcikge1xuICB2YXIgaXRlcnMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gIHdoaWxlICggbGVuLS0gPiAwICkgaXRlcnNbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gKyAxIF07XG5cbiAgcmV0dXJuIG1lcmdlRGVlcFdpdGhTb3VyY2VzKHRoaXMsIGl0ZXJzLCBtZXJnZXIpO1xufVxuXG5mdW5jdGlvbiBtZXJnZUluKGtleVBhdGgpIHtcbiAgdmFyIGl0ZXJzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGggLSAxO1xuICB3aGlsZSAoIGxlbi0tID4gMCApIGl0ZXJzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuICsgMSBdO1xuXG4gIHJldHVybiB1cGRhdGVJbih0aGlzLCBrZXlQYXRoLCBlbXB0eU1hcCgpLCBmdW5jdGlvbiAobSkgeyByZXR1cm4gbWVyZ2VXaXRoU291cmNlcyhtLCBpdGVycyk7IH0pO1xufVxuXG5mdW5jdGlvbiBtZXJnZURlZXBJbihrZXlQYXRoKSB7XG4gIHZhciBpdGVycyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgd2hpbGUgKCBsZW4tLSA+IDAgKSBpdGVyc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiArIDEgXTtcblxuICByZXR1cm4gdXBkYXRlSW4odGhpcywga2V5UGF0aCwgZW1wdHlNYXAoKSwgZnVuY3Rpb24gKG0pIHsgcmV0dXJuIG1lcmdlRGVlcFdpdGhTb3VyY2VzKG0sIGl0ZXJzKTsgfVxuICApO1xufVxuXG5mdW5jdGlvbiB3aXRoTXV0YXRpb25zKGZuKSB7XG4gIHZhciBtdXRhYmxlID0gdGhpcy5hc011dGFibGUoKTtcbiAgZm4obXV0YWJsZSk7XG4gIHJldHVybiBtdXRhYmxlLndhc0FsdGVyZWQoKSA/IG11dGFibGUuX19lbnN1cmVPd25lcih0aGlzLl9fb3duZXJJRCkgOiB0aGlzO1xufVxuXG5mdW5jdGlvbiBhc011dGFibGUoKSB7XG4gIHJldHVybiB0aGlzLl9fb3duZXJJRCA/IHRoaXMgOiB0aGlzLl9fZW5zdXJlT3duZXIobmV3IE93bmVySUQoKSk7XG59XG5cbmZ1bmN0aW9uIGFzSW1tdXRhYmxlKCkge1xuICByZXR1cm4gdGhpcy5fX2Vuc3VyZU93bmVyKCk7XG59XG5cbmZ1bmN0aW9uIHdhc0FsdGVyZWQoKSB7XG4gIHJldHVybiB0aGlzLl9fYWx0ZXJlZDtcbn1cblxudmFyIE1hcCA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEtleWVkQ29sbGVjdGlvbiQkMSkge1xuICBmdW5jdGlvbiBNYXAodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgPyBlbXB0eU1hcCgpXG4gICAgICA6IGlzTWFwKHZhbHVlKSAmJiAhaXNPcmRlcmVkKHZhbHVlKVxuICAgICAgICA/IHZhbHVlXG4gICAgICAgIDogZW1wdHlNYXAoKS53aXRoTXV0YXRpb25zKGZ1bmN0aW9uIChtYXApIHtcbiAgICAgICAgICAgIHZhciBpdGVyID0gS2V5ZWRDb2xsZWN0aW9uJCQxKHZhbHVlKTtcbiAgICAgICAgICAgIGFzc2VydE5vdEluZmluaXRlKGl0ZXIuc2l6ZSk7XG4gICAgICAgICAgICBpdGVyLmZvckVhY2goZnVuY3Rpb24gKHYsIGspIHsgcmV0dXJuIG1hcC5zZXQoaywgdik7IH0pO1xuICAgICAgICAgIH0pO1xuICB9XG5cbiAgaWYgKCBLZXllZENvbGxlY3Rpb24kJDEgKSBNYXAuX19wcm90b19fID0gS2V5ZWRDb2xsZWN0aW9uJCQxO1xuICBNYXAucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggS2V5ZWRDb2xsZWN0aW9uJCQxICYmIEtleWVkQ29sbGVjdGlvbiQkMS5wcm90b3R5cGUgKTtcbiAgTWFwLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1hcDtcblxuICBNYXAub2YgPSBmdW5jdGlvbiBvZiAoKSB7XG4gICAgdmFyIGtleVZhbHVlcyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHdoaWxlICggbGVuLS0gKSBrZXlWYWx1ZXNbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gXTtcblxuICAgIHJldHVybiBlbXB0eU1hcCgpLndpdGhNdXRhdGlvbnMoZnVuY3Rpb24gKG1hcCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlWYWx1ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgaWYgKGkgKyAxID49IGtleVZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdmFsdWUgZm9yIGtleTogJyArIGtleVZhbHVlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgbWFwLnNldChrZXlWYWx1ZXNbaV0sIGtleVZhbHVlc1tpICsgMV0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIE1hcC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX190b1N0cmluZygnTWFwIHsnLCAnfScpO1xuICB9O1xuXG4gIC8vIEBwcmFnbWEgQWNjZXNzXG5cbiAgTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKGssIG5vdFNldFZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb3RcbiAgICAgID8gdGhpcy5fcm9vdC5nZXQoMCwgdW5kZWZpbmVkLCBrLCBub3RTZXRWYWx1ZSlcbiAgICAgIDogbm90U2V0VmFsdWU7XG4gIH07XG5cbiAgLy8gQHByYWdtYSBNb2RpZmljYXRpb25cblxuICBNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIHNldCAoaywgdikge1xuICAgIHJldHVybiB1cGRhdGVNYXAodGhpcywgaywgdik7XG4gIH07XG5cbiAgTWFwLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUgKGspIHtcbiAgICByZXR1cm4gdXBkYXRlTWFwKHRoaXMsIGssIE5PVF9TRVQpO1xuICB9O1xuXG4gIE1hcC5wcm90b3R5cGUuZGVsZXRlQWxsID0gZnVuY3Rpb24gZGVsZXRlQWxsIChrZXlzKSB7XG4gICAgdmFyIGNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uKGtleXMpO1xuXG4gICAgaWYgKGNvbGxlY3Rpb24uc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMud2l0aE11dGF0aW9ucyhmdW5jdGlvbiAobWFwKSB7XG4gICAgICBjb2xsZWN0aW9uLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gbWFwLnJlbW92ZShrZXkpOyB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBNYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIgKCkge1xuICAgIGlmICh0aGlzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fX293bmVySUQpIHtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgICB0aGlzLl9yb290ID0gbnVsbDtcbiAgICAgIHRoaXMuX19oYXNoID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fX2FsdGVyZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBlbXB0eU1hcCgpO1xuICB9O1xuXG4gIC8vIEBwcmFnbWEgQ29tcG9zaXRpb25cblxuICBNYXAucHJvdG90eXBlLnNvcnQgPSBmdW5jdGlvbiBzb3J0IChjb21wYXJhdG9yKSB7XG4gICAgLy8gTGF0ZSBiaW5kaW5nXG4gICAgcmV0dXJuIE9yZGVyZWRNYXAoc29ydEZhY3RvcnkodGhpcywgY29tcGFyYXRvcikpO1xuICB9O1xuXG4gIE1hcC5wcm90b3R5cGUuc29ydEJ5ID0gZnVuY3Rpb24gc29ydEJ5IChtYXBwZXIsIGNvbXBhcmF0b3IpIHtcbiAgICAvLyBMYXRlIGJpbmRpbmdcbiAgICByZXR1cm4gT3JkZXJlZE1hcChzb3J0RmFjdG9yeSh0aGlzLCBjb21wYXJhdG9yLCBtYXBwZXIpKTtcbiAgfTtcblxuICBNYXAucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIG1hcCAobWFwcGVyLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMud2l0aE11dGF0aW9ucyhmdW5jdGlvbiAobWFwKSB7XG4gICAgICBtYXAuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICBtYXAuc2V0KGtleSwgbWFwcGVyLmNhbGwoY29udGV4dCwgdmFsdWUsIGtleSwgbWFwKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyBAcHJhZ21hIE11dGFiaWxpdHlcblxuICBNYXAucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbiBfX2l0ZXJhdG9yICh0eXBlLCByZXZlcnNlKSB7XG4gICAgcmV0dXJuIG5ldyBNYXBJdGVyYXRvcih0aGlzLCB0eXBlLCByZXZlcnNlKTtcbiAgfTtcblxuICBNYXAucHJvdG90eXBlLl9faXRlcmF0ZSA9IGZ1bmN0aW9uIF9faXRlcmF0ZSAoZm4sIHJldmVyc2UpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICB0aGlzLl9yb290ICYmXG4gICAgICB0aGlzLl9yb290Lml0ZXJhdGUoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgIGl0ZXJhdGlvbnMrKztcbiAgICAgICAgcmV0dXJuIGZuKGVudHJ5WzFdLCBlbnRyeVswXSwgdGhpcyQxKTtcbiAgICAgIH0sIHJldmVyc2UpO1xuICAgIHJldHVybiBpdGVyYXRpb25zO1xuICB9O1xuXG4gIE1hcC5wcm90b3R5cGUuX19lbnN1cmVPd25lciA9IGZ1bmN0aW9uIF9fZW5zdXJlT3duZXIgKG93bmVySUQpIHtcbiAgICBpZiAob3duZXJJRCA9PT0gdGhpcy5fX293bmVySUQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAoIW93bmVySUQpIHtcbiAgICAgIGlmICh0aGlzLnNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGVtcHR5TWFwKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9fb3duZXJJRCA9IG93bmVySUQ7XG4gICAgICB0aGlzLl9fYWx0ZXJlZCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBtYWtlTWFwKHRoaXMuc2l6ZSwgdGhpcy5fcm9vdCwgb3duZXJJRCwgdGhpcy5fX2hhc2gpO1xuICB9O1xuXG4gIHJldHVybiBNYXA7XG59KEtleWVkQ29sbGVjdGlvbikpO1xuXG5NYXAuaXNNYXAgPSBpc01hcDtcblxudmFyIE1hcFByb3RvdHlwZSA9IE1hcC5wcm90b3R5cGU7XG5NYXBQcm90b3R5cGVbSVNfTUFQX1NZTUJPTF0gPSB0cnVlO1xuTWFwUHJvdG90eXBlW0RFTEVURV0gPSBNYXBQcm90b3R5cGUucmVtb3ZlO1xuTWFwUHJvdG90eXBlLnJlbW92ZUFsbCA9IE1hcFByb3RvdHlwZS5kZWxldGVBbGw7XG5NYXBQcm90b3R5cGUuc2V0SW4gPSBzZXRJbiQxO1xuTWFwUHJvdG90eXBlLnJlbW92ZUluID0gTWFwUHJvdG90eXBlLmRlbGV0ZUluID0gZGVsZXRlSW47XG5NYXBQcm90b3R5cGUudXBkYXRlID0gdXBkYXRlJDE7XG5NYXBQcm90b3R5cGUudXBkYXRlSW4gPSB1cGRhdGVJbiQxO1xuTWFwUHJvdG90eXBlLm1lcmdlID0gTWFwUHJvdG90eXBlLmNvbmNhdCA9IG1lcmdlO1xuTWFwUHJvdG90eXBlLm1lcmdlV2l0aCA9IG1lcmdlV2l0aDtcbk1hcFByb3RvdHlwZS5tZXJnZURlZXAgPSBtZXJnZURlZXAkMTtcbk1hcFByb3RvdHlwZS5tZXJnZURlZXBXaXRoID0gbWVyZ2VEZWVwV2l0aCQxO1xuTWFwUHJvdG90eXBlLm1lcmdlSW4gPSBtZXJnZUluO1xuTWFwUHJvdG90eXBlLm1lcmdlRGVlcEluID0gbWVyZ2VEZWVwSW47XG5NYXBQcm90b3R5cGUud2l0aE11dGF0aW9ucyA9IHdpdGhNdXRhdGlvbnM7XG5NYXBQcm90b3R5cGUud2FzQWx0ZXJlZCA9IHdhc0FsdGVyZWQ7XG5NYXBQcm90b3R5cGUuYXNJbW11dGFibGUgPSBhc0ltbXV0YWJsZTtcbk1hcFByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IE1hcFByb3RvdHlwZS5hc011dGFibGUgPSBhc011dGFibGU7XG5NYXBQcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbihyZXN1bHQsIGFycikge1xuICByZXR1cm4gcmVzdWx0LnNldChhcnJbMF0sIGFyclsxXSk7XG59O1xuTWFwUHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbihvYmopIHtcbiAgcmV0dXJuIG9iai5hc0ltbXV0YWJsZSgpO1xufTtcblxuLy8gI3ByYWdtYSBUcmllIE5vZGVzXG5cbnZhciBBcnJheU1hcE5vZGUgPSBmdW5jdGlvbiBBcnJheU1hcE5vZGUob3duZXJJRCwgZW50cmllcykge1xuICB0aGlzLm93bmVySUQgPSBvd25lcklEO1xuICB0aGlzLmVudHJpZXMgPSBlbnRyaWVzO1xufTtcblxuQXJyYXlNYXBOb2RlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKHNoaWZ0LCBrZXlIYXNoLCBrZXksIG5vdFNldFZhbHVlKSB7XG4gIHZhciBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuICBmb3IgKHZhciBpaSA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpaSA8IGxlbjsgaWkrKykge1xuICAgIGlmIChpcyhrZXksIGVudHJpZXNbaWldWzBdKSkge1xuICAgICAgcmV0dXJuIGVudHJpZXNbaWldWzFdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbm90U2V0VmFsdWU7XG59O1xuXG5BcnJheU1hcE5vZGUucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAob3duZXJJRCwgc2hpZnQsIGtleUhhc2gsIGtleSwgdmFsdWUsIGRpZENoYW5nZVNpemUsIGRpZEFsdGVyKSB7XG4gIHZhciByZW1vdmVkID0gdmFsdWUgPT09IE5PVF9TRVQ7XG5cbiAgdmFyIGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gZW50cmllcy5sZW5ndGg7XG4gIGZvciAoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgaWYgKGlzKGtleSwgZW50cmllc1tpZHhdWzBdKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHZhciBleGlzdHMgPSBpZHggPCBsZW47XG5cbiAgaWYgKGV4aXN0cyA/IGVudHJpZXNbaWR4XVsxXSA9PT0gdmFsdWUgOiByZW1vdmVkKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBTZXRSZWYoZGlkQWx0ZXIpO1xuICAocmVtb3ZlZCB8fCAhZXhpc3RzKSAmJiBTZXRSZWYoZGlkQ2hhbmdlU2l6ZSk7XG5cbiAgaWYgKHJlbW92ZWQgJiYgZW50cmllcy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm47IC8vIHVuZGVmaW5lZFxuICB9XG5cbiAgaWYgKCFleGlzdHMgJiYgIXJlbW92ZWQgJiYgZW50cmllcy5sZW5ndGggPj0gTUFYX0FSUkFZX01BUF9TSVpFKSB7XG4gICAgcmV0dXJuIGNyZWF0ZU5vZGVzKG93bmVySUQsIGVudHJpZXMsIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgdmFyIGlzRWRpdGFibGUgPSBvd25lcklEICYmIG93bmVySUQgPT09IHRoaXMub3duZXJJRDtcbiAgdmFyIG5ld0VudHJpZXMgPSBpc0VkaXRhYmxlID8gZW50cmllcyA6IGFyckNvcHkoZW50cmllcyk7XG5cbiAgaWYgKGV4aXN0cykge1xuICAgIGlmIChyZW1vdmVkKSB7XG4gICAgICBpZHggPT09IGxlbiAtIDFcbiAgICAgICAgPyBuZXdFbnRyaWVzLnBvcCgpXG4gICAgICAgIDogKG5ld0VudHJpZXNbaWR4XSA9IG5ld0VudHJpZXMucG9wKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdFbnRyaWVzW2lkeF0gPSBba2V5LCB2YWx1ZV07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5ld0VudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9XG5cbiAgaWYgKGlzRWRpdGFibGUpIHtcbiAgICB0aGlzLmVudHJpZXMgPSBuZXdFbnRyaWVzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBBcnJheU1hcE5vZGUob3duZXJJRCwgbmV3RW50cmllcyk7XG59O1xuXG52YXIgQml0bWFwSW5kZXhlZE5vZGUgPSBmdW5jdGlvbiBCaXRtYXBJbmRleGVkTm9kZShvd25lcklELCBiaXRtYXAsIG5vZGVzKSB7XG4gIHRoaXMub3duZXJJRCA9IG93bmVySUQ7XG4gIHRoaXMuYml0bWFwID0gYml0bWFwO1xuICB0aGlzLm5vZGVzID0gbm9kZXM7XG59O1xuXG5CaXRtYXBJbmRleGVkTm9kZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChzaGlmdCwga2V5SGFzaCwga2V5LCBub3RTZXRWYWx1ZSkge1xuICBpZiAoa2V5SGFzaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAga2V5SGFzaCA9IGhhc2goa2V5KTtcbiAgfVxuICB2YXIgYml0ID0gMSA8PCAoKHNoaWZ0ID09PSAwID8ga2V5SGFzaCA6IGtleUhhc2ggPj4+IHNoaWZ0KSAmIE1BU0spO1xuICB2YXIgYml0bWFwID0gdGhpcy5iaXRtYXA7XG4gIHJldHVybiAoYml0bWFwICYgYml0KSA9PT0gMFxuICAgID8gbm90U2V0VmFsdWVcbiAgICA6IHRoaXMubm9kZXNbcG9wQ291bnQoYml0bWFwICYgKGJpdCAtIDEpKV0uZ2V0KFxuICAgICAgICBzaGlmdCArIFNISUZULFxuICAgICAgICBrZXlIYXNoLFxuICAgICAgICBrZXksXG4gICAgICAgIG5vdFNldFZhbHVlXG4gICAgICApO1xufTtcblxuQml0bWFwSW5kZXhlZE5vZGUucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAob3duZXJJRCwgc2hpZnQsIGtleUhhc2gsIGtleSwgdmFsdWUsIGRpZENoYW5nZVNpemUsIGRpZEFsdGVyKSB7XG4gIGlmIChrZXlIYXNoID09PSB1bmRlZmluZWQpIHtcbiAgICBrZXlIYXNoID0gaGFzaChrZXkpO1xuICB9XG4gIHZhciBrZXlIYXNoRnJhZyA9IChzaGlmdCA9PT0gMCA/IGtleUhhc2ggOiBrZXlIYXNoID4+PiBzaGlmdCkgJiBNQVNLO1xuICB2YXIgYml0ID0gMSA8PCBrZXlIYXNoRnJhZztcbiAgdmFyIGJpdG1hcCA9IHRoaXMuYml0bWFwO1xuICB2YXIgZXhpc3RzID0gKGJpdG1hcCAmIGJpdCkgIT09IDA7XG5cbiAgaWYgKCFleGlzdHMgJiYgdmFsdWUgPT09IE5PVF9TRVQpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHZhciBpZHggPSBwb3BDb3VudChiaXRtYXAgJiAoYml0IC0gMSkpO1xuICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzO1xuICB2YXIgbm9kZSA9IGV4aXN0cyA/IG5vZGVzW2lkeF0gOiB1bmRlZmluZWQ7XG4gIHZhciBuZXdOb2RlID0gdXBkYXRlTm9kZShcbiAgICBub2RlLFxuICAgIG93bmVySUQsXG4gICAgc2hpZnQgKyBTSElGVCxcbiAgICBrZXlIYXNoLFxuICAgIGtleSxcbiAgICB2YWx1ZSxcbiAgICBkaWRDaGFuZ2VTaXplLFxuICAgIGRpZEFsdGVyXG4gICk7XG5cbiAgaWYgKG5ld05vZGUgPT09IG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlmICghZXhpc3RzICYmIG5ld05vZGUgJiYgbm9kZXMubGVuZ3RoID49IE1BWF9CSVRNQVBfSU5ERVhFRF9TSVpFKSB7XG4gICAgcmV0dXJuIGV4cGFuZE5vZGVzKG93bmVySUQsIG5vZGVzLCBiaXRtYXAsIGtleUhhc2hGcmFnLCBuZXdOb2RlKTtcbiAgfVxuXG4gIGlmIChcbiAgICBleGlzdHMgJiZcbiAgICAhbmV3Tm9kZSAmJlxuICAgIG5vZGVzLmxlbmd0aCA9PT0gMiAmJlxuICAgIGlzTGVhZk5vZGUobm9kZXNbaWR4IF4gMV0pXG4gICkge1xuICAgIHJldHVybiBub2Rlc1tpZHggXiAxXTtcbiAgfVxuXG4gIGlmIChleGlzdHMgJiYgbmV3Tm9kZSAmJiBub2Rlcy5sZW5ndGggPT09IDEgJiYgaXNMZWFmTm9kZShuZXdOb2RlKSkge1xuICAgIHJldHVybiBuZXdOb2RlO1xuICB9XG5cbiAgdmFyIGlzRWRpdGFibGUgPSBvd25lcklEICYmIG93bmVySUQgPT09IHRoaXMub3duZXJJRDtcbiAgdmFyIG5ld0JpdG1hcCA9IGV4aXN0cyA/IChuZXdOb2RlID8gYml0bWFwIDogYml0bWFwIF4gYml0KSA6IGJpdG1hcCB8IGJpdDtcbiAgdmFyIG5ld05vZGVzID0gZXhpc3RzXG4gICAgPyBuZXdOb2RlXG4gICAgICA/IHNldEF0KG5vZGVzLCBpZHgsIG5ld05vZGUsIGlzRWRpdGFibGUpXG4gICAgICA6IHNwbGljZU91dChub2RlcywgaWR4LCBpc0VkaXRhYmxlKVxuICAgIDogc3BsaWNlSW4obm9kZXMsIGlkeCwgbmV3Tm9kZSwgaXNFZGl0YWJsZSk7XG5cbiAgaWYgKGlzRWRpdGFibGUpIHtcbiAgICB0aGlzLmJpdG1hcCA9IG5ld0JpdG1hcDtcbiAgICB0aGlzLm5vZGVzID0gbmV3Tm9kZXM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICByZXR1cm4gbmV3IEJpdG1hcEluZGV4ZWROb2RlKG93bmVySUQsIG5ld0JpdG1hcCwgbmV3Tm9kZXMpO1xufTtcblxudmFyIEhhc2hBcnJheU1hcE5vZGUgPSBmdW5jdGlvbiBIYXNoQXJyYXlNYXBOb2RlKG93bmVySUQsIGNvdW50LCBub2Rlcykge1xuICB0aGlzLm93bmVySUQgPSBvd25lcklEO1xuICB0aGlzLmNvdW50ID0gY291bnQ7XG4gIHRoaXMubm9kZXMgPSBub2Rlcztcbn07XG5cbkhhc2hBcnJheU1hcE5vZGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCAoc2hpZnQsIGtleUhhc2gsIGtleSwgbm90U2V0VmFsdWUpIHtcbiAgaWYgKGtleUhhc2ggPT09IHVuZGVmaW5lZCkge1xuICAgIGtleUhhc2ggPSBoYXNoKGtleSk7XG4gIH1cbiAgdmFyIGlkeCA9IChzaGlmdCA9PT0gMCA/IGtleUhhc2ggOiBrZXlIYXNoID4+PiBzaGlmdCkgJiBNQVNLO1xuICB2YXIgbm9kZSA9IHRoaXMubm9kZXNbaWR4XTtcbiAgcmV0dXJuIG5vZGVcbiAgICA/IG5vZGUuZ2V0KHNoaWZ0ICsgU0hJRlQsIGtleUhhc2gsIGtleSwgbm90U2V0VmFsdWUpXG4gICAgOiBub3RTZXRWYWx1ZTtcbn07XG5cbkhhc2hBcnJheU1hcE5vZGUucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAob3duZXJJRCwgc2hpZnQsIGtleUhhc2gsIGtleSwgdmFsdWUsIGRpZENoYW5nZVNpemUsIGRpZEFsdGVyKSB7XG4gIGlmIChrZXlIYXNoID09PSB1bmRlZmluZWQpIHtcbiAgICBrZXlIYXNoID0gaGFzaChrZXkpO1xuICB9XG4gIHZhciBpZHggPSAoc2hpZnQgPT09IDAgPyBrZXlIYXNoIDoga2V5SGFzaCA+Pj4gc2hpZnQpICYgTUFTSztcbiAgdmFyIHJlbW92ZWQgPSB2YWx1ZSA9PT0gTk9UX1NFVDtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcztcbiAgdmFyIG5vZGUgPSBub2Rlc1tpZHhdO1xuXG4gIGlmIChyZW1vdmVkICYmICFub2RlKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB2YXIgbmV3Tm9kZSA9IHVwZGF0ZU5vZGUoXG4gICAgbm9kZSxcbiAgICBvd25lcklELFxuICAgIHNoaWZ0ICsgU0hJRlQsXG4gICAga2V5SGFzaCxcbiAgICBrZXksXG4gICAgdmFsdWUsXG4gICAgZGlkQ2hhbmdlU2l6ZSxcbiAgICBkaWRBbHRlclxuICApO1xuICBpZiAobmV3Tm9kZSA9PT0gbm9kZSkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdmFyIG5ld0NvdW50ID0gdGhpcy5jb3VudDtcbiAgaWYgKCFub2RlKSB7XG4gICAgbmV3Q291bnQrKztcbiAgfSBlbHNlIGlmICghbmV3Tm9kZSkge1xuICAgIG5ld0NvdW50LS07XG4gICAgaWYgKG5ld0NvdW50IDwgTUlOX0hBU0hfQVJSQVlfTUFQX1NJWkUpIHtcbiAgICAgIHJldHVybiBwYWNrTm9kZXMob3duZXJJRCwgbm9kZXMsIG5ld0NvdW50LCBpZHgpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBpc0VkaXRhYmxlID0gb3duZXJJRCAmJiBvd25lcklEID09PSB0aGlzLm93bmVySUQ7XG4gIHZhciBuZXdOb2RlcyA9IHNldEF0KG5vZGVzLCBpZHgsIG5ld05vZGUsIGlzRWRpdGFibGUpO1xuXG4gIGlmIChpc0VkaXRhYmxlKSB7XG4gICAgdGhpcy5jb3VudCA9IG5ld0NvdW50O1xuICAgIHRoaXMubm9kZXMgPSBuZXdOb2RlcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHJldHVybiBuZXcgSGFzaEFycmF5TWFwTm9kZShvd25lcklELCBuZXdDb3VudCwgbmV3Tm9kZXMpO1xufTtcblxudmFyIEhhc2hDb2xsaXNpb25Ob2RlID0gZnVuY3Rpb24gSGFzaENvbGxpc2lvbk5vZGUob3duZXJJRCwga2V5SGFzaCwgZW50cmllcykge1xuICB0aGlzLm93bmVySUQgPSBvd25lcklEO1xuICB0aGlzLmtleUhhc2ggPSBrZXlIYXNoO1xuICB0aGlzLmVudHJpZXMgPSBlbnRyaWVzO1xufTtcblxuSGFzaENvbGxpc2lvbk5vZGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCAoc2hpZnQsIGtleUhhc2gsIGtleSwgbm90U2V0VmFsdWUpIHtcbiAgdmFyIGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG4gIGZvciAodmFyIGlpID0gMCwgbGVuID0gZW50cmllcy5sZW5ndGg7IGlpIDwgbGVuOyBpaSsrKSB7XG4gICAgaWYgKGlzKGtleSwgZW50cmllc1tpaV1bMF0pKSB7XG4gICAgICByZXR1cm4gZW50cmllc1tpaV1bMV07XG4gICAgfVxuICB9XG4gIHJldHVybiBub3RTZXRWYWx1ZTtcbn07XG5cbkhhc2hDb2xsaXNpb25Ob2RlLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUgKG93bmVySUQsIHNoaWZ0LCBrZXlIYXNoLCBrZXksIHZhbHVlLCBkaWRDaGFuZ2VTaXplLCBkaWRBbHRlcikge1xuICBpZiAoa2V5SGFzaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAga2V5SGFzaCA9IGhhc2goa2V5KTtcbiAgfVxuXG4gIHZhciByZW1vdmVkID0gdmFsdWUgPT09IE5PVF9TRVQ7XG5cbiAgaWYgKGtleUhhc2ggIT09IHRoaXMua2V5SGFzaCkge1xuICAgIGlmIChyZW1vdmVkKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgU2V0UmVmKGRpZEFsdGVyKTtcbiAgICBTZXRSZWYoZGlkQ2hhbmdlU2l6ZSk7XG4gICAgcmV0dXJuIG1lcmdlSW50b05vZGUodGhpcywgb3duZXJJRCwgc2hpZnQsIGtleUhhc2gsIFtrZXksIHZhbHVlXSk7XG4gIH1cblxuICB2YXIgZW50cmllcyA9IHRoaXMuZW50cmllcztcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBlbnRyaWVzLmxlbmd0aDtcbiAgZm9yICg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICBpZiAoaXMoa2V5LCBlbnRyaWVzW2lkeF1bMF0pKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgdmFyIGV4aXN0cyA9IGlkeCA8IGxlbjtcblxuICBpZiAoZXhpc3RzID8gZW50cmllc1tpZHhdWzFdID09PSB2YWx1ZSA6IHJlbW92ZWQpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIFNldFJlZihkaWRBbHRlcik7XG4gIChyZW1vdmVkIHx8ICFleGlzdHMpICYmIFNldFJlZihkaWRDaGFuZ2VTaXplKTtcblxuICBpZiAocmVtb3ZlZCAmJiBsZW4gPT09IDIpIHtcbiAgICByZXR1cm4gbmV3IFZhbHVlTm9kZShvd25lcklELCB0aGlzLmtleUhhc2gsIGVudHJpZXNbaWR4IF4gMV0pO1xuICB9XG5cbiAgdmFyIGlzRWRpdGFibGUgPSBvd25lcklEICYmIG93bmVySUQgPT09IHRoaXMub3duZXJJRDtcbiAgdmFyIG5ld0VudHJpZXMgPSBpc0VkaXRhYmxlID8gZW50cmllcyA6IGFyckNvcHkoZW50cmllcyk7XG5cbiAgaWYgKGV4aXN0cykge1xuICAgIGlmIChyZW1vdmVkKSB7XG4gICAgICBpZHggPT09IGxlbiAtIDFcbiAgICAgICAgPyBuZXdFbnRyaWVzLnBvcCgpXG4gICAgICAgIDogKG5ld0VudHJpZXNbaWR4XSA9IG5ld0VudHJpZXMucG9wKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdFbnRyaWVzW2lkeF0gPSBba2V5LCB2YWx1ZV07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5ld0VudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9XG5cbiAgaWYgKGlzRWRpdGFibGUpIHtcbiAgICB0aGlzLmVudHJpZXMgPSBuZXdFbnRyaWVzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBIYXNoQ29sbGlzaW9uTm9kZShvd25lcklELCB0aGlzLmtleUhhc2gsIG5ld0VudHJpZXMpO1xufTtcblxudmFyIFZhbHVlTm9kZSA9IGZ1bmN0aW9uIFZhbHVlTm9kZShvd25lcklELCBrZXlIYXNoLCBlbnRyeSkge1xuICB0aGlzLm93bmVySUQgPSBvd25lcklEO1xuICB0aGlzLmtleUhhc2ggPSBrZXlIYXNoO1xuICB0aGlzLmVudHJ5ID0gZW50cnk7XG59O1xuXG5WYWx1ZU5vZGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCAoc2hpZnQsIGtleUhhc2gsIGtleSwgbm90U2V0VmFsdWUpIHtcbiAgcmV0dXJuIGlzKGtleSwgdGhpcy5lbnRyeVswXSkgPyB0aGlzLmVudHJ5WzFdIDogbm90U2V0VmFsdWU7XG59O1xuXG5WYWx1ZU5vZGUucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAob3duZXJJRCwgc2hpZnQsIGtleUhhc2gsIGtleSwgdmFsdWUsIGRpZENoYW5nZVNpemUsIGRpZEFsdGVyKSB7XG4gIHZhciByZW1vdmVkID0gdmFsdWUgPT09IE5PVF9TRVQ7XG4gIHZhciBrZXlNYXRjaCA9IGlzKGtleSwgdGhpcy5lbnRyeVswXSk7XG4gIGlmIChrZXlNYXRjaCA/IHZhbHVlID09PSB0aGlzLmVudHJ5WzFdIDogcmVtb3ZlZCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgU2V0UmVmKGRpZEFsdGVyKTtcblxuICBpZiAocmVtb3ZlZCkge1xuICAgIFNldFJlZihkaWRDaGFuZ2VTaXplKTtcbiAgICByZXR1cm47IC8vIHVuZGVmaW5lZFxuICB9XG5cbiAgaWYgKGtleU1hdGNoKSB7XG4gICAgaWYgKG93bmVySUQgJiYgb3duZXJJRCA9PT0gdGhpcy5vd25lcklEKSB7XG4gICAgICB0aGlzLmVudHJ5WzFdID0gdmFsdWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBWYWx1ZU5vZGUob3duZXJJRCwgdGhpcy5rZXlIYXNoLCBba2V5LCB2YWx1ZV0pO1xuICB9XG5cbiAgU2V0UmVmKGRpZENoYW5nZVNpemUpO1xuICByZXR1cm4gbWVyZ2VJbnRvTm9kZSh0aGlzLCBvd25lcklELCBzaGlmdCwgaGFzaChrZXkpLCBba2V5LCB2YWx1ZV0pO1xufTtcblxuLy8gI3ByYWdtYSBJdGVyYXRvcnNcblxuQXJyYXlNYXBOb2RlLnByb3RvdHlwZS5pdGVyYXRlID0gSGFzaENvbGxpc2lvbk5vZGUucHJvdG90eXBlLml0ZXJhdGUgPSBmdW5jdGlvbihcbiAgZm4sXG4gIHJldmVyc2Vcbikge1xuICB2YXIgZW50cmllcyA9IHRoaXMuZW50cmllcztcbiAgZm9yICh2YXIgaWkgPSAwLCBtYXhJbmRleCA9IGVudHJpZXMubGVuZ3RoIC0gMTsgaWkgPD0gbWF4SW5kZXg7IGlpKyspIHtcbiAgICBpZiAoZm4oZW50cmllc1tyZXZlcnNlID8gbWF4SW5kZXggLSBpaSA6IGlpXSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59O1xuXG5CaXRtYXBJbmRleGVkTm9kZS5wcm90b3R5cGUuaXRlcmF0ZSA9IEhhc2hBcnJheU1hcE5vZGUucHJvdG90eXBlLml0ZXJhdGUgPSBmdW5jdGlvbihcbiAgZm4sXG4gIHJldmVyc2Vcbikge1xuICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzO1xuICBmb3IgKHZhciBpaSA9IDAsIG1heEluZGV4ID0gbm9kZXMubGVuZ3RoIC0gMTsgaWkgPD0gbWF4SW5kZXg7IGlpKyspIHtcbiAgICB2YXIgbm9kZSA9IG5vZGVzW3JldmVyc2UgPyBtYXhJbmRleCAtIGlpIDogaWldO1xuICAgIGlmIChub2RlICYmIG5vZGUuaXRlcmF0ZShmbiwgcmV2ZXJzZSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcblZhbHVlTm9kZS5wcm90b3R5cGUuaXRlcmF0ZSA9IGZ1bmN0aW9uKGZuLCByZXZlcnNlKSB7XG4gIHJldHVybiBmbih0aGlzLmVudHJ5KTtcbn07XG5cbnZhciBNYXBJdGVyYXRvciA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEl0ZXJhdG9yJCQxKSB7XG4gIGZ1bmN0aW9uIE1hcEl0ZXJhdG9yKG1hcCwgdHlwZSwgcmV2ZXJzZSkge1xuICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xuICAgIHRoaXMuX3JldmVyc2UgPSByZXZlcnNlO1xuICAgIHRoaXMuX3N0YWNrID0gbWFwLl9yb290ICYmIG1hcEl0ZXJhdG9yRnJhbWUobWFwLl9yb290KTtcbiAgfVxuXG4gIGlmICggSXRlcmF0b3IkJDEgKSBNYXBJdGVyYXRvci5fX3Byb3RvX18gPSBJdGVyYXRvciQkMTtcbiAgTWFwSXRlcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggSXRlcmF0b3IkJDEgJiYgSXRlcmF0b3IkJDEucHJvdG90eXBlICk7XG4gIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1hcEl0ZXJhdG9yO1xuXG4gIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gbmV4dCAoKSB7XG4gICAgdmFyIHR5cGUgPSB0aGlzLl90eXBlO1xuICAgIHZhciBzdGFjayA9IHRoaXMuX3N0YWNrO1xuICAgIHdoaWxlIChzdGFjaykge1xuICAgICAgdmFyIG5vZGUgPSBzdGFjay5ub2RlO1xuICAgICAgdmFyIGluZGV4ID0gc3RhY2suaW5kZXgrKztcbiAgICAgIHZhciBtYXhJbmRleCA9ICh2b2lkIDApO1xuICAgICAgaWYgKG5vZGUuZW50cnkpIHtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG1hcEl0ZXJhdG9yVmFsdWUodHlwZSwgbm9kZS5lbnRyeSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS5lbnRyaWVzKSB7XG4gICAgICAgIG1heEluZGV4ID0gbm9kZS5lbnRyaWVzLmxlbmd0aCAtIDE7XG4gICAgICAgIGlmIChpbmRleCA8PSBtYXhJbmRleCkge1xuICAgICAgICAgIHJldHVybiBtYXBJdGVyYXRvclZhbHVlKFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIG5vZGUuZW50cmllc1t0aGlzLl9yZXZlcnNlID8gbWF4SW5kZXggLSBpbmRleCA6IGluZGV4XVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1heEluZGV4ID0gbm9kZS5ub2Rlcy5sZW5ndGggLSAxO1xuICAgICAgICBpZiAoaW5kZXggPD0gbWF4SW5kZXgpIHtcbiAgICAgICAgICB2YXIgc3ViTm9kZSA9IG5vZGUubm9kZXNbdGhpcy5fcmV2ZXJzZSA/IG1heEluZGV4IC0gaW5kZXggOiBpbmRleF07XG4gICAgICAgICAgaWYgKHN1Yk5vZGUpIHtcbiAgICAgICAgICAgIGlmIChzdWJOb2RlLmVudHJ5KSB7XG4gICAgICAgICAgICAgIHJldHVybiBtYXBJdGVyYXRvclZhbHVlKHR5cGUsIHN1Yk5vZGUuZW50cnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhY2sgPSB0aGlzLl9zdGFjayA9IG1hcEl0ZXJhdG9yRnJhbWUoc3ViTm9kZSwgc3RhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RhY2sgPSB0aGlzLl9zdGFjayA9IHRoaXMuX3N0YWNrLl9fcHJldjtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZXJhdG9yRG9uZSgpO1xuICB9O1xuXG4gIHJldHVybiBNYXBJdGVyYXRvcjtcbn0oSXRlcmF0b3IpKTtcblxuZnVuY3Rpb24gbWFwSXRlcmF0b3JWYWx1ZSh0eXBlLCBlbnRyeSkge1xuICByZXR1cm4gaXRlcmF0b3JWYWx1ZSh0eXBlLCBlbnRyeVswXSwgZW50cnlbMV0pO1xufVxuXG5mdW5jdGlvbiBtYXBJdGVyYXRvckZyYW1lKG5vZGUsIHByZXYpIHtcbiAgcmV0dXJuIHtcbiAgICBub2RlOiBub2RlLFxuICAgIGluZGV4OiAwLFxuICAgIF9fcHJldjogcHJldixcbiAgfTtcbn1cblxuZnVuY3Rpb24gbWFrZU1hcChzaXplLCByb290LCBvd25lcklELCBoYXNoJCQxKSB7XG4gIHZhciBtYXAgPSBPYmplY3QuY3JlYXRlKE1hcFByb3RvdHlwZSk7XG4gIG1hcC5zaXplID0gc2l6ZTtcbiAgbWFwLl9yb290ID0gcm9vdDtcbiAgbWFwLl9fb3duZXJJRCA9IG93bmVySUQ7XG4gIG1hcC5fX2hhc2ggPSBoYXNoJCQxO1xuICBtYXAuX19hbHRlcmVkID0gZmFsc2U7XG4gIHJldHVybiBtYXA7XG59XG5cbnZhciBFTVBUWV9NQVA7XG5mdW5jdGlvbiBlbXB0eU1hcCgpIHtcbiAgcmV0dXJuIEVNUFRZX01BUCB8fCAoRU1QVFlfTUFQID0gbWFrZU1hcCgwKSk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU1hcChtYXAsIGssIHYpIHtcbiAgdmFyIG5ld1Jvb3Q7XG4gIHZhciBuZXdTaXplO1xuICBpZiAoIW1hcC5fcm9vdCkge1xuICAgIGlmICh2ID09PSBOT1RfU0VUKSB7XG4gICAgICByZXR1cm4gbWFwO1xuICAgIH1cbiAgICBuZXdTaXplID0gMTtcbiAgICBuZXdSb290ID0gbmV3IEFycmF5TWFwTm9kZShtYXAuX19vd25lcklELCBbW2ssIHZdXSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGRpZENoYW5nZVNpemUgPSBNYWtlUmVmKCk7XG4gICAgdmFyIGRpZEFsdGVyID0gTWFrZVJlZigpO1xuICAgIG5ld1Jvb3QgPSB1cGRhdGVOb2RlKFxuICAgICAgbWFwLl9yb290LFxuICAgICAgbWFwLl9fb3duZXJJRCxcbiAgICAgIDAsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBrLFxuICAgICAgdixcbiAgICAgIGRpZENoYW5nZVNpemUsXG4gICAgICBkaWRBbHRlclxuICAgICk7XG4gICAgaWYgKCFkaWRBbHRlci52YWx1ZSkge1xuICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG4gICAgbmV3U2l6ZSA9IG1hcC5zaXplICsgKGRpZENoYW5nZVNpemUudmFsdWUgPyAodiA9PT0gTk9UX1NFVCA/IC0xIDogMSkgOiAwKTtcbiAgfVxuICBpZiAobWFwLl9fb3duZXJJRCkge1xuICAgIG1hcC5zaXplID0gbmV3U2l6ZTtcbiAgICBtYXAuX3Jvb3QgPSBuZXdSb290O1xuICAgIG1hcC5fX2hhc2ggPSB1bmRlZmluZWQ7XG4gICAgbWFwLl9fYWx0ZXJlZCA9IHRydWU7XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuICByZXR1cm4gbmV3Um9vdCA/IG1ha2VNYXAobmV3U2l6ZSwgbmV3Um9vdCkgOiBlbXB0eU1hcCgpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVOb2RlKFxuICBub2RlLFxuICBvd25lcklELFxuICBzaGlmdCxcbiAga2V5SGFzaCxcbiAga2V5LFxuICB2YWx1ZSxcbiAgZGlkQ2hhbmdlU2l6ZSxcbiAgZGlkQWx0ZXJcbikge1xuICBpZiAoIW5vZGUpIHtcbiAgICBpZiAodmFsdWUgPT09IE5PVF9TRVQpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBTZXRSZWYoZGlkQWx0ZXIpO1xuICAgIFNldFJlZihkaWRDaGFuZ2VTaXplKTtcbiAgICByZXR1cm4gbmV3IFZhbHVlTm9kZShvd25lcklELCBrZXlIYXNoLCBba2V5LCB2YWx1ZV0pO1xuICB9XG4gIHJldHVybiBub2RlLnVwZGF0ZShcbiAgICBvd25lcklELFxuICAgIHNoaWZ0LFxuICAgIGtleUhhc2gsXG4gICAga2V5LFxuICAgIHZhbHVlLFxuICAgIGRpZENoYW5nZVNpemUsXG4gICAgZGlkQWx0ZXJcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNMZWFmTm9kZShub2RlKSB7XG4gIHJldHVybiAoXG4gICAgbm9kZS5jb25zdHJ1Y3RvciA9PT0gVmFsdWVOb2RlIHx8IG5vZGUuY29uc3RydWN0b3IgPT09IEhhc2hDb2xsaXNpb25Ob2RlXG4gICk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlSW50b05vZGUobm9kZSwgb3duZXJJRCwgc2hpZnQsIGtleUhhc2gsIGVudHJ5KSB7XG4gIGlmIChub2RlLmtleUhhc2ggPT09IGtleUhhc2gpIHtcbiAgICByZXR1cm4gbmV3IEhhc2hDb2xsaXNpb25Ob2RlKG93bmVySUQsIGtleUhhc2gsIFtub2RlLmVudHJ5LCBlbnRyeV0pO1xuICB9XG5cbiAgdmFyIGlkeDEgPSAoc2hpZnQgPT09IDAgPyBub2RlLmtleUhhc2ggOiBub2RlLmtleUhhc2ggPj4+IHNoaWZ0KSAmIE1BU0s7XG4gIHZhciBpZHgyID0gKHNoaWZ0ID09PSAwID8ga2V5SGFzaCA6IGtleUhhc2ggPj4+IHNoaWZ0KSAmIE1BU0s7XG5cbiAgdmFyIG5ld05vZGU7XG4gIHZhciBub2RlcyA9XG4gICAgaWR4MSA9PT0gaWR4MlxuICAgICAgPyBbbWVyZ2VJbnRvTm9kZShub2RlLCBvd25lcklELCBzaGlmdCArIFNISUZULCBrZXlIYXNoLCBlbnRyeSldXG4gICAgICA6ICgobmV3Tm9kZSA9IG5ldyBWYWx1ZU5vZGUob3duZXJJRCwga2V5SGFzaCwgZW50cnkpKSxcbiAgICAgICAgaWR4MSA8IGlkeDIgPyBbbm9kZSwgbmV3Tm9kZV0gOiBbbmV3Tm9kZSwgbm9kZV0pO1xuXG4gIHJldHVybiBuZXcgQml0bWFwSW5kZXhlZE5vZGUob3duZXJJRCwgKDEgPDwgaWR4MSkgfCAoMSA8PCBpZHgyKSwgbm9kZXMpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVOb2Rlcyhvd25lcklELCBlbnRyaWVzLCBrZXksIHZhbHVlKSB7XG4gIGlmICghb3duZXJJRCkge1xuICAgIG93bmVySUQgPSBuZXcgT3duZXJJRCgpO1xuICB9XG4gIHZhciBub2RlID0gbmV3IFZhbHVlTm9kZShvd25lcklELCBoYXNoKGtleSksIFtrZXksIHZhbHVlXSk7XG4gIGZvciAodmFyIGlpID0gMDsgaWkgPCBlbnRyaWVzLmxlbmd0aDsgaWkrKykge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaWldO1xuICAgIG5vZGUgPSBub2RlLnVwZGF0ZShvd25lcklELCAwLCB1bmRlZmluZWQsIGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbiAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIHBhY2tOb2Rlcyhvd25lcklELCBub2RlcywgY291bnQsIGV4Y2x1ZGluZykge1xuICB2YXIgYml0bWFwID0gMDtcbiAgdmFyIHBhY2tlZElJID0gMDtcbiAgdmFyIHBhY2tlZE5vZGVzID0gbmV3IEFycmF5KGNvdW50KTtcbiAgZm9yICh2YXIgaWkgPSAwLCBiaXQgPSAxLCBsZW4gPSBub2Rlcy5sZW5ndGg7IGlpIDwgbGVuOyBpaSsrLCBiaXQgPDw9IDEpIHtcbiAgICB2YXIgbm9kZSA9IG5vZGVzW2lpXTtcbiAgICBpZiAobm9kZSAhPT0gdW5kZWZpbmVkICYmIGlpICE9PSBleGNsdWRpbmcpIHtcbiAgICAgIGJpdG1hcCB8PSBiaXQ7XG4gICAgICBwYWNrZWROb2Rlc1twYWNrZWRJSSsrXSA9IG5vZGU7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXcgQml0bWFwSW5kZXhlZE5vZGUob3duZXJJRCwgYml0bWFwLCBwYWNrZWROb2Rlcyk7XG59XG5cbmZ1bmN0aW9uIGV4cGFuZE5vZGVzKG93bmVySUQsIG5vZGVzLCBiaXRtYXAsIGluY2x1ZGluZywgbm9kZSkge1xuICB2YXIgY291bnQgPSAwO1xuICB2YXIgZXhwYW5kZWROb2RlcyA9IG5ldyBBcnJheShTSVpFKTtcbiAgZm9yICh2YXIgaWkgPSAwOyBiaXRtYXAgIT09IDA7IGlpKyssIGJpdG1hcCA+Pj49IDEpIHtcbiAgICBleHBhbmRlZE5vZGVzW2lpXSA9IGJpdG1hcCAmIDEgPyBub2Rlc1tjb3VudCsrXSA6IHVuZGVmaW5lZDtcbiAgfVxuICBleHBhbmRlZE5vZGVzW2luY2x1ZGluZ10gPSBub2RlO1xuICByZXR1cm4gbmV3IEhhc2hBcnJheU1hcE5vZGUob3duZXJJRCwgY291bnQgKyAxLCBleHBhbmRlZE5vZGVzKTtcbn1cblxuZnVuY3Rpb24gcG9wQ291bnQoeCkge1xuICB4IC09ICh4ID4+IDEpICYgMHg1NTU1NTU1NTtcbiAgeCA9ICh4ICYgMHgzMzMzMzMzMykgKyAoKHggPj4gMikgJiAweDMzMzMzMzMzKTtcbiAgeCA9ICh4ICsgKHggPj4gNCkpICYgMHgwZjBmMGYwZjtcbiAgeCArPSB4ID4+IDg7XG4gIHggKz0geCA+PiAxNjtcbiAgcmV0dXJuIHggJiAweDdmO1xufVxuXG5mdW5jdGlvbiBzZXRBdChhcnJheSwgaWR4LCB2YWwsIGNhbkVkaXQpIHtcbiAgdmFyIG5ld0FycmF5ID0gY2FuRWRpdCA/IGFycmF5IDogYXJyQ29weShhcnJheSk7XG4gIG5ld0FycmF5W2lkeF0gPSB2YWw7XG4gIHJldHVybiBuZXdBcnJheTtcbn1cblxuZnVuY3Rpb24gc3BsaWNlSW4oYXJyYXksIGlkeCwgdmFsLCBjYW5FZGl0KSB7XG4gIHZhciBuZXdMZW4gPSBhcnJheS5sZW5ndGggKyAxO1xuICBpZiAoY2FuRWRpdCAmJiBpZHggKyAxID09PSBuZXdMZW4pIHtcbiAgICBhcnJheVtpZHhdID0gdmFsO1xuICAgIHJldHVybiBhcnJheTtcbiAgfVxuICB2YXIgbmV3QXJyYXkgPSBuZXcgQXJyYXkobmV3TGVuKTtcbiAgdmFyIGFmdGVyID0gMDtcbiAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IG5ld0xlbjsgaWkrKykge1xuICAgIGlmIChpaSA9PT0gaWR4KSB7XG4gICAgICBuZXdBcnJheVtpaV0gPSB2YWw7XG4gICAgICBhZnRlciA9IC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdBcnJheVtpaV0gPSBhcnJheVtpaSArIGFmdGVyXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ld0FycmF5O1xufVxuXG5mdW5jdGlvbiBzcGxpY2VPdXQoYXJyYXksIGlkeCwgY2FuRWRpdCkge1xuICB2YXIgbmV3TGVuID0gYXJyYXkubGVuZ3RoIC0gMTtcbiAgaWYgKGNhbkVkaXQgJiYgaWR4ID09PSBuZXdMZW4pIHtcbiAgICBhcnJheS5wb3AoKTtcbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cbiAgdmFyIG5ld0FycmF5ID0gbmV3IEFycmF5KG5ld0xlbik7XG4gIHZhciBhZnRlciA9IDA7XG4gIGZvciAodmFyIGlpID0gMDsgaWkgPCBuZXdMZW47IGlpKyspIHtcbiAgICBpZiAoaWkgPT09IGlkeCkge1xuICAgICAgYWZ0ZXIgPSAxO1xuICAgIH1cbiAgICBuZXdBcnJheVtpaV0gPSBhcnJheVtpaSArIGFmdGVyXTtcbiAgfVxuICByZXR1cm4gbmV3QXJyYXk7XG59XG5cbnZhciBNQVhfQVJSQVlfTUFQX1NJWkUgPSBTSVpFIC8gNDtcbnZhciBNQVhfQklUTUFQX0lOREVYRURfU0laRSA9IFNJWkUgLyAyO1xudmFyIE1JTl9IQVNIX0FSUkFZX01BUF9TSVpFID0gU0laRSAvIDQ7XG5cbnZhciBJU19MSVNUX1NZTUJPTCA9ICdAQF9fSU1NVVRBQkxFX0xJU1RfX0BAJztcblxuZnVuY3Rpb24gaXNMaXN0KG1heWJlTGlzdCkge1xuICByZXR1cm4gQm9vbGVhbihtYXliZUxpc3QgJiYgbWF5YmVMaXN0W0lTX0xJU1RfU1lNQk9MXSk7XG59XG5cbnZhciBMaXN0ID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoSW5kZXhlZENvbGxlY3Rpb24kJDEpIHtcbiAgZnVuY3Rpb24gTGlzdCh2YWx1ZSkge1xuICAgIHZhciBlbXB0eSA9IGVtcHR5TGlzdCgpO1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZW1wdHk7XG4gICAgfVxuICAgIGlmIChpc0xpc3QodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHZhciBpdGVyID0gSW5kZXhlZENvbGxlY3Rpb24kJDEodmFsdWUpO1xuICAgIHZhciBzaXplID0gaXRlci5zaXplO1xuICAgIGlmIChzaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gZW1wdHk7XG4gICAgfVxuICAgIGFzc2VydE5vdEluZmluaXRlKHNpemUpO1xuICAgIGlmIChzaXplID4gMCAmJiBzaXplIDwgU0laRSkge1xuICAgICAgcmV0dXJuIG1ha2VMaXN0KDAsIHNpemUsIFNISUZULCBudWxsLCBuZXcgVk5vZGUoaXRlci50b0FycmF5KCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIGVtcHR5LndpdGhNdXRhdGlvbnMoZnVuY3Rpb24gKGxpc3QpIHtcbiAgICAgIGxpc3Quc2V0U2l6ZShzaXplKTtcbiAgICAgIGl0ZXIuZm9yRWFjaChmdW5jdGlvbiAodiwgaSkgeyByZXR1cm4gbGlzdC5zZXQoaSwgdik7IH0pO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKCBJbmRleGVkQ29sbGVjdGlvbiQkMSApIExpc3QuX19wcm90b19fID0gSW5kZXhlZENvbGxlY3Rpb24kJDE7XG4gIExpc3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggSW5kZXhlZENvbGxlY3Rpb24kJDEgJiYgSW5kZXhlZENvbGxlY3Rpb24kJDEucHJvdG90eXBlICk7XG4gIExpc3QucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGlzdDtcblxuICBMaXN0Lm9mID0gZnVuY3Rpb24gb2YgKC8qLi4udmFsdWVzKi8pIHtcbiAgICByZXR1cm4gdGhpcyhhcmd1bWVudHMpO1xuICB9O1xuXG4gIExpc3QucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiB0aGlzLl9fdG9TdHJpbmcoJ0xpc3QgWycsICddJyk7XG4gIH07XG5cbiAgLy8gQHByYWdtYSBBY2Nlc3NcblxuICBMaXN0LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKGluZGV4LCBub3RTZXRWYWx1ZSkge1xuICAgIGluZGV4ID0gd3JhcEluZGV4KHRoaXMsIGluZGV4KTtcbiAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuc2l6ZSkge1xuICAgICAgaW5kZXggKz0gdGhpcy5fb3JpZ2luO1xuICAgICAgdmFyIG5vZGUgPSBsaXN0Tm9kZUZvcih0aGlzLCBpbmRleCk7XG4gICAgICByZXR1cm4gbm9kZSAmJiBub2RlLmFycmF5W2luZGV4ICYgTUFTS107XG4gICAgfVxuICAgIHJldHVybiBub3RTZXRWYWx1ZTtcbiAgfTtcblxuICAvLyBAcHJhZ21hIE1vZGlmaWNhdGlvblxuXG4gIExpc3QucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIHNldCAoaW5kZXgsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHVwZGF0ZUxpc3QodGhpcywgaW5kZXgsIHZhbHVlKTtcbiAgfTtcblxuICBMaXN0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUgKGluZGV4KSB7XG4gICAgcmV0dXJuICF0aGlzLmhhcyhpbmRleClcbiAgICAgID8gdGhpc1xuICAgICAgOiBpbmRleCA9PT0gMFxuICAgICAgICA/IHRoaXMuc2hpZnQoKVxuICAgICAgICA6IGluZGV4ID09PSB0aGlzLnNpemUgLSAxXG4gICAgICAgICAgPyB0aGlzLnBvcCgpXG4gICAgICAgICAgOiB0aGlzLnNwbGljZShpbmRleCwgMSk7XG4gIH07XG5cbiAgTGlzdC5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gaW5zZXJ0IChpbmRleCwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5zcGxpY2UoaW5kZXgsIDAsIHZhbHVlKTtcbiAgfTtcblxuICBMaXN0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyICgpIHtcbiAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX19vd25lcklEKSB7XG4gICAgICB0aGlzLnNpemUgPSB0aGlzLl9vcmlnaW4gPSB0aGlzLl9jYXBhY2l0eSA9IDA7XG4gICAgICB0aGlzLl9sZXZlbCA9IFNISUZUO1xuICAgICAgdGhpcy5fcm9vdCA9IHRoaXMuX3RhaWwgPSBudWxsO1xuICAgICAgdGhpcy5fX2hhc2ggPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9fYWx0ZXJlZCA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIGVtcHR5TGlzdCgpO1xuICB9O1xuXG4gIExpc3QucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiBwdXNoICgvKi4uLnZhbHVlcyovKSB7XG4gICAgdmFyIHZhbHVlcyA9IGFyZ3VtZW50cztcbiAgICB2YXIgb2xkU2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICByZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKGZ1bmN0aW9uIChsaXN0KSB7XG4gICAgICBzZXRMaXN0Qm91bmRzKGxpc3QsIDAsIG9sZFNpemUgKyB2YWx1ZXMubGVuZ3RoKTtcbiAgICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCB2YWx1ZXMubGVuZ3RoOyBpaSsrKSB7XG4gICAgICAgIGxpc3Quc2V0KG9sZFNpemUgKyBpaSwgdmFsdWVzW2lpXSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgTGlzdC5wcm90b3R5cGUucG9wID0gZnVuY3Rpb24gcG9wICgpIHtcbiAgICByZXR1cm4gc2V0TGlzdEJvdW5kcyh0aGlzLCAwLCAtMSk7XG4gIH07XG5cbiAgTGlzdC5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uIHVuc2hpZnQgKC8qLi4udmFsdWVzKi8pIHtcbiAgICB2YXIgdmFsdWVzID0gYXJndW1lbnRzO1xuICAgIHJldHVybiB0aGlzLndpdGhNdXRhdGlvbnMoZnVuY3Rpb24gKGxpc3QpIHtcbiAgICAgIHNldExpc3RCb3VuZHMobGlzdCwgLXZhbHVlcy5sZW5ndGgpO1xuICAgICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IHZhbHVlcy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgbGlzdC5zZXQoaWksIHZhbHVlc1tpaV0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIExpc3QucHJvdG90eXBlLnNoaWZ0ID0gZnVuY3Rpb24gc2hpZnQgKCkge1xuICAgIHJldHVybiBzZXRMaXN0Qm91bmRzKHRoaXMsIDEpO1xuICB9O1xuXG4gIC8vIEBwcmFnbWEgQ29tcG9zaXRpb25cblxuICBMaXN0LnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKC8qLi4uY29sbGVjdGlvbnMqLykge1xuICAgIHZhciBhcmd1bWVudHMkMSA9IGFyZ3VtZW50cztcblxuICAgIHZhciBzZXFzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBhcmd1bWVudCA9IGFyZ3VtZW50cyQxW2ldO1xuICAgICAgdmFyIHNlcSA9IEluZGV4ZWRDb2xsZWN0aW9uJCQxKFxuICAgICAgICB0eXBlb2YgYXJndW1lbnQgIT09ICdzdHJpbmcnICYmIGhhc0l0ZXJhdG9yKGFyZ3VtZW50KVxuICAgICAgICAgID8gYXJndW1lbnRcbiAgICAgICAgICA6IFthcmd1bWVudF1cbiAgICAgICk7XG4gICAgICBpZiAoc2VxLnNpemUgIT09IDApIHtcbiAgICAgICAgc2Vxcy5wdXNoKHNlcSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzZXFzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmICh0aGlzLnNpemUgPT09IDAgJiYgIXRoaXMuX19vd25lcklEICYmIHNlcXMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3RvcihzZXFzWzBdKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMud2l0aE11dGF0aW9ucyhmdW5jdGlvbiAobGlzdCkge1xuICAgICAgc2Vxcy5mb3JFYWNoKGZ1bmN0aW9uIChzZXEpIHsgcmV0dXJuIHNlcS5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gbGlzdC5wdXNoKHZhbHVlKTsgfSk7IH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIExpc3QucHJvdG90eXBlLnNldFNpemUgPSBmdW5jdGlvbiBzZXRTaXplIChzaXplKSB7XG4gICAgcmV0dXJuIHNldExpc3RCb3VuZHModGhpcywgMCwgc2l6ZSk7XG4gIH07XG5cbiAgTGlzdC5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gbWFwIChtYXBwZXIsIGNvbnRleHQpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHJldHVybiB0aGlzLndpdGhNdXRhdGlvbnMoZnVuY3Rpb24gKGxpc3QpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcyQxLnNpemU7IGkrKykge1xuICAgICAgICBsaXN0LnNldChpLCBtYXBwZXIuY2FsbChjb250ZXh0LCBsaXN0LmdldChpKSwgaSwgbGlzdCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIC8vIEBwcmFnbWEgSXRlcmF0aW9uXG5cbiAgTGlzdC5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoYmVnaW4sIGVuZCkge1xuICAgIHZhciBzaXplID0gdGhpcy5zaXplO1xuICAgIGlmICh3aG9sZVNsaWNlKGJlZ2luLCBlbmQsIHNpemUpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIHNldExpc3RCb3VuZHMoXG4gICAgICB0aGlzLFxuICAgICAgcmVzb2x2ZUJlZ2luKGJlZ2luLCBzaXplKSxcbiAgICAgIHJlc29sdmVFbmQoZW5kLCBzaXplKVxuICAgICk7XG4gIH07XG5cbiAgTGlzdC5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uIF9faXRlcmF0b3IgKHR5cGUsIHJldmVyc2UpIHtcbiAgICB2YXIgaW5kZXggPSByZXZlcnNlID8gdGhpcy5zaXplIDogMDtcbiAgICB2YXIgdmFsdWVzID0gaXRlcmF0ZUxpc3QodGhpcywgcmV2ZXJzZSk7XG4gICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdmFsdWUgPSB2YWx1ZXMoKTtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gRE9ORVxuICAgICAgICA/IGl0ZXJhdG9yRG9uZSgpXG4gICAgICAgIDogaXRlcmF0b3JWYWx1ZSh0eXBlLCByZXZlcnNlID8gLS1pbmRleCA6IGluZGV4KyssIHZhbHVlKTtcbiAgICB9KTtcbiAgfTtcblxuICBMaXN0LnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbiBfX2l0ZXJhdGUgKGZuLCByZXZlcnNlKSB7XG4gICAgdmFyIGluZGV4ID0gcmV2ZXJzZSA/IHRoaXMuc2l6ZSA6IDA7XG4gICAgdmFyIHZhbHVlcyA9IGl0ZXJhdGVMaXN0KHRoaXMsIHJldmVyc2UpO1xuICAgIHZhciB2YWx1ZTtcbiAgICB3aGlsZSAoKHZhbHVlID0gdmFsdWVzKCkpICE9PSBET05FKSB7XG4gICAgICBpZiAoZm4odmFsdWUsIHJldmVyc2UgPyAtLWluZGV4IDogaW5kZXgrKywgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5kZXg7XG4gIH07XG5cbiAgTGlzdC5wcm90b3R5cGUuX19lbnN1cmVPd25lciA9IGZ1bmN0aW9uIF9fZW5zdXJlT3duZXIgKG93bmVySUQpIHtcbiAgICBpZiAob3duZXJJRCA9PT0gdGhpcy5fX293bmVySUQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAoIW93bmVySUQpIHtcbiAgICAgIGlmICh0aGlzLnNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGVtcHR5TGlzdCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fX293bmVySUQgPSBvd25lcklEO1xuICAgICAgdGhpcy5fX2FsdGVyZWQgPSBmYWxzZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gbWFrZUxpc3QoXG4gICAgICB0aGlzLl9vcmlnaW4sXG4gICAgICB0aGlzLl9jYXBhY2l0eSxcbiAgICAgIHRoaXMuX2xldmVsLFxuICAgICAgdGhpcy5fcm9vdCxcbiAgICAgIHRoaXMuX3RhaWwsXG4gICAgICBvd25lcklELFxuICAgICAgdGhpcy5fX2hhc2hcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBMaXN0O1xufShJbmRleGVkQ29sbGVjdGlvbikpO1xuXG5MaXN0LmlzTGlzdCA9IGlzTGlzdDtcblxudmFyIExpc3RQcm90b3R5cGUgPSBMaXN0LnByb3RvdHlwZTtcbkxpc3RQcm90b3R5cGVbSVNfTElTVF9TWU1CT0xdID0gdHJ1ZTtcbkxpc3RQcm90b3R5cGVbREVMRVRFXSA9IExpc3RQcm90b3R5cGUucmVtb3ZlO1xuTGlzdFByb3RvdHlwZS5tZXJnZSA9IExpc3RQcm90b3R5cGUuY29uY2F0O1xuTGlzdFByb3RvdHlwZS5zZXRJbiA9IHNldEluJDE7XG5MaXN0UHJvdG90eXBlLmRlbGV0ZUluID0gTGlzdFByb3RvdHlwZS5yZW1vdmVJbiA9IGRlbGV0ZUluO1xuTGlzdFByb3RvdHlwZS51cGRhdGUgPSB1cGRhdGUkMTtcbkxpc3RQcm90b3R5cGUudXBkYXRlSW4gPSB1cGRhdGVJbiQxO1xuTGlzdFByb3RvdHlwZS5tZXJnZUluID0gbWVyZ2VJbjtcbkxpc3RQcm90b3R5cGUubWVyZ2VEZWVwSW4gPSBtZXJnZURlZXBJbjtcbkxpc3RQcm90b3R5cGUud2l0aE11dGF0aW9ucyA9IHdpdGhNdXRhdGlvbnM7XG5MaXN0UHJvdG90eXBlLndhc0FsdGVyZWQgPSB3YXNBbHRlcmVkO1xuTGlzdFByb3RvdHlwZS5hc0ltbXV0YWJsZSA9IGFzSW1tdXRhYmxlO1xuTGlzdFByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IExpc3RQcm90b3R5cGUuYXNNdXRhYmxlID0gYXNNdXRhYmxlO1xuTGlzdFByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uKHJlc3VsdCwgYXJyKSB7XG4gIHJldHVybiByZXN1bHQucHVzaChhcnIpO1xufTtcbkxpc3RQcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uKG9iaikge1xuICByZXR1cm4gb2JqLmFzSW1tdXRhYmxlKCk7XG59O1xuXG52YXIgVk5vZGUgPSBmdW5jdGlvbiBWTm9kZShhcnJheSwgb3duZXJJRCkge1xuICB0aGlzLmFycmF5ID0gYXJyYXk7XG4gIHRoaXMub3duZXJJRCA9IG93bmVySUQ7XG59O1xuXG4vLyBUT0RPOiBzZWVtcyBsaWtlIHRoZXNlIG1ldGhvZHMgYXJlIHZlcnkgc2ltaWxhclxuXG5WTm9kZS5wcm90b3R5cGUucmVtb3ZlQmVmb3JlID0gZnVuY3Rpb24gcmVtb3ZlQmVmb3JlIChvd25lcklELCBsZXZlbCwgaW5kZXgpIHtcbiAgaWYgKGluZGV4ID09PSBsZXZlbCA/IDEgPDwgbGV2ZWwgOiB0aGlzLmFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHZhciBvcmlnaW5JbmRleCA9IChpbmRleCA+Pj4gbGV2ZWwpICYgTUFTSztcbiAgaWYgKG9yaWdpbkluZGV4ID49IHRoaXMuYXJyYXkubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG5ldyBWTm9kZShbXSwgb3duZXJJRCk7XG4gIH1cbiAgdmFyIHJlbW92aW5nRmlyc3QgPSBvcmlnaW5JbmRleCA9PT0gMDtcbiAgdmFyIG5ld0NoaWxkO1xuICBpZiAobGV2ZWwgPiAwKSB7XG4gICAgdmFyIG9sZENoaWxkID0gdGhpcy5hcnJheVtvcmlnaW5JbmRleF07XG4gICAgbmV3Q2hpbGQgPVxuICAgICAgb2xkQ2hpbGQgJiYgb2xkQ2hpbGQucmVtb3ZlQmVmb3JlKG93bmVySUQsIGxldmVsIC0gU0hJRlQsIGluZGV4KTtcbiAgICBpZiAobmV3Q2hpbGQgPT09IG9sZENoaWxkICYmIHJlbW92aW5nRmlyc3QpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfVxuICBpZiAocmVtb3ZpbmdGaXJzdCAmJiAhbmV3Q2hpbGQpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICB2YXIgZWRpdGFibGUgPSBlZGl0YWJsZVZOb2RlKHRoaXMsIG93bmVySUQpO1xuICBpZiAoIXJlbW92aW5nRmlyc3QpIHtcbiAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgb3JpZ2luSW5kZXg7IGlpKyspIHtcbiAgICAgIGVkaXRhYmxlLmFycmF5W2lpXSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgaWYgKG5ld0NoaWxkKSB7XG4gICAgZWRpdGFibGUuYXJyYXlbb3JpZ2luSW5kZXhdID0gbmV3Q2hpbGQ7XG4gIH1cbiAgcmV0dXJuIGVkaXRhYmxlO1xufTtcblxuVk5vZGUucHJvdG90eXBlLnJlbW92ZUFmdGVyID0gZnVuY3Rpb24gcmVtb3ZlQWZ0ZXIgKG93bmVySUQsIGxldmVsLCBpbmRleCkge1xuICBpZiAoaW5kZXggPT09IChsZXZlbCA/IDEgPDwgbGV2ZWwgOiAwKSB8fCB0aGlzLmFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHZhciBzaXplSW5kZXggPSAoKGluZGV4IC0gMSkgPj4+IGxldmVsKSAmIE1BU0s7XG4gIGlmIChzaXplSW5kZXggPj0gdGhpcy5hcnJheS5sZW5ndGgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHZhciBuZXdDaGlsZDtcbiAgaWYgKGxldmVsID4gMCkge1xuICAgIHZhciBvbGRDaGlsZCA9IHRoaXMuYXJyYXlbc2l6ZUluZGV4XTtcbiAgICBuZXdDaGlsZCA9XG4gICAgICBvbGRDaGlsZCAmJiBvbGRDaGlsZC5yZW1vdmVBZnRlcihvd25lcklELCBsZXZlbCAtIFNISUZULCBpbmRleCk7XG4gICAgaWYgKG5ld0NoaWxkID09PSBvbGRDaGlsZCAmJiBzaXplSW5kZXggPT09IHRoaXMuYXJyYXkubGVuZ3RoIC0gMSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVkaXRhYmxlID0gZWRpdGFibGVWTm9kZSh0aGlzLCBvd25lcklEKTtcbiAgZWRpdGFibGUuYXJyYXkuc3BsaWNlKHNpemVJbmRleCArIDEpO1xuICBpZiAobmV3Q2hpbGQpIHtcbiAgICBlZGl0YWJsZS5hcnJheVtzaXplSW5kZXhdID0gbmV3Q2hpbGQ7XG4gIH1cbiAgcmV0dXJuIGVkaXRhYmxlO1xufTtcblxudmFyIERPTkUgPSB7fTtcblxuZnVuY3Rpb24gaXRlcmF0ZUxpc3QobGlzdCwgcmV2ZXJzZSkge1xuICB2YXIgbGVmdCA9IGxpc3QuX29yaWdpbjtcbiAgdmFyIHJpZ2h0ID0gbGlzdC5fY2FwYWNpdHk7XG4gIHZhciB0YWlsUG9zID0gZ2V0VGFpbE9mZnNldChyaWdodCk7XG4gIHZhciB0YWlsID0gbGlzdC5fdGFpbDtcblxuICByZXR1cm4gaXRlcmF0ZU5vZGVPckxlYWYobGlzdC5fcm9vdCwgbGlzdC5fbGV2ZWwsIDApO1xuXG4gIGZ1bmN0aW9uIGl0ZXJhdGVOb2RlT3JMZWFmKG5vZGUsIGxldmVsLCBvZmZzZXQpIHtcbiAgICByZXR1cm4gbGV2ZWwgPT09IDBcbiAgICAgID8gaXRlcmF0ZUxlYWYobm9kZSwgb2Zmc2V0KVxuICAgICAgOiBpdGVyYXRlTm9kZShub2RlLCBsZXZlbCwgb2Zmc2V0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGl0ZXJhdGVMZWFmKG5vZGUsIG9mZnNldCkge1xuICAgIHZhciBhcnJheSA9IG9mZnNldCA9PT0gdGFpbFBvcyA/IHRhaWwgJiYgdGFpbC5hcnJheSA6IG5vZGUgJiYgbm9kZS5hcnJheTtcbiAgICB2YXIgZnJvbSA9IG9mZnNldCA+IGxlZnQgPyAwIDogbGVmdCAtIG9mZnNldDtcbiAgICB2YXIgdG8gPSByaWdodCAtIG9mZnNldDtcbiAgICBpZiAodG8gPiBTSVpFKSB7XG4gICAgICB0byA9IFNJWkU7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAgICAgcmV0dXJuIERPTkU7XG4gICAgICB9XG4gICAgICB2YXIgaWR4ID0gcmV2ZXJzZSA/IC0tdG8gOiBmcm9tKys7XG4gICAgICByZXR1cm4gYXJyYXkgJiYgYXJyYXlbaWR4XTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gaXRlcmF0ZU5vZGUobm9kZSwgbGV2ZWwsIG9mZnNldCkge1xuICAgIHZhciB2YWx1ZXM7XG4gICAgdmFyIGFycmF5ID0gbm9kZSAmJiBub2RlLmFycmF5O1xuICAgIHZhciBmcm9tID0gb2Zmc2V0ID4gbGVmdCA/IDAgOiAobGVmdCAtIG9mZnNldCkgPj4gbGV2ZWw7XG4gICAgdmFyIHRvID0gKChyaWdodCAtIG9mZnNldCkgPj4gbGV2ZWwpICsgMTtcbiAgICBpZiAodG8gPiBTSVpFKSB7XG4gICAgICB0byA9IFNJWkU7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAodmFsdWVzKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gdmFsdWVzKCk7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSBET05FKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhbHVlcyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZyb20gPT09IHRvKSB7XG4gICAgICAgICAgcmV0dXJuIERPTkU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGlkeCA9IHJldmVyc2UgPyAtLXRvIDogZnJvbSsrO1xuICAgICAgICB2YWx1ZXMgPSBpdGVyYXRlTm9kZU9yTGVhZihcbiAgICAgICAgICBhcnJheSAmJiBhcnJheVtpZHhdLFxuICAgICAgICAgIGxldmVsIC0gU0hJRlQsXG4gICAgICAgICAgb2Zmc2V0ICsgKGlkeCA8PCBsZXZlbClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIG1ha2VMaXN0KG9yaWdpbiwgY2FwYWNpdHksIGxldmVsLCByb290LCB0YWlsLCBvd25lcklELCBoYXNoKSB7XG4gIHZhciBsaXN0ID0gT2JqZWN0LmNyZWF0ZShMaXN0UHJvdG90eXBlKTtcbiAgbGlzdC5zaXplID0gY2FwYWNpdHkgLSBvcmlnaW47XG4gIGxpc3QuX29yaWdpbiA9IG9yaWdpbjtcbiAgbGlzdC5fY2FwYWNpdHkgPSBjYXBhY2l0eTtcbiAgbGlzdC5fbGV2ZWwgPSBsZXZlbDtcbiAgbGlzdC5fcm9vdCA9IHJvb3Q7XG4gIGxpc3QuX3RhaWwgPSB0YWlsO1xuICBsaXN0Ll9fb3duZXJJRCA9IG93bmVySUQ7XG4gIGxpc3QuX19oYXNoID0gaGFzaDtcbiAgbGlzdC5fX2FsdGVyZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGxpc3Q7XG59XG5cbnZhciBFTVBUWV9MSVNUO1xuZnVuY3Rpb24gZW1wdHlMaXN0KCkge1xuICByZXR1cm4gRU1QVFlfTElTVCB8fCAoRU1QVFlfTElTVCA9IG1ha2VMaXN0KDAsIDAsIFNISUZUKSk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUxpc3QobGlzdCwgaW5kZXgsIHZhbHVlKSB7XG4gIGluZGV4ID0gd3JhcEluZGV4KGxpc3QsIGluZGV4KTtcblxuICBpZiAoaW5kZXggIT09IGluZGV4KSB7XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICBpZiAoaW5kZXggPj0gbGlzdC5zaXplIHx8IGluZGV4IDwgMCkge1xuICAgIHJldHVybiBsaXN0LndpdGhNdXRhdGlvbnMoZnVuY3Rpb24gKGxpc3QpIHtcbiAgICAgIGluZGV4IDwgMFxuICAgICAgICA/IHNldExpc3RCb3VuZHMobGlzdCwgaW5kZXgpLnNldCgwLCB2YWx1ZSlcbiAgICAgICAgOiBzZXRMaXN0Qm91bmRzKGxpc3QsIDAsIGluZGV4ICsgMSkuc2V0KGluZGV4LCB2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBpbmRleCArPSBsaXN0Ll9vcmlnaW47XG5cbiAgdmFyIG5ld1RhaWwgPSBsaXN0Ll90YWlsO1xuICB2YXIgbmV3Um9vdCA9IGxpc3QuX3Jvb3Q7XG4gIHZhciBkaWRBbHRlciA9IE1ha2VSZWYoKTtcbiAgaWYgKGluZGV4ID49IGdldFRhaWxPZmZzZXQobGlzdC5fY2FwYWNpdHkpKSB7XG4gICAgbmV3VGFpbCA9IHVwZGF0ZVZOb2RlKG5ld1RhaWwsIGxpc3QuX19vd25lcklELCAwLCBpbmRleCwgdmFsdWUsIGRpZEFsdGVyKTtcbiAgfSBlbHNlIHtcbiAgICBuZXdSb290ID0gdXBkYXRlVk5vZGUoXG4gICAgICBuZXdSb290LFxuICAgICAgbGlzdC5fX293bmVySUQsXG4gICAgICBsaXN0Ll9sZXZlbCxcbiAgICAgIGluZGV4LFxuICAgICAgdmFsdWUsXG4gICAgICBkaWRBbHRlclxuICAgICk7XG4gIH1cblxuICBpZiAoIWRpZEFsdGVyLnZhbHVlKSB7XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICBpZiAobGlzdC5fX293bmVySUQpIHtcbiAgICBsaXN0Ll9yb290ID0gbmV3Um9vdDtcbiAgICBsaXN0Ll90YWlsID0gbmV3VGFpbDtcbiAgICBsaXN0Ll9faGFzaCA9IHVuZGVmaW5lZDtcbiAgICBsaXN0Ll9fYWx0ZXJlZCA9IHRydWU7XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cbiAgcmV0dXJuIG1ha2VMaXN0KGxpc3QuX29yaWdpbiwgbGlzdC5fY2FwYWNpdHksIGxpc3QuX2xldmVsLCBuZXdSb290LCBuZXdUYWlsKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlVk5vZGUobm9kZSwgb3duZXJJRCwgbGV2ZWwsIGluZGV4LCB2YWx1ZSwgZGlkQWx0ZXIpIHtcbiAgdmFyIGlkeCA9IChpbmRleCA+Pj4gbGV2ZWwpICYgTUFTSztcbiAgdmFyIG5vZGVIYXMgPSBub2RlICYmIGlkeCA8IG5vZGUuYXJyYXkubGVuZ3RoO1xuICBpZiAoIW5vZGVIYXMgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgdmFyIG5ld05vZGU7XG5cbiAgaWYgKGxldmVsID4gMCkge1xuICAgIHZhciBsb3dlck5vZGUgPSBub2RlICYmIG5vZGUuYXJyYXlbaWR4XTtcbiAgICB2YXIgbmV3TG93ZXJOb2RlID0gdXBkYXRlVk5vZGUoXG4gICAgICBsb3dlck5vZGUsXG4gICAgICBvd25lcklELFxuICAgICAgbGV2ZWwgLSBTSElGVCxcbiAgICAgIGluZGV4LFxuICAgICAgdmFsdWUsXG4gICAgICBkaWRBbHRlclxuICAgICk7XG4gICAgaWYgKG5ld0xvd2VyTm9kZSA9PT0gbG93ZXJOb2RlKSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgbmV3Tm9kZSA9IGVkaXRhYmxlVk5vZGUobm9kZSwgb3duZXJJRCk7XG4gICAgbmV3Tm9kZS5hcnJheVtpZHhdID0gbmV3TG93ZXJOb2RlO1xuICAgIHJldHVybiBuZXdOb2RlO1xuICB9XG5cbiAgaWYgKG5vZGVIYXMgJiYgbm9kZS5hcnJheVtpZHhdID09PSB2YWx1ZSkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgaWYgKGRpZEFsdGVyKSB7XG4gICAgU2V0UmVmKGRpZEFsdGVyKTtcbiAgfVxuXG4gIG5ld05vZGUgPSBlZGl0YWJsZVZOb2RlKG5vZGUsIG93bmVySUQpO1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBpZHggPT09IG5ld05vZGUuYXJyYXkubGVuZ3RoIC0gMSkge1xuICAgIG5ld05vZGUuYXJyYXkucG9wKCk7XG4gIH0gZWxzZSB7XG4gICAgbmV3Tm9kZS5hcnJheVtpZHhdID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIG5ld05vZGU7XG59XG5cbmZ1bmN0aW9uIGVkaXRhYmxlVk5vZGUobm9kZSwgb3duZXJJRCkge1xuICBpZiAob3duZXJJRCAmJiBub2RlICYmIG93bmVySUQgPT09IG5vZGUub3duZXJJRCkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG4gIHJldHVybiBuZXcgVk5vZGUobm9kZSA/IG5vZGUuYXJyYXkuc2xpY2UoKSA6IFtdLCBvd25lcklEKTtcbn1cblxuZnVuY3Rpb24gbGlzdE5vZGVGb3IobGlzdCwgcmF3SW5kZXgpIHtcbiAgaWYgKHJhd0luZGV4ID49IGdldFRhaWxPZmZzZXQobGlzdC5fY2FwYWNpdHkpKSB7XG4gICAgcmV0dXJuIGxpc3QuX3RhaWw7XG4gIH1cbiAgaWYgKHJhd0luZGV4IDwgMSA8PCAobGlzdC5fbGV2ZWwgKyBTSElGVCkpIHtcbiAgICB2YXIgbm9kZSA9IGxpc3QuX3Jvb3Q7XG4gICAgdmFyIGxldmVsID0gbGlzdC5fbGV2ZWw7XG4gICAgd2hpbGUgKG5vZGUgJiYgbGV2ZWwgPiAwKSB7XG4gICAgICBub2RlID0gbm9kZS5hcnJheVsocmF3SW5kZXggPj4+IGxldmVsKSAmIE1BU0tdO1xuICAgICAgbGV2ZWwgLT0gU0hJRlQ7XG4gICAgfVxuICAgIHJldHVybiBub2RlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldExpc3RCb3VuZHMobGlzdCwgYmVnaW4sIGVuZCkge1xuICAvLyBTYW5pdGl6ZSBiZWdpbiAmIGVuZCB1c2luZyB0aGlzIHNob3J0aGFuZCBmb3IgVG9JbnQzMihhcmd1bWVudClcbiAgLy8gaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXRvaW50MzJcbiAgaWYgKGJlZ2luICE9PSB1bmRlZmluZWQpIHtcbiAgICBiZWdpbiB8PSAwO1xuICB9XG4gIGlmIChlbmQgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCB8PSAwO1xuICB9XG4gIHZhciBvd25lciA9IGxpc3QuX19vd25lcklEIHx8IG5ldyBPd25lcklEKCk7XG4gIHZhciBvbGRPcmlnaW4gPSBsaXN0Ll9vcmlnaW47XG4gIHZhciBvbGRDYXBhY2l0eSA9IGxpc3QuX2NhcGFjaXR5O1xuICB2YXIgbmV3T3JpZ2luID0gb2xkT3JpZ2luICsgYmVnaW47XG4gIHZhciBuZXdDYXBhY2l0eSA9XG4gICAgZW5kID09PSB1bmRlZmluZWRcbiAgICAgID8gb2xkQ2FwYWNpdHlcbiAgICAgIDogZW5kIDwgMFxuICAgICAgICA/IG9sZENhcGFjaXR5ICsgZW5kXG4gICAgICAgIDogb2xkT3JpZ2luICsgZW5kO1xuICBpZiAobmV3T3JpZ2luID09PSBvbGRPcmlnaW4gJiYgbmV3Q2FwYWNpdHkgPT09IG9sZENhcGFjaXR5KSB7XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICAvLyBJZiBpdCdzIGdvaW5nIHRvIGVuZCBhZnRlciBpdCBzdGFydHMsIGl0J3MgZW1wdHkuXG4gIGlmIChuZXdPcmlnaW4gPj0gbmV3Q2FwYWNpdHkpIHtcbiAgICByZXR1cm4gbGlzdC5jbGVhcigpO1xuICB9XG5cbiAgdmFyIG5ld0xldmVsID0gbGlzdC5fbGV2ZWw7XG4gIHZhciBuZXdSb290ID0gbGlzdC5fcm9vdDtcblxuICAvLyBOZXcgb3JpZ2luIG1pZ2h0IG5lZWQgY3JlYXRpbmcgYSBoaWdoZXIgcm9vdC5cbiAgdmFyIG9mZnNldFNoaWZ0ID0gMDtcbiAgd2hpbGUgKG5ld09yaWdpbiArIG9mZnNldFNoaWZ0IDwgMCkge1xuICAgIG5ld1Jvb3QgPSBuZXcgVk5vZGUoXG4gICAgICBuZXdSb290ICYmIG5ld1Jvb3QuYXJyYXkubGVuZ3RoID8gW3VuZGVmaW5lZCwgbmV3Um9vdF0gOiBbXSxcbiAgICAgIG93bmVyXG4gICAgKTtcbiAgICBuZXdMZXZlbCArPSBTSElGVDtcbiAgICBvZmZzZXRTaGlmdCArPSAxIDw8IG5ld0xldmVsO1xuICB9XG4gIGlmIChvZmZzZXRTaGlmdCkge1xuICAgIG5ld09yaWdpbiArPSBvZmZzZXRTaGlmdDtcbiAgICBvbGRPcmlnaW4gKz0gb2Zmc2V0U2hpZnQ7XG4gICAgbmV3Q2FwYWNpdHkgKz0gb2Zmc2V0U2hpZnQ7XG4gICAgb2xkQ2FwYWNpdHkgKz0gb2Zmc2V0U2hpZnQ7XG4gIH1cblxuICB2YXIgb2xkVGFpbE9mZnNldCA9IGdldFRhaWxPZmZzZXQob2xkQ2FwYWNpdHkpO1xuICB2YXIgbmV3VGFpbE9mZnNldCA9IGdldFRhaWxPZmZzZXQobmV3Q2FwYWNpdHkpO1xuXG4gIC8vIE5ldyBzaXplIG1pZ2h0IG5lZWQgY3JlYXRpbmcgYSBoaWdoZXIgcm9vdC5cbiAgd2hpbGUgKG5ld1RhaWxPZmZzZXQgPj0gMSA8PCAobmV3TGV2ZWwgKyBTSElGVCkpIHtcbiAgICBuZXdSb290ID0gbmV3IFZOb2RlKFxuICAgICAgbmV3Um9vdCAmJiBuZXdSb290LmFycmF5Lmxlbmd0aCA/IFtuZXdSb290XSA6IFtdLFxuICAgICAgb3duZXJcbiAgICApO1xuICAgIG5ld0xldmVsICs9IFNISUZUO1xuICB9XG5cbiAgLy8gTG9jYXRlIG9yIGNyZWF0ZSB0aGUgbmV3IHRhaWwuXG4gIHZhciBvbGRUYWlsID0gbGlzdC5fdGFpbDtcbiAgdmFyIG5ld1RhaWwgPVxuICAgIG5ld1RhaWxPZmZzZXQgPCBvbGRUYWlsT2Zmc2V0XG4gICAgICA/IGxpc3ROb2RlRm9yKGxpc3QsIG5ld0NhcGFjaXR5IC0gMSlcbiAgICAgIDogbmV3VGFpbE9mZnNldCA+IG9sZFRhaWxPZmZzZXRcbiAgICAgICAgPyBuZXcgVk5vZGUoW10sIG93bmVyKVxuICAgICAgICA6IG9sZFRhaWw7XG5cbiAgLy8gTWVyZ2UgVGFpbCBpbnRvIHRyZWUuXG4gIGlmIChcbiAgICBvbGRUYWlsICYmXG4gICAgbmV3VGFpbE9mZnNldCA+IG9sZFRhaWxPZmZzZXQgJiZcbiAgICBuZXdPcmlnaW4gPCBvbGRDYXBhY2l0eSAmJlxuICAgIG9sZFRhaWwuYXJyYXkubGVuZ3RoXG4gICkge1xuICAgIG5ld1Jvb3QgPSBlZGl0YWJsZVZOb2RlKG5ld1Jvb3QsIG93bmVyKTtcbiAgICB2YXIgbm9kZSA9IG5ld1Jvb3Q7XG4gICAgZm9yICh2YXIgbGV2ZWwgPSBuZXdMZXZlbDsgbGV2ZWwgPiBTSElGVDsgbGV2ZWwgLT0gU0hJRlQpIHtcbiAgICAgIHZhciBpZHggPSAob2xkVGFpbE9mZnNldCA+Pj4gbGV2ZWwpICYgTUFTSztcbiAgICAgIG5vZGUgPSBub2RlLmFycmF5W2lkeF0gPSBlZGl0YWJsZVZOb2RlKG5vZGUuYXJyYXlbaWR4XSwgb3duZXIpO1xuICAgIH1cbiAgICBub2RlLmFycmF5WyhvbGRUYWlsT2Zmc2V0ID4+PiBTSElGVCkgJiBNQVNLXSA9IG9sZFRhaWw7XG4gIH1cblxuICAvLyBJZiB0aGUgc2l6ZSBoYXMgYmVlbiByZWR1Y2VkLCB0aGVyZSdzIGEgY2hhbmNlIHRoZSB0YWlsIG5lZWRzIHRvIGJlIHRyaW1tZWQuXG4gIGlmIChuZXdDYXBhY2l0eSA8IG9sZENhcGFjaXR5KSB7XG4gICAgbmV3VGFpbCA9IG5ld1RhaWwgJiYgbmV3VGFpbC5yZW1vdmVBZnRlcihvd25lciwgMCwgbmV3Q2FwYWNpdHkpO1xuICB9XG5cbiAgLy8gSWYgdGhlIG5ldyBvcmlnaW4gaXMgd2l0aGluIHRoZSB0YWlsLCB0aGVuIHdlIGRvIG5vdCBuZWVkIGEgcm9vdC5cbiAgaWYgKG5ld09yaWdpbiA+PSBuZXdUYWlsT2Zmc2V0KSB7XG4gICAgbmV3T3JpZ2luIC09IG5ld1RhaWxPZmZzZXQ7XG4gICAgbmV3Q2FwYWNpdHkgLT0gbmV3VGFpbE9mZnNldDtcbiAgICBuZXdMZXZlbCA9IFNISUZUO1xuICAgIG5ld1Jvb3QgPSBudWxsO1xuICAgIG5ld1RhaWwgPSBuZXdUYWlsICYmIG5ld1RhaWwucmVtb3ZlQmVmb3JlKG93bmVyLCAwLCBuZXdPcmlnaW4pO1xuXG4gICAgLy8gT3RoZXJ3aXNlLCBpZiB0aGUgcm9vdCBoYXMgYmVlbiB0cmltbWVkLCBnYXJiYWdlIGNvbGxlY3QuXG4gIH0gZWxzZSBpZiAobmV3T3JpZ2luID4gb2xkT3JpZ2luIHx8IG5ld1RhaWxPZmZzZXQgPCBvbGRUYWlsT2Zmc2V0KSB7XG4gICAgb2Zmc2V0U2hpZnQgPSAwO1xuXG4gICAgLy8gSWRlbnRpZnkgdGhlIG5ldyB0b3Agcm9vdCBub2RlIG9mIHRoZSBzdWJ0cmVlIG9mIHRoZSBvbGQgcm9vdC5cbiAgICB3aGlsZSAobmV3Um9vdCkge1xuICAgICAgdmFyIGJlZ2luSW5kZXggPSAobmV3T3JpZ2luID4+PiBuZXdMZXZlbCkgJiBNQVNLO1xuICAgICAgaWYgKChiZWdpbkluZGV4ICE9PSBuZXdUYWlsT2Zmc2V0ID4+PiBuZXdMZXZlbCkgJiBNQVNLKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGJlZ2luSW5kZXgpIHtcbiAgICAgICAgb2Zmc2V0U2hpZnQgKz0gKDEgPDwgbmV3TGV2ZWwpICogYmVnaW5JbmRleDtcbiAgICAgIH1cbiAgICAgIG5ld0xldmVsIC09IFNISUZUO1xuICAgICAgbmV3Um9vdCA9IG5ld1Jvb3QuYXJyYXlbYmVnaW5JbmRleF07XG4gICAgfVxuXG4gICAgLy8gVHJpbSB0aGUgbmV3IHNpZGVzIG9mIHRoZSBuZXcgcm9vdC5cbiAgICBpZiAobmV3Um9vdCAmJiBuZXdPcmlnaW4gPiBvbGRPcmlnaW4pIHtcbiAgICAgIG5ld1Jvb3QgPSBuZXdSb290LnJlbW92ZUJlZm9yZShvd25lciwgbmV3TGV2ZWwsIG5ld09yaWdpbiAtIG9mZnNldFNoaWZ0KTtcbiAgICB9XG4gICAgaWYgKG5ld1Jvb3QgJiYgbmV3VGFpbE9mZnNldCA8IG9sZFRhaWxPZmZzZXQpIHtcbiAgICAgIG5ld1Jvb3QgPSBuZXdSb290LnJlbW92ZUFmdGVyKFxuICAgICAgICBvd25lcixcbiAgICAgICAgbmV3TGV2ZWwsXG4gICAgICAgIG5ld1RhaWxPZmZzZXQgLSBvZmZzZXRTaGlmdFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG9mZnNldFNoaWZ0KSB7XG4gICAgICBuZXdPcmlnaW4gLT0gb2Zmc2V0U2hpZnQ7XG4gICAgICBuZXdDYXBhY2l0eSAtPSBvZmZzZXRTaGlmdDtcbiAgICB9XG4gIH1cblxuICBpZiAobGlzdC5fX293bmVySUQpIHtcbiAgICBsaXN0LnNpemUgPSBuZXdDYXBhY2l0eSAtIG5ld09yaWdpbjtcbiAgICBsaXN0Ll9vcmlnaW4gPSBuZXdPcmlnaW47XG4gICAgbGlzdC5fY2FwYWNpdHkgPSBuZXdDYXBhY2l0eTtcbiAgICBsaXN0Ll9sZXZlbCA9IG5ld0xldmVsO1xuICAgIGxpc3QuX3Jvb3QgPSBuZXdSb290O1xuICAgIGxpc3QuX3RhaWwgPSBuZXdUYWlsO1xuICAgIGxpc3QuX19oYXNoID0gdW5kZWZpbmVkO1xuICAgIGxpc3QuX19hbHRlcmVkID0gdHJ1ZTtcbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuICByZXR1cm4gbWFrZUxpc3QobmV3T3JpZ2luLCBuZXdDYXBhY2l0eSwgbmV3TGV2ZWwsIG5ld1Jvb3QsIG5ld1RhaWwpO1xufVxuXG5mdW5jdGlvbiBnZXRUYWlsT2Zmc2V0KHNpemUpIHtcbiAgcmV0dXJuIHNpemUgPCBTSVpFID8gMCA6ICgoc2l6ZSAtIDEpID4+PiBTSElGVCkgPDwgU0hJRlQ7XG59XG5cbnZhciBPcmRlcmVkTWFwID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoTWFwJCQxKSB7XG4gIGZ1bmN0aW9uIE9yZGVyZWRNYXAodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgPyBlbXB0eU9yZGVyZWRNYXAoKVxuICAgICAgOiBpc09yZGVyZWRNYXAodmFsdWUpXG4gICAgICAgID8gdmFsdWVcbiAgICAgICAgOiBlbXB0eU9yZGVyZWRNYXAoKS53aXRoTXV0YXRpb25zKGZ1bmN0aW9uIChtYXApIHtcbiAgICAgICAgICAgIHZhciBpdGVyID0gS2V5ZWRDb2xsZWN0aW9uKHZhbHVlKTtcbiAgICAgICAgICAgIGFzc2VydE5vdEluZmluaXRlKGl0ZXIuc2l6ZSk7XG4gICAgICAgICAgICBpdGVyLmZvckVhY2goZnVuY3Rpb24gKHYsIGspIHsgcmV0dXJuIG1hcC5zZXQoaywgdik7IH0pO1xuICAgICAgICAgIH0pO1xuICB9XG5cbiAgaWYgKCBNYXAkJDEgKSBPcmRlcmVkTWFwLl9fcHJvdG9fXyA9IE1hcCQkMTtcbiAgT3JkZXJlZE1hcC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXAkJDEgJiYgTWFwJCQxLnByb3RvdHlwZSApO1xuICBPcmRlcmVkTWFwLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE9yZGVyZWRNYXA7XG5cbiAgT3JkZXJlZE1hcC5vZiA9IGZ1bmN0aW9uIG9mICgvKi4uLnZhbHVlcyovKSB7XG4gICAgcmV0dXJuIHRoaXMoYXJndW1lbnRzKTtcbiAgfTtcblxuICBPcmRlcmVkTWFwLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCdPcmRlcmVkTWFwIHsnLCAnfScpO1xuICB9O1xuXG4gIC8vIEBwcmFnbWEgQWNjZXNzXG5cbiAgT3JkZXJlZE1hcC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChrLCBub3RTZXRWYWx1ZSkge1xuICAgIHZhciBpbmRleCA9IHRoaXMuX21hcC5nZXQoayk7XG4gICAgcmV0dXJuIGluZGV4ICE9PSB1bmRlZmluZWQgPyB0aGlzLl9saXN0LmdldChpbmRleClbMV0gOiBub3RTZXRWYWx1ZTtcbiAgfTtcblxuICAvLyBAcHJhZ21hIE1vZGlmaWNhdGlvblxuXG4gIE9yZGVyZWRNYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIgKCkge1xuICAgIGlmICh0aGlzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fX293bmVySUQpIHtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgICB0aGlzLl9tYXAuY2xlYXIoKTtcbiAgICAgIHRoaXMuX2xpc3QuY2xlYXIoKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gZW1wdHlPcmRlcmVkTWFwKCk7XG4gIH07XG5cbiAgT3JkZXJlZE1hcC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gc2V0IChrLCB2KSB7XG4gICAgcmV0dXJuIHVwZGF0ZU9yZGVyZWRNYXAodGhpcywgaywgdik7XG4gIH07XG5cbiAgT3JkZXJlZE1hcC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlIChrKSB7XG4gICAgcmV0dXJuIHVwZGF0ZU9yZGVyZWRNYXAodGhpcywgaywgTk9UX1NFVCk7XG4gIH07XG5cbiAgT3JkZXJlZE1hcC5wcm90b3R5cGUud2FzQWx0ZXJlZCA9IGZ1bmN0aW9uIHdhc0FsdGVyZWQgKCkge1xuICAgIHJldHVybiB0aGlzLl9tYXAud2FzQWx0ZXJlZCgpIHx8IHRoaXMuX2xpc3Qud2FzQWx0ZXJlZCgpO1xuICB9O1xuXG4gIE9yZGVyZWRNYXAucHJvdG90eXBlLl9faXRlcmF0ZSA9IGZ1bmN0aW9uIF9faXRlcmF0ZSAoZm4sIHJldmVyc2UpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHJldHVybiB0aGlzLl9saXN0Ll9faXRlcmF0ZShcbiAgICAgIGZ1bmN0aW9uIChlbnRyeSkgeyByZXR1cm4gZW50cnkgJiYgZm4oZW50cnlbMV0sIGVudHJ5WzBdLCB0aGlzJDEpOyB9LFxuICAgICAgcmV2ZXJzZVxuICAgICk7XG4gIH07XG5cbiAgT3JkZXJlZE1hcC5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uIF9faXRlcmF0b3IgKHR5cGUsIHJldmVyc2UpIHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdC5mcm9tRW50cnlTZXEoKS5fX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpO1xuICB9O1xuXG4gIE9yZGVyZWRNYXAucHJvdG90eXBlLl9fZW5zdXJlT3duZXIgPSBmdW5jdGlvbiBfX2Vuc3VyZU93bmVyIChvd25lcklEKSB7XG4gICAgaWYgKG93bmVySUQgPT09IHRoaXMuX19vd25lcklEKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdmFyIG5ld01hcCA9IHRoaXMuX21hcC5fX2Vuc3VyZU93bmVyKG93bmVySUQpO1xuICAgIHZhciBuZXdMaXN0ID0gdGhpcy5fbGlzdC5fX2Vuc3VyZU93bmVyKG93bmVySUQpO1xuICAgIGlmICghb3duZXJJRCkge1xuICAgICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZW1wdHlPcmRlcmVkTWFwKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9fb3duZXJJRCA9IG93bmVySUQ7XG4gICAgICB0aGlzLl9tYXAgPSBuZXdNYXA7XG4gICAgICB0aGlzLl9saXN0ID0gbmV3TGlzdDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gbWFrZU9yZGVyZWRNYXAobmV3TWFwLCBuZXdMaXN0LCBvd25lcklELCB0aGlzLl9faGFzaCk7XG4gIH07XG5cbiAgcmV0dXJuIE9yZGVyZWRNYXA7XG59KE1hcCkpO1xuXG5PcmRlcmVkTWFwLmlzT3JkZXJlZE1hcCA9IGlzT3JkZXJlZE1hcDtcblxuT3JkZXJlZE1hcC5wcm90b3R5cGVbSVNfT1JERVJFRF9TWU1CT0xdID0gdHJ1ZTtcbk9yZGVyZWRNYXAucHJvdG90eXBlW0RFTEVURV0gPSBPcmRlcmVkTWFwLnByb3RvdHlwZS5yZW1vdmU7XG5cbmZ1bmN0aW9uIG1ha2VPcmRlcmVkTWFwKG1hcCwgbGlzdCwgb3duZXJJRCwgaGFzaCkge1xuICB2YXIgb21hcCA9IE9iamVjdC5jcmVhdGUoT3JkZXJlZE1hcC5wcm90b3R5cGUpO1xuICBvbWFwLnNpemUgPSBtYXAgPyBtYXAuc2l6ZSA6IDA7XG4gIG9tYXAuX21hcCA9IG1hcDtcbiAgb21hcC5fbGlzdCA9IGxpc3Q7XG4gIG9tYXAuX19vd25lcklEID0gb3duZXJJRDtcbiAgb21hcC5fX2hhc2ggPSBoYXNoO1xuICByZXR1cm4gb21hcDtcbn1cblxudmFyIEVNUFRZX09SREVSRURfTUFQO1xuZnVuY3Rpb24gZW1wdHlPcmRlcmVkTWFwKCkge1xuICByZXR1cm4gKFxuICAgIEVNUFRZX09SREVSRURfTUFQIHx8XG4gICAgKEVNUFRZX09SREVSRURfTUFQID0gbWFrZU9yZGVyZWRNYXAoZW1wdHlNYXAoKSwgZW1wdHlMaXN0KCkpKVxuICApO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVPcmRlcmVkTWFwKG9tYXAsIGssIHYpIHtcbiAgdmFyIG1hcCA9IG9tYXAuX21hcDtcbiAgdmFyIGxpc3QgPSBvbWFwLl9saXN0O1xuICB2YXIgaSA9IG1hcC5nZXQoayk7XG4gIHZhciBoYXMgPSBpICE9PSB1bmRlZmluZWQ7XG4gIHZhciBuZXdNYXA7XG4gIHZhciBuZXdMaXN0O1xuICBpZiAodiA9PT0gTk9UX1NFVCkge1xuICAgIC8vIHJlbW92ZWRcbiAgICBpZiAoIWhhcykge1xuICAgICAgcmV0dXJuIG9tYXA7XG4gICAgfVxuICAgIGlmIChsaXN0LnNpemUgPj0gU0laRSAmJiBsaXN0LnNpemUgPj0gbWFwLnNpemUgKiAyKSB7XG4gICAgICBuZXdMaXN0ID0gbGlzdC5maWx0ZXIoZnVuY3Rpb24gKGVudHJ5LCBpZHgpIHsgcmV0dXJuIGVudHJ5ICE9PSB1bmRlZmluZWQgJiYgaSAhPT0gaWR4OyB9KTtcbiAgICAgIG5ld01hcCA9IG5ld0xpc3RcbiAgICAgICAgLnRvS2V5ZWRTZXEoKVxuICAgICAgICAubWFwKGZ1bmN0aW9uIChlbnRyeSkgeyByZXR1cm4gZW50cnlbMF07IH0pXG4gICAgICAgIC5mbGlwKClcbiAgICAgICAgLnRvTWFwKCk7XG4gICAgICBpZiAob21hcC5fX293bmVySUQpIHtcbiAgICAgICAgbmV3TWFwLl9fb3duZXJJRCA9IG5ld0xpc3QuX19vd25lcklEID0gb21hcC5fX293bmVySUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld01hcCA9IG1hcC5yZW1vdmUoayk7XG4gICAgICBuZXdMaXN0ID0gaSA9PT0gbGlzdC5zaXplIC0gMSA/IGxpc3QucG9wKCkgOiBsaXN0LnNldChpLCB1bmRlZmluZWQpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChoYXMpIHtcbiAgICBpZiAodiA9PT0gbGlzdC5nZXQoaSlbMV0pIHtcbiAgICAgIHJldHVybiBvbWFwO1xuICAgIH1cbiAgICBuZXdNYXAgPSBtYXA7XG4gICAgbmV3TGlzdCA9IGxpc3Quc2V0KGksIFtrLCB2XSk7XG4gIH0gZWxzZSB7XG4gICAgbmV3TWFwID0gbWFwLnNldChrLCBsaXN0LnNpemUpO1xuICAgIG5ld0xpc3QgPSBsaXN0LnNldChsaXN0LnNpemUsIFtrLCB2XSk7XG4gIH1cbiAgaWYgKG9tYXAuX19vd25lcklEKSB7XG4gICAgb21hcC5zaXplID0gbmV3TWFwLnNpemU7XG4gICAgb21hcC5fbWFwID0gbmV3TWFwO1xuICAgIG9tYXAuX2xpc3QgPSBuZXdMaXN0O1xuICAgIG9tYXAuX19oYXNoID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBvbWFwO1xuICB9XG4gIHJldHVybiBtYWtlT3JkZXJlZE1hcChuZXdNYXAsIG5ld0xpc3QpO1xufVxuXG52YXIgSVNfU1RBQ0tfU1lNQk9MID0gJ0BAX19JTU1VVEFCTEVfU1RBQ0tfX0BAJztcblxuZnVuY3Rpb24gaXNTdGFjayhtYXliZVN0YWNrKSB7XG4gIHJldHVybiBCb29sZWFuKG1heWJlU3RhY2sgJiYgbWF5YmVTdGFja1tJU19TVEFDS19TWU1CT0xdKTtcbn1cblxudmFyIFN0YWNrID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoSW5kZXhlZENvbGxlY3Rpb24kJDEpIHtcbiAgZnVuY3Rpb24gU3RhY2sodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgPyBlbXB0eVN0YWNrKClcbiAgICAgIDogaXNTdGFjayh2YWx1ZSlcbiAgICAgICAgPyB2YWx1ZVxuICAgICAgICA6IGVtcHR5U3RhY2soKS5wdXNoQWxsKHZhbHVlKTtcbiAgfVxuXG4gIGlmICggSW5kZXhlZENvbGxlY3Rpb24kJDEgKSBTdGFjay5fX3Byb3RvX18gPSBJbmRleGVkQ29sbGVjdGlvbiQkMTtcbiAgU3RhY2sucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggSW5kZXhlZENvbGxlY3Rpb24kJDEgJiYgSW5kZXhlZENvbGxlY3Rpb24kJDEucHJvdG90eXBlICk7XG4gIFN0YWNrLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFN0YWNrO1xuXG4gIFN0YWNrLm9mID0gZnVuY3Rpb24gb2YgKC8qLi4udmFsdWVzKi8pIHtcbiAgICByZXR1cm4gdGhpcyhhcmd1bWVudHMpO1xuICB9O1xuXG4gIFN0YWNrLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCdTdGFjayBbJywgJ10nKTtcbiAgfTtcblxuICAvLyBAcHJhZ21hIEFjY2Vzc1xuXG4gIFN0YWNrLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKGluZGV4LCBub3RTZXRWYWx1ZSkge1xuICAgIHZhciBoZWFkID0gdGhpcy5faGVhZDtcbiAgICBpbmRleCA9IHdyYXBJbmRleCh0aGlzLCBpbmRleCk7XG4gICAgd2hpbGUgKGhlYWQgJiYgaW5kZXgtLSkge1xuICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICB9XG4gICAgcmV0dXJuIGhlYWQgPyBoZWFkLnZhbHVlIDogbm90U2V0VmFsdWU7XG4gIH07XG5cbiAgU3RhY2sucHJvdG90eXBlLnBlZWsgPSBmdW5jdGlvbiBwZWVrICgpIHtcbiAgICByZXR1cm4gdGhpcy5faGVhZCAmJiB0aGlzLl9oZWFkLnZhbHVlO1xuICB9O1xuXG4gIC8vIEBwcmFnbWEgTW9kaWZpY2F0aW9uXG5cbiAgU3RhY2sucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiBwdXNoICgvKi4uLnZhbHVlcyovKSB7XG4gICAgdmFyIGFyZ3VtZW50cyQxID0gYXJndW1lbnRzO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB2YXIgbmV3U2l6ZSA9IHRoaXMuc2l6ZSArIGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGhlYWQgPSB0aGlzLl9oZWFkO1xuICAgIGZvciAodmFyIGlpID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7IGlpID49IDA7IGlpLS0pIHtcbiAgICAgIGhlYWQgPSB7XG4gICAgICAgIHZhbHVlOiBhcmd1bWVudHMkMVtpaV0sXG4gICAgICAgIG5leHQ6IGhlYWQsXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5fX293bmVySUQpIHtcbiAgICAgIHRoaXMuc2l6ZSA9IG5ld1NpemU7XG4gICAgICB0aGlzLl9oZWFkID0gaGVhZDtcbiAgICAgIHRoaXMuX19oYXNoID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fX2FsdGVyZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBtYWtlU3RhY2sobmV3U2l6ZSwgaGVhZCk7XG4gIH07XG5cbiAgU3RhY2sucHJvdG90eXBlLnB1c2hBbGwgPSBmdW5jdGlvbiBwdXNoQWxsIChpdGVyKSB7XG4gICAgaXRlciA9IEluZGV4ZWRDb2xsZWN0aW9uJCQxKGl0ZXIpO1xuICAgIGlmIChpdGVyLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaXplID09PSAwICYmIGlzU3RhY2soaXRlcikpIHtcbiAgICAgIHJldHVybiBpdGVyO1xuICAgIH1cbiAgICBhc3NlcnROb3RJbmZpbml0ZShpdGVyLnNpemUpO1xuICAgIHZhciBuZXdTaXplID0gdGhpcy5zaXplO1xuICAgIHZhciBoZWFkID0gdGhpcy5faGVhZDtcbiAgICBpdGVyLl9faXRlcmF0ZShmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIG5ld1NpemUrKztcbiAgICAgIGhlYWQgPSB7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgbmV4dDogaGVhZCxcbiAgICAgIH07XG4gICAgfSwgLyogcmV2ZXJzZSAqLyB0cnVlKTtcbiAgICBpZiAodGhpcy5fX293bmVySUQpIHtcbiAgICAgIHRoaXMuc2l6ZSA9IG5ld1NpemU7XG4gICAgICB0aGlzLl9oZWFkID0gaGVhZDtcbiAgICAgIHRoaXMuX19oYXNoID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fX2FsdGVyZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBtYWtlU3RhY2sobmV3U2l6ZSwgaGVhZCk7XG4gIH07XG5cbiAgU3RhY2sucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uIHBvcCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2xpY2UoMSk7XG4gIH07XG5cbiAgU3RhY2sucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIgKCkge1xuICAgIGlmICh0aGlzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fX293bmVySUQpIHtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fX2hhc2ggPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9fYWx0ZXJlZCA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIGVtcHR5U3RhY2soKTtcbiAgfTtcblxuICBTdGFjay5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoYmVnaW4sIGVuZCkge1xuICAgIGlmICh3aG9sZVNsaWNlKGJlZ2luLCBlbmQsIHRoaXMuc2l6ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB2YXIgcmVzb2x2ZWRCZWdpbiA9IHJlc29sdmVCZWdpbihiZWdpbiwgdGhpcy5zaXplKTtcbiAgICB2YXIgcmVzb2x2ZWRFbmQgPSByZXNvbHZlRW5kKGVuZCwgdGhpcy5zaXplKTtcbiAgICBpZiAocmVzb2x2ZWRFbmQgIT09IHRoaXMuc2l6ZSkge1xuICAgICAgLy8gc3VwZXIuc2xpY2UoYmVnaW4sIGVuZCk7XG4gICAgICByZXR1cm4gSW5kZXhlZENvbGxlY3Rpb24kJDEucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcywgYmVnaW4sIGVuZCk7XG4gICAgfVxuICAgIHZhciBuZXdTaXplID0gdGhpcy5zaXplIC0gcmVzb2x2ZWRCZWdpbjtcbiAgICB2YXIgaGVhZCA9IHRoaXMuX2hlYWQ7XG4gICAgd2hpbGUgKHJlc29sdmVkQmVnaW4tLSkge1xuICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX19vd25lcklEKSB7XG4gICAgICB0aGlzLnNpemUgPSBuZXdTaXplO1xuICAgICAgdGhpcy5faGVhZCA9IGhlYWQ7XG4gICAgICB0aGlzLl9faGFzaCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX19hbHRlcmVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gbWFrZVN0YWNrKG5ld1NpemUsIGhlYWQpO1xuICB9O1xuXG4gIC8vIEBwcmFnbWEgTXV0YWJpbGl0eVxuXG4gIFN0YWNrLnByb3RvdHlwZS5fX2Vuc3VyZU93bmVyID0gZnVuY3Rpb24gX19lbnN1cmVPd25lciAob3duZXJJRCkge1xuICAgIGlmIChvd25lcklEID09PSB0aGlzLl9fb3duZXJJRCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmICghb3duZXJJRCkge1xuICAgICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZW1wdHlTdGFjaygpO1xuICAgICAgfVxuICAgICAgdGhpcy5fX293bmVySUQgPSBvd25lcklEO1xuICAgICAgdGhpcy5fX2FsdGVyZWQgPSBmYWxzZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gbWFrZVN0YWNrKHRoaXMuc2l6ZSwgdGhpcy5faGVhZCwgb3duZXJJRCwgdGhpcy5fX2hhc2gpO1xuICB9O1xuXG4gIC8vIEBwcmFnbWEgSXRlcmF0aW9uXG5cbiAgU3RhY2sucHJvdG90eXBlLl9faXRlcmF0ZSA9IGZ1bmN0aW9uIF9faXRlcmF0ZSAoZm4sIHJldmVyc2UpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICByZXR1cm4gbmV3IEFycmF5U2VxKHRoaXMudG9BcnJheSgpKS5fX2l0ZXJhdGUoXG4gICAgICAgIGZ1bmN0aW9uICh2LCBrKSB7IHJldHVybiBmbih2LCBrLCB0aGlzJDEpOyB9LFxuICAgICAgICByZXZlcnNlXG4gICAgICApO1xuICAgIH1cbiAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgdmFyIG5vZGUgPSB0aGlzLl9oZWFkO1xuICAgIHdoaWxlIChub2RlKSB7XG4gICAgICBpZiAoZm4obm9kZS52YWx1ZSwgaXRlcmF0aW9ucysrLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBub2RlID0gbm9kZS5uZXh0O1xuICAgIH1cbiAgICByZXR1cm4gaXRlcmF0aW9ucztcbiAgfTtcblxuICBTdGFjay5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uIF9faXRlcmF0b3IgKHR5cGUsIHJldmVyc2UpIHtcbiAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgcmV0dXJuIG5ldyBBcnJheVNlcSh0aGlzLnRvQXJyYXkoKSkuX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbiAgICB9XG4gICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgIHZhciBub2RlID0gdGhpcy5faGVhZDtcbiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChub2RlKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IG5vZGUudmFsdWU7XG4gICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgIHJldHVybiBpdGVyYXRvclZhbHVlKHR5cGUsIGl0ZXJhdGlvbnMrKywgdmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZXJhdG9yRG9uZSgpO1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBTdGFjaztcbn0oSW5kZXhlZENvbGxlY3Rpb24pKTtcblxuU3RhY2suaXNTdGFjayA9IGlzU3RhY2s7XG5cbnZhciBTdGFja1Byb3RvdHlwZSA9IFN0YWNrLnByb3RvdHlwZTtcblN0YWNrUHJvdG90eXBlW0lTX1NUQUNLX1NZTUJPTF0gPSB0cnVlO1xuU3RhY2tQcm90b3R5cGUuc2hpZnQgPSBTdGFja1Byb3RvdHlwZS5wb3A7XG5TdGFja1Byb3RvdHlwZS51bnNoaWZ0ID0gU3RhY2tQcm90b3R5cGUucHVzaDtcblN0YWNrUHJvdG90eXBlLnVuc2hpZnRBbGwgPSBTdGFja1Byb3RvdHlwZS5wdXNoQWxsO1xuU3RhY2tQcm90b3R5cGUud2l0aE11dGF0aW9ucyA9IHdpdGhNdXRhdGlvbnM7XG5TdGFja1Byb3RvdHlwZS53YXNBbHRlcmVkID0gd2FzQWx0ZXJlZDtcblN0YWNrUHJvdG90eXBlLmFzSW1tdXRhYmxlID0gYXNJbW11dGFibGU7XG5TdGFja1Byb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IFN0YWNrUHJvdG90eXBlLmFzTXV0YWJsZSA9IGFzTXV0YWJsZTtcblN0YWNrUHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24ocmVzdWx0LCBhcnIpIHtcbiAgcmV0dXJuIHJlc3VsdC51bnNoaWZ0KGFycik7XG59O1xuU3RhY2tQcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uKG9iaikge1xuICByZXR1cm4gb2JqLmFzSW1tdXRhYmxlKCk7XG59O1xuXG5mdW5jdGlvbiBtYWtlU3RhY2soc2l6ZSwgaGVhZCwgb3duZXJJRCwgaGFzaCkge1xuICB2YXIgbWFwID0gT2JqZWN0LmNyZWF0ZShTdGFja1Byb3RvdHlwZSk7XG4gIG1hcC5zaXplID0gc2l6ZTtcbiAgbWFwLl9oZWFkID0gaGVhZDtcbiAgbWFwLl9fb3duZXJJRCA9IG93bmVySUQ7XG4gIG1hcC5fX2hhc2ggPSBoYXNoO1xuICBtYXAuX19hbHRlcmVkID0gZmFsc2U7XG4gIHJldHVybiBtYXA7XG59XG5cbnZhciBFTVBUWV9TVEFDSztcbmZ1bmN0aW9uIGVtcHR5U3RhY2soKSB7XG4gIHJldHVybiBFTVBUWV9TVEFDSyB8fCAoRU1QVFlfU1RBQ0sgPSBtYWtlU3RhY2soMCkpO1xufVxuXG52YXIgSVNfU0VUX1NZTUJPTCA9ICdAQF9fSU1NVVRBQkxFX1NFVF9fQEAnO1xuXG5mdW5jdGlvbiBpc1NldChtYXliZVNldCkge1xuICByZXR1cm4gQm9vbGVhbihtYXliZVNldCAmJiBtYXliZVNldFtJU19TRVRfU1lNQk9MXSk7XG59XG5cbmZ1bmN0aW9uIGlzT3JkZXJlZFNldChtYXliZU9yZGVyZWRTZXQpIHtcbiAgcmV0dXJuIGlzU2V0KG1heWJlT3JkZXJlZFNldCkgJiYgaXNPcmRlcmVkKG1heWJlT3JkZXJlZFNldCk7XG59XG5cbmZ1bmN0aW9uIGRlZXBFcXVhbChhLCBiKSB7XG4gIGlmIChhID09PSBiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoXG4gICAgIWlzQ29sbGVjdGlvbihiKSB8fFxuICAgIChhLnNpemUgIT09IHVuZGVmaW5lZCAmJiBiLnNpemUgIT09IHVuZGVmaW5lZCAmJiBhLnNpemUgIT09IGIuc2l6ZSkgfHxcbiAgICAoYS5fX2hhc2ggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgYi5fX2hhc2ggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgYS5fX2hhc2ggIT09IGIuX19oYXNoKSB8fFxuICAgIGlzS2V5ZWQoYSkgIT09IGlzS2V5ZWQoYikgfHxcbiAgICBpc0luZGV4ZWQoYSkgIT09IGlzSW5kZXhlZChiKSB8fFxuICAgIGlzT3JkZXJlZChhKSAhPT0gaXNPcmRlcmVkKGIpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChhLnNpemUgPT09IDAgJiYgYi5zaXplID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgbm90QXNzb2NpYXRpdmUgPSAhaXNBc3NvY2lhdGl2ZShhKTtcblxuICBpZiAoaXNPcmRlcmVkKGEpKSB7XG4gICAgdmFyIGVudHJpZXMgPSBhLmVudHJpZXMoKTtcbiAgICByZXR1cm4gKFxuICAgICAgYi5ldmVyeShmdW5jdGlvbiAodiwgaykge1xuICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzLm5leHQoKS52YWx1ZTtcbiAgICAgICAgcmV0dXJuIGVudHJ5ICYmIGlzKGVudHJ5WzFdLCB2KSAmJiAobm90QXNzb2NpYXRpdmUgfHwgaXMoZW50cnlbMF0sIGspKTtcbiAgICAgIH0pICYmIGVudHJpZXMubmV4dCgpLmRvbmVcbiAgICApO1xuICB9XG5cbiAgdmFyIGZsaXBwZWQgPSBmYWxzZTtcblxuICBpZiAoYS5zaXplID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoYi5zaXplID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgYS5jYWNoZVJlc3VsdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhLmNhY2hlUmVzdWx0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZsaXBwZWQgPSB0cnVlO1xuICAgICAgdmFyIF8gPSBhO1xuICAgICAgYSA9IGI7XG4gICAgICBiID0gXztcbiAgICB9XG4gIH1cblxuICB2YXIgYWxsRXF1YWwgPSB0cnVlO1xuICB2YXIgYlNpemUgPSBiLl9faXRlcmF0ZShmdW5jdGlvbiAodiwgaykge1xuICAgIGlmIChcbiAgICAgIG5vdEFzc29jaWF0aXZlXG4gICAgICAgID8gIWEuaGFzKHYpXG4gICAgICAgIDogZmxpcHBlZFxuICAgICAgICAgID8gIWlzKHYsIGEuZ2V0KGssIE5PVF9TRVQpKVxuICAgICAgICAgIDogIWlzKGEuZ2V0KGssIE5PVF9TRVQpLCB2KVxuICAgICkge1xuICAgICAgYWxsRXF1YWwgPSBmYWxzZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBhbGxFcXVhbCAmJiBhLnNpemUgPT09IGJTaXplO1xufVxuXG4vKipcbiAqIENvbnRyaWJ1dGVzIGFkZGl0aW9uYWwgbWV0aG9kcyB0byBhIGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIG1peGluKGN0b3IsIG1ldGhvZHMpIHtcbiAgdmFyIGtleUNvcGllciA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICBjdG9yLnByb3RvdHlwZVtrZXldID0gbWV0aG9kc1trZXldO1xuICB9O1xuICBPYmplY3Qua2V5cyhtZXRob2RzKS5mb3JFYWNoKGtleUNvcGllcik7XG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiZcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG1ldGhvZHMpLmZvckVhY2goa2V5Q29waWVyKTtcbiAgcmV0dXJuIGN0b3I7XG59XG5cbmZ1bmN0aW9uIHRvSlModmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmICghaXNDb2xsZWN0aW9uKHZhbHVlKSkge1xuICAgIGlmICghaXNEYXRhU3RydWN0dXJlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICB2YWx1ZSA9IFNlcSh2YWx1ZSk7XG4gIH1cbiAgaWYgKGlzS2V5ZWQodmFsdWUpKSB7XG4gICAgdmFyIHJlc3VsdCQxID0ge307XG4gICAgdmFsdWUuX19pdGVyYXRlKGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICByZXN1bHQkMVtrXSA9IHRvSlModik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdCQxO1xuICB9XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFsdWUuX19pdGVyYXRlKGZ1bmN0aW9uICh2KSB7XG4gICAgcmVzdWx0LnB1c2godG9KUyh2KSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG52YXIgU2V0ID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoU2V0Q29sbGVjdGlvbiQkMSkge1xuICBmdW5jdGlvbiBTZXQodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgPyBlbXB0eVNldCgpXG4gICAgICA6IGlzU2V0KHZhbHVlKSAmJiAhaXNPcmRlcmVkKHZhbHVlKVxuICAgICAgICA/IHZhbHVlXG4gICAgICAgIDogZW1wdHlTZXQoKS53aXRoTXV0YXRpb25zKGZ1bmN0aW9uIChzZXQpIHtcbiAgICAgICAgICAgIHZhciBpdGVyID0gU2V0Q29sbGVjdGlvbiQkMSh2YWx1ZSk7XG4gICAgICAgICAgICBhc3NlcnROb3RJbmZpbml0ZShpdGVyLnNpemUpO1xuICAgICAgICAgICAgaXRlci5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7IHJldHVybiBzZXQuYWRkKHYpOyB9KTtcbiAgICAgICAgICB9KTtcbiAgfVxuXG4gIGlmICggU2V0Q29sbGVjdGlvbiQkMSApIFNldC5fX3Byb3RvX18gPSBTZXRDb2xsZWN0aW9uJCQxO1xuICBTZXQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggU2V0Q29sbGVjdGlvbiQkMSAmJiBTZXRDb2xsZWN0aW9uJCQxLnByb3RvdHlwZSApO1xuICBTZXQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2V0O1xuXG4gIFNldC5vZiA9IGZ1bmN0aW9uIG9mICgvKi4uLnZhbHVlcyovKSB7XG4gICAgcmV0dXJuIHRoaXMoYXJndW1lbnRzKTtcbiAgfTtcblxuICBTZXQuZnJvbUtleXMgPSBmdW5jdGlvbiBmcm9tS2V5cyAodmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcyhLZXllZENvbGxlY3Rpb24odmFsdWUpLmtleVNlcSgpKTtcbiAgfTtcblxuICBTZXQuaW50ZXJzZWN0ID0gZnVuY3Rpb24gaW50ZXJzZWN0IChzZXRzKSB7XG4gICAgc2V0cyA9IENvbGxlY3Rpb24oc2V0cykudG9BcnJheSgpO1xuICAgIHJldHVybiBzZXRzLmxlbmd0aFxuICAgICAgPyBTZXRQcm90b3R5cGUuaW50ZXJzZWN0LmFwcGx5KFNldChzZXRzLnBvcCgpKSwgc2V0cylcbiAgICAgIDogZW1wdHlTZXQoKTtcbiAgfTtcblxuICBTZXQudW5pb24gPSBmdW5jdGlvbiB1bmlvbiAoc2V0cykge1xuICAgIHNldHMgPSBDb2xsZWN0aW9uKHNldHMpLnRvQXJyYXkoKTtcbiAgICByZXR1cm4gc2V0cy5sZW5ndGhcbiAgICAgID8gU2V0UHJvdG90eXBlLnVuaW9uLmFwcGx5KFNldChzZXRzLnBvcCgpKSwgc2V0cylcbiAgICAgIDogZW1wdHlTZXQoKTtcbiAgfTtcblxuICBTZXQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiB0aGlzLl9fdG9TdHJpbmcoJ1NldCB7JywgJ30nKTtcbiAgfTtcblxuICAvLyBAcHJhZ21hIEFjY2Vzc1xuXG4gIFNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gaGFzICh2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKHZhbHVlKTtcbiAgfTtcblxuICAvLyBAcHJhZ21hIE1vZGlmaWNhdGlvblxuXG4gIFNldC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkICh2YWx1ZSkge1xuICAgIHJldHVybiB1cGRhdGVTZXQodGhpcywgdGhpcy5fbWFwLnNldCh2YWx1ZSwgdmFsdWUpKTtcbiAgfTtcblxuICBTZXQucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIHJlbW92ZSAodmFsdWUpIHtcbiAgICByZXR1cm4gdXBkYXRlU2V0KHRoaXMsIHRoaXMuX21hcC5yZW1vdmUodmFsdWUpKTtcbiAgfTtcblxuICBTZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIgKCkge1xuICAgIHJldHVybiB1cGRhdGVTZXQodGhpcywgdGhpcy5fbWFwLmNsZWFyKCkpO1xuICB9O1xuXG4gIC8vIEBwcmFnbWEgQ29tcG9zaXRpb25cblxuICBTZXQucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIG1hcCAobWFwcGVyLCBjb250ZXh0KSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgcmVtb3ZlcyA9IFtdO1xuICAgIHZhciBhZGRzID0gW107XG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgdmFyIG1hcHBlZCA9IG1hcHBlci5jYWxsKGNvbnRleHQsIHZhbHVlLCB2YWx1ZSwgdGhpcyQxKTtcbiAgICAgIGlmIChtYXBwZWQgIT09IHZhbHVlKSB7XG4gICAgICAgIHJlbW92ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIGFkZHMucHVzaChtYXBwZWQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLndpdGhNdXRhdGlvbnMoZnVuY3Rpb24gKHNldCkge1xuICAgICAgcmVtb3Zlcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gc2V0LnJlbW92ZSh2YWx1ZSk7IH0pO1xuICAgICAgYWRkcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gc2V0LmFkZCh2YWx1ZSk7IH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIFNldC5wcm90b3R5cGUudW5pb24gPSBmdW5jdGlvbiB1bmlvbiAoKSB7XG4gICAgdmFyIGl0ZXJzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgd2hpbGUgKCBsZW4tLSApIGl0ZXJzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgICBpdGVycyA9IGl0ZXJzLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5zaXplICE9PSAwOyB9KTtcbiAgICBpZiAoaXRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCAmJiAhdGhpcy5fX293bmVySUQgJiYgaXRlcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3RvcihpdGVyc1swXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLndpdGhNdXRhdGlvbnMoZnVuY3Rpb24gKHNldCkge1xuICAgICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IGl0ZXJzLmxlbmd0aDsgaWkrKykge1xuICAgICAgICBTZXRDb2xsZWN0aW9uJCQxKGl0ZXJzW2lpXSkuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHNldC5hZGQodmFsdWUpOyB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBTZXQucHJvdG90eXBlLmludGVyc2VjdCA9IGZ1bmN0aW9uIGludGVyc2VjdCAoKSB7XG4gICAgdmFyIGl0ZXJzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgd2hpbGUgKCBsZW4tLSApIGl0ZXJzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgICBpZiAoaXRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaXRlcnMgPSBpdGVycy5tYXAoZnVuY3Rpb24gKGl0ZXIpIHsgcmV0dXJuIFNldENvbGxlY3Rpb24kJDEoaXRlcik7IH0pO1xuICAgIHZhciB0b1JlbW92ZSA9IFtdO1xuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICghaXRlcnMuZXZlcnkoZnVuY3Rpb24gKGl0ZXIpIHsgcmV0dXJuIGl0ZXIuaW5jbHVkZXModmFsdWUpOyB9KSkge1xuICAgICAgICB0b1JlbW92ZS5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKGZ1bmN0aW9uIChzZXQpIHtcbiAgICAgIHRvUmVtb3ZlLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHNldC5yZW1vdmUodmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgU2V0LnByb3RvdHlwZS5zdWJ0cmFjdCA9IGZ1bmN0aW9uIHN1YnRyYWN0ICgpIHtcbiAgICB2YXIgaXRlcnMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB3aGlsZSAoIGxlbi0tICkgaXRlcnNbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gXTtcblxuICAgIGlmIChpdGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpdGVycyA9IGl0ZXJzLm1hcChmdW5jdGlvbiAoaXRlcikgeyByZXR1cm4gU2V0Q29sbGVjdGlvbiQkMShpdGVyKTsgfSk7XG4gICAgdmFyIHRvUmVtb3ZlID0gW107XG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgaWYgKGl0ZXJzLnNvbWUoZnVuY3Rpb24gKGl0ZXIpIHsgcmV0dXJuIGl0ZXIuaW5jbHVkZXModmFsdWUpOyB9KSkge1xuICAgICAgICB0b1JlbW92ZS5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKGZ1bmN0aW9uIChzZXQpIHtcbiAgICAgIHRvUmVtb3ZlLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHNldC5yZW1vdmUodmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgU2V0LnByb3RvdHlwZS5zb3J0ID0gZnVuY3Rpb24gc29ydCAoY29tcGFyYXRvcikge1xuICAgIC8vIExhdGUgYmluZGluZ1xuICAgIHJldHVybiBPcmRlcmVkU2V0KHNvcnRGYWN0b3J5KHRoaXMsIGNvbXBhcmF0b3IpKTtcbiAgfTtcblxuICBTZXQucHJvdG90eXBlLnNvcnRCeSA9IGZ1bmN0aW9uIHNvcnRCeSAobWFwcGVyLCBjb21wYXJhdG9yKSB7XG4gICAgLy8gTGF0ZSBiaW5kaW5nXG4gICAgcmV0dXJuIE9yZGVyZWRTZXQoc29ydEZhY3RvcnkodGhpcywgY29tcGFyYXRvciwgbWFwcGVyKSk7XG4gIH07XG5cbiAgU2V0LnByb3RvdHlwZS53YXNBbHRlcmVkID0gZnVuY3Rpb24gd2FzQWx0ZXJlZCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21hcC53YXNBbHRlcmVkKCk7XG4gIH07XG5cbiAgU2V0LnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbiBfX2l0ZXJhdGUgKGZuLCByZXZlcnNlKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICByZXR1cm4gdGhpcy5fbWFwLl9faXRlcmF0ZShmdW5jdGlvbiAoaykgeyByZXR1cm4gZm4oaywgaywgdGhpcyQxKTsgfSwgcmV2ZXJzZSk7XG4gIH07XG5cbiAgU2V0LnByb3RvdHlwZS5fX2l0ZXJhdG9yID0gZnVuY3Rpb24gX19pdGVyYXRvciAodHlwZSwgcmV2ZXJzZSkge1xuICAgIHJldHVybiB0aGlzLl9tYXAuX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbiAgfTtcblxuICBTZXQucHJvdG90eXBlLl9fZW5zdXJlT3duZXIgPSBmdW5jdGlvbiBfX2Vuc3VyZU93bmVyIChvd25lcklEKSB7XG4gICAgaWYgKG93bmVySUQgPT09IHRoaXMuX19vd25lcklEKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdmFyIG5ld01hcCA9IHRoaXMuX21hcC5fX2Vuc3VyZU93bmVyKG93bmVySUQpO1xuICAgIGlmICghb3duZXJJRCkge1xuICAgICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX2VtcHR5KCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9fb3duZXJJRCA9IG93bmVySUQ7XG4gICAgICB0aGlzLl9tYXAgPSBuZXdNYXA7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX19tYWtlKG5ld01hcCwgb3duZXJJRCk7XG4gIH07XG5cbiAgcmV0dXJuIFNldDtcbn0oU2V0Q29sbGVjdGlvbikpO1xuXG5TZXQuaXNTZXQgPSBpc1NldDtcblxudmFyIFNldFByb3RvdHlwZSA9IFNldC5wcm90b3R5cGU7XG5TZXRQcm90b3R5cGVbSVNfU0VUX1NZTUJPTF0gPSB0cnVlO1xuU2V0UHJvdG90eXBlW0RFTEVURV0gPSBTZXRQcm90b3R5cGUucmVtb3ZlO1xuU2V0UHJvdG90eXBlLm1lcmdlID0gU2V0UHJvdG90eXBlLmNvbmNhdCA9IFNldFByb3RvdHlwZS51bmlvbjtcblNldFByb3RvdHlwZS53aXRoTXV0YXRpb25zID0gd2l0aE11dGF0aW9ucztcblNldFByb3RvdHlwZS5hc0ltbXV0YWJsZSA9IGFzSW1tdXRhYmxlO1xuU2V0UHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gU2V0UHJvdG90eXBlLmFzTXV0YWJsZSA9IGFzTXV0YWJsZTtcblNldFByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uKHJlc3VsdCwgYXJyKSB7XG4gIHJldHVybiByZXN1bHQuYWRkKGFycik7XG59O1xuU2V0UHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbihvYmopIHtcbiAgcmV0dXJuIG9iai5hc0ltbXV0YWJsZSgpO1xufTtcblxuU2V0UHJvdG90eXBlLl9fZW1wdHkgPSBlbXB0eVNldDtcblNldFByb3RvdHlwZS5fX21ha2UgPSBtYWtlU2V0O1xuXG5mdW5jdGlvbiB1cGRhdGVTZXQoc2V0LCBuZXdNYXApIHtcbiAgaWYgKHNldC5fX293bmVySUQpIHtcbiAgICBzZXQuc2l6ZSA9IG5ld01hcC5zaXplO1xuICAgIHNldC5fbWFwID0gbmV3TWFwO1xuICAgIHJldHVybiBzZXQ7XG4gIH1cbiAgcmV0dXJuIG5ld01hcCA9PT0gc2V0Ll9tYXBcbiAgICA/IHNldFxuICAgIDogbmV3TWFwLnNpemUgPT09IDBcbiAgICAgID8gc2V0Ll9fZW1wdHkoKVxuICAgICAgOiBzZXQuX19tYWtlKG5ld01hcCk7XG59XG5cbmZ1bmN0aW9uIG1ha2VTZXQobWFwLCBvd25lcklEKSB7XG4gIHZhciBzZXQgPSBPYmplY3QuY3JlYXRlKFNldFByb3RvdHlwZSk7XG4gIHNldC5zaXplID0gbWFwID8gbWFwLnNpemUgOiAwO1xuICBzZXQuX21hcCA9IG1hcDtcbiAgc2V0Ll9fb3duZXJJRCA9IG93bmVySUQ7XG4gIHJldHVybiBzZXQ7XG59XG5cbnZhciBFTVBUWV9TRVQ7XG5mdW5jdGlvbiBlbXB0eVNldCgpIHtcbiAgcmV0dXJuIEVNUFRZX1NFVCB8fCAoRU1QVFlfU0VUID0gbWFrZVNldChlbXB0eU1hcCgpKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGxhenkgc2VxIG9mIG51bXMgZnJvbSBzdGFydCAoaW5jbHVzaXZlKSB0byBlbmRcbiAqIChleGNsdXNpdmUpLCBieSBzdGVwLCB3aGVyZSBzdGFydCBkZWZhdWx0cyB0byAwLCBzdGVwIHRvIDEsIGFuZCBlbmQgdG9cbiAqIGluZmluaXR5LiBXaGVuIHN0YXJ0IGlzIGVxdWFsIHRvIGVuZCwgcmV0dXJucyBlbXB0eSBsaXN0LlxuICovXG52YXIgUmFuZ2UgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChJbmRleGVkU2VxJCQxKSB7XG4gIGZ1bmN0aW9uIFJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXApIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmFuZ2UpKSB7XG4gICAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXApO1xuICAgIH1cbiAgICBpbnZhcmlhbnQoc3RlcCAhPT0gMCwgJ0Nhbm5vdCBzdGVwIGEgUmFuZ2UgYnkgMCcpO1xuICAgIHN0YXJ0ID0gc3RhcnQgfHwgMDtcbiAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVuZCA9IEluZmluaXR5O1xuICAgIH1cbiAgICBzdGVwID0gc3RlcCA9PT0gdW5kZWZpbmVkID8gMSA6IE1hdGguYWJzKHN0ZXApO1xuICAgIGlmIChlbmQgPCBzdGFydCkge1xuICAgICAgc3RlcCA9IC1zdGVwO1xuICAgIH1cbiAgICB0aGlzLl9zdGFydCA9IHN0YXJ0O1xuICAgIHRoaXMuX2VuZCA9IGVuZDtcbiAgICB0aGlzLl9zdGVwID0gc3RlcDtcbiAgICB0aGlzLnNpemUgPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoKGVuZCAtIHN0YXJ0KSAvIHN0ZXAgLSAxKSArIDEpO1xuICAgIGlmICh0aGlzLnNpemUgPT09IDApIHtcbiAgICAgIGlmIChFTVBUWV9SQU5HRSkge1xuICAgICAgICByZXR1cm4gRU1QVFlfUkFOR0U7XG4gICAgICB9XG4gICAgICBFTVBUWV9SQU5HRSA9IHRoaXM7XG4gICAgfVxuICB9XG5cbiAgaWYgKCBJbmRleGVkU2VxJCQxICkgUmFuZ2UuX19wcm90b19fID0gSW5kZXhlZFNlcSQkMTtcbiAgUmFuZ2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggSW5kZXhlZFNlcSQkMSAmJiBJbmRleGVkU2VxJCQxLnByb3RvdHlwZSApO1xuICBSYW5nZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSYW5nZTtcblxuICBSYW5nZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuICdSYW5nZSBbXSc7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICAnUmFuZ2UgWyAnICtcbiAgICAgIHRoaXMuX3N0YXJ0ICtcbiAgICAgICcuLi4nICtcbiAgICAgIHRoaXMuX2VuZCArXG4gICAgICAodGhpcy5fc3RlcCAhPT0gMSA/ICcgYnkgJyArIHRoaXMuX3N0ZXAgOiAnJykgK1xuICAgICAgJyBdJ1xuICAgICk7XG4gIH07XG5cbiAgUmFuZ2UucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCAoaW5kZXgsIG5vdFNldFZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzKGluZGV4KVxuICAgICAgPyB0aGlzLl9zdGFydCArIHdyYXBJbmRleCh0aGlzLCBpbmRleCkgKiB0aGlzLl9zdGVwXG4gICAgICA6IG5vdFNldFZhbHVlO1xuICB9O1xuXG4gIFJhbmdlLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzIChzZWFyY2hWYWx1ZSkge1xuICAgIHZhciBwb3NzaWJsZUluZGV4ID0gKHNlYXJjaFZhbHVlIC0gdGhpcy5fc3RhcnQpIC8gdGhpcy5fc3RlcDtcbiAgICByZXR1cm4gKFxuICAgICAgcG9zc2libGVJbmRleCA+PSAwICYmXG4gICAgICBwb3NzaWJsZUluZGV4IDwgdGhpcy5zaXplICYmXG4gICAgICBwb3NzaWJsZUluZGV4ID09PSBNYXRoLmZsb29yKHBvc3NpYmxlSW5kZXgpXG4gICAgKTtcbiAgfTtcblxuICBSYW5nZS5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoYmVnaW4sIGVuZCkge1xuICAgIGlmICh3aG9sZVNsaWNlKGJlZ2luLCBlbmQsIHRoaXMuc2l6ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBiZWdpbiA9IHJlc29sdmVCZWdpbihiZWdpbiwgdGhpcy5zaXplKTtcbiAgICBlbmQgPSByZXNvbHZlRW5kKGVuZCwgdGhpcy5zaXplKTtcbiAgICBpZiAoZW5kIDw9IGJlZ2luKSB7XG4gICAgICByZXR1cm4gbmV3IFJhbmdlKDAsIDApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFJhbmdlKFxuICAgICAgdGhpcy5nZXQoYmVnaW4sIHRoaXMuX2VuZCksXG4gICAgICB0aGlzLmdldChlbmQsIHRoaXMuX2VuZCksXG4gICAgICB0aGlzLl9zdGVwXG4gICAgKTtcbiAgfTtcblxuICBSYW5nZS5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHNlYXJjaFZhbHVlKSB7XG4gICAgdmFyIG9mZnNldFZhbHVlID0gc2VhcmNoVmFsdWUgLSB0aGlzLl9zdGFydDtcbiAgICBpZiAob2Zmc2V0VmFsdWUgJSB0aGlzLl9zdGVwID09PSAwKSB7XG4gICAgICB2YXIgaW5kZXggPSBvZmZzZXRWYWx1ZSAvIHRoaXMuX3N0ZXA7XG4gICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuc2l6ZSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfTtcblxuICBSYW5nZS5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZiAoc2VhcmNoVmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleE9mKHNlYXJjaFZhbHVlKTtcbiAgfTtcblxuICBSYW5nZS5wcm90b3R5cGUuX19pdGVyYXRlID0gZnVuY3Rpb24gX19pdGVyYXRlIChmbiwgcmV2ZXJzZSkge1xuICAgIHZhciBzaXplID0gdGhpcy5zaXplO1xuICAgIHZhciBzdGVwID0gdGhpcy5fc3RlcDtcbiAgICB2YXIgdmFsdWUgPSByZXZlcnNlID8gdGhpcy5fc3RhcnQgKyAoc2l6ZSAtIDEpICogc3RlcCA6IHRoaXMuX3N0YXJ0O1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAoaSAhPT0gc2l6ZSkge1xuICAgICAgaWYgKGZuKHZhbHVlLCByZXZlcnNlID8gc2l6ZSAtICsraSA6IGkrKywgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdmFsdWUgKz0gcmV2ZXJzZSA/IC1zdGVwIDogc3RlcDtcbiAgICB9XG4gICAgcmV0dXJuIGk7XG4gIH07XG5cbiAgUmFuZ2UucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbiBfX2l0ZXJhdG9yICh0eXBlLCByZXZlcnNlKSB7XG4gICAgdmFyIHNpemUgPSB0aGlzLnNpemU7XG4gICAgdmFyIHN0ZXAgPSB0aGlzLl9zdGVwO1xuICAgIHZhciB2YWx1ZSA9IHJldmVyc2UgPyB0aGlzLl9zdGFydCArIChzaXplIC0gMSkgKiBzdGVwIDogdGhpcy5fc3RhcnQ7XG4gICAgdmFyIGkgPSAwO1xuICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGkgPT09IHNpemUpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yRG9uZSgpO1xuICAgICAgfVxuICAgICAgdmFyIHYgPSB2YWx1ZTtcbiAgICAgIHZhbHVlICs9IHJldmVyc2UgPyAtc3RlcCA6IHN0ZXA7XG4gICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZSh0eXBlLCByZXZlcnNlID8gc2l6ZSAtICsraSA6IGkrKywgdik7XG4gICAgfSk7XG4gIH07XG5cbiAgUmFuZ2UucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAob3RoZXIpIHtcbiAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBSYW5nZVxuICAgICAgPyB0aGlzLl9zdGFydCA9PT0gb3RoZXIuX3N0YXJ0ICYmXG4gICAgICAgICAgdGhpcy5fZW5kID09PSBvdGhlci5fZW5kICYmXG4gICAgICAgICAgdGhpcy5fc3RlcCA9PT0gb3RoZXIuX3N0ZXBcbiAgICAgIDogZGVlcEVxdWFsKHRoaXMsIG90aGVyKTtcbiAgfTtcblxuICByZXR1cm4gUmFuZ2U7XG59KEluZGV4ZWRTZXEpKTtcblxudmFyIEVNUFRZX1JBTkdFO1xuXG5mdW5jdGlvbiBnZXRJbihjb2xsZWN0aW9uLCBzZWFyY2hLZXlQYXRoLCBub3RTZXRWYWx1ZSkge1xuICB2YXIga2V5UGF0aCA9IGNvZXJjZUtleVBhdGgoc2VhcmNoS2V5UGF0aCk7XG4gIHZhciBpID0gMDtcbiAgd2hpbGUgKGkgIT09IGtleVBhdGgubGVuZ3RoKSB7XG4gICAgY29sbGVjdGlvbiA9IGdldChjb2xsZWN0aW9uLCBrZXlQYXRoW2krK10sIE5PVF9TRVQpO1xuICAgIGlmIChjb2xsZWN0aW9uID09PSBOT1RfU0VUKSB7XG4gICAgICByZXR1cm4gbm90U2V0VmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBjb2xsZWN0aW9uO1xufVxuXG5mdW5jdGlvbiBnZXRJbiQxKHNlYXJjaEtleVBhdGgsIG5vdFNldFZhbHVlKSB7XG4gIHJldHVybiBnZXRJbih0aGlzLCBzZWFyY2hLZXlQYXRoLCBub3RTZXRWYWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGhhc0luKGNvbGxlY3Rpb24sIGtleVBhdGgpIHtcbiAgcmV0dXJuIGdldEluKGNvbGxlY3Rpb24sIGtleVBhdGgsIE5PVF9TRVQpICE9PSBOT1RfU0VUO1xufVxuXG5mdW5jdGlvbiBoYXNJbiQxKHNlYXJjaEtleVBhdGgpIHtcbiAgcmV0dXJuIGhhc0luKHRoaXMsIHNlYXJjaEtleVBhdGgpO1xufVxuXG5mdW5jdGlvbiB0b09iamVjdCgpIHtcbiAgYXNzZXJ0Tm90SW5maW5pdGUodGhpcy5zaXplKTtcbiAgdmFyIG9iamVjdCA9IHt9O1xuICB0aGlzLl9faXRlcmF0ZShmdW5jdGlvbiAodiwgaykge1xuICAgIG9iamVjdFtrXSA9IHY7XG4gIH0pO1xuICByZXR1cm4gb2JqZWN0O1xufVxuXG4vLyBOb3RlOiBhbGwgb2YgdGhlc2UgbWV0aG9kcyBhcmUgZGVwcmVjYXRlZC5cbkNvbGxlY3Rpb24uaXNJdGVyYWJsZSA9IGlzQ29sbGVjdGlvbjtcbkNvbGxlY3Rpb24uaXNLZXllZCA9IGlzS2V5ZWQ7XG5Db2xsZWN0aW9uLmlzSW5kZXhlZCA9IGlzSW5kZXhlZDtcbkNvbGxlY3Rpb24uaXNBc3NvY2lhdGl2ZSA9IGlzQXNzb2NpYXRpdmU7XG5Db2xsZWN0aW9uLmlzT3JkZXJlZCA9IGlzT3JkZXJlZDtcblxuQ29sbGVjdGlvbi5JdGVyYXRvciA9IEl0ZXJhdG9yO1xuXG5taXhpbihDb2xsZWN0aW9uLCB7XG4gIC8vICMjIyBDb252ZXJzaW9uIHRvIG90aGVyIHR5cGVzXG5cbiAgdG9BcnJheTogZnVuY3Rpb24gdG9BcnJheSgpIHtcbiAgICBhc3NlcnROb3RJbmZpbml0ZSh0aGlzLnNpemUpO1xuICAgIHZhciBhcnJheSA9IG5ldyBBcnJheSh0aGlzLnNpemUgfHwgMCk7XG4gICAgdmFyIHVzZVR1cGxlcyA9IGlzS2V5ZWQodGhpcyk7XG4gICAgdmFyIGkgPSAwO1xuICAgIHRoaXMuX19pdGVyYXRlKGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICAvLyBLZXllZCBjb2xsZWN0aW9ucyBwcm9kdWNlIGFuIGFycmF5IG9mIHR1cGxlcy5cbiAgICAgIGFycmF5W2krK10gPSB1c2VUdXBsZXMgPyBbaywgdl0gOiB2O1xuICAgIH0pO1xuICAgIHJldHVybiBhcnJheTtcbiAgfSxcblxuICB0b0luZGV4ZWRTZXE6IGZ1bmN0aW9uIHRvSW5kZXhlZFNlcSgpIHtcbiAgICByZXR1cm4gbmV3IFRvSW5kZXhlZFNlcXVlbmNlKHRoaXMpO1xuICB9LFxuXG4gIHRvSlM6IGZ1bmN0aW9uIHRvSlMkMSgpIHtcbiAgICByZXR1cm4gdG9KUyh0aGlzKTtcbiAgfSxcblxuICB0b0tleWVkU2VxOiBmdW5jdGlvbiB0b0tleWVkU2VxKCkge1xuICAgIHJldHVybiBuZXcgVG9LZXllZFNlcXVlbmNlKHRoaXMsIHRydWUpO1xuICB9LFxuXG4gIHRvTWFwOiBmdW5jdGlvbiB0b01hcCgpIHtcbiAgICAvLyBVc2UgTGF0ZSBCaW5kaW5nIGhlcmUgdG8gc29sdmUgdGhlIGNpcmN1bGFyIGRlcGVuZGVuY3kuXG4gICAgcmV0dXJuIE1hcCh0aGlzLnRvS2V5ZWRTZXEoKSk7XG4gIH0sXG5cbiAgdG9PYmplY3Q6IHRvT2JqZWN0LFxuXG4gIHRvT3JkZXJlZE1hcDogZnVuY3Rpb24gdG9PcmRlcmVkTWFwKCkge1xuICAgIC8vIFVzZSBMYXRlIEJpbmRpbmcgaGVyZSB0byBzb2x2ZSB0aGUgY2lyY3VsYXIgZGVwZW5kZW5jeS5cbiAgICByZXR1cm4gT3JkZXJlZE1hcCh0aGlzLnRvS2V5ZWRTZXEoKSk7XG4gIH0sXG5cbiAgdG9PcmRlcmVkU2V0OiBmdW5jdGlvbiB0b09yZGVyZWRTZXQoKSB7XG4gICAgLy8gVXNlIExhdGUgQmluZGluZyBoZXJlIHRvIHNvbHZlIHRoZSBjaXJjdWxhciBkZXBlbmRlbmN5LlxuICAgIHJldHVybiBPcmRlcmVkU2V0KGlzS2V5ZWQodGhpcykgPyB0aGlzLnZhbHVlU2VxKCkgOiB0aGlzKTtcbiAgfSxcblxuICB0b1NldDogZnVuY3Rpb24gdG9TZXQoKSB7XG4gICAgLy8gVXNlIExhdGUgQmluZGluZyBoZXJlIHRvIHNvbHZlIHRoZSBjaXJjdWxhciBkZXBlbmRlbmN5LlxuICAgIHJldHVybiBTZXQoaXNLZXllZCh0aGlzKSA/IHRoaXMudmFsdWVTZXEoKSA6IHRoaXMpO1xuICB9LFxuXG4gIHRvU2V0U2VxOiBmdW5jdGlvbiB0b1NldFNlcSgpIHtcbiAgICByZXR1cm4gbmV3IFRvU2V0U2VxdWVuY2UodGhpcyk7XG4gIH0sXG5cbiAgdG9TZXE6IGZ1bmN0aW9uIHRvU2VxKCkge1xuICAgIHJldHVybiBpc0luZGV4ZWQodGhpcylcbiAgICAgID8gdGhpcy50b0luZGV4ZWRTZXEoKVxuICAgICAgOiBpc0tleWVkKHRoaXMpXG4gICAgICAgID8gdGhpcy50b0tleWVkU2VxKClcbiAgICAgICAgOiB0aGlzLnRvU2V0U2VxKCk7XG4gIH0sXG5cbiAgdG9TdGFjazogZnVuY3Rpb24gdG9TdGFjaygpIHtcbiAgICAvLyBVc2UgTGF0ZSBCaW5kaW5nIGhlcmUgdG8gc29sdmUgdGhlIGNpcmN1bGFyIGRlcGVuZGVuY3kuXG4gICAgcmV0dXJuIFN0YWNrKGlzS2V5ZWQodGhpcykgPyB0aGlzLnZhbHVlU2VxKCkgOiB0aGlzKTtcbiAgfSxcblxuICB0b0xpc3Q6IGZ1bmN0aW9uIHRvTGlzdCgpIHtcbiAgICAvLyBVc2UgTGF0ZSBCaW5kaW5nIGhlcmUgdG8gc29sdmUgdGhlIGNpcmN1bGFyIGRlcGVuZGVuY3kuXG4gICAgcmV0dXJuIExpc3QoaXNLZXllZCh0aGlzKSA/IHRoaXMudmFsdWVTZXEoKSA6IHRoaXMpO1xuICB9LFxuXG4gIC8vICMjIyBDb21tb24gSmF2YVNjcmlwdCBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzXG5cbiAgdG9TdHJpbmc6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAnW0NvbGxlY3Rpb25dJztcbiAgfSxcblxuICBfX3RvU3RyaW5nOiBmdW5jdGlvbiBfX3RvU3RyaW5nKGhlYWQsIHRhaWwpIHtcbiAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gaGVhZCArIHRhaWw7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBoZWFkICtcbiAgICAgICcgJyArXG4gICAgICB0aGlzLnRvU2VxKClcbiAgICAgICAgLm1hcCh0aGlzLl9fdG9TdHJpbmdNYXBwZXIpXG4gICAgICAgIC5qb2luKCcsICcpICtcbiAgICAgICcgJyArXG4gICAgICB0YWlsXG4gICAgKTtcbiAgfSxcblxuICAvLyAjIyMgRVM2IENvbGxlY3Rpb24gbWV0aG9kcyAoRVM2IEFycmF5IGFuZCBNYXApXG5cbiAgY29uY2F0OiBmdW5jdGlvbiBjb25jYXQoKSB7XG4gICAgdmFyIHZhbHVlcyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHdoaWxlICggbGVuLS0gKSB2YWx1ZXNbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gXTtcblxuICAgIHJldHVybiByZWlmeSh0aGlzLCBjb25jYXRGYWN0b3J5KHRoaXMsIHZhbHVlcykpO1xuICB9LFxuXG4gIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhzZWFyY2hWYWx1ZSkge1xuICAgIHJldHVybiB0aGlzLnNvbWUoZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBpcyh2YWx1ZSwgc2VhcmNoVmFsdWUpOyB9KTtcbiAgfSxcblxuICBlbnRyaWVzOiBmdW5jdGlvbiBlbnRyaWVzKCkge1xuICAgIHJldHVybiB0aGlzLl9faXRlcmF0b3IoSVRFUkFURV9FTlRSSUVTKTtcbiAgfSxcblxuICBldmVyeTogZnVuY3Rpb24gZXZlcnkocHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0Tm90SW5maW5pdGUodGhpcy5zaXplKTtcbiAgICB2YXIgcmV0dXJuVmFsdWUgPSB0cnVlO1xuICAgIHRoaXMuX19pdGVyYXRlKGZ1bmN0aW9uICh2LCBrLCBjKSB7XG4gICAgICBpZiAoIXByZWRpY2F0ZS5jYWxsKGNvbnRleHQsIHYsIGssIGMpKSB7XG4gICAgICAgIHJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH0sXG5cbiAgZmlsdGVyOiBmdW5jdGlvbiBmaWx0ZXIocHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHJlaWZ5KHRoaXMsIGZpbHRlckZhY3RvcnkodGhpcywgcHJlZGljYXRlLCBjb250ZXh0LCB0cnVlKSk7XG4gIH0sXG5cbiAgZmluZDogZnVuY3Rpb24gZmluZChwcmVkaWNhdGUsIGNvbnRleHQsIG5vdFNldFZhbHVlKSB7XG4gICAgdmFyIGVudHJ5ID0gdGhpcy5maW5kRW50cnkocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICByZXR1cm4gZW50cnkgPyBlbnRyeVsxXSA6IG5vdFNldFZhbHVlO1xuICB9LFxuXG4gIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goc2lkZUVmZmVjdCwgY29udGV4dCkge1xuICAgIGFzc2VydE5vdEluZmluaXRlKHRoaXMuc2l6ZSk7XG4gICAgcmV0dXJuIHRoaXMuX19pdGVyYXRlKGNvbnRleHQgPyBzaWRlRWZmZWN0LmJpbmQoY29udGV4dCkgOiBzaWRlRWZmZWN0KTtcbiAgfSxcblxuICBqb2luOiBmdW5jdGlvbiBqb2luKHNlcGFyYXRvcikge1xuICAgIGFzc2VydE5vdEluZmluaXRlKHRoaXMuc2l6ZSk7XG4gICAgc2VwYXJhdG9yID0gc2VwYXJhdG9yICE9PSB1bmRlZmluZWQgPyAnJyArIHNlcGFyYXRvciA6ICcsJztcbiAgICB2YXIgam9pbmVkID0gJyc7XG4gICAgdmFyIGlzRmlyc3QgPSB0cnVlO1xuICAgIHRoaXMuX19pdGVyYXRlKGZ1bmN0aW9uICh2KSB7XG4gICAgICBpc0ZpcnN0ID8gKGlzRmlyc3QgPSBmYWxzZSkgOiAoam9pbmVkICs9IHNlcGFyYXRvcik7XG4gICAgICBqb2luZWQgKz0gdiAhPT0gbnVsbCAmJiB2ICE9PSB1bmRlZmluZWQgPyB2LnRvU3RyaW5nKCkgOiAnJztcbiAgICB9KTtcbiAgICByZXR1cm4gam9pbmVkO1xuICB9LFxuXG4gIGtleXM6IGZ1bmN0aW9uIGtleXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19pdGVyYXRvcihJVEVSQVRFX0tFWVMpO1xuICB9LFxuXG4gIG1hcDogZnVuY3Rpb24gbWFwKG1hcHBlciwgY29udGV4dCkge1xuICAgIHJldHVybiByZWlmeSh0aGlzLCBtYXBGYWN0b3J5KHRoaXMsIG1hcHBlciwgY29udGV4dCkpO1xuICB9LFxuXG4gIHJlZHVjZTogZnVuY3Rpb24gcmVkdWNlJDEocmVkdWNlciwgaW5pdGlhbFJlZHVjdGlvbiwgY29udGV4dCkge1xuICAgIHJldHVybiByZWR1Y2UoXG4gICAgICB0aGlzLFxuICAgICAgcmVkdWNlcixcbiAgICAgIGluaXRpYWxSZWR1Y3Rpb24sXG4gICAgICBjb250ZXh0LFxuICAgICAgYXJndW1lbnRzLmxlbmd0aCA8IDIsXG4gICAgICBmYWxzZVxuICAgICk7XG4gIH0sXG5cbiAgcmVkdWNlUmlnaHQ6IGZ1bmN0aW9uIHJlZHVjZVJpZ2h0KHJlZHVjZXIsIGluaXRpYWxSZWR1Y3Rpb24sIGNvbnRleHQpIHtcbiAgICByZXR1cm4gcmVkdWNlKFxuICAgICAgdGhpcyxcbiAgICAgIHJlZHVjZXIsXG4gICAgICBpbml0aWFsUmVkdWN0aW9uLFxuICAgICAgY29udGV4dCxcbiAgICAgIGFyZ3VtZW50cy5sZW5ndGggPCAyLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH0sXG5cbiAgcmV2ZXJzZTogZnVuY3Rpb24gcmV2ZXJzZSgpIHtcbiAgICByZXR1cm4gcmVpZnkodGhpcywgcmV2ZXJzZUZhY3RvcnkodGhpcywgdHJ1ZSkpO1xuICB9LFxuXG4gIHNsaWNlOiBmdW5jdGlvbiBzbGljZShiZWdpbiwgZW5kKSB7XG4gICAgcmV0dXJuIHJlaWZ5KHRoaXMsIHNsaWNlRmFjdG9yeSh0aGlzLCBiZWdpbiwgZW5kLCB0cnVlKSk7XG4gIH0sXG5cbiAgc29tZTogZnVuY3Rpb24gc29tZShwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gIXRoaXMuZXZlcnkobm90KHByZWRpY2F0ZSksIGNvbnRleHQpO1xuICB9LFxuXG4gIHNvcnQ6IGZ1bmN0aW9uIHNvcnQoY29tcGFyYXRvcikge1xuICAgIHJldHVybiByZWlmeSh0aGlzLCBzb3J0RmFjdG9yeSh0aGlzLCBjb21wYXJhdG9yKSk7XG4gIH0sXG5cbiAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19pdGVyYXRvcihJVEVSQVRFX1ZBTFVFUyk7XG4gIH0sXG5cbiAgLy8gIyMjIE1vcmUgc2VxdWVudGlhbCBtZXRob2RzXG5cbiAgYnV0TGFzdDogZnVuY3Rpb24gYnV0TGFzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5zbGljZSgwLCAtMSk7XG4gIH0sXG5cbiAgaXNFbXB0eTogZnVuY3Rpb24gaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5zaXplICE9PSB1bmRlZmluZWQgPyB0aGlzLnNpemUgPT09IDAgOiAhdGhpcy5zb21lKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH0pO1xuICB9LFxuXG4gIGNvdW50OiBmdW5jdGlvbiBjb3VudChwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gZW5zdXJlU2l6ZShcbiAgICAgIHByZWRpY2F0ZSA/IHRoaXMudG9TZXEoKS5maWx0ZXIocHJlZGljYXRlLCBjb250ZXh0KSA6IHRoaXNcbiAgICApO1xuICB9LFxuXG4gIGNvdW50Qnk6IGZ1bmN0aW9uIGNvdW50QnkoZ3JvdXBlciwgY29udGV4dCkge1xuICAgIHJldHVybiBjb3VudEJ5RmFjdG9yeSh0aGlzLCBncm91cGVyLCBjb250ZXh0KTtcbiAgfSxcblxuICBlcXVhbHM6IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICAgIHJldHVybiBkZWVwRXF1YWwodGhpcywgb3RoZXIpO1xuICB9LFxuXG4gIGVudHJ5U2VxOiBmdW5jdGlvbiBlbnRyeVNlcSgpIHtcbiAgICB2YXIgY29sbGVjdGlvbiA9IHRoaXM7XG4gICAgaWYgKGNvbGxlY3Rpb24uX2NhY2hlKSB7XG4gICAgICAvLyBXZSBjYWNoZSBhcyBhbiBlbnRyaWVzIGFycmF5LCBzbyB3ZSBjYW4ganVzdCByZXR1cm4gdGhlIGNhY2hlIVxuICAgICAgcmV0dXJuIG5ldyBBcnJheVNlcShjb2xsZWN0aW9uLl9jYWNoZSk7XG4gICAgfVxuICAgIHZhciBlbnRyaWVzU2VxdWVuY2UgPSBjb2xsZWN0aW9uXG4gICAgICAudG9TZXEoKVxuICAgICAgLm1hcChlbnRyeU1hcHBlcilcbiAgICAgIC50b0luZGV4ZWRTZXEoKTtcbiAgICBlbnRyaWVzU2VxdWVuY2UuZnJvbUVudHJ5U2VxID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gY29sbGVjdGlvbi50b1NlcSgpOyB9O1xuICAgIHJldHVybiBlbnRyaWVzU2VxdWVuY2U7XG4gIH0sXG5cbiAgZmlsdGVyTm90OiBmdW5jdGlvbiBmaWx0ZXJOb3QocHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyKG5vdChwcmVkaWNhdGUpLCBjb250ZXh0KTtcbiAgfSxcblxuICBmaW5kRW50cnk6IGZ1bmN0aW9uIGZpbmRFbnRyeShwcmVkaWNhdGUsIGNvbnRleHQsIG5vdFNldFZhbHVlKSB7XG4gICAgdmFyIGZvdW5kID0gbm90U2V0VmFsdWU7XG4gICAgdGhpcy5fX2l0ZXJhdGUoZnVuY3Rpb24gKHYsIGssIGMpIHtcbiAgICAgIGlmIChwcmVkaWNhdGUuY2FsbChjb250ZXh0LCB2LCBrLCBjKSkge1xuICAgICAgICBmb3VuZCA9IFtrLCB2XTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmb3VuZDtcbiAgfSxcblxuICBmaW5kS2V5OiBmdW5jdGlvbiBmaW5kS2V5KHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHZhciBlbnRyeSA9IHRoaXMuZmluZEVudHJ5KHByZWRpY2F0ZSwgY29udGV4dCk7XG4gICAgcmV0dXJuIGVudHJ5ICYmIGVudHJ5WzBdO1xuICB9LFxuXG4gIGZpbmRMYXN0OiBmdW5jdGlvbiBmaW5kTGFzdChwcmVkaWNhdGUsIGNvbnRleHQsIG5vdFNldFZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMudG9LZXllZFNlcSgpXG4gICAgICAucmV2ZXJzZSgpXG4gICAgICAuZmluZChwcmVkaWNhdGUsIGNvbnRleHQsIG5vdFNldFZhbHVlKTtcbiAgfSxcblxuICBmaW5kTGFzdEVudHJ5OiBmdW5jdGlvbiBmaW5kTGFzdEVudHJ5KHByZWRpY2F0ZSwgY29udGV4dCwgbm90U2V0VmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy50b0tleWVkU2VxKClcbiAgICAgIC5yZXZlcnNlKClcbiAgICAgIC5maW5kRW50cnkocHJlZGljYXRlLCBjb250ZXh0LCBub3RTZXRWYWx1ZSk7XG4gIH0sXG5cbiAgZmluZExhc3RLZXk6IGZ1bmN0aW9uIGZpbmRMYXN0S2V5KHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLnRvS2V5ZWRTZXEoKVxuICAgICAgLnJldmVyc2UoKVxuICAgICAgLmZpbmRLZXkocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgfSxcblxuICBmaXJzdDogZnVuY3Rpb24gZmlyc3Qobm90U2V0VmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKHJldHVyblRydWUsIG51bGwsIG5vdFNldFZhbHVlKTtcbiAgfSxcblxuICBmbGF0TWFwOiBmdW5jdGlvbiBmbGF0TWFwKG1hcHBlciwgY29udGV4dCkge1xuICAgIHJldHVybiByZWlmeSh0aGlzLCBmbGF0TWFwRmFjdG9yeSh0aGlzLCBtYXBwZXIsIGNvbnRleHQpKTtcbiAgfSxcblxuICBmbGF0dGVuOiBmdW5jdGlvbiBmbGF0dGVuKGRlcHRoKSB7XG4gICAgcmV0dXJuIHJlaWZ5KHRoaXMsIGZsYXR0ZW5GYWN0b3J5KHRoaXMsIGRlcHRoLCB0cnVlKSk7XG4gIH0sXG5cbiAgZnJvbUVudHJ5U2VxOiBmdW5jdGlvbiBmcm9tRW50cnlTZXEoKSB7XG4gICAgcmV0dXJuIG5ldyBGcm9tRW50cmllc1NlcXVlbmNlKHRoaXMpO1xuICB9LFxuXG4gIGdldDogZnVuY3Rpb24gZ2V0KHNlYXJjaEtleSwgbm90U2V0VmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKGZ1bmN0aW9uIChfLCBrZXkpIHsgcmV0dXJuIGlzKGtleSwgc2VhcmNoS2V5KTsgfSwgdW5kZWZpbmVkLCBub3RTZXRWYWx1ZSk7XG4gIH0sXG5cbiAgZ2V0SW46IGdldEluJDEsXG5cbiAgZ3JvdXBCeTogZnVuY3Rpb24gZ3JvdXBCeShncm91cGVyLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGdyb3VwQnlGYWN0b3J5KHRoaXMsIGdyb3VwZXIsIGNvbnRleHQpO1xuICB9LFxuXG4gIGhhczogZnVuY3Rpb24gaGFzKHNlYXJjaEtleSkge1xuICAgIHJldHVybiB0aGlzLmdldChzZWFyY2hLZXksIE5PVF9TRVQpICE9PSBOT1RfU0VUO1xuICB9LFxuXG4gIGhhc0luOiBoYXNJbiQxLFxuXG4gIGlzU3Vic2V0OiBmdW5jdGlvbiBpc1N1YnNldChpdGVyKSB7XG4gICAgaXRlciA9IHR5cGVvZiBpdGVyLmluY2x1ZGVzID09PSAnZnVuY3Rpb24nID8gaXRlciA6IENvbGxlY3Rpb24oaXRlcik7XG4gICAgcmV0dXJuIHRoaXMuZXZlcnkoZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBpdGVyLmluY2x1ZGVzKHZhbHVlKTsgfSk7XG4gIH0sXG5cbiAgaXNTdXBlcnNldDogZnVuY3Rpb24gaXNTdXBlcnNldChpdGVyKSB7XG4gICAgaXRlciA9IHR5cGVvZiBpdGVyLmlzU3Vic2V0ID09PSAnZnVuY3Rpb24nID8gaXRlciA6IENvbGxlY3Rpb24oaXRlcik7XG4gICAgcmV0dXJuIGl0ZXIuaXNTdWJzZXQodGhpcyk7XG4gIH0sXG5cbiAga2V5T2Y6IGZ1bmN0aW9uIGtleU9mKHNlYXJjaFZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluZEtleShmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIGlzKHZhbHVlLCBzZWFyY2hWYWx1ZSk7IH0pO1xuICB9LFxuXG4gIGtleVNlcTogZnVuY3Rpb24ga2V5U2VxKCkge1xuICAgIHJldHVybiB0aGlzLnRvU2VxKClcbiAgICAgIC5tYXAoa2V5TWFwcGVyKVxuICAgICAgLnRvSW5kZXhlZFNlcSgpO1xuICB9LFxuXG4gIGxhc3Q6IGZ1bmN0aW9uIGxhc3Qobm90U2V0VmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy50b1NlcSgpXG4gICAgICAucmV2ZXJzZSgpXG4gICAgICAuZmlyc3Qobm90U2V0VmFsdWUpO1xuICB9LFxuXG4gIGxhc3RLZXlPZjogZnVuY3Rpb24gbGFzdEtleU9mKHNlYXJjaFZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMudG9LZXllZFNlcSgpXG4gICAgICAucmV2ZXJzZSgpXG4gICAgICAua2V5T2Yoc2VhcmNoVmFsdWUpO1xuICB9LFxuXG4gIG1heDogZnVuY3Rpb24gbWF4KGNvbXBhcmF0b3IpIHtcbiAgICByZXR1cm4gbWF4RmFjdG9yeSh0aGlzLCBjb21wYXJhdG9yKTtcbiAgfSxcblxuICBtYXhCeTogZnVuY3Rpb24gbWF4QnkobWFwcGVyLCBjb21wYXJhdG9yKSB7XG4gICAgcmV0dXJuIG1heEZhY3RvcnkodGhpcywgY29tcGFyYXRvciwgbWFwcGVyKTtcbiAgfSxcblxuICBtaW46IGZ1bmN0aW9uIG1pbihjb21wYXJhdG9yKSB7XG4gICAgcmV0dXJuIG1heEZhY3RvcnkoXG4gICAgICB0aGlzLFxuICAgICAgY29tcGFyYXRvciA/IG5lZyhjb21wYXJhdG9yKSA6IGRlZmF1bHROZWdDb21wYXJhdG9yXG4gICAgKTtcbiAgfSxcblxuICBtaW5CeTogZnVuY3Rpb24gbWluQnkobWFwcGVyLCBjb21wYXJhdG9yKSB7XG4gICAgcmV0dXJuIG1heEZhY3RvcnkoXG4gICAgICB0aGlzLFxuICAgICAgY29tcGFyYXRvciA/IG5lZyhjb21wYXJhdG9yKSA6IGRlZmF1bHROZWdDb21wYXJhdG9yLFxuICAgICAgbWFwcGVyXG4gICAgKTtcbiAgfSxcblxuICByZXN0OiBmdW5jdGlvbiByZXN0KCkge1xuICAgIHJldHVybiB0aGlzLnNsaWNlKDEpO1xuICB9LFxuXG4gIHNraXA6IGZ1bmN0aW9uIHNraXAoYW1vdW50KSB7XG4gICAgcmV0dXJuIGFtb3VudCA9PT0gMCA/IHRoaXMgOiB0aGlzLnNsaWNlKE1hdGgubWF4KDAsIGFtb3VudCkpO1xuICB9LFxuXG4gIHNraXBMYXN0OiBmdW5jdGlvbiBza2lwTGFzdChhbW91bnQpIHtcbiAgICByZXR1cm4gYW1vdW50ID09PSAwID8gdGhpcyA6IHRoaXMuc2xpY2UoMCwgLU1hdGgubWF4KDAsIGFtb3VudCkpO1xuICB9LFxuXG4gIHNraXBXaGlsZTogZnVuY3Rpb24gc2tpcFdoaWxlKHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHJldHVybiByZWlmeSh0aGlzLCBza2lwV2hpbGVGYWN0b3J5KHRoaXMsIHByZWRpY2F0ZSwgY29udGV4dCwgdHJ1ZSkpO1xuICB9LFxuXG4gIHNraXBVbnRpbDogZnVuY3Rpb24gc2tpcFVudGlsKHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLnNraXBXaGlsZShub3QocHJlZGljYXRlKSwgY29udGV4dCk7XG4gIH0sXG5cbiAgc29ydEJ5OiBmdW5jdGlvbiBzb3J0QnkobWFwcGVyLCBjb21wYXJhdG9yKSB7XG4gICAgcmV0dXJuIHJlaWZ5KHRoaXMsIHNvcnRGYWN0b3J5KHRoaXMsIGNvbXBhcmF0b3IsIG1hcHBlcikpO1xuICB9LFxuXG4gIHRha2U6IGZ1bmN0aW9uIHRha2UoYW1vdW50KSB7XG4gICAgcmV0dXJuIHRoaXMuc2xpY2UoMCwgTWF0aC5tYXgoMCwgYW1vdW50KSk7XG4gIH0sXG5cbiAgdGFrZUxhc3Q6IGZ1bmN0aW9uIHRha2VMYXN0KGFtb3VudCkge1xuICAgIHJldHVybiB0aGlzLnNsaWNlKC1NYXRoLm1heCgwLCBhbW91bnQpKTtcbiAgfSxcblxuICB0YWtlV2hpbGU6IGZ1bmN0aW9uIHRha2VXaGlsZShwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gcmVpZnkodGhpcywgdGFrZVdoaWxlRmFjdG9yeSh0aGlzLCBwcmVkaWNhdGUsIGNvbnRleHQpKTtcbiAgfSxcblxuICB0YWtlVW50aWw6IGZ1bmN0aW9uIHRha2VVbnRpbChwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy50YWtlV2hpbGUobm90KHByZWRpY2F0ZSksIGNvbnRleHQpO1xuICB9LFxuXG4gIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKGZuKSB7XG4gICAgcmV0dXJuIGZuKHRoaXMpO1xuICB9LFxuXG4gIHZhbHVlU2VxOiBmdW5jdGlvbiB2YWx1ZVNlcSgpIHtcbiAgICByZXR1cm4gdGhpcy50b0luZGV4ZWRTZXEoKTtcbiAgfSxcblxuICAvLyAjIyMgSGFzaGFibGUgT2JqZWN0XG5cbiAgaGFzaENvZGU6IGZ1bmN0aW9uIGhhc2hDb2RlKCkge1xuICAgIHJldHVybiB0aGlzLl9faGFzaCB8fCAodGhpcy5fX2hhc2ggPSBoYXNoQ29sbGVjdGlvbih0aGlzKSk7XG4gIH0sXG5cbiAgLy8gIyMjIEludGVybmFsXG5cbiAgLy8gYWJzdHJhY3QgX19pdGVyYXRlKGZuLCByZXZlcnNlKVxuXG4gIC8vIGFic3RyYWN0IF9faXRlcmF0b3IodHlwZSwgcmV2ZXJzZSlcbn0pO1xuXG52YXIgQ29sbGVjdGlvblByb3RvdHlwZSA9IENvbGxlY3Rpb24ucHJvdG90eXBlO1xuQ29sbGVjdGlvblByb3RvdHlwZVtJU19DT0xMRUNUSU9OX1NZTUJPTF0gPSB0cnVlO1xuQ29sbGVjdGlvblByb3RvdHlwZVtJVEVSQVRPUl9TWU1CT0xdID0gQ29sbGVjdGlvblByb3RvdHlwZS52YWx1ZXM7XG5Db2xsZWN0aW9uUHJvdG90eXBlLnRvSlNPTiA9IENvbGxlY3Rpb25Qcm90b3R5cGUudG9BcnJheTtcbkNvbGxlY3Rpb25Qcm90b3R5cGUuX190b1N0cmluZ01hcHBlciA9IHF1b3RlU3RyaW5nO1xuQ29sbGVjdGlvblByb3RvdHlwZS5pbnNwZWN0ID0gQ29sbGVjdGlvblByb3RvdHlwZS50b1NvdXJjZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy50b1N0cmluZygpO1xufTtcbkNvbGxlY3Rpb25Qcm90b3R5cGUuY2hhaW4gPSBDb2xsZWN0aW9uUHJvdG90eXBlLmZsYXRNYXA7XG5Db2xsZWN0aW9uUHJvdG90eXBlLmNvbnRhaW5zID0gQ29sbGVjdGlvblByb3RvdHlwZS5pbmNsdWRlcztcblxubWl4aW4oS2V5ZWRDb2xsZWN0aW9uLCB7XG4gIC8vICMjIyBNb3JlIHNlcXVlbnRpYWwgbWV0aG9kc1xuXG4gIGZsaXA6IGZ1bmN0aW9uIGZsaXAoKSB7XG4gICAgcmV0dXJuIHJlaWZ5KHRoaXMsIGZsaXBGYWN0b3J5KHRoaXMpKTtcbiAgfSxcblxuICBtYXBFbnRyaWVzOiBmdW5jdGlvbiBtYXBFbnRyaWVzKG1hcHBlciwgY29udGV4dCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgIHJldHVybiByZWlmeShcbiAgICAgIHRoaXMsXG4gICAgICB0aGlzLnRvU2VxKClcbiAgICAgICAgLm1hcChmdW5jdGlvbiAodiwgaykgeyByZXR1cm4gbWFwcGVyLmNhbGwoY29udGV4dCwgW2ssIHZdLCBpdGVyYXRpb25zKyssIHRoaXMkMSk7IH0pXG4gICAgICAgIC5mcm9tRW50cnlTZXEoKVxuICAgICk7XG4gIH0sXG5cbiAgbWFwS2V5czogZnVuY3Rpb24gbWFwS2V5cyhtYXBwZXIsIGNvbnRleHQpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHJldHVybiByZWlmeShcbiAgICAgIHRoaXMsXG4gICAgICB0aGlzLnRvU2VxKClcbiAgICAgICAgLmZsaXAoKVxuICAgICAgICAubWFwKGZ1bmN0aW9uIChrLCB2KSB7IHJldHVybiBtYXBwZXIuY2FsbChjb250ZXh0LCBrLCB2LCB0aGlzJDEpOyB9KVxuICAgICAgICAuZmxpcCgpXG4gICAgKTtcbiAgfSxcbn0pO1xuXG52YXIgS2V5ZWRDb2xsZWN0aW9uUHJvdG90eXBlID0gS2V5ZWRDb2xsZWN0aW9uLnByb3RvdHlwZTtcbktleWVkQ29sbGVjdGlvblByb3RvdHlwZVtJU19LRVlFRF9TWU1CT0xdID0gdHJ1ZTtcbktleWVkQ29sbGVjdGlvblByb3RvdHlwZVtJVEVSQVRPUl9TWU1CT0xdID0gQ29sbGVjdGlvblByb3RvdHlwZS5lbnRyaWVzO1xuS2V5ZWRDb2xsZWN0aW9uUHJvdG90eXBlLnRvSlNPTiA9IHRvT2JqZWN0O1xuS2V5ZWRDb2xsZWN0aW9uUHJvdG90eXBlLl9fdG9TdHJpbmdNYXBwZXIgPSBmdW5jdGlvbiAodiwgaykgeyByZXR1cm4gcXVvdGVTdHJpbmcoaykgKyAnOiAnICsgcXVvdGVTdHJpbmcodik7IH07XG5cbm1peGluKEluZGV4ZWRDb2xsZWN0aW9uLCB7XG4gIC8vICMjIyBDb252ZXJzaW9uIHRvIG90aGVyIHR5cGVzXG5cbiAgdG9LZXllZFNlcTogZnVuY3Rpb24gdG9LZXllZFNlcSgpIHtcbiAgICByZXR1cm4gbmV3IFRvS2V5ZWRTZXF1ZW5jZSh0aGlzLCBmYWxzZSk7XG4gIH0sXG5cbiAgLy8gIyMjIEVTNiBDb2xsZWN0aW9uIG1ldGhvZHMgKEVTNiBBcnJheSBhbmQgTWFwKVxuXG4gIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHJldHVybiByZWlmeSh0aGlzLCBmaWx0ZXJGYWN0b3J5KHRoaXMsIHByZWRpY2F0ZSwgY29udGV4dCwgZmFsc2UpKTtcbiAgfSxcblxuICBmaW5kSW5kZXg6IGZ1bmN0aW9uIGZpbmRJbmRleChwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgZW50cnkgPSB0aGlzLmZpbmRFbnRyeShwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgIHJldHVybiBlbnRyeSA/IGVudHJ5WzBdIDogLTE7XG4gIH0sXG5cbiAgaW5kZXhPZjogZnVuY3Rpb24gaW5kZXhPZihzZWFyY2hWYWx1ZSkge1xuICAgIHZhciBrZXkgPSB0aGlzLmtleU9mKHNlYXJjaFZhbHVlKTtcbiAgICByZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgPyAtMSA6IGtleTtcbiAgfSxcblxuICBsYXN0SW5kZXhPZjogZnVuY3Rpb24gbGFzdEluZGV4T2Yoc2VhcmNoVmFsdWUpIHtcbiAgICB2YXIga2V5ID0gdGhpcy5sYXN0S2V5T2Yoc2VhcmNoVmFsdWUpO1xuICAgIHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCA/IC0xIDoga2V5O1xuICB9LFxuXG4gIHJldmVyc2U6IGZ1bmN0aW9uIHJldmVyc2UoKSB7XG4gICAgcmV0dXJuIHJlaWZ5KHRoaXMsIHJldmVyc2VGYWN0b3J5KHRoaXMsIGZhbHNlKSk7XG4gIH0sXG5cbiAgc2xpY2U6IGZ1bmN0aW9uIHNsaWNlKGJlZ2luLCBlbmQpIHtcbiAgICByZXR1cm4gcmVpZnkodGhpcywgc2xpY2VGYWN0b3J5KHRoaXMsIGJlZ2luLCBlbmQsIGZhbHNlKSk7XG4gIH0sXG5cbiAgc3BsaWNlOiBmdW5jdGlvbiBzcGxpY2UoaW5kZXgsIHJlbW92ZU51bSAvKiwgLi4udmFsdWVzKi8pIHtcbiAgICB2YXIgbnVtQXJncyA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgcmVtb3ZlTnVtID0gTWF0aC5tYXgocmVtb3ZlTnVtIHx8IDAsIDApO1xuICAgIGlmIChudW1BcmdzID09PSAwIHx8IChudW1BcmdzID09PSAyICYmICFyZW1vdmVOdW0pKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLy8gSWYgaW5kZXggaXMgbmVnYXRpdmUsIGl0IHNob3VsZCByZXNvbHZlIHJlbGF0aXZlIHRvIHRoZSBzaXplIG9mIHRoZVxuICAgIC8vIGNvbGxlY3Rpb24uIEhvd2V2ZXIgc2l6ZSBtYXkgYmUgZXhwZW5zaXZlIHRvIGNvbXB1dGUgaWYgbm90IGNhY2hlZCwgc29cbiAgICAvLyBvbmx5IGNhbGwgY291bnQoKSBpZiB0aGUgbnVtYmVyIGlzIGluIGZhY3QgbmVnYXRpdmUuXG4gICAgaW5kZXggPSByZXNvbHZlQmVnaW4oaW5kZXgsIGluZGV4IDwgMCA/IHRoaXMuY291bnQoKSA6IHRoaXMuc2l6ZSk7XG4gICAgdmFyIHNwbGljZWQgPSB0aGlzLnNsaWNlKDAsIGluZGV4KTtcbiAgICByZXR1cm4gcmVpZnkoXG4gICAgICB0aGlzLFxuICAgICAgbnVtQXJncyA9PT0gMVxuICAgICAgICA/IHNwbGljZWRcbiAgICAgICAgOiBzcGxpY2VkLmNvbmNhdChhcnJDb3B5KGFyZ3VtZW50cywgMiksIHRoaXMuc2xpY2UoaW5kZXggKyByZW1vdmVOdW0pKVxuICAgICk7XG4gIH0sXG5cbiAgLy8gIyMjIE1vcmUgY29sbGVjdGlvbiBtZXRob2RzXG5cbiAgZmluZExhc3RJbmRleDogZnVuY3Rpb24gZmluZExhc3RJbmRleChwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgZW50cnkgPSB0aGlzLmZpbmRMYXN0RW50cnkocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICByZXR1cm4gZW50cnkgPyBlbnRyeVswXSA6IC0xO1xuICB9LFxuXG4gIGZpcnN0OiBmdW5jdGlvbiBmaXJzdChub3RTZXRWYWx1ZSkge1xuICAgIHJldHVybiB0aGlzLmdldCgwLCBub3RTZXRWYWx1ZSk7XG4gIH0sXG5cbiAgZmxhdHRlbjogZnVuY3Rpb24gZmxhdHRlbihkZXB0aCkge1xuICAgIHJldHVybiByZWlmeSh0aGlzLCBmbGF0dGVuRmFjdG9yeSh0aGlzLCBkZXB0aCwgZmFsc2UpKTtcbiAgfSxcblxuICBnZXQ6IGZ1bmN0aW9uIGdldChpbmRleCwgbm90U2V0VmFsdWUpIHtcbiAgICBpbmRleCA9IHdyYXBJbmRleCh0aGlzLCBpbmRleCk7XG4gICAgcmV0dXJuIGluZGV4IDwgMCB8fFxuICAgICAgKHRoaXMuc2l6ZSA9PT0gSW5maW5pdHkgfHwgKHRoaXMuc2l6ZSAhPT0gdW5kZWZpbmVkICYmIGluZGV4ID4gdGhpcy5zaXplKSlcbiAgICAgID8gbm90U2V0VmFsdWVcbiAgICAgIDogdGhpcy5maW5kKGZ1bmN0aW9uIChfLCBrZXkpIHsgcmV0dXJuIGtleSA9PT0gaW5kZXg7IH0sIHVuZGVmaW5lZCwgbm90U2V0VmFsdWUpO1xuICB9LFxuXG4gIGhhczogZnVuY3Rpb24gaGFzKGluZGV4KSB7XG4gICAgaW5kZXggPSB3cmFwSW5kZXgodGhpcywgaW5kZXgpO1xuICAgIHJldHVybiAoXG4gICAgICBpbmRleCA+PSAwICYmXG4gICAgICAodGhpcy5zaXplICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLnNpemUgPT09IEluZmluaXR5IHx8IGluZGV4IDwgdGhpcy5zaXplXG4gICAgICAgIDogdGhpcy5pbmRleE9mKGluZGV4KSAhPT0gLTEpXG4gICAgKTtcbiAgfSxcblxuICBpbnRlcnBvc2U6IGZ1bmN0aW9uIGludGVycG9zZShzZXBhcmF0b3IpIHtcbiAgICByZXR1cm4gcmVpZnkodGhpcywgaW50ZXJwb3NlRmFjdG9yeSh0aGlzLCBzZXBhcmF0b3IpKTtcbiAgfSxcblxuICBpbnRlcmxlYXZlOiBmdW5jdGlvbiBpbnRlcmxlYXZlKC8qLi4uY29sbGVjdGlvbnMqLykge1xuICAgIHZhciBjb2xsZWN0aW9ucyA9IFt0aGlzXS5jb25jYXQoYXJyQ29weShhcmd1bWVudHMpKTtcbiAgICB2YXIgemlwcGVkID0gemlwV2l0aEZhY3RvcnkodGhpcy50b1NlcSgpLCBJbmRleGVkU2VxLm9mLCBjb2xsZWN0aW9ucyk7XG4gICAgdmFyIGludGVybGVhdmVkID0gemlwcGVkLmZsYXR0ZW4odHJ1ZSk7XG4gICAgaWYgKHppcHBlZC5zaXplKSB7XG4gICAgICBpbnRlcmxlYXZlZC5zaXplID0gemlwcGVkLnNpemUgKiBjb2xsZWN0aW9ucy5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiByZWlmeSh0aGlzLCBpbnRlcmxlYXZlZCk7XG4gIH0sXG5cbiAga2V5U2VxOiBmdW5jdGlvbiBrZXlTZXEoKSB7XG4gICAgcmV0dXJuIFJhbmdlKDAsIHRoaXMuc2l6ZSk7XG4gIH0sXG5cbiAgbGFzdDogZnVuY3Rpb24gbGFzdChub3RTZXRWYWx1ZSkge1xuICAgIHJldHVybiB0aGlzLmdldCgtMSwgbm90U2V0VmFsdWUpO1xuICB9LFxuXG4gIHNraXBXaGlsZTogZnVuY3Rpb24gc2tpcFdoaWxlKHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHJldHVybiByZWlmeSh0aGlzLCBza2lwV2hpbGVGYWN0b3J5KHRoaXMsIHByZWRpY2F0ZSwgY29udGV4dCwgZmFsc2UpKTtcbiAgfSxcblxuICB6aXA6IGZ1bmN0aW9uIHppcCgvKiwgLi4uY29sbGVjdGlvbnMgKi8pIHtcbiAgICB2YXIgY29sbGVjdGlvbnMgPSBbdGhpc10uY29uY2F0KGFyckNvcHkoYXJndW1lbnRzKSk7XG4gICAgcmV0dXJuIHJlaWZ5KHRoaXMsIHppcFdpdGhGYWN0b3J5KHRoaXMsIGRlZmF1bHRaaXBwZXIsIGNvbGxlY3Rpb25zKSk7XG4gIH0sXG5cbiAgemlwQWxsOiBmdW5jdGlvbiB6aXBBbGwoLyosIC4uLmNvbGxlY3Rpb25zICovKSB7XG4gICAgdmFyIGNvbGxlY3Rpb25zID0gW3RoaXNdLmNvbmNhdChhcnJDb3B5KGFyZ3VtZW50cykpO1xuICAgIHJldHVybiByZWlmeSh0aGlzLCB6aXBXaXRoRmFjdG9yeSh0aGlzLCBkZWZhdWx0WmlwcGVyLCBjb2xsZWN0aW9ucywgdHJ1ZSkpO1xuICB9LFxuXG4gIHppcFdpdGg6IGZ1bmN0aW9uIHppcFdpdGgoemlwcGVyIC8qLCAuLi5jb2xsZWN0aW9ucyAqLykge1xuICAgIHZhciBjb2xsZWN0aW9ucyA9IGFyckNvcHkoYXJndW1lbnRzKTtcbiAgICBjb2xsZWN0aW9uc1swXSA9IHRoaXM7XG4gICAgcmV0dXJuIHJlaWZ5KHRoaXMsIHppcFdpdGhGYWN0b3J5KHRoaXMsIHppcHBlciwgY29sbGVjdGlvbnMpKTtcbiAgfSxcbn0pO1xuXG52YXIgSW5kZXhlZENvbGxlY3Rpb25Qcm90b3R5cGUgPSBJbmRleGVkQ29sbGVjdGlvbi5wcm90b3R5cGU7XG5JbmRleGVkQ29sbGVjdGlvblByb3RvdHlwZVtJU19JTkRFWEVEX1NZTUJPTF0gPSB0cnVlO1xuSW5kZXhlZENvbGxlY3Rpb25Qcm90b3R5cGVbSVNfT1JERVJFRF9TWU1CT0xdID0gdHJ1ZTtcblxubWl4aW4oU2V0Q29sbGVjdGlvbiwge1xuICAvLyAjIyMgRVM2IENvbGxlY3Rpb24gbWV0aG9kcyAoRVM2IEFycmF5IGFuZCBNYXApXG5cbiAgZ2V0OiBmdW5jdGlvbiBnZXQodmFsdWUsIG5vdFNldFZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzKHZhbHVlKSA/IHZhbHVlIDogbm90U2V0VmFsdWU7XG4gIH0sXG5cbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzKHZhbHVlKTtcbiAgfSxcblxuICAvLyAjIyMgTW9yZSBzZXF1ZW50aWFsIG1ldGhvZHNcblxuICBrZXlTZXE6IGZ1bmN0aW9uIGtleVNlcSgpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZVNlcSgpO1xuICB9LFxufSk7XG5cblNldENvbGxlY3Rpb24ucHJvdG90eXBlLmhhcyA9IENvbGxlY3Rpb25Qcm90b3R5cGUuaW5jbHVkZXM7XG5TZXRDb2xsZWN0aW9uLnByb3RvdHlwZS5jb250YWlucyA9IFNldENvbGxlY3Rpb24ucHJvdG90eXBlLmluY2x1ZGVzO1xuXG4vLyBNaXhpbiBzdWJjbGFzc2VzXG5cbm1peGluKEtleWVkU2VxLCBLZXllZENvbGxlY3Rpb24ucHJvdG90eXBlKTtcbm1peGluKEluZGV4ZWRTZXEsIEluZGV4ZWRDb2xsZWN0aW9uLnByb3RvdHlwZSk7XG5taXhpbihTZXRTZXEsIFNldENvbGxlY3Rpb24ucHJvdG90eXBlKTtcblxuLy8gI3ByYWdtYSBIZWxwZXIgZnVuY3Rpb25zXG5cbmZ1bmN0aW9uIHJlZHVjZShjb2xsZWN0aW9uLCByZWR1Y2VyLCByZWR1Y3Rpb24sIGNvbnRleHQsIHVzZUZpcnN0LCByZXZlcnNlKSB7XG4gIGFzc2VydE5vdEluZmluaXRlKGNvbGxlY3Rpb24uc2l6ZSk7XG4gIGNvbGxlY3Rpb24uX19pdGVyYXRlKGZ1bmN0aW9uICh2LCBrLCBjKSB7XG4gICAgaWYgKHVzZUZpcnN0KSB7XG4gICAgICB1c2VGaXJzdCA9IGZhbHNlO1xuICAgICAgcmVkdWN0aW9uID0gdjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVkdWN0aW9uID0gcmVkdWNlci5jYWxsKGNvbnRleHQsIHJlZHVjdGlvbiwgdiwgaywgYyk7XG4gICAgfVxuICB9LCByZXZlcnNlKTtcbiAgcmV0dXJuIHJlZHVjdGlvbjtcbn1cblxuZnVuY3Rpb24ga2V5TWFwcGVyKHYsIGspIHtcbiAgcmV0dXJuIGs7XG59XG5cbmZ1bmN0aW9uIGVudHJ5TWFwcGVyKHYsIGspIHtcbiAgcmV0dXJuIFtrLCB2XTtcbn1cblxuZnVuY3Rpb24gbm90KHByZWRpY2F0ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICFwcmVkaWNhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gbmVnKHByZWRpY2F0ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIC1wcmVkaWNhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFppcHBlcigpIHtcbiAgcmV0dXJuIGFyckNvcHkoYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdE5lZ0NvbXBhcmF0b3IoYSwgYikge1xuICByZXR1cm4gYSA8IGIgPyAxIDogYSA+IGIgPyAtMSA6IDA7XG59XG5cbmZ1bmN0aW9uIGhhc2hDb2xsZWN0aW9uKGNvbGxlY3Rpb24pIHtcbiAgaWYgKGNvbGxlY3Rpb24uc2l6ZSA9PT0gSW5maW5pdHkpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICB2YXIgb3JkZXJlZCA9IGlzT3JkZXJlZChjb2xsZWN0aW9uKTtcbiAgdmFyIGtleWVkID0gaXNLZXllZChjb2xsZWN0aW9uKTtcbiAgdmFyIGggPSBvcmRlcmVkID8gMSA6IDA7XG4gIHZhciBzaXplID0gY29sbGVjdGlvbi5fX2l0ZXJhdGUoXG4gICAga2V5ZWRcbiAgICAgID8gb3JkZXJlZFxuICAgICAgICA/IGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICAgICAgICBoID0gKDMxICogaCArIGhhc2hNZXJnZShoYXNoKHYpLCBoYXNoKGspKSkgfCAwO1xuICAgICAgICAgIH1cbiAgICAgICAgOiBmdW5jdGlvbiAodiwgaykge1xuICAgICAgICAgICAgaCA9IChoICsgaGFzaE1lcmdlKGhhc2godiksIGhhc2goaykpKSB8IDA7XG4gICAgICAgICAgfVxuICAgICAgOiBvcmRlcmVkXG4gICAgICAgID8gZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgIGggPSAoMzEgKiBoICsgaGFzaCh2KSkgfCAwO1xuICAgICAgICAgIH1cbiAgICAgICAgOiBmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgaCA9IChoICsgaGFzaCh2KSkgfCAwO1xuICAgICAgICAgIH1cbiAgKTtcbiAgcmV0dXJuIG11cm11ckhhc2hPZlNpemUoc2l6ZSwgaCk7XG59XG5cbmZ1bmN0aW9uIG11cm11ckhhc2hPZlNpemUoc2l6ZSwgaCkge1xuICBoID0gaW11bChoLCAweGNjOWUyZDUxKTtcbiAgaCA9IGltdWwoKGggPDwgMTUpIHwgKGggPj4+IC0xNSksIDB4MWI4NzM1OTMpO1xuICBoID0gaW11bCgoaCA8PCAxMykgfCAoaCA+Pj4gLTEzKSwgNSk7XG4gIGggPSAoKGggKyAweGU2NTQ2YjY0KSB8IDApIF4gc2l6ZTtcbiAgaCA9IGltdWwoaCBeIChoID4+PiAxNiksIDB4ODVlYmNhNmIpO1xuICBoID0gaW11bChoIF4gKGggPj4+IDEzKSwgMHhjMmIyYWUzNSk7XG4gIGggPSBzbWkoaCBeIChoID4+PiAxNikpO1xuICByZXR1cm4gaDtcbn1cblxuZnVuY3Rpb24gaGFzaE1lcmdlKGEsIGIpIHtcbiAgcmV0dXJuIChhIF4gKGIgKyAweDllMzc3OWI5ICsgKGEgPDwgNikgKyAoYSA+PiAyKSkpIHwgMDsgLy8gaW50XG59XG5cbnZhciBPcmRlcmVkU2V0ID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoU2V0JCQxKSB7XG4gIGZ1bmN0aW9uIE9yZGVyZWRTZXQodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgPyBlbXB0eU9yZGVyZWRTZXQoKVxuICAgICAgOiBpc09yZGVyZWRTZXQodmFsdWUpXG4gICAgICAgID8gdmFsdWVcbiAgICAgICAgOiBlbXB0eU9yZGVyZWRTZXQoKS53aXRoTXV0YXRpb25zKGZ1bmN0aW9uIChzZXQpIHtcbiAgICAgICAgICAgIHZhciBpdGVyID0gU2V0Q29sbGVjdGlvbih2YWx1ZSk7XG4gICAgICAgICAgICBhc3NlcnROb3RJbmZpbml0ZShpdGVyLnNpemUpO1xuICAgICAgICAgICAgaXRlci5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7IHJldHVybiBzZXQuYWRkKHYpOyB9KTtcbiAgICAgICAgICB9KTtcbiAgfVxuXG4gIGlmICggU2V0JCQxICkgT3JkZXJlZFNldC5fX3Byb3RvX18gPSBTZXQkJDE7XG4gIE9yZGVyZWRTZXQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggU2V0JCQxICYmIFNldCQkMS5wcm90b3R5cGUgKTtcbiAgT3JkZXJlZFNldC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBPcmRlcmVkU2V0O1xuXG4gIE9yZGVyZWRTZXQub2YgPSBmdW5jdGlvbiBvZiAoLyouLi52YWx1ZXMqLykge1xuICAgIHJldHVybiB0aGlzKGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgT3JkZXJlZFNldC5mcm9tS2V5cyA9IGZ1bmN0aW9uIGZyb21LZXlzICh2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzKEtleWVkQ29sbGVjdGlvbih2YWx1ZSkua2V5U2VxKCkpO1xuICB9O1xuXG4gIE9yZGVyZWRTZXQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiB0aGlzLl9fdG9TdHJpbmcoJ09yZGVyZWRTZXQgeycsICd9Jyk7XG4gIH07XG5cbiAgcmV0dXJuIE9yZGVyZWRTZXQ7XG59KFNldCkpO1xuXG5PcmRlcmVkU2V0LmlzT3JkZXJlZFNldCA9IGlzT3JkZXJlZFNldDtcblxudmFyIE9yZGVyZWRTZXRQcm90b3R5cGUgPSBPcmRlcmVkU2V0LnByb3RvdHlwZTtcbk9yZGVyZWRTZXRQcm90b3R5cGVbSVNfT1JERVJFRF9TWU1CT0xdID0gdHJ1ZTtcbk9yZGVyZWRTZXRQcm90b3R5cGUuemlwID0gSW5kZXhlZENvbGxlY3Rpb25Qcm90b3R5cGUuemlwO1xuT3JkZXJlZFNldFByb3RvdHlwZS56aXBXaXRoID0gSW5kZXhlZENvbGxlY3Rpb25Qcm90b3R5cGUuemlwV2l0aDtcblxuT3JkZXJlZFNldFByb3RvdHlwZS5fX2VtcHR5ID0gZW1wdHlPcmRlcmVkU2V0O1xuT3JkZXJlZFNldFByb3RvdHlwZS5fX21ha2UgPSBtYWtlT3JkZXJlZFNldDtcblxuZnVuY3Rpb24gbWFrZU9yZGVyZWRTZXQobWFwLCBvd25lcklEKSB7XG4gIHZhciBzZXQgPSBPYmplY3QuY3JlYXRlKE9yZGVyZWRTZXRQcm90b3R5cGUpO1xuICBzZXQuc2l6ZSA9IG1hcCA/IG1hcC5zaXplIDogMDtcbiAgc2V0Ll9tYXAgPSBtYXA7XG4gIHNldC5fX293bmVySUQgPSBvd25lcklEO1xuICByZXR1cm4gc2V0O1xufVxuXG52YXIgRU1QVFlfT1JERVJFRF9TRVQ7XG5mdW5jdGlvbiBlbXB0eU9yZGVyZWRTZXQoKSB7XG4gIHJldHVybiAoXG4gICAgRU1QVFlfT1JERVJFRF9TRVQgfHwgKEVNUFRZX09SREVSRURfU0VUID0gbWFrZU9yZGVyZWRTZXQoZW1wdHlPcmRlcmVkTWFwKCkpKVxuICApO1xufVxuXG52YXIgUmVjb3JkID0gZnVuY3Rpb24gUmVjb3JkKGRlZmF1bHRWYWx1ZXMsIG5hbWUpIHtcbiAgdmFyIGhhc0luaXRpYWxpemVkO1xuXG4gIHZhciBSZWNvcmRUeXBlID0gZnVuY3Rpb24gUmVjb3JkKHZhbHVlcykge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgaWYgKHZhbHVlcyBpbnN0YW5jZW9mIFJlY29yZFR5cGUpIHtcbiAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWNvcmRUeXBlKSkge1xuICAgICAgcmV0dXJuIG5ldyBSZWNvcmRUeXBlKHZhbHVlcyk7XG4gICAgfVxuICAgIGlmICghaGFzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIGhhc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZGVmYXVsdFZhbHVlcyk7XG4gICAgICB2YXIgaW5kaWNlcyA9IChSZWNvcmRUeXBlUHJvdG90eXBlLl9pbmRpY2VzID0ge30pO1xuICAgICAgLy8gRGVwcmVjYXRlZDogbGVmdCB0byBhdHRlbXB0IG5vdCB0byBicmVhayBhbnkgZXh0ZXJuYWwgY29kZSB3aGljaFxuICAgICAgLy8gcmVsaWVzIG9uIGEgLl9uYW1lIHByb3BlcnR5IGV4aXN0aW5nIG9uIHJlY29yZCBpbnN0YW5jZXMuXG4gICAgICAvLyBVc2UgUmVjb3JkLmdldERlc2NyaXB0aXZlTmFtZSgpIGluc3RlYWRcbiAgICAgIFJlY29yZFR5cGVQcm90b3R5cGUuX25hbWUgPSBuYW1lO1xuICAgICAgUmVjb3JkVHlwZVByb3RvdHlwZS5fa2V5cyA9IGtleXM7XG4gICAgICBSZWNvcmRUeXBlUHJvdG90eXBlLl9kZWZhdWx0VmFsdWVzID0gZGVmYXVsdFZhbHVlcztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcHJvcE5hbWUgPSBrZXlzW2ldO1xuICAgICAgICBpbmRpY2VzW3Byb3BOYW1lXSA9IGk7XG4gICAgICAgIGlmIChSZWNvcmRUeXBlUHJvdG90eXBlW3Byb3BOYW1lXSkge1xuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgICAgICAgICB0eXBlb2YgY29uc29sZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIGNvbnNvbGUud2FybiAmJlxuICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAnQ2Fubm90IGRlZmluZSAnICtcbiAgICAgICAgICAgICAgICByZWNvcmROYW1lKHRoaXMpICtcbiAgICAgICAgICAgICAgICAnIHdpdGggcHJvcGVydHkgXCInICtcbiAgICAgICAgICAgICAgICBwcm9wTmFtZSArXG4gICAgICAgICAgICAgICAgJ1wiIHNpbmNlIHRoYXQgcHJvcGVydHkgbmFtZSBpcyBwYXJ0IG9mIHRoZSBSZWNvcmQgQVBJLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby1jb25zb2xlICovXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0UHJvcChSZWNvcmRUeXBlUHJvdG90eXBlLCBwcm9wTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fX293bmVySUQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fdmFsdWVzID0gTGlzdCgpLndpdGhNdXRhdGlvbnMoZnVuY3Rpb24gKGwpIHtcbiAgICAgIGwuc2V0U2l6ZSh0aGlzJDEuX2tleXMubGVuZ3RoKTtcbiAgICAgIEtleWVkQ29sbGVjdGlvbih2YWx1ZXMpLmZvckVhY2goZnVuY3Rpb24gKHYsIGspIHtcbiAgICAgICAgbC5zZXQodGhpcyQxLl9pbmRpY2VzW2tdLCB2ID09PSB0aGlzJDEuX2RlZmF1bHRWYWx1ZXNba10gPyB1bmRlZmluZWQgOiB2KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIHZhciBSZWNvcmRUeXBlUHJvdG90eXBlID0gKFJlY29yZFR5cGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShcbiAgICBSZWNvcmRQcm90b3R5cGVcbiAgKSk7XG4gIFJlY29yZFR5cGVQcm90b3R5cGUuY29uc3RydWN0b3IgPSBSZWNvcmRUeXBlO1xuXG4gIGlmIChuYW1lKSB7XG4gICAgUmVjb3JkVHlwZS5kaXNwbGF5TmFtZSA9IG5hbWU7XG4gIH1cblxuICByZXR1cm4gUmVjb3JkVHlwZTtcbn07XG5cblJlY29yZC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIHZhciBzdHIgPSByZWNvcmROYW1lKHRoaXMpICsgJyB7ICc7XG4gIHZhciBrZXlzID0gdGhpcy5fa2V5cztcbiAgdmFyIGs7XG4gIGZvciAodmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgIT09IGw7IGkrKykge1xuICAgIGsgPSBrZXlzW2ldO1xuICAgIHN0ciArPSAoaSA/ICcsICcgOiAnJykgKyBrICsgJzogJyArIHF1b3RlU3RyaW5nKHRoaXMuZ2V0KGspKTtcbiAgfVxuICByZXR1cm4gc3RyICsgJyB9Jztcbn07XG5cblJlY29yZC5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChvdGhlcikge1xuICByZXR1cm4gKFxuICAgIHRoaXMgPT09IG90aGVyIHx8XG4gICAgKG90aGVyICYmXG4gICAgICB0aGlzLl9rZXlzID09PSBvdGhlci5fa2V5cyAmJlxuICAgICAgcmVjb3JkU2VxKHRoaXMpLmVxdWFscyhyZWNvcmRTZXEob3RoZXIpKSlcbiAgKTtcbn07XG5cblJlY29yZC5wcm90b3R5cGUuaGFzaENvZGUgPSBmdW5jdGlvbiBoYXNoQ29kZSAoKSB7XG4gIHJldHVybiByZWNvcmRTZXEodGhpcykuaGFzaENvZGUoKTtcbn07XG5cbi8vIEBwcmFnbWEgQWNjZXNzXG5cblJlY29yZC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gaGFzIChrKSB7XG4gIHJldHVybiB0aGlzLl9pbmRpY2VzLmhhc093blByb3BlcnR5KGspO1xufTtcblxuUmVjb3JkLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKGssIG5vdFNldFZhbHVlKSB7XG4gIGlmICghdGhpcy5oYXMoaykpIHtcbiAgICByZXR1cm4gbm90U2V0VmFsdWU7XG4gIH1cbiAgdmFyIGluZGV4ID0gdGhpcy5faW5kaWNlc1trXTtcbiAgdmFyIHZhbHVlID0gdGhpcy5fdmFsdWVzLmdldChpbmRleCk7XG4gIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdGhpcy5fZGVmYXVsdFZhbHVlc1trXSA6IHZhbHVlO1xufTtcblxuLy8gQHByYWdtYSBNb2RpZmljYXRpb25cblxuUmVjb3JkLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiBzZXQgKGssIHYpIHtcbiAgaWYgKHRoaXMuaGFzKGspKSB7XG4gICAgdmFyIG5ld1ZhbHVlcyA9IHRoaXMuX3ZhbHVlcy5zZXQoXG4gICAgICB0aGlzLl9pbmRpY2VzW2tdLFxuICAgICAgdiA9PT0gdGhpcy5fZGVmYXVsdFZhbHVlc1trXSA/IHVuZGVmaW5lZCA6IHZcbiAgICApO1xuICAgIGlmIChuZXdWYWx1ZXMgIT09IHRoaXMuX3ZhbHVlcyAmJiAhdGhpcy5fX293bmVySUQpIHtcbiAgICAgIHJldHVybiBtYWtlUmVjb3JkKHRoaXMsIG5ld1ZhbHVlcyk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuUmVjb3JkLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUgKGspIHtcbiAgcmV0dXJuIHRoaXMuc2V0KGspO1xufTtcblxuUmVjb3JkLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyICgpIHtcbiAgdmFyIG5ld1ZhbHVlcyA9IHRoaXMuX3ZhbHVlcy5jbGVhcigpLnNldFNpemUodGhpcy5fa2V5cy5sZW5ndGgpO1xuICByZXR1cm4gdGhpcy5fX293bmVySUQgPyB0aGlzIDogbWFrZVJlY29yZCh0aGlzLCBuZXdWYWx1ZXMpO1xufTtcblxuUmVjb3JkLnByb3RvdHlwZS53YXNBbHRlcmVkID0gZnVuY3Rpb24gd2FzQWx0ZXJlZCAoKSB7XG4gIHJldHVybiB0aGlzLl92YWx1ZXMud2FzQWx0ZXJlZCgpO1xufTtcblxuUmVjb3JkLnByb3RvdHlwZS50b1NlcSA9IGZ1bmN0aW9uIHRvU2VxICgpIHtcbiAgcmV0dXJuIHJlY29yZFNlcSh0aGlzKTtcbn07XG5cblJlY29yZC5wcm90b3R5cGUudG9KUyA9IGZ1bmN0aW9uIHRvSlMkMSAoKSB7XG4gIHJldHVybiB0b0pTKHRoaXMpO1xufTtcblxuUmVjb3JkLnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24gZW50cmllcyAoKSB7XG4gIHJldHVybiB0aGlzLl9faXRlcmF0b3IoSVRFUkFURV9FTlRSSUVTKTtcbn07XG5cblJlY29yZC5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uIF9faXRlcmF0b3IgKHR5cGUsIHJldmVyc2UpIHtcbiAgcmV0dXJuIHJlY29yZFNlcSh0aGlzKS5fX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpO1xufTtcblxuUmVjb3JkLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbiBfX2l0ZXJhdGUgKGZuLCByZXZlcnNlKSB7XG4gIHJldHVybiByZWNvcmRTZXEodGhpcykuX19pdGVyYXRlKGZuLCByZXZlcnNlKTtcbn07XG5cblJlY29yZC5wcm90b3R5cGUuX19lbnN1cmVPd25lciA9IGZ1bmN0aW9uIF9fZW5zdXJlT3duZXIgKG93bmVySUQpIHtcbiAgaWYgKG93bmVySUQgPT09IHRoaXMuX19vd25lcklEKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdmFyIG5ld1ZhbHVlcyA9IHRoaXMuX3ZhbHVlcy5fX2Vuc3VyZU93bmVyKG93bmVySUQpO1xuICBpZiAoIW93bmVySUQpIHtcbiAgICB0aGlzLl9fb3duZXJJRCA9IG93bmVySUQ7XG4gICAgdGhpcy5fdmFsdWVzID0gbmV3VmFsdWVzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHJldHVybiBtYWtlUmVjb3JkKHRoaXMsIG5ld1ZhbHVlcywgb3duZXJJRCk7XG59O1xuXG5SZWNvcmQuaXNSZWNvcmQgPSBpc1JlY29yZDtcblJlY29yZC5nZXREZXNjcmlwdGl2ZU5hbWUgPSByZWNvcmROYW1lO1xudmFyIFJlY29yZFByb3RvdHlwZSA9IFJlY29yZC5wcm90b3R5cGU7XG5SZWNvcmRQcm90b3R5cGVbSVNfUkVDT1JEX1NZTUJPTF0gPSB0cnVlO1xuUmVjb3JkUHJvdG90eXBlW0RFTEVURV0gPSBSZWNvcmRQcm90b3R5cGUucmVtb3ZlO1xuUmVjb3JkUHJvdG90eXBlLmRlbGV0ZUluID0gUmVjb3JkUHJvdG90eXBlLnJlbW92ZUluID0gZGVsZXRlSW47XG5SZWNvcmRQcm90b3R5cGUuZ2V0SW4gPSBnZXRJbiQxO1xuUmVjb3JkUHJvdG90eXBlLmhhc0luID0gQ29sbGVjdGlvblByb3RvdHlwZS5oYXNJbjtcblJlY29yZFByb3RvdHlwZS5tZXJnZSA9IG1lcmdlO1xuUmVjb3JkUHJvdG90eXBlLm1lcmdlV2l0aCA9IG1lcmdlV2l0aDtcblJlY29yZFByb3RvdHlwZS5tZXJnZUluID0gbWVyZ2VJbjtcblJlY29yZFByb3RvdHlwZS5tZXJnZURlZXAgPSBtZXJnZURlZXAkMTtcblJlY29yZFByb3RvdHlwZS5tZXJnZURlZXBXaXRoID0gbWVyZ2VEZWVwV2l0aCQxO1xuUmVjb3JkUHJvdG90eXBlLm1lcmdlRGVlcEluID0gbWVyZ2VEZWVwSW47XG5SZWNvcmRQcm90b3R5cGUuc2V0SW4gPSBzZXRJbiQxO1xuUmVjb3JkUHJvdG90eXBlLnVwZGF0ZSA9IHVwZGF0ZSQxO1xuUmVjb3JkUHJvdG90eXBlLnVwZGF0ZUluID0gdXBkYXRlSW4kMTtcblJlY29yZFByb3RvdHlwZS53aXRoTXV0YXRpb25zID0gd2l0aE11dGF0aW9ucztcblJlY29yZFByb3RvdHlwZS5hc011dGFibGUgPSBhc011dGFibGU7XG5SZWNvcmRQcm90b3R5cGUuYXNJbW11dGFibGUgPSBhc0ltbXV0YWJsZTtcblJlY29yZFByb3RvdHlwZVtJVEVSQVRPUl9TWU1CT0xdID0gUmVjb3JkUHJvdG90eXBlLmVudHJpZXM7XG5SZWNvcmRQcm90b3R5cGUudG9KU09OID0gUmVjb3JkUHJvdG90eXBlLnRvT2JqZWN0ID1cbiAgQ29sbGVjdGlvblByb3RvdHlwZS50b09iamVjdDtcblJlY29yZFByb3RvdHlwZS5pbnNwZWN0ID0gUmVjb3JkUHJvdG90eXBlLnRvU291cmNlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnRvU3RyaW5nKCk7XG59O1xuXG5mdW5jdGlvbiBtYWtlUmVjb3JkKGxpa2VSZWNvcmQsIHZhbHVlcywgb3duZXJJRCkge1xuICB2YXIgcmVjb3JkID0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YobGlrZVJlY29yZCkpO1xuICByZWNvcmQuX3ZhbHVlcyA9IHZhbHVlcztcbiAgcmVjb3JkLl9fb3duZXJJRCA9IG93bmVySUQ7XG4gIHJldHVybiByZWNvcmQ7XG59XG5cbmZ1bmN0aW9uIHJlY29yZE5hbWUocmVjb3JkKSB7XG4gIHJldHVybiByZWNvcmQuY29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgcmVjb3JkLmNvbnN0cnVjdG9yLm5hbWUgfHwgJ1JlY29yZCc7XG59XG5cbmZ1bmN0aW9uIHJlY29yZFNlcShyZWNvcmQpIHtcbiAgcmV0dXJuIGtleWVkU2VxRnJvbVZhbHVlKHJlY29yZC5fa2V5cy5tYXAoZnVuY3Rpb24gKGspIHsgcmV0dXJuIFtrLCByZWNvcmQuZ2V0KGspXTsgfSkpO1xufVxuXG5mdW5jdGlvbiBzZXRQcm9wKHByb3RvdHlwZSwgbmFtZSkge1xuICB0cnkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90b3R5cGUsIG5hbWUsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldChuYW1lKTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIGludmFyaWFudCh0aGlzLl9fb3duZXJJRCwgJ0Nhbm5vdCBzZXQgb24gYW4gaW1tdXRhYmxlIHJlY29yZC4nKTtcbiAgICAgICAgdGhpcy5zZXQobmFtZSwgdmFsdWUpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBPYmplY3QuZGVmaW5lUHJvcGVydHkgZmFpbGVkLiBQcm9iYWJseSBJRTguXG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgbGF6eSBTZXEgb2YgYHZhbHVlYCByZXBlYXRlZCBgdGltZXNgIHRpbWVzLiBXaGVuIGB0aW1lc2AgaXNcbiAqIHVuZGVmaW5lZCwgcmV0dXJucyBhbiBpbmZpbml0ZSBzZXF1ZW5jZSBvZiBgdmFsdWVgLlxuICovXG52YXIgUmVwZWF0ID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoSW5kZXhlZFNlcSQkMSkge1xuICBmdW5jdGlvbiBSZXBlYXQodmFsdWUsIHRpbWVzKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlcGVhdCkpIHtcbiAgICAgIHJldHVybiBuZXcgUmVwZWF0KHZhbHVlLCB0aW1lcyk7XG4gICAgfVxuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5zaXplID0gdGltZXMgPT09IHVuZGVmaW5lZCA/IEluZmluaXR5IDogTWF0aC5tYXgoMCwgdGltZXMpO1xuICAgIGlmICh0aGlzLnNpemUgPT09IDApIHtcbiAgICAgIGlmIChFTVBUWV9SRVBFQVQpIHtcbiAgICAgICAgcmV0dXJuIEVNUFRZX1JFUEVBVDtcbiAgICAgIH1cbiAgICAgIEVNUFRZX1JFUEVBVCA9IHRoaXM7XG4gICAgfVxuICB9XG5cbiAgaWYgKCBJbmRleGVkU2VxJCQxICkgUmVwZWF0Ll9fcHJvdG9fXyA9IEluZGV4ZWRTZXEkJDE7XG4gIFJlcGVhdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBJbmRleGVkU2VxJCQxICYmIEluZGV4ZWRTZXEkJDEucHJvdG90eXBlICk7XG4gIFJlcGVhdC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSZXBlYXQ7XG5cbiAgUmVwZWF0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gJ1JlcGVhdCBbXSc7XG4gICAgfVxuICAgIHJldHVybiAnUmVwZWF0IFsgJyArIHRoaXMuX3ZhbHVlICsgJyAnICsgdGhpcy5zaXplICsgJyB0aW1lcyBdJztcbiAgfTtcblxuICBSZXBlYXQucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCAoaW5kZXgsIG5vdFNldFZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzKGluZGV4KSA/IHRoaXMuX3ZhbHVlIDogbm90U2V0VmFsdWU7XG4gIH07XG5cbiAgUmVwZWF0LnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzIChzZWFyY2hWYWx1ZSkge1xuICAgIHJldHVybiBpcyh0aGlzLl92YWx1ZSwgc2VhcmNoVmFsdWUpO1xuICB9O1xuXG4gIFJlcGVhdC5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoYmVnaW4sIGVuZCkge1xuICAgIHZhciBzaXplID0gdGhpcy5zaXplO1xuICAgIHJldHVybiB3aG9sZVNsaWNlKGJlZ2luLCBlbmQsIHNpemUpXG4gICAgICA/IHRoaXNcbiAgICAgIDogbmV3IFJlcGVhdChcbiAgICAgICAgICB0aGlzLl92YWx1ZSxcbiAgICAgICAgICByZXNvbHZlRW5kKGVuZCwgc2l6ZSkgLSByZXNvbHZlQmVnaW4oYmVnaW4sIHNpemUpXG4gICAgICAgICk7XG4gIH07XG5cbiAgUmVwZWF0LnByb3RvdHlwZS5yZXZlcnNlID0gZnVuY3Rpb24gcmV2ZXJzZSAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgUmVwZWF0LnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAoc2VhcmNoVmFsdWUpIHtcbiAgICBpZiAoaXModGhpcy5fdmFsdWUsIHNlYXJjaFZhbHVlKSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfTtcblxuICBSZXBlYXQucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHNlYXJjaFZhbHVlKSB7XG4gICAgaWYgKGlzKHRoaXMuX3ZhbHVlLCBzZWFyY2hWYWx1ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpemU7XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfTtcblxuICBSZXBlYXQucHJvdG90eXBlLl9faXRlcmF0ZSA9IGZ1bmN0aW9uIF9faXRlcmF0ZSAoZm4sIHJldmVyc2UpIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGkgIT09IHNpemUpIHtcbiAgICAgIGlmIChmbih0aGlzLl92YWx1ZSwgcmV2ZXJzZSA/IHNpemUgLSArK2kgOiBpKyssIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGk7XG4gIH07XG5cbiAgUmVwZWF0LnByb3RvdHlwZS5fX2l0ZXJhdG9yID0gZnVuY3Rpb24gX19pdGVyYXRvciAodHlwZSwgcmV2ZXJzZSkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdmFyIHNpemUgPSB0aGlzLnNpemU7XG4gICAgdmFyIGkgPSAwO1xuICAgIHJldHVybiBuZXcgSXRlcmF0b3IoXG4gICAgICBmdW5jdGlvbiAoKSB7IHJldHVybiBpID09PSBzaXplXG4gICAgICAgICAgPyBpdGVyYXRvckRvbmUoKVxuICAgICAgICAgIDogaXRlcmF0b3JWYWx1ZSh0eXBlLCByZXZlcnNlID8gc2l6ZSAtICsraSA6IGkrKywgdGhpcyQxLl92YWx1ZSk7IH1cbiAgICApO1xuICB9O1xuXG4gIFJlcGVhdC5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChvdGhlcikge1xuICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIFJlcGVhdFxuICAgICAgPyBpcyh0aGlzLl92YWx1ZSwgb3RoZXIuX3ZhbHVlKVxuICAgICAgOiBkZWVwRXF1YWwob3RoZXIpO1xuICB9O1xuXG4gIHJldHVybiBSZXBlYXQ7XG59KEluZGV4ZWRTZXEpKTtcblxudmFyIEVNUFRZX1JFUEVBVDtcblxuZnVuY3Rpb24gZnJvbUpTKHZhbHVlLCBjb252ZXJ0ZXIpIHtcbiAgcmV0dXJuIGZyb21KU1dpdGgoXG4gICAgW10sXG4gICAgY29udmVydGVyIHx8IGRlZmF1bHRDb252ZXJ0ZXIsXG4gICAgdmFsdWUsXG4gICAgJycsXG4gICAgY29udmVydGVyICYmIGNvbnZlcnRlci5sZW5ndGggPiAyID8gW10gOiB1bmRlZmluZWQsXG4gICAgeyAnJzogdmFsdWUgfVxuICApO1xufVxuXG5mdW5jdGlvbiBmcm9tSlNXaXRoKHN0YWNrLCBjb252ZXJ0ZXIsIHZhbHVlLCBrZXksIGtleVBhdGgsIHBhcmVudFZhbHVlKSB7XG4gIHZhciB0b1NlcSA9IEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgPyBJbmRleGVkU2VxXG4gICAgOiBpc1BsYWluT2JqKHZhbHVlKVxuICAgICAgPyBLZXllZFNlcVxuICAgICAgOiBudWxsO1xuICBpZiAodG9TZXEpIHtcbiAgICBpZiAofnN0YWNrLmluZGV4T2YodmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gSW1tdXRhYmxlJyk7XG4gICAgfVxuICAgIHN0YWNrLnB1c2godmFsdWUpO1xuICAgIGtleVBhdGggJiYga2V5ICE9PSAnJyAmJiBrZXlQYXRoLnB1c2goa2V5KTtcbiAgICB2YXIgY29udmVydGVkID0gY29udmVydGVyLmNhbGwoXG4gICAgICBwYXJlbnRWYWx1ZSxcbiAgICAgIGtleSxcbiAgICAgIHRvU2VxKHZhbHVlKS5tYXAoZnVuY3Rpb24gKHYsIGspIHsgcmV0dXJuIGZyb21KU1dpdGgoc3RhY2ssIGNvbnZlcnRlciwgdiwgaywga2V5UGF0aCwgdmFsdWUpOyB9XG4gICAgICApLFxuICAgICAga2V5UGF0aCAmJiBrZXlQYXRoLnNsaWNlKClcbiAgICApO1xuICAgIHN0YWNrLnBvcCgpO1xuICAgIGtleVBhdGggJiYga2V5UGF0aC5wb3AoKTtcbiAgICByZXR1cm4gY29udmVydGVkO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdENvbnZlcnRlcihrLCB2KSB7XG4gIHJldHVybiBpc0tleWVkKHYpID8gdi50b01hcCgpIDogdi50b0xpc3QoKTtcbn1cblxudmFyIHZlcnNpb24gPSBcIjQuMC4wLXJjLjExXCI7XG5cbnZhciBJbW11dGFibGUgPSB7XG4gIHZlcnNpb246IHZlcnNpb24sXG5cbiAgQ29sbGVjdGlvbjogQ29sbGVjdGlvbixcbiAgLy8gTm90ZTogSXRlcmFibGUgaXMgZGVwcmVjYXRlZFxuICBJdGVyYWJsZTogQ29sbGVjdGlvbixcblxuICBTZXE6IFNlcSxcbiAgTWFwOiBNYXAsXG4gIE9yZGVyZWRNYXA6IE9yZGVyZWRNYXAsXG4gIExpc3Q6IExpc3QsXG4gIFN0YWNrOiBTdGFjayxcbiAgU2V0OiBTZXQsXG4gIE9yZGVyZWRTZXQ6IE9yZGVyZWRTZXQsXG5cbiAgUmVjb3JkOiBSZWNvcmQsXG4gIFJhbmdlOiBSYW5nZSxcbiAgUmVwZWF0OiBSZXBlYXQsXG5cbiAgaXM6IGlzLFxuICBmcm9tSlM6IGZyb21KUyxcbiAgaGFzaDogaGFzaCxcblxuICBpc0ltbXV0YWJsZTogaXNJbW11dGFibGUsXG4gIGlzQ29sbGVjdGlvbjogaXNDb2xsZWN0aW9uLFxuICBpc0tleWVkOiBpc0tleWVkLFxuICBpc0luZGV4ZWQ6IGlzSW5kZXhlZCxcbiAgaXNBc3NvY2lhdGl2ZTogaXNBc3NvY2lhdGl2ZSxcbiAgaXNPcmRlcmVkOiBpc09yZGVyZWQsXG4gIGlzVmFsdWVPYmplY3Q6IGlzVmFsdWVPYmplY3QsXG4gIGlzU2VxOiBpc1NlcSxcbiAgaXNMaXN0OiBpc0xpc3QsXG4gIGlzTWFwOiBpc01hcCxcbiAgaXNPcmRlcmVkTWFwOiBpc09yZGVyZWRNYXAsXG4gIGlzU3RhY2s6IGlzU3RhY2ssXG4gIGlzU2V0OiBpc1NldCxcbiAgaXNPcmRlcmVkU2V0OiBpc09yZGVyZWRTZXQsXG4gIGlzUmVjb3JkOiBpc1JlY29yZCxcblxuICBnZXQ6IGdldCxcbiAgZ2V0SW46IGdldEluLFxuICBoYXM6IGhhcyxcbiAgaGFzSW46IGhhc0luLFxuICBtZXJnZTogbWVyZ2UkMSxcbiAgbWVyZ2VEZWVwOiBtZXJnZURlZXAsXG4gIG1lcmdlV2l0aDogbWVyZ2VXaXRoJDEsXG4gIG1lcmdlRGVlcFdpdGg6IG1lcmdlRGVlcFdpdGgsXG4gIHJlbW92ZTogcmVtb3ZlLFxuICByZW1vdmVJbjogcmVtb3ZlSW4sXG4gIHNldDogc2V0LFxuICBzZXRJbjogc2V0SW4sXG4gIHVwZGF0ZTogdXBkYXRlLFxuICB1cGRhdGVJbjogdXBkYXRlSW4sXG59O1xuXG4vLyBOb3RlOiBJdGVyYWJsZSBpcyBkZXByZWNhdGVkXG52YXIgSXRlcmFibGUgPSBDb2xsZWN0aW9uO1xuXG5leHBvcnQgZGVmYXVsdCBJbW11dGFibGU7XG5leHBvcnQgeyB2ZXJzaW9uLCBDb2xsZWN0aW9uLCBJdGVyYWJsZSwgU2VxLCBNYXAsIE9yZGVyZWRNYXAsIExpc3QsIFN0YWNrLCBTZXQsIE9yZGVyZWRTZXQsIFJlY29yZCwgUmFuZ2UsIFJlcGVhdCwgaXMsIGZyb21KUywgaGFzaCwgaXNJbW11dGFibGUsIGlzQ29sbGVjdGlvbiwgaXNLZXllZCwgaXNJbmRleGVkLCBpc0Fzc29jaWF0aXZlLCBpc09yZGVyZWQsIGlzVmFsdWVPYmplY3QsIGdldCwgZ2V0SW4sIGhhcywgaGFzSW4sIG1lcmdlJDEgYXMgbWVyZ2UsIG1lcmdlRGVlcCwgbWVyZ2VXaXRoJDEgYXMgbWVyZ2VXaXRoLCBtZXJnZURlZXBXaXRoLCByZW1vdmUsIHJlbW92ZUluLCBzZXQsIHNldEluLCB1cGRhdGUsIHVwZGF0ZUluIH07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG1lbWl6ZSggZm4sIG9wdGlvbnMgKSB7XG5cdHZhciBzaXplID0gMCxcblx0XHRtYXhTaXplLCBoZWFkLCB0YWlsO1xuXG5cdGlmICggb3B0aW9ucyAmJiBvcHRpb25zLm1heFNpemUgKSB7XG5cdFx0bWF4U2l6ZSA9IG9wdGlvbnMubWF4U2l6ZTtcblx0fVxuXG5cdGZ1bmN0aW9uIG1lbW9pemVkKCAvKiAuLi5hcmdzICovICkge1xuXHRcdHZhciBub2RlID0gaGVhZCxcblx0XHRcdGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsXG5cdFx0XHRhcmdzLCBpO1xuXG5cdFx0c2VhcmNoQ2FjaGU6IHdoaWxlICggbm9kZSApIHtcblx0XHRcdC8vIFBlcmZvcm0gYSBzaGFsbG93IGVxdWFsaXR5IHRlc3QgdG8gY29uZmlybSB0aGF0IHdoZXRoZXIgdGhlIG5vZGVcblx0XHRcdC8vIHVuZGVyIHRlc3QgaXMgYSBjYW5kaWRhdGUgZm9yIHRoZSBhcmd1bWVudHMgcGFzc2VkLiBUd28gYXJyYXlzXG5cdFx0XHQvLyBhcmUgc2hhbGxvd2x5IGVxdWFsIGlmIHRoZWlyIGxlbmd0aCBtYXRjaGVzIGFuZCBlYWNoIGVudHJ5IGlzXG5cdFx0XHQvLyBzdHJpY3RseSBlcXVhbCBiZXR3ZWVuIHRoZSB0d28gc2V0cy4gQXZvaWQgYWJzdHJhY3RpbmcgdG8gYVxuXHRcdFx0Ly8gZnVuY3Rpb24gd2hpY2ggY291bGQgaW5jdXIgYW4gYXJndW1lbnRzIGxlYWtpbmcgZGVvcHRpbWl6YXRpb24uXG5cblx0XHRcdC8vIENoZWNrIHdoZXRoZXIgbm9kZSBhcmd1bWVudHMgbWF0Y2ggYXJndW1lbnRzIGxlbmd0aFxuXHRcdFx0aWYgKCBub2RlLmFyZ3MubGVuZ3RoICE9PSBhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0XHRub2RlID0gbm9kZS5uZXh0O1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2hlY2sgd2hldGhlciBub2RlIGFyZ3VtZW50cyBtYXRjaCBhcmd1bWVudHMgdmFsdWVzXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRpZiAoIG5vZGUuYXJnc1sgaSBdICE9PSBhcmd1bWVudHNbIGkgXSApIHtcblx0XHRcdFx0XHRub2RlID0gbm9kZS5uZXh0O1xuXHRcdFx0XHRcdGNvbnRpbnVlIHNlYXJjaENhY2hlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGFzc3VtZSB3ZSd2ZSBmb3VuZCBhIG1hdGNoXG5cblx0XHRcdC8vIFN1cmZhY2UgbWF0Y2hlZCBub2RlIHRvIGhlYWQgaWYgbm90IGFscmVhZHlcblx0XHRcdGlmICggbm9kZSAhPT0gaGVhZCApIHtcblx0XHRcdFx0Ly8gQXMgdGFpbCwgc2hpZnQgdG8gcHJldmlvdXMuIE11c3Qgb25seSBzaGlmdCBpZiBub3QgYWxzb1xuXHRcdFx0XHQvLyBoZWFkLCBzaW5jZSBpZiBib3RoIGhlYWQgYW5kIHRhaWwsIHRoZXJlIGlzIG5vIHByZXZpb3VzLlxuXHRcdFx0XHRpZiAoIG5vZGUgPT09IHRhaWwgKSB7XG5cdFx0XHRcdFx0dGFpbCA9IG5vZGUucHJldjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFkanVzdCBzaWJsaW5ncyB0byBwb2ludCB0byBlYWNoIG90aGVyLiBJZiBub2RlIHdhcyB0YWlsLFxuXHRcdFx0XHQvLyB0aGlzIGFsc28gaGFuZGxlcyBuZXcgdGFpbCdzIGVtcHR5IGBuZXh0YCBhc3NpZ25tZW50LlxuXHRcdFx0XHRub2RlLnByZXYubmV4dCA9IG5vZGUubmV4dDtcblx0XHRcdFx0aWYgKCBub2RlLm5leHQgKSB7XG5cdFx0XHRcdFx0bm9kZS5uZXh0LnByZXYgPSBub2RlLnByZXY7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRub2RlLm5leHQgPSBoZWFkO1xuXHRcdFx0XHRub2RlLnByZXYgPSBudWxsO1xuXHRcdFx0XHRoZWFkLnByZXYgPSBub2RlO1xuXHRcdFx0XHRoZWFkID0gbm9kZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV0dXJuIGltbWVkaWF0ZWx5XG5cdFx0XHRyZXR1cm4gbm9kZS52YWw7XG5cdFx0fVxuXG5cdFx0Ly8gTm8gY2FjaGVkIHZhbHVlIGZvdW5kLiBDb250aW51ZSB0byBpbnNlcnRpb24gcGhhc2U6XG5cblx0XHQvLyBDcmVhdGUgYSBjb3B5IG9mIGFyZ3VtZW50cyAoYXZvaWQgbGVha2luZyBkZW9wdGltaXphdGlvbilcblx0XHRhcmdzID0gbmV3IEFycmF5KCBsZW4gKTtcblx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0YXJnc1sgaSBdID0gYXJndW1lbnRzWyBpIF07XG5cdFx0fVxuXG5cdFx0bm9kZSA9IHtcblx0XHRcdGFyZ3M6IGFyZ3MsXG5cblx0XHRcdC8vIEdlbmVyYXRlIHRoZSByZXN1bHQgZnJvbSBvcmlnaW5hbCBmdW5jdGlvblxuXHRcdFx0dmFsOiBmbi5hcHBseSggbnVsbCwgYXJncyApXG5cdFx0fTtcblxuXHRcdC8vIERvbid0IG5lZWQgdG8gY2hlY2sgd2hldGhlciBub2RlIGlzIGFscmVhZHkgaGVhZCwgc2luY2UgaXQgd291bGRcblx0XHQvLyBoYXZlIGJlZW4gcmV0dXJuZWQgYWJvdmUgYWxyZWFkeSBpZiBpdCB3YXNcblxuXHRcdC8vIFNoaWZ0IGV4aXN0aW5nIGhlYWQgZG93biBsaXN0XG5cdFx0aWYgKCBoZWFkICkge1xuXHRcdFx0aGVhZC5wcmV2ID0gbm9kZTtcblx0XHRcdG5vZGUubmV4dCA9IGhlYWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIElmIG5vIGhlYWQsIGZvbGxvd3MgdGhhdCB0aGVyZSdzIG5vIHRhaWwgKGF0IGluaXRpYWwgb3IgcmVzZXQpXG5cdFx0XHR0YWlsID0gbm9kZTtcblx0XHR9XG5cblx0XHQvLyBUcmltIHRhaWwgaWYgd2UncmUgcmVhY2hlZCBtYXggc2l6ZSBhbmQgYXJlIHBlbmRpbmcgY2FjaGUgaW5zZXJ0aW9uXG5cdFx0aWYgKCBzaXplID09PSBtYXhTaXplICkge1xuXHRcdFx0dGFpbCA9IHRhaWwucHJldjtcblx0XHRcdHRhaWwubmV4dCA9IG51bGw7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNpemUrKztcblx0XHR9XG5cblx0XHRoZWFkID0gbm9kZTtcblxuXHRcdHJldHVybiBub2RlLnZhbDtcblx0fVxuXG5cdG1lbW9pemVkLmNsZWFyID0gZnVuY3Rpb24oKSB7XG5cdFx0aGVhZCA9IG51bGw7XG5cdFx0dGFpbCA9IG51bGw7XG5cdFx0c2l6ZSA9IDA7XG5cdH07XG5cblx0aWYgKCBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnICkge1xuXHRcdC8vIENhY2hlIGlzIG5vdCBleHBvc2VkIGluIHRoZSBwdWJsaWMgQVBJLCBidXQgdXNlZCBpbiB0ZXN0cyB0byBlbnN1cmVcblx0XHQvLyBleHBlY3RlZCBsaXN0IHByb2dyZXNzaW9uXG5cdFx0bWVtb2l6ZWQuZ2V0Q2FjaGUgPSBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBbIGhlYWQsIHRhaWwsIHNpemUgXTtcblx0XHR9O1xuXHR9XG5cblx0cmV0dXJuIG1lbW9pemVkO1xufTtcbiIsIi8qXG5vYmplY3QtYXNzaWduXG4oYykgU2luZHJlIFNvcmh1c1xuQGxpY2Vuc2UgTUlUXG4qL1xuXG4ndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG4iLCIvKiBnbG9iYWwgZGVmaW5lICovXG5cbihmdW5jdGlvbiAocm9vdCwgcGx1cmFsaXplKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmICh0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpIHtcbiAgICAvLyBOb2RlLlxuICAgIG1vZHVsZS5leHBvcnRzID0gcGx1cmFsaXplKCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgLy8gQU1ELCByZWdpc3RlcnMgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cbiAgICBkZWZpbmUoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHBsdXJhbGl6ZSgpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIEJyb3dzZXIgZ2xvYmFsLlxuICAgIHJvb3QucGx1cmFsaXplID0gcGx1cmFsaXplKCk7XG4gIH1cbn0pKHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgLy8gUnVsZSBzdG9yYWdlIC0gcGx1cmFsaXplIGFuZCBzaW5ndWxhcml6ZSBuZWVkIHRvIGJlIHJ1biBzZXF1ZW50aWFsbHksXG4gIC8vIHdoaWxlIG90aGVyIHJ1bGVzIGNhbiBiZSBvcHRpbWl6ZWQgdXNpbmcgYW4gb2JqZWN0IGZvciBpbnN0YW50IGxvb2t1cHMuXG4gIHZhciBwbHVyYWxSdWxlcyA9IFtdO1xuICB2YXIgc2luZ3VsYXJSdWxlcyA9IFtdO1xuICB2YXIgdW5jb3VudGFibGVzID0ge307XG4gIHZhciBpcnJlZ3VsYXJQbHVyYWxzID0ge307XG4gIHZhciBpcnJlZ3VsYXJTaW5nbGVzID0ge307XG5cbiAgLyoqXG4gICAqIFNhbml0aXplIGEgcGx1cmFsaXphdGlvbiBydWxlIHRvIGEgdXNhYmxlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAgICpcbiAgICogQHBhcmFtICB7KFJlZ0V4cHxzdHJpbmcpfSBydWxlXG4gICAqIEByZXR1cm4ge1JlZ0V4cH1cbiAgICovXG4gIGZ1bmN0aW9uIHNhbml0aXplUnVsZSAocnVsZSkge1xuICAgIGlmICh0eXBlb2YgcnVsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBuZXcgUmVnRXhwKCdeJyArIHJ1bGUgKyAnJCcsICdpJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJ1bGU7XG4gIH1cblxuICAvKipcbiAgICogUGFzcyBpbiBhIHdvcmQgdG9rZW4gdG8gcHJvZHVjZSBhIGZ1bmN0aW9uIHRoYXQgY2FuIHJlcGxpY2F0ZSB0aGUgY2FzZSBvblxuICAgKiBhbm90aGVyIHdvcmQuXG4gICAqXG4gICAqIEBwYXJhbSAge3N0cmluZ30gICB3b3JkXG4gICAqIEBwYXJhbSAge3N0cmluZ30gICB0b2tlblxuICAgKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc3RvcmVDYXNlICh3b3JkLCB0b2tlbikge1xuICAgIC8vIFRva2VucyBhcmUgYW4gZXhhY3QgbWF0Y2guXG4gICAgaWYgKHdvcmQgPT09IHRva2VuKSByZXR1cm4gdG9rZW47XG5cbiAgICAvLyBVcHBlciBjYXNlZCB3b3Jkcy4gRS5nLiBcIkhFTExPXCIuXG4gICAgaWYgKHdvcmQgPT09IHdvcmQudG9VcHBlckNhc2UoKSkgcmV0dXJuIHRva2VuLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAvLyBUaXRsZSBjYXNlZCB3b3Jkcy4gRS5nLiBcIlRpdGxlXCIuXG4gICAgaWYgKHdvcmRbMF0gPT09IHdvcmRbMF0udG9VcHBlckNhc2UoKSkge1xuICAgICAgcmV0dXJuIHRva2VuLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdG9rZW4uc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgLy8gTG93ZXIgY2FzZWQgd29yZHMuIEUuZy4gXCJ0ZXN0XCIuXG4gICAgcmV0dXJuIHRva2VuLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJwb2xhdGUgYSByZWdleHAgc3RyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0gIHtBcnJheX0gIGFyZ3NcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gaW50ZXJwb2xhdGUgKHN0ciwgYXJncykge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvXFwkKFxcZHsxLDJ9KS9nLCBmdW5jdGlvbiAobWF0Y2gsIGluZGV4KSB7XG4gICAgICByZXR1cm4gYXJnc1tpbmRleF0gfHwgJyc7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSBhIHdvcmQgdXNpbmcgYSBydWxlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IHdvcmRcbiAgICogQHBhcmFtICB7QXJyYXl9ICBydWxlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2UgKHdvcmQsIHJ1bGUpIHtcbiAgICByZXR1cm4gd29yZC5yZXBsYWNlKHJ1bGVbMF0sIGZ1bmN0aW9uIChtYXRjaCwgaW5kZXgpIHtcbiAgICAgIHZhciByZXN1bHQgPSBpbnRlcnBvbGF0ZShydWxlWzFdLCBhcmd1bWVudHMpO1xuXG4gICAgICBpZiAobWF0Y2ggPT09ICcnKSB7XG4gICAgICAgIHJldHVybiByZXN0b3JlQ2FzZSh3b3JkW2luZGV4IC0gMV0sIHJlc3VsdCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN0b3JlQ2FzZShtYXRjaCwgcmVzdWx0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW5pdGl6ZSBhIHdvcmQgYnkgcGFzc2luZyBpbiB0aGUgd29yZCBhbmQgc2FuaXRpemF0aW9uIHJ1bGVzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICAgdG9rZW5cbiAgICogQHBhcmFtICB7c3RyaW5nfSAgIHdvcmRcbiAgICogQHBhcmFtICB7QXJyYXl9ICAgIHJ1bGVzXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIHNhbml0aXplV29yZCAodG9rZW4sIHdvcmQsIHJ1bGVzKSB7XG4gICAgLy8gRW1wdHkgc3RyaW5nIG9yIGRvZXNuJ3QgbmVlZCBmaXhpbmcuXG4gICAgaWYgKCF0b2tlbi5sZW5ndGggfHwgdW5jb3VudGFibGVzLmhhc093blByb3BlcnR5KHRva2VuKSkge1xuICAgICAgcmV0dXJuIHdvcmQ7XG4gICAgfVxuXG4gICAgdmFyIGxlbiA9IHJ1bGVzLmxlbmd0aDtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgc2FuaXRpemF0aW9uIHJ1bGVzIGFuZCB1c2UgdGhlIGZpcnN0IG9uZSB0byBtYXRjaC5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIHZhciBydWxlID0gcnVsZXNbbGVuXTtcblxuICAgICAgaWYgKHJ1bGVbMF0udGVzdCh3b3JkKSkgcmV0dXJuIHJlcGxhY2Uod29yZCwgcnVsZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdvcmQ7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSBhIHdvcmQgd2l0aCB0aGUgdXBkYXRlZCB3b3JkLlxuICAgKlxuICAgKiBAcGFyYW0gIHtPYmplY3R9ICAgcmVwbGFjZU1hcFxuICAgKiBAcGFyYW0gIHtPYmplY3R9ICAga2VlcE1hcFxuICAgKiBAcGFyYW0gIHtBcnJheX0gICAgcnVsZXNcbiAgICogQHJldHVybiB7RnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiByZXBsYWNlV29yZCAocmVwbGFjZU1hcCwga2VlcE1hcCwgcnVsZXMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHdvcmQpIHtcbiAgICAgIC8vIEdldCB0aGUgY29ycmVjdCB0b2tlbiBhbmQgY2FzZSByZXN0b3JhdGlvbiBmdW5jdGlvbnMuXG4gICAgICB2YXIgdG9rZW4gPSB3b3JkLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIC8vIENoZWNrIGFnYWluc3QgdGhlIGtlZXAgb2JqZWN0IG1hcC5cbiAgICAgIGlmIChrZWVwTWFwLmhhc093blByb3BlcnR5KHRva2VuKSkge1xuICAgICAgICByZXR1cm4gcmVzdG9yZUNhc2Uod29yZCwgdG9rZW4pO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBhZ2FpbnN0IHRoZSByZXBsYWNlbWVudCBtYXAgZm9yIGEgZGlyZWN0IHdvcmQgcmVwbGFjZW1lbnQuXG4gICAgICBpZiAocmVwbGFjZU1hcC5oYXNPd25Qcm9wZXJ0eSh0b2tlbikpIHtcbiAgICAgICAgcmV0dXJuIHJlc3RvcmVDYXNlKHdvcmQsIHJlcGxhY2VNYXBbdG9rZW5dKTtcbiAgICAgIH1cblxuICAgICAgLy8gUnVuIGFsbCB0aGUgcnVsZXMgYWdhaW5zdCB0aGUgd29yZC5cbiAgICAgIHJldHVybiBzYW5pdGl6ZVdvcmQodG9rZW4sIHdvcmQsIHJ1bGVzKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgd29yZCBpcyBwYXJ0IG9mIHRoZSBtYXAuXG4gICAqL1xuICBmdW5jdGlvbiBjaGVja1dvcmQgKHJlcGxhY2VNYXAsIGtlZXBNYXAsIHJ1bGVzLCBib29sKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh3b3JkKSB7XG4gICAgICB2YXIgdG9rZW4gPSB3b3JkLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGlmIChrZWVwTWFwLmhhc093blByb3BlcnR5KHRva2VuKSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAocmVwbGFjZU1hcC5oYXNPd25Qcm9wZXJ0eSh0b2tlbikpIHJldHVybiBmYWxzZTtcblxuICAgICAgcmV0dXJuIHNhbml0aXplV29yZCh0b2tlbiwgdG9rZW4sIHJ1bGVzKSA9PT0gdG9rZW47XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbHVyYWxpemUgb3Igc2luZ3VsYXJpemUgYSB3b3JkIGJhc2VkIG9uIHRoZSBwYXNzZWQgaW4gY291bnQuXG4gICAqXG4gICAqIEBwYXJhbSAge3N0cmluZ30gIHdvcmRcbiAgICogQHBhcmFtICB7bnVtYmVyfSAgY291bnRcbiAgICogQHBhcmFtICB7Ym9vbGVhbn0gaW5jbHVzaXZlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIHBsdXJhbGl6ZSAod29yZCwgY291bnQsIGluY2x1c2l2ZSkge1xuICAgIHZhciBwbHVyYWxpemVkID0gY291bnQgPT09IDFcbiAgICAgID8gcGx1cmFsaXplLnNpbmd1bGFyKHdvcmQpIDogcGx1cmFsaXplLnBsdXJhbCh3b3JkKTtcblxuICAgIHJldHVybiAoaW5jbHVzaXZlID8gY291bnQgKyAnICcgOiAnJykgKyBwbHVyYWxpemVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsdXJhbGl6ZSBhIHdvcmQuXG4gICAqXG4gICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICovXG4gIHBsdXJhbGl6ZS5wbHVyYWwgPSByZXBsYWNlV29yZChcbiAgICBpcnJlZ3VsYXJTaW5nbGVzLCBpcnJlZ3VsYXJQbHVyYWxzLCBwbHVyYWxSdWxlc1xuICApO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHdvcmQgaXMgcGx1cmFsLlxuICAgKlxuICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAqL1xuICBwbHVyYWxpemUuaXNQbHVyYWwgPSBjaGVja1dvcmQoXG4gICAgaXJyZWd1bGFyU2luZ2xlcywgaXJyZWd1bGFyUGx1cmFscywgcGx1cmFsUnVsZXNcbiAgKTtcblxuICAvKipcbiAgICogU2luZ3VsYXJpemUgYSB3b3JkLlxuICAgKlxuICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAqL1xuICBwbHVyYWxpemUuc2luZ3VsYXIgPSByZXBsYWNlV29yZChcbiAgICBpcnJlZ3VsYXJQbHVyYWxzLCBpcnJlZ3VsYXJTaW5nbGVzLCBzaW5ndWxhclJ1bGVzXG4gICk7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgd29yZCBpcyBzaW5ndWxhci5cbiAgICpcbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKi9cbiAgcGx1cmFsaXplLmlzU2luZ3VsYXIgPSBjaGVja1dvcmQoXG4gICAgaXJyZWd1bGFyUGx1cmFscywgaXJyZWd1bGFyU2luZ2xlcywgc2luZ3VsYXJSdWxlc1xuICApO1xuXG4gIC8qKlxuICAgKiBBZGQgYSBwbHVyYWxpemF0aW9uIHJ1bGUgdG8gdGhlIGNvbGxlY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xSZWdFeHApfSBydWxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICByZXBsYWNlbWVudFxuICAgKi9cbiAgcGx1cmFsaXplLmFkZFBsdXJhbFJ1bGUgPSBmdW5jdGlvbiAocnVsZSwgcmVwbGFjZW1lbnQpIHtcbiAgICBwbHVyYWxSdWxlcy5wdXNoKFtzYW5pdGl6ZVJ1bGUocnVsZSksIHJlcGxhY2VtZW50XSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZCBhIHNpbmd1bGFyaXphdGlvbiBydWxlIHRvIHRoZSBjb2xsZWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmd8UmVnRXhwKX0gcnVsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgcmVwbGFjZW1lbnRcbiAgICovXG4gIHBsdXJhbGl6ZS5hZGRTaW5ndWxhclJ1bGUgPSBmdW5jdGlvbiAocnVsZSwgcmVwbGFjZW1lbnQpIHtcbiAgICBzaW5ndWxhclJ1bGVzLnB1c2goW3Nhbml0aXplUnVsZShydWxlKSwgcmVwbGFjZW1lbnRdKTtcbiAgfTtcblxuICAvKipcbiAgICogQWRkIGFuIHVuY291bnRhYmxlIHdvcmQgcnVsZS5cbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nfFJlZ0V4cCl9IHdvcmRcbiAgICovXG4gIHBsdXJhbGl6ZS5hZGRVbmNvdW50YWJsZVJ1bGUgPSBmdW5jdGlvbiAod29yZCkge1xuICAgIGlmICh0eXBlb2Ygd29yZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHVuY291bnRhYmxlc1t3b3JkLnRvTG93ZXJDYXNlKCldID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTZXQgc2luZ3VsYXIgYW5kIHBsdXJhbCByZWZlcmVuY2VzIGZvciB0aGUgd29yZC5cbiAgICBwbHVyYWxpemUuYWRkUGx1cmFsUnVsZSh3b3JkLCAnJDAnKTtcbiAgICBwbHVyYWxpemUuYWRkU2luZ3VsYXJSdWxlKHdvcmQsICckMCcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBZGQgYW4gaXJyZWd1bGFyIHdvcmQgZGVmaW5pdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNpbmdsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGx1cmFsXG4gICAqL1xuICBwbHVyYWxpemUuYWRkSXJyZWd1bGFyUnVsZSA9IGZ1bmN0aW9uIChzaW5nbGUsIHBsdXJhbCkge1xuICAgIHBsdXJhbCA9IHBsdXJhbC50b0xvd2VyQ2FzZSgpO1xuICAgIHNpbmdsZSA9IHNpbmdsZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaXJyZWd1bGFyU2luZ2xlc1tzaW5nbGVdID0gcGx1cmFsO1xuICAgIGlycmVndWxhclBsdXJhbHNbcGx1cmFsXSA9IHNpbmdsZTtcbiAgfTtcblxuICAvKipcbiAgICogSXJyZWd1bGFyIHJ1bGVzLlxuICAgKi9cbiAgW1xuICAgIC8vIFByb25vdW5zLlxuICAgIFsnSScsICd3ZSddLFxuICAgIFsnbWUnLCAndXMnXSxcbiAgICBbJ2hlJywgJ3RoZXknXSxcbiAgICBbJ3NoZScsICd0aGV5J10sXG4gICAgWyd0aGVtJywgJ3RoZW0nXSxcbiAgICBbJ215c2VsZicsICdvdXJzZWx2ZXMnXSxcbiAgICBbJ3lvdXJzZWxmJywgJ3lvdXJzZWx2ZXMnXSxcbiAgICBbJ2l0c2VsZicsICd0aGVtc2VsdmVzJ10sXG4gICAgWydoZXJzZWxmJywgJ3RoZW1zZWx2ZXMnXSxcbiAgICBbJ2hpbXNlbGYnLCAndGhlbXNlbHZlcyddLFxuICAgIFsndGhlbXNlbGYnLCAndGhlbXNlbHZlcyddLFxuICAgIFsnaXMnLCAnYXJlJ10sXG4gICAgWyd3YXMnLCAnd2VyZSddLFxuICAgIFsnaGFzJywgJ2hhdmUnXSxcbiAgICBbJ3RoaXMnLCAndGhlc2UnXSxcbiAgICBbJ3RoYXQnLCAndGhvc2UnXSxcbiAgICAvLyBXb3JkcyBlbmRpbmcgaW4gd2l0aCBhIGNvbnNvbmFudCBhbmQgYG9gLlxuICAgIFsnZWNobycsICdlY2hvZXMnXSxcbiAgICBbJ2RpbmdvJywgJ2RpbmdvZXMnXSxcbiAgICBbJ3ZvbGNhbm8nLCAndm9sY2Fub2VzJ10sXG4gICAgWyd0b3JuYWRvJywgJ3Rvcm5hZG9lcyddLFxuICAgIFsndG9ycGVkbycsICd0b3JwZWRvZXMnXSxcbiAgICAvLyBFbmRzIHdpdGggYHVzYC5cbiAgICBbJ2dlbnVzJywgJ2dlbmVyYSddLFxuICAgIFsndmlzY3VzJywgJ3Zpc2NlcmEnXSxcbiAgICAvLyBFbmRzIHdpdGggYG1hYC5cbiAgICBbJ3N0aWdtYScsICdzdGlnbWF0YSddLFxuICAgIFsnc3RvbWEnLCAnc3RvbWF0YSddLFxuICAgIFsnZG9nbWEnLCAnZG9nbWF0YSddLFxuICAgIFsnbGVtbWEnLCAnbGVtbWF0YSddLFxuICAgIFsnc2NoZW1hJywgJ3NjaGVtYXRhJ10sXG4gICAgWydhbmF0aGVtYScsICdhbmF0aGVtYXRhJ10sXG4gICAgLy8gT3RoZXIgaXJyZWd1bGFyIHJ1bGVzLlxuICAgIFsnb3gnLCAnb3hlbiddLFxuICAgIFsnYXhlJywgJ2F4ZXMnXSxcbiAgICBbJ2RpZScsICdkaWNlJ10sXG4gICAgWyd5ZXMnLCAneWVzZXMnXSxcbiAgICBbJ2Zvb3QnLCAnZmVldCddLFxuICAgIFsnZWF2ZScsICdlYXZlcyddLFxuICAgIFsnZ29vc2UnLCAnZ2Vlc2UnXSxcbiAgICBbJ3Rvb3RoJywgJ3RlZXRoJ10sXG4gICAgWydxdWl6JywgJ3F1aXp6ZXMnXSxcbiAgICBbJ2h1bWFuJywgJ2h1bWFucyddLFxuICAgIFsncHJvb2YnLCAncHJvb2ZzJ10sXG4gICAgWydjYXJ2ZScsICdjYXJ2ZXMnXSxcbiAgICBbJ3ZhbHZlJywgJ3ZhbHZlcyddLFxuICAgIFsnbG9vZXknLCAnbG9vaWVzJ10sXG4gICAgWyd0aGllZicsICd0aGlldmVzJ10sXG4gICAgWydncm9vdmUnLCAnZ3Jvb3ZlcyddLFxuICAgIFsncGlja2F4ZScsICdwaWNrYXhlcyddLFxuICAgIFsnd2hpc2tleScsICd3aGlza2llcyddXG4gIF0uZm9yRWFjaChmdW5jdGlvbiAocnVsZSkge1xuICAgIHJldHVybiBwbHVyYWxpemUuYWRkSXJyZWd1bGFyUnVsZShydWxlWzBdLCBydWxlWzFdKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFBsdXJhbGl6YXRpb24gcnVsZXMuXG4gICAqL1xuICBbXG4gICAgWy9zPyQvaSwgJ3MnXSxcbiAgICBbL1teXFx1MDAwMC1cXHUwMDdGXSQvaSwgJyQwJ10sXG4gICAgWy8oW15hZWlvdV1lc2UpJC9pLCAnJDEnXSxcbiAgICBbLyhheHx0ZXN0KWlzJC9pLCAnJDFlcyddLFxuICAgIFsvKGFsaWFzfFteYW91XXVzfHRsYXN8Z2FzfHJpcykkL2ksICckMWVzJ10sXG4gICAgWy8oZVttbl11KXM/JC9pLCAnJDFzJ10sXG4gICAgWy8oW15sXWlhc3xbYWVpb3VdbGFzfFtlbWp6cl1hc3xbaXVdYW0pJC9pLCAnJDEnXSxcbiAgICBbLyhhbHVtbnxzeWxsYWJ8b2N0b3B8dmlyfHJhZGl8bnVjbGV8ZnVuZ3xjYWN0fHN0aW11bHx0ZXJtaW58YmFjaWxsfGZvY3x1dGVyfGxvY3xzdHJhdCkoPzp1c3xpKSQvaSwgJyQxaSddLFxuICAgIFsvKGFsdW1ufGFsZ3x2ZXJ0ZWJyKSg/OmF8YWUpJC9pLCAnJDFhZSddLFxuICAgIFsvKHNlcmFwaHxjaGVydWIpKD86aW0pPyQvaSwgJyQxaW0nXSxcbiAgICBbLyhoZXJ8YXR8Z3IpbyQvaSwgJyQxb2VzJ10sXG4gICAgWy8oYWdlbmR8YWRkZW5kfG1pbGxlbm5pfGRhdHxleHRyZW18YmFjdGVyaXxkZXNpZGVyYXR8c3RyYXR8Y2FuZGVsYWJyfGVycmF0fG92fHN5bXBvc2l8Y3VycmljdWx8YXV0b21hdHxxdW9yKSg/OmF8dW0pJC9pLCAnJDFhJ10sXG4gICAgWy8oYXBoZWxpfGh5cGVyYmF0fHBlcmloZWxpfGFzeW5kZXR8bm91bWVufHBoZW5vbWVufGNyaXRlcml8b3JnYW58cHJvbGVnb21lbnxoZWRyfGF1dG9tYXQpKD86YXxvbikkL2ksICckMWEnXSxcbiAgICBbL3NpcyQvaSwgJ3NlcyddLFxuICAgIFsvKD86KGtuaXx3aXxsaSlmZXwoYXJ8bHxlYXxlb3xvYXxob28pZikkL2ksICckMSQydmVzJ10sXG4gICAgWy8oW15hZWlvdXldfHF1KXkkL2ksICckMWllcyddLFxuICAgIFsvKFteY2hdW2llb11bbG5dKWV5JC9pLCAnJDFpZXMnXSxcbiAgICBbLyh4fGNofHNzfHNofHp6KSQvaSwgJyQxZXMnXSxcbiAgICBbLyhtYXRyfGNvZHxtdXJ8c2lsfHZlcnR8aW5kfGFwcGVuZCkoPzppeHxleCkkL2ksICckMWljZXMnXSxcbiAgICBbLyhtfGwpKD86aWNlfG91c2UpJC9pLCAnJDFpY2UnXSxcbiAgICBbLyhwZSkoPzpyc29ufG9wbGUpJC9pLCAnJDFvcGxlJ10sXG4gICAgWy8oY2hpbGQpKD86cmVuKT8kL2ksICckMXJlbiddLFxuICAgIFsvZWF1eCQvaSwgJyQwJ10sXG4gICAgWy9tW2FlXW4kL2ksICdtZW4nXSxcbiAgICBbJ3Rob3UnLCAneW91J11cbiAgXS5mb3JFYWNoKGZ1bmN0aW9uIChydWxlKSB7XG4gICAgcmV0dXJuIHBsdXJhbGl6ZS5hZGRQbHVyYWxSdWxlKHJ1bGVbMF0sIHJ1bGVbMV0pO1xuICB9KTtcblxuICAvKipcbiAgICogU2luZ3VsYXJpemF0aW9uIHJ1bGVzLlxuICAgKi9cbiAgW1xuICAgIFsvcyQvaSwgJyddLFxuICAgIFsvKHNzKSQvaSwgJyQxJ10sXG4gICAgWy8od2l8a25pfCg/OmFmdGVyfGhhbGZ8aGlnaHxsb3d8bWlkfG5vbnxuaWdodHxbXlxcd118XilsaSl2ZXMkL2ksICckMWZlJ10sXG4gICAgWy8oYXJ8KD86d298W2FlXSlsfFtlb11bYW9dKXZlcyQvaSwgJyQxZiddLFxuICAgIFsvaWVzJC9pLCAneSddLFxuICAgIFsvXFxiKFtwbF18em9tYnwoPzpuZWNrfGNyb3NzKT90fGNvbGx8ZmFlcnxmb29kfGdlbnxnb29ufGdyb3VwfGxhc3N8dGFsa3xnb2FsfGN1dClpZXMkL2ksICckMWllJ10sXG4gICAgWy9cXGIobW9ufHNtaWwpaWVzJC9pLCAnJDFleSddLFxuICAgIFsvKG18bClpY2UkL2ksICckMW91c2UnXSxcbiAgICBbLyhzZXJhcGh8Y2hlcnViKWltJC9pLCAnJDEnXSxcbiAgICBbLyh4fGNofHNzfHNofHp6fHR0b3xnb3xjaG98YWxpYXN8W15hb3VddXN8dGxhc3xnYXN8KD86aGVyfGF0fGdyKW98cmlzKSg/OmVzKT8kL2ksICckMSddLFxuICAgIFsvKGFuYWx5fGJhfGRpYWdub3xwYXJlbnRoZXxwcm9nbm98c3lub3B8dGhlfGVtcGhhfGNyaSkoPzpzaXN8c2VzKSQvaSwgJyQxc2lzJ10sXG4gICAgWy8obW92aWV8dHdlbHZlfGFidXNlfGVbbW5ddSlzJC9pLCAnJDEnXSxcbiAgICBbLyh0ZXN0KSg/OmlzfGVzKSQvaSwgJyQxaXMnXSxcbiAgICBbLyhhbHVtbnxzeWxsYWJ8b2N0b3B8dmlyfHJhZGl8bnVjbGV8ZnVuZ3xjYWN0fHN0aW11bHx0ZXJtaW58YmFjaWxsfGZvY3x1dGVyfGxvY3xzdHJhdCkoPzp1c3xpKSQvaSwgJyQxdXMnXSxcbiAgICBbLyhhZ2VuZHxhZGRlbmR8bWlsbGVubml8ZGF0fGV4dHJlbXxiYWN0ZXJpfGRlc2lkZXJhdHxzdHJhdHxjYW5kZWxhYnJ8ZXJyYXR8b3Z8c3ltcG9zaXxjdXJyaWN1bHxxdW9yKWEkL2ksICckMXVtJ10sXG4gICAgWy8oYXBoZWxpfGh5cGVyYmF0fHBlcmloZWxpfGFzeW5kZXR8bm91bWVufHBoZW5vbWVufGNyaXRlcml8b3JnYW58cHJvbGVnb21lbnxoZWRyfGF1dG9tYXQpYSQvaSwgJyQxb24nXSxcbiAgICBbLyhhbHVtbnxhbGd8dmVydGVicilhZSQvaSwgJyQxYSddLFxuICAgIFsvKGNvZHxtdXJ8c2lsfHZlcnR8aW5kKWljZXMkL2ksICckMWV4J10sXG4gICAgWy8obWF0cnxhcHBlbmQpaWNlcyQvaSwgJyQxaXgnXSxcbiAgICBbLyhwZSkocnNvbnxvcGxlKSQvaSwgJyQxcnNvbiddLFxuICAgIFsvKGNoaWxkKXJlbiQvaSwgJyQxJ10sXG4gICAgWy8oZWF1KXg/JC9pLCAnJDEnXSxcbiAgICBbL21lbiQvaSwgJ21hbiddXG4gIF0uZm9yRWFjaChmdW5jdGlvbiAocnVsZSkge1xuICAgIHJldHVybiBwbHVyYWxpemUuYWRkU2luZ3VsYXJSdWxlKHJ1bGVbMF0sIHJ1bGVbMV0pO1xuICB9KTtcblxuICAvKipcbiAgICogVW5jb3VudGFibGUgcnVsZXMuXG4gICAqL1xuICBbXG4gICAgLy8gU2luZ3VsYXIgd29yZHMgd2l0aCBubyBwbHVyYWxzLlxuICAgICdhZHVsdGhvb2QnLFxuICAgICdhZHZpY2UnLFxuICAgICdhZ2VuZGEnLFxuICAgICdhaWQnLFxuICAgICdhbGNvaG9sJyxcbiAgICAnYW1tbycsXG4gICAgJ2FuaW1lJyxcbiAgICAnYXRobGV0aWNzJyxcbiAgICAnYXVkaW8nLFxuICAgICdiaXNvbicsXG4gICAgJ2Jsb29kJyxcbiAgICAnYnJlYW0nLFxuICAgICdidWZmYWxvJyxcbiAgICAnYnV0dGVyJyxcbiAgICAnY2FycCcsXG4gICAgJ2Nhc2gnLFxuICAgICdjaGFzc2lzJyxcbiAgICAnY2hlc3MnLFxuICAgICdjbG90aGluZycsXG4gICAgJ2NvZCcsXG4gICAgJ2NvbW1lcmNlJyxcbiAgICAnY29vcGVyYXRpb24nLFxuICAgICdjb3JwcycsXG4gICAgJ2RlYnJpcycsXG4gICAgJ2RpYWJldGVzJyxcbiAgICAnZGlnZXN0aW9uJyxcbiAgICAnZWxrJyxcbiAgICAnZW5lcmd5JyxcbiAgICAnZXF1aXBtZW50JyxcbiAgICAnZXhjcmV0aW9uJyxcbiAgICAnZXhwZXJ0aXNlJyxcbiAgICAnZmxvdW5kZXInLFxuICAgICdmdW4nLFxuICAgICdnYWxsb3dzJyxcbiAgICAnZ2FyYmFnZScsXG4gICAgJ2dyYWZmaXRpJyxcbiAgICAnaGVhZHF1YXJ0ZXJzJyxcbiAgICAnaGVhbHRoJyxcbiAgICAnaGVycGVzJyxcbiAgICAnaGlnaGppbmtzJyxcbiAgICAnaG9tZXdvcmsnLFxuICAgICdob3VzZXdvcmsnLFxuICAgICdpbmZvcm1hdGlvbicsXG4gICAgJ2plYW5zJyxcbiAgICAnanVzdGljZScsXG4gICAgJ2t1ZG9zJyxcbiAgICAnbGFib3VyJyxcbiAgICAnbGl0ZXJhdHVyZScsXG4gICAgJ21hY2hpbmVyeScsXG4gICAgJ21hY2tlcmVsJyxcbiAgICAnbWFpbCcsXG4gICAgJ21lZGlhJyxcbiAgICAnbWV3cycsXG4gICAgJ21vb3NlJyxcbiAgICAnbXVzaWMnLFxuICAgICdtYW5nYScsXG4gICAgJ25ld3MnLFxuICAgICdwaWtlJyxcbiAgICAncGxhbmt0b24nLFxuICAgICdwbGllcnMnLFxuICAgICdwb2xsdXRpb24nLFxuICAgICdwcmVtaXNlcycsXG4gICAgJ3JhaW4nLFxuICAgICdyZXNlYXJjaCcsXG4gICAgJ3JpY2UnLFxuICAgICdzYWxtb24nLFxuICAgICdzY2lzc29ycycsXG4gICAgJ3NlcmllcycsXG4gICAgJ3Nld2FnZScsXG4gICAgJ3NoYW1ibGVzJyxcbiAgICAnc2hyaW1wJyxcbiAgICAnc3BlY2llcycsXG4gICAgJ3N0YWZmJyxcbiAgICAnc3dpbmUnLFxuICAgICd0ZW5uaXMnLFxuICAgICd0cmFmZmljJyxcbiAgICAndHJhbnNwb3JhdGlvbicsXG4gICAgJ3Ryb3V0JyxcbiAgICAndHVuYScsXG4gICAgJ3dlYWx0aCcsXG4gICAgJ3dlbGZhcmUnLFxuICAgICd3aGl0aW5nJyxcbiAgICAnd2lsZGViZWVzdCcsXG4gICAgJ3dpbGRsaWZlJyxcbiAgICAneW91JyxcbiAgICAvLyBSZWdleGVzLlxuICAgIC9bXmFlaW91XWVzZSQvaSwgLy8gXCJjaGluZXNlXCIsIFwiamFwYW5lc2VcIlxuICAgIC9kZWVyJC9pLCAvLyBcImRlZXJcIiwgXCJyZWluZGVlclwiXG4gICAgL2Zpc2gkL2ksIC8vIFwiZmlzaFwiLCBcImJsb3dmaXNoXCIsIFwiYW5nZWxmaXNoXCJcbiAgICAvbWVhc2xlcyQvaSxcbiAgICAvb1tpdV1zJC9pLCAvLyBcImNhcm5pdm9yb3VzXCJcbiAgICAvcG94JC9pLCAvLyBcImNoaWNrcG94XCIsIFwic21hbGxwb3hcIlxuICAgIC9zaGVlcCQvaVxuICBdLmZvckVhY2gocGx1cmFsaXplLmFkZFVuY291bnRhYmxlUnVsZSk7XG5cbiAgcmV0dXJuIHBsdXJhbGl6ZTtcbn0pO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwcmludFdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xuICB2YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG5cbiAgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24odGV4dCkge1xuICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyB0ZXh0O1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH07XG59XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgdGhlIHZhbHVlcyBtYXRjaCB3aXRoIHRoZSB0eXBlIHNwZWNzLlxuICogRXJyb3IgbWVzc2FnZXMgYXJlIG1lbW9yaXplZCBhbmQgd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHR5cGVTcGVjcyBNYXAgb2YgbmFtZSB0byBhIFJlYWN0UHJvcFR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZXMgUnVudGltZSB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIHR5cGUtY2hlY2tlZFxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uIGUuZy4gXCJwcm9wXCIsIFwiY29udGV4dFwiLCBcImNoaWxkIGNvbnRleHRcIlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbXBvbmVudE5hbWUgTmFtZSBvZiB0aGUgY29tcG9uZW50IGZvciBlcnJvciBtZXNzYWdlcy5cbiAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBnZXRTdGFjayBSZXR1cm5zIHRoZSBjb21wb25lbnQgc3RhY2suXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGdldFN0YWNrKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKHR5cGVTcGVjcy5oYXNPd25Qcm9wZXJ0eSh0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvcjtcbiAgICAgICAgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcihcbiAgICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICtcbiAgICAgICAgICAgICAgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvciA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yID0gZXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yICYmICEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAnICtcbiAgICAgICAgICAgIGxvY2F0aW9uICsgJyBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArXG4gICAgICAgICAgICAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJyArIHR5cGVvZiBlcnJvciArICcuICcgK1xuICAgICAgICAgICAgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgK1xuICAgICAgICAgICAgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArXG4gICAgICAgICAgICAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLidcbiAgICAgICAgICApXG5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yLm1lc3NhZ2VdID0gdHJ1ZTtcblxuICAgICAgICAgIHZhciBzdGFjayA9IGdldFN0YWNrID8gZ2V0U3RhY2soKSA6ICcnO1xuXG4gICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgJ0ZhaWxlZCAnICsgbG9jYXRpb24gKyAnIHR5cGU6ICcgKyBlcnJvci5tZXNzYWdlICsgKHN0YWNrICE9IG51bGwgPyBzdGFjayA6ICcnKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjaGVja1Byb3BUeXBlcztcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xudmFyIGNoZWNrUHJvcFR5cGVzID0gcmVxdWlyZSgnLi9jaGVja1Byb3BUeXBlcycpO1xuXG52YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24odGV4dCkge1xuICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyB0ZXh0O1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGwoKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGlzVmFsaWRFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKSB7XG4gIC8qIGdsb2JhbCBTeW1ib2wgKi9cbiAgdmFyIElURVJBVE9SX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yO1xuICB2YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7IC8vIEJlZm9yZSBTeW1ib2wgc3BlYy5cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgaXRlcmF0b3IgbWV0aG9kIGZ1bmN0aW9uIGNvbnRhaW5lZCBvbiB0aGUgaXRlcmFibGUgb2JqZWN0LlxuICAgKlxuICAgKiBCZSBzdXJlIHRvIGludm9rZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgaXRlcmFibGUgYXMgY29udGV4dDpcbiAgICpcbiAgICogICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihteUl0ZXJhYmxlKTtcbiAgICogICAgIGlmIChpdGVyYXRvckZuKSB7XG4gICAqICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChteUl0ZXJhYmxlKTtcbiAgICogICAgICAgLi4uXG4gICAqICAgICB9XG4gICAqXG4gICAqIEBwYXJhbSB7P29iamVjdH0gbWF5YmVJdGVyYWJsZVxuICAgKiBAcmV0dXJuIHs/ZnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IG1heWJlSXRlcmFibGUgJiYgKElURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF0pO1xuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGl0ZXJhdG9yRm47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbGxlY3Rpb24gb2YgbWV0aG9kcyB0aGF0IGFsbG93IGRlY2xhcmF0aW9uIGFuZCB2YWxpZGF0aW9uIG9mIHByb3BzIHRoYXQgYXJlXG4gICAqIHN1cHBsaWVkIHRvIFJlYWN0IGNvbXBvbmVudHMuIEV4YW1wbGUgdXNhZ2U6XG4gICAqXG4gICAqICAgdmFyIFByb3BzID0gcmVxdWlyZSgnUmVhY3RQcm9wVHlwZXMnKTtcbiAgICogICB2YXIgTXlBcnRpY2xlID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICAgcHJvcFR5cGVzOiB7XG4gICAqICAgICAgIC8vIEFuIG9wdGlvbmFsIHN0cmluZyBwcm9wIG5hbWVkIFwiZGVzY3JpcHRpb25cIi5cbiAgICogICAgICAgZGVzY3JpcHRpb246IFByb3BzLnN0cmluZyxcbiAgICpcbiAgICogICAgICAgLy8gQSByZXF1aXJlZCBlbnVtIHByb3AgbmFtZWQgXCJjYXRlZ29yeVwiLlxuICAgKiAgICAgICBjYXRlZ29yeTogUHJvcHMub25lT2YoWydOZXdzJywnUGhvdG9zJ10pLmlzUmVxdWlyZWQsXG4gICAqXG4gICAqICAgICAgIC8vIEEgcHJvcCBuYW1lZCBcImRpYWxvZ1wiIHRoYXQgcmVxdWlyZXMgYW4gaW5zdGFuY2Ugb2YgRGlhbG9nLlxuICAgKiAgICAgICBkaWFsb2c6IFByb3BzLmluc3RhbmNlT2YoRGlhbG9nKS5pc1JlcXVpcmVkXG4gICAqICAgICB9LFxuICAgKiAgICAgcmVuZGVyOiBmdW5jdGlvbigpIHsgLi4uIH1cbiAgICogICB9KTtcbiAgICpcbiAgICogQSBtb3JlIGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIGhvdyB0aGVzZSBtZXRob2RzIGFyZSB1c2VkOlxuICAgKlxuICAgKiAgIHR5cGUgOj0gYXJyYXl8Ym9vbHxmdW5jfG9iamVjdHxudW1iZXJ8c3RyaW5nfG9uZU9mKFsuLi5dKXxpbnN0YW5jZU9mKC4uLilcbiAgICogICBkZWNsIDo9IFJlYWN0UHJvcFR5cGVzLnt0eXBlfSguaXNSZXF1aXJlZCk/XG4gICAqXG4gICAqIEVhY2ggYW5kIGV2ZXJ5IGRlY2xhcmF0aW9uIHByb2R1Y2VzIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUuIFRoaXNcbiAgICogYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvbnMuIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAgdmFyIE15TGluayA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgcHJvcFR5cGVzOiB7XG4gICAqICAgICAgLy8gQW4gb3B0aW9uYWwgc3RyaW5nIG9yIFVSSSBwcm9wIG5hbWVkIFwiaHJlZlwiLlxuICAgKiAgICAgIGhyZWY6IGZ1bmN0aW9uKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkge1xuICAgKiAgICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICogICAgICAgIGlmIChwcm9wVmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgcHJvcFZhbHVlICE9PSAnc3RyaW5nJyAmJlxuICAgKiAgICAgICAgICAgICEocHJvcFZhbHVlIGluc3RhbmNlb2YgVVJJKSkge1xuICAgKiAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKFxuICAgKiAgICAgICAgICAgICdFeHBlY3RlZCBhIHN0cmluZyBvciBhbiBVUkkgZm9yICcgKyBwcm9wTmFtZSArICcgaW4gJyArXG4gICAqICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgKiAgICAgICAgICApO1xuICAgKiAgICAgICAgfVxuICAgKiAgICAgIH1cbiAgICogICAgfSxcbiAgICogICAgcmVuZGVyOiBmdW5jdGlvbigpIHsuLi59XG4gICAqICB9KTtcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuXG4gIHZhciBBTk9OWU1PVVMgPSAnPDxhbm9ueW1vdXM+Pic7XG5cbiAgLy8gSW1wb3J0YW50IVxuICAvLyBLZWVwIHRoaXMgbGlzdCBpbiBzeW5jIHdpdGggcHJvZHVjdGlvbiB2ZXJzaW9uIGluIGAuL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcy5qc2AuXG4gIHZhciBSZWFjdFByb3BUeXBlcyA9IHtcbiAgICBhcnJheTogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2FycmF5JyksXG4gICAgYm9vbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Jvb2xlYW4nKSxcbiAgICBmdW5jOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignZnVuY3Rpb24nKSxcbiAgICBudW1iZXI6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdudW1iZXInKSxcbiAgICBvYmplY3Q6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdvYmplY3QnKSxcbiAgICBzdHJpbmc6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdzdHJpbmcnKSxcbiAgICBzeW1ib2w6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdzeW1ib2wnKSxcblxuICAgIGFueTogY3JlYXRlQW55VHlwZUNoZWNrZXIoKSxcbiAgICBhcnJheU9mOiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIsXG4gICAgZWxlbWVudDogY3JlYXRlRWxlbWVudFR5cGVDaGVja2VyKCksXG4gICAgaW5zdGFuY2VPZjogY3JlYXRlSW5zdGFuY2VUeXBlQ2hlY2tlcixcbiAgICBub2RlOiBjcmVhdGVOb2RlQ2hlY2tlcigpLFxuICAgIG9iamVjdE9mOiBjcmVhdGVPYmplY3RPZlR5cGVDaGVja2VyLFxuICAgIG9uZU9mOiBjcmVhdGVFbnVtVHlwZUNoZWNrZXIsXG4gICAgb25lT2ZUeXBlOiBjcmVhdGVVbmlvblR5cGVDaGVja2VyLFxuICAgIHNoYXBlOiBjcmVhdGVTaGFwZVR5cGVDaGVja2VyLFxuICAgIGV4YWN0OiBjcmVhdGVTdHJpY3RTaGFwZVR5cGVDaGVja2VyLFxuICB9O1xuXG4gIC8qKlxuICAgKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1xuICAgKi9cbiAgLyplc2xpbnQtZGlzYWJsZSBuby1zZWxmLWNvbXBhcmUqL1xuICBmdW5jdGlvbiBpcyh4LCB5KSB7XG4gICAgLy8gU2FtZVZhbHVlIGFsZ29yaXRobVxuICAgIGlmICh4ID09PSB5KSB7XG4gICAgICAvLyBTdGVwcyAxLTUsIDctMTBcbiAgICAgIC8vIFN0ZXBzIDYuYi02LmU6ICswICE9IC0wXG4gICAgICByZXR1cm4geCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFN0ZXAgNi5hOiBOYU4gPT0gTmFOXG4gICAgICByZXR1cm4geCAhPT0geCAmJiB5ICE9PSB5O1xuICAgIH1cbiAgfVxuICAvKmVzbGludC1lbmFibGUgbm8tc2VsZi1jb21wYXJlKi9cblxuICAvKipcbiAgICogV2UgdXNlIGFuIEVycm9yLWxpa2Ugb2JqZWN0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFzIHBlb3BsZSBtYXkgY2FsbFxuICAgKiBQcm9wVHlwZXMgZGlyZWN0bHkgYW5kIGluc3BlY3QgdGhlaXIgb3V0cHV0LiBIb3dldmVyLCB3ZSBkb24ndCB1c2UgcmVhbFxuICAgKiBFcnJvcnMgYW55bW9yZS4gV2UgZG9uJ3QgaW5zcGVjdCB0aGVpciBzdGFjayBhbnl3YXksIGFuZCBjcmVhdGluZyB0aGVtXG4gICAqIGlzIHByb2hpYml0aXZlbHkgZXhwZW5zaXZlIGlmIHRoZXkgYXJlIGNyZWF0ZWQgdG9vIG9mdGVuLCBzdWNoIGFzIHdoYXRcbiAgICogaGFwcGVucyBpbiBvbmVPZlR5cGUoKSBmb3IgYW55IHR5cGUgYmVmb3JlIHRoZSBvbmUgdGhhdCBtYXRjaGVkLlxuICAgKi9cbiAgZnVuY3Rpb24gUHJvcFR5cGVFcnJvcihtZXNzYWdlKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB0aGlzLnN0YWNrID0gJyc7XG4gIH1cbiAgLy8gTWFrZSBgaW5zdGFuY2VvZiBFcnJvcmAgc3RpbGwgd29yayBmb3IgcmV0dXJuZWQgZXJyb3JzLlxuICBQcm9wVHlwZUVycm9yLnByb3RvdHlwZSA9IEVycm9yLnByb3RvdHlwZTtcblxuICBmdW5jdGlvbiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGUgPSB7fTtcbiAgICAgIHZhciBtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudCA9IDA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNoZWNrVHlwZShpc1JlcXVpcmVkLCBwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgICAgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWUgfHwgQU5PTllNT1VTO1xuICAgICAgcHJvcEZ1bGxOYW1lID0gcHJvcEZ1bGxOYW1lIHx8IHByb3BOYW1lO1xuXG4gICAgICBpZiAoc2VjcmV0ICE9PSBSZWFjdFByb3BUeXBlc1NlY3JldCkge1xuICAgICAgICBpZiAodGhyb3dPbkRpcmVjdEFjY2Vzcykge1xuICAgICAgICAgIC8vIE5ldyBiZWhhdmlvciBvbmx5IGZvciB1c2VycyBvZiBgcHJvcC10eXBlc2AgcGFja2FnZVxuICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnQ2FsbGluZyBQcm9wVHlwZXMgdmFsaWRhdG9ycyBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAgICAgICAnVXNlIGBQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoKWAgdG8gY2FsbCB0aGVtLiAnICtcbiAgICAgICAgICAgICdSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgLy8gT2xkIGJlaGF2aW9yIGZvciBwZW9wbGUgdXNpbmcgUmVhY3QuUHJvcFR5cGVzXG4gICAgICAgICAgdmFyIGNhY2hlS2V5ID0gY29tcG9uZW50TmFtZSArICc6JyArIHByb3BOYW1lO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFtYW51YWxQcm9wVHlwZUNhbGxDYWNoZVtjYWNoZUtleV0gJiZcbiAgICAgICAgICAgIC8vIEF2b2lkIHNwYW1taW5nIHRoZSBjb25zb2xlIGJlY2F1c2UgdGhleSBhcmUgb2Z0ZW4gbm90IGFjdGlvbmFibGUgZXhjZXB0IGZvciBsaWIgYXV0aG9yc1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQgPCAzXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAgICdZb3UgYXJlIG1hbnVhbGx5IGNhbGxpbmcgYSBSZWFjdC5Qcm9wVHlwZXMgdmFsaWRhdGlvbiAnICtcbiAgICAgICAgICAgICAgJ2Z1bmN0aW9uIGZvciB0aGUgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBwcm9wIG9uIGAnICsgY29tcG9uZW50TmFtZSAgKyAnYC4gVGhpcyBpcyBkZXByZWNhdGVkICcgK1xuICAgICAgICAgICAgICAnYW5kIHdpbGwgdGhyb3cgaW4gdGhlIHN0YW5kYWxvbmUgYHByb3AtdHlwZXNgIHBhY2thZ2UuICcgK1xuICAgICAgICAgICAgICAnWW91IG1heSBiZSBzZWVpbmcgdGhpcyB3YXJuaW5nIGR1ZSB0byBhIHRoaXJkLXBhcnR5IFByb3BUeXBlcyAnICtcbiAgICAgICAgICAgICAgJ2xpYnJhcnkuIFNlZSBodHRwczovL2ZiLm1lL3JlYWN0LXdhcm5pbmctZG9udC1jYWxsLXByb3B0eXBlcyAnICsgJ2ZvciBkZXRhaWxzLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBtYW51YWxQcm9wVHlwZUNhbGxDYWNoZVtjYWNoZUtleV0gPSB0cnVlO1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBpZiAoaXNSZXF1aXJlZCkge1xuICAgICAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignVGhlICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgJyArICgnaW4gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGJ1dCBpdHMgdmFsdWUgaXMgYG51bGxgLicpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdUaGUgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCBpbiAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgYnV0IGl0cyB2YWx1ZSBpcyBgdW5kZWZpbmVkYC4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hhaW5lZENoZWNrVHlwZSA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIGZhbHNlKTtcbiAgICBjaGFpbmVkQ2hlY2tUeXBlLmlzUmVxdWlyZWQgPSBjaGVja1R5cGUuYmluZChudWxsLCB0cnVlKTtcblxuICAgIHJldHVybiBjaGFpbmVkQ2hlY2tUeXBlO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoZXhwZWN0ZWRUeXBlKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSBleHBlY3RlZFR5cGUpIHtcbiAgICAgICAgLy8gYHByb3BWYWx1ZWAgYmVpbmcgaW5zdGFuY2Ugb2YsIHNheSwgZGF0ZS9yZWdleHAsIHBhc3MgdGhlICdvYmplY3QnXG4gICAgICAgIC8vIGNoZWNrLCBidXQgd2UgY2FuIG9mZmVyIGEgbW9yZSBwcmVjaXNlIGVycm9yIG1lc3NhZ2UgaGVyZSByYXRoZXIgdGhhblxuICAgICAgICAvLyAnb2YgdHlwZSBgb2JqZWN0YCcuXG4gICAgICAgIHZhciBwcmVjaXNlVHlwZSA9IGdldFByZWNpc2VUeXBlKHByb3BWYWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJlY2lzZVR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2AnICsgZXhwZWN0ZWRUeXBlICsgJ2AuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVBbnlUeXBlQ2hlY2tlcigpIHtcbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIoZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbCk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIodHlwZUNoZWNrZXIpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdHlwZUNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdQcm9wZXJ0eSBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIGNvbXBvbmVudCBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgYXJyYXlPZi4nKTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBhcnJheS4nKSk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihwcm9wVmFsdWUsIGksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnWycgKyBpICsgJ10nLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIWlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBzaW5nbGUgUmVhY3RFbGVtZW50LicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VUeXBlQ2hlY2tlcihleHBlY3RlZENsYXNzKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAoIShwcm9wc1twcm9wTmFtZV0gaW5zdGFuY2VvZiBleHBlY3RlZENsYXNzKSkge1xuICAgICAgICB2YXIgZXhwZWN0ZWRDbGFzc05hbWUgPSBleHBlY3RlZENsYXNzLm5hbWUgfHwgQU5PTllNT1VTO1xuICAgICAgICB2YXIgYWN0dWFsQ2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKHByb3BzW3Byb3BOYW1lXSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIGFjdHVhbENsYXNzTmFtZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCAnKSArICgnaW5zdGFuY2Ugb2YgYCcgKyBleHBlY3RlZENsYXNzTmFtZSArICdgLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlRW51bVR5cGVDaGVja2VyKGV4cGVjdGVkVmFsdWVzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGV4cGVjdGVkVmFsdWVzKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHByaW50V2FybmluZygnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZiwgZXhwZWN0ZWQgYW4gaW5zdGFuY2Ugb2YgYXJyYXkuJykgOiB2b2lkIDA7XG4gICAgICByZXR1cm4gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cGVjdGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpcyhwcm9wVmFsdWUsIGV4cGVjdGVkVmFsdWVzW2ldKSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciB2YWx1ZXNTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShleHBlY3RlZFZhbHVlcyk7XG4gICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHZhbHVlIGAnICsgcHJvcFZhbHVlICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIG9uZSBvZiAnICsgdmFsdWVzU3RyaW5nICsgJy4nKSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVPYmplY3RPZlR5cGVDaGVja2VyKHR5cGVDaGVja2VyKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAodHlwZW9mIHR5cGVDaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignUHJvcGVydHkgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiBjb21wb25lbnQgYCcgKyBjb21wb25lbnROYW1lICsgJ2AgaGFzIGludmFsaWQgUHJvcFR5cGUgbm90YXRpb24gaW5zaWRlIG9iamVjdE9mLicpO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGFuIG9iamVjdC4nKSk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gcHJvcFZhbHVlKSB7XG4gICAgICAgIGlmIChwcm9wVmFsdWUuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIHZhciBlcnJvciA9IHR5cGVDaGVja2VyKHByb3BWYWx1ZSwga2V5LCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJy4nICsga2V5LCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlVW5pb25UeXBlQ2hlY2tlcihhcnJheU9mVHlwZUNoZWNrZXJzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5T2ZUeXBlQ2hlY2tlcnMpKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gcHJpbnRXYXJuaW5nKCdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mVHlwZSwgZXhwZWN0ZWQgYW4gaW5zdGFuY2Ugb2YgYXJyYXkuJykgOiB2b2lkIDA7XG4gICAgICByZXR1cm4gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5T2ZUeXBlQ2hlY2tlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGVja2VyID0gYXJyYXlPZlR5cGVDaGVja2Vyc1tpXTtcbiAgICAgIGlmICh0eXBlb2YgY2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2ZUeXBlLiBFeHBlY3RlZCBhbiBhcnJheSBvZiBjaGVjayBmdW5jdGlvbnMsIGJ1dCAnICtcbiAgICAgICAgICAncmVjZWl2ZWQgJyArIGdldFBvc3RmaXhGb3JUeXBlV2FybmluZyhjaGVja2VyKSArICcgYXQgaW5kZXggJyArIGkgKyAnLidcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5T2ZUeXBlQ2hlY2tlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBhcnJheU9mVHlwZUNoZWNrZXJzW2ldO1xuICAgICAgICBpZiAoY2hlY2tlcihwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KSA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBzdXBwbGllZCB0byAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYC4nKSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVOb2RlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICghaXNOb2RlKHByb3BzW3Byb3BOYW1lXSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBzdXBwbGllZCB0byAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBSZWFjdE5vZGUuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVTaGFwZVR5cGVDaGVja2VyKHNoYXBlVHlwZXMpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgYCcgKyBwcm9wVHlwZSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBgb2JqZWN0YC4nKSk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc2hhcGVUeXBlcykge1xuICAgICAgICB2YXIgY2hlY2tlciA9IHNoYXBlVHlwZXNba2V5XTtcbiAgICAgICAgaWYgKCFjaGVja2VyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVycm9yID0gY2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU3RyaWN0U2hhcGVUeXBlQ2hlY2tlcihzaGFwZVR5cGVzKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlIGAnICsgcHJvcFR5cGUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYG9iamVjdGAuJykpO1xuICAgICAgfVxuICAgICAgLy8gV2UgbmVlZCB0byBjaGVjayBhbGwga2V5cyBpbiBjYXNlIHNvbWUgYXJlIHJlcXVpcmVkIGJ1dCBtaXNzaW5nIGZyb21cbiAgICAgIC8vIHByb3BzLlxuICAgICAgdmFyIGFsbEtleXMgPSBhc3NpZ24oe30sIHByb3BzW3Byb3BOYW1lXSwgc2hhcGVUeXBlcyk7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gYWxsS2V5cykge1xuICAgICAgICB2YXIgY2hlY2tlciA9IHNoYXBlVHlwZXNba2V5XTtcbiAgICAgICAgaWYgKCFjaGVja2VyKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKFxuICAgICAgICAgICAgJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIGtleSBgJyArIGtleSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLicgK1xuICAgICAgICAgICAgJ1xcbkJhZCBvYmplY3Q6ICcgKyBKU09OLnN0cmluZ2lmeShwcm9wc1twcm9wTmFtZV0sIG51bGwsICcgICcpICtcbiAgICAgICAgICAgICdcXG5WYWxpZCBrZXlzOiAnICsgIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKHNoYXBlVHlwZXMpLCBudWxsLCAnICAnKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVycm9yID0gY2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc05vZGUocHJvcFZhbHVlKSB7XG4gICAgc3dpdGNoICh0eXBlb2YgcHJvcFZhbHVlKSB7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIHJldHVybiAhcHJvcFZhbHVlO1xuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBwcm9wVmFsdWUuZXZlcnkoaXNOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcFZhbHVlID09PSBudWxsIHx8IGlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihwcm9wVmFsdWUpO1xuICAgICAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChwcm9wVmFsdWUpO1xuICAgICAgICAgIHZhciBzdGVwO1xuICAgICAgICAgIGlmIChpdGVyYXRvckZuICE9PSBwcm9wVmFsdWUuZW50cmllcykge1xuICAgICAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgICBpZiAoIWlzTm9kZShzdGVwLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJdGVyYXRvciB3aWxsIHByb3ZpZGUgZW50cnkgW2ssdl0gdHVwbGVzIHJhdGhlciB0aGFuIHZhbHVlcy5cbiAgICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05vZGUoZW50cnlbMV0pKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzU3ltYm9sKHByb3BUeXBlLCBwcm9wVmFsdWUpIHtcbiAgICAvLyBOYXRpdmUgU3ltYm9sLlxuICAgIGlmIChwcm9wVHlwZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIDE5LjQuMy41IFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ10gPT09ICdTeW1ib2wnXG4gICAgaWYgKHByb3BWYWx1ZVsnQEB0b1N0cmluZ1RhZyddID09PSAnU3ltYm9sJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgZm9yIG5vbi1zcGVjIGNvbXBsaWFudCBTeW1ib2xzIHdoaWNoIGFyZSBwb2x5ZmlsbGVkLlxuICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHByb3BWYWx1ZSBpbnN0YW5jZW9mIFN5bWJvbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gRXF1aXZhbGVudCBvZiBgdHlwZW9mYCBidXQgd2l0aCBzcGVjaWFsIGhhbmRsaW5nIGZvciBhcnJheSBhbmQgcmVnZXhwLlxuICBmdW5jdGlvbiBnZXRQcm9wVHlwZShwcm9wVmFsdWUpIHtcbiAgICB2YXIgcHJvcFR5cGUgPSB0eXBlb2YgcHJvcFZhbHVlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgIHJldHVybiAnYXJyYXknO1xuICAgIH1cbiAgICBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAvLyBPbGQgd2Via2l0cyAoYXQgbGVhc3QgdW50aWwgQW5kcm9pZCA0LjApIHJldHVybiAnZnVuY3Rpb24nIHJhdGhlciB0aGFuXG4gICAgICAvLyAnb2JqZWN0JyBmb3IgdHlwZW9mIGEgUmVnRXhwLiBXZSdsbCBub3JtYWxpemUgdGhpcyBoZXJlIHNvIHRoYXQgL2JsYS9cbiAgICAgIC8vIHBhc3NlcyBQcm9wVHlwZXMub2JqZWN0LlxuICAgICAgcmV0dXJuICdvYmplY3QnO1xuICAgIH1cbiAgICBpZiAoaXNTeW1ib2wocHJvcFR5cGUsIHByb3BWYWx1ZSkpIHtcbiAgICAgIHJldHVybiAnc3ltYm9sJztcbiAgICB9XG4gICAgcmV0dXJuIHByb3BUeXBlO1xuICB9XG5cbiAgLy8gVGhpcyBoYW5kbGVzIG1vcmUgdHlwZXMgdGhhbiBgZ2V0UHJvcFR5cGVgLiBPbmx5IHVzZWQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICAvLyBTZWUgYGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyYC5cbiAgZnVuY3Rpb24gZ2V0UHJlY2lzZVR5cGUocHJvcFZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHByb3BWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnICsgcHJvcFZhbHVlO1xuICAgIH1cbiAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgIGlmIChwcm9wVHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiAnZGF0ZSc7XG4gICAgICB9IGVsc2UgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9wVHlwZTtcbiAgfVxuXG4gIC8vIFJldHVybnMgYSBzdHJpbmcgdGhhdCBpcyBwb3N0Zml4ZWQgdG8gYSB3YXJuaW5nIGFib3V0IGFuIGludmFsaWQgdHlwZS5cbiAgLy8gRm9yIGV4YW1wbGUsIFwidW5kZWZpbmVkXCIgb3IgXCJvZiB0eXBlIGFycmF5XCJcbiAgZnVuY3Rpb24gZ2V0UG9zdGZpeEZvclR5cGVXYXJuaW5nKHZhbHVlKSB7XG4gICAgdmFyIHR5cGUgPSBnZXRQcmVjaXNlVHlwZSh2YWx1ZSk7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdhcnJheSc6XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICByZXR1cm4gJ2FuICcgKyB0eXBlO1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgIGNhc2UgJ3JlZ2V4cCc6XG4gICAgICAgIHJldHVybiAnYSAnICsgdHlwZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJldHVybnMgY2xhc3MgbmFtZSBvZiB0aGUgb2JqZWN0LCBpZiBhbnkuXG4gIGZ1bmN0aW9uIGdldENsYXNzTmFtZShwcm9wVmFsdWUpIHtcbiAgICBpZiAoIXByb3BWYWx1ZS5jb25zdHJ1Y3RvciB8fCAhcHJvcFZhbHVlLmNvbnN0cnVjdG9yLm5hbWUpIHtcbiAgICAgIHJldHVybiBBTk9OWU1PVVM7XG4gICAgfVxuICAgIHJldHVybiBwcm9wVmFsdWUuY29uc3RydWN0b3IubmFtZTtcbiAgfVxuXG4gIFJlYWN0UHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzID0gY2hlY2tQcm9wVHlwZXM7XG4gIFJlYWN0UHJvcFR5cGVzLlByb3BUeXBlcyA9IFJlYWN0UHJvcFR5cGVzO1xuXG4gIHJldHVybiBSZWFjdFByb3BUeXBlcztcbn07XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIFN5bWJvbC5mb3IgJiZcbiAgICBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykpIHx8XG4gICAgMHhlYWM3O1xuXG4gIHZhciBpc1ZhbGlkRWxlbWVudCA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuICAgICAgb2JqZWN0ICE9PSBudWxsICYmXG4gICAgICBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbiAgfTtcblxuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBkZXZlbG9wbWVudCBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICB2YXIgdGhyb3dPbkRpcmVjdEFjY2VzcyA9IHRydWU7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFR5cGVDaGVja2VycycpKGlzVmFsaWRFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKTtcbn0gZWxzZSB7XG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IHByb2R1Y3Rpb24gYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcycpKCk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJztcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFByb3BUeXBlc1NlY3JldDtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuIShmdW5jdGlvbihnbG9iYWwpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICB2YXIgaW5Nb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiO1xuICB2YXIgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWU7XG4gIGlmIChydW50aW1lKSB7XG4gICAgaWYgKGluTW9kdWxlKSB7XG4gICAgICAvLyBJZiByZWdlbmVyYXRvclJ1bnRpbWUgaXMgZGVmaW5lZCBnbG9iYWxseSBhbmQgd2UncmUgaW4gYSBtb2R1bGUsXG4gICAgICAvLyBtYWtlIHRoZSBleHBvcnRzIG9iamVjdCBpZGVudGljYWwgdG8gcmVnZW5lcmF0b3JSdW50aW1lLlxuICAgICAgbW9kdWxlLmV4cG9ydHMgPSBydW50aW1lO1xuICAgIH1cbiAgICAvLyBEb24ndCBib3RoZXIgZXZhbHVhdGluZyB0aGUgcmVzdCBvZiB0aGlzIGZpbGUgaWYgdGhlIHJ1bnRpbWUgd2FzXG4gICAgLy8gYWxyZWFkeSBkZWZpbmVkIGdsb2JhbGx5LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIERlZmluZSB0aGUgcnVudGltZSBnbG9iYWxseSAoYXMgZXhwZWN0ZWQgYnkgZ2VuZXJhdGVkIGNvZGUpIGFzIGVpdGhlclxuICAvLyBtb2R1bGUuZXhwb3J0cyAoaWYgd2UncmUgaW4gYSBtb2R1bGUpIG9yIGEgbmV3LCBlbXB0eSBvYmplY3QuXG4gIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lID0gaW5Nb2R1bGUgPyBtb2R1bGUuZXhwb3J0cyA6IHt9O1xuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIHJ1bnRpbWUud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIEl0ZXJhdG9yUHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmXG4gICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiZcbiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHtcbiAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBwb2x5ZmlsbC5cbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID1cbiAgICBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlW3RvU3RyaW5nVGFnU3ltYm9sXSA9XG4gICAgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG5cbiAgLy8gSGVscGVyIGZvciBkZWZpbmluZyB0aGUgLm5leHQsIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcyBvZiB0aGVcbiAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlIGluIHRlcm1zIG9mIGEgc2luZ2xlIC5faW52b2tlIG1ldGhvZC5cbiAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkge1xuICAgIFtcIm5leHRcIiwgXCJ0aHJvd1wiLCBcInJldHVyblwiXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgcHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcnVudGltZS5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBjdG9yXG4gICAgICA/IGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8XG4gICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gZG8gaXMgdG8gY2hlY2sgaXRzIC5uYW1lIHByb3BlcnR5LlxuICAgICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgICAgIDogZmFsc2U7XG4gIH07XG5cbiAgcnVudGltZS5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gICAgICBpZiAoISh0b1N0cmluZ1RhZ1N5bWJvbCBpbiBnZW5GdW4pKSB7XG4gICAgICAgIGdlbkZ1blt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTtcbiAgICByZXR1cm4gZ2VuRnVuO1xuICB9O1xuXG4gIC8vIFdpdGhpbiB0aGUgYm9keSBvZiBhbnkgYXN5bmMgZnVuY3Rpb24sIGBhd2FpdCB4YCBpcyB0cmFuc2Zvcm1lZCB0b1xuICAvLyBgeWllbGQgcmVnZW5lcmF0b3JSdW50aW1lLmF3cmFwKHgpYCwgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gdGVzdFxuICAvLyBgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKWAgdG8gZGV0ZXJtaW5lIGlmIHRoZSB5aWVsZGVkIHZhbHVlIGlzXG4gIC8vIG1lYW50IHRvIGJlIGF3YWl0ZWQuXG4gIHJ1bnRpbWUuYXdyYXAgPSBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4geyBfX2F3YWl0OiBhcmcgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHJlamVjdChyZWNvcmQuYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnO1xuICAgICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbih1bndyYXBwZWQpIHtcbiAgICAgICAgICAvLyBXaGVuIGEgeWllbGRlZCBQcm9taXNlIGlzIHJlc29sdmVkLCBpdHMgZmluYWwgdmFsdWUgYmVjb21lc1xuICAgICAgICAgIC8vIHRoZSAudmFsdWUgb2YgdGhlIFByb21pc2U8e3ZhbHVlLGRvbmV9PiByZXN1bHQgZm9yIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uLiBJZiB0aGUgUHJvbWlzZSBpcyByZWplY3RlZCwgaG93ZXZlciwgdGhlXG4gICAgICAgICAgLy8gcmVzdWx0IGZvciB0aGlzIGl0ZXJhdGlvbiB3aWxsIGJlIHJlamVjdGVkIHdpdGggdGhlIHNhbWVcbiAgICAgICAgICAvLyByZWFzb24uIE5vdGUgdGhhdCByZWplY3Rpb25zIG9mIHlpZWxkZWQgUHJvbWlzZXMgYXJlIG5vdFxuICAgICAgICAgIC8vIHRocm93biBiYWNrIGludG8gdGhlIGdlbmVyYXRvciBmdW5jdGlvbiwgYXMgaXMgdGhlIGNhc2VcbiAgICAgICAgICAvLyB3aGVuIGFuIGF3YWl0ZWQgUHJvbWlzZSBpcyByZWplY3RlZC4gVGhpcyBkaWZmZXJlbmNlIGluXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYmV0d2VlbiB5aWVsZCBhbmQgYXdhaXQgaXMgaW1wb3J0YW50LCBiZWNhdXNlIGl0XG4gICAgICAgICAgLy8gYWxsb3dzIHRoZSBjb25zdW1lciB0byBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIHRoZSB5aWVsZGVkXG4gICAgICAgICAgLy8gcmVqZWN0aW9uIChzd2FsbG93IGl0IGFuZCBjb250aW51ZSwgbWFudWFsbHkgLnRocm93IGl0IGJhY2tcbiAgICAgICAgICAvLyBpbnRvIHRoZSBnZW5lcmF0b3IsIGFiYW5kb24gaXRlcmF0aW9uLCB3aGF0ZXZlcikuIFdpdGhcbiAgICAgICAgICAvLyBhd2FpdCwgYnkgY29udHJhc3QsIHRoZXJlIGlzIG5vIG9wcG9ydHVuaXR5IHRvIGV4YW1pbmUgdGhlXG4gICAgICAgICAgLy8gcmVqZWN0aW9uIHJlYXNvbiBvdXRzaWRlIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24sIHNvIHRoZVxuICAgICAgICAgIC8vIG9ubHkgb3B0aW9uIGlzIHRvIHRocm93IGl0IGZyb20gdGhlIGF3YWl0IGV4cHJlc3Npb24sIGFuZFxuICAgICAgICAgIC8vIGxldCB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhbmRsZSB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZDtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9XG4gICAgICAgIC8vIElmIGVucXVldWUgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIHdhaXQgdW50aWxcbiAgICAgICAgLy8gYWxsIHByZXZpb3VzIFByb21pc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyBpbnZva2UsXG4gICAgICAgIC8vIHNvIHRoYXQgcmVzdWx0cyBhcmUgYWx3YXlzIGRlbGl2ZXJlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4gSWZcbiAgICAgICAgLy8gZW5xdWV1ZSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiBpdCBpcyBpbXBvcnRhbnQgdG9cbiAgICAgICAgLy8gY2FsbCBpbnZva2UgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGZpcmUsXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBoYXMgdGhlIG9wcG9ydHVuaXR5IHRvIGRvXG4gICAgICAgIC8vIGFueSBuZWNlc3Nhcnkgc2V0dXAgaW4gYSBwcmVkaWN0YWJsZSB3YXkuIFRoaXMgcHJlZGljdGFiaWxpdHlcbiAgICAgICAgLy8gaXMgd2h5IHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkgaW52b2tlcyBpdHNcbiAgICAgICAgLy8gZXhlY3V0b3IgY2FsbGJhY2ssIGFuZCB3aHkgYXN5bmMgZnVuY3Rpb25zIHN5bmNocm9ub3VzbHlcbiAgICAgICAgLy8gZXhlY3V0ZSBjb2RlIGJlZm9yZSB0aGUgZmlyc3QgYXdhaXQuIFNpbmNlIHdlIGltcGxlbWVudCBzaW1wbGVcbiAgICAgICAgLy8gYXN5bmMgZnVuY3Rpb25zIGluIHRlcm1zIG9mIGFzeW5jIGdlbmVyYXRvcnMsIGl0IGlzIGVzcGVjaWFsbHlcbiAgICAgICAgLy8gaW1wb3J0YW50IHRvIGdldCB0aGlzIHJpZ2h0LCBldmVuIHRob3VnaCBpdCByZXF1aXJlcyBjYXJlLlxuICAgICAgICBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihcbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyxcbiAgICAgICAgICAvLyBBdm9pZCBwcm9wYWdhdGluZyBmYWlsdXJlcyB0byBQcm9taXNlcyByZXR1cm5lZCBieSBsYXRlclxuICAgICAgICAgIC8vIGludm9jYXRpb25zIG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZ1xuICAgICAgICApIDogY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgdGhlIHVuaWZpZWQgaGVscGVyIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gaW1wbGVtZW50IC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gKHNlZSBkZWZpbmVJdGVyYXRvck1ldGhvZHMpLlxuICAgIHRoaXMuX2ludm9rZSA9IGVucXVldWU7XG4gIH1cblxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO1xuICBBc3luY0l0ZXJhdG9yLnByb3RvdHlwZVthc3luY0l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgcnVudGltZS5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvcjtcblxuICAvLyBOb3RlIHRoYXQgc2ltcGxlIGFzeW5jIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mXG4gIC8vIEFzeW5jSXRlcmF0b3Igb2JqZWN0czsgdGhleSBqdXN0IHJldHVybiBhIFByb21pc2UgZm9yIHRoZSB2YWx1ZSBvZlxuICAvLyB0aGUgZmluYWwgcmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBpdGVyYXRvci5cbiAgcnVudGltZS5hc3luYyA9IGZ1bmN0aW9uKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpXG4gICAgKTtcblxuICAgIHJldHVybiBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbilcbiAgICAgID8gaXRlciAvLyBJZiBvdXRlckZuIGlzIGEgZ2VuZXJhdG9yLCByZXR1cm4gdGhlIGZ1bGwgaXRlcmF0b3IuXG4gICAgICA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQ7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlRXhlY3V0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHtcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgdGhyb3cgYXJnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmUgZm9yZ2l2aW5nLCBwZXIgMjUuMy4zLjMuMyBvZiB0aGUgc3BlYzpcbiAgICAgICAgLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWdlbmVyYXRvcnJlc3VtZVxuICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIGNvbnRleHQuYXJnID0gYXJnO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlO1xuICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7XG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgIC8vIFNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAgIHRocm93IGNvbnRleHQuYXJnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgICBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjb250ZXh0LmFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZSA9IEdlblN0YXRlRXhlY3V0aW5nO1xuXG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGlubmVyRm4sIHdlIGxlYXZlIHN0YXRlID09PVxuICAgICAgICAgIC8vIEdlblN0YXRlRXhlY3V0aW5nIGFuZCBsb29wIGJhY2sgZm9yIGFub3RoZXIgaW52b2NhdGlvbi5cbiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZVxuICAgICAgICAgICAgPyBHZW5TdGF0ZUNvbXBsZXRlZFxuICAgICAgICAgICAgOiBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuXG4gICAgICAgICAgaWYgKHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZXhjZXB0aW9uIGJ5IGxvb3BpbmcgYmFjayBhcm91bmQgdG8gdGhlXG4gICAgICAgICAgLy8gY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZykgY2FsbCBhYm92ZS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gQ2FsbCBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF0oY29udGV4dC5hcmcpIGFuZCBoYW5kbGUgdGhlXG4gIC8vIHJlc3VsdCwgZWl0aGVyIGJ5IHJldHVybmluZyBhIHsgdmFsdWUsIGRvbmUgfSByZXN1bHQgZnJvbSB0aGVcbiAgLy8gZGVsZWdhdGUgaXRlcmF0b3IsIG9yIGJ5IG1vZGlmeWluZyBjb250ZXh0Lm1ldGhvZCBhbmQgY29udGV4dC5hcmcsXG4gIC8vIHNldHRpbmcgY29udGV4dC5kZWxlZ2F0ZSB0byBudWxsLCBhbmQgcmV0dXJuaW5nIHRoZSBDb250aW51ZVNlbnRpbmVsLlxuICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXTtcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEEgLnRocm93IG9yIC5yZXR1cm4gd2hlbiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIG5vIC50aHJvd1xuICAgICAgLy8gbWV0aG9kIGFsd2F5cyB0ZXJtaW5hdGVzIHRoZSB5aWVsZCogbG9vcC5cbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICBpZiAoZGVsZWdhdGUuaXRlcmF0b3IucmV0dXJuKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBhIHJldHVybiBtZXRob2QsIGdpdmUgaXQgYVxuICAgICAgICAgIC8vIGNoYW5jZSB0byBjbGVhbiB1cC5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG5cbiAgICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgLy8gSWYgbWF5YmVJbnZva2VEZWxlZ2F0ZShjb250ZXh0KSBjaGFuZ2VkIGNvbnRleHQubWV0aG9kIGZyb21cbiAgICAgICAgICAgIC8vIFwicmV0dXJuXCIgdG8gXCJ0aHJvd1wiLCBsZXQgdGhhdCBvdmVycmlkZSB0aGUgVHlwZUVycm9yIGJlbG93LlxuICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBcIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJ3Rocm93JyBtZXRob2RcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7XG5cbiAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZztcblxuICAgIGlmICghIGluZm8pIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3RcIik7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgIC8vIEFzc2lnbiB0aGUgcmVzdWx0IG9mIHRoZSBmaW5pc2hlZCBkZWxlZ2F0ZSB0byB0aGUgdGVtcG9yYXJ5XG4gICAgICAvLyB2YXJpYWJsZSBzcGVjaWZpZWQgYnkgZGVsZWdhdGUucmVzdWx0TmFtZSAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWU7XG5cbiAgICAgIC8vIFJlc3VtZSBleGVjdXRpb24gYXQgdGhlIGRlc2lyZWQgbG9jYXRpb24gKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7XG5cbiAgICAgIC8vIElmIGNvbnRleHQubWV0aG9kIHdhcyBcInRocm93XCIgYnV0IHRoZSBkZWxlZ2F0ZSBoYW5kbGVkIHRoZVxuICAgICAgLy8gZXhjZXB0aW9uLCBsZXQgdGhlIG91dGVyIGdlbmVyYXRvciBwcm9jZWVkIG5vcm1hbGx5LiBJZlxuICAgICAgLy8gY29udGV4dC5tZXRob2Qgd2FzIFwibmV4dFwiLCBmb3JnZXQgY29udGV4dC5hcmcgc2luY2UgaXQgaGFzIGJlZW5cbiAgICAgIC8vIFwiY29uc3VtZWRcIiBieSB0aGUgZGVsZWdhdGUgaXRlcmF0b3IuIElmIGNvbnRleHQubWV0aG9kIHdhc1xuICAgICAgLy8gXCJyZXR1cm5cIiwgYWxsb3cgdGhlIG9yaWdpbmFsIC5yZXR1cm4gY2FsbCB0byBjb250aW51ZSBpbiB0aGVcbiAgICAgIC8vIG91dGVyIGdlbmVyYXRvci5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCAhPT0gXCJyZXR1cm5cIikge1xuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZS15aWVsZCB0aGUgcmVzdWx0IHJldHVybmVkIGJ5IHRoZSBkZWxlZ2F0ZSBtZXRob2QuXG4gICAgICByZXR1cm4gaW5mbztcbiAgICB9XG5cbiAgICAvLyBUaGUgZGVsZWdhdGUgaXRlcmF0b3IgaXMgZmluaXNoZWQsIHNvIGZvcmdldCBpdCBhbmQgY29udGludWUgd2l0aFxuICAgIC8vIHRoZSBvdXRlciBnZW5lcmF0b3IuXG4gICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gIH1cblxuICAvLyBEZWZpbmUgR2VuZXJhdG9yLnByb3RvdHlwZS57bmV4dCx0aHJvdyxyZXR1cm59IGluIHRlcm1zIG9mIHRoZVxuICAvLyB1bmlmaWVkIC5faW52b2tlIGhlbHBlciBtZXRob2QuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCk7XG5cbiAgR3BbdG9TdHJpbmdUYWdTeW1ib2xdID0gXCJHZW5lcmF0b3JcIjtcblxuICAvLyBBIEdlbmVyYXRvciBzaG91bGQgYWx3YXlzIHJldHVybiBpdHNlbGYgYXMgdGhlIGl0ZXJhdG9yIG9iamVjdCB3aGVuIHRoZVxuICAvLyBAQGl0ZXJhdG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBpdC4gU29tZSBicm93c2VycycgaW1wbGVtZW50YXRpb25zIG9mIHRoZVxuICAvLyBpdGVyYXRvciBwcm90b3R5cGUgY2hhaW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50IHRoaXMsIGNhdXNpbmcgdGhlIEdlbmVyYXRvclxuICAvLyBvYmplY3QgdG8gbm90IGJlIHJldHVybmVkIGZyb20gdGhpcyBjYWxsLiBUaGlzIGVuc3VyZXMgdGhhdCBkb2Vzbid0IGhhcHBlbi5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9pc3N1ZXMvMjc0IGZvciBtb3JlIGRldGFpbHMuXG4gIEdwW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEdwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gIH07XG5cbiAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHtcbiAgICB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9O1xuXG4gICAgaWYgKDEgaW4gbG9jcykge1xuICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdO1xuICAgIH1cblxuICAgIGlmICgyIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdO1xuICAgICAgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdO1xuICAgIH1cblxuICAgIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICByZWNvcmQudHlwZSA9IFwibm9ybWFsXCI7XG4gICAgZGVsZXRlIHJlY29yZC5hcmc7XG4gICAgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBUaGUgcm9vdCBlbnRyeSBvYmplY3QgKGVmZmVjdGl2ZWx5IGEgdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgY2F0Y2hcbiAgICAvLyBvciBhIGZpbmFsbHkgYmxvY2spIGdpdmVzIHVzIGEgcGxhY2UgdG8gc3RvcmUgdmFsdWVzIHRocm93biBmcm9tXG4gICAgLy8gbG9jYXRpb25zIHdoZXJlIHRoZXJlIGlzIG5vIGVuY2xvc2luZyB0cnkgc3RhdGVtZW50LlxuICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogXCJyb290XCIgfV07XG4gICAgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpO1xuICAgIHRoaXMucmVzZXQodHJ1ZSk7XG4gIH1cblxuICBydW50aW1lLmtleXMgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBrZXlzLnJldmVyc2UoKTtcblxuICAgIC8vIFJhdGhlciB0aGFuIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBhIG5leHQgbWV0aG9kLCB3ZSBrZWVwXG4gICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi5cbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICBuZXh0LnZhbHVlID0ga2V5O1xuICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRvIGF2b2lkIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgb2JqZWN0LCB3ZSBqdXN0IGhhbmcgdGhlIC52YWx1ZVxuICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXNcbiAgICAgIC8vIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBtaW5pZmllciB3aWxsIG5vdCBhbm9ueW1pemUgdGhlIGZ1bmN0aW9uLlxuICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07XG4gICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgaXRlcmFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7XG4gICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBhbiBpdGVyYXRvciB3aXRoIG5vIHZhbHVlcy5cbiAgICByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07XG4gIH1cbiAgcnVudGltZS52YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcblxuICAgIHJlc2V0OiBmdW5jdGlvbihza2lwVGVtcFJlc2V0KSB7XG4gICAgICB0aGlzLnByZXYgPSAwO1xuICAgICAgdGhpcy5uZXh0ID0gMDtcbiAgICAgIC8vIFJlc2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcblxuICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7XG5cbiAgICAgIGlmICghc2tpcFRlbXBSZXNldCkge1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcbiAgICAgICAgICAvLyBOb3Qgc3VyZSBhYm91dCB0aGUgb3B0aW1hbCBvcmRlciBvZiB0aGVzZSBjb25kaXRpb25zOlxuICAgICAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gXCJ0XCIgJiZcbiAgICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiZcbiAgICAgICAgICAgICAgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSkge1xuICAgICAgICAgICAgdGhpc1tuYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuXG4gICAgICB2YXIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdO1xuICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjtcbiAgICAgIGlmIChyb290UmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuXG4gICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkge1xuICAgICAgICByZWNvcmQudHlwZSA9IFwidGhyb3dcIjtcbiAgICAgICAgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbjtcbiAgICAgICAgY29udGV4dC5uZXh0ID0gbG9jO1xuXG4gICAgICAgIGlmIChjYXVnaHQpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgIC8vIHRoZW4gbGV0IHRoYXQgY2F0Y2ggYmxvY2sgaGFuZGxlIHRoZSBleGNlcHRpb24gbm9ybWFsbHkuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhISBjYXVnaHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSBcInJvb3RcIikge1xuICAgICAgICAgIC8vIEV4Y2VwdGlvbiB0aHJvd24gb3V0c2lkZSBvZiBhbnkgdHJ5IGJsb2NrIHRoYXQgY291bGQgaGFuZGxlXG4gICAgICAgICAgLy8gaXQsIHNvIHNldCB0aGUgY29tcGxldGlvbiB2YWx1ZSBvZiB0aGUgZW50aXJlIGZ1bmN0aW9uIHRvXG4gICAgICAgICAgLy8gdGhyb3cgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXR1cm4gaGFuZGxlKFwiZW5kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKTtcbiAgICAgICAgICB2YXIgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7XG5cbiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFicnVwdDogZnVuY3Rpb24odHlwZSwgYXJnKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIikgJiZcbiAgICAgICAgICAgIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSAmJlxuICAgICAgICAgICh0eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICAgdHlwZSA9PT0gXCJjb250aW51ZVwiKSAmJlxuICAgICAgICAgIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmXG4gICAgICAgICAgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgIC8vIElnbm9yZSB0aGUgZmluYWxseSBlbnRyeSBpZiBjb250cm9sIGlzIG5vdCBqdW1waW5nIHRvIGFcbiAgICAgICAgLy8gbG9jYXRpb24gb3V0c2lkZSB0aGUgdHJ5L2NhdGNoIGJsb2NrLlxuICAgICAgICBmaW5hbGx5RW50cnkgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgIHJlY29yZC50eXBlID0gdHlwZTtcbiAgICAgIHJlY29yZC5hcmcgPSBhcmc7XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7XG4gICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgIH0sXG5cbiAgICBjb21wbGV0ZTogZnVuY3Rpb24ocmVjb3JkLCBhZnRlckxvYykge1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICByZWNvcmQudHlwZSA9PT0gXCJjb250aW51ZVwiKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IHJlY29yZC5hcmc7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInJldHVyblwiKSB7XG4gICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICB0aGlzLm5leHQgPSBcImVuZFwiO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBhZnRlckxvYykge1xuICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbih0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb25cbiAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24oaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgIC8vIERlbGliZXJhdGVseSBmb3JnZXQgdGhlIGxhc3Qgc2VudCB2YWx1ZSBzbyB0aGF0IHdlIGRvbid0XG4gICAgICAgIC8vIGFjY2lkZW50YWxseSBwYXNzIGl0IG9uIHRvIHRoZSBkZWxlZ2F0ZS5cbiAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cbiAgfTtcbn0pKFxuICAvLyBJbiBzbG9wcHkgbW9kZSwgdW5ib3VuZCBgdGhpc2AgcmVmZXJzIHRvIHRoZSBnbG9iYWwgb2JqZWN0LCBmYWxsYmFjayB0b1xuICAvLyBGdW5jdGlvbiBjb25zdHJ1Y3RvciBpZiB3ZSdyZSBpbiBnbG9iYWwgc3RyaWN0IG1vZGUuIFRoYXQgaXMgc2FkbHkgYSBmb3JtXG4gIC8vIG9mIGluZGlyZWN0IGV2YWwgd2hpY2ggdmlvbGF0ZXMgQ29udGVudCBTZWN1cml0eSBQb2xpY3kuXG4gIChmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMgfSkoKSB8fCBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKClcbik7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBMRUFGX0tFWSwgaGFzV2Vha01hcDtcblxuLyoqXG4gKiBBcmJpdHJhcnkgdmFsdWUgdXNlZCBhcyBrZXkgZm9yIHJlZmVyZW5jaW5nIGNhY2hlIG9iamVjdCBpbiBXZWFrTWFwIHRyZWUuXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqL1xuTEVBRl9LRVkgPSB7fTtcblxuLyoqXG4gKiBXaGV0aGVyIGVudmlyb25tZW50IHN1cHBvcnRzIFdlYWtNYXAuXG4gKlxuICogQHR5cGUge2Jvb2xlYW59XG4gKi9cbmhhc1dlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCAhPT0gJ3VuZGVmaW5lZCc7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgYXMgdGhlIHNvbGUgZW50cnkgaW4gYW4gYXJyYXkuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byByZXR1cm4uXG4gKlxuICogQHJldHVybiB7QXJyYXl9IFZhbHVlIHJldHVybmVkIGFzIGVudHJ5IGluIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheU9mKCB2YWx1ZSApIHtcblx0cmV0dXJuIFsgdmFsdWUgXTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvYmplY3QtbGlrZSwgb3IgZmFsc2Ugb3RoZXJ3aXNlLiBBIHZhbHVlXG4gKiBpcyBvYmplY3QtbGlrZSBpZiBpdCBjYW4gc3VwcG9ydCBwcm9wZXJ0eSBhc3NpZ25tZW50LCBlLmcuIG9iamVjdCBvciBhcnJheS5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YWx1ZSBpcyBvYmplY3QtbGlrZS5cbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKCB2YWx1ZSApIHtcblx0cmV0dXJuICEhIHZhbHVlICYmICdvYmplY3QnID09PSB0eXBlb2YgdmFsdWU7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBjYWNoZSBvYmplY3QuXG4gKlxuICogQHJldHVybiB7T2JqZWN0fSBDYWNoZSBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNhY2hlKCkge1xuXHR2YXIgY2FjaGUgPSB7XG5cdFx0Y2xlYXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y2FjaGUuaGVhZCA9IG51bGw7XG5cdFx0fSxcblx0fTtcblxuXHRyZXR1cm4gY2FjaGU7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGVudHJpZXMgd2l0aGluIHRoZSB0d28gYXJyYXlzIGFyZSBzdHJpY3RseSBlcXVhbCBieVxuICogcmVmZXJlbmNlIGZyb20gYSBzdGFydGluZyBpbmRleC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSAgYSAgICAgICAgIEZpcnN0IGFycmF5LlxuICogQHBhcmFtIHtBcnJheX0gIGIgICAgICAgICBTZWNvbmQgYXJyYXkuXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IEluZGV4IGZyb20gd2hpY2ggdG8gc3RhcnQgY29tcGFyaXNvbi5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIGFycmF5cyBhcmUgc2hhbGxvd2x5IGVxdWFsLlxuICovXG5mdW5jdGlvbiBpc1NoYWxsb3dFcXVhbCggYSwgYiwgZnJvbUluZGV4ICkge1xuXHR2YXIgaTtcblxuXHRpZiAoIGEubGVuZ3RoICE9PSBiLmxlbmd0aCApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRmb3IgKCBpID0gZnJvbUluZGV4OyBpIDwgYS5sZW5ndGg7IGkrKyApIHtcblx0XHRpZiAoIGFbIGkgXSAhPT0gYlsgaSBdICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBtZW1vaXplZCBzZWxlY3RvciBmdW5jdGlvbi4gVGhlIGdldERlcGVuZGFudHMgZnVuY3Rpb24gYXJndW1lbnQgaXNcbiAqIGNhbGxlZCBiZWZvcmUgdGhlIG1lbW9pemVkIHNlbGVjdG9yIGFuZCBpcyBleHBlY3RlZCB0byByZXR1cm4gYW4gaW1tdXRhYmxlXG4gKiByZWZlcmVuY2Ugb3IgYXJyYXkgb2YgcmVmZXJlbmNlcyBvbiB3aGljaCB0aGUgc2VsZWN0b3IgZGVwZW5kcyBmb3IgY29tcHV0aW5nXG4gKiBpdHMgb3duIHJldHVybiB2YWx1ZS4gVGhlIG1lbW9pemUgY2FjaGUgaXMgcHJlc2VydmVkIG9ubHkgYXMgbG9uZyBhcyB0aG9zZVxuICogZGVwZW5kYW50IHJlZmVyZW5jZXMgcmVtYWluIHRoZSBzYW1lLiBJZiBnZXREZXBlbmRhbnRzIHJldHVybnMgYSBkaWZmZXJlbnRcbiAqIHJlZmVyZW5jZShzKSwgdGhlIGNhY2hlIGlzIGNsZWFyZWQgYW5kIHRoZSBzZWxlY3RvciB2YWx1ZSByZWdlbmVyYXRlZC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxlY3RvciAgICAgIFNlbGVjdG9yIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZ2V0RGVwZW5kYW50cyBEZXBlbmRhbnQgZ2V0dGVyIHJldHVybmluZyBhbiBpbW11dGFibGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlIG9yIGFycmF5IG9mIHJlZmVyZW5jZSB1c2VkIGluXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlIGJ1c3QgY29uc2lkZXJhdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gTWVtb2l6ZWQgc2VsZWN0b3IuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCBzZWxlY3RvciwgZ2V0RGVwZW5kYW50cyApIHtcblx0dmFyIHJvb3RDYWNoZSwgZ2V0Q2FjaGU7XG5cblx0Ly8gVXNlIG9iamVjdCBzb3VyY2UgYXMgZGVwZW5kYW50IGlmIGdldHRlciBub3QgcHJvdmlkZWRcblx0aWYgKCAhIGdldERlcGVuZGFudHMgKSB7XG5cdFx0Z2V0RGVwZW5kYW50cyA9IGFycmF5T2Y7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgcm9vdCBjYWNoZS4gSWYgV2Vha01hcCBpcyBzdXBwb3J0ZWQsIHRoaXMgaXMgYXNzaWduZWQgdG8gdGhlXG5cdCAqIHJvb3QgV2Vha01hcCBjYWNoZSBzZXQsIG90aGVyd2lzZSBpdCBpcyBhIHNoYXJlZCBpbnN0YW5jZSBvZiB0aGUgZGVmYXVsdFxuXHQgKiBjYWNoZSBvYmplY3QuXG5cdCAqXG5cdCAqIEByZXR1cm4geyhXZWFrTWFwfE9iamVjdCl9IFJvb3QgY2FjaGUgb2JqZWN0LlxuXHQgKi9cblx0ZnVuY3Rpb24gZ2V0Um9vdENhY2hlKCkge1xuXHRcdHJldHVybiByb290Q2FjaGU7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgY2FjaGUgZm9yIGEgZ2l2ZW4gZGVwZW5kYW50cyBhcnJheS4gV2hlbiBwb3NzaWJsZSwgYSBXZWFrTWFwXG5cdCAqIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSB1bmlxdWUgY2FjaGUgZm9yIGVhY2ggc2V0IG9mIGRlcGVuZGFudHMuIFRoaXNcblx0ICogaXMgZmVhc2libGUgZHVlIHRvIHRoZSBuYXR1cmUgb2YgV2Vha01hcCBpbiBhbGxvd2luZyBnYXJiYWdlIGNvbGxlY3Rpb25cblx0ICogdG8gb2NjdXIgb24gZW50cmllcyB3aGVyZSB0aGUga2V5IG9iamVjdCBpcyBubyBsb25nZXIgcmVmZXJlbmNlZC4gU2luY2Vcblx0ICogV2Vha01hcCByZXF1aXJlcyB0aGUga2V5IHRvIGJlIGFuIG9iamVjdCwgdGhpcyBpcyBvbmx5IHBvc3NpYmxlIHdoZW4gdGhlXG5cdCAqIGRlcGVuZGFudCBpcyBvYmplY3QtbGlrZS4gVGhlIHJvb3QgY2FjaGUgaXMgY3JlYXRlZCBhcyBhIGhpZXJhcmNoeSB3aGVyZVxuXHQgKiBlYWNoIHRvcC1sZXZlbCBrZXkgaXMgdGhlIGZpcnN0IGVudHJ5IGluIGEgZGVwZW5kYW50cyBzZXQsIHRoZSB2YWx1ZSBhXG5cdCAqIFdlYWtNYXAgd2hlcmUgZWFjaCBrZXkgaXMgdGhlIG5leHQgZGVwZW5kYW50LCBhbmQgc28gb24uIFRoaXMgY29udGludWVzXG5cdCAqIHNvIGxvbmcgYXMgdGhlIGRlcGVuZGFudHMgYXJlIG9iamVjdC1saWtlLiBJZiBubyBkZXBlbmRhbnRzIGFyZSBvYmplY3QtXG5cdCAqIGxpa2UsIHRoZW4gdGhlIGNhY2hlIGlzIHNoYXJlZCBhY3Jvc3MgYWxsIGludm9jYXRpb25zLlxuXHQgKlxuXHQgKiBAc2VlIGlzT2JqZWN0TGlrZVxuXHQgKlxuXHQgKiBAcGFyYW0ge0FycmF5fSBkZXBlbmRhbnRzIFNlbGVjdG9yIGRlcGVuZGFudHMuXG5cdCAqXG5cdCAqIEByZXR1cm4ge09iamVjdH0gQ2FjaGUgb2JqZWN0LlxuXHQgKi9cblx0ZnVuY3Rpb24gZ2V0V2Vha01hcENhY2hlKCBkZXBlbmRhbnRzICkge1xuXHRcdHZhciBjYWNoZXMgPSByb290Q2FjaGUsXG5cdFx0XHRpc1VuaXF1ZUJ5RGVwZW5kYW50cyA9IHRydWUsXG5cdFx0XHRpLCBkZXBlbmRhbnQsIG1hcCwgY2FjaGU7XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IGRlcGVuZGFudHMubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRkZXBlbmRhbnQgPSBkZXBlbmRhbnRzWyBpIF07XG5cblx0XHRcdC8vIENhbiBvbmx5IGNvbXBvc2UgV2Vha01hcCBmcm9tIG9iamVjdC1saWtlIGtleS5cblx0XHRcdGlmICggISBpc09iamVjdExpa2UoIGRlcGVuZGFudCApICkge1xuXHRcdFx0XHRpc1VuaXF1ZUJ5RGVwZW5kYW50cyA9IGZhbHNlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0Ly8gRG9lcyBjdXJyZW50IHNlZ21lbnQgb2YgY2FjaGUgYWxyZWFkeSBoYXZlIGEgV2Vha01hcD9cblx0XHRcdGlmICggY2FjaGVzLmhhcyggZGVwZW5kYW50ICkgKSB7XG5cdFx0XHRcdC8vIFRyYXZlcnNlIGludG8gbmVzdGVkIFdlYWtNYXAuXG5cdFx0XHRcdGNhY2hlcyA9IGNhY2hlcy5nZXQoIGRlcGVuZGFudCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gQ3JlYXRlLCBzZXQsIGFuZCB0cmF2ZXJzZSBpbnRvIGEgbmV3IG9uZS5cblx0XHRcdFx0bWFwID0gbmV3IFdlYWtNYXAoKTtcblx0XHRcdFx0Y2FjaGVzLnNldCggZGVwZW5kYW50LCBtYXAgKTtcblx0XHRcdFx0Y2FjaGVzID0gbWFwO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFdlIHVzZSBhbiBhcmJpdHJhcnkgKGJ1dCBjb25zaXN0ZW50KSBvYmplY3QgYXMga2V5IGZvciB0aGUgbGFzdCBpdGVtXG5cdFx0Ly8gaW4gdGhlIFdlYWtNYXAgdG8gc2VydmUgYXMgb3VyIHJ1bm5pbmcgY2FjaGUuXG5cdFx0aWYgKCAhIGNhY2hlcy5oYXMoIExFQUZfS0VZICkgKSB7XG5cdFx0XHRjYWNoZSA9IGNyZWF0ZUNhY2hlKCk7XG5cdFx0XHRjYWNoZS5pc1VuaXF1ZUJ5RGVwZW5kYW50cyA9IGlzVW5pcXVlQnlEZXBlbmRhbnRzO1xuXHRcdFx0Y2FjaGVzLnNldCggTEVBRl9LRVksIGNhY2hlICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNhY2hlcy5nZXQoIExFQUZfS0VZICk7XG5cdH1cblxuXHQvLyBBc3NpZ24gY2FjaGUgaGFuZGxlciBieSBhdmFpbGFiaWxpdHkgb2YgV2Vha01hcFxuXHRnZXRDYWNoZSA9IGhhc1dlYWtNYXAgPyBnZXRXZWFrTWFwQ2FjaGUgOiBnZXRSb290Q2FjaGU7XG5cblx0LyoqXG5cdCAqIFJlc2V0cyByb290IG1lbW9pemF0aW9uIGNhY2hlLlxuXHQgKi9cblx0ZnVuY3Rpb24gY2xlYXIoKSB7XG5cdFx0cm9vdENhY2hlID0gaGFzV2Vha01hcCA/IG5ldyBXZWFrTWFwKCkgOiBjcmVhdGVDYWNoZSgpO1xuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL2NoZWNrLXBhcmFtLW5hbWVzXG5cdC8qKlxuXHQgKiBUaGUgYXVnbWVudGVkIHNlbGVjdG9yIGNhbGwsIGNvbnNpZGVyaW5nIGZpcnN0IHdoZXRoZXIgZGVwZW5kYW50cyBoYXZlXG5cdCAqIGNoYW5nZWQgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdW5kZXJseWluZyBtZW1vaXplIGZ1bmN0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gc291cmNlICAgIFNvdXJjZSBvYmplY3QgZm9yIGRlcml2YXRpb24uXG5cdCAqIEBwYXJhbSB7Li4uKn0gICBleHRyYUFyZ3MgQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byBzZWxlY3Rvci5cblx0ICpcblx0ICogQHJldHVybiB7Kn0gU2VsZWN0b3IgcmVzdWx0LlxuXHQgKi9cblx0ZnVuY3Rpb24gY2FsbFNlbGVjdG9yKCAvKiBzb3VyY2UsIC4uLmV4dHJhQXJncyAqLyApIHtcblx0XHR2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCxcblx0XHRcdGNhY2hlLCBub2RlLCBpLCBhcmdzLCBkZXBlbmRhbnRzO1xuXG5cdFx0Ly8gQ3JlYXRlIGNvcHkgb2YgYXJndW1lbnRzIChhdm9pZCBsZWFraW5nIGRlb3B0aW1pemF0aW9uKS5cblx0XHRhcmdzID0gbmV3IEFycmF5KCBsZW4gKTtcblx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0YXJnc1sgaSBdID0gYXJndW1lbnRzWyBpIF07XG5cdFx0fVxuXG5cdFx0ZGVwZW5kYW50cyA9IGdldERlcGVuZGFudHMuYXBwbHkoIG51bGwsIGFyZ3MgKTtcblx0XHRjYWNoZSA9IGdldENhY2hlKCBkZXBlbmRhbnRzICk7XG5cblx0XHQvLyBJZiBub3QgZ3VhcmFudGVlZCB1bmlxdWVuZXNzIGJ5IGRlcGVuZGFudHMgKHByaW1pdGl2ZSB0eXBlIG9yIGxhY2tcblx0XHQvLyBvZiBXZWFrTWFwIHN1cHBvcnQpLCBzaGFsbG93IGNvbXBhcmUgYWdhaW5zdCBsYXN0IGRlcGVuZGFudHMgYW5kLCBpZlxuXHRcdC8vIHJlZmVyZW5jZXMgaGF2ZSBjaGFuZ2VkLCBkZXN0cm95IGNhY2hlIHRvIHJlY2FsY3VsYXRlIHJlc3VsdC5cblx0XHRpZiAoICEgY2FjaGUuaXNVbmlxdWVCeURlcGVuZGFudHMgKSB7XG5cdFx0XHRpZiAoIGNhY2hlLmxhc3REZXBlbmRhbnRzICYmICEgaXNTaGFsbG93RXF1YWwoIGRlcGVuZGFudHMsIGNhY2hlLmxhc3REZXBlbmRhbnRzLCAwICkgKSB7XG5cdFx0XHRcdGNhY2hlLmNsZWFyKCk7XG5cdFx0XHR9XG5cblx0XHRcdGNhY2hlLmxhc3REZXBlbmRhbnRzID0gZGVwZW5kYW50cztcblx0XHR9XG5cblx0XHRub2RlID0gY2FjaGUuaGVhZDtcblx0XHR3aGlsZSAoIG5vZGUgKSB7XG5cdFx0XHQvLyBDaGVjayB3aGV0aGVyIG5vZGUgYXJndW1lbnRzIG1hdGNoIGFyZ3VtZW50c1xuXHRcdFx0aWYgKCAhIGlzU2hhbGxvd0VxdWFsKCBub2RlLmFyZ3MsIGFyZ3MsIDEgKSApIHtcblx0XHRcdFx0bm9kZSA9IG5vZGUubmV4dDtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGFzc3VtZSB3ZSd2ZSBmb3VuZCBhIG1hdGNoXG5cblx0XHRcdC8vIFN1cmZhY2UgbWF0Y2hlZCBub2RlIHRvIGhlYWQgaWYgbm90IGFscmVhZHlcblx0XHRcdGlmICggbm9kZSAhPT0gY2FjaGUuaGVhZCApIHtcblx0XHRcdFx0Ly8gQWRqdXN0IHNpYmxpbmdzIHRvIHBvaW50IHRvIGVhY2ggb3RoZXIuXG5cdFx0XHRcdG5vZGUucHJldi5uZXh0ID0gbm9kZS5uZXh0O1xuXHRcdFx0XHRpZiAoIG5vZGUubmV4dCApIHtcblx0XHRcdFx0XHRub2RlLm5leHQucHJldiA9IG5vZGUucHJldjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdG5vZGUubmV4dCA9IGNhY2hlLmhlYWQ7XG5cdFx0XHRcdG5vZGUucHJldiA9IG51bGw7XG5cdFx0XHRcdGNhY2hlLmhlYWQucHJldiA9IG5vZGU7XG5cdFx0XHRcdGNhY2hlLmhlYWQgPSBub2RlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXR1cm4gaW1tZWRpYXRlbHlcblx0XHRcdHJldHVybiBub2RlLnZhbDtcblx0XHR9XG5cblx0XHQvLyBObyBjYWNoZWQgdmFsdWUgZm91bmQuIENvbnRpbnVlIHRvIGluc2VydGlvbiBwaGFzZTpcblxuXHRcdG5vZGUgPSB7XG5cdFx0XHQvLyBHZW5lcmF0ZSB0aGUgcmVzdWx0IGZyb20gb3JpZ2luYWwgZnVuY3Rpb25cblx0XHRcdHZhbDogc2VsZWN0b3IuYXBwbHkoIG51bGwsIGFyZ3MgKSxcblx0XHR9O1xuXG5cdFx0Ly8gQXZvaWQgaW5jbHVkaW5nIHRoZSBzb3VyY2Ugb2JqZWN0IGluIHRoZSBjYWNoZS5cblx0XHRhcmdzWyAwIF0gPSBudWxsO1xuXHRcdG5vZGUuYXJncyA9IGFyZ3M7XG5cblx0XHQvLyBEb24ndCBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgbm9kZSBpcyBhbHJlYWR5IGhlYWQsIHNpbmNlIGl0IHdvdWxkXG5cdFx0Ly8gaGF2ZSBiZWVuIHJldHVybmVkIGFib3ZlIGFscmVhZHkgaWYgaXQgd2FzXG5cblx0XHQvLyBTaGlmdCBleGlzdGluZyBoZWFkIGRvd24gbGlzdFxuXHRcdGlmICggY2FjaGUuaGVhZCApIHtcblx0XHRcdGNhY2hlLmhlYWQucHJldiA9IG5vZGU7XG5cdFx0XHRub2RlLm5leHQgPSBjYWNoZS5oZWFkO1xuXHRcdH1cblxuXHRcdGNhY2hlLmhlYWQgPSBub2RlO1xuXG5cdFx0cmV0dXJuIG5vZGUudmFsO1xuXHR9XG5cblx0Y2FsbFNlbGVjdG9yLmdldERlcGVuZGFudHMgPSBnZXREZXBlbmRhbnRzO1xuXHRjYWxsU2VsZWN0b3IuY2xlYXIgPSBjbGVhcjtcblx0Y2xlYXIoKTtcblxuXHRyZXR1cm4gY2FsbFNlbGVjdG9yO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogU2ltaWxhciB0byBpbnZhcmlhbnQgYnV0IG9ubHkgbG9ncyBhIHdhcm5pbmcgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0LlxuICogVGhpcyBjYW4gYmUgdXNlZCB0byBsb2cgaXNzdWVzIGluIGRldmVsb3BtZW50IGVudmlyb25tZW50cyBpbiBjcml0aWNhbFxuICogcGF0aHMuIFJlbW92aW5nIHRoZSBsb2dnaW5nIGNvZGUgZm9yIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIHdpbGwga2VlcCB0aGVcbiAqIHNhbWUgbG9naWMgYW5kIGZvbGxvdyB0aGUgc2FtZSBjb2RlIHBhdGhzLlxuICovXG5cbnZhciBfX0RFVl9fID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJztcblxudmFyIHdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAoX19ERVZfXykge1xuICB2YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGZvcm1hdCwgYXJncykge1xuICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuID4gMiA/IGxlbiAtIDIgOiAwKTtcbiAgICBmb3IgKHZhciBrZXkgPSAyOyBrZXkgPCBsZW47IGtleSsrKSB7XG4gICAgICBhcmdzW2tleSAtIDJdID0gYXJndW1lbnRzW2tleV07XG4gICAgfVxuICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArXG4gICAgICBmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBhcmdzW2FyZ0luZGV4KytdO1xuICAgICAgfSk7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIC0tLSBXZWxjb21lIHRvIGRlYnVnZ2luZyBSZWFjdCAtLS1cbiAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJuaW5nIHRvIGZpcmUuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoeCkge31cbiAgfVxuXG4gIHdhcm5pbmcgPSBmdW5jdGlvbihjb25kaXRpb24sIGZvcm1hdCwgYXJncykge1xuICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuID4gMiA/IGxlbiAtIDIgOiAwKTtcbiAgICBmb3IgKHZhciBrZXkgPSAyOyBrZXkgPCBsZW47IGtleSsrKSB7XG4gICAgICBhcmdzW2tleSAtIDJdID0gYXJndW1lbnRzW2tleV07XG4gICAgfVxuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdgd2FybmluZyhjb25kaXRpb24sIGZvcm1hdCwgLi4uYXJncylgIHJlcXVpcmVzIGEgd2FybmluZyAnICtcbiAgICAgICAgICAnbWVzc2FnZSBhcmd1bWVudCdcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICBwcmludFdhcm5pbmcuYXBwbHkobnVsbCwgW2Zvcm1hdF0uY29uY2F0KGFyZ3MpKTtcbiAgICB9XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gd2FybmluZztcbiIsIm1vZHVsZS5leHBvcnRzID0gZWVqczsiLCJtb2R1bGUuZXhwb3J0cyA9IGVlanMuaGVscGVyczsiLCJtb2R1bGUuZXhwb3J0cyA9IGVlanMuaTE4bjsiLCJtb2R1bGUuZXhwb3J0cyA9IGVlanMubW9kZWw7IiwibW9kdWxlLmV4cG9ydHMgPSBlZWpzLnZhbGlkYXRvcnM7IiwibW9kdWxlLmV4cG9ydHMgPSBlZWpzLnZhbHVlT2JqZWN0czsiLCJtb2R1bGUuZXhwb3J0cyA9IHdwLmFwaUZldGNoOyIsIm1vZHVsZS5leHBvcnRzID0gd3AuZGF0YTsiLCJtb2R1bGUuZXhwb3J0cyA9IHdwLmhvb2tzOyIsIm1vZHVsZS5leHBvcnRzID0gZWVqcy52ZW5kb3IuY3VpZDsiLCJtb2R1bGUuZXhwb3J0cyA9IGxvZGFzaDsiLCJtb2R1bGUuZXhwb3J0cyA9IGVlanMudmVuZG9yLm1vbWVudDsiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9iYXNlLWNvbnRyb2xzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2Jhc2UtbW9kZWwuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vYmFzZS1zZWxlY3RvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9hY3Rpb25zL2FjdGlvbi1jcmVhdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL2FjdGlvbnMvYWN0aW9uLWdlbmVyYXRvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9hY3Rpb25zL2FjdGlvbi10eXBlcy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL2FjdGlvbnMvY3JlYXRlLWVudGl0aWVzLWdlbmVyYXRvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9hY3Rpb25zL2NyZWF0ZS1yZWxhdGlvbnMtZ2VuZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL2FjdGlvbnMvZGVsZXRlLWVudGl0eS1nZW5lcmF0b3JzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvYWN0aW9ucy9kZWxldGUtcmVsYXRpb25zLWdlbmVyYXRvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9hY3Rpb25zL2luZGV4LmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvYWN0aW9ucy9wZXJzaXN0LWVudGl0eS1nZW5lcmF0b3JzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvYWN0aW9ucy9wZXJzaXN0LXJlbGF0aW9ucy1nZW5lcmF0b3JzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvYWN0aW9ucy9yZWNlaXZlLWVudGl0aWVzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvYWN0aW9ucy9yZWNlaXZlLXJlbGF0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL2FjdGlvbnMvcmVtb3ZlLWVudGl0aWVzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvYWN0aW9ucy9yZW1vdmUtcmVsYXRpb25zLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvY29uc3RhbnRzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9tb2RlbC9jaGVja2luL2FjdGlvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9tb2RlbC9jaGVja2luL3Jlc29sdmVycy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL21vZGVsL2NoZWNraW4vc2VsZWN0b3JzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvbW9kZWwvZW50aXR5LWFjdGlvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9tb2RlbC9lbnRpdHktcmVzb2x2ZXJzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvbW9kZWwvZW50aXR5LXNlbGVjdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL21vZGVsL2luZGV4LmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvbW9kZWwvbW9kZWwtYWN0aW9ucy1pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL21vZGVsL21vZGVsLXJlc29sdmVycy1pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL21vZGVsL21vZGVsLXNlbGVjdG9ycy1pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL21vZGVsL21vZGVsLXNwZWNpZmljLWFjdGlvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9tb2RlbC9tb2RlbC1zcGVjaWZpYy1zZWxlY3RvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9tb2RlbC9yZWxhdGlvbi1hY3Rpb25zLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvbW9kZWwvcmVsYXRpb24tc2VsZWN0b3JzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvcmVkdWNlcnMvZGlydHktZW50aXRpZXMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9yZWR1Y2Vycy9kaXJ0eS1yZWxhdGlvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9yZWR1Y2Vycy9kaXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL3JlZHVjZXJzL2VudGl0aWVzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2NvcmUvcmVkdWNlcnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9yZWR1Y2Vycy9tb2RlbC1zcGVjaWZpYy1yZWR1Y2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL3JlZHVjZXJzL3JlbGF0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL3Jlc29sdmVycy9lbnRpdGllcy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL3Jlc29sdmVycy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9jb3JlL3Jlc29sdmVycy9yZWxhdGlvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9zZWxlY3RvcnMvZW50aXRpZXMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9zZWxlY3RvcnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vY29yZS9zZWxlY3RvcnMvcmVsYXRpb25zLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2xpc3RzL2FjdGlvbi10eXBlcy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9saXN0cy9hY3Rpb25zLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL2xpc3RzL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9saXN0cy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9saXN0cy9tb2RlbC5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9saXN0cy9yZWR1Y2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9saXN0cy9yZXNvbHZlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vbGlzdHMvc2VsZWN0b3JzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL3NjaGVtYS9hY3Rpb24tdHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vc2NoZW1hL2FjdGlvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vc2NoZW1hL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9zY2hlbWEvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2V2ZW50ZXNwcmVzc28vc2NoZW1hL21vZGVsLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL3NjaGVtYS9yZWR1Y2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvZXZlbnRlc3ByZXNzby9zY2hlbWEvcmVzb2x2ZXJzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9ldmVudGVzcHJlc3NvL3NjaGVtYS9zZWxlY3RvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL2luZGV4LmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9tb2RlbC9hc3NlcnRpb25zLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9tb2RlbC9hdHRlbmRlZS9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL2F0dGVuZGVlL2luZGV4LmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9tb2RlbC9hdHRlbmRlZS9xdWVyeS5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvYmFzZS1kYXRlLWZvcm1hdHRlci5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvYmFzZS5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvY2hlY2tpbi9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL2NoZWNraW4vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL2NoZWNraW4vcXVlcnkuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL2RhdGV0aW1lL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvZGF0ZXRpbWUvZm9ybWF0dGVyLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9tb2RlbC9kYXRldGltZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvZGF0ZXRpbWUvcXVlcnkuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL2RlZmF1bHQtbW9kZWwtc3RhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL2VuZHBvaW50cy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvZW50aXR5LWZhY3RvcnkvYXNzZXJ0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvZW50aXR5LWZhY3RvcnkvYmFzZS1lbnRpdHkuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL2VudGl0eS1mYWN0b3J5L2Jvb2xlYW5zLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9tb2RlbC9lbnRpdHktZmFjdG9yeS9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL2VudGl0eS1mYWN0b3J5L2NyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvZW50aXR5LWZhY3RvcnkvZXh0cmFjdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvZW50aXR5LWZhY3RvcnkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL2VudGl0eS1mYWN0b3J5L3ZhbGlkYXRvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL2V2ZW50L2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvZXZlbnQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL2V2ZW50L3F1ZXJ5LmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9tb2RlbC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvbW9kZWwtbmFtZXMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL21vZGVscy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvcHJpbWFyeS1rZXlzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9tb2RlbC9yZWdpc3RyYXRpb24vY29uc3RhbnRzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9tb2RlbC9yZWdpc3RyYXRpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL3JlZ2lzdHJhdGlvbi9xdWVyeS5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvc3RhdHVzL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvc3RhdHVzL2hlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL3N0YXR1cy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2RhdGEvbW9kZWwvc3RhdHVzL3F1ZXJ5LmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9tb2RlbC90aWNrZXQvY29uc3RhbnRzLmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvZGF0YS9tb2RlbC90aWNrZXQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9kYXRhL21vZGVsL3RpY2tldC9xdWVyeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9jb3JlLWpzL2FycmF5L2Zyb20uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvY29yZS1qcy9hcnJheS9pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9jb3JlLWpzL2dldC1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9jb3JlLWpzL2lzLWl0ZXJhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMyL2NvcmUtanMvanNvbi9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvY29yZS1qcy9tYXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvY29yZS1qcy9vYmplY3QvY3JlYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMyL2NvcmUtanMvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9jb3JlLWpzL29iamVjdC9nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvY29yZS1qcy9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMyL2NvcmUtanMvb2JqZWN0L2dldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvY29yZS1qcy9vYmplY3Qva2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9jb3JlLWpzL29iamVjdC9zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMyL2NvcmUtanMvcGFyc2UtaW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMyL2NvcmUtanMvcHJvbWlzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9jb3JlLWpzL3NldC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9jb3JlLWpzL3N5bWJvbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9jb3JlLWpzL3N5bWJvbC9pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9oZWxwZXJzL2FycmF5V2l0aEhvbGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMyL2hlbHBlcnMvYXJyYXlXaXRob3V0SG9sZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvaGVscGVycy9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMyL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvaGVscGVycy9jcmVhdGVDbGFzcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMyL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvaGVscGVycy9pbmhlcml0cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9oZWxwZXJzL2l0ZXJhYmxlVG9BcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9oZWxwZXJzL2l0ZXJhYmxlVG9BcnJheUxpbWl0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMyL2hlbHBlcnMvbm9uSXRlcmFibGVSZXN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMyL2hlbHBlcnMvbm9uSXRlcmFibGVTcHJlYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvaGVscGVycy9vYmplY3RTcHJlYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMyL2hlbHBlcnMvc2V0UHJvdG90eXBlT2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvaGVscGVycy9zbGljZWRUb0FycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMyL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvaGVscGVycy90eXBlb2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS1tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczIvbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMi9yZWdlbmVyYXRvci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHdvcmRwcmVzcy9pcy1zaGFsbG93LWVxdWFsL2FycmF5cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHdvcmRwcmVzcy9pcy1zaGFsbG93LWVxdWFsL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ad29yZHByZXNzL2lzLXNoYWxsb3ctZXF1YWwvb2JqZWN0cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL2FycmF5L2Zyb20uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9hcnJheS9pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL2dldC1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL2lzLWl0ZXJhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vanNvbi9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9tYXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvY3JlYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2dldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3Qva2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vcGFyc2UtaW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vcHJvbWlzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL3NldC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbC9pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2EtZnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hZGQtdG8tdW5zY29wYWJsZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hbi1pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FuLW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FycmF5LWZyb20taXRlcmFibGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FycmF5LW1ldGhvZHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYXJyYXktc3BlY2llcy1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jbGFzc29mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29sbGVjdGlvbi1zdHJvbmcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb2xsZWN0aW9uLXRvLWpzb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb2xsZWN0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29yZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NyZWF0ZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2N0eC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2RlZmluZWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZW51bS1rZXlzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZXhwb3J0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZmFpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19mb3Itb2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oYXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oaWRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faHRtbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2llOC1kb20tZGVmaW5lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faW52b2tlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2lzLWFycmF5LWl0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2lzLW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItY2FsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWRldGVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItc3RlcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2xpYnJhcnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19tZXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbWljcm90YXNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHBzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcGQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ29wbi1leHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ29wbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdwby5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1rZXlzLWludGVybmFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtcGllLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LXNhcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3BhcnNlLWludC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3BlcmZvcm0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19wcm9taXNlLXJlc29sdmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcmVkZWZpbmUtYWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcmVkZWZpbmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtY29sbGVjdGlvbi1mcm9tLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LWNvbGxlY3Rpb24tb2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtcHJvdG8uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtc3BlY2llcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NldC10by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2hhcmVkLWtleS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NoYXJlZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NwZWNpZXMtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zdHJpbmctYXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zdHJpbmctdHJpbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3N0cmluZy13cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3Rhc2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1hYnNvbHV0ZS1pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1pb2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tb2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdWlkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdXNlci1hZ2VudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3ZhbGlkYXRlLWNvbGxlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MtZGVmaW5lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fd2tzLWV4dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3drcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvY29yZS5pcy1pdGVyYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LmFycmF5LmZyb20uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5hcnJheS5pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYubWFwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmNyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3Qua2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYucGFyc2UtaW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYucHJvbWlzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnNldC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnN5bWJvbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3Lm1hcC5mcm9tLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcubWFwLm9mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcubWFwLnRvLWpzb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5wcm9taXNlLmZpbmFsbHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5wcm9taXNlLnRyeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3LnNldC5mcm9tLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcuc2V0Lm9mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcuc2V0LnRvLWpzb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5zeW1ib2wuYXN5bmMtaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5zeW1ib2wub2JzZXJ2YWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FkZC10by11bnNjb3BhYmxlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hbi1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NvcmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY3R4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RlZmluZWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZG9tLWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2V4cG9ydC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mYWlscy1pcy1yZWdleHAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZmFpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZml4LXJlLXdrcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faGFzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2hpZGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faHRtbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pb2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1yZWdleHAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1zdGVwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19saWJyYXJ5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWRwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdwby5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3JlZGVmaW5lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC10by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NoYXJlZC1rZXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1jb250ZXh0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWFic29sdXRlLWluZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8taW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1sZW5ndGguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tb2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL191aWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fd2tzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5yZXBsYWNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5zcGxpdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuYXJyYXkuaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pbW11dGFibGUvZGlzdC9pbW11dGFibGUuZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL21lbWl6ZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGx1cmFsaXplL3BsdXJhbGl6ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9jaGVja1Byb3BUeXBlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVtZW1vL2VzL3JlbWVtby5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvd2FybmluZy93YXJuaW5nLmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcImVlanNcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJlZWpzLmhlbHBlcnNcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJlZWpzLmkxOG5cIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJlZWpzLm1vZGVsXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiZWVqcy52YWxpZGF0b3JzXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiZWVqcy52YWx1ZU9iamVjdHNcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJ3cC5hcGlGZXRjaFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcIndwLmRhdGFcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJ3cC5ob29rc1wiIiwid2VicGFjazovLy9leHRlcm5hbCBcImVlanMudmVuZG9yLmN1aWRcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJsb2Rhc2hcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJlZWpzLnZlbmRvci5tb21lbnRcIiJdLCJuYW1lcyI6WyJmZXRjaCIsInJlcXVlc3QiLCJ0eXBlIiwic2VsZWN0IiwicmVkdWNlcktleSIsInNlbGVjdG9yTmFtZSIsImFyZ3MiLCJyZXNvbHZlU2VsZWN0IiwiZGlzcGF0Y2giLCJkaXNwYXRjaE5hbWUiLCJyZXNvbHZlRGlzcGF0Y2giLCJyZXNvbHZlR2V0RW50aXR5QnlJZEZvcklkcyIsIm1vZGVsTmFtZSIsImVudGl0eUlkcyIsInJlc29sdmVHZXRSZWxhdGVkRW50aXRpZXMiLCJlbnRpdHkiLCJyZWxhdGlvbkVudGl0aWVzIiwicmVsYXRpb25JZHMiLCJjb250cm9scyIsIkZFVENIX0ZST01fQVBJIiwiYXBpRmV0Y2giLCJTRUxFQ1QiLCJzZWxlY3REYXRhIiwiRElTUEFUQ0giLCJkaXNwYXRjaERhdGEiLCJSRVNPTFZFX0RJU1BBVENIIiwiUkVTT0xWRV9TRUxFQ1QiLCJyZXNvbHZlIiwiaGFzRmluaXNoZWQiLCJoYXNGaW5pc2hlZFJlc29sdXRpb24iLCJnZXRSZXN1bHQiLCJhcHBseSIsInJlc3VsdCIsInVuc3Vic2NyaWJlIiwic3Vic2NyaWJlIiwiUkVTT0xWRV9HRVRfRU5USVRZX0JZX0lEX0ZPUl9JRFMiLCJsZW5ndGgiLCJDT1JFX1JFRFVDRVJfS0VZIiwicG9wIiwiUkVTT0xWRV9HRVRfUkVMQVRFRF9FTlRJVElFUyIsInJlbGF0aW9uRW50aXR5IiwiZ2V0IiwicGx1cmFsTW9kZWxOYW1lIiwiZ2V0TWV0aG9kTmFtZSIsInN1ZmZpeCIsInByZWZpeCIsInVzZVBsdXJhbCIsInBsdXJhbGl6ZSIsInVwcGVyRmlyc3QiLCJjYW1lbENhc2UiLCJrZWVwRXhpc3RpbmdFbnRpdGllc0luT2JqZWN0IiwiZXhpc3RpbmdFbnRpdGllcyIsImluY29taW5nRW50aXRpZXMiLCJnZXRFeGlzdGluZ09yRGVmYXVsdEVudGl0eSIsImRlZmF1bHRFbnRpdHkiLCJlbnRpdHlJZCIsImlzTWFwIiwiaGFzIiwicmVkdWNlQ2FsbGJhY2siLCJtYXBwZWQiLCJub3JtYWxpemVFbnRpdHlJZCIsInNldCIsIm1hcFJlZHVjZXIiLCJyZWR1Y2UiLCJvcmlnaW5hbElkIiwiaXNOYU4iLCJpc1Jlc29sdmluZyIsImhhc0ZpbmlzaGVkUmVzb2x2aW5nIiwiZW50aXRpZXMiLCJSRUNFSVZFX0VOVElUWV9SRUNPUkRTIiwiUkVDRUlWRV9BTkRfUkVQTEFDRV9FTlRJVFlfUkVDT1JEUyIsIlJFQ0VJVkVfRU5USVRZIiwiUkVNT1ZFX0VOVElUWV9CWV9JRCIsIlJFTU9WRV9ERUxFVEVfRU5USVRZX0lEIiwiUkVNT1ZFX1RSQVNIX0VOVElUWV9JRCIsIlJFQ0VJVkVfVFJBU0hfRU5USVRZX0lEIiwiUkVDRUlWRV9ERUxFVEVfRU5USVRZX0lEIiwicmVsYXRpb25zIiwiUkVNT1ZFX0RJUlRZX1JFTEFUSU9OX0FERElUSU9OIiwiUkVNT1ZFX0RJUlRZX1JFTEFUSU9OX0RFTEVUSU9OIiwiUkVDRUlWRV9SRUxBVEVEX0VOVElUWV9JRFMiLCJSRU1PVkVfUkVMQVRFRF9FTlRJVFlfSURTIiwiUkVNT1ZFX1JFTEFURURfRU5USVRJRVNfRk9SX0VOVElUWSIsIlJFQ0VJVkVfRElSVFlfUkVMQVRJT05fQURESVRJT04iLCJSRUNFSVZFX0RJUlRZX1JFTEFUSU9OX0RFTEVUSU9OIiwiUkVDRUlWRV9VUERBVEVEX0VOVElUWV9JRF9GT1JfUkVMQVRJT05TIiwicmVzZXRzIiwiUkVTRVRfQUxMX1NUQVRFIiwiUkVTRVRfU1RBVEVfRk9SX01PREVMIiwiUkVTRVRfQUxMX01PREVMX1NQRUNJRklDIiwiUkVTRVRfTU9ERUxfU1BFQ0lGSUNfRk9SX1NFTEVDVE9SIiwibW9kZWxTcGVjaWZpYyIsIlJFQ0VJVkVfU0VMRUNUT1JfVkFMVUUiLCJBQ1RJT05fVFlQRVMiLCJjcmVhdGVFbnRpdHkiLCJyZWNlaXZlRW50aXR5QW5kUmVzb2x2ZSIsInJlY2VpdmVFbnRpdGllc0FuZFJlc29sdmUiLCJTQ0hFTUFfUkVEVUNFUl9LRVkiLCJmYWN0b3J5IiwiaXNNb2RlbEVudGl0eUZhY3RvcnlPZk1vZGVsIiwiZW50aXR5SW5zdGFuY2UiLCJjcmVhdGVOZXciLCJhc3NlcnRJc01vZGVsRW50aXR5IiwidG9Mb3dlckNhc2UiLCJpZCIsIm1hcCIsImlzTW9kZWxFbnRpdHkiLCJJbnZhbGlkTW9kZWxFbnRpdHkiLCJjcmVhdGVSZWxhdGlvbiIsImNyZWF0ZVJlbGF0aW9ucyIsInJlc29sdmVSZWxhdGlvblJlY29yZEZvclJlbGF0aW9uIiwicmVsYXRpb25OYW1lIiwic2luZ3VsYXJSZWxhdGlvbk5hbWUiLCJzaW5ndWxhck1vZGVsTmFtZSIsImlzTW9kZWxFbnRpdHlPZk1vZGVsIiwid2FybmluZyIsIlJFRFVDRVJfS0VZIiwicGx1cmFsUmVsYXRpb25OYW1lIiwiYXNzZXJ0QXJyYXlIYXNFbnRpdGllc0Zvck1vZGVsIiwiZ2V0SWRzRnJvbUJhc2VFbnRpdHlBcnJheSIsIm1vZGVsRW50aXR5IiwicmVsYXRpb25zVG9SZXNvbHZlIiwibW9kZWxJZCIsImhhc0VudGl0eSIsInJlbGF0aW9uTW9kZWxOYW1lIiwiZGVsZXRlRW50aXR5QnlJZCIsInRyYXNoRW50aXR5QnlJZCIsInJlbW92ZUVudGl0eUJ5SWQiLCJyZW1vdmVBbGxSZWxhdGVkRW50aXRpZXNGb3JNb2RlbEVudGl0eSIsInJlY2VpdmVEZWxldGVFbnRpdHlJZCIsInJlY2VpdmVUcmFzaEVudGl0eUlkIiwicmVtb3ZlRGlydHlSZWxhdGlvbkZvckFkZGl0aW9uIiwicmVtb3ZlUmVsYXRpb25Gb3JFbnRpdHkiLCJyZWxhdGlvbkVudGl0eUlkIiwicmVtb3ZlRGlydHlSZWxhdGlvbkFkZGl0aW9uIiwicmVtb3ZlUmVsYXRlZEVudGl0aWVzIiwicmVjZWl2ZURpcnR5UmVsYXRpb25EZWxldGlvbiIsInBlcnNpc3RFbnRpdHlSZWNvcmQiLCJwZXJzaXN0Rm9yRW50aXR5SWQiLCJwZXJzaXN0Rm9yRW50aXR5SWRzIiwicGVyc2lzdERlbGV0ZXNGb3JNb2RlbCIsInBlcnNpc3RUcmFzaGVzRm9yTW9kZWwiLCJwZXJzaXN0QWxsRGVsZXRlcyIsIkRFRkFVTFRfRU1QVFlfT0JKRUNUIiwiREVGQVVMVF9FTVBUWV9BUlJBWSIsImlzQ2xlYW4iLCJwYXRoIiwiYXBwbHlRdWVyeVN0cmluZyIsImlzTmV3IiwibWV0aG9kIiwiZGF0YSIsImZvclBlcnNpc3QiLCJ1cGRhdGVkRW50aXR5IiwiaXNFbXB0eSIsInVwZGF0ZWRFbnRpdHlSZWNvcmQiLCJmcm9tRXhpc3RpbmciLCJuZXdJZCIsInJlY2VpdmVVcGRhdGVkRW50aXR5SWRGb3JSZWxhdGlvbnMiLCJyZWNlaXZlQW5kUmVwbGFjZUVudGl0eVJlY29yZHMiLCJwZXJzaXN0ZWRFbnRpdHkiLCJyZXRyaWV2ZWRFbnRpdGllcyIsImlzQXJyYXkiLCJrZXlFbnRpdGllc0J5UHJpbWFyeUtleVZhbHVlIiwicmV0cmlldmVkSWRzIiwia2V5cyIsInBlcnNpc3RlZEVudGl0aWVzIiwiZGVsZXRlZElkcyIsImZvcmNlIiwicmVzcG9uc2UiLCJkZWxldGVkIiwicHVzaCIsInJlbW92ZURlbGV0ZUVudGl0eUlkIiwidHJhc2hlZElkcyIsInN1Y2Nlc3MiLCJyZW1vdmVUcmFzaEVudGl0eUlkIiwibW9kZWxzRm9yRGVsZXRlIiwibW9kZWxGb3JEZWxldGUiLCJpZHNEZWxldGVkIiwibW9kZWxzRm9yVHJhc2giLCJtb2RlbEZvclRyYXNoIiwiaWRzVHJhc2hlZCIsInRyYXNoZWQiLCJwZXJzaXN0QWRkUmVsYXRpb25zRm9yTW9kZWwiLCJwZXJzaXN0RGVsZXRlUmVsYXRpb25zRm9yTW9kZWwiLCJwZXJzaXN0UmVsYXRpb25zRm9yTW9kZWwiLCJwZXJzaXN0UmVsYXRpb25zRm9yRW50aXR5SWQiLCJwZXJzaXN0UmVsYXRpb25zRm9yRW50aXR5SWRBbmRSZWxhdGlvbiIsInBlcnNpc3RSZWxhdGlvbnNGb3JFbnRpdHlJZEFuZFJlbGF0aW9uSWQiLCJwZXJzaXN0TmV3RW50aXR5QW5kUmVtb3ZlRGlydHlSZWxhdGlvbnMiLCJnZXRSZWxhdGlvblN0YXRlIiwiYWRkUmVsYXRpb24iLCJyZWxhdGlvblN0YXRlIiwicmVsYXRpb25zUGVyc2lzdGVkIiwicGVyc2lzdGVkUmVsYXRpb25zIiwicmVsYXRpb25OYW1lcyIsInBlcnNpc3RlZFJlbGF0aW9uSWRzIiwicmVsYXRpb25FbnRpdHlJZHMiLCJwZXJzaXN0ZWRSZWxhdGlvbklkIiwicmVsYXRpb25JZCIsImVudGl0eUlkQ2hhbmdlZCIsImN1aWQiLCJpc0N1aWQiLCJlbmRwb2ludCIsInJlbW92ZURpcnR5UmVsYXRpb25Gb3JUeXBlIiwicGVyc2lzdGluZ0FyZ3VtZW50cyIsImRvUmVsYXRpb25SZW1vdmFsIiwic2VsZWN0b3IiLCJ0eXBlcyIsInJlY2VpdmVFbnRpdHlSZWNvcmRzIiwicmVjZWl2ZUVudGl0eSIsInJlY2VpdmVSZWxhdGVkRW50aXRpZXMiLCJyZWxhdGVkRW50aXR5SWRzIiwicmVjZWl2ZURpcnR5UmVsYXRpb25BZGRpdGlvbiIsInF1ZXVlVHlwZSIsIlRZUEVfUVVFVUVfUkVMQVRJT05fQUREIiwiVFlQRV9RVUVVRV9SRUxBVElPTl9ERUxFVEUiLCJvbGRFbnRpdHlJZCIsIm5ld0VudGl0eUlkIiwicmVtb3ZlRGlydHlSZWxhdGlvbkRlbGV0aW9uIiwicmVnaXN0ZXJTdG9yZSIsInJlZHVjZXIiLCJhY3Rpb25zIiwibW9kZWxBY3Rpb25zIiwic2VsZWN0b3JzIiwibW9kZWxTZWxlY3RvcnMiLCJyZXNvbHZlcnMiLCJtb2RlbFJlc29sdmVycyIsInJlY2VpdmVMYXRlc3RDaGVja2luIiwidG9nZ2xlQ2hlY2tpbiIsImNoZWNraW5FbnRpdHkiLCJyZWdpc3RyYXRpb25JZCIsImRhdGVUaW1lSWQiLCJnZXRFbmRwb2ludCIsImNoZWNrSW5SZXNwb25zZSIsIl9fIiwibmV3Q2hlY2tpbiIsImdldExhdGVzdENoZWNraW4iLCJpc1VuZGVmaW5lZCIsInN0YXRlIiwiY2hlY2tpbklkIiwiZ2V0U2VsZWN0b3JWYWx1ZSIsImdldEVudGl0eUJ5SWQiLCJjcmVhdGVBY3Rpb25zIiwiYWN0aW9uIiwiTU9ERUxfTkFNRVMiLCJjcmVhdGVSZXNvbHZlcnMiLCJyZXNvbHZlciIsImNyZWF0ZVNlbGVjdG9ycyIsImdldEVudGl0eVJlY29yZHNGb3JNb2RlbCIsImdldEVudGl0aWVzRm9yTW9kZWwiLCJnZXRFbnRpdGllc0J5SWRzIiwiZ2V0RW50aXR5SWRzUXVldWVkRm9yVHJhc2giLCJnZXRFbnRpdHlJZHNRdWV1ZWRGb3JEZWxldGUiLCJlbnRpdHlTZWxlY3RvcnMiLCJiYXNlU2VsZWN0b3JzIiwicmVsYXRpb25TZWxlY3RvcnMiLCJlbnRpdHlBY3Rpb25zIiwiYmFzZUFjdGlvbnMiLCJyZWxhdGlvbkFjdGlvbnMiLCJlbnRpdHlSZXNvbHZlcnMiLCJiYXNlUmVzb2x2ZXJzIiwicmVjZWl2ZVNlbGVjdG9yVmFsdWUiLCJ2YWx1ZSIsImNyZWF0ZVNlbGVjdG9yIiwiZ2V0SW4iLCJvbGRJZCIsImdldFJlbGF0aW9uQWRkaXRpb25zUXVldWVkRm9yTW9kZWwiLCJnZXRSZWxhdGlvbkRlbGV0aW9uc1F1ZXVlZEZvck1vZGVsIiwiY291bnRSZWxhdGlvbk1vZGVsc0luZGV4ZWRGb3JFbnRpdHkiLCJyZXNldFR5cGVzIiwiYWRkVG9TdGF0ZSIsImFkZCIsInJlbW92ZUZyb21TdGF0ZSIsIlNldCIsImluY2x1ZGVzIiwiZGVsZXRlIiwicHJvY2Vzc0FjdGlvbiIsImRlbGV0ZUVudGl0eSIsImZyb21KUyIsIkRFRkFVTFRfQ09SRV9TVEFURSIsImRpcnR5IiwidHJhc2hFbnRpdHkiLCJ0cmFzaCIsInJlbGF0aW9uRXhpc3RzSW5NYXAiLCJyZWxhdGlvbk1hcCIsImhhc1JlbGF0aW9uIiwiZ2V0UmVsYXRpb25NYXAiLCJNYXAiLCJpZEV4aXN0c0luU2V0IiwiaWRTZXQiLCJpbmRleFJlbGF0aW9ucyIsInNldEluIiwicmVtb3ZlRW1wdHlGcm9tU3RhdGUiLCJnZXRSZWxhdGlvbklkc0Zyb21TdGF0ZSIsImhhc0luIiwicmVxdWlyZXNVcGRhdGUiLCJ1cGRhdGVSZWxhdGlvblN0YXRlIiwiaWRzIiwicmVwbGFjZU9sZFJlbGF0aW9uSWRXaXRoTmV3UmVsYXRpb25JZCIsIm5ld1N0YXRlIiwicmVwbGFjZUlkcyIsInN0YXRlUHJvcGVydHkiLCJwbHVyYWxOYW1lIiwic2luZ3VsYXJOYW1lIiwidG9wTGV2ZWxOYW1lIiwibWFpblBhdGgiLCJtYWluUmVjb3JkIiwiZGVsZXRlSW4iLCJmb3JFYWNoIiwibWFwT3JJZHMiLCJ1cGRhdGVJZHMiLCJyZWxhdGlvblBhdGgiLCJpbmRleFJlY29yZCIsIm5vcm1hbGl6ZUFjdGlvbkZvclN0YXRlIiwiaW5kZXgiLCJkaXJ0eVJlbGF0aW9ucyIsImNsZWFyUmVsYXRlZEVudGl0aWVzRm9yRW50aXR5IiwibW9kZWxEYXRhIiwibW9kZWxSZW1vdmVkIiwiZW50aXR5SWRSZW1vdmVkIiwiaW5kZXhUeXBlIiwicmVsYXRpb25UeXBlcyIsInJlY29yZFBhdGgiLCJjbGVhckVudGl0eUlkc0luUGF0aCIsInN1YlN0YXRlIiwid2l0aE11dGF0aW9ucyIsInJlbGF0aW9uUmVjb3JkIiwicmVsYXRpb25UeXBlIiwicmVtb3ZlUmVsYXRlZEVudGl0aWVzRm9yRW50aXR5Iiwic2luZ2xlTmFtZSIsImNsZWFyU3RhdGVGb3JNb2RlbCIsImNsZWFyTW9kZWxGcm9tU3Vic3RhdGUiLCJzdWJTdGF0ZUtleSIsIm1vZGVsTmFtZUFzUmVsYXRpb24iLCJtdXRhdGVkU3RhdGUiLCJlbnRpdHlNYXBzIiwibW9kZWxNYXAiLCJkZWxldGVQYXRoIiwiY29tYmluZVJlZHVjZXJzIiwicmVwbGFjZUV4aXN0aW5nRW50aXRpZXNGcm9tU3RhdGUiLCJlbnRpdHlSZWNvcmRzIiwibWVyZ2UiLCJ1cGRhdGVTdGF0ZSIsImRpZmZlcmVuY2UiLCJoYW5kbGVSZWNlaXZlU2VsZWN0b3IiLCJub3JtYWxpemVkUmVjZWl2ZUFuZFJlbW92ZVJlbGF0aW9ucyIsInJlY2VpdmVBbmRSZW1vdmVSZWxhdGlvbnMiLCJuZXdBY3Rpb24iLCJzZXRSZWxhdGlvbkluZGV4IiwicmVsYXRpb25EYXRhIiwicmVtb3ZhbCIsImV4aXN0aW5nSWRzIiwiY29uY2F0IiwiaWRzQWZ0ZXJSZW1vdmFsIiwiZmlsdGVyIiwia2V5T2YiLCJjb3VudCIsInVwZGF0ZUVudGl0eUlkRm9yUmVsYXRpb25zIiwibW9kZWxBc1JlbGF0aW9uTmFtZSIsIm9sZEluZGV4UGF0aCIsImluZGV4UmVjb3JkVG9SZXBsYWNlIiwicmVwbGFjZVJlbGF0aW9uUmVjb3JkcyIsIm1haW5SZWNvcmRUb1JlcGxhY2UiLCJvbGRFbnRpdHlNYXBQYXRoIiwibWFwRW50aXR5UmVjb3JkVG9SZXBsYWNlIiwic3RhdGVQcm9wZXJ0eU5hbWUiLCJyZW1vdmVPbmx5IiwibG9vcFByb3BlcnR5Iiwib2xkRW50aXR5UGF0aCIsInRvQXJyYXkiLCJlbnRpdHlNYXBSZWNvcmRUb1JlcGxhY2UiLCJyZXNldFN0YXRlRm9yTW9kZWwiLCJpbmRleFBhdGgiLCJlbnRpdHlNYXBQYXRoIiwiY2xlYXJNb2RlbE5hbWVzRnJvbVBhdGgiLCJtYXBQcm9wZXJ0eSIsIm1haW5TdGF0ZSIsIm9wcG9zaXRlU3RhdGUiLCJmdWxsRW50aXR5IiwiZ2V0UmVsYXRlZEVudGl0aWVzIiwiZ2V0UmVsYXRlZEVudGl0aWVzRm9ySWRzIiwicmVsYXRpb25SZXNvdXJjZVByb3BlcnR5IiwicmVsYXRpb25FbmRwb2ludCIsInN0cmlwQmFzZVJvdXRlRnJvbVVybCIsInJlc291cmNlTGluayIsImZ1bGxFbnRpdGllcyIsImNyZWF0ZUFuZEtleUVudGl0aWVzQnlQcmltYXJ5S2V5VmFsdWUiLCJlbnRpdGllc09iamVjdCIsImVudGl0eU9iaiIsImVudGl0eUFycmF5IiwidmFsdWVzIiwiaGFzSm9pblRhYmxlIiwicmVsYXRpb25TY2hlbWEiLCJyZWxhdGlvblByaW1hcnlLZXkiLCJnZXRQcmltYXJ5S2V5IiwibW9kZWxQcmltYXJ5S2V5IiwiaGFzU2V0TWFwIiwiSW1tdXRhYmxlTWFwIiwiam9pbmluZ19tb2RlbF9uYW1lIiwiZ2V0UHJpbWFyeUtleVF1ZXJ5U3RyaW5nIiwiZ2V0TW9kZWxOYW1lRm9yUmVxdWVzdCIsInJlY29yZHMiLCJyZWNvcmQiLCJyZWxhdGlvblJlY29yZHMiLCJyZXBsYWNlIiwic3RhcnRDYXNlIiwidG9KUyIsInZhbHVlU2VxIiwicmV0cmlldmVFbnRpdGllc0J5SWRzIiwiam9pbiIsImNsZWFyIiwiZ2V0RGVwZW5kYW50cyIsInNwbGl0IiwiZ2V0TW9kZWxzUXVldWVkRm9yVHJhc2giLCJrZXlTZXEiLCJnZXRNb2RlbHNRdWV1ZWRGb3JEZWxldGUiLCJnZXRBbGxFbnRpdGllc0luU3RhdGUiLCJERUZBVUxUX0VNUFRZX1NFVCIsImdldFJlbGF0aW9uSWRzRm9yRW50aXR5UmVsYXRpb24iLCJzaW5ndWxhck1vZGVsIiwicGx1cmFsTW9kZWwiLCJyZWxhdGVkRW50aXRpZXMiLCJsb29rdXBSZWxhdGlvbnNRdWV1ZWRGb3JNb2RlbCIsImZvckluZGV4TG9va3VwIiwiZm9yQWRkTG9va3VwIiwibW9kZWwiLCJjb3VudFJlbGF0aW9ucyIsImdldEFsbFJlbGF0aW9uc0luU3RhdGUiLCJSRUNFSVZFX0xJU1QiLCJSRUNFSVZFX0VOVElUWV9MSVNUIiwicmVjZWl2ZVJlc3BvbnNlIiwiaWRlbnRpZmllciIsInF1ZXJ5U3RyaW5nIiwiaXRlbXMiLCJyZWNlaXZlRW50aXR5UmVzcG9uc2UiLCJjcmVhdGVFbnRpdHlTZWxlY3RvcnMiLCJjcmVhdGVFbnRpdHlSZXNvbHZlcnMiLCJzb3VyY2UiLCJtZXRob2ROYW1lRm9yR2V0IiwiZ2V0RW50aXRpZXMiLCJyZWNlaXZlTGlzdEl0ZW1zIiwiREVGQVVMVF9MSVNUU19TVEFURSIsImRvVXBkYXRlIiwiZXhpc3RpbmdWYWx1ZXMiLCJPcmRlcmVkTWFwIiwiZ2V0SXRlbXMiLCJidWlsZEFuZERpc3BhdGNoRW50aXRpZXNGcm9tUmVzcG9uc2UiLCJmaW5kIiwiZXhpc3RpbmdFbnRpdHkiLCJyZXRyaWV2ZUl0ZW1zIiwiZGVmYXVsdEVtcHR5IiwiZSIsImlzUmVxdWVzdGluZyIsImFzc2VydEltbXV0YWJsZU9iamVjdEhhc1BhdGgiLCJzcHJpbnRmIiwiaXNSZXF1ZXN0aW5nSXRlbXMiLCJpc1JlcXVlc3RpbmdFbnRpdGllcyIsIlJFQ0VJVkVfU0NIRU1BX1JFQ09SRCIsIlJFQ0VJVkVfRkFDVE9SWV9GT1JfTU9ERUwiLCJSRUNFSVZFX1JFTEFUSU9OX0VORFBPSU5UX0ZPUl9NT0RFTF9FTlRJVFkiLCJSRUNFSVZFX1JFTEFUSU9OX1NDSEVNQSIsInJlY2VpdmVTY2hlbWFGb3JNb2RlbCIsInNjaGVtYSIsInJlY2VpdmVGYWN0b3J5Rm9yTW9kZWwiLCJyZWNlaXZlUmVsYXRpb25FbmRwb2ludEZvck1vZGVsRW50aXR5IiwicmVjZWl2ZVJlbGF0aW9uU2NoZW1hIiwiSk9JTl9SRUxBVElPTl9UWVBFUyIsIlNDSEVNQV9LRVkiLCJzY2hlbWFNZXRob2ROYW1lIiwiZmFjdG9yeU1ldGhvZE5hbWUiLCJnZXRTY2hlbWFGb3JNb2RlbCIsImdldEZhY3RvcnlGb3JNb2RlbCIsInJlY2VpdmVTY2hlbWEiLCJERUZBVUxUX1NDSEVNQV9TVEFURSIsImlzU2NoZW1hUmVzcG9uc2VPZk1vZGVsIiwicmVjZWl2ZUZhY3RvcnkiLCJyZWNlaXZlUmVsYXRpb25FbmRwb2ludEZvckVudGl0eSIsInJlbGF0aW9uRW5kcG9pbnRzIiwiaXNTaGFsbG93RXF1YWwiLCJnZXRSZWxhdGlvbkVuZHBvaW50Rm9yRW50aXR5SWQiLCJoYXNKb2luVGFibGVSZWxhdGlvbiIsImdldFJlbGF0aW9uVHlwZSIsImdldFJlbGF0aW9uU2NoZW1hIiwiY3JlYXRlRW50aXR5RmFjdG9yeSIsIk1PREVMX1BSRUZJWEVTIiwiX2xpbmtzIiwibGlua3MiLCJiYXNlUmVsYXRpb25QYXRoIiwiaW5kZXhPZiIsInJlbGF0aW9uX3R5cGUiLCJFcnJvciIsInR5cGVTY2hlbWEiLCJwcm9wZXJ0aWVzIiwiaXNSZXF1ZXN0aW5nU2NoZW1hRm9yTW9kZWwiLCJoYXNSZXNvbHZlZFNjaGVtYUZvck1vZGVsIiwiaXNSZXF1ZXN0aW5nRmFjdG9yeUZvck1vZGVsIiwiaGFzUmVzb2x2ZWRGYWN0b3J5Rm9yTW9kZWwiLCJpc1JlcXVlc3RpbmdSZWxhdGlvbkVuZHBvaW50Rm9yRW50aXR5SWQiLCJhc3NlcnRFbnRpdHlIYXNLZXkiLCJrZXkiLCJtZXNzYWdlIiwiaGFzT3duUHJvcGVydHkiLCJFeGNlcHRpb24iLCJpbW11dGFibGUiLCJhc3NlcnRJc0FycmF5IiwiYXNzZXJ0SXNOb3RFbXB0eSIsImFzc2VydElzTWFwIiwiaXRlbSIsIk1PREVMX05BTUUiLCJvcmRlckJ5TWFwIiwibGFzdE5hbWVPbmx5IiwiZmlyc3ROYW1lT25seSIsImZpcnN0VGhlbkxhc3ROYW1lIiwibGFzdFRoZW5GaXJzdE5hbWUiLCJxdWVyeURhdGFUeXBlcyIsImZvckV2ZW50SWQiLCJQcm9wVHlwZXMiLCJudW1iZXIiLCJmb3JEYXRldGltZUlkIiwiZm9yVGlja2V0SWQiLCJmb3JTdGF0dXNJZCIsIm9uZU9mIiwiUkVHSVNUUkFUSU9OX1NUQVRVU19JRFMiLCJmb3JSZWdpc3RyYXRpb25JZCIsInNob3dHcmF2YXRhciIsImJvb2wiLCJxdWVyeURhdGEiLCJzaGFwZSIsImxpbWl0Iiwib3JkZXJCeSIsIm9yZGVyIiwiQUxMT1dFRF9PUkRFUl9WQUxVRVMiLCJkZWZhdWx0UXVlcnlEYXRhIiwiUVVFUllfT1JERVJfQVNDIiwibWFwT3JkZXJCeSIsIndoZXJlQ29uZGl0aW9ucyIsIndoZXJlIiwiZ2V0UXVlcnlTdHJpbmciLCJiYXNlR2V0UXVlcnlTdHJpbmciLCJmb3JtYXREYXRlc09uRW50aXRpZXMiLCJlbnRpdHlEYXRlRmllbGRzIiwiZm9ybWF0IiwiZGF0ZUZvcm1hdHMiLCJsb2NhbCIsImZvcm1hdHRlZEVudGl0aWVzIiwiZm9ybWF0RGF0ZXNPbkVudGl0eSIsIm5ld0VudGl0eSIsImRhdGVGaWVsZCIsImZvcm1hdEVudGl0aWVzRGF0ZXNUb015c3FsIiwiZm9ybWF0RW50aXR5RGF0ZXNUb015c3FsIiwiZm9ybWF0RW50aXRpZXNEYXRlc1RvU2l0ZSIsImZvcm1hdEVudGl0eURhdGVzVG9TaXRlIiwiY29udmVydEVudGl0aWVzRGF0ZXNUb01vbWVudCIsImNvbnZlcnRFbnRpdHlEYXRlc1RvTW9tZW50IiwiUVVFUllfT1JERVJfREVTQyIsIkdSRUFURVJfVEhBTiIsImVuY29kZVVSSUNvbXBvbmVudCIsIkxFU1NfVEhBTiIsIkdSRUFURVJfVEhBTl9BTkRfRVFVQUwiLCJMRVNTX1RIQU5fQU5EX0VRVUFMIiwiZGVmYXVsdFdoZXJlQ29uZGl0aW9ucyIsInF1ZXJ5UGFyYW1zIiwiZmllbGQiLCJDSEVDS0lOX1NUQVRVU19JRCIsIlNUQVRVU19DSEVDS0VEX09VVCIsIlNUQVRVU19DSEVDS0VEX0lOIiwiU1RBVFVTX0NIRUNLRURfTkVWRVIiLCJDSEVDS0lOX1NUQVRVU19JRFMiLCJjaGVja2luU3RhdHVzIiwib3B0aW9uc0VudGl0eU1hcCIsImRlZmF1bHQiLCJsYWJlbCIsInByZXR0eVN0YXR1cyIsInRpbWVzdGFtcCIsIkRBVEVUSU1FX1NUQVRVU19JRCIsIlNPTERfT1VUIiwiQUNUSVZFIiwiVVBDT01JTkciLCJQT1NUUE9ORUQiLCJDQU5DRUxMRUQiLCJFWFBJUkVEIiwiSU5BQ1RJVkUiLCJEQVRFVElNRV9TVEFUVVNfSURTIiwiREFURV9GSUVMRFMiLCJmb3JtYXR0ZXJzIiwiZm9yT3duIiwiYmFzZUZvcm1hdHRlciIsImltcGxlbWVudGF0aW9uIiwiZnVuY3Rpb25OYW1lIiwiaW5jb21pbmdBcmdzIiwiZmlyc3RBcmciLCJwdWxsQXQiLCJwcmV0dHlEYXRlRnJvbURhdGVUaW1lIiwiRGF0ZVRpbWVFbnRpdHkiLCJjb250ZW50IiwiRFRUX0VWVF9zdGFydCIsImhhc1NhbWUiLCJEVFRfRVZUX2VuZCIsImFsbERhdGVUaW1lc0FzU3RyaW5nIiwiU0VQQVJBVE9SX1NQQUNFX0RBU0hfU1BBQ0UiLCJ0b0Zvcm1hdCIsIkRBVEVfVElNRV9GT1JNQVRfU0lURSIsIlRJTUVfRk9STUFUX1NJVEUiLCJEVFRfbmFtZSIsIm5vd0RhdGVBbmRUaW1lIiwibW9tZW50Iiwic2hvd0V4cGlyZWQiLCJtb250aCIsInN0YXJ0X2RhdGUiLCJlbmRfZGF0ZSIsInN0YXJ0T2YiLCJlbmRPZiIsIm1hcFRvT2JqZWN0VmFsdWVzIiwibW9kZWxOYW1lRW5kcG9pbnRzIiwibWFwVmFsdWVzIiwiZ2V0RGVmYXVsdE1vZGVsRW50aXRpZXNPYmplY3QiLCJtZW1vaXplIiwiZW5kcG9pbnRzIiwiZW50aXR5TWFwIiwicGF0aHMiLCJjb2xsZWN0aW9uX2VuZHBvaW50cyIsImJhc2VSZXN0Um91dGUiLCJiYXNlX3Jlc3Rfcm91dGUiLCJ1cmwiLCJtYXliZUFzc2VydFZhbHVlT2JqZWN0IiwiZmllbGROYW1lIiwiZmllbGRWYWx1ZSIsImlzRGF0ZVRpbWVGaWVsZCIsIkRhdGVUaW1lIiwiYXNzZXJ0SXNEYXRlVGltZSIsImlzTW9uZXlGaWVsZCIsIk1vbmV5IiwiYXNzZXJ0TW9uZXkiLCJhc3NlcnRWYWxpZFNjaGVtYSIsImlzU2NoZW1hIiwiSW52YWxpZFNjaGVtYSIsImFzc2VydFZhbGlkU2NoZW1hRmllbGRQcm9wZXJ0aWVzIiwiVHlwZUVycm9yIiwicmF3IiwiYXNzZXJ0VmFsaWRWYWx1ZUZvclByZXBhcmVkRmllbGQiLCJpbnN0YW5jZSIsImlzVmFsaWQiLCJpc1NoYWxsb3dWYWxpZFZhbHVlRm9yRmllbGQiLCJlbnVtIiwidmFsaWRhdGVFbnVtVHlwZSIsInZhbGlkYXRlVHlwZSIsIm1heWJlQ29udmVydEZyb21WYWx1ZU9iamVjdFdpdGhBc3NlcnRpb25zIiwiYXNzZXJ0VmFsaWRGaWVsZEFuZFZhbHVlQWdhaW5zdFNjaGVtYSIsInZhbGlkYXRpb25UeXBlIiwidmFsaWRhdGVUeXBlRm9yRmllbGQiLCJQUklWQVRFX1BST1BFUlRJRVMiLCJTQVZFX1NUQVRFIiwiVkFMSURBVEVfVFlQRVMiLCJCYXNlRW50aXR5IiwiZW50aXR5RmllbGRzQW5kVmFsdWVzIiwiZmllbGRQcmVmaXhlcyIsIkNMRUFOIiwiY3JlYXRlR2V0dGVyIiwic2V0U2F2ZVN0YXRlIiwiTkVXIiwiY3JlYXRlRW50aXR5R2V0dGVyc0FuZFNldHRlcnMiLCJjcmVhdGVQZXJzaXN0aW5nR2V0dGVyc0FuZFNldHRlcnMiLCJzYXZlU3RhdGUiLCJESVJUWSIsInByb3RlY3RlZEZpZWxkcyIsImZvckNsb25lIiwiJHNjaGVtYSIsIm5hbWVDbGFzcyIsIm5hbWUiLCJleHRlbmRlZENsYXNzIiwiRW50aXR5IiwiY2xhc3NEZWYiLCJmaWVsZHNBbmRWYWx1ZXMiLCJoYXNSYXdQcm9wZXJ0eSIsImlzUGxhaW5PYmplY3QiLCJoYXNQcmV0dHlQcm9wZXJ0eSIsInByZXR0eSIsImhhc1JlbmRlcmVkUHJvcGVydHkiLCJyZW5kZXJlZCIsImhhc0Zvcm1hdFByb3BlcnR5IiwiaGFzRW51bVByb3BlcnR5IiwiaXNWYWx1ZU9iamVjdEZpZWxkIiwiaXNVVENEYXRlVGltZUZpZWxkIiwiZGF0ZVRpbWVGaWVsZE5hbWUiLCJpc1ByaW1hcnlLZXlGaWVsZCIsInByaW1hcnlfa2V5IiwiaXNSZWFkT25seSIsInJlYWRvbmx5IiwiaXNFbnRpdHlGaWVsZCIsImlzRW51bUZpZWxkIiwiVkFMSURBVEVfVFlQRSIsIlJBVyIsIlJFTkRFUkVEIiwiUFJFVFRZIiwicHJlZml4TWFwIiwiYXBwbHlGaWx0ZXJzIiwiYW5zd2VyIiwiYXR0ZW5kZWUiLCJjaGFuZ2VfbG9nIiwiY2hlY2tpbiIsImNvdW50cnkiLCJjdXJyZW5jeSIsImN1cnJlbmN5X3BheW1lbnRfbWV0aG9kIiwiZGF0ZXRpbWUiLCJkYXRldGltZV90aWNrZXQiLCJldmVudCIsImV2ZW50X21lc3NhZ2VfdGVtcGxhdGUiLCJldmVudF9xdWVzdGlvbl9ncm91cCIsImV2ZW50X3ZlbnVlIiwiZXh0cmFfam9pbiIsImV4dHJhX21ldGEiLCJsaW5lX2l0ZW0iLCJtZXNzYWdlX3RlbXBsYXRlIiwibWVzc2FnZV90ZW1wbGF0ZV9ncm91cCIsInBheW1lbnQiLCJwYXltZW50X21ldGhvZCIsInBvc3RfbWV0YSIsInByaWNlIiwicHJpY2VfdHlwZSIsInF1ZXN0aW9uIiwicXVlc3Rpb25fZ3JvdXAiLCJxdWVzdGlvbl9ncm91cF9xdWVzdGlvbiIsInF1ZXN0aW9uX29wdGlvbiIsInJlZ2lzdHJhdGlvbiIsInJlZ2lzdHJhdGlvbl9wYXltZW50Iiwic3RhdHVzIiwidGVybSIsInRlcm1fcmVsYXRpb25zaGlwIiwidGVybV90YXhvbm9teSIsInRpY2tldCIsInRpY2tldF9wcmljZSIsInRpY2tldF90ZW1wbGF0ZSIsInRyYW5zYWN0aW9uIiwidmVudWUiLCJ3cF91c2VyIiwib3B0cyIsImNyZWF0ZUNhbGxiYWNrR2V0dGVyIiwicHJvcGVydHlOYW1lIiwiY2FsbEJhY2siLCJjcmVhdGVHZXR0ZXJBbmRTZXR0ZXIiLCJpbml0aWFsRmllbGRWYWx1ZSIsInByb3BlcnR5VmFsdWUiLCJyZWNlaXZlZFZhbHVlIiwic2V0RmllbGRUb1BlcnNpc3QiLCJjcmVhdGVBbGlhc0dldHRlckFuZFNldHRlciIsIm9yaWdpbmFsRmllbGROYW1lIiwiYWxpYXNGaWVsZE5hbWUiLCJjcmVhdGVBbGlhc0dldHRlciIsImNyZWF0ZUZsdWVudFNldHRlciIsInByaW1hcnlLZXlzIiwib3JpZ2luYWxGaWVsZHNBbmRWYWx1ZXMiLCJpc1ByaW1hcnlLZXkiLCJzZXRWYWxpZGF0ZVR5cGVGb3JGaWVsZCIsInNldEluaXRpYWxFbnRpdHlGaWVsZHNBbmRWYWx1ZXMiLCJzZXRDYWxjdWxhdGVkRmllbGRBbmRWYWx1ZXMiLCJwb3B1bGF0ZVByb3RlY3RlZEZpZWxkc1Byb3BlcnR5Iiwic2V0UmVzb3VyY2VzIiwiY3JlYXRlUHJpbWFyeUtleUZpZWxkR2V0dGVycyIsInBvcHVsYXRlUHJpbWFyeUtleXMiLCJwb3B1bGF0ZU1pc3NpbmdGaWVsZHMiLCJjYWxjdWxhdGVkRmllbGRzIiwiX2NhbGN1bGF0ZWRfZmllbGRzIiwiX3Byb3RlY3RlZCIsImdldFByaW1hcnlLZXlGaWVsZHNGcm9tU2NoZW1hIiwic2NoZW1hUHJvcGVydGllcyIsInNjaGVtYUZpZWxkIiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImNyZWF0ZUFsaWFzR2V0dGVyRm9yRmllbGQiLCJkZXJpdmVWYWxpZGF0ZVR5cGVGb3JGaWVsZCIsImdldEVudGl0eUZpZWxkc0Zyb21TY2hlbWEiLCJ1bmRlZmluZWQiLCJnZXRCYXNlRmllbGRzQW5kVmFsdWVzRm9yQ2xvbmluZyIsImZvclVwZGF0ZSIsImdldEJhc2VGaWVsZHNBbmRWYWx1ZXNGb3JQZXJzaXN0aW5nIiwiZm9ySW5zZXJ0IiwiZW50aXR5VmFsdWVzIiwicHJpbWFyeUtleSIsImdldERlZmF1bHRWYWx1ZUZvckZpZWxkIiwiY3JlYXRlUmF3RW50aXR5R2V0dGVyc1NldHRlcnMiLCJkZXJpdmVQcmVwYXJlZFZhbHVlRm9yRmllbGQiLCJjcmVhdGVSZW5kZXJlZEdldHRlcnMiLCJkZXJpdmVSZW5kZXJlZFZhbHVlIiwiY3JlYXRlQWxpYXNHZXR0ZXJBbmRTZXR0ZXJGb3JGaWVsZCIsImNyZWF0ZUFsaWFzZXNGb3JNZXRob2QiLCJuZXdGaWVsZE5hbWUiLCJmaWVsZFByZWZpeCIsImdldFJlbmRlcmVkQ2FsbGJhY2siLCJyZXF1ZXN0ZWRGaWVsZE5hbWUiLCJyZW1vdmVQcmVmaXhlc0Zyb21GaWVsZCIsInByZWZpeGVzVG9SZW1vdmUiLCJzb3J0QnkiLCJnZXRSZW5kZXJlZCIsImhhc011bHRpcGxlUHJpbWFyeUtleXNDYWxsYmFjayIsImhhc0NhbGN1bGF0ZWRGaWVsZENhbGxiYWNrIiwiZmllbGROYW1lVG9DaGVjayIsImNhbGN1bGF0ZWRGaWVsZFZhbHVlIiwiY2FsY3VsYXRlZEZpZWxkTmFtZSIsInJlc291cmNlVmFsdWUiLCJyZXNvdXJjZU5hbWUiLCJocmVmIiwiZ2V0UmVsYXRpb25OYW1lRnJvbUxpbmsiLCJzZXRSZWxhdGlvbnNSZXNvdXJjZSIsImdldFJlbGF0aW9uUmVzb3VyY2VDYWxsYmFjayIsInJlc291cmNlSW5mbyIsInNpbmdsZSIsImdldFJlbGF0aW9uUmVzb3VyY2UiLCJjdXJyZW50U3RhdGUiLCJJbnZhbGlkQXJndW1lbnQiLCJmaWVsZHNUb1BlcnNpc3RPbkluc2VydCIsIm1heWJlQ29udmVydFRvVmFsdWVPYmplY3QiLCJ2YWxpZGF0ZUlzRGF0ZVRpbWUiLCJmcm9tSVNPIiwiaW5zdGFuY2VPZiIsIlNpdGVDdXJyZW5jeSIsInRvSVNPIiwidG9OdW1iZXIiLCJtYXliZUNvbnZlcnRGcm9tVmFsdWVPYmplY3QiLCJsYXN0IiwiaXRlcmF0b3IiLCJnZXRQcmltYXJ5S2V5VmFsdWVzIiwicGljayIsInBpY2tCeSIsImRlcml2ZURlZmF1bHRWYWx1ZUZvclR5cGUiLCJEYXRlIiwidG9JU09TdHJpbmciLCJkZXJpdmVUeXBlRm9yRmllbGQiLCJ2YWxpZCIsInNpbmdsZVR5cGUiLCJpc0ludGVnZXIiLCJpc051bWJlciIsImlzU3RyaW5nIiwiaXNCb29sZWFuIiwiZW51bVZhbHVlcyIsImV4cGVjdFZhbHVlT2JqZWN0cyIsImlzRW51bSIsImlzVmFsdWVPYmplY3QiLCJFVkVOVF9TVEFUVVNfSUQiLCJFVkVOVF9TVEFUVVNfSURTIiwiY2F0ZWdvcnlTbHVnIiwic3RyaW5nIiwidGlja2V0X3N0YXJ0IiwidGlja2V0X2VuZCIsInNpbmd1bGFyIiwicHJpbWFyeV9rZXlzIiwidmFsdWVzRm9yQ29tYmluZWRQcmltYXJ5S2V5cyIsInRyaW1FbmQiLCJ2YWx1ZUZvclByaW1hcnlLZXkiLCJrZXlWYWx1ZXMiLCJnZXRFbnRpdHlQcmltYXJ5S2V5VmFsdWVzIiwibWFwcGVkRW50aXRpZXMiLCJzdGF0dXNNb2RlbCIsImZvckF0dGVuZGVlSWQiLCJmb3JUcmFuc2FjdGlvbklkIiwicmVnX2lkIiwicmVnX2RhdGUiLCJTVEFUVVNfVFlQRV9FTUFJTCIsIlNUQVRVU19UWVBFX0VWRU5UIiwiU1RBVFVTX1RZUEVfTUVTU0FHRSIsIlNUQVRVU19UWVBFX1BBWU1FTlQiLCJTVEFUVVNfVFlQRV9SRUdJU1RSQVRJT04iLCJTVEFUVVNfVFlQRV9UUkFOU0FDVElPTiIsIkVNQUlMX1NUQVRVU19JRCIsIkRSQUZUIiwiU0VOVCIsIlJFR0lTVFJBVElPTl9DTE9TRUQiLCJERUxFVEVEIiwiREVOSUVEIiwiTk9UX0FDVElWRSIsIk5PVF9PUEVOIiwiT05HT0lORyIsIlJFR0lTVFJBVElPTl9PUEVOIiwiUEVORElORyIsIlNFQ09OREFSWSIsIk1FU1NBR0VfU1RBVFVTX0lEIiwiREVCVUciLCJFWEVDVVRJTkciLCJGQUlMIiwiSU5DT01QTEVURSIsIklETEUiLCJSRVNFTkQiLCJSRVRSWSIsIlBBWU1FTlRfU1RBVFVTX0lEIiwiQVBQUk9WRUQiLCJERUNMSU5FRCIsIkZBSUxFRCIsIlJFR0lTVFJBVElPTl9TVEFUVVNfSUQiLCJOT1RfQVBQUk9WRUQiLCJQRU5ESU5HX1BBWU1FTlQiLCJXQUlUX0xJU1QiLCJUUkFOU0FDVElPTl9TVEFUVVNfSUQiLCJBQkFORE9ORUQiLCJDT01QTEVURSIsIk9WRVJQQUlEIiwiQ1BUX1NUQVRVU19JRCIsIlBVQkxJU0giLCJGVVRVUkUiLCJQUklWQVRFIiwiVFJBU0hFRCIsIlVOS05PV05fU1RBVFVTX0lEIiwiQUxMX1NUQVRVU19JRFMiLCJTVEFUVVNfVFJBTlNMQVRJT05fTUFQX1JFR0lTVFJBVElPTiIsIkxhYmVsIiwiZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwiLCJTVEFUVVNfVFJBTlNMQVRJT05fTUFQX1RSQU5TQUNUSU9OIiwiU1RBVFVTX1RSQU5TTEFUSU9OX01BUF9QQVlNRU5UIiwiU1RBVFVTX1RSQU5TTEFUSU9OX01BUF9NRVNTQUdFIiwiU1RBVFVTX1RSQU5TTEFUSU9OX01BUF9DUFQiLCJTVEFUVVNfVFJBTlNMQVRJT05fTUFQX0VWRU5UIiwiU1RBVFVTX1RSQU5TTEFUSU9OX01BUF9USUNLRVQiLCJUSUNLRVRfU1RBVFVTX0lEIiwiQVJDSElWRUQiLCJPTlNBTEUiLCJTVEFUVVNfVFJBTlNMQVRJT05fTUFQX0RBVEVUSU1FIiwiU1RBVFVTX1RSQU5TTEFUSU9OX01BUF9DSEVDS0lOIiwiU1RBVFVTX1RSQU5TTEFUSU9OX01BUF9BTEwiLCJzdGF0dXNDb2RlIiwiRk9STUFUX1NFTlRFTkNFX0NBU0UiLCJhc0Zvcm1hdHRlZCIsInByZXR0eVN0YXR1c2VzIiwic3RhdHVzQ29kZXMiLCJtYXBwZWRTdGF0dXNlcyIsInN0YXR1c1R5cGUiLCJUSUNLRVRfU1RBVFVTX0lEUyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7O0FBR0E7QUFDQTtBQUtBO0FBRUE7Ozs7QUFHQTtBQUVBOzs7Ozs7QUFLTyxTQUFTQSxLQUFULENBQWdCQyxPQUFoQixFQUEwQjtBQUNoQyxTQUFPO0FBQ05DLFFBQUksRUFBRSxnQkFEQTtBQUVORCxXQUFPLEVBQVBBO0FBRk0sR0FBUDtBQUlBO0FBRUQ7Ozs7Ozs7OztBQVFPLFNBQVNFLE1BQVQsQ0FBaUJDLFVBQWpCLEVBQTZCQyxZQUE3QixFQUFxRDtBQUFBLG9DQUFQQyxJQUFPO0FBQVBBLFFBQU87QUFBQTs7QUFDM0QsU0FBTztBQUNOSixRQUFJLEVBQUUsUUFEQTtBQUVORSxjQUFVLEVBQVZBLFVBRk07QUFHTkMsZ0JBQVksRUFBWkEsWUFITTtBQUlOQyxRQUFJLEVBQUpBO0FBSk0sR0FBUDtBQU1BO0FBRUQ7Ozs7Ozs7O0FBT08sU0FBU0MsYUFBVCxDQUF3QkgsVUFBeEIsRUFBb0NDLFlBQXBDLEVBQTREO0FBQUEscUNBQVBDLElBQU87QUFBUEEsUUFBTztBQUFBOztBQUNsRSxTQUFPO0FBQ05KLFFBQUksRUFBRSxnQkFEQTtBQUVORSxjQUFVLEVBQVZBLFVBRk07QUFHTkMsZ0JBQVksRUFBWkEsWUFITTtBQUlOQyxRQUFJLEVBQUpBO0FBSk0sR0FBUDtBQU1BO0FBRUQ7Ozs7Ozs7OztBQVFPLFNBQVNFLFFBQVQsQ0FBbUJKLFVBQW5CLEVBQStCSyxZQUEvQixFQUF1RDtBQUFBLHFDQUFQSCxJQUFPO0FBQVBBLFFBQU87QUFBQTs7QUFDN0QsU0FBTztBQUNOSixRQUFJLEVBQUUsVUFEQTtBQUVORSxjQUFVLEVBQVZBLFVBRk07QUFHTkss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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQSx3Q0FBd0MsV0FBVztBQUNuRDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsU0FBUztBQUNUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQ0FBb0MsY0FBYztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUNBQWlDLGtCQUFrQjtBQUNuRDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCOztBQUVqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsaUJBQWlCO0FBQ3pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQSxZQUFZO0FBQ1o7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUEsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLDhDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLDhDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7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RUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsVUFBVTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUNBQWlDLEtBQUs7QUFDdEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBLCtFQUErRTtBQUMvRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isb0JBQW9CO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FB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Qyx1Q0FBdUMsRUFBRTtBQUM3RTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQiw2RUFBNkU7QUFDdkc7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsVUFBVTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQix3QkFBd0I7QUFDM0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkRBQTZELGNBQWMsRUFBRTtBQUM3RTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvREFBb0QsZ0JBQWdCLEVBQUU7QUFDdEU7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLHlCQUF5QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixrRUFBa0U7QUFDakc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixtQkFBbUI7QUFDdkM7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLG9CQUFvQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsMkRBQTJELG1DQUFtQyxFQUFFO0FBQ2hHOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwyREFBMkQsdUNBQXVDO0FBQ2xHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsc0JBQXNCLEVBQUU7QUFDbEUsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxQkFBcUIsc0JBQXNCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSxpQ0FBaUMsS0FBSztBQUN0Qzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5Q0FBeUMsd0JBQXdCLEVBQUU7QUFDbkUsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3Q0FBd0MsVUFBVTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLFdBQVc7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0NBQXdDLFVBQVU7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUSxXQUFXO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxnQkFBZ0I7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLGdCQUFnQjtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixrQkFBa0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsZUFBZTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLHNCQUFzQixFQUFFO0FBQ2xFLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0NBQXdDLEtBQUs7QUFDN0M7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx3QkFBd0IsZ0RBQWdELEVBQUU7QUFDMUU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCx5Q0FBeUMsRUFBRTtBQUM5RjtBQUNBO0FBQ0EsK0JBQStCLGlCQUFpQixFQUFFO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxTQUFTO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlCQUF5Qix5QkFBeUIsRUFBRTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsbUJBQW1CLEVBQUU7QUFDNUQsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQ0FBaUMsS0FBSztBQUN0Qzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0Esd0NBQXdDLDBCQUEwQixFQUFFO0FBQ3BFLHFDQUFxQyx1QkFBdUIsRUFBRTtBQUM5RCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVDQUF1QyxxQkFBcUIsRUFBRTtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixtQkFBbUI7QUFDekMsOERBQThELHVCQUF1QixFQUFFO0FBQ3ZGO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsK0JBQStCLEVBQUU7QUFDeEU7QUFDQTtBQUNBLHdDQUF3Qyw2QkFBNkIsRUFBRTtBQUN2RTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QywrQkFBK0IsRUFBRTtBQUN4RTtBQUNBO0FBQ0Esc0NBQXNDLDZCQUE2QixFQUFFO0FBQ3JFO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSw2Q0FBNkMseUJBQXlCLEVBQUU7QUFDeEU7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSx1Q0FBdUMsK0JBQStCLEVBQUU7QUFDeEUsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsK0VBQStFLGFBQWEsRUFBRTtBQUM5RixHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCwyQkFBMkI7QUFDM0U7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0Esd0NBQXdDLDJCQUEyQixFQUFFO0FBQ3JFLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBLHdDQUF3Qyw2QkFBNkIsRUFBRTtBQUN2RSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSwwQ0FBMEMsK0JBQStCLEVBQUU7QUFDM0UsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsMkRBQTJELEVBQUU7QUFDM0Y7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QiwyQ0FBMkMsRUFBRTtBQUMzRTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQsK0NBQStDOztBQUU1RztBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxzQkFBc0IsRUFBRTtBQUM3RCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBEQUEwRDtBQUMxRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsbUJBQW1CLEVBQUU7QUFDNUQsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0NBQXdDLEtBQUs7QUFDN0M7O0FBRUE7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGlCQUFpQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBLGtDQUFrQyxTQUFTO0FBQzNDO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwREFBMEQsMkJBQTJCLEVBQUU7QUFDdkY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQSwyRUFBMkU7QUFDM0U7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QywyREFBMkQ7QUFDbkc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOzs7Ozs7Ozs7Ozs7O0FDemVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYjs7QUFFQSxJQUFJLElBQXFDO0FBQ3pDLDZCQUE2QixtQkFBTyxDQUFDLHlGQUE0QjtBQUNqRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsVUFBVTtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxNQUFNLElBQXFDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0R0FBNEc7QUFDNUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQ7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7QUMxRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViLGFBQWEsbUJBQU8sQ0FBQyw0REFBZTs7QUFFcEMsMkJBQTJCLG1CQUFPLENBQUMseUZBQTRCO0FBQy9ELHFCQUFxQixtQkFBTyxDQUFDLHFFQUFrQjs7QUFFL0M7O0FBRUEsSUFBSSxJQUFxQztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDViw2QkFBNkI7QUFDN0IsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLEtBQUs7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCw0QkFBNEI7QUFDNUIsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVEsSUFBcUM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxVQUFVLEtBQXFDO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHNCQUFzQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNLEtBQXFDLHdGQUF3RixTQUFNO0FBQ3pJO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFCQUFxQiwyQkFBMkI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTSxLQUFxQyw0RkFBNEYsU0FBTTtBQUM3STtBQUNBOztBQUVBLG1CQUFtQixnQ0FBZ0M7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCLGdDQUFnQztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7O0FDMWlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSSxJQUFxQztBQUN6QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixtQkFBTyxDQUFDLHVGQUEyQjtBQUN0RCxDQUFDLE1BQU0sRUFJTjs7Ozs7Ozs7Ozs7OztBQzNCRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWI7O0FBRUE7Ozs7Ozs7Ozs7OztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkLEtBQUs7QUFDTCxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQSx3Q0FBd0MsV0FBVztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9DQUFvQyxjQUFjO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUMsa0JBQWtCO0FBQ25EO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUI7O0FBRWpCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixpQkFBaUI7QUFDekM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDhDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUEsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLDhDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0EsOENBQThDLFFBQVE7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsOENBQThDLFFBQVE7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtB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QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixXQUFXO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3REEsc0I7Ozs7Ozs7Ozs7O0FDQUEsOEI7Ozs7Ozs7Ozs7O0FDQUEsMkI7Ozs7Ozs7Ozs7O0FDQUEsNEI7Ozs7Ozs7Ozs7O0FDQUEsaUM7Ozs7Ozs7Ozs7O0FDQUEsbUM7Ozs7Ozs7Ozs7O0FDQUEsNkI7Ozs7Ozs7Ozs7O0FDQUEseUI7Ozs7Ozs7Ozs7O0FDQUEsMEI7Ozs7Ozs7Ozs7O0FDQUEsa0M7Ozs7Ozs7Ozs7O0FDQUEsd0I7Ozs7Ozs7Ozs7O0FDQUEsb0MiLCJmaWxlIjoiZWUtZGF0YS1zdG9yZXMuYjljNzQyNjg1YjEwNGZlMzc0MTEuZGlzdC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgYXBpRmV0Y2ggZnJvbSAnQHdvcmRwcmVzcy9hcGktZmV0Y2gnO1xuaW1wb3J0IHtcblx0c2VsZWN0IGFzIHNlbGVjdERhdGEsXG5cdGRpc3BhdGNoIGFzIGRpc3BhdGNoRGF0YSxcblx0c3Vic2NyaWJlLFxufSBmcm9tICdAd29yZHByZXNzL2RhdGEnO1xuaW1wb3J0IHsgcGx1cmFsTW9kZWxOYW1lIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vbW9kZWwnO1xuXG4vKipcbiAqIEludGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgUkVEVUNFUl9LRVkgYXMgQ09SRV9SRURVQ0VSX0tFWSB9IGZyb20gJy4vY29yZS9jb25zdGFudHMnO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGFjdGlvbiBvYmplY3QgZm9yIGEgZmV0Y2ggY29udHJvbC5cbiAqIEBwYXJhbSB7T2JqZWN0fSByZXF1ZXN0XG4gKiBAcmV0dXJuIHt7dHlwZTogc3RyaW5nLCByZXF1ZXN0OiBPYmplY3R9fSBBbiBhY3Rpb24gb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmZXRjaCggcmVxdWVzdCApIHtcblx0cmV0dXJuIHtcblx0XHR0eXBlOiAnRkVUQ0hfRlJPTV9BUEknLFxuXHRcdHJlcXVlc3QsXG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYWN0aW9uIG9iamVjdCBmb3IgYSBzZWxlY3QgY29udHJvbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZWR1Y2VyS2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JOYW1lXG4gKiBAcGFyYW0geypbXX0gYXJnc1xuICogQHJldHVybiB7e3R5cGU6IHN0cmluZywgcmVkdWNlcktleTogc3RyaW5nLCBzZWxlY3Rvck5hbWU6IHN0cmluZywgYXJnczogKltdfX1cbiAqIFJldHVybnMgYW4gYWN0aW9uIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdCggcmVkdWNlcktleSwgc2VsZWN0b3JOYW1lLCAuLi5hcmdzICkge1xuXHRyZXR1cm4ge1xuXHRcdHR5cGU6ICdTRUxFQ1QnLFxuXHRcdHJlZHVjZXJLZXksXG5cdFx0c2VsZWN0b3JOYW1lLFxuXHRcdGFyZ3MsXG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYWN0aW9uIG9iamVjdCBmb3IgcmVzb2x2aW5nIGEgc2VsZWN0b3IgdGhhdCBoYXMgYSByZXNvbHZlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZWR1Y2VyS2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JOYW1lXG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzXG4gKiBAcmV0dXJuIHtPYmplY3R9IEFuIGFjdGlvbiBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU2VsZWN0KCByZWR1Y2VyS2V5LCBzZWxlY3Rvck5hbWUsIC4uLmFyZ3MgKSB7XG5cdHJldHVybiB7XG5cdFx0dHlwZTogJ1JFU09MVkVfU0VMRUNUJyxcblx0XHRyZWR1Y2VyS2V5LFxuXHRcdHNlbGVjdG9yTmFtZSxcblx0XHRhcmdzLFxuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGFjdGlvbiBvYmplY3QgZm9yIGEgZGlzcGF0Y2ggY29udHJvbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZWR1Y2VyS2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hOYW1lXG4gKiBAcGFyYW0geypbXX0gYXJnc1xuICogQHJldHVybiB7e3R5cGU6IHN0cmluZywgcmVkdWNlcktleTogc3RyaW5nLCBkaXNwYXRjaE5hbWU6IHN0cmluZywgYXJnczogKltdfX1cbiAqIEFuIGFjdGlvbiBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3BhdGNoKCByZWR1Y2VyS2V5LCBkaXNwYXRjaE5hbWUsIC4uLmFyZ3MgKSB7XG5cdHJldHVybiB7XG5cdFx0dHlwZTogJ0RJU1BBVENIJyxcblx0XHRyZWR1Y2VyS2V5LFxuXHRcdGRpc3BhdGNoTmFtZSxcblx0XHRhcmdzLFxuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGFjdGlvbiBvYmplY3QgZm9yIGEgcmVzb2x2ZSBkaXNwYXRjaCBjb250cm9sXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZHVjZXJLZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE5hbWVcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3NcbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIGFjdGlvbiBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRGlzcGF0Y2goIHJlZHVjZXJLZXksIGRpc3BhdGNoTmFtZSwgLi4uYXJncyApIHtcblx0cmV0dXJuIHtcblx0XHR0eXBlOiAnUkVTT0xWRV9ESVNQQVRDSCcsXG5cdFx0cmVkdWNlcktleSxcblx0XHRkaXNwYXRjaE5hbWUsXG5cdFx0YXJncyxcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhY3Rpb24gb2JqZWN0IGZvciByZXNvbHZpbmcgdGhlIGdldEVudGl0eUJ5SWQgc2VsZWN0b3JcbiAqIGZvciBhbGwgdGhlIGdpdmVuIGlkcyBvbiB0aGUgZ2l2ZW4gbW9kZWxcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge0FycmF5fSBlbnRpdHlJZHNcbiAqIEByZXR1cm4ge09iamVjdH0gQW4gYWN0aW9uIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUdldEVudGl0eUJ5SWRGb3JJZHMoIG1vZGVsTmFtZSwgZW50aXR5SWRzICkge1xuXHRyZXR1cm4ge1xuXHRcdHR5cGU6ICdSRVNPTFZFX0dFVF9FTlRJVFlfQllfSURfRk9SX0lEUycsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkcyxcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhY3Rpb24gb2JqZWN0IGZvciByZXNvbHZpbmcgdGhlIGdldFJlbGF0ZWRFbnRpdGllcyBzZWxlY3RvclxuICogb24gdGhlIGV2ZW50ZXNwcmVzc28vY29yZSBzdG9yZSBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0ge0Jhc2VFbnRpdHl9IGVudGl0eVxuICogQHBhcmFtIHtNYXB9IHJlbGF0aW9uRW50aXRpZXNcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gcmVsYXRpb25JZHNcbiAqIEByZXR1cm4ge09iamVjdH0gQW4gYWN0aW9uIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUdldFJlbGF0ZWRFbnRpdGllcyhcblx0ZW50aXR5LFxuXHRyZWxhdGlvbkVudGl0aWVzLFxuXHRyZWxhdGlvbklkc1xuKSB7XG5cdHJldHVybiB7XG5cdFx0dHlwZTogJ1JFU09MVkVfR0VUX1JFTEFURURfRU5USVRJRVMnLFxuXHRcdGVudGl0eSxcblx0XHRyZWxhdGlvbkVudGl0aWVzLFxuXHRcdHJlbGF0aW9uSWRzLFxuXHR9O1xufVxuXG5jb25zdCBjb250cm9scyA9IHtcblx0RkVUQ0hfRlJPTV9BUEkoIHsgcmVxdWVzdCB9ICkge1xuXHRcdHJldHVybiBhcGlGZXRjaCggcmVxdWVzdCApO1xuXHR9LFxuXHRTRUxFQ1QoIHsgcmVkdWNlcktleSwgc2VsZWN0b3JOYW1lLCBhcmdzIH0gKSB7XG5cdFx0cmV0dXJuIHNlbGVjdERhdGEoIHJlZHVjZXJLZXkgKVsgc2VsZWN0b3JOYW1lIF0oIC4uLmFyZ3MgKTtcblx0fSxcblx0RElTUEFUQ0goIHsgcmVkdWNlcktleSwgZGlzcGF0Y2hOYW1lLCBhcmdzIH0gKSB7XG5cdFx0cmV0dXJuIGRpc3BhdGNoRGF0YSggcmVkdWNlcktleSApWyBkaXNwYXRjaE5hbWUgXSggLi4uYXJncyApO1xuXHR9LFxuXHRhc3luYyBSRVNPTFZFX0RJU1BBVENIKCB7IHJlZHVjZXJLZXksIGRpc3BhdGNoTmFtZSwgYXJncyB9ICkge1xuXHRcdHJldHVybiBhd2FpdCBkaXNwYXRjaERhdGEoIHJlZHVjZXJLZXkgKVsgZGlzcGF0Y2hOYW1lIF0oIC4uLmFyZ3MgKTtcblx0fSxcblx0UkVTT0xWRV9TRUxFQ1QoIHsgcmVkdWNlcktleSwgc2VsZWN0b3JOYW1lLCBhcmdzIH0gKSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKCAoIHJlc29sdmUgKSA9PiB7XG5cdFx0XHRjb25zdCBoYXNGaW5pc2hlZCA9ICgpID0+IHNlbGVjdERhdGEoICdjb3JlL2RhdGEnIClcblx0XHRcdFx0Lmhhc0ZpbmlzaGVkUmVzb2x1dGlvbiggcmVkdWNlcktleSwgc2VsZWN0b3JOYW1lLCBhcmdzICk7XG5cdFx0XHRjb25zdCBnZXRSZXN1bHQgPSAoKSA9PiBzZWxlY3REYXRhKCByZWR1Y2VyS2V5IClbIHNlbGVjdG9yTmFtZSBdXG5cdFx0XHRcdC5hcHBseSggbnVsbCwgYXJncyApO1xuXG5cdFx0XHQvLyB0cmlnZ2VyIHRoZSBzZWxlY3RvciAodG8gdHJpZ2dlciB0aGUgcmVzb2x2ZXIpXG5cdFx0XHRjb25zdCByZXN1bHQgPSBnZXRSZXN1bHQoKTtcblx0XHRcdGlmICggaGFzRmluaXNoZWQoKSApIHtcblx0XHRcdFx0cmV0dXJuIHJlc29sdmUoIHJlc3VsdCApO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCB1bnN1YnNjcmliZSA9IHN1YnNjcmliZSggKCkgPT4ge1xuXHRcdFx0XHRpZiAoIGhhc0ZpbmlzaGVkKCkgKSB7XG5cdFx0XHRcdFx0dW5zdWJzY3JpYmUoKTtcblx0XHRcdFx0XHRyZXNvbHZlKCBnZXRSZXN1bHQoKSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fSApO1xuXHR9LFxuXHRSRVNPTFZFX0dFVF9FTlRJVFlfQllfSURfRk9SX0lEUyggeyBtb2RlbE5hbWUsIGVudGl0eUlkcyB9ICkge1xuXHRcdHdoaWxlICggZW50aXR5SWRzLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRkaXNwYXRjaERhdGEoXG5cdFx0XHRcdCdjb3JlL2RhdGEnLFxuXHRcdFx0XHQnZmluaXNoUmVzb2x1dGlvbicsXG5cdFx0XHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0XHRcdCdnZXRFbnRpdHlCeUlkJyxcblx0XHRcdFx0WyBtb2RlbE5hbWUsIGVudGl0eUlkcy5wb3AoKSBdXG5cdFx0XHQpO1xuXHRcdH1cblx0XHQvLyBpZiBjb250cm9scyByZXR1cm4gdW5kZWZpbmVkIHRoZW4gZmxvdyBleGVjdXRpb24gc3RvcHMuICBUaGlzIGVuc3VyZXNcblx0XHQvLyB0aGUgZmxvdyBjb250aW51ZXMuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cdFJFU09MVkVfR0VUX1JFTEFURURfRU5USVRJRVMoIHsgZW50aXR5LCByZWxhdGlvbkVudGl0aWVzLCByZWxhdGlvbklkcyB9ICkge1xuXHRcdGNvbnN0IHJlbGF0aW9uRW50aXR5ID0gcmVsYXRpb25FbnRpdGllcy5nZXQoIHJlbGF0aW9uSWRzLnBvcCgpICk7XG5cdFx0aWYgKCByZWxhdGlvbkVudGl0eSApIHtcblx0XHRcdGRpc3BhdGNoRGF0YShcblx0XHRcdFx0J2NvcmUvZGF0YScsXG5cdFx0XHRcdCdmaW5pc2hSZXNvbHV0aW9uJyxcblx0XHRcdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHRcdFx0J2dldFJlbGF0ZWRFbnRpdGllcycsXG5cdFx0XHRcdFsgcmVsYXRpb25FbnRpdHksIHBsdXJhbE1vZGVsTmFtZSggZW50aXR5Lm1vZGVsTmFtZSApIF1cblx0XHRcdCk7XG5cdFx0fVxuXHRcdC8vIGlmIGNvbnRyb2xzIHJldHVybiB1bmRlZmluZWQgdGhlbiBmbG93IGV4ZWN1dGlvbiBzdG9wcy4gIFRoaXMgZW5zdXJlc1xuXHRcdC8vIHRoZSBmbG93IGNvbnRpbnVlcy5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRyb2xzO1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqL1xuaW1wb3J0IHsgdXBwZXJGaXJzdCwgY2FtZWxDYXNlLCByZWR1Y2UsIGlzTWFwLCBpc05hTiB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGx1cmFsaXplIGZyb20gJ3BsdXJhbGl6ZSc7XG5pbXBvcnQgeyBtYXBSZWR1Y2VyIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vaGVscGVycyc7XG5cbi8qKlxuICogQSBoZWxwZXIgZm9yIGdldHRpbmcgYSBtZXRob2QgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdWZmaXhcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdXNlUGx1cmFsXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFJldHVybnMgYSBuYW1lIGZvciBhIG1ldGhvZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldE1ldGhvZE5hbWUgPSAoXG5cdG1vZGVsTmFtZSxcblx0c3VmZml4ID0gJycsXG5cdHByZWZpeCA9ICdnZXQnLFxuXHR1c2VQbHVyYWwgPSBmYWxzZVxuKSA9PiB7XG5cdG1vZGVsTmFtZSA9IHVzZVBsdXJhbCA/IHBsdXJhbGl6ZSggbW9kZWxOYW1lICkgOiBtb2RlbE5hbWU7XG5cdHJldHVybiBwcmVmaXggKyB1cHBlckZpcnN0KCBjYW1lbENhc2UoIG1vZGVsTmFtZSArIHVwcGVyRmlyc3QoIHN1ZmZpeCApICkgKTtcbn07XG5cbi8qKlxuICogR2l2ZW4gYSBjb2xsZWN0aW9uIG9mIGV4aXN0aW5nIGVudGl0aWVzIGFuZCBhIGNvbGxlY3Rpb24gb2YgaW5jb21pbmdcbiAqIGVudGl0aWVzLCB0aGlzIHJldHVybnMgYSBtZXJnZWQgb2JqZWN0IHdpdGggcHJlZmVyZW5jZSBnaXZlbiB0byBjb21tb25cbiAqIGVudGl0aWVzIGZyb20gdGhlIGV4aXN0aW5nRW50aXRpZXMgY29sbGVjdGlvbi5cbiAqXG4gKiBJbmNvbWluZyBjb2xsZWN0aW9ucyBjYW4gYmUgTWFwcyBvciBwbGFpbiBvYmplY3RzLlxuICpcbiAqIE5vdGUgaWYgaW5jb21pbmdFbnRpdGllcyBpcyBhIE1hcCwgdGhlIE9SREVSIG9mIHRoZSBtYXAgd2lsbCBiZSBwcmVzZXJ2ZWRcbiAqIGV2ZW4gaWYgdGhlIHZhbHVlcyBvZiBlbnRpdGllcyBpbiB0aGUgbWFwIGFyZSByZXBsYWNlZCBieSB2YWx1ZXMgZnJvbVxuICogZXhpc3RpbmcgZW50aXRpZXMuXG4gKlxuICogQHBhcmFtIHtNYXB8T2JqZWN0fSBleGlzdGluZ0VudGl0aWVzXG4gKiBAcGFyYW0ge01hcHxPYmplY3R9IGluY29taW5nRW50aXRpZXNcbiAqIEByZXR1cm4ge01hcH0gQSBuZXcgY29sbGVjdGlvbiBvZiBlbnRpdGllcy4gTm90ZSBpZiBleGlzdGluZyBlbnRpdGllcyBjYW1lIGluXG4gKiBhcyBhIHBsYWluIG9iamVjdCwgdGhpcyByZXR1cm5zIGEgTWFwLlxuICovXG5leHBvcnQgY29uc3Qga2VlcEV4aXN0aW5nRW50aXRpZXNJbk9iamVjdCA9IChcblx0ZXhpc3RpbmdFbnRpdGllcyxcblx0aW5jb21pbmdFbnRpdGllcyxcbikgPT4ge1xuXHRjb25zdCBnZXRFeGlzdGluZ09yRGVmYXVsdEVudGl0eSA9ICggZGVmYXVsdEVudGl0eSwgZW50aXR5SWQgKSA9PiB7XG5cdFx0aWYgKCBpc01hcCggZXhpc3RpbmdFbnRpdGllcyApICYmIGV4aXN0aW5nRW50aXRpZXMuaGFzKCBlbnRpdHlJZCApICkge1xuXHRcdFx0cmV0dXJuIGV4aXN0aW5nRW50aXRpZXMuZ2V0KCBlbnRpdHlJZCApO1xuXHRcdH1cblx0XHRyZXR1cm4gZXhpc3RpbmdFbnRpdGllc1sgZW50aXR5SWQgXSB8fCBkZWZhdWx0RW50aXR5O1xuXHR9O1xuXHRjb25zdCByZWR1Y2VDYWxsYmFjayA9ICggbWFwcGVkLCBlbnRpdHksIGVudGl0eUlkICkgPT4ge1xuXHRcdGVudGl0eUlkID0gbm9ybWFsaXplRW50aXR5SWQoIGVudGl0eUlkICk7XG5cdFx0bWFwcGVkLnNldCggZW50aXR5SWQsIGdldEV4aXN0aW5nT3JEZWZhdWx0RW50aXR5KCBlbnRpdHksIGVudGl0eUlkICkgKTtcblx0XHRyZXR1cm4gbWFwcGVkO1xuXHR9O1xuXHRyZXR1cm4gaXNNYXAoIGluY29taW5nRW50aXRpZXMgKSA/XG5cdFx0bWFwUmVkdWNlciggaW5jb21pbmdFbnRpdGllcywgcmVkdWNlQ2FsbGJhY2ssIG5ldyBNYXAoKSApIDpcblx0XHRyZWR1Y2UoIGluY29taW5nRW50aXRpZXMsIHJlZHVjZUNhbGxiYWNrLCBuZXcgTWFwKCkgKTtcbn07XG5cbi8qKlxuICogVGhpcyBub3JtYWxpemVzIG51bWVyaWMgdmFsdWVzIHRvIGludGVnZXIgbnVtYmVycyBhbmQgbGVhdmVzIG5vbiBudW1lcmljXG4gKiB2YWx1ZXMgYWxvbmUuXG4gKlxuICogQHBhcmFtIHsqfSBlbnRpdHlJZFxuICogQHJldHVybiB7Kn0gTm9ybWFsaXplZCB2YWx1ZVxuICovXG5jb25zdCBub3JtYWxpemVFbnRpdHlJZCA9ICggZW50aXR5SWQgKSA9PiB7XG5cdGNvbnN0IG9yaWdpbmFsSWQgPSBlbnRpdHlJZDtcblx0ZW50aXR5SWQgPSBwYXJzZUludCggZW50aXR5SWQsIDEwICk7XG5cdHJldHVybiBpc05hTiggZW50aXR5SWQgKSA/IG9yaWdpbmFsSWQgOiBlbnRpdHlJZDtcbn07XG4iLCIvKipcbiAqIEV4dGVybmFsIGRlcGVuZGVuY2llc1xuICovXG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICdAd29yZHByZXNzL2RhdGEnO1xuXG4vKipcbiAqIEludm9rZXMgdGhlIHNlbGVjdG9yIGZvciB3aGV0aGVyIGEgZ2l2ZW4gc2VsZWN0b3JOYW1lIGluIGEgZ2l2ZW4gcmVnaXN0ZXJlZFxuICogcmVkdWNlciBzdG9yZSBpcyBpbiB0aGUgbWlkc3Qgb2YgcmVzb2x2aW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZHVjZXJLZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3Rvck5hbWVcbiAqIEBwYXJhbSB7KltdfSBhcmdzXG4gKiBAcmV0dXJuIHtib29sZWFufSAgV2hldGhlciByZXNvbHV0aW9uIGlzIGluIHByb2dyZXNzLlxuICovXG5leHBvcnQgY29uc3QgaXNSZXNvbHZpbmcgPSAoIHJlZHVjZXJLZXksIHNlbGVjdG9yTmFtZSwgLi4uYXJncyApID0+IHtcblx0cmV0dXJuIHNlbGVjdCggJ2NvcmUvZGF0YScgKS5pc1Jlc29sdmluZyggcmVkdWNlcktleSwgc2VsZWN0b3JOYW1lLCBhcmdzICk7XG59O1xuXG4vKipcbiAqIEludm9rZXMgdGhlIHNlbGVjdG9yIGZvciB3aGV0aGVyIGEgZ2l2ZW4gc2VsZWN0b3JOYW1lIGluIGEgZ2l2ZW4gcmVnaXN0ZXJlZFxuICogcmVkdWNlciBzdG9yZSBoYXMgZmluaXNoZWQgcmVzb2x2aW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWR1Y2VyS2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JOYW1lXG4gKiBAcGFyYW0geypbXX0gYXJnc1xuICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciByZXNvbHV0aW9uIGhhcyBjb21wbGV0ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBoYXNGaW5pc2hlZFJlc29sdmluZyA9ICggcmVkdWNlcktleSwgc2VsZWN0b3JOYW1lLCAuLi5hcmdzICkgPT4ge1xuXHRyZXR1cm4gc2VsZWN0KCAnY29yZS9kYXRhJyApXG5cdFx0Lmhhc0ZpbmlzaGVkUmVzb2x1dGlvbiggcmVkdWNlcktleSwgc2VsZWN0b3JOYW1lLCBhcmdzICk7XG59O1xuIiwiZXhwb3J0ICogZnJvbSAnLi9yZWNlaXZlLWVudGl0aWVzJztcbmV4cG9ydCAqIGZyb20gJy4vcmVjZWl2ZS1yZWxhdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9yZW1vdmUtZW50aXRpZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9yZW1vdmUtcmVsYXRpb25zJztcbiIsImV4cG9ydCAqIGZyb20gJy4vY3JlYXRlLWVudGl0aWVzLWdlbmVyYXRvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9jcmVhdGUtcmVsYXRpb25zLWdlbmVyYXRvcnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9kZWxldGUtZW50aXR5LWdlbmVyYXRvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9kZWxldGUtcmVsYXRpb25zLWdlbmVyYXRvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9wZXJzaXN0LWVudGl0eS1nZW5lcmF0b3JzJztcbmV4cG9ydCAqIGZyb20gJy4vcGVyc2lzdC1yZWxhdGlvbnMtZ2VuZXJhdG9ycyc7XG4iLCJjb25zdCBlbnRpdGllcyA9IHtcblx0UkVDRUlWRV9FTlRJVFlfUkVDT1JEUzogJ1JFQ0VJVkVfRU5USVRZX1JFQ09SRFMnLFxuXHRSRUNFSVZFX0FORF9SRVBMQUNFX0VOVElUWV9SRUNPUkRTOiAnUkVDRUlWRV9BTkRfUkVQTEFDRV9FTlRJVFlfUkVDT1JEUycsXG5cdFJFQ0VJVkVfRU5USVRZOiAnUkVDRUlWRV9FTlRJVFknLFxuXHRSRU1PVkVfRU5USVRZX0JZX0lEOiAnUkVNT1ZFX0VOVElUWV9CWV9JRCcsXG5cdFJFTU9WRV9ERUxFVEVfRU5USVRZX0lEOiAnUkVNT1ZFX0RFTEVURV9FTlRJVFlfSUQnLFxuXHRSRU1PVkVfVFJBU0hfRU5USVRZX0lEOiAnUkVNT1ZFX1RSQVNIX0VOVElUWV9JRCcsXG5cdFJFQ0VJVkVfVFJBU0hfRU5USVRZX0lEOiAnUkVDRUlWRV9UUkFTSF9FTlRJVFlfSUQnLFxuXHRSRUNFSVZFX0RFTEVURV9FTlRJVFlfSUQ6ICdSRUNFSVZFX0RFTEVURV9FTlRJVFlfSUQnLFxufTtcbmNvbnN0IHJlbGF0aW9ucyA9IHtcblx0UkVNT1ZFX0RJUlRZX1JFTEFUSU9OX0FERElUSU9OOiAnUkVNT1ZFX0RJUlRZX1JFTEFUSU9OX0FERElUSU9OJyxcblx0UkVNT1ZFX0RJUlRZX1JFTEFUSU9OX0RFTEVUSU9OOiAnUkVNT1ZFX0RJUlRZX1JFTEFUSU9OX0RFTEVUSU9OJyxcblx0UkVDRUlWRV9SRUxBVEVEX0VOVElUWV9JRFM6ICdSRUNFSVZFX1JFTEFURURfRU5USVRZX0lEUycsXG5cdFJFTU9WRV9SRUxBVEVEX0VOVElUWV9JRFM6ICdSRU1PVkVfUkVMQVRFRF9FTlRJVFlfSURTJyxcblx0UkVNT1ZFX1JFTEFURURfRU5USVRJRVNfRk9SX0VOVElUWTogJ1JFTU9WRV9SRUxBVEVEX0VOVElUSUVTX0ZPUl9FTlRJVFknLFxuXHRSRUNFSVZFX0RJUlRZX1JFTEFUSU9OX0FERElUSU9OOiAnUkVDRUlWRV9ESVJUWV9SRUxBVElPTl9BRERJVElPTicsXG5cdFJFQ0VJVkVfRElSVFlfUkVMQVRJT05fREVMRVRJT046ICdSRUNFSVZFX0RJUlRZX1JFTEFUSU9OX0RFTEVUSU9OJyxcblx0UkVDRUlWRV9VUERBVEVEX0VOVElUWV9JRF9GT1JfUkVMQVRJT05TOlxuXHRcdCdSRUNFSVZFX1VQREFURURfRU5USVRZX0lEX0ZPUl9SRUxBVElPTlMnLFxufTtcbmNvbnN0IHJlc2V0cyA9IHtcblx0UkVTRVRfQUxMX1NUQVRFOiAnUkVTRVRfQUxMX1NUQVRFJyxcblx0UkVTRVRfU1RBVEVfRk9SX01PREVMOiAnUkVTRVRfU1RBVEVfRk9SX01PREVMJyxcblx0UkVTRVRfQUxMX01PREVMX1NQRUNJRklDOiAnUkVTRVRfQUxMX01PREVMX1NQRUNJRklDX1NUQVRFJyxcblx0UkVTRVRfTU9ERUxfU1BFQ0lGSUNfRk9SX1NFTEVDVE9SOiAnUkVTRVRfTU9ERUxfU1BFQ0lGSUNfRk9SX1NFTEVDVE9SJyxcbn07XG5cbmNvbnN0IG1vZGVsU3BlY2lmaWMgPSB7XG5cdFJFQ0VJVkVfU0VMRUNUT1JfVkFMVUU6ICdSRUNFSVZFX1NFTEVDVE9SX1ZBTFVFJyxcbn07XG5cbmV4cG9ydCBjb25zdCBBQ1RJT05fVFlQRVMgPSB7IGVudGl0aWVzLCByZWxhdGlvbnMsIG1vZGVsU3BlY2lmaWMsIHJlc2V0cyB9O1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7XG5cdGlzTW9kZWxFbnRpdHlGYWN0b3J5T2ZNb2RlbCxcblx0aXNNb2RlbEVudGl0eSxcbn0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vdmFsaWRhdG9ycyc7XG5pbXBvcnQgeyBJbnZhbGlkTW9kZWxFbnRpdHkgfSBmcm9tICdAZXZlbnRlc3ByZXNzby9lZWpzJztcblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IHJlc29sdmVTZWxlY3QsIGRpc3BhdGNoIH0gZnJvbSAnLi4vLi4vYmFzZS1jb250cm9scyc7XG5pbXBvcnQgeyBSRURVQ0VSX0tFWSBhcyBTQ0hFTUFfUkVEVUNFUl9LRVkgfSBmcm9tICcuLi8uLi9zY2hlbWEvY29uc3RhbnRzJztcbmltcG9ydCB7IFJFRFVDRVJfS0VZIGFzIENPUkVfUkVEVUNFUl9LRVkgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuXG4vKipcbiAqIFJldHVybnMgYW4gYWN0aW9uIGdlbmVyYXRvciBmb3IgY3JlYXRpbmcgYSBtb2RlbCBlbnRpdHkgaW5zdGFuY2UgYW5kXG4gKiBpbmNsdWRpbmcgaXQgaW4gYW4gYWN0aW9uIG9iamVjdCBmb3IgYWRkaW5nIHRvIHN0YXRlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWUgIFRoZSBuYW1lIG9mIHRoZSBtb2RlbCB0aGUgaW5jb21pbmcgb2JqZWN0IGlzIGZvci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBlbnRpdHkgIEEgcGxhaW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGVudGl0eSBwcm9wZXJ0aWVzIGFuZFxuICogdmFsdWVzXG4gKiBAcmV0dXJuIHtudWxsfE9iamVjdH0gIElmIHRoZSBlbnRpdHkgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgdGhlIG1vZGVsIGVudGl0eVxuICogaW5zdGFuY2UgaXMgcmV0dXJuZWQsIG90aGVyd2lzZSBudWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24qIGNyZWF0ZUVudGl0eSggbW9kZWxOYW1lLCBlbnRpdHkgKSB7XG5cdGNvbnN0IGZhY3RvcnkgPSB5aWVsZCByZXNvbHZlU2VsZWN0KFxuXHRcdFNDSEVNQV9SRURVQ0VSX0tFWSxcblx0XHQnZ2V0RmFjdG9yeUZvck1vZGVsJyxcblx0XHRtb2RlbE5hbWVcblx0KTtcblx0aWYgKCAhIGlzTW9kZWxFbnRpdHlGYWN0b3J5T2ZNb2RlbCggZmFjdG9yeSwgbW9kZWxOYW1lICkgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0Y29uc3QgZW50aXR5SW5zdGFuY2UgPSBmYWN0b3J5LmNyZWF0ZU5ldyggZW50aXR5ICk7XG5cdHlpZWxkIGRpc3BhdGNoKFxuXHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0J3JlY2VpdmVFbnRpdHlBbmRSZXNvbHZlJyxcblx0XHRlbnRpdHlJbnN0YW5jZVxuXHQpO1xuXHRyZXR1cm4gZW50aXR5SW5zdGFuY2U7XG59XG5cbi8qKlxuICogR2VuZXJhdG9yIGZvciB5aWVsZGluZyBhY3Rpb25zIGZvciBib3RoIHJlY2VpdmluZyBhXG4gKiBCYXNlRW50aXR5IGluc3RhbmNlIGFuZCByZXNvbHZpbmcgdGhlIHJlbGF0ZWQgc2VsZWN0b3IgZm9yIHJldHJpZXZpbmcgdGhhdFxuICogZW50aXR5IGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSB7QmFzZUVudGl0eX0gZW50aXR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiogcmVjZWl2ZUVudGl0eUFuZFJlc29sdmUoIGVudGl0eSApIHtcblx0YXNzZXJ0SXNNb2RlbEVudGl0eSggZW50aXR5ICk7XG5cdHlpZWxkIGRpc3BhdGNoKFxuXHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0J3JlY2VpdmVFbnRpdHknLFxuXHRcdGVudGl0eVxuXHQpO1xuXHR5aWVsZCBkaXNwYXRjaChcblx0XHQnY29yZS9kYXRhJyxcblx0XHQnZmluaXNoUmVzb2x1dGlvbicsXG5cdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHQnZ2V0RW50aXR5QnlJZCcsXG5cdFx0WyBlbnRpdHkubW9kZWxOYW1lLnRvTG93ZXJDYXNlKCksIGVudGl0eS5pZCBdXG5cdCk7XG59XG5cbi8qKlxuICogU2FtZSBhcyByZWNlaXZlc0VudGl0eUFuZFJlc29sdmUgZXhjZXB0IHRoaXMgaGFuZGxlcyBtdWx0aXBsZSBlbnRpdGllcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7QXJyYXk8QmFzZUVudGl0eT59ZW50aXRpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uKiByZWNlaXZlRW50aXRpZXNBbmRSZXNvbHZlKCBtb2RlbE5hbWUsIGVudGl0aWVzICkge1xuXHRjb25zdCBlbnRpdHlJZHMgPSBlbnRpdGllcy5tYXAoXG5cdFx0KCBlbnRpdHkgKSA9PiB7XG5cdFx0XHRhc3NlcnRJc01vZGVsRW50aXR5KCBlbnRpdHkgKTtcblx0XHRcdHJldHVybiBlbnRpdHkuaWQ7XG5cdFx0fVxuXHQpO1xuXHR3aGlsZSAoIGVudGl0eUlkcy5sZW5ndGggPiAwICkge1xuXHRcdHlpZWxkIGRpc3BhdGNoKFxuXHRcdFx0J2NvcmUvZGF0YScsXG5cdFx0XHQnZmluaXNoUmVzb2x1dGlvbicsXG5cdFx0XHRDT1JFX1JFRFVDRVJfS0VZLFxuXHRcdFx0J2dldEVudGl0eUJ5SWQnLFxuXHRcdFx0WyBtb2RlbE5hbWUsIGVudGl0eUlkcy5wb3AoKSBdXG5cdFx0KTtcblx0fVxuXHR5aWVsZCBkaXNwYXRjaChcblx0XHRDT1JFX1JFRFVDRVJfS0VZLFxuXHRcdCdyZWNlaXZlRW50aXR5UmVjb3JkcycsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0aWVzLFxuXHQpO1xufVxuXG4vKipcbiAqIEFzc2VydHMgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBtb2RlbCBlbnRpdHkgYW5kIHRocm93c1xuICogSW52YWxpZE1vZGVsRW50aXR5IGlmIGl0IGlzIG5vdC5cbiAqXG4gKiBAcGFyYW0ge0Jhc2VFbnRpdHl9IGVudGl0eVxuICogQHRocm93cyBJbnZhbGlkTW9kZWxFbnRpdHlcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0SXNNb2RlbEVudGl0eSggZW50aXR5ICkge1xuXHRpZiAoICEgaXNNb2RlbEVudGl0eSggZW50aXR5ICkgKSB7XG5cdFx0dGhyb3cgbmV3IEludmFsaWRNb2RlbEVudGl0eShcblx0XHRcdCdyZWNlaXZlRW50aXR5SWRBbmRSZXNvbHZlIGV4cGVjdHMgYW4gaW5zdGFuY2Ugb2YgQmFzZUVudGl0eScsXG5cdFx0XHRlbnRpdHksXG5cdFx0KTtcblx0fVxufVxuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IGlzTW9kZWxFbnRpdHlPZk1vZGVsIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vdmFsaWRhdG9ycyc7XG5pbXBvcnQge1xuXHRzaW5ndWxhck1vZGVsTmFtZSxcblx0cGx1cmFsTW9kZWxOYW1lLFxufSBmcm9tICdAZXZlbnRlc3ByZXNzby9tb2RlbCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJztcbmltcG9ydCB7IEludmFsaWRNb2RlbEVudGl0eSB9IGZyb20gJ0BldmVudGVzcHJlc3NvL2VlanMnO1xuaW1wb3J0IHsgZ2V0SWRzRnJvbUJhc2VFbnRpdHlBcnJheSB9IGZyb20gJ0BldmVudGVzcHJlc3NvL2hlbHBlcnMnO1xuXG4vKipcbiAqIEludGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgZGlzcGF0Y2gsIHNlbGVjdCwgcmVzb2x2ZVNlbGVjdCB9IGZyb20gJy4uLy4uL2Jhc2UtY29udHJvbHMnO1xuaW1wb3J0IHsgUkVEVUNFUl9LRVkgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuXG4vKipcbiAqIEFjdGlvbiBnZW5lcmF0b3IgeWllbGRpbmcgYWN0aW9ucyB0aGF0IGFkZCB0aGUgcmVsYXRpb24gdG8gdGhlIHN0YXRlIGZvciBhXG4gKiBzaW5nbGUgcmVsYXRpb24gZW50aXR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbnRpdHlJZFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uTmFtZVxuICogQHBhcmFtIHtCYXNlRW50aXR5fSByZWxhdGlvbkVudGl0eVxuICovXG5mdW5jdGlvbiogY3JlYXRlUmVsYXRpb24oXG5cdG1vZGVsTmFtZSxcblx0ZW50aXR5SWQsXG5cdHJlbGF0aW9uTmFtZSxcblx0cmVsYXRpb25FbnRpdHlcbikge1xuXHRyZWxhdGlvbk5hbWUgPSBwbHVyYWxNb2RlbE5hbWUoIHJlbGF0aW9uTmFtZSApO1xuXHRjb25zdCBzaW5ndWxhclJlbGF0aW9uTmFtZSA9IHNpbmd1bGFyTW9kZWxOYW1lKCByZWxhdGlvbk5hbWUgKTtcblx0aWYgKCAhIGlzTW9kZWxFbnRpdHlPZk1vZGVsKCByZWxhdGlvbkVudGl0eSwgc2luZ3VsYXJSZWxhdGlvbk5hbWUgKSApIHtcblx0XHR3YXJuaW5nKFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHQnVGhlIHByb3ZpZGVkIHJlbGF0aW9uIGVudGl0eSAoJXMpIGlzIG5vdCBhIGJhc2UgZW50aXR5IGluc3RhbmNlJyArXG5cdFx0XHQnIGZvciB0aGUgJXMgcmVsYXRpb24gbW9kZWwnLFxuXHRcdFx0cmVsYXRpb25FbnRpdHksXG5cdFx0XHRyZWxhdGlvbk5hbWVcblx0XHQpO1xuXHRcdHJldHVybjtcblx0fVxuXHR5aWVsZCBkaXNwYXRjaChcblx0XHRSRURVQ0VSX0tFWSxcblx0XHQncmVjZWl2ZUVudGl0eUFuZFJlc29sdmUnLFxuXHRcdHJlbGF0aW9uRW50aXR5XG5cdCk7XG5cdHlpZWxkIGRpc3BhdGNoKFxuXHRcdFJFRFVDRVJfS0VZLFxuXHRcdCdyZWNlaXZlUmVsYXRlZEVudGl0aWVzJyxcblx0XHRtb2RlbE5hbWUsXG5cdFx0ZW50aXR5SWQsXG5cdFx0cmVsYXRpb25OYW1lLFxuXHRcdFsgcmVsYXRpb25FbnRpdHkuaWQgXVxuXHQpO1xuXHR5aWVsZCBkaXNwYXRjaChcblx0XHRSRURVQ0VSX0tFWSxcblx0XHQncmVjZWl2ZURpcnR5UmVsYXRpb25BZGRpdGlvbicsXG5cdFx0cmVsYXRpb25OYW1lLFxuXHRcdHJlbGF0aW9uRW50aXR5LmlkLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHlJZCxcblx0KTtcbn1cblxuLyoqXG4gKiBBY3Rpb24gZ2VuZXJhdG9yIHlpZWxkaW5nIGFjdGlvbnMgdGhhdCBhZGQgdGhlIHJlbGF0aW9uIHRvIHRoZSBzdGF0ZSBmb3JcbiAqIG11bHRpcGxlIHJlbGF0aW9uIGVudGl0aWVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbnRpdHlJZFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uTmFtZVxuICogQHBhcmFtIHtBcnJheTxCYXNlRW50aXR5Pn0gcmVsYXRpb25FbnRpdGllc1xuICovXG5mdW5jdGlvbiogY3JlYXRlUmVsYXRpb25zKFxuXHRtb2RlbE5hbWUsXG5cdGVudGl0eUlkLFxuXHRyZWxhdGlvbk5hbWUsXG5cdHJlbGF0aW9uRW50aXRpZXMsXG4pIHtcblx0cmVsYXRpb25OYW1lID0gcGx1cmFsTW9kZWxOYW1lKCByZWxhdGlvbk5hbWUgKTtcblx0Y29uc3Qgc2luZ3VsYXJSZWxhdGlvbk5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggcmVsYXRpb25OYW1lICk7XG5cdGNvbnN0IHBsdXJhbFJlbGF0aW9uTmFtZSA9IHBsdXJhbE1vZGVsTmFtZSggcmVsYXRpb25OYW1lICk7XG5cblx0dHJ5IHtcblx0XHRhc3NlcnRBcnJheUhhc0VudGl0aWVzRm9yTW9kZWwoIHJlbGF0aW9uRW50aXRpZXMsIHNpbmd1bGFyUmVsYXRpb25OYW1lICk7XG5cdH0gY2F0Y2ggKCBleGNlcHRpb24gKSB7XG5cdFx0d2FybmluZyhcblx0XHRcdGZhbHNlLFxuXHRcdFx0J0luY29taW5nIHJlbGF0aW9uIEVudGl0aWVzIGRvIG5vdCBjb250YWluIEJhc2VFbnRpdHkgaW5zdGFuY2VzICcgK1xuXHRcdFx0J2ZvciB0aGUgZ2l2ZW4gcmVsYXRpb24gbW9kZWwgKCVzKScsXG5cdFx0XHQnJyxcblx0XHRcdHNpbmd1bGFyUmVsYXRpb25OYW1lLFxuXHRcdCk7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGNvbnN0IHJlbGF0aW9uSWRzID0gZ2V0SWRzRnJvbUJhc2VFbnRpdHlBcnJheSggcmVsYXRpb25FbnRpdGllcyApO1xuXHR5aWVsZCBkaXNwYXRjaChcblx0XHRSRURVQ0VSX0tFWSxcblx0XHQncmVjZWl2ZUVudGl0aWVzQW5kUmVzb2x2ZScsXG5cdFx0c2luZ3VsYXJSZWxhdGlvbk5hbWUsXG5cdFx0cmVsYXRpb25FbnRpdGllc1xuXHQpO1xuXHR5aWVsZCBkaXNwYXRjaChcblx0XHRSRURVQ0VSX0tFWSxcblx0XHQncmVjZWl2ZVJlbGF0ZWRFbnRpdGllcycsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkLFxuXHRcdHJlbGF0aW9uTmFtZSxcblx0XHRyZWxhdGlvbklkcyxcblx0KTtcblx0Y29uc3QgbW9kZWxFbnRpdHkgPSB5aWVsZCByZXNvbHZlU2VsZWN0KFxuXHRcdFJFRFVDRVJfS0VZLFxuXHRcdCdnZXRFbnRpdHlCeUlkJyxcblx0XHRtb2RlbE5hbWUsXG5cdFx0ZW50aXR5SWQsXG5cdCk7XG5cdHlpZWxkIGRpc3BhdGNoKFxuXHRcdCdjb3JlL2RhdGEnLFxuXHRcdCdmaW5pc2hSZXNvbHV0aW9uJyxcblx0XHRSRURVQ0VSX0tFWSxcblx0XHQnZ2V0UmVsYXRlZEVudGl0aWVzJyxcblx0XHRbIG1vZGVsRW50aXR5LCBwbHVyYWxSZWxhdGlvbk5hbWUgXVxuXHQpO1xuXHRjb25zdCByZWxhdGlvbnNUb1Jlc29sdmUgPSBbIC4uLnJlbGF0aW9uRW50aXRpZXMgXTtcblx0d2hpbGUgKCByZWxhdGlvbnNUb1Jlc29sdmUubGVuZ3RoID4gMCApIHtcblx0XHRjb25zdCByZWxhdGlvbkVudGl0eSA9IHJlbGF0aW9uc1RvUmVzb2x2ZS5wb3AoKTtcblx0XHR5aWVsZCBkaXNwYXRjaChcblx0XHRcdFJFRFVDRVJfS0VZLFxuXHRcdFx0J3JlY2VpdmVEaXJ0eVJlbGF0aW9uQWRkaXRpb24nLFxuXHRcdFx0cmVsYXRpb25OYW1lLFxuXHRcdFx0cmVsYXRpb25FbnRpdHkuaWQsXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRlbnRpdHlJZCxcblx0XHQpO1xuXHRcdHlpZWxkIGRpc3BhdGNoKFxuXHRcdFx0J2NvcmUvZGF0YScsXG5cdFx0XHQnZmluaXNoUmVzb2x1dGlvbicsXG5cdFx0XHRSRURVQ0VSX0tFWSxcblx0XHRcdCdnZXRSZWxhdGVkRW50aXRpZXMnLFxuXHRcdFx0WyByZWxhdGlvbkVudGl0eSwgcGx1cmFsTW9kZWxOYW1lKCBtb2RlbE5hbWUgKSBdXG5cdFx0KTtcblx0fVxufVxuXG4vKipcbiAqIFRoaXMgYWN0aW9uIGlzIHVzZWQgdG8gZW5zdXJlIGEgcmVsYXRpb24gRW50aXR5IHJlbGF0ZWQgdG8gdGhlIGdpdmVuXG4gKiBtb2RlbCBlbnRpdHkgaWQgaXMgYm90aCBhZGRlZCB0byB0aGUgc3RhdGUgYW5kIHZhcmlvdXMgc2VsZWN0b3JzIGZvciB0aGVzZVxuICogYXJlIHJlc29sdmVkIHNvIG5vIGFkZGl0aW9uYWwgcmVzb2x1dGlvbiBoYXBwZW5zIGZvciB0aGVzZS5cbiAqXG4gKiBUaGUgcHVycG9zZSBmb3IgdGhpcyBhY3Rpb24gaXMgdG8gYWxsb3cgZm9yIGRvaW5nIG1vcmUgZWZmaWNpZW50IGJhdGNoXG4gKiBxdWVyaWVzIG9mIGVudGl0aWVzIGZyb20gYW4gYXBpIHJlcXVlc3QgYW5kIHRoZW4gdHJpZ2dlcmluZyB0aGUgcmVzb2x1dGlvbiBvZlxuICogYW55IG1vcmUgZ3JhbnVsYXIgc2VsZWN0b3JzIHRoYXQgaGF2ZSByZXNvbHZlcnMuICBUaGlzIGJhc2ljYWxseSBhbGxvd3Mgb25lXG4gKiB0byBoeWRyYXRlIHRoZSBgZXZlbnRlc3ByZXNzby9jb3JlYCBzdGF0ZSB3aXRoIG1vcmUgZWZmaWNpZW50IHF1ZXJpZXMuXG4gKlxuICogQHBhcmFtIHtCYXNlRW50aXR5fSByZWxhdGlvbkVudGl0eVxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBtb2RlbElkXG4gKi9cbmZ1bmN0aW9uKiByZXNvbHZlUmVsYXRpb25SZWNvcmRGb3JSZWxhdGlvbihcblx0cmVsYXRpb25FbnRpdHksXG5cdG1vZGVsTmFtZSxcblx0bW9kZWxJZFxuKSB7XG5cdGNvbnN0IHNpbmd1bGFyUmVsYXRpb25OYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIHJlbGF0aW9uRW50aXR5Lm1vZGVsTmFtZSApO1xuXHRjb25zdCBwbHVyYWxSZWxhdGlvbk5hbWUgPSBwbHVyYWxNb2RlbE5hbWUoIHJlbGF0aW9uRW50aXR5Lm1vZGVsTmFtZSApO1xuXHRjb25zdCBoYXNFbnRpdHkgPSB5aWVsZCBzZWxlY3QoXG5cdFx0J2NvcmUvZGF0YScsXG5cdFx0J2hhc0ZpbmlzaGVkUmVzb2x1dGlvbicsXG5cdFx0UkVEVUNFUl9LRVksXG5cdFx0J2dldEVudGl0eUJ5SWQnLFxuXHRcdFsgc2luZ3VsYXJSZWxhdGlvbk5hbWUsIHJlbGF0aW9uRW50aXR5LmlkIF1cblx0KTtcblx0cmVsYXRpb25FbnRpdHkgPSBoYXNFbnRpdHkgP1xuXHRcdHlpZWxkIHNlbGVjdChcblx0XHRcdFJFRFVDRVJfS0VZLFxuXHRcdFx0J2dldEVudGl0eUJ5SWQnLFxuXHRcdFx0c2luZ3VsYXJSZWxhdGlvbk5hbWUsXG5cdFx0XHRyZWxhdGlvbkVudGl0eS5pZFxuXHRcdCkgOlxuXHRcdHJlbGF0aW9uRW50aXR5O1xuXHRpZiAoICEgaGFzRW50aXR5ICkge1xuXHRcdHlpZWxkIGRpc3BhdGNoKFxuXHRcdFx0UkVEVUNFUl9LRVksXG5cdFx0XHQncmVjZWl2ZUVudGl0eUFuZFJlc29sdmUnLFxuXHRcdFx0cmVsYXRpb25FbnRpdHlcblx0XHQpO1xuXHR9XG5cdHlpZWxkIGRpc3BhdGNoKFxuXHRcdFJFRFVDRVJfS0VZLFxuXHRcdCdyZWNlaXZlUmVsYXRlZEVudGl0aWVzJyxcblx0XHRtb2RlbE5hbWUsXG5cdFx0bW9kZWxJZCxcblx0XHRwbHVyYWxSZWxhdGlvbk5hbWUsXG5cdFx0WyByZWxhdGlvbkVudGl0eS5pZCBdXG5cdCk7XG5cdGNvbnN0IG1vZGVsRW50aXR5ID0geWllbGQgcmVzb2x2ZVNlbGVjdChcblx0XHRSRURVQ0VSX0tFWSxcblx0XHQnZ2V0RW50aXR5QnlJZCcsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdG1vZGVsSWRcblx0KTtcblx0eWllbGQgZGlzcGF0Y2goXG5cdFx0J2NvcmUvZGF0YScsXG5cdFx0J2ZpbmlzaFJlc29sdXRpb24nLFxuXHRcdFJFRFVDRVJfS0VZLFxuXHRcdCdnZXRSZWxhdGVkRW50aXRpZXMnLFxuXHRcdFsgbW9kZWxFbnRpdHksIHBsdXJhbFJlbGF0aW9uTmFtZSBdXG5cdCk7XG5cdHlpZWxkIGRpc3BhdGNoKFxuXHRcdCdjb3JlL2RhdGEnLFxuXHRcdCdmaW5pc2hSZXNvbHV0aW9uJyxcblx0XHRSRURVQ0VSX0tFWSxcblx0XHQnZ2V0UmVsYXRlZEVudGl0aWVzJyxcblx0XHRbIHJlbGF0aW9uRW50aXR5LCBwbHVyYWxNb2RlbE5hbWUoIG1vZGVsTmFtZSApIF1cblx0KTtcbn1cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgdGhlIHByb3ZpZGVkIG1hcCBoYXMgQmFzZUVudGl0eSBpbnN0YW5jZXMgZm9yIHRoZSBleHBlY3RlZFxuICogbW9kZWwgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PEJhc2VFbnRpdHk+fSBlbnRpdGllc1xuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uTW9kZWxOYW1lIEV4cGVjdGVkIHRvIGJlIHRoZSBzaW5ndWxhciBmb3JtIGZvciB0aGVcbiAqIG1vZGVsTmFtZS5cbiAqIEB0aHJvd3MgSW52YWxpZE1vZGVsRW50aXR5XG4gKi9cbmNvbnN0IGFzc2VydEFycmF5SGFzRW50aXRpZXNGb3JNb2RlbCA9ICggZW50aXRpZXMsIHJlbGF0aW9uTW9kZWxOYW1lICkgPT4ge1xuXHRmb3IgKCBjb25zdCBlbnRpdHkgb2YgZW50aXRpZXMgKSB7XG5cdFx0aWYgKCAhIGlzTW9kZWxFbnRpdHlPZk1vZGVsKCBlbnRpdHksIHJlbGF0aW9uTW9kZWxOYW1lICkgKSB7XG5cdFx0XHR0aHJvdyBuZXcgSW52YWxpZE1vZGVsRW50aXR5KCAnJywgZW50aXR5ICk7XG5cdFx0fVxuXHR9XG59O1xuXG5leHBvcnQgeyBjcmVhdGVSZWxhdGlvbiwgY3JlYXRlUmVsYXRpb25zLCByZXNvbHZlUmVsYXRpb25SZWNvcmRGb3JSZWxhdGlvbiB9O1xuIiwiLyoqXG4gKiBJbnRlcm5hbCBJbXBvcnRzXG4gKi9cbmltcG9ydCB7IHJlbW92ZUVudGl0eUJ5SWQgfSBmcm9tICcuL3JlbW92ZS1lbnRpdGllcyc7XG5pbXBvcnQge1xuXHRyZWNlaXZlVHJhc2hFbnRpdHlJZCxcblx0cmVjZWl2ZURlbGV0ZUVudGl0eUlkLFxufSBmcm9tICcuL3JlY2VpdmUtZW50aXRpZXMnO1xuaW1wb3J0IHsgcmVtb3ZlQWxsUmVsYXRlZEVudGl0aWVzRm9yTW9kZWxFbnRpdHkgfSBmcm9tICcuL3JlbW92ZS1yZWxhdGlvbnMnO1xuXG4vKipcbiAqIEFjdGlvbiBnZW5lcmF0b3IgeWllbGRpbmcgYWN0aW9ucyBmb3IgcXVldWluZyBhbiBlbnRpdHkgZGVsZXRlIHJlY29yZFxuICogaW4gdGhlIHN0YXRlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbnRpdHlJZFxuICovXG5leHBvcnQgZnVuY3Rpb24qIGRlbGV0ZUVudGl0eUJ5SWQoIG1vZGVsTmFtZSwgZW50aXR5SWQgKSB7XG5cdHlpZWxkIHJlbW92ZUVudGl0eUJ5SWQoIG1vZGVsTmFtZSwgZW50aXR5SWQgKTtcblx0Ly8gcmVtb3ZlIGFueSByZWxhdGlvbiByZWNvcmRzIGZvciB0aGlzIGVudGl0eVxuXHR5aWVsZCByZW1vdmVBbGxSZWxhdGVkRW50aXRpZXNGb3JNb2RlbEVudGl0eSggbW9kZWxOYW1lLCBlbnRpdHlJZCApO1xuXHR5aWVsZCByZWNlaXZlRGVsZXRlRW50aXR5SWQoIG1vZGVsTmFtZSwgZW50aXR5SWQgKTtcbn1cblxuLyoqXG4gKiBBY3Rpb24gZ2VuZXJhdG9yIHlpZWxkaW5nIGFjdGlvbnMgZm9yIHF1ZXVlaW5nIGFuIGVudGl0eSB0cmFzaCByZWNvcmQgaW4gdGhlXG4gKiBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gZW50aXR5SWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uKiB0cmFzaEVudGl0eUJ5SWQoIG1vZGVsTmFtZSwgZW50aXR5SWQgKSB7XG5cdHlpZWxkIHJlbW92ZUVudGl0eUJ5SWQoIG1vZGVsTmFtZSwgZW50aXR5SWQgKTtcblx0eWllbGQgcmVtb3ZlQWxsUmVsYXRlZEVudGl0aWVzRm9yTW9kZWxFbnRpdHkoIG1vZGVsTmFtZSwgZW50aXR5SWQgKTtcblx0eWllbGQgcmVjZWl2ZVRyYXNoRW50aXR5SWQoIG1vZGVsTmFtZSwgZW50aXR5SWQgKTtcbn1cbiIsIi8qKlxuICogSW50ZXJuYWwgSW1wb3J0c1xuICovXG5pbXBvcnQgeyByZW1vdmVFbnRpdHlCeUlkIH0gZnJvbSAnLi9yZW1vdmUtZW50aXRpZXMnO1xuaW1wb3J0IHtcblx0cmVjZWl2ZURpcnR5UmVsYXRpb25EZWxldGlvbixcbn0gZnJvbSAnLi9yZWNlaXZlLXJlbGF0aW9ucyc7XG5pbXBvcnQge1xuXHRyZW1vdmVEaXJ0eVJlbGF0aW9uQWRkaXRpb24sXG5cdHJlbW92ZVJlbGF0ZWRFbnRpdGllcyxcbn0gZnJvbSAnLi9yZW1vdmUtcmVsYXRpb25zJztcbi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQge1xuXHRzaW5ndWxhck1vZGVsTmFtZSxcblx0cGx1cmFsTW9kZWxOYW1lLFxufSBmcm9tICdAZXZlbnRlc3ByZXNzby9tb2RlbCc7XG5cbi8qKlxuICogQWN0aW9uIGdlbmVyYXRvciB5aWVsZGluZyBhY3Rpb25zIGZvciBoYW5kbGluZyByZW1vdmluZyB0aGUgcXVldWVkIHJlbGF0aW9uc1xuICogZm9yIGFkZGl0aW9uIGluIHRoZSBzdGF0ZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbnRpdHlJZFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IHJlbGF0aW9uRW50aXR5SWRcbiAqL1xuZnVuY3Rpb24qIHJlbW92ZURpcnR5UmVsYXRpb25Gb3JBZGRpdGlvbihcblx0bW9kZWxOYW1lLFxuXHRlbnRpdHlJZCxcblx0cmVsYXRpb25OYW1lLFxuXHRyZWxhdGlvbkVudGl0eUlkLFxuKSB7XG5cdHlpZWxkIHJlbW92ZURpcnR5UmVsYXRpb25BZGRpdGlvbihcblx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0cmVsYXRpb25FbnRpdHlJZCxcblx0XHRtb2RlbE5hbWUsXG5cdFx0ZW50aXR5SWQsXG5cdCk7XG59XG5cbi8qKlxuICogQWN0aW9uIGdlbmVyYXRvciB5aWVsZGluZyBhY3Rpb25zIGZvciBhY3Rpb25zIGZvciBxdWV1aW5nIHRoZSByZW1vdmFsIG9mIGFcbiAqIHJlbGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbnRpdHlJZFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IHJlbGF0aW9uRW50aXR5SWRcbiAqL1xuZnVuY3Rpb24qIHJlbW92ZVJlbGF0aW9uRm9yRW50aXR5KFxuXHRtb2RlbE5hbWUsXG5cdGVudGl0eUlkLFxuXHRyZWxhdGlvbk5hbWUsXG5cdHJlbGF0aW9uRW50aXR5SWRcbikge1xuXHRjb25zdCBzaW5ndWxhclJlbGF0aW9uTmFtZSA9IHNpbmd1bGFyTW9kZWxOYW1lKCByZWxhdGlvbk5hbWUgKTtcblx0Y29uc3QgcGx1cmFsUmVsYXRpb25OYW1lID0gcGx1cmFsTW9kZWxOYW1lKCByZWxhdGlvbk5hbWUgKTtcblx0eWllbGQgcmVtb3ZlRW50aXR5QnlJZCggc2luZ3VsYXJSZWxhdGlvbk5hbWUsIHJlbGF0aW9uRW50aXR5SWQgKTtcblx0eWllbGQgcmVtb3ZlUmVsYXRlZEVudGl0aWVzKFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHlJZCxcblx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0WyByZWxhdGlvbkVudGl0eUlkIF0sXG5cdCk7XG5cdHlpZWxkIHJlbW92ZURpcnR5UmVsYXRpb25BZGRpdGlvbihcblx0XHRtb2RlbE5hbWUsXG5cdFx0ZW50aXR5SWQsXG5cdFx0cmVsYXRpb25OYW1lLFxuXHRcdHJlbGF0aW9uRW50aXR5SWQsXG5cdCk7XG5cdHlpZWxkIHJlY2VpdmVEaXJ0eVJlbGF0aW9uRGVsZXRpb24oXG5cdFx0cGx1cmFsUmVsYXRpb25OYW1lLFxuXHRcdHJlbGF0aW9uRW50aXR5SWQsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkXG5cdCk7XG59XG5cbmV4cG9ydCB7IHJlbW92ZURpcnR5UmVsYXRpb25Gb3JBZGRpdGlvbiwgcmVtb3ZlUmVsYXRpb25Gb3JFbnRpdHkgfTtcbiIsImV4cG9ydCAqIGZyb20gJy4vYWN0aW9uLWNyZWF0b3JzJztcbmV4cG9ydCAqIGZyb20gJy4vYWN0aW9uLWdlbmVyYXRvcnMnO1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzLlxuICovXG5pbXBvcnQge1xuXHRpc01vZGVsRW50aXR5T2ZNb2RlbCxcblx0aXNNb2RlbEVudGl0eUZhY3RvcnlPZk1vZGVsLFxufSBmcm9tICdAZXZlbnRlc3ByZXNzby92YWxpZGF0b3JzJztcbmltcG9ydCB7XG5cdGFwcGx5UXVlcnlTdHJpbmcsXG5cdGtleUVudGl0aWVzQnlQcmltYXJ5S2V5VmFsdWUsXG59IGZyb20gJ0BldmVudGVzcHJlc3NvL21vZGVsJztcbmltcG9ydCB7IGlzRW1wdHksIGlzQXJyYXkgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnd2FybmluZyc7XG5cbi8qKlxuICogSW50ZXJuYWwgaW1wb3J0cy5cbiAqL1xuaW1wb3J0IHtcblx0ZmV0Y2gsXG5cdHNlbGVjdCxcblx0ZGlzcGF0Y2gsXG5cdHJlc29sdmVTZWxlY3QsXG5cdHJlc29sdmVEaXNwYXRjaCxcbn0gZnJvbSAnLi4vLi4vYmFzZS1jb250cm9scyc7XG5pbXBvcnQge1xuXHRyZW1vdmVFbnRpdHlCeUlkLFxuXHRyZW1vdmVEZWxldGVFbnRpdHlJZCxcblx0cmVtb3ZlVHJhc2hFbnRpdHlJZCxcbn0gZnJvbSAnLi9yZW1vdmUtZW50aXRpZXMnO1xuaW1wb3J0IHsgcmVjZWl2ZUFuZFJlcGxhY2VFbnRpdHlSZWNvcmRzIH0gZnJvbSAnLi9yZWNlaXZlLWVudGl0aWVzJztcbmltcG9ydCB7IHJlY2VpdmVVcGRhdGVkRW50aXR5SWRGb3JSZWxhdGlvbnMgfSBmcm9tICcuL3JlY2VpdmUtcmVsYXRpb25zJztcbmltcG9ydCB7IFJFRFVDRVJfS0VZIGFzIENPUkVfUkVEVUNFUl9LRVkgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgUkVEVUNFUl9LRVkgYXMgU0NIRU1BX1JFRFVDRVJfS0VZIH0gZnJvbSAnLi4vLi4vc2NoZW1hL2NvbnN0YW50cyc7XG5cbmNvbnN0IERFRkFVTFRfRU1QVFlfT0JKRUNUID0ge307XG5jb25zdCBERUZBVUxUX0VNUFRZX0FSUkFZID0gW107XG5cbi8qKlxuICogQWN0aW9uIGdlbmVyYXRvciBmb3IgcGVyc2lzdGluZyBhbiBlbnRpdHkgcmVjb3JkIChpbnNlcnQvdXBkYXRlKVxuICogdG8gdGhlIHNlcnZlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge0Jhc2VFbnRpdHl9IGVudGl0eVxuICogQHJldHVybiB7bnVsbHxCYXNlRW50aXR5fSBJZiBzdWNjZXNzZnVsbHkgcGVyc2lzdGVkIHRoZSBwZXJzaXN0ZWQgZW50aXR5IGlzXG4gKiByZXR1cm5lZC4gIE90aGVyd2lzZSBudWxsLlxuICovXG5mdW5jdGlvbiogcGVyc2lzdEVudGl0eVJlY29yZCggbW9kZWxOYW1lLCBlbnRpdHkgKSB7XG5cdC8vIGNoZWNrIGlmIGlzIGFuIGluc3RhbmNlIG9mIEJhc2VFbnRpdHlcblx0aWYgKCAhIGlzTW9kZWxFbnRpdHlPZk1vZGVsKCBlbnRpdHksIG1vZGVsTmFtZSApICkge1xuXHRcdHdhcm5pbmcoXG5cdFx0XHRmYWxzZSxcblx0XHRcdCdUaGUgcHJvdmlkZWQgZW50aXR5IGlzIG5vdCBhIEJhc2VFbnRpdHkgY2hpbGQgZm9yIHRoZSAnICtcblx0XHRcdCdwcm92aWRlZCBtb2RlbC4nXG5cdFx0KTtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHQvLyBjaGVjayBpZiB0aGVyZSBhcmUgYW55IGNoYW5nZXMgaW4gdGhlIGVudGl0eVxuXHRpZiAoIGVudGl0eS5pc0NsZWFuICkge1xuXHRcdHdhcm5pbmcoXG5cdFx0XHRmYWxzZSxcblx0XHRcdCdUaGUgZW50aXR5IHByb3ZpZGVkIGhhcyBubyBjaGFuZ2VzIHRvIHBlcnNpc3QuJ1xuXHRcdCk7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0Y29uc3QgZmFjdG9yeSA9IHlpZWxkIHJlc29sdmVTZWxlY3QoXG5cdFx0U0NIRU1BX1JFRFVDRVJfS0VZLFxuXHRcdCdnZXRGYWN0b3J5Rm9yTW9kZWwnLFxuXHRcdG1vZGVsTmFtZVxuXHQpO1xuXHRpZiAoICEgaXNNb2RlbEVudGl0eUZhY3RvcnlPZk1vZGVsKCBmYWN0b3J5LCBtb2RlbE5hbWUgKSApIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHRjb25zdCBwYXRoID0gYXBwbHlRdWVyeVN0cmluZyggbW9kZWxOYW1lICk7XG5cdGNvbnN0IHVwZGF0ZWRFbnRpdHkgPSB5aWVsZCBmZXRjaCgge1xuXHRcdHBhdGg6IGVudGl0eS5pc05ldyA/IHBhdGggOiBwYXRoICsgJy8nICsgZW50aXR5LmlkLFxuXHRcdG1ldGhvZDogZW50aXR5LmlzTmV3ID8gJ1BPU1QnIDogJ1BVVCcsXG5cdFx0ZGF0YTogZW50aXR5LmZvclBlcnNpc3QsXG5cdH0gKTtcblx0aWYgKCBpc0VtcHR5KCB1cGRhdGVkRW50aXR5ICkgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0Y29uc3QgdXBkYXRlZEVudGl0eVJlY29yZCA9IGZhY3RvcnkuZnJvbUV4aXN0aW5nKCB1cGRhdGVkRW50aXR5ICk7XG5cdGNvbnN0IG5ld0lkID0gdXBkYXRlZEVudGl0eVJlY29yZC5pZDtcblx0aWYgKCBlbnRpdHkuaXNOZXcgKSB7XG5cdFx0eWllbGQgcmVtb3ZlRW50aXR5QnlJZCggbW9kZWxOYW1lLCBlbnRpdHkuaWQgKTtcblx0XHR5aWVsZCBkaXNwYXRjaChcblx0XHRcdCdjb3JlL2RhdGEnLFxuXHRcdFx0J2ZpbmlzaFJlc29sdXRpb24nLFxuXHRcdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHRcdCdnZXRFbnRpdHlCeUlkJyxcblx0XHRcdFsgbW9kZWxOYW1lLCBuZXdJZCBdXG5cdFx0KTtcblx0XHR5aWVsZCByZWNlaXZlVXBkYXRlZEVudGl0eUlkRm9yUmVsYXRpb25zKCBtb2RlbE5hbWUsIGVudGl0eS5pZCwgbmV3SWQgKTtcblx0fVxuXHR5aWVsZCByZWNlaXZlQW5kUmVwbGFjZUVudGl0eVJlY29yZHMoXG5cdFx0bW9kZWxOYW1lLFxuXHRcdFsgdXBkYXRlZEVudGl0eVJlY29yZCBdXG5cdCk7XG5cdHJldHVybiB1cGRhdGVkRW50aXR5UmVjb3JkO1xufVxuXG4vKipcbiAqIEFjdGlvbiBnZW5lcmF0b3IgZm9yIHBlcnNpc3RpbmcgZW50aXRpZXMgd2l0aCB0aGUgZ2l2ZW4gaWQgdG8gdGhlIHNlcnZlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gZW50aXR5SWRcbiAqIEByZXR1cm4ge0Jhc2VFbnRpdHl8bnVsbH0gSWYgdGhlIGVudGl0eSBpcyBzdWNjZXNzZnVsbHkgcGVyc2lzdGVkIGl0IGlzXG4gKiByZXR1cm5lZCAobWF5IGhhdmUgYSBuZXcgaWQhKSwgb3RoZXJ3aXNlIG51bGwgaXMgcmV0dXJuZWQuXG4gKi9cbmZ1bmN0aW9uKiBwZXJzaXN0Rm9yRW50aXR5SWQoIG1vZGVsTmFtZSwgZW50aXR5SWQgKSB7XG5cdGNvbnN0IGVudGl0eSA9IHlpZWxkIHJlc29sdmVTZWxlY3QoXG5cdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHQnZ2V0RW50aXR5QnlJZCcsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkLFxuXHQpO1xuXHRpZiAoIGlzTW9kZWxFbnRpdHlPZk1vZGVsKCBlbnRpdHksIG1vZGVsTmFtZSApICkge1xuXHRcdGNvbnN0IHBlcnNpc3RlZEVudGl0eSA9IHlpZWxkIGRpc3BhdGNoKFxuXHRcdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHRcdCdwZXJzaXN0RW50aXR5UmVjb3JkJyxcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdGVudGl0eVxuXHRcdCk7XG5cdFx0cmV0dXJuIGlzTW9kZWxFbnRpdHlPZk1vZGVsKCBwZXJzaXN0ZWRFbnRpdHksIG1vZGVsTmFtZSApID9cblx0XHRcdHBlcnNpc3RlZEVudGl0eSA6XG5cdFx0XHRudWxsO1xuXHR9XG5cdHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEFjdGlvbiBnZW5lcmF0b3IgZm9yIHBlcnNpc3RpbmcgZW50aXRpZXMgd2l0aCB0aGUgZ2l2ZW4gaWRzIHRvIHRoZSBzZXJ2ZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtBcnJheX0gZW50aXR5SWRzXG4gKiBAcmV0dXJuIHtPYmplY3R9IEVudGl0aWVzIHBlcnNpc3RlZCBpbmRleGVkIGJ5IElELlxuICovXG5mdW5jdGlvbiogcGVyc2lzdEZvckVudGl0eUlkcyggbW9kZWxOYW1lLCBlbnRpdHlJZHMgPSBbXSApIHtcblx0Y29uc3QgZW50aXRpZXMgPSB5aWVsZCBzZWxlY3QoXG5cdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHQnZ2V0RW50aXRpZXNCeUlkcycsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkcyxcblx0KTtcblx0Y29uc3QgcmV0cmlldmVkRW50aXRpZXMgPSBpc0FycmF5KCBlbnRpdGllcyApID9cblx0XHRrZXlFbnRpdGllc0J5UHJpbWFyeUtleVZhbHVlKCAnZXZlbnQnLCBlbnRpdGllcyApIDpcblx0XHRuZXcgTWFwKCk7XG5cdGNvbnN0IHJldHJpZXZlZElkcyA9IEFycmF5LmZyb20oIHJldHJpZXZlZEVudGl0aWVzLmtleXMoKSApO1xuXHRpZiAoIHJldHJpZXZlZElkcy5sZW5ndGggPCAxICkge1xuXHRcdHJldHVybiBERUZBVUxUX0VNUFRZX09CSkVDVDtcblx0fVxuXHRjb25zdCBwZXJzaXN0ZWRFbnRpdGllcyA9IHt9O1xuXHR3aGlsZSAoIHJldHJpZXZlZElkcy5sZW5ndGggPiAwICkge1xuXHRcdGNvbnN0IHBlcnNpc3RlZEVudGl0eSA9IHlpZWxkIGRpc3BhdGNoKFxuXHRcdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHRcdCdwZXJzaXN0RW50aXR5UmVjb3JkJyxcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdHJldHJpZXZlZEVudGl0aWVzLmdldCggcmV0cmlldmVkSWRzLnBvcCgpIClcblx0XHQpO1xuXHRcdGlmICggaXNNb2RlbEVudGl0eU9mTW9kZWwoIHBlcnNpc3RlZEVudGl0eSwgbW9kZWxOYW1lICkgKSB7XG5cdFx0XHRwZXJzaXN0ZWRFbnRpdGllc1sgcGVyc2lzdGVkRW50aXR5LmlkIF0gPSBwZXJzaXN0ZWRFbnRpdHk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBwZXJzaXN0ZWRFbnRpdGllcztcbn1cblxuLyoqXG4gKiBBY3Rpb24gZ2VuZXJhdG9yIGZvciBwZXJzaXN0aW5nIGFueSBxdWV1ZWQgZGVsZXRlcyBmb3IgdGhlIGdpdmVuIG1vZGVsLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBlbnRpdHkgaWRzIGZvciBlbnRpdGllcyBzdWNjZXNzZnVsbHkgZGVsZXRlZC5cbiAqL1xuZnVuY3Rpb24qIHBlcnNpc3REZWxldGVzRm9yTW9kZWwoIG1vZGVsTmFtZSApIHtcblx0Y29uc3QgZW50aXR5SWRzID0geWllbGQgc2VsZWN0KFxuXHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0J2dldEVudGl0eUlkc1F1ZXVlZEZvckRlbGV0ZScsXG5cdFx0bW9kZWxOYW1lXG5cdCk7XG5cdGlmICggZW50aXR5SWRzLmxlbmd0aCA8IDAgKSB7XG5cdFx0cmV0dXJuIERFRkFVTFRfRU1QVFlfQVJSQVk7XG5cdH1cblx0Y29uc3QgZGVsZXRlZElkcyA9IFtdO1xuXHR3aGlsZSAoIGVudGl0eUlkcy5sZW5ndGggPiAwICkge1xuXHRcdGNvbnN0IGVudGl0eUlkID0gZW50aXR5SWRzLnBvcCgpO1xuXHRcdGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goIHtcblx0XHRcdHBhdGg6IGFwcGx5UXVlcnlTdHJpbmcoIG1vZGVsTmFtZSApICsgJy8nICsgZW50aXR5SWQsXG5cdFx0XHRkYXRhOiB7IGZvcmNlOiB0cnVlIH0sXG5cdFx0XHRtZXRob2Q6ICdERUxFVEUnLFxuXHRcdH0gKTtcblx0XHRpZiAoIHJlc3BvbnNlLmRlbGV0ZWQgKSB7XG5cdFx0XHRkZWxldGVkSWRzLnB1c2goIGVudGl0eUlkICk7XG5cdFx0XHR5aWVsZCByZW1vdmVEZWxldGVFbnRpdHlJZCggbW9kZWxOYW1lLCBlbnRpdHlJZCApO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZGVsZXRlZElkcztcbn1cblxuLyoqXG4gKiBBY3Rpb24gZ2VuZXJhdG9yIGZvciBwZXJzaXN0aW5nIGFueSBxdWV1ZWQgdHJhc2hlcyBmb3IgdGhlIGdpdmVuIG1vZGVsLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBlbnRpdHkgaWRzIGZvciBlbnRpdGllcyBzdWNjZXNzZnVsbHkgdHJhc2hlZC5cbiAqL1xuZnVuY3Rpb24qIHBlcnNpc3RUcmFzaGVzRm9yTW9kZWwoIG1vZGVsTmFtZSApIHtcblx0Y29uc3QgZW50aXR5SWRzID0geWllbGQgc2VsZWN0KFxuXHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0J2dldEVudGl0eUlkc1F1ZXVlZEZvclRyYXNoJyxcblx0XHRtb2RlbE5hbWVcblx0KTtcblx0aWYgKCBlbnRpdHlJZHMubGVuZ3RoIDwgMSApIHtcblx0XHRyZXR1cm4gREVGQVVMVF9FTVBUWV9BUlJBWTtcblx0fVxuXHRjb25zdCB0cmFzaGVkSWRzID0gW107XG5cdHdoaWxlICggZW50aXR5SWRzLmxlbmd0aCA+IDAgKSB7XG5cdFx0Y29uc3QgZW50aXR5SWQgPSBlbnRpdHlJZHMucG9wKCk7XG5cdFx0Y29uc3Qgc3VjY2VzcyA9IHlpZWxkIGZldGNoKCB7XG5cdFx0XHRwYXRoOiBhcHBseVF1ZXJ5U3RyaW5nKCBtb2RlbE5hbWUgKSArICcvJyArIGVudGl0eUlkLFxuXHRcdFx0bWV0aG9kOiAnREVMRVRFJyxcblx0XHR9ICk7XG5cdFx0aWYgKCBzdWNjZXNzICkge1xuXHRcdFx0dHJhc2hlZElkcy5wdXNoKCBlbnRpdHlJZCApO1xuXHRcdFx0eWllbGQgcmVtb3ZlVHJhc2hFbnRpdHlJZCggbW9kZWxOYW1lLCBlbnRpdHlJZCApO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gdHJhc2hlZElkcztcbn1cblxuLyoqXG4gKiBBY3Rpb24gZ2VuZXJhdG9yIGZvciBwZXJzaXN0aW5nIHF1ZXVlZCBkZWxldGUgYW5kIHRyYXNoIGFjdGlvbnMgZm9yIGFsbFxuICogbW9kZWxzIGluIHRoZSBzdGF0ZS5cbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IEFuIG9iamVjdCBpbmRleGVkIGJ5IGRlbGV0ZS90cmFzaCBjb250YWluaW5nIGFuIGFycmF5IG9mXG4gKiBlbnRpdHkgaWRzIHRoYXQgd2VyZSBwZXJzaXN0ZWQuXG4gKi9cbmZ1bmN0aW9uKiBwZXJzaXN0QWxsRGVsZXRlcygpIHtcblx0Y29uc3QgbW9kZWxzRm9yRGVsZXRlID0geWllbGQgc2VsZWN0KFxuXHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0J2dldE1vZGVsc1F1ZXVlZEZvckRlbGV0ZSdcblx0KTtcblx0aWYgKCBtb2RlbHNGb3JEZWxldGUubGVuZ3RoIDwgMSApIHtcblx0XHRyZXR1cm4gREVGQVVMVF9FTVBUWV9PQkpFQ1Q7XG5cdH1cblx0Y29uc3QgZGVsZXRlZElkcyA9IHt9O1xuXHR3aGlsZSAoIG1vZGVsc0ZvckRlbGV0ZS5sZW5ndGggPiAwICkge1xuXHRcdGNvbnN0IG1vZGVsRm9yRGVsZXRlID0gbW9kZWxzRm9yRGVsZXRlLnBvcCgpO1xuXHRcdGNvbnN0IGlkc0RlbGV0ZWQgPSB5aWVsZCByZXNvbHZlRGlzcGF0Y2goXG5cdFx0XHRDT1JFX1JFRFVDRVJfS0VZLFxuXHRcdFx0J3BlcnNpc3REZWxldGVzRm9yTW9kZWwnLFxuXHRcdFx0bW9kZWxGb3JEZWxldGVcblx0XHQpO1xuXHRcdGlmICggISBpc0VtcHR5KCBpZHNEZWxldGVkICkgKSB7XG5cdFx0XHRkZWxldGVkSWRzWyBtb2RlbEZvckRlbGV0ZSBdID0gaWRzRGVsZXRlZDtcblx0XHR9XG5cdH1cblx0Y29uc3QgbW9kZWxzRm9yVHJhc2ggPSB5aWVsZCBzZWxlY3QoXG5cdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHQnZ2V0TW9kZWxzUXVldWVkRm9yVHJhc2gnXG5cdCk7XG5cdGlmICggbW9kZWxzRm9yVHJhc2gubGVuZ3RoIDwgMSApIHtcblx0XHRyZXR1cm4gREVGQVVMVF9FTVBUWV9PQkpFQ1Q7XG5cdH1cblx0Y29uc3QgdHJhc2hlZElkcyA9IHt9O1xuXHR3aGlsZSAoIG1vZGVsc0ZvclRyYXNoLmxlbmd0aCA+IDAgKSB7XG5cdFx0Y29uc3QgbW9kZWxGb3JUcmFzaCA9IG1vZGVsc0ZvclRyYXNoLnBvcCgpO1xuXHRcdGNvbnN0IGlkc1RyYXNoZWQgPSB5aWVsZCByZXNvbHZlRGlzcGF0Y2goXG5cdFx0XHRDT1JFX1JFRFVDRVJfS0VZLFxuXHRcdFx0J3BlcnNpc3RUcmFzaGVzRm9yTW9kZWwnLFxuXHRcdFx0bW9kZWxGb3JUcmFzaFxuXHRcdCk7XG5cdFx0aWYgKCAhIGlzRW1wdHkoIGlkc1RyYXNoZWQgKSApIHtcblx0XHRcdHRyYXNoZWRJZHNbIG1vZGVsRm9yVHJhc2ggXSA9IGlkc1RyYXNoZWQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7IGRlbGV0ZWQ6IGRlbGV0ZWRJZHMsIHRyYXNoZWQ6IHRyYXNoZWRJZHMgfTtcbn1cblxuZXhwb3J0IHtcblx0cGVyc2lzdEVudGl0eVJlY29yZCxcblx0cGVyc2lzdEZvckVudGl0eUlkLFxuXHRwZXJzaXN0Rm9yRW50aXR5SWRzLFxuXHRwZXJzaXN0RGVsZXRlc0Zvck1vZGVsLFxuXHRwZXJzaXN0VHJhc2hlc0Zvck1vZGVsLFxuXHRwZXJzaXN0QWxsRGVsZXRlcyxcbn07XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHMuXG4gKi9cbmltcG9ydCB7IGlzRW1wdHksIGtleXMgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGN1aWQgZnJvbSAnY3VpZCc7XG5pbXBvcnQgeyBpc01vZGVsRW50aXR5T2ZNb2RlbCB9IGZyb20gJ0BldmVudGVzcHJlc3NvL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHsgc2luZ3VsYXJNb2RlbE5hbWUsIHBsdXJhbE1vZGVsTmFtZSB9IGZyb20gJ0BldmVudGVzcHJlc3NvL21vZGVsJztcblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBvcnRzLlxuICovXG5pbXBvcnQge1xuXHRmZXRjaCxcblx0c2VsZWN0LFxuXHRyZXNvbHZlRGlzcGF0Y2gsXG5cdHJlc29sdmVTZWxlY3QsXG59IGZyb20gJy4uLy4uL2Jhc2UtY29udHJvbHMnO1xuaW1wb3J0IHsgcmVtb3ZlRGlydHlSZWxhdGlvbkZvclR5cGUgfSBmcm9tICcuL3JlbW92ZS1yZWxhdGlvbnMnO1xuaW1wb3J0IHsgUkVEVUNFUl9LRVkgYXMgQ09SRV9SRURVQ0VSX0tFWSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBSRURVQ0VSX0tFWSBhcyBTQ0hFTUFfUkVEVUNFUl9LRVkgfSBmcm9tICcuLi8uLi9zY2hlbWEvY29uc3RhbnRzJztcblxuY29uc3QgREVGQVVMVF9FTVBUWV9PQkpFQ1QgPSB7fTtcbmNvbnN0IERFRkFVTFRfRU1QVFlfQVJSQVkgPSBbXTtcblxuLyoqXG4gKiBBY3Rpb24gZ2VuZXJhdG9yIGZvciBwZXJzaXN0aW5nIGFueSBxdWV1ZWQgYWRkIHJlbGF0aW9ucyB0byB0aGUgc2VydmVyXG4gKiBzcGVjaWZpYyB0byB0aGUgZ2l2ZW4gbW9kZWwgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcmV0dXJuIHtPYmplY3R9IHJldHVybnMgYW4gb2JqZWN0IGluZGV4ZWQgYnkgdGhlIG9yaWdpbmF0aW5nIGVudGl0eSBpZCBmb3JcbiAqIHRoZSByZXF1ZXN0ZWQgbW9kZWwgYW5kIHdpdGggdmFsdWVzIHRoYXQgYXJlIGFuIE9iamVjdCBpbmRleGVkIGJ5IHJlbGF0aW9uXG4gKiBuYW1lcyB3aXRoIHZhbHVlcyBvZiByZWxhdGlvbiBJZHMgcGVyc2lzdGVkLlxuICovXG5mdW5jdGlvbiogcGVyc2lzdEFkZFJlbGF0aW9uc0Zvck1vZGVsKCBtb2RlbE5hbWUgKSB7XG5cdG1vZGVsTmFtZSA9IHNpbmd1bGFyTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0cmV0dXJuIHlpZWxkIHJlc29sdmVEaXNwYXRjaChcblx0XHRDT1JFX1JFRFVDRVJfS0VZLFxuXHRcdCdwZXJzaXN0UmVsYXRpb25zRm9yTW9kZWwnLFxuXHRcdG1vZGVsTmFtZVxuXHQpO1xufVxuXG4vKipcbiAqIEFjdGlvbiBnZW5lcmF0b3IgZm9yIHBlcnNpc3RpbmcgYW55IHF1ZXVlZCBkZWxldGUgcmVsYXRpb25zIHRvIHRoZSBzZXJ2ZXJcbiAqIHNwZWNpZmljIHRvIHRoZSBnaXZlbiBtb2RlbCBuYW1lLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEByZXR1cm4ge09iamVjdH0gcmV0dXJucyBhbiBvYmplY3QgaW5kZXhlZCBieSB0aGUgb3JpZ2luYXRpbmcgZW50aXR5IGlkIGZvclxuICogdGhlIHJlcXVlc3RlZCBtb2RlbCBhbmQgd2l0aCB2YWx1ZXMgdGhhdCBhcmUgYW4gT2JqZWN0IGluZGV4ZWQgYnkgcmVsYXRpb25cbiAqIG5hbWVzIHdpdGggdmFsdWVzIG9mIHJlbGF0aW9uIElkcyBwZXJzaXN0ZWQuXG4gKi9cbmZ1bmN0aW9uKiBwZXJzaXN0RGVsZXRlUmVsYXRpb25zRm9yTW9kZWwoIG1vZGVsTmFtZSApIHtcblx0bW9kZWxOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRyZXR1cm4geWllbGQgcmVzb2x2ZURpc3BhdGNoKFxuXHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0J3BlcnNpc3RSZWxhdGlvbnNGb3JNb2RlbCcsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGZhbHNlXG5cdCk7XG59XG5cbi8qKlxuICogQWN0aW9uIGdlbmVyYXRvciBmb3IgcGVyc2lzdGluZyBhbnkgcXVldWVkIHJlbGF0aW9ucyB0byB0aGUgc2VydmVyIHNwZWNpZmljXG4gKiB0byB0aGUgZ2l2ZW4gbW9kZWwgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFkZFJlbGF0aW9uICBXaGV0aGVyIHRoaXMgcGVyc2lzdCByZXF1ZXN0IGlzIGZvciBxdWV1ZWRcbiAqIHJlbGF0aW9ucyB0byBhZGQgZm9yIHRoZSBtb2RlbCBvciBxdWV1ZWQgcmVsYXRpb25zIHRvIGRlbGV0ZSBmb3IgdGhlIG1vZGVsLlxuICogQHJldHVybiB7T2JqZWN0fSByZXR1cm5zIGFuIG9iamVjdCBpbmRleGVkIGJ5IHRoZSBvcmlnaW5hdGluZyBlbnRpdHkgaWQgZm9yXG4gKiB0aGUgcmVxdWVzdGVkIG1vZGVsIGFuZCB3aXRoIHZhbHVlcyB0aGF0IGFyZSBhbiBPYmplY3QgaW5kZXhlZCBieSByZWxhdGlvblxuICogbmFtZXMgd2l0aCB2YWx1ZXMgb2YgcmVsYXRpb24gSWRzIHBlcnNpc3RlZC5cbiAqL1xuZnVuY3Rpb24qIHBlcnNpc3RSZWxhdGlvbnNGb3JNb2RlbCggbW9kZWxOYW1lLCBhZGRSZWxhdGlvbiA9IHRydWUgKSB7XG5cdG1vZGVsTmFtZSA9IHNpbmd1bGFyTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0Y29uc3QgcmVsYXRpb25TdGF0ZSA9IHlpZWxkIHJlc29sdmVEaXNwYXRjaChcblx0XHRDT1JFX1JFRFVDRVJfS0VZLFxuXHRcdCdnZXRSZWxhdGlvblN0YXRlJyxcblx0XHRtb2RlbE5hbWUsXG5cdFx0YWRkUmVsYXRpb25cblx0KTtcblx0aWYgKCBpc0VtcHR5KCByZWxhdGlvblN0YXRlICkgKSB7XG5cdFx0cmV0dXJuIERFRkFVTFRfRU1QVFlfT0JKRUNUO1xuXHR9XG5cdGNvbnN0IGVudGl0eUlkcyA9IGtleXMoIHJlbGF0aW9uU3RhdGUgKTtcblx0Y29uc3QgcmVsYXRpb25zUGVyc2lzdGVkID0gZW50aXR5SWRzLmxlbmd0aCA+IDAgP1xuXHRcdHt9IDpcblx0XHRERUZBVUxUX0VNUFRZX09CSkVDVDtcblx0d2hpbGUgKCBlbnRpdHlJZHMubGVuZ3RoID4gMCApIHtcblx0XHRjb25zdCBlbnRpdHlJZCA9IGVudGl0eUlkcy5wb3AoKTtcblxuXHRcdGNvbnN0IHBlcnNpc3RlZFJlbGF0aW9ucyA9IHlpZWxkIHJlc29sdmVEaXNwYXRjaChcblx0XHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0XHQncGVyc2lzdFJlbGF0aW9uc0ZvckVudGl0eUlkJyxcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdGVudGl0eUlkLFxuXHRcdFx0YWRkUmVsYXRpb24sXG5cdFx0XHRyZWxhdGlvblN0YXRlXG5cdFx0KTtcblx0XHRpZiAoICEgaXNFbXB0eSggcGVyc2lzdGVkUmVsYXRpb25zICkgKSB7XG5cdFx0XHRyZWxhdGlvbnNQZXJzaXN0ZWRbIGVudGl0eUlkIF0gPSBwZXJzaXN0ZWRSZWxhdGlvbnM7XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZWxhdGlvbnNQZXJzaXN0ZWQ7XG59XG5cbi8qKlxuICogQWN0aW9uIGdlbmVyYXRvciBmb3IgcGVyc2lzdGluZyBhbnkgcXVldWVkIHJlbGF0aW9ucyB0byB0aGUgc2VydmVyIHNwZWNpZmljXG4gKiB0byB0aGUgZ2l2ZW4gZW50aXR5IGlkIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gbW9kZWwgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gZW50aXR5SWRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYWRkUmVsYXRpb24gV2hldGhlciB0aGlzIHBlcnNpc3QgcmVxdWVzdCBpcyBmb3IgcXVldWVkXG4gKiByZWxhdGlvbnMgdG8gYWRkIGZvciB0aGUgbW9kZWwgb3IgcXVldWVkIHJlbGF0aW9ucyB0byBkZWxldGUgZm9yIHRoZSBtb2RlbC5cbiAqIEBwYXJhbSB7T2JqZWN0fSByZWxhdGlvblN0YXRlIE9wdGlvbmFsLCBpZiB0aGUgY3VycmVudCByZWxhdGlvbiBzdGF0ZSBpcyBrbm93blxuICogaXQgY2FuIGJlIHBhc3NlZCBpbi4gIFR5cGljYWxseSBjbGllbnQgY29kZSB3b24ndCBrbm93IHRoaXMgc28gc2hvdWxkIG5vdCBiZVxuICogcGFzc2VkIGluLlxuICogQHJldHVybiB7T2JqZWN0fSBBbiBvYmplY3QgaW5kZXhlZCBieSByZWxhdGlvbiBuYW1lcyB3aXRoIHRoZSB2YWx1ZXMgYW4gYXJyYXlcbiAqIG9mIHJlbGF0aW9uIGlkcyBmb3IgZWFjaCByZWxhdGlvbiB0aGF0IHdlcmUgcGVyc2lzdGVkLlxuICovXG5mdW5jdGlvbiogcGVyc2lzdFJlbGF0aW9uc0ZvckVudGl0eUlkKFxuXHRtb2RlbE5hbWUsXG5cdGVudGl0eUlkLFxuXHRhZGRSZWxhdGlvbiA9IHRydWUsXG5cdHJlbGF0aW9uU3RhdGUgPSBERUZBVUxUX0VNUFRZX09CSkVDVFxuKSB7XG5cdG1vZGVsTmFtZSA9IHNpbmd1bGFyTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0cmVsYXRpb25TdGF0ZSA9IHlpZWxkIHJlc29sdmVEaXNwYXRjaChcblx0XHRDT1JFX1JFRFVDRVJfS0VZLFxuXHRcdCdnZXRSZWxhdGlvblN0YXRlJyxcblx0XHRtb2RlbE5hbWUsXG5cdFx0YWRkUmVsYXRpb24sXG5cdFx0cmVsYXRpb25TdGF0ZVxuXHQpO1xuXHRpZiAoIGlzRW1wdHkoIHJlbGF0aW9uU3RhdGUgKSApIHtcblx0XHRyZXR1cm4gREVGQVVMVF9FTVBUWV9PQkpFQ1Q7XG5cdH1cblx0Y29uc3QgcmVsYXRpb25OYW1lcyA9IHJlbGF0aW9uU3RhdGVbIGVudGl0eUlkIF0gP1xuXHRcdGtleXMoIHJlbGF0aW9uU3RhdGVbIGVudGl0eUlkIF0gKSA6XG5cdFx0REVGQVVMVF9FTVBUWV9BUlJBWTtcblx0aWYgKCBpc0VtcHR5KCByZWxhdGlvbk5hbWVzICkgKSB7XG5cdFx0cmV0dXJuIERFRkFVTFRfRU1QVFlfT0JKRUNUO1xuXHR9XG5cdGNvbnN0IHBlcnNpc3RlZFJlbGF0aW9ucyA9IHt9O1xuXHR3aGlsZSAoIHJlbGF0aW9uTmFtZXMubGVuZ3RoID4gMCApIHtcblx0XHRjb25zdCByZWxhdGlvbk5hbWUgPSByZWxhdGlvbk5hbWVzLnBvcCgpO1xuXHRcdGNvbnN0IHBlcnNpc3RlZFJlbGF0aW9uSWRzID1cblx0XHRcdHlpZWxkIHJlc29sdmVEaXNwYXRjaChcblx0XHRcdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHRcdFx0J3BlcnNpc3RSZWxhdGlvbnNGb3JFbnRpdHlJZEFuZFJlbGF0aW9uJyxcblx0XHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0XHRlbnRpdHlJZCxcblx0XHRcdFx0cmVsYXRpb25OYW1lLFxuXHRcdFx0XHRhZGRSZWxhdGlvbixcblx0XHRcdFx0cmVsYXRpb25TdGF0ZVxuXHRcdFx0KTtcblx0XHRpZiAoIHBlcnNpc3RlZFJlbGF0aW9uSWRzLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRwZXJzaXN0ZWRSZWxhdGlvbnNbIHJlbGF0aW9uTmFtZSBdID0gcGVyc2lzdGVkUmVsYXRpb25JZHM7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBwZXJzaXN0ZWRSZWxhdGlvbnM7XG59XG5cbi8qKlxuICogQWN0aW9uIGdlbmVyYXRvciBmb3IgcGVyc2lzdGluZyBhbnkgcXVldWVkIHJlbGF0aW9ucyB0byB0aGUgc2VydmVyIHNwZWNpZmljXG4gKiB0byB0aGUgZ2l2ZW4gZW50aXR5IGlkIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gbW9kZWwgbmFtZSBhbmQgZm9yIHRoZSBnaXZlblxuICogcmVsYXRpb24gdG8gdGhhdCBtb2RlbC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gZW50aXR5SWRcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbk5hbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYWRkUmVsYXRpb24gV2hldGhlciB0aGlzIHBlcnNpc3QgcmVxdWVzdCBpcyBmb3IgcXVldWVkXG4gKiByZWxhdGlvbnMgdG8gYWRkIGZvciB0aGUgbW9kZWwgb3IgcXVldWVkIHJlbGF0aW9ucyB0byBkZWxldGUgZm9yIHRoZSBtb2RlbC5cbiAqIEBwYXJhbSB7T2JqZWN0fSByZWxhdGlvblN0YXRlIE9wdGlvbmFsLCBpZiB0aGUgY3VycmVudCByZWxhdGlvbiBzdGF0ZSBpcyBrbm93blxuICogaXQgY2FuIGJlIHBhc3NlZCBpbi4gIFR5cGljYWxseSBjbGllbnQgY29kZSB3b24ndCBrbm93IHRoaXMgc28gc2hvdWxkIG5vdCBiZVxuICogcGFzc2VkIGluLlxuICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIHJlbGF0aW9uIGlkcyBwZXJzaXN0ZWQgZm9yIHRoYXQgcmVsYXRpb24uXG4gKi9cbmZ1bmN0aW9uKiBwZXJzaXN0UmVsYXRpb25zRm9yRW50aXR5SWRBbmRSZWxhdGlvbihcblx0bW9kZWxOYW1lLFxuXHRlbnRpdHlJZCxcblx0cmVsYXRpb25OYW1lLFxuXHRhZGRSZWxhdGlvbiA9IHRydWUsXG5cdHJlbGF0aW9uU3RhdGUgPSBERUZBVUxUX0VNUFRZX09CSkVDVFxuKSB7XG5cdG1vZGVsTmFtZSA9IHNpbmd1bGFyTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0cmVsYXRpb25OYW1lID0gcGx1cmFsTW9kZWxOYW1lKCByZWxhdGlvbk5hbWUgKTtcblx0cmVsYXRpb25TdGF0ZSA9IHlpZWxkIHJlc29sdmVEaXNwYXRjaChcblx0XHRDT1JFX1JFRFVDRVJfS0VZLFxuXHRcdCdnZXRSZWxhdGlvblN0YXRlJyxcblx0XHRtb2RlbE5hbWUsXG5cdFx0YWRkUmVsYXRpb24sXG5cdFx0cmVsYXRpb25TdGF0ZVxuXHQpO1xuXHRpZiAoIGlzRW1wdHkoIHJlbGF0aW9uU3RhdGUgKSApIHtcblx0XHRyZXR1cm4gREVGQVVMVF9FTVBUWV9BUlJBWTtcblx0fVxuXHRjb25zdCByZWxhdGlvbkVudGl0eUlkcyA9IHJlbGF0aW9uU3RhdGVbIGVudGl0eUlkIF0gJiZcblx0cmVsYXRpb25TdGF0ZVsgZW50aXR5SWQgXVsgcmVsYXRpb25OYW1lIF0gP1xuXHRcdFsgLi4ucmVsYXRpb25TdGF0ZVsgZW50aXR5SWQgXVsgcmVsYXRpb25OYW1lIF0gXSA6XG5cdFx0REVGQVVMVF9FTVBUWV9BUlJBWTtcblx0aWYgKCByZWxhdGlvbkVudGl0eUlkcy5sZW5ndGggPCAxICkge1xuXHRcdHJldHVybiBERUZBVUxUX0VNUFRZX0FSUkFZO1xuXHR9XG5cdGNvbnN0IHBlcnNpc3RlZFJlbGF0aW9uSWRzID0gW107XG5cdHdoaWxlICggcmVsYXRpb25FbnRpdHlJZHMubGVuZ3RoID4gMCApIHtcblx0XHRjb25zdCBwZXJzaXN0ZWRSZWxhdGlvbklkID1cblx0XHRcdHlpZWxkIHJlc29sdmVEaXNwYXRjaChcblx0XHRcdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHRcdFx0J3BlcnNpc3RSZWxhdGlvbnNGb3JFbnRpdHlJZEFuZFJlbGF0aW9uSWQnLFxuXHRcdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRcdGVudGl0eUlkLFxuXHRcdFx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0XHRcdHJlbGF0aW9uRW50aXR5SWRzLnBvcCgpLFxuXHRcdFx0XHRhZGRSZWxhdGlvbixcblx0XHRcdFx0cmVsYXRpb25TdGF0ZVxuXHRcdFx0KTtcblx0XHRpZiAoIHBlcnNpc3RlZFJlbGF0aW9uSWQgKSB7XG5cdFx0XHRwZXJzaXN0ZWRSZWxhdGlvbklkcy5wdXNoKCBwZXJzaXN0ZWRSZWxhdGlvbklkICk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBwZXJzaXN0ZWRSZWxhdGlvbklkcztcbn1cblxuLyoqXG4gKiBBY3Rpb24gZ2VuZXJhdG9yIGZvciBwZXJzaXN0aW5nIGFueSBxdWV1ZWQgcmVsYXRpb25zIHRvIHRoZSBzZXJ2ZXIgc3BlY2lmaWNcbiAqIHRvIHRoZSBnaXZlbiBlbnRpdHkgaWQgYmVsb25naW5nIHRvIHRoZSBnaXZlbiBtb2RlbCBuYW1lLCBmb3IgdGhlIGdpdmVuXG4gKiByZWxhdGlvbiB0byB0aGF0IG1vZGVsIGFuZCB0aGUgZ2l2ZW4gcmVsYXRpb24gaWQgZm9yIHRoYXQgcmVsYXRpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IGVudGl0eUlkXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25OYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gcmVsYXRpb25JZFxuICogQHBhcmFtIHtib29sZWFufSBhZGRSZWxhdGlvbiBXaGV0aGVyIHRoaXMgcGVyc2lzdCByZXF1ZXN0IGlzIGZvciBxdWV1ZWRcbiAqIHJlbGF0aW9ucyB0byBhZGQgZm9yIHRoZSBtb2RlbCBvciBxdWV1ZWQgcmVsYXRpb25zIHRvIGRlbGV0ZSBmb3IgdGhlIG1vZGVsLlxuICogQHBhcmFtIHtPYmplY3R9IHJlbGF0aW9uU3RhdGUgT3B0aW9uYWwsIGlmIHRoZSBjdXJyZW50IHJlbGF0aW9uIHN0YXRlIGlzIGtub3duXG4gKiBpdCBjYW4gYmUgcGFzc2VkIGluLiAgVHlwaWNhbGx5IGNsaWVudCBjb2RlIHdvbid0IGtub3cgdGhpcyBzbyBzaG91bGQgbm90IGJlXG4gKiBwYXNzZWQgaW4uXG4gKiBAcmV0dXJuIHtudW1iZXJ9IElmIDAgaXMgcmV0dXJuZWQgdGhlbiB0aGUgZW50aXR5IHdhcyBub3QgcGVyc2lzdGVkLFxuICogb3RoZXJ3aXNlIHRoZSB2YWx1ZSByZXR1cm5lZCB3aWxsIGJlIHRoZSBpZCBwZXJzaXN0ZWQuXG4gKi9cbmZ1bmN0aW9uKiBwZXJzaXN0UmVsYXRpb25zRm9yRW50aXR5SWRBbmRSZWxhdGlvbklkKFxuXHRtb2RlbE5hbWUsXG5cdGVudGl0eUlkLFxuXHRyZWxhdGlvbk5hbWUsXG5cdHJlbGF0aW9uSWQsXG5cdGFkZFJlbGF0aW9uID0gdHJ1ZSxcblx0cmVsYXRpb25TdGF0ZSA9IERFRkFVTFRfRU1QVFlfT0JKRUNUXG4pIHtcblx0bW9kZWxOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRyZWxhdGlvbk5hbWUgPSBwbHVyYWxNb2RlbE5hbWUoIHJlbGF0aW9uTmFtZSApO1xuXHRyZWxhdGlvblN0YXRlID0geWllbGQgcmVzb2x2ZURpc3BhdGNoKFxuXHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0J2dldFJlbGF0aW9uU3RhdGUnLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRhZGRSZWxhdGlvbixcblx0XHRyZWxhdGlvblN0YXRlXG5cdCk7XG5cdGxldCBlbnRpdHlJZENoYW5nZWQgPSBmYWxzZTtcblx0aWYgKCBpc0VtcHR5KCByZWxhdGlvblN0YXRlICkgKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblx0Ly8gaXMgdGhlIGVudGl0eUlkIGEgY3VpZD8gIElmIHNvLCB0aGVuIGxldCdzIHBlcnNpc3QuXG5cdGlmICggY3VpZC5pc0N1aWQoIGVudGl0eUlkICkgKSB7XG5cdFx0ZW50aXR5SWQgPSB5aWVsZCByZXNvbHZlRGlzcGF0Y2goXG5cdFx0XHRDT1JFX1JFRFVDRVJfS0VZLFxuXHRcdFx0J3BlcnNpc3ROZXdFbnRpdHlBbmRSZW1vdmVEaXJ0eVJlbGF0aW9ucycsXG5cdFx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0XHRyZWxhdGlvbklkLFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0ZW50aXR5SWQsXG5cdFx0XHRhZGRSZWxhdGlvbixcblx0XHRcdFsgbW9kZWxOYW1lLCBlbnRpdHlJZCBdLFxuXHRcdCk7XG5cdFx0Ly8gaWYgZW50aXR5SWQgaXMgMCBiYWlsIGJlY2F1c2UgaXQgZGlkbid0IGdldCBwZXJzaXN0ZWQgc28gcmVsYXRpb25zXG5cdFx0Ly8gY2FuJ3QgYmUgcGVyc2lzdGVkIGVpdGhlci5cblx0XHRpZiAoIGVudGl0eUlkID09PSAwICkge1xuXHRcdFx0cmV0dXJuIGVudGl0eUlkO1xuXHRcdH1cblx0XHRlbnRpdHlJZENoYW5nZWQgPSB0cnVlO1xuXHR9XG5cblx0Ly8gaXMgdGhlIHJlbGF0aW9uSWQgYSBjdWlkPyBJZiBzbywgdGhlbiBsZXQncyBwZXJzaXN0XG5cdGlmICggY3VpZC5pc0N1aWQoIHJlbGF0aW9uSWQgKSApIHtcblx0XHRyZWxhdGlvbklkID0geWllbGQgcmVzb2x2ZURpc3BhdGNoKFxuXHRcdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHRcdCdwZXJzaXN0TmV3RW50aXR5QW5kUmVtb3ZlRGlydHlSZWxhdGlvbnMnLFxuXHRcdFx0cmVsYXRpb25OYW1lLFxuXHRcdFx0cmVsYXRpb25JZCxcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdGVudGl0eUlkLFxuXHRcdFx0YWRkUmVsYXRpb24sXG5cdFx0XHRbIHNpbmd1bGFyTW9kZWxOYW1lKCByZWxhdGlvbk5hbWUgKSwgcmVsYXRpb25JZCBdLFxuXHRcdFx0ISBlbnRpdHlJZENoYW5nZWQsXG5cdFx0KTtcblx0XHQvLyBpZiByZWxhdGlvbklkIGlzIDAsIGJhaWwgYmVjYXVzZSBpdCBkaWRuJ3QgZ2V0IHBlcnNpc3RlZCBzbyByZWxhdGlvbnNcblx0XHQvLyBjYW4ndCBiZSBwZXJzaXN0ZWQgZWl0aGVyLlxuXHRcdGlmICggcmVsYXRpb25JZCA9PT0gMCApIHtcblx0XHRcdHJldHVybiByZWxhdGlvbklkO1xuXHRcdH1cblx0fVxuXHRjb25zdCBlbmRwb2ludCA9IHlpZWxkIHJlc29sdmVTZWxlY3QoXG5cdFx0U0NIRU1BX1JFRFVDRVJfS0VZLFxuXHRcdCdnZXRSZWxhdGlvbkVuZHBvaW50Rm9yRW50aXR5SWQnLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHlJZCxcblx0XHRyZWxhdGlvbk5hbWUsXG5cdCk7XG5cdGNvbnN0IHN1Y2Nlc3MgPSBlbmRwb2ludCA/XG5cdFx0eWllbGQgZmV0Y2goXG5cdFx0XHR7XG5cdFx0XHRcdHBhdGg6IGVuZHBvaW50ICsgJy8nICsgcmVsYXRpb25JZCxcblx0XHRcdFx0bWV0aG9kOiBhZGRSZWxhdGlvbiA/ICdQVVQnIDogJ0RFTEVURScsXG5cdFx0XHR9XG5cdFx0KSA6XG5cdFx0ZmFsc2U7XG5cdGlmICggc3VjY2VzcyApIHtcblx0XHQvLyBFdmVuIHdoZW4gaWRzIGhhdmUgY2hhbmdlZCwgdGhpcyBzaG91bGQgY2F0Y2ggYW55IHBvdGVudGlhbCBxdWV1ZWRcblx0XHQvLyByZWxhdGlvbiBpdGVtcyBmb3IgdGhvc2UgdGhpbmdzIHRoYXQgZ290IHVwZGF0ZWQgaW4gc3RhdGUgaW4gYSBwcmlvclxuXHRcdC8vIGRpc3BhdGNoXG5cdFx0eWllbGQgcmVtb3ZlRGlydHlSZWxhdGlvbkZvclR5cGUoXG5cdFx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0XHRyZWxhdGlvbklkLFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0ZW50aXR5SWQsXG5cdFx0XHRhZGRSZWxhdGlvblxuXHRcdCk7XG5cdFx0cmV0dXJuIHJlbGF0aW9uSWQ7XG5cdH1cblx0cmV0dXJuIDA7XG59XG5cbi8qKlxuICogQWN0aW9uIGdlbmVyYXRvciBmb3IgaGFuZGxpbmcgcGVyc2lzdGluZyBhIG5ldyBlbnRpdHkgZXhpc3RpbmcgaW4gdGhlXG4gKiByZWxhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25OYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gcmVsYXRpb25JZFxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IGVudGl0eUlkXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFkZFJlbGF0aW9uXG4gKiBAcGFyYW0ge0FycmF5fSBwZXJzaXN0aW5nQXJndW1lbnRzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGRvUmVsYXRpb25SZW1vdmFsXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEVpdGhlciB0aGUgbmV3IGlkIG9yIDAgaWYgdGhlIGVudGl0eSB3YXMgbm90IHN1Y2Nlc3NmdWxseVxuICogcGVyc2lzdGVkLlxuICovXG5mdW5jdGlvbiogcGVyc2lzdE5ld0VudGl0eUFuZFJlbW92ZURpcnR5UmVsYXRpb25zKFxuXHRyZWxhdGlvbk5hbWUsXG5cdHJlbGF0aW9uSWQsXG5cdG1vZGVsTmFtZSxcblx0ZW50aXR5SWQsXG5cdGFkZFJlbGF0aW9uLFxuXHRwZXJzaXN0aW5nQXJndW1lbnRzLFxuXHRkb1JlbGF0aW9uUmVtb3ZhbCA9IHRydWUsXG4pIHtcblx0cmVsYXRpb25OYW1lID0gcGx1cmFsTW9kZWxOYW1lKCByZWxhdGlvbk5hbWUgKTtcblx0bW9kZWxOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRjb25zdCBwZXJzaXN0ZWRFbnRpdHkgPSB5aWVsZCByZXNvbHZlRGlzcGF0Y2goXG5cdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHQncGVyc2lzdEZvckVudGl0eUlkJyxcblx0XHQuLi5wZXJzaXN0aW5nQXJndW1lbnRzLFxuXHQpO1xuXHQvLyBpZiBub3QgZGlzcGF0Y2hlZCBzdWNjZXNzZnVsbHkgdGhlbiBsZXQncyBiYWlsIGJlY2F1c2UgcmVsYXRpb24gY2FuJ3Rcblx0Ly8gYmUgcGVyc2lzdGVkXG5cdGlmICggISBpc01vZGVsRW50aXR5T2ZNb2RlbCggcGVyc2lzdGVkRW50aXR5LCBwZXJzaXN0aW5nQXJndW1lbnRzWyAwIF0gKSApIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXHRpZiAoIGRvUmVsYXRpb25SZW1vdmFsICkge1xuXHRcdC8vIGVuc3VyZSBvbGRJZCBpcyByZW1vdmVkIGZyb20gaXRlbXMgKHRoaXMgaXMgYSBmYWlsc2FmZSBpbiBjYXNlIHRoZVxuXHRcdC8vIGlkIHN3YXAgaW4gcmVsYXRpb24gc3RhdGUgaXNuJ3QgY29tcGxldGUgeWV0KS5cblx0XHR5aWVsZCByZW1vdmVEaXJ0eVJlbGF0aW9uRm9yVHlwZShcblx0XHRcdHJlbGF0aW9uTmFtZSxcblx0XHRcdHJlbGF0aW9uSWQsXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRlbnRpdHlJZCxcblx0XHRcdGFkZFJlbGF0aW9uXG5cdFx0KTtcblx0fVxuXHRyZXR1cm4gcGVyc2lzdGVkRW50aXR5LmlkO1xufVxuXG4vKipcbiAqIEdlbmVyYXRvciBmb3IgcmV0dXJuaW5nIHJlbGF0aW9uIHN0YXRlIGZvciB0aGUgZ2l2ZW4gbW9kZWwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtib29sZWFufSBhZGRSZWxhdGlvbiAgV2hldGhlciB0byByZXR1cm4gdGhlIHJlbGF0aW9uIHN0YXRlIGZvciByZWxhdGlvbnNcbiAqIHF1ZXVlZCBmb3IgYWRkaW5nICh0cnVlKSBvciBkZWxldGlvbiAoZmFsc2UpLlxuICogQHBhcmFtIHtPYmplY3R9IHJlbGF0aW9uU3RhdGUgIE9wdGlvbmFsbHksIGNhbGxlcnMgY2FuIHByb3ZpZGUgYSByZWxhdGlvblxuICogcmVsYXRpb24gc3RhdGUgYW5kIGlmIHByb3ZpZGVkIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHNlbGVjdGluZyBmcm9tIHRoZVxuICogc3RvcmUuXG4gKlxuICogQHJldHVybiB7T2JqZWN0fSAgVGhlIHJlbGF0aW9uIHN0YXRlIGZvciB0aGUgZ2l2ZW4gbW9kZWwuXG4gKi9cbmZ1bmN0aW9uKiBnZXRSZWxhdGlvblN0YXRlKFxuXHRtb2RlbE5hbWUsXG5cdGFkZFJlbGF0aW9uID0gdHJ1ZSxcblx0cmVsYXRpb25TdGF0ZSA9IERFRkFVTFRfRU1QVFlfT0JKRUNUXG4pIHtcblx0Y29uc3Qgc2VsZWN0b3IgPSBhZGRSZWxhdGlvbiA/XG5cdFx0J2dldFJlbGF0aW9uQWRkaXRpb25zUXVldWVkRm9yTW9kZWwnIDpcblx0XHQnZ2V0UmVsYXRpb25EZWxldGlvbnNRdWV1ZWRGb3JNb2RlbCc7XG5cdHJlbGF0aW9uU3RhdGUgPSBpc0VtcHR5KCByZWxhdGlvblN0YXRlICkgP1xuXHRcdHlpZWxkIHNlbGVjdChcblx0XHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0XHRzZWxlY3Rvcixcblx0XHRcdG1vZGVsTmFtZSxcblx0XHQpIDpcblx0XHRyZWxhdGlvblN0YXRlO1xuXHRyZXR1cm4gcmVsYXRpb25TdGF0ZTtcbn1cblxuZXhwb3J0IHtcblx0cGVyc2lzdEFkZFJlbGF0aW9uc0Zvck1vZGVsLFxuXHRwZXJzaXN0RGVsZXRlUmVsYXRpb25zRm9yTW9kZWwsXG5cdHBlcnNpc3RSZWxhdGlvbnNGb3JNb2RlbCxcblx0cGVyc2lzdFJlbGF0aW9uc0ZvckVudGl0eUlkLFxuXHRwZXJzaXN0UmVsYXRpb25zRm9yRW50aXR5SWRBbmRSZWxhdGlvbixcblx0cGVyc2lzdFJlbGF0aW9uc0ZvckVudGl0eUlkQW5kUmVsYXRpb25JZCxcblx0cGVyc2lzdE5ld0VudGl0eUFuZFJlbW92ZURpcnR5UmVsYXRpb25zLFxuXHRnZXRSZWxhdGlvblN0YXRlLFxufTtcbiIsIi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBBQ1RJT05fVFlQRVMgfSBmcm9tICcuL2FjdGlvbi10eXBlcyc7XG5jb25zdCB7IGVudGl0aWVzOiB0eXBlcyB9ID0gQUNUSU9OX1RZUEVTO1xuXG4vKipcbiAqIEFjdGlvbiBmb3IgcmVjZWl2aW5nIGVudGl0eSByZWNvcmRzLlxuICogRW50aXR5IHJlY29yZHMgcmVjZWl2ZWQgd2lsbCBOT1QgcmVwbGFjZSBhbnkgZXhpc3RpbmcgZW50aXRpZXMgaW4gdGhlIHN0YXRlXG4gKiAobWF0Y2hpbmcgaWRzKS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lIGV4cGVjdGVkIHRvIGJlIGFuIG1vZGVsIG5hbWUuXG4gKiBAcGFyYW0ge0FycmF5PEJhc2VFbnRpdHk+fSBlbnRpdGllcyBBcnJheSBvZiBtb2RlbCBlbnRpdHlcbiAqIGluc3RhbmNlcyBpbmRleGVkIGJ5IHRoZSBwcmltYXJ5IGtleS5cbiAqIEByZXR1cm4ge1xuICoge1xuICogXHR0eXBlOiBzdHJpbmcsXG4gKiBcdG1vZGVsTmFtZTogc3RyaW5nLFxuICogXHRlbnRpdGllczogQXJyYXk8QmFzZUVudGl0eT5cbiAqIFx0fVxuICogfSAgQW4gYWN0aW9uIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gcmVjZWl2ZUVudGl0eVJlY29yZHMoIG1vZGVsTmFtZSwgZW50aXRpZXMgPSBbXSApIHtcblx0cmV0dXJuIHtcblx0XHR0eXBlOiB0eXBlcy5SRUNFSVZFX0VOVElUWV9SRUNPUkRTLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdGllcyxcblx0fTtcbn1cblxuLyoqXG4gKiBTYW1lIGFzIHJlY2VpdmVFbnRpdHlSZWNvcmRzIGV4Y2VwdCBpbmNvbWluZyBlbnRpdGllcyB3aWxsIHJlcGxhY2UgYW55XG4gKiBtYXRjaGluZyByZWNvcmRzIChieSBJRCkgIGluIHRoZSBzdGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7QXJyYXl9IGVudGl0aWVzXG4gKiBAcmV0dXJuIHtcbiAqIHtcbiAqIFx0dHlwZTogc3RyaW5nLFxuICogXHRtb2RlbE5hbWU6IHN0cmluZyxcbiAqIFx0ZW50aXRpZXM6IEFycmF5PEJhc2VFbnRpdHk+XG4gKiBcdH1cbiAqIH0gIEFuIGFjdGlvbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVBbmRSZXBsYWNlRW50aXR5UmVjb3JkcyggbW9kZWxOYW1lLCBlbnRpdGllcyA9IFtdICkge1xuXHRyZXR1cm4ge1xuXHRcdHR5cGU6IHR5cGVzLlJFQ0VJVkVfQU5EX1JFUExBQ0VfRU5USVRZX1JFQ09SRFMsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0aWVzLFxuXHR9O1xufVxuXG4vKipcbiAqIEFjdGlvbiBjcmVhdG9yIGZvciBhZGRpbmcgYW4gZW50aXR5IHRvIHRoZSBzdGF0ZSAoYXMgb3Bwb3NlZCB0byBhbiBlbnRpdHlcbiAqIHJlY29yZClcbiAqXG4gKiBAcGFyYW0ge0Jhc2VFbnRpdHl9IGVudGl0eVxuICogQHJldHVybiB7e3R5cGU6IHN0cmluZywgZW50aXR5OiBCYXNlRW50aXR5fX0gQW4gYWN0aW9uXG4gKiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVFbnRpdHkoIGVudGl0eSApIHtcblx0cmV0dXJuIHtcblx0XHR0eXBlOiB0eXBlcy5SRUNFSVZFX0VOVElUWSxcblx0XHRlbnRpdHksXG5cdH07XG59XG5cbi8qKlxuICogQWN0aW9uIGNyZWF0b3IgZm9yIHF1ZXVpbmcgYW4gZW50aXR5IGlkIGZvciB0cmFzaC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gZW50aXR5SWRcbiAqIEByZXR1cm4ge3t0eXBlOiBzdHJpbmcsIG1vZGVsTmFtZTogc3RyaW5nLCBlbnRpdHlJZDogbnVtYmVyfX0gQW4gYWN0aW9uXG4gKiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVUcmFzaEVudGl0eUlkKCBtb2RlbE5hbWUsIGVudGl0eUlkICkge1xuXHRyZXR1cm4ge1xuXHRcdHR5cGU6IHR5cGVzLlJFQ0VJVkVfVFJBU0hfRU5USVRZX0lELFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHlJZCxcblx0fTtcbn1cblxuLyoqXG4gKiBBY3Rpb24gY3JlYXRvciBmb3IgcXVldWVpbmcgYW4gZW50aXR5IGlkIGZvciBoYXJkIGRlbGV0ZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gZW50aXR5SWRcbiAqIEByZXR1cm4ge3t0eXBlOiBzdHJpbmcsIG1vZGVsTmFtZTogc3RyaW5nLCBlbnRpdHlJZDogbnVtYmVyfX0gQW4gYWN0aW9uXG4gKiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVEZWxldGVFbnRpdHlJZCggbW9kZWxOYW1lLCBlbnRpdHlJZCApIHtcblx0cmV0dXJuIHtcblx0XHR0eXBlOiB0eXBlcy5SRUNFSVZFX0RFTEVURV9FTlRJVFlfSUQsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkLFxuXHR9O1xufVxuXG5leHBvcnQge1xuXHRyZWNlaXZlRW50aXR5UmVjb3Jkcyxcblx0cmVjZWl2ZUFuZFJlcGxhY2VFbnRpdHlSZWNvcmRzLFxuXHRyZWNlaXZlRW50aXR5LFxuXHRyZWNlaXZlRGVsZXRlRW50aXR5SWQsXG5cdHJlY2VpdmVUcmFzaEVudGl0eUlkLFxufTtcbiIsIi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQge1xuXHRUWVBFX1FVRVVFX1JFTEFUSU9OX0FERCxcblx0VFlQRV9RVUVVRV9SRUxBVElPTl9ERUxFVEUsXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBBQ1RJT05fVFlQRVMgfSBmcm9tICcuL2FjdGlvbi10eXBlcyc7XG5jb25zdCB7IHJlbGF0aW9uczogdHlwZXMgfSA9IEFDVElPTl9UWVBFUztcblxuLyoqXG4gKiBBY3Rpb24gY3JlYXRvciBmb3IgYWRkaW5nIHJlbGF0aW9uIGluZGV4ZXMgZm9yIGVudGl0aWVzIGFuZCB0aGVpciByZWxhdGlvbnMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IGVudGl0eUlkXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25OYW1lXG4gKiBAcGFyYW0ge0FycmF5fSByZWxhdGVkRW50aXR5SWRzXG4gKiBAcmV0dXJuIHtcbiAqIFx0e1xuICogXHRcdHR5cGU6IHN0cmluZyxcbiAqIFx0XHRtb2RlbE5hbWU6IHN0cmluZyxcbiAqIFx0XHRlbnRpdHlJZDogbnVtYmVyLFxuICogXHRcdHJlbGF0ZWRFbnRpdHlJZHM6IEFycmF5XG4gKiBcdH1cbiAqIH0gQW4gYWN0aW9uIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gcmVjZWl2ZVJlbGF0ZWRFbnRpdGllcyhcblx0bW9kZWxOYW1lLFxuXHRlbnRpdHlJZCxcblx0cmVsYXRpb25OYW1lLFxuXHRyZWxhdGVkRW50aXR5SWRzXG4pIHtcblx0cmV0dXJuIHtcblx0XHR0eXBlOiB0eXBlcy5SRUNFSVZFX1JFTEFURURfRU5USVRZX0lEUyxcblx0XHRtb2RlbE5hbWUsXG5cdFx0ZW50aXR5SWQsXG5cdFx0cmVsYXRpb25OYW1lLFxuXHRcdHJlbGF0ZWRFbnRpdHlJZHMsXG5cdH07XG59XG5cbi8qKlxuICogQWN0aW9uIGNyZWF0b3IgZm9yIHF1ZXVpbmcgdGhlIGEgcmVsYXRpb24gY3JlYXRpb24gZm9yIHRoZSBnaXZlbiBkYXRhLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbk5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSByZWxhdGlvbkVudGl0eUlkXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gZW50aXR5SWRcbiAqIEByZXR1cm4ge1xuICogXHR7XG4gKiBcdFx0dHlwZTogc3RyaW5nLFxuICogXHRcdHJlbGF0aW9uTmFtZTogc3RyaW5nLFxuICogXHRcdHJlbGF0aW9uRW50aXR5SWQ6IG51bWJlcixcbiAqIFx0XHRtb2RlbE5hbWU6IHN0cmluZyxcbiAqIFx0XHRlbnRpdHlJZDogbnVtYmVyLFxuICogXHRcdHF1ZXVlVHlwZTogc3RyaW5nXG4gKiBcdH1cbiAqIH1cbiAqIEFuIGFjdGlvbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVEaXJ0eVJlbGF0aW9uQWRkaXRpb24oXG5cdHJlbGF0aW9uTmFtZSxcblx0cmVsYXRpb25FbnRpdHlJZCxcblx0bW9kZWxOYW1lLFxuXHRlbnRpdHlJZCxcbikge1xuXHRyZXR1cm4ge1xuXHRcdHR5cGU6IHR5cGVzLlJFQ0VJVkVfRElSVFlfUkVMQVRJT05fQURESVRJT04sXG5cdFx0cmVsYXRpb25OYW1lLFxuXHRcdHJlbGF0aW9uRW50aXR5SWQsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkLFxuXHRcdHF1ZXVlVHlwZTogVFlQRV9RVUVVRV9SRUxBVElPTl9BREQsXG5cdH07XG59XG5cbi8qKlxuICogQWN0aW9uIGNyZWF0b3IgZm9yIHF1ZXVlaW5nIHRoZSByZWxhdGlvbiBkZWxldGlvbiBmb3IgdGhlIGdpdmVuIGRhdGEuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IHJlbGF0aW9uRW50aXR5SWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbnRpdHlJZFxuICogQHJldHVybiB7XG4gKiBcdHtcbiAqIFx0XHR0eXBlOiBzdHJpbmcsXG4gKiBcdFx0cmVsYXRpb25OYW1lOiBzdHJpbmcsXG4gKiBcdFx0cmVsYXRpb25FbnRpdHlJZDogbnVtYmVyLFxuICogXHRcdG1vZGVsTmFtZTogc3RyaW5nLFxuICogXHRcdGVudGl0eUlkOiBudW1iZXIsXG4gKiBcdFx0cXVldWVUeXBlOiBzdHJpbmdcbiAqIFx0fVxuICogfSBBbiBhY3Rpb24gb2JqZWN0LlxuICovXG5mdW5jdGlvbiByZWNlaXZlRGlydHlSZWxhdGlvbkRlbGV0aW9uKFxuXHRyZWxhdGlvbk5hbWUsXG5cdHJlbGF0aW9uRW50aXR5SWQsXG5cdG1vZGVsTmFtZSxcblx0ZW50aXR5SWQsXG4pIHtcblx0cmV0dXJuIHtcblx0XHR0eXBlOiB0eXBlcy5SRUNFSVZFX0RJUlRZX1JFTEFUSU9OX0RFTEVUSU9OLFxuXHRcdHJlbGF0aW9uTmFtZSxcblx0XHRyZWxhdGlvbkVudGl0eUlkLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHlJZCxcblx0XHRxdWV1ZVR5cGU6IFRZUEVfUVVFVUVfUkVMQVRJT05fREVMRVRFLFxuXHR9O1xufVxuXG4vKipcbiAqIEFjdGlvbiBjcmVhdG9yIGZvciB0cmlnZ2VyaW5nIHRoZSByZXBsYWNlbWVudCBvZiBhbnkgaW5zdGFuY2Ugb2YgdGhlIG9sZFxuICogZW50aXR5IGlkIGluIHRoZSBzdGF0ZSBmb3IgdGhlIGdpdmVuIG1vZGVsIHdpdGggdGhlIG5ldyBlbnRpdHkgaWQuXG4gKlxuICogVHlwaWNhbGx5IHRoaXMgaXMgdHJpZ2dlcmVkIGFmdGVyIHBlcnNpc3RpbmcgYSBuZXcgZW50aXR5IHRvIHRoZSBzZXJ2ZXIgYW5kXG4gKiByZWNlaXZpbmcgaXRzIG5ldyBlbnRpdHkgaWQgb24gcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IG9sZEVudGl0eUlkXG4gKiBAcGFyYW0ge251bWJlcn0gbmV3RW50aXR5SWRcbiAqIEByZXR1cm4ge1xuICogXHR7XG4gKiBcdFx0dHlwZTogc3RyaW5nLFxuICogXHRcdG1vZGVsTmFtZTogKixcbiAqIFx0XHRvbGRFbnRpdHlJZDogKixcbiAqIFx0XHRuZXdFbnRpdHlJZDogKlxuICogXHR9XG4gKiB9IEFuIGFjdGlvbiBvYmplY3RcbiAqL1xuZnVuY3Rpb24gcmVjZWl2ZVVwZGF0ZWRFbnRpdHlJZEZvclJlbGF0aW9ucyhcblx0bW9kZWxOYW1lLFxuXHRvbGRFbnRpdHlJZCxcblx0bmV3RW50aXR5SWRcbikge1xuXHRyZXR1cm4ge1xuXHRcdHR5cGU6IHR5cGVzLlJFQ0VJVkVfVVBEQVRFRF9FTlRJVFlfSURfRk9SX1JFTEFUSU9OUyxcblx0XHRtb2RlbE5hbWUsXG5cdFx0b2xkRW50aXR5SWQsXG5cdFx0bmV3RW50aXR5SWQsXG5cdH07XG59XG5cbmV4cG9ydCB7XG5cdHJlY2VpdmVSZWxhdGVkRW50aXRpZXMsXG5cdHJlY2VpdmVEaXJ0eVJlbGF0aW9uQWRkaXRpb24sXG5cdHJlY2VpdmVEaXJ0eVJlbGF0aW9uRGVsZXRpb24sXG5cdHJlY2VpdmVVcGRhdGVkRW50aXR5SWRGb3JSZWxhdGlvbnMsXG59O1xuIiwiLyoqXG4gKiBJbnRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IEFDVElPTl9UWVBFUyB9IGZyb20gJy4vYWN0aW9uLXR5cGVzJztcbmNvbnN0IHsgZW50aXRpZXM6IHR5cGVzIH0gPSBBQ1RJT05fVFlQRVM7XG5cbi8qKlxuICogQWN0aW9uIGNyZWF0b3IgZm9yIHJlbW92aW5nIHRoZSBlbnRpdHkgZnJvbSB0aGUgc3RhdGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IGVudGl0eUlkXG4gKiBAcmV0dXJuIHt7dHlwZTogc3RyaW5nLCBtb2RlbE5hbWU6IHN0cmluZywgZW50aXR5SWQ6IG51bWJlcn19IEFuIGFjdGlvblxuICogb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRW50aXR5QnlJZCggbW9kZWxOYW1lLCBlbnRpdHlJZCApIHtcblx0cmV0dXJuIHtcblx0XHR0eXBlOiB0eXBlcy5SRU1PVkVfRU5USVRZX0JZX0lELFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHlJZCxcblx0fTtcbn1cblxuLyoqXG4gKiBBY3Rpb24gY3JlYXRvciBmb3IgcXVldWVpbmcgdGhlIGRlbGV0aW9uIG9mIGVudGl0eSBvbiB0aGUgc2VydmVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IGVudGl0eUlkXG4gKiBAcmV0dXJuIHt7dHlwZTogc3RyaW5nLCBtb2RlbE5hbWU6IHN0cmluZywgZW50aXR5SWQ6IHtudW1iZXJ9fX0gQW4gYWN0aW9uXG4gKiBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZURlbGV0ZUVudGl0eUlkKCBtb2RlbE5hbWUsIGVudGl0eUlkICkge1xuXHRyZXR1cm4ge1xuXHRcdHR5cGU6IHR5cGVzLlJFTU9WRV9ERUxFVEVfRU5USVRZX0lELFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHlJZCxcblx0fTtcbn1cblxuLyoqXG4gKiBBY3Rpb24gY3JlYXRvciBmb3IgcXVldWluZyB0aGUgdHJhc2hpbmcgb2YgZW50aXR5IG9uIHRoZSBzZXJ2ZXJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gZW50aXR5SWRcbiAqIEByZXR1cm4ge3t0eXBlOiBzdHJpbmcsIG1vZGVsTmFtZTogc3RyaW5nLCBlbnRpdHlJZDogbnVtYmVyfX0gQW4gYWN0aW9uXG4gKiBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVUcmFzaEVudGl0eUlkKCBtb2RlbE5hbWUsIGVudGl0eUlkICkge1xuXHRyZXR1cm4ge1xuXHRcdHR5cGU6IHR5cGVzLlJFTU9WRV9UUkFTSF9FTlRJVFlfSUQsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkLFxuXHR9O1xufVxuIiwiLyoqXG4gKiBJbnRlcm5hbCBpbXBvcnRzXG4gKi9cbi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQge1xuXHRUWVBFX1FVRVVFX1JFTEFUSU9OX0FERCxcblx0VFlQRV9RVUVVRV9SRUxBVElPTl9ERUxFVEUsXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBBQ1RJT05fVFlQRVMgfSBmcm9tICcuL2FjdGlvbi10eXBlcyc7XG5jb25zdCB7IHJlbGF0aW9uczogdHlwZXMgfSA9IEFDVElPTl9UWVBFUztcblxuLyoqXG4gKiBBY3Rpb24gY3JlYXRvciBmb3IgcmVtb3ZpbmcgYWxsIGluZGV4ZWQgcmVsYXRpb25zIGZvciBhIHNwZWNpZmljIGVudGl0eSBmcm9tXG4gKiB0aGUgc3RhdGUuXG4gKlxuICogTm90ZTogVGhlIGZvbGxvd2luZyB0aGluZ3MgYXJlIGFjY29tcGxpc2hlZCBieSB0aGlzIGFjdGlvbiAodmlhIHRoZSByZWR1Y2VyKTpcbiAqIC0gVGhlIHJlbGF0aW9uIGluZGV4IGZvciB0aGUgcmVsYXRpb24gb24gdGhpcyBlbnRpdHkgaXMgcmVtb3ZlZCBmcm9tIHN0YXRlLlxuICogLSBJZiB0aGUgcmVsYXRpb24gZW50aXRpZXMgdGhlbXNlbHZlcyBoYXZlIG5vIG90aGVyIHJlbGF0aW9uIGluZGV4LCB0aGV5XG4gKiAgIGFyZSBhbHNvIHJlbW92ZWQgZnJvbSBzdGF0ZS5cbiAqIC0gQW55IGRpcnR5IHJlbGF0aW9ucyBmb3IgdGhpcyBlbnRpdHkgYXJlIHJlbW92ZWQgZnJvbSBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gZW50aXR5SWRcbiAqIEByZXR1cm4ge3t0eXBlOiBzdHJpbmcsIG1vZGVsTmFtZTogc3RyaW5nLCBlbnRpdHlJZDogbnVtYmVyfX1cbiAqIEFuIGFjdGlvbiBvYmplY3RcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQWxsUmVsYXRlZEVudGl0aWVzRm9yTW9kZWxFbnRpdHkoIG1vZGVsTmFtZSwgZW50aXR5SWQgKSB7XG5cdHJldHVybiB7XG5cdFx0dHlwZTogdHlwZXMuUkVNT1ZFX1JFTEFURURfRU5USVRJRVNfRk9SX0VOVElUWSxcblx0XHRtb2RlbE5hbWUsXG5cdFx0ZW50aXR5SWQsXG5cdH07XG59XG5cbi8qKlxuICogQWN0aW9uIGNyZWF0b3IgZm9yIHJlbW92aW5nIHJlbGF0aW9ucyBmcm9tIHRoZSBnaXZlbiBtb2RlbCBmcm9tIHRoZSByZWxhdGlvbnNcbiAqIHN0YXRlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbnRpdHlJZFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uTmFtZVxuICogQHBhcmFtIHtBcnJheX0gcmVsYXRlZEVudGl0eUlkc1xuICogQHJldHVybiB7XG4gKiBcdHtcbiAqIFx0XHR0eXBlOiBzdHJpbmcsXG4gKiBcdFx0bW9kZWxOYW1lOiBzdHJpbmcsXG4gKiBcdFx0ZW50aXR5SWQ6IG51bWJlcixcbiAqIFx0XHRyZWxhdGlvbk5hbWU6IHN0cmluZyxcbiAqIFx0XHRyZWxhdGlvbkVudGl0eUlkczogQXJyYXlcbiAqIFx0fVxuICogfSBBbiBhY3Rpb24gb2JqZWN0LlxuICovXG5mdW5jdGlvbiByZW1vdmVSZWxhdGVkRW50aXRpZXMoXG5cdG1vZGVsTmFtZSxcblx0ZW50aXR5SWQsXG5cdHJlbGF0aW9uTmFtZSxcblx0cmVsYXRlZEVudGl0eUlkcyxcbikge1xuXHRyZXR1cm4ge1xuXHRcdHR5cGU6IHR5cGVzLlJFTU9WRV9SRUxBVEVEX0VOVElUWV9JRFMsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkLFxuXHRcdHJlbGF0aW9uTmFtZSxcblx0XHRyZWxhdGVkRW50aXR5SWRzLFxuXHR9O1xufVxuXG4vKipcbiAqIEFjdGlvbiBjcmVhdG9yIGZvciByZW1vdmluZyB0aGUgZGlydHkgcmVsYXRpb24gZnJvbSB0aGUgc3RhdGUgZm9yIHRoZSBnaXZlblxuICogcmVsYXRpb24gYWN0aW9uIHR5cGUgKGRlbGV0ZSBvciBhZGQpLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbk5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSByZWxhdGlvbkVudGl0eUlkXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gZW50aXR5SWRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYWRkUmVsYXRpb25cbiAqIEByZXR1cm4ge1xuICogXHR7XG4gKiBcdFx0cmVsYXRpb25OYW1lOiBzdHJpbmcsXG4gKiBcdFx0cmVsYXRpb25FbnRpdHlJZDogbnVtYmVyLFxuICogXHRcdG1vZGVsTmFtZTogc3RyaW5nLFxuICogXHRcdGVudGl0eUlkOiBudW1iZXIsXG4gKiBcdFx0dHlwZTogc3RyaW5nLFxuICogXHRcdHF1ZXVlVHlwZTogc3RyaW5nXG4gKiBcdH1cbiAqIH0gQW4gYWN0aW9uIG9iamVjdFxuICovXG5mdW5jdGlvbiByZW1vdmVEaXJ0eVJlbGF0aW9uRm9yVHlwZShcblx0cmVsYXRpb25OYW1lLFxuXHRyZWxhdGlvbkVudGl0eUlkLFxuXHRtb2RlbE5hbWUsXG5cdGVudGl0eUlkLFxuXHRhZGRSZWxhdGlvbiA9IHRydWVcbikge1xuXHRjb25zdCB0eXBlID0gYWRkUmVsYXRpb24gPyB0eXBlcy5SRU1PVkVfRElSVFlfUkVMQVRJT05fQURESVRJT04gOlxuXHRcdHR5cGVzLlJFTU9WRV9ESVJUWV9SRUxBVElPTl9ERUxFVElPTjtcblx0cmV0dXJuIHtcblx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0cmVsYXRpb25FbnRpdHlJZCxcblx0XHRtb2RlbE5hbWUsXG5cdFx0ZW50aXR5SWQsXG5cdFx0dHlwZSxcblx0XHRxdWV1ZVR5cGU6IGFkZFJlbGF0aW9uID9cblx0XHRcdFRZUEVfUVVFVUVfUkVMQVRJT05fQUREIDpcblx0XHRcdFRZUEVfUVVFVUVfUkVMQVRJT05fREVMRVRFLFxuXHR9O1xufVxuXG4vKipcbiAqIEFjdGlvbiBjcmVhdG9yIGZvciByZW1vdmluZyB0aGUgZGlydHkgcmVsYXRpb24gZnJvbSB0aGUgYWRkIHJlbGF0aW9uIHN0YXRlXG4gKiByZWNvcmQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IHJlbGF0aW9uRW50aXR5SWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbnRpdHlJZFxuICogQHJldHVybiB7XG4gKiBcdHtcbiAqIFx0XHRyZWxhdGlvbk5hbWU6IHN0cmluZyxcbiAqIFx0XHRyZWxhdGlvbkVudGl0eUlkOiBudW1iZXIsXG4gKiBcdFx0bW9kZWxOYW1lOiBzdHJpbmcsXG4gKiBcdFx0ZW50aXR5SWQ6IG51bWJlcixcbiAqIFx0XHR0eXBlOiBzdHJpbmcsXG4gKiBcdFx0cXVldWVUeXBlOiBzdHJpbmdcbiAqIFx0fVxuICogfSBBbiBhY3Rpb24gb2JqZWN0LlxuICovXG5mdW5jdGlvbiByZW1vdmVEaXJ0eVJlbGF0aW9uQWRkaXRpb24oXG5cdHJlbGF0aW9uTmFtZSxcblx0cmVsYXRpb25FbnRpdHlJZCxcblx0bW9kZWxOYW1lLFxuXHRlbnRpdHlJZCxcbikge1xuXHRyZXR1cm4gcmVtb3ZlRGlydHlSZWxhdGlvbkZvclR5cGUoXG5cdFx0cmVsYXRpb25OYW1lLFxuXHRcdHJlbGF0aW9uRW50aXR5SWQsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkLFxuXHQpO1xufVxuXG4vKipcbiAqIEFuIGFjdGlvbiBjcmVhdG9yIGZvciByZW1vdmluZyB0aGUgZGlydHkgcmVsYXRpb24gZnJvbSB0aGUgZGVsZXRlIHJlbGF0aW9uXG4gKiBzdGF0ZSByZWNvcmQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IHJlbGF0aW9uRW50aXR5SWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbnRpdHlJZFxuICogQHJldHVybiB7XG4gKiBcdHtcbiAqIFx0XHRyZWxhdGlvbk5hbWU6IHN0cmluZyxcbiAqIFx0XHRyZWxhdGlvbkVudGl0eUlkOiBudW1iZXIsXG4gKiBcdFx0bW9kZWxOYW1lOiBzdHJpbmcsXG4gKiBcdFx0ZW50aXR5SWQ6IG51bWJlcixcbiAqIFx0XHR0eXBlOiBzdHJpbmcsXG4gKiBcdFx0cXVldWVUeXBlOiBzdHJpbmdcbiAqIFx0fVxuICogfSBBbiBhY3Rpb24gb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIHJlbW92ZURpcnR5UmVsYXRpb25EZWxldGlvbihcblx0cmVsYXRpb25OYW1lLFxuXHRyZWxhdGlvbkVudGl0eUlkLFxuXHRtb2RlbE5hbWUsXG5cdGVudGl0eUlkLFxuKSB7XG5cdHJldHVybiByZW1vdmVEaXJ0eVJlbGF0aW9uRm9yVHlwZShcblx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0cmVsYXRpb25FbnRpdHlJZCxcblx0XHRtb2RlbE5hbWUsXG5cdFx0ZW50aXR5SWQsXG5cdFx0ZmFsc2UsXG5cdCk7XG59XG5cbmV4cG9ydCB7XG5cdHJlbW92ZUFsbFJlbGF0ZWRFbnRpdGllc0Zvck1vZGVsRW50aXR5LFxuXHRyZW1vdmVSZWxhdGVkRW50aXRpZXMsXG5cdHJlbW92ZURpcnR5UmVsYXRpb25BZGRpdGlvbixcblx0cmVtb3ZlRGlydHlSZWxhdGlvbkRlbGV0aW9uLFxuXHRyZW1vdmVEaXJ0eVJlbGF0aW9uRm9yVHlwZSxcbn07XG4iLCJleHBvcnQgY29uc3QgUkVEVUNFUl9LRVkgPSAnZXZlbnRlc3ByZXNzby9jb3JlJztcbmV4cG9ydCBjb25zdCBUWVBFX1FVRVVFX1JFTEFUSU9OX0RFTEVURSA9ICdkZWxldGUnO1xuZXhwb3J0IGNvbnN0IFRZUEVfUVVFVUVfUkVMQVRJT05fQUREID0gJ2FkZCc7XG4iLCIvKipcbiAqIFdvcmRQcmVzcyBkZXBlbmRlbmNpZXNcbiAqL1xuaW1wb3J0IHsgcmVnaXN0ZXJTdG9yZSB9IGZyb20gJ0B3b3JkcHJlc3MvZGF0YSc7XG5cbi8qKlxuICogSW50ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cbmltcG9ydCByZWR1Y2VyIGZyb20gJy4vcmVkdWNlcnMnO1xuaW1wb3J0ICogYXMgc2VsZWN0b3JzIGZyb20gJy4vc2VsZWN0b3JzJztcbmltcG9ydCAqIGFzIGFjdGlvbnMgZnJvbSAnLi9hY3Rpb25zJztcbmltcG9ydCAqIGFzIHJlc29sdmVycyBmcm9tICcuL3Jlc29sdmVycyc7XG5pbXBvcnQge1xuXHRzZWxlY3RvcnMgYXMgbW9kZWxTZWxlY3RvcnMsXG5cdGFjdGlvbnMgYXMgbW9kZWxBY3Rpb25zLFxuXHRyZXNvbHZlcnMgYXMgbW9kZWxSZXNvbHZlcnMsXG59IGZyb20gJy4vbW9kZWwnO1xuaW1wb3J0IHsgUkVEVUNFUl9LRVkgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgY29udHJvbHMgZnJvbSAnLi4vYmFzZS1jb250cm9scyc7XG5cbi8qKlxuICogUmVnaXN0ZXJzIHN0b3JlIGZvciAnZXZlbnRlc3ByZXNzby9jb3JlJy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXJTdG9yZSggUkVEVUNFUl9LRVksIHtcblx0cmVkdWNlcixcblx0YWN0aW9uczogeyAuLi5hY3Rpb25zLCAuLi5tb2RlbEFjdGlvbnMgfSxcblx0c2VsZWN0b3JzOiB7IC4uLnNlbGVjdG9ycywgLi4ubW9kZWxTZWxlY3RvcnMgfSxcblx0cmVzb2x2ZXJzOiB7IC4uLnJlc29sdmVycywgLi4ubW9kZWxSZXNvbHZlcnMgfSxcblx0Y29udHJvbHMsXG59ICk7XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHtcblx0aXNNb2RlbEVudGl0eU9mTW9kZWwsXG5cdGlzTW9kZWxFbnRpdHlGYWN0b3J5T2ZNb2RlbCxcbn0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vdmFsaWRhdG9ycyc7XG5pbXBvcnQgeyBJbnZhbGlkTW9kZWxFbnRpdHkgfSBmcm9tICdAZXZlbnRlc3ByZXNzby9lZWpzJztcbmltcG9ydCB7IGdldEVuZHBvaW50IH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vbW9kZWwnO1xuaW1wb3J0IHsgX18gfSBmcm9tICdAZXZlbnRlc3ByZXNzby9pMThuJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJ3dhcm5pbmcnO1xuXG4vKipcbiAqIEludGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgZGlzcGF0Y2gsIGZldGNoLCByZXNvbHZlU2VsZWN0IH0gZnJvbSAnLi4vLi4vLi4vYmFzZS1jb250cm9scyc7XG5pbXBvcnQgeyBSRURVQ0VSX0tFWSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBSRURVQ0VSX0tFWSBhcyBTQ0hFTUFfUkVEVUNFUl9LRVkgfSBmcm9tICcuLi8uLi8uLi9zY2hlbWEvY29uc3RhbnRzJztcblxuLyoqXG4gKiBBY3Rpb24gZm9yIHJlY2VpdmluZyB0aGUgbGF0ZXN0IGNoZWNrLWluIHJlY29yZCBmb3IgdGhlIGdpdmVuIGRhdGV0aW1lIGlkIGFuZFxuICogcmVnaXN0cmF0aW9uIGlkLlxuICpcbiAqIEBwYXJhbSB7QmFzZUVudGl0eX0gY2hlY2tpbkVudGl0eVxuICogQHBhcmFtIHtudW1iZXJ9IHJlZ2lzdHJhdGlvbklkXG4gKiBAcGFyYW0ge251bWJlcn0gZGF0ZVRpbWVJZFxuICovXG5leHBvcnQgZnVuY3Rpb24qIHJlY2VpdmVMYXRlc3RDaGVja2luKFxuXHRjaGVja2luRW50aXR5LFxuXHRyZWdpc3RyYXRpb25JZCxcblx0ZGF0ZVRpbWVJZFxuKSB7XG5cdGlmICggISBpc01vZGVsRW50aXR5T2ZNb2RlbCggY2hlY2tpbkVudGl0eSwgJ2NoZWNraW4nICkgKSB7XG5cdFx0dGhyb3cgbmV3IEludmFsaWRNb2RlbEVudGl0eShcblx0XHRcdCdFeHBlY3RlZCBhIGNoZWNraW4gcmVjb3JkLicsXG5cdFx0XHRjaGVja2luRW50aXR5XG5cdFx0KTtcblx0fVxuXHR5aWVsZCBkaXNwYXRjaChcblx0XHRSRURVQ0VSX0tFWSxcblx0XHQncmVjZWl2ZUVudGl0eScsXG5cdFx0Y2hlY2tpbkVudGl0eVxuXHQpO1xuXHR5aWVsZCBkaXNwYXRjaChcblx0XHQnY29yZS9kYXRhJyxcblx0XHQnZmluaXNoUmVzb2x1dGlvbicsXG5cdFx0UkVEVUNFUl9LRVksXG5cdFx0J2dldEVudGl0eUJ5SWQnLFxuXHRcdFsgJ2NoZWNraW4nLCBjaGVja2luRW50aXR5LmlkIF1cblx0KTtcblx0eWllbGQgZGlzcGF0Y2goXG5cdFx0J2NvcmUvZGF0YScsXG5cdFx0J2ZpbmlzaFJlc29sdXRpb24nLFxuXHRcdFJFRFVDRVJfS0VZLFxuXHRcdCdnZXRMYXRlc3RDaGVja2luJyxcblx0XHRbIHJlZ2lzdHJhdGlvbklkLCBkYXRlVGltZUlkIF1cblx0KTtcblx0eWllbGQgZGlzcGF0Y2goXG5cdFx0UkVEVUNFUl9LRVksXG5cdFx0J3JlY2VpdmVTZWxlY3RvclZhbHVlJyxcblx0XHQnZ2V0TGF0ZXN0Q2hlY2tpbicsXG5cdFx0Y2hlY2tpbkVudGl0eS5pZCxcblx0XHRyZWdpc3RyYXRpb25JZCxcblx0XHRkYXRlVGltZUlkLFxuXHQpO1xufVxuXG4vKipcbiAqIFRvZ2dsZXMgdGhlIGNoZWNraW4gc3RhdGUgZm9yIHRoZSBnaXZlbiByZWdpc3RyYXRpb24gaWQgYW5kIGRhdGV0aW1lIGlkLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSByZWdpc3RyYXRpb25JZFxuICogQHBhcmFtIHtudW1iZXJ9IGRhdGVUaW1lSWRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2UgIElmIHRydWUsIHRoZW4gd2hldGhlciB0aGUgcmVnaXN0cmF0aW9uIENBTiBiZSBjaGVja2VkXG4gKiBpbiBvciBub3QgaXMgaWdub3JlZC5cbiAqIEByZXR1cm4ge0Jhc2VFbnRpdHl8bnVsbH0gTnVsbCBpZiB0aGVyZSBpcyBhbiBlcnJvciBvciB0aGUgbmV3IENoZWNraW4gZW50aXR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiogdG9nZ2xlQ2hlY2tpbiggcmVnaXN0cmF0aW9uSWQsIGRhdGVUaW1lSWQsIGZvcmNlID0gZmFsc2UgKSB7XG5cdGxldCBjaGVja0luUmVzcG9uc2U7XG5cdGNvbnN0IHBhdGggPSBgJHsgZ2V0RW5kcG9pbnQoICdyZWdpc3RyYXRpb24nICkgfS9gICtcblx0XHRgJHsgcmVnaXN0cmF0aW9uSWQgfS90b2dnbGVfY2hlY2tpbl9mb3JfZGF0ZXRpbWUvJHsgZGF0ZVRpbWVJZCB9YDtcblx0dHJ5IHtcblx0XHRjaGVja0luUmVzcG9uc2UgPSB5aWVsZCBmZXRjaCgge1xuXHRcdFx0cGF0aCxcblx0XHRcdG1ldGhvZDogJ1BPU1QnLFxuXHRcdFx0ZGF0YTogeyBmb3JjZSB9LFxuXHRcdH0gKTtcblx0fSBjYXRjaCAoIGVycm9yICkge1xuXHRcdHlpZWxkIGRpc3BhdGNoKFxuXHRcdFx0J2NvcmUvbm90aWNlcycsXG5cdFx0XHQnY3JlYXRlRXJyb3JOb3RpY2UnLFxuXHRcdFx0X18oXG5cdFx0XHRcdCdUb2dnbGluZyB0aGUgY2hlY2tpbiBmYWlsZWQuIFVzdWFsbHkgdGhpcyBpcyBkdWUgdG8gdGhlIGNoZWNraW4gbm90IGhhdmluZyBhY2Nlc3MnLFxuXHRcdFx0XHQnZXZlbnRfZXNwcmVzc28nLFxuXHRcdFx0KVxuXHRcdCk7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0Y29uc3QgZmFjdG9yeSA9IHlpZWxkIHJlc29sdmVTZWxlY3QoXG5cdFx0U0NIRU1BX1JFRFVDRVJfS0VZLFxuXHRcdCdnZXRGYWN0b3J5Rm9yTW9kZWwnLFxuXHRcdCdjaGVja2luJ1xuXHQpO1xuXHRpZiAoICEgaXNNb2RlbEVudGl0eUZhY3RvcnlPZk1vZGVsKCBmYWN0b3J5LCAnY2hlY2tpbicgKSApIHtcblx0XHR3YXJuaW5nKFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHQnVGhlIGZhY3RvcnkgZm9yIHRoZSBjaGVja2luIG1vZGVsIGNvdWxkIG5vdCBiZSByZXRyaWV2ZWQuJ1xuXHRcdCk7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0Y29uc3QgbmV3Q2hlY2tpbiA9IGZhY3RvcnkuZnJvbUV4aXN0aW5nKCBjaGVja0luUmVzcG9uc2UgKTtcblx0eWllbGQgZGlzcGF0Y2goXG5cdFx0UkVEVUNFUl9LRVksXG5cdFx0J3JlY2VpdmVMYXRlc3RDaGVja2luJyxcblx0XHRuZXdDaGVja2luLFxuXHRcdHJlZ2lzdHJhdGlvbklkLFxuXHRcdGRhdGVUaW1lSWQsXG5cdCk7XG5cdHJldHVybiBuZXdDaGVja2luO1xufVxuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IGdldEVuZHBvaW50IH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vbW9kZWwnO1xuaW1wb3J0IHsgaXNNb2RlbEVudGl0eUZhY3RvcnlPZk1vZGVsIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vdmFsaWRhdG9ycyc7XG5pbXBvcnQgeyBpc0VtcHR5LCBpc1VuZGVmaW5lZCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJztcblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IGZldGNoLCBkaXNwYXRjaCwgcmVzb2x2ZVNlbGVjdCB9IGZyb20gJy4uLy4uLy4uL2Jhc2UtY29udHJvbHMnO1xuaW1wb3J0IHsgUkVEVUNFUl9LRVkgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgUkVEVUNFUl9LRVkgYXMgU0NIRU1BX1JFRFVDRVJfS0VZIH0gZnJvbSAnLi4vLi4vLi4vc2NoZW1hL2NvbnN0YW50cyc7XG5cbi8qKlxuICogUmVzb2x2ZXIgZm9yIHRoZSBnZXRMYXRlc3RDaGVja2luIGFjdGlvbi5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gcmVnaXN0cmF0aW9uSWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBkYXRlVGltZUlkXG4gKiBAcmV0dXJuIHtCYXNlRW50aXR5fG51bGx9IE51bGwgaWYgdGhlcmUgaXMgYW4gZXJyb3Igb3Igbm8gY2hlY2tpbiByZWNvcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiogZ2V0TGF0ZXN0Q2hlY2tpbiggcmVnaXN0cmF0aW9uSWQsIGRhdGVUaW1lSWQgKSB7XG5cdGxldCBjaGVja0luUmVzcG9uc2U7XG5cdHdhcm5pbmcoXG5cdFx0ISBpc1VuZGVmaW5lZCggcmVnaXN0cmF0aW9uSWQgKSAmJiAhIGlzVW5kZWZpbmVkKCBkYXRlVGltZUlkICksXG5cdFx0J0JvdGggYSByZWdpc3RyYXRpb24gaWQgYW5kIGRhdGV0aW1lIGlkIGFyZSBuZWVkZWQgZm9yIGdldHRpbmcgdGhlICcgK1xuXHRcdCdsYXRlc3QgY2hlY2tpbi4nXG5cdCk7XG5cdGNvbnN0IHBhdGggPSBgJHsgZ2V0RW5kcG9pbnQoICdjaGVja2luJyApIH0vYCArXG5cdFx0YD93aGVyZVtSRUdfSURdPSR7IHJlZ2lzdHJhdGlvbklkIH0md2hlcmVbRFRUX0lEXT0keyBkYXRlVGltZUlkIH1gICtcblx0XHQnJm9yZGVyX2J5W0NIS190aW1lc3RhbXBdPURFU0MmbGltaXQ9MSc7XG5cdHRyeSB7XG5cdFx0Y2hlY2tJblJlc3BvbnNlID0geWllbGQgZmV0Y2goIHtcblx0XHRcdHBhdGgsXG5cdFx0XHRtZXRob2Q6ICdHRVQnLFxuXHRcdH0gKTtcblx0XHRpZiAoIGlzRW1wdHkoIGNoZWNrSW5SZXNwb25zZSApICkge1xuXHRcdFx0Ly8gdGhlcmUgaXMgbm8gY2hlY2tpbiByZWNvcmQgeWV0IVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdGNoZWNrSW5SZXNwb25zZSA9IGNoZWNrSW5SZXNwb25zZS5wb3AoKTtcblx0fSBjYXRjaCAoIGVycm9yICkge1xuXHRcdC8vIEB0b2RvIG5lZWQgdG8gZG8gc29tZXRoaW5nIGRpZmZlcmVudCB3aGVuIHRoZSB1c2VyIGlzbid0IGF1dGhlZCBhbmRcblx0XHQvLyB0aGlzIGlzIHRoZSBjYXVzZSBmb3IgdGhlIGVycm9yP1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cdGNvbnN0IGZhY3RvcnkgPSB5aWVsZCByZXNvbHZlU2VsZWN0KFxuXHRcdFNDSEVNQV9SRURVQ0VSX0tFWSxcblx0XHQnZ2V0RmFjdG9yeUZvck1vZGVsJyxcblx0XHQnY2hlY2tpbidcblx0KTtcblx0aWYgKCAhIGlzTW9kZWxFbnRpdHlGYWN0b3J5T2ZNb2RlbCggZmFjdG9yeSwgJ2NoZWNraW4nICkgKSB7XG5cdFx0d2FybmluZyhcblx0XHRcdGZhbHNlLFxuXHRcdFx0J1RoZSBmYWN0b3J5IGZvciB0aGUgY2hlY2tpbiBtb2RlbCBjb3VsZCBub3QgYmUgcmV0cmlldmVkLidcblx0XHQpO1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cdGNvbnN0IG5ld0NoZWNraW4gPSBmYWN0b3J5LmZyb21FeGlzdGluZyggY2hlY2tJblJlc3BvbnNlICk7XG5cdHlpZWxkIGRpc3BhdGNoKFxuXHRcdFJFRFVDRVJfS0VZLFxuXHRcdCdyZWNlaXZlTGF0ZXN0Q2hlY2tpbicsXG5cdFx0bmV3Q2hlY2tpbixcblx0XHRyZWdpc3RyYXRpb25JZCxcblx0XHRkYXRlVGltZUlkLFxuXHQpO1xuXHRyZXR1cm4gbmV3Q2hlY2tpbjtcbn1cbiIsImltcG9ydCB7IGdldFNlbGVjdG9yVmFsdWUgfSBmcm9tICcuLi9tb2RlbC1zcGVjaWZpYy1zZWxlY3RvcnMnO1xuaW1wb3J0IHsgZ2V0RW50aXR5QnlJZCB9IGZyb20gJy4uLy4uL3NlbGVjdG9ycyc7XG5cbi8qKlxuICogR2V0cyB0aGUgbGF0ZXN0IGNoZWNraW4gZW50aXR5IGluIHRoZSBzdGF0ZSBmb3IgdGhlIGdpdmVuIHZhbHVlLlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gcmVnaXN0cmF0aW9uSWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBkYXRlVGltZUlkXG4gKiBAcmV0dXJuIHtudWxsfEJhc2VFbnRpdHl9IFRoZSBjaGVja2luIGVudGl0eSBpZiBpdCBleGlzdHMgb3IgbnVsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdENoZWNraW4oIHN0YXRlLCByZWdpc3RyYXRpb25JZCwgZGF0ZVRpbWVJZCApIHtcblx0Y29uc3QgY2hlY2tpbklkID0gZ2V0U2VsZWN0b3JWYWx1ZShcblx0XHRzdGF0ZSxcblx0XHQnZ2V0TGF0ZXN0Q2hlY2tpbicsXG5cdFx0cmVnaXN0cmF0aW9uSWQsXG5cdFx0ZGF0ZVRpbWVJZFxuXHQpO1xuXHRpZiAoICEgY2hlY2tpbklkICkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cdHJldHVybiBnZXRFbnRpdHlCeUlkKCBzdGF0ZSwgJ2NoZWNraW4nLCBjaGVja2luSWQgKTtcbn1cbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0XG4gKi9cbmltcG9ydCB7IE1PREVMX05BTUVTIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vbW9kZWwnO1xuXG4vKipcbiAqIEludGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgZ2V0TWV0aG9kTmFtZSB9IGZyb20gJy4uLy4uL2Jhc2UtbW9kZWwnO1xuXG4vKipcbiAqIER5bmFtaWMgY3JlYXRpb24gb2YgYWN0aW9ucyBmb3IgZW50aXRpZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb24gVGhlIGFjdGlvbiBvYmplY3QgdGhhdCBkeW5hbWljYWxseSBjcmVhdGVkIGZ1bmN0aW9uc1xuICogd2lsbCBiZSBtYXBwZWQgdG8uXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBuZXcgYWN0aW9uIG9iamVjdCBjb250YWluaW5nIGZ1bmN0aW9ucyBmb3IgZWFjaCBtb2RlbC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUFjdGlvbnMgPSAoIGFjdGlvbiApID0+IE1PREVMX05BTUVTLnJlZHVjZShcblx0KCBhY3Rpb25zLCBtb2RlbE5hbWUgKSA9PiB7XG5cdFx0YWN0aW9uc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCcnLFxuXHRcdFx0J2NyZWF0ZSdcblx0XHQpIF0gPSAoIGVudGl0eSApID0+IGFjdGlvbi5jcmVhdGVFbnRpdHkoIG1vZGVsTmFtZSwgZW50aXR5ICk7XG5cdFx0YWN0aW9uc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCdieUlkJyxcblx0XHRcdCdkZWxldGUnXG5cdFx0KSBdID0gKCBlbnRpdHlJZCApID0+IGFjdGlvbi5kZWxldGVFbnRpdHlCeUlkKCBtb2RlbE5hbWUsIGVudGl0eUlkICk7XG5cdFx0YWN0aW9uc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCdieUlkJyxcblx0XHRcdCd0cmFzaCcsXG5cdFx0KSBdID0gKCBlbnRpdHlJZCApID0+IGFjdGlvbi50cmFzaEVudGl0eUJ5SWQoIG1vZGVsTmFtZSwgZW50aXR5SWQgKTtcblx0XHRhY3Rpb25zWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J3JlY29yZCcsXG5cdFx0XHQncGVyc2lzdCdcblx0XHQpIF0gPSAoIGVudGl0eSApID0+IGFjdGlvbi5wZXJzaXN0RW50aXR5UmVjb3JkKCBtb2RlbE5hbWUsIGVudGl0eSApO1xuXHRcdGFjdGlvbnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQnaWQnLFxuXHRcdFx0J3BlcnNpc3RGb3InLFxuXHRcdCkgXSA9ICggZW50aXR5SWQgKSA9PiBhY3Rpb24ucGVyc2lzdEZvckVudGl0eUlkKCBtb2RlbE5hbWUsIGVudGl0eUlkICk7XG5cdFx0YWN0aW9uc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCdpZHMnLFxuXHRcdFx0J3BlcnNpc3RGb3InLFxuXHRcdCkgXSA9ICggZW50aXR5SWRzICkgPT4gYWN0aW9uLnBlcnNpc3RGb3JFbnRpdHlJZHMoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRlbnRpdHlJZHNcblx0XHQpO1xuXHRcdGFjdGlvbnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQnJyxcblx0XHRcdCdwZXJzaXN0RGVsZXRlc0ZvcicsXG5cdFx0KSBdID0gKCkgPT4gYWN0aW9uLnBlcnNpc3REZWxldGVzRm9yTW9kZWwoIG1vZGVsTmFtZSApO1xuXHRcdGFjdGlvbnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQnJyxcblx0XHRcdCdwZXJzaXN0VHJhc2hlc0ZvcicsXG5cdFx0KSBdID0gKCkgPT4gYWN0aW9uLnBlcnNpc3RUcmFzaGVzRm9yTW9kZWwoIG1vZGVsTmFtZSApO1xuXHRcdGFjdGlvbnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQnYnlJZCcsXG5cdFx0XHQncmVtb3ZlJyxcblx0XHQpIF0gPSAoIGVudGl0eUlkICkgPT4gYWN0aW9uLnJlbW92ZUVudGl0eUJ5SWQoIG1vZGVsTmFtZSwgZW50aXR5SWQgKTtcblx0XHRhY3Rpb25zWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J2lkJyxcblx0XHRcdCdyZW1vdmVEZWxldGUnLFxuXHRcdCkgXSA9ICggZW50aXR5SWQgKSA9PiBhY3Rpb24ucmVtb3ZlRGVsZXRlRW50aXR5SWQoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRlbnRpdHlJZFxuXHRcdCk7XG5cdFx0YWN0aW9uc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCdpZCcsXG5cdFx0XHQncmVtb3ZlVHJhc2gnLFxuXHRcdCkgXSA9ICggZW50aXR5SWQgKSA9PiBhY3Rpb24ucmVtb3ZlVHJhc2hFbnRpdHlJZCggbW9kZWxOYW1lLCBlbnRpdHlJZCApO1xuXHRcdGFjdGlvbnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQnYW5kUmVzb2x2ZScsXG5cdFx0XHQncmVjZWl2ZScsXG5cdFx0XHR0cnVlXG5cdFx0KSBdID0gKCBlbnRpdGllcyApID0+IGFjdGlvbi5yZWNlaXZlRW50aXRpZXNBbmRSZXNvbHZlKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0ZW50aXRpZXNcblx0XHQpO1xuXHRcdGFjdGlvbnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQncmVjb3JkcycsXG5cdFx0XHQncmVjZWl2ZUFuZFJlcGxhY2UnLFxuXHRcdCkgXSA9ICggZW50aXRpZXMgKSA9PiBhY3Rpb24ucmVjZWl2ZUFuZFJlcGxhY2VFbnRpdHlSZWNvcmRzKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0ZW50aXRpZXNcblx0XHQpO1xuXHRcdGFjdGlvbnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQnaWQnLFxuXHRcdFx0J3JlY2VpdmVUcmFzaCcsXG5cdFx0KSBdID0gKCBlbnRpdHlJZCApID0+IGFjdGlvbi5yZWNlaXZlVHJhc2hFbnRpdHlJZChcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdGVudGl0eUlkXG5cdFx0KTtcblx0XHRhY3Rpb25zWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J2lkJyxcblx0XHRcdCdyZWNlaXZlRGVsZXRlJyxcblx0XHQpIF0gPSAoIGVudGl0eUlkICkgPT4gYWN0aW9uLnJlY2VpdmVEZWxldGVFbnRpdHlJZChcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdGVudGl0eUlkXG5cdFx0KTtcblx0XHRyZXR1cm4gYWN0aW9ucztcblx0fSxcblx0e31cbik7XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydFxuICovXG5pbXBvcnQgeyBNT0RFTF9OQU1FUyB9IGZyb20gJ0BldmVudGVzcHJlc3NvL21vZGVsJztcblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IGdldE1ldGhvZE5hbWUgfSBmcm9tICcuLi8uLi9iYXNlLW1vZGVsJztcblxuLyoqXG4gKiBEeW5hbWljIGNyZWF0aW9uIG9mIHJlc29sdmVycyBmb3IgZW50aXRpZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSByZXNvbHZlciBUaGUgcmVzb2x2ZXIgb2JqZWN0IHRoYXQgZHluYW1pY2FsbHkgY3JlYXRlZFxuICogZnVuY3Rpb25zIHdpbGwgYmUgbWFwcGVkIHRvLlxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgbmV3IHJlc29sdmVyIG9iamVjdCBjb250YWluaW5nIGZ1bmN0aW9ucyBmb3IgZWFjaCBtb2RlbC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlc29sdmVycyA9ICggcmVzb2x2ZXIgKSA9PiBNT0RFTF9OQU1FUy5yZWR1Y2UoXG5cdCggcmVzb2x2ZXJzLCBtb2RlbE5hbWUgKSA9PiB7XG5cdFx0cmVzb2x2ZXJzWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J2J5SWQnLFxuXHRcdFx0J2dldCdcblx0XHQpIF0gPSAoIGVudGl0eUlkICkgPT4gcmVzb2x2ZXIuZ2V0RW50aXR5QnlJZCggbW9kZWxOYW1lLCBlbnRpdHlJZCApO1xuXHRcdHJldHVybiByZXNvbHZlcnM7XG5cdH0sXG5cdHt9XG4pO1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRcbiAqL1xuaW1wb3J0IHsgTU9ERUxfTkFNRVMgfSBmcm9tICdAZXZlbnRlc3ByZXNzby9tb2RlbCc7XG5cbi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBnZXRNZXRob2ROYW1lIH0gZnJvbSAnLi4vLi4vYmFzZS1tb2RlbCc7XG5cbi8qKlxuICogRHluYW1pYyBjcmVhdGlvbiBvZiBzZWxlY3RvcnMgZm9yIGVudGl0aWVzXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZWN0b3Igc2VsZWN0b3Igb2JqZWN0IHRoYXQgZHluYW1pY2FsbHkgY3JlYXRlZCBmdW5jdGlvbnNcbiAqIHdpbGwgYmUgbWFwcGVkIHRvLlxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgbmV3IHNlbGVjdG9yIG9iamVjdHMgZm9yIGVhY2ggbW9kZWwuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVTZWxlY3RvcnMgPSAoIHNlbGVjdG9yICkgPT4gTU9ERUxfTkFNRVMucmVkdWNlKFxuXHQoIHNlbGVjdG9ycywgbW9kZWxOYW1lICkgPT4ge1xuXHRcdHNlbGVjdG9yc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCdyZWNvcmRzJyxcblx0XHRcdCdnZXQnXG5cdFx0KSBdID0gKFxuXHRcdFx0c3RhdGVcblx0XHQpID0+IHNlbGVjdG9yLmdldEVudGl0eVJlY29yZHNGb3JNb2RlbCggc3RhdGUsIG1vZGVsTmFtZSApO1xuXHRcdHNlbGVjdG9yc1sgZ2V0TWV0aG9kTmFtZSggbW9kZWxOYW1lLCAnJywgJ2dldCcsIHRydWUgKSBdID0gKFxuXHRcdFx0c3RhdGVcblx0XHQpID0+IHNlbGVjdG9yLmdldEVudGl0aWVzRm9yTW9kZWwoIHN0YXRlLCBtb2RlbE5hbWUgKTtcblx0XHRzZWxlY3RvcnNbIGdldE1ldGhvZE5hbWUoIG1vZGVsTmFtZSwgJ2J5SWQnLCAnZ2V0JyApIF0gPSAoXG5cdFx0XHRzdGF0ZSxcblx0XHRcdGVudGl0eUlkXG5cdFx0KSA9PiBzZWxlY3Rvci5nZXRFbnRpdHlCeUlkKCBzdGF0ZSwgbW9kZWxOYW1lLCBlbnRpdHlJZCApO1xuXHRcdHNlbGVjdG9yc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCdieUlkcycsXG5cdFx0XHQnZ2V0Jyxcblx0XHRcdHRydWVcblx0XHQpIF0gPSAoXG5cdFx0XHRzdGF0ZSxcblx0XHRcdGVudGl0eUlkcyxcblx0XHQpID0+IHNlbGVjdG9yLmdldEVudGl0aWVzQnlJZHMoIHN0YXRlLCBtb2RlbE5hbWUsIGVudGl0eUlkcyApO1xuXHRcdHNlbGVjdG9yc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCdpZHNRdWV1ZWRGb3JUcmFzaCcsXG5cdFx0XHQnZ2V0J1xuXHRcdCkgXSA9ICggc3RhdGUgKSA9PiBzZWxlY3Rvci5nZXRFbnRpdHlJZHNRdWV1ZWRGb3JUcmFzaChcblx0XHRcdHN0YXRlLFxuXHRcdFx0bW9kZWxOYW1lXG5cdFx0KTtcblx0XHRzZWxlY3RvcnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQnaWRzUXVldWVkRm9yRGVsZXRlJyxcblx0XHRcdCdnZXQnXG5cdFx0KSBdID0gKCBzdGF0ZSApID0+IHNlbGVjdG9yLmdldEVudGl0eUlkc1F1ZXVlZEZvckRlbGV0ZShcblx0XHRcdHN0YXRlLFxuXHRcdFx0bW9kZWxOYW1lXG5cdFx0KTtcblx0XHRyZXR1cm4gc2VsZWN0b3JzO1xuXHR9LFxuXHR7fVxuKTtcbiIsImltcG9ydCAqIGFzIGVudGl0eUFjdGlvbnMgZnJvbSAnLi9lbnRpdHktYWN0aW9ucyc7XG5pbXBvcnQgKiBhcyBlbnRpdHlSZXNvbHZlcnMgZnJvbSAnLi9lbnRpdHktcmVzb2x2ZXJzJztcbmltcG9ydCAqIGFzIGVudGl0eVNlbGVjdG9ycyBmcm9tICcuL2VudGl0eS1zZWxlY3RvcnMnO1xuaW1wb3J0ICogYXMgcmVsYXRpb25BY3Rpb25zIGZyb20gJy4vcmVsYXRpb24tYWN0aW9ucyc7XG5pbXBvcnQgKiBhcyByZWxhdGlvblNlbGVjdG9ycyBmcm9tICcuL3JlbGF0aW9uLXNlbGVjdG9ycyc7XG5pbXBvcnQgKiBhcyBiYXNlU2VsZWN0b3JzIGZyb20gJy4uL3NlbGVjdG9ycyc7XG5pbXBvcnQgKiBhcyBiYXNlQWN0aW9ucyBmcm9tICcuLi9hY3Rpb25zJztcbmltcG9ydCAqIGFzIGJhc2VSZXNvbHZlcnMgZnJvbSAnLi4vcmVzb2x2ZXJzJztcbmltcG9ydCAqIGFzIG1vZGVsQWN0aW9ucyBmcm9tICcuL21vZGVsLWFjdGlvbnMtaW5kZXgnO1xuaW1wb3J0ICogYXMgbW9kZWxTZWxlY3RvcnMgZnJvbSAnLi9tb2RlbC1zZWxlY3RvcnMtaW5kZXgnO1xuaW1wb3J0ICogYXMgbW9kZWxSZXNvbHZlcnMgZnJvbSAnLi9tb2RlbC1yZXNvbHZlcnMtaW5kZXgnO1xuXG5leHBvcnQgY29uc3Qgc2VsZWN0b3JzID0ge1xuXHQuLi5lbnRpdHlTZWxlY3RvcnMuY3JlYXRlU2VsZWN0b3JzKCBiYXNlU2VsZWN0b3JzICksXG5cdC4uLnJlbGF0aW9uU2VsZWN0b3JzLmNyZWF0ZVNlbGVjdG9ycyggYmFzZVNlbGVjdG9ycyApLFxuXHQuLi5tb2RlbFNlbGVjdG9ycyxcbn07XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25zID0ge1xuXHQuLi5lbnRpdHlBY3Rpb25zLmNyZWF0ZUFjdGlvbnMoIGJhc2VBY3Rpb25zICksXG5cdC4uLnJlbGF0aW9uQWN0aW9ucy5jcmVhdGVBY3Rpb25zKCBiYXNlQWN0aW9ucyApLFxuXHQuLi5tb2RlbEFjdGlvbnMsXG59O1xuXG5leHBvcnQgY29uc3QgcmVzb2x2ZXJzID0ge1xuXHQuLi5lbnRpdHlSZXNvbHZlcnMuY3JlYXRlUmVzb2x2ZXJzKCBiYXNlUmVzb2x2ZXJzICksXG5cdC4uLm1vZGVsUmVzb2x2ZXJzLFxufTtcbiIsImV4cG9ydCAqIGZyb20gJy4vbW9kZWwtc3BlY2lmaWMtYWN0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL2NoZWNraW4vYWN0aW9ucyc7XG4iLCJleHBvcnQgKiBmcm9tICcuL2NoZWNraW4vcmVzb2x2ZXJzJztcbiIsImV4cG9ydCAqIGZyb20gJy4vbW9kZWwtc3BlY2lmaWMtc2VsZWN0b3JzJztcbmV4cG9ydCAqIGZyb20gJy4vY2hlY2tpbi9zZWxlY3RvcnMnO1xuIiwiLyoqXG4gKiBJbnRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IEFDVElPTl9UWVBFUyB9IGZyb20gJy4uL2FjdGlvbnMvYWN0aW9uLXR5cGVzJztcbmNvbnN0IHsgbW9kZWxTcGVjaWZpYzogdHlwZXMgfSA9IEFDVElPTl9UWVBFUztcblxuLyoqXG4gKiBBY3Rpb24gZm9yIGFkZGluZyB0aGUgcmVzdWx0cyBvZiBhIHNwZWNpZmljIHNlbGVjdG9yIGFuZCBpdHMgdmFsdWUgdG8gdGhlXG4gKiBzdGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtBcnJheX0gYXJnc1xuICogQHJldHVybiB7T2JqZWN0fSBBbiBhY3Rpb24gb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNlaXZlU2VsZWN0b3JWYWx1ZSggc2VsZWN0b3IsIHZhbHVlLCAuLi5hcmdzICkge1xuXHRyZXR1cm4ge1xuXHRcdHR5cGU6IHR5cGVzLlJFQ0VJVkVfU0VMRUNUT1JfVkFMVUUsXG5cdFx0c2VsZWN0b3IsXG5cdFx0YXJncyxcblx0XHR2YWx1ZSxcblx0fTtcbn1cbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgY3JlYXRlU2VsZWN0b3IgZnJvbSAncmVtZW1vJztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHNlbGVjdG9yIGFuZCBhcmdzIGluIHRoZSBjdXJyZW50IHN0YXRlLlxuICpcbiAqIEB0eXBlIHsqfSBSZXR1cm5zIHdoYXRldmVyIHRoZSB2YWx1ZSB3YXMgYXNzaWduZWQgdG8gdGhlIHN0YXRlIGZvciB0aGUgZ2l2ZW5cbiAqIHNlbGVjdG9yIGFuZCBpdHMgYXJncy5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFNlbGVjdG9yVmFsdWUgPSBjcmVhdGVTZWxlY3Rvcihcblx0KCBzdGF0ZSwgc2VsZWN0b3IsIC4uLmFyZ3MgKSA9PiB7XG5cdFx0cmV0dXJuIHN0YXRlLm1vZGVsU3BlY2lmaWMuZ2V0SW4oXG5cdFx0XHRbIHNlbGVjdG9yLCBKU09OLnN0cmluZ2lmeSggYXJncyApIF1cblx0XHQpIHx8IG51bGw7XG5cdH0sXG5cdCggc3RhdGUsIHNlbGVjdG9yLCAuLi5hcmdzICkgPT4gW1xuXHRcdHN0YXRlLm1vZGVsU3BlY2lmaWMuZ2V0SW4oIFtcblx0XHRcdHNlbGVjdG9yLFxuXHRcdFx0SlNPTi5zdHJpbmdpZnkoIGFyZ3MgKSxcblx0XHRdICksXG5cdF0sXG4pO1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRcbiAqL1xuaW1wb3J0IHsgTU9ERUxfTkFNRVMgfSBmcm9tICdAZXZlbnRlc3ByZXNzby9tb2RlbCc7XG5cbi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBnZXRNZXRob2ROYW1lIH0gZnJvbSAnLi4vLi4vYmFzZS1tb2RlbCc7XG5cbi8qKlxuICogRHluYW1pYyBjcmVhdGlvbiBvZiBhY3Rpb25zIGZvciByZWxhdGlvbnNcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb24gVGhlIGFjdGlvbiBvYmplY3QgdGhhdCBkeW5hbWljYWxseSBjcmVhdGVkIGZ1bmN0aW9uc1xuICogd2lsbCBiZSBtYXBwZWQgdG8uXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBuZXcgYWN0aW9uIG9iamVjdCBjb250YWluaW5nIGZ1bmN0aW9ucyBmb3IgZWFjaCBtb2RlbFxuICogcmVsYXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVBY3Rpb25zID0gKCBhY3Rpb24gKSA9PiBNT0RFTF9OQU1FUy5yZWR1Y2UoXG5cdCggYWN0aW9ucywgbW9kZWxOYW1lICkgPT4ge1xuXHRcdGFjdGlvbnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQncmVsYXRpb24nLFxuXHRcdFx0J2NyZWF0ZScsXG5cdFx0KSBdID0gKCBlbnRpdHlJZCwgcmVsYXRpb25OYW1lLCByZWxhdGlvbkVudGl0eSApID0+IGFjdGlvblxuXHRcdFx0LmNyZWF0ZVJlbGF0aW9uKFxuXHRcdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRcdGVudGl0eUlkLFxuXHRcdFx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0XHRcdHJlbGF0aW9uRW50aXR5LFxuXHRcdFx0KTtcblx0XHRhY3Rpb25zWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J3JlbGF0aW9ucycsXG5cdFx0XHQnY3JlYXRlJyxcblx0XHQpIF0gPSAoIGVudGl0eUlkLCByZWxhdGlvbk5hbWUsIHJlbGF0aW9uRW50aXRpZXMgKSA9PiBhY3Rpb25cblx0XHRcdC5jcmVhdGVSZWxhdGlvbnMoXG5cdFx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdFx0ZW50aXR5SWQsXG5cdFx0XHRcdHJlbGF0aW9uTmFtZSxcblx0XHRcdFx0cmVsYXRpb25FbnRpdGllcyxcblx0XHRcdCk7XG5cdFx0YWN0aW9uc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCdyZWxhdGlvbkZvckFkZGl0aW9uJyxcblx0XHRcdCdyZW1vdmVEaXJ0eSdcblx0XHQpIF0gPSAoIGVudGl0eUlkLCByZWxhdGlvbk5hbWUsIHJlbGF0aW9uRW50aXR5SWQgKSA9PiBhY3Rpb25cblx0XHRcdC5yZW1vdmVEaXJ0eVJlbGF0aW9uRm9yQWRkaXRpb24oXG5cdFx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdFx0ZW50aXR5SWQsXG5cdFx0XHRcdHJlbGF0aW9uTmFtZSxcblx0XHRcdFx0cmVsYXRpb25FbnRpdHlJZCxcblx0XHRcdCk7XG5cdFx0YWN0aW9uc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCcnLFxuXHRcdFx0J3JlbW92ZVJlbGF0aW9uRm9yJ1xuXHRcdCkgXSA9ICggZW50aXR5SWQsIHJlbGF0aW9uTmFtZSwgcmVsYXRpb25FbnRpdHlJZCApID0+IGFjdGlvblxuXHRcdFx0LnJlbW92ZVJlbGF0aW9uRm9yRW50aXR5KFxuXHRcdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRcdGVudGl0eUlkLFxuXHRcdFx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0XHRcdHJlbGF0aW9uRW50aXR5SWRcblx0XHRcdCk7XG5cdFx0YWN0aW9uc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCcnLFxuXHRcdFx0J3BlcnNpc3RBZGRSZWxhdGlvbnNGb3InXG5cdFx0KSBdID0gKCkgPT4gYWN0aW9uLnBlcnNpc3RBZGRSZWxhdGlvbnNGb3JNb2RlbCggbW9kZWxOYW1lICk7XG5cdFx0YWN0aW9uc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCcnLFxuXHRcdFx0J3BlcnNpc3REZWxldGVSZWxhdGlvbnNGb3InXG5cdFx0KSBdID0gKCkgPT4gYWN0aW9uLnBlcnNpc3REZWxldGVSZWxhdGlvbnNGb3JNb2RlbCggbW9kZWxOYW1lICk7XG5cdFx0YWN0aW9uc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCcnLFxuXHRcdFx0J3BlcnNpc3RSZWxhdGlvbnNGb3InXG5cdFx0KSBdID0gKCBhZGRSZWxhdGlvbiA9IHRydWUgKSA9PlxuXHRcdFx0YWN0aW9uLnBlcnNpc3RSZWxhdGlvbnNGb3JNb2RlbCggbW9kZWxOYW1lLCBhZGRSZWxhdGlvbiApO1xuXHRcdGFjdGlvbnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQncmVsYXRpb25zRm9ySWQnLFxuXHRcdFx0J3BlcnNpc3QnXG5cdFx0KSBdID0gKCBlbnRpdHlJZCwgYWRkUmVsYXRpb24gPSB0cnVlICkgPT4gYWN0aW9uXG5cdFx0XHQucGVyc2lzdFJlbGF0aW9uc0ZvckVudGl0eUlkKFxuXHRcdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRcdGVudGl0eUlkLFxuXHRcdFx0XHRhZGRSZWxhdGlvblxuXHRcdFx0KTtcblx0XHRhY3Rpb25zWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J3JlbGF0aW9uc0ZvcklkQW5kUmVsYXRpb24nLFxuXHRcdFx0J3BlcnNpc3QnXG5cdFx0KSBdID0gKCBlbnRpdHlJZCwgcmVsYXRpb25OYW1lLCBhZGRSZWxhdGlvbiA9IHRydWUgKSA9PiBhY3Rpb25cblx0XHRcdC5wZXJzaXN0UmVsYXRpb25zRm9yRW50aXR5SWRBbmRSZWxhdGlvbihcblx0XHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0XHRlbnRpdHlJZCxcblx0XHRcdFx0cmVsYXRpb25OYW1lLFxuXHRcdFx0XHRhZGRSZWxhdGlvblxuXHRcdFx0KTtcblx0XHRhY3Rpb25zWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J3JlbGF0aW9uc0ZvcklkQW5kUmVsYXRpb25JZCcsXG5cdFx0XHQncGVyc2lzdCdcblx0XHQpIF0gPSAoXG5cdFx0XHRlbnRpdHlJZCxcblx0XHRcdHJlbGF0aW9uTmFtZSxcblx0XHRcdHJlbGF0aW9uSWQsXG5cdFx0XHRhZGRSZWxhdGlvbiA9IHRydWVcblx0XHQpID0+IGFjdGlvblxuXHRcdFx0LnBlcnNpc3RSZWxhdGlvbnNGb3JFbnRpdHlJZEFuZFJlbGF0aW9uSWQoXG5cdFx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdFx0ZW50aXR5SWQsXG5cdFx0XHRcdHJlbGF0aW9uTmFtZSxcblx0XHRcdFx0cmVsYXRpb25JZCxcblx0XHRcdFx0YWRkUmVsYXRpb25cblx0XHRcdCk7XG5cdFx0YWN0aW9uc1sgZ2V0TWV0aG9kTmFtZShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCdpZCcsXG5cdFx0XHQncmVjZWl2ZVJlbGF0ZWRFbnRpdGllc0Zvcidcblx0XHQpIF0gPSAoIGVudGl0eUlkLCByZWxhdGlvbk5hbWUsIHJlbGF0aW9uRW50aXR5SWRzICkgPT4gYWN0aW9uXG5cdFx0XHQucmVjZWl2ZVJlbGF0ZWRFbnRpdGllcyhcblx0XHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0XHRlbnRpdHlJZCxcblx0XHRcdFx0cmVsYXRpb25OYW1lLFxuXHRcdFx0XHRyZWxhdGlvbkVudGl0eUlkc1xuXHRcdFx0KTtcblx0XHRhY3Rpb25zWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J2lkJyxcblx0XHRcdCdyZWNlaXZlRGlydHlSZWxhdGlvbkFkZGl0aW9uRm9yJ1xuXHRcdCkgXSA9ICggcmVsYXRpb25OYW1lLCByZWxhdGlvbklkLCBlbnRpdHlJZCApID0+IGFjdGlvblxuXHRcdFx0LnJlY2VpdmVEaXJ0eVJlbGF0aW9uQWRkaXRpb24oXG5cdFx0XHRcdHJlbGF0aW9uTmFtZSxcblx0XHRcdFx0cmVsYXRpb25JZCxcblx0XHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0XHRlbnRpdHlJZFxuXHRcdFx0KTtcblx0XHRhY3Rpb25zWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J2lkJyxcblx0XHRcdCdyZWNlaXZlRGlydHlSZWxhdGlvbkRlbGV0aW9uRm9yJ1xuXHRcdCkgXSA9ICggcmVsYXRpb25OYW1lLCByZWxhdGlvbklkLCBlbnRpdHlJZCApID0+IGFjdGlvblxuXHRcdFx0LnJlY2VpdmVEaXJ0eVJlbGF0aW9uRGVsZXRpb24oXG5cdFx0XHRcdHJlbGF0aW9uTmFtZSxcblx0XHRcdFx0cmVsYXRpb25JZCxcblx0XHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0XHRlbnRpdHlJZFxuXHRcdFx0KTtcblx0XHRhY3Rpb25zWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J3JlbGF0aW9ucycsXG5cdFx0XHQncmVjZWl2ZVVwZGF0ZWRFbnRpdHlJZEZvcidcblx0XHQpIF0gPSAoIG9sZElkLCBuZXdJZCApID0+IGFjdGlvblxuXHRcdFx0LnJlY2VpdmVVcGRhdGVkRW50aXR5SWRGb3JSZWxhdGlvbnMoXG5cdFx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdFx0b2xkSWQsXG5cdFx0XHRcdG5ld0lkXG5cdFx0XHQpO1xuXHRcdGFjdGlvbnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQnaWQnLFxuXHRcdFx0J3JlbW92ZUFsbFJlbGF0ZWRFbnRpdGllc0Zvcidcblx0XHQpIF0gPSAoIGVudGl0eUlkICkgPT4gYWN0aW9uLnJlbW92ZUFsbFJlbGF0ZWRFbnRpdGllc0Zvck1vZGVsRW50aXR5KFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0ZW50aXR5SWRcblx0XHQpO1xuXHRcdGFjdGlvbnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQnaWRBbmRSZWxhdGlvbicsXG5cdFx0XHQncmVtb3ZlUmVsYXRlZEVudGl0aWVzRm9yJ1xuXHRcdCkgXSA9ICggZW50aXR5SWQsIHJlbGF0aW9uTmFtZSwgcmVsYXRpb25JZHMgKSA9PiBhY3Rpb25cblx0XHRcdC5yZW1vdmVSZWxhdGVkRW50aXRpZXMoXG5cdFx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdFx0ZW50aXR5SWQsXG5cdFx0XHRcdHJlbGF0aW9uTmFtZSxcblx0XHRcdFx0cmVsYXRpb25JZHMsXG5cdFx0XHQpO1xuXHRcdGFjdGlvbnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQnaWRBbmRSZWxhdGlvbicsXG5cdFx0XHQncmVtb3ZlRGlydHlSZWxhdGlvbkFkZGl0aW9uRm9yJ1xuXHRcdCkgXSA9IChcblx0XHRcdHJlbGF0aW9uTmFtZSxcblx0XHRcdHJlbGF0aW9uRW50aXR5SWQsXG5cdFx0XHRlbnRpdHlJZCxcblx0XHQpID0+IGFjdGlvbi5yZW1vdmVEaXJ0eVJlbGF0aW9uQWRkaXRpb24oXG5cdFx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0XHRyZWxhdGlvbkVudGl0eUlkLFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0ZW50aXR5SWQsXG5cdFx0KTtcblx0XHRhY3Rpb25zWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J2lkQW5kUmVsYXRpb24nLFxuXHRcdFx0J3JlbW92ZURpcnR5UmVsYXRpb25EZWxldGlvbkZvcidcblx0XHQpIF0gPSAoXG5cdFx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0XHRyZWxhdGlvbkVudGl0eUlkLFxuXHRcdFx0ZW50aXR5SWQsXG5cdFx0KSA9PiBhY3Rpb24ucmVtb3ZlRGlydHlSZWxhdGlvbkRlbGV0aW9uKFxuXHRcdFx0cmVsYXRpb25OYW1lLFxuXHRcdFx0cmVsYXRpb25FbnRpdHlJZCxcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdGVudGl0eUlkLFxuXHRcdCk7XG5cdFx0cmV0dXJuIGFjdGlvbnM7XG5cdH0sXG5cdHt9XG4pO1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRcbiAqL1xuaW1wb3J0IHsgTU9ERUxfTkFNRVMgfSBmcm9tICdAZXZlbnRlc3ByZXNzby9tb2RlbCc7XG5cbi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBnZXRNZXRob2ROYW1lIH0gZnJvbSAnLi4vLi4vYmFzZS1tb2RlbCc7XG5cbi8qKlxuICogRHluYW1pYyBjcmVhdGlvbiBvZiBzZWxlY3RvcnMgZm9yIHJlbGF0aW9uc1xuICogQHBhcmFtIHtPYmplY3R9IHNlbGVjdG9yIHNlbGVjdG9yIG9iamVjdCB0aGF0IGR5bmFtaWNhbGx5IGNyZWF0ZWQgZnVuY3Rpb25zXG4gKiB3aWxsIGJlIG1hcHBlZCB0by5cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIG5ldyBzZWxlY3RvciBvYmplY3RzIGZvciBlYWNoIG1vZGVsIHJlbGF0aW9uLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlU2VsZWN0b3JzID0gKCBzZWxlY3RvciApID0+IE1PREVMX05BTUVTLnJlZHVjZShcblx0KCBzZWxlY3RvcnMsIG1vZGVsTmFtZSApID0+IHtcblx0XHRzZWxlY3RvcnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQnYWRkaXRpb25SZWxhdGlvbnMnLFxuXHRcdFx0J2dldFF1ZXVlZCdcblx0XHQpIF0gPSAoIHN0YXRlICkgPT4gc2VsZWN0b3IuZ2V0UmVsYXRpb25BZGRpdGlvbnNRdWV1ZWRGb3JNb2RlbChcblx0XHRcdHN0YXRlLFxuXHRcdFx0bW9kZWxOYW1lXG5cdFx0KTtcblx0XHRzZWxlY3RvcnNbIGdldE1ldGhvZE5hbWUoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHQnZGVsZXRlUmVsYXRpb25zJyxcblx0XHRcdCdnZXRRdWV1ZWQnXG5cdFx0KSBdID0gKCBzdGF0ZSApID0+IHNlbGVjdG9yLmdldFJlbGF0aW9uRGVsZXRpb25zUXVldWVkRm9yTW9kZWwoXG5cdFx0XHRzdGF0ZSxcblx0XHRcdG1vZGVsTmFtZVxuXHRcdCk7XG5cdFx0c2VsZWN0b3JzWyBnZXRNZXRob2ROYW1lKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0J2lkJyxcblx0XHRcdCdjb3VudFJlbGF0aW9uTW9kZWxzSW5kZXhlZEZvcidcblx0XHQpIF0gPSAoIHN0YXRlLCBlbnRpdHlJZCApID0+IHNlbGVjdG9yXG5cdFx0XHQuY291bnRSZWxhdGlvbk1vZGVsc0luZGV4ZWRGb3JFbnRpdHkoXG5cdFx0XHRcdHN0YXRlLFxuXHRcdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRcdGVudGl0eUlkXG5cdFx0XHQpO1xuXHRcdHJldHVybiBzZWxlY3RvcnM7XG5cdH0sXG5cdHt9XG4pO1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IERFRkFVTFRfQ09SRV9TVEFURSwgc2luZ3VsYXJNb2RlbE5hbWUgfSBmcm9tICdAZXZlbnRlc3ByZXNzby9tb2RlbCc7XG5pbXBvcnQgeyBmcm9tSlMsIFNldCB9IGZyb20gJ2ltbXV0YWJsZSc7XG5pbXBvcnQgeyBub3JtYWxpemVFbnRpdHlJZCB9IGZyb20gJ0BldmVudGVzcHJlc3NvL2hlbHBlcnMnO1xuXG4vKipcbiAqIEludGVybmFsIGltcG9ydHMuXG4gKi9cbmltcG9ydCB7IEFDVElPTl9UWVBFUyB9IGZyb20gJy4uL2FjdGlvbnMvYWN0aW9uLXR5cGVzJztcbmNvbnN0IHsgZW50aXRpZXM6IHR5cGVzLCByZXNldHM6IHJlc2V0VHlwZXMgfSA9IEFDVElPTl9UWVBFUztcblxuLyoqXG4gKiBIYW5kbGUgYWRkaW5nIGluY29taW5nIGRhdGEgdG8gc3RhdGUuXG4gKlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IGVudGl0eUlkXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5TZXR9IGV4aXN0aW5nRW50aXRpZXNcbiAqIEByZXR1cm4ge0ltbXV0YWJsZS5NYXB9IE5ldyBzdGF0ZS5cbiAqL1xuY29uc3QgYWRkVG9TdGF0ZSA9ICggc3RhdGUsIG1vZGVsTmFtZSwgZW50aXR5SWQsIGV4aXN0aW5nRW50aXRpZXMgKSA9PiB7XG5cdGV4aXN0aW5nRW50aXRpZXMgPSBleGlzdGluZ0VudGl0aWVzLmFkZCggZW50aXR5SWQgKTtcblx0cmV0dXJuIHN0YXRlLnNldCggbW9kZWxOYW1lLCBleGlzdGluZ0VudGl0aWVzICk7XG59O1xuXG4vKipcbiAqIEhhbmRsZSByZW1vdmluZyBpbmNvbWluZyBkYXRhIGZyb20gc3RhdGVcbiAqXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IGVudGl0eUlkXG4gKiBAcmV0dXJuIHtJbW11dGFibGUuTWFwfSBuZXcgc3RhdGUgb3IgZXhpc3Rpbmcgc3RhdGUgaWYgbm8gY2hhbmdlLlxuICovXG5jb25zdCByZW1vdmVGcm9tU3RhdGUgPSAoIHN0YXRlLCBtb2RlbE5hbWUsIGVudGl0eUlkICkgPT4ge1xuXHRsZXQgZW50aXR5SWRzID0gc3RhdGUuZ2V0KCBtb2RlbE5hbWUsIFNldCgpICk7XG5cdGlmICggISBlbnRpdHlJZHMuaW5jbHVkZXMoIGVudGl0eUlkICkgKSB7XG5cdFx0cmV0dXJuIHN0YXRlO1xuXHR9XG5cdGVudGl0eUlkcyA9IGVudGl0eUlkcy5kZWxldGUoIGVudGl0eUlkICk7XG5cdHJldHVybiBlbnRpdHlJZHMuaXNFbXB0eSgpID9cblx0XHRzdGF0ZS5kZWxldGUoIG1vZGVsTmFtZSApIDpcblx0XHRzdGF0ZS5zZXQoIG1vZGVsTmFtZSwgZW50aXR5SWRzICk7XG59O1xuXG4vKipcbiAqIFByb2Nlc3NlcyB0aGUgaW5jb21pbmcgYWN0aW9uXG4gKlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblxuICogQHJldHVybiB7SW1tdXRhYmxlLk1hcH0gRWl0aGVyIHRoZSBleGlzdGluZyBzdGF0ZSBpZiBubyBjaGFuZ2Ugb3IgbmV3IHN0YXRlLlxuICovXG5jb25zdCBwcm9jZXNzQWN0aW9uID0gKCBzdGF0ZSwgYWN0aW9uICkgPT4ge1xuXHRjb25zdCB7IHR5cGUsIG1vZGVsTmFtZSB9ID0gYWN0aW9uO1xuXHRjb25zdCBlbnRpdHlJZCA9IG5vcm1hbGl6ZUVudGl0eUlkKCBhY3Rpb24uZW50aXR5SWQgKTtcblx0Y29uc3QgZXhpc3RpbmdFbnRpdGllcyA9IHN0YXRlLmdldCggbW9kZWxOYW1lLCBTZXQoKSApO1xuXG5cdHN3aXRjaCAoIHR5cGUgKSB7XG5cdFx0Y2FzZSB0eXBlcy5SRUNFSVZFX0RFTEVURV9FTlRJVFlfSUQ6XG5cdFx0Y2FzZSB0eXBlcy5SRUNFSVZFX1RSQVNIX0VOVElUWV9JRDpcblx0XHRcdHN0YXRlID0gYWRkVG9TdGF0ZSggc3RhdGUsIG1vZGVsTmFtZSwgZW50aXR5SWQsIGV4aXN0aW5nRW50aXRpZXMgKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgdHlwZXMuUkVNT1ZFX0RFTEVURV9FTlRJVFlfSUQ6XG5cdFx0Y2FzZSB0eXBlcy5SRU1PVkVfVFJBU0hfRU5USVRZX0lEOlxuXHRcdFx0c3RhdGUgPSByZW1vdmVGcm9tU3RhdGUoIHN0YXRlLCBtb2RlbE5hbWUsIGVudGl0eUlkICk7XG5cdFx0XHRicmVhaztcblx0fVxuXHRyZXR1cm4gc3RhdGU7XG59O1xuXG4vKipcbiAqIFJlZHVjZXIgZm9yIHF1ZXVpbmcgYW4gZW50aXR5IGZvciBkZWxldGlvbiBpbiB0aGUgc3RhdGUuXG4gKlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblxuICogQHJldHVybiB7SW1tdXRhYmxlLk1hcH0gRXhpc3Rpbmcgb3IgbmV3IHN0YXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlRW50aXR5KFxuXHRzdGF0ZSA9IGZyb21KUyggREVGQVVMVF9DT1JFX1NUQVRFLmRpcnR5LmRlbGV0ZSApLFxuXHRhY3Rpb25cbikge1xuXHRzd2l0Y2ggKCBhY3Rpb24udHlwZSApIHtcblx0XHRjYXNlIHR5cGVzLlJFQ0VJVkVfREVMRVRFX0VOVElUWV9JRDpcblx0XHRjYXNlIHR5cGVzLlJFTU9WRV9ERUxFVEVfRU5USVRZX0lEOlxuXHRcdFx0cmV0dXJuIHByb2Nlc3NBY3Rpb24oIHN0YXRlLCBhY3Rpb24gKTtcblx0XHRjYXNlIHJlc2V0VHlwZXMuUkVTRVRfQUxMX1NUQVRFOlxuXHRcdFx0cmV0dXJuIGZyb21KUyggREVGQVVMVF9DT1JFX1NUQVRFLmRpcnR5LmRlbGV0ZSApO1xuXHRcdGNhc2UgcmVzZXRUeXBlcy5SRVNFVF9TVEFURV9GT1JfTU9ERUw6XG5cdFx0XHRyZXR1cm4gc3RhdGUuZGVsZXRlKCBzaW5ndWxhck1vZGVsTmFtZSggYWN0aW9uLm1vZGVsTmFtZSApICk7XG5cdH1cblx0cmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIFJlZHVjZXIgZm9yIHF1ZXVlaW5nIHRoZSBlbnRpdHkgZm9yIHRyYXNoaW5nIGluIHRoZSBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHN0YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uXG4gKiBAcmV0dXJuIHtJbW11dGFibGUuTWFwfSBFeGlzdGluZyBvciBuZXcgc3RhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFzaEVudGl0eShcblx0c3RhdGUgPSBmcm9tSlMoIERFRkFVTFRfQ09SRV9TVEFURS5kaXJ0eS50cmFzaCApLFxuXHRhY3Rpb25cbikge1xuXHRzd2l0Y2ggKCBhY3Rpb24udHlwZSApIHtcblx0XHRjYXNlIHR5cGVzLlJFQ0VJVkVfVFJBU0hfRU5USVRZX0lEOlxuXHRcdGNhc2UgdHlwZXMuUkVNT1ZFX1RSQVNIX0VOVElUWV9JRDpcblx0XHRcdHJldHVybiBwcm9jZXNzQWN0aW9uKCBzdGF0ZSwgYWN0aW9uICk7XG5cdFx0Y2FzZSByZXNldFR5cGVzLlJFU0VUX0FMTF9TVEFURTpcblx0XHRcdHJldHVybiBmcm9tSlMoIERFRkFVTFRfQ09SRV9TVEFURS5kaXJ0eS50cmFzaCApO1xuXHRcdGNhc2UgcmVzZXRUeXBlcy5SRVNFVF9TVEFURV9GT1JfTU9ERUw6XG5cdFx0XHRyZXR1cm4gc3RhdGUuZGVsZXRlKCBzaW5ndWxhck1vZGVsTmFtZSggYWN0aW9uLm1vZGVsTmFtZSApICk7XG5cdH1cblx0cmV0dXJuIHN0YXRlO1xufVxuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7XG5cdERFRkFVTFRfQ09SRV9TVEFURSxcblx0cGx1cmFsTW9kZWxOYW1lLFxuXHRzaW5ndWxhck1vZGVsTmFtZSxcbn0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vbW9kZWwnO1xuaW1wb3J0IHsgZnJvbUpTLCBTZXQsIE1hcCB9IGZyb20gJ2ltbXV0YWJsZSc7XG5pbXBvcnQge1xuXHRyZW1vdmVFbXB0eUZyb21TdGF0ZSxcblx0bm9ybWFsaXplRW50aXR5SWQsXG59IGZyb20gJ0BldmVudGVzcHJlc3NvL2hlbHBlcnMnO1xuaW1wb3J0IGN1aWQgZnJvbSAnY3VpZCc7XG5cbi8qKlxuICogSW50ZXJuYWwgaW1wb3J0cy5cbiAqL1xuaW1wb3J0IHsgQUNUSU9OX1RZUEVTIH0gZnJvbSAnLi4vYWN0aW9ucy9hY3Rpb24tdHlwZXMnO1xuY29uc3QgeyByZWxhdGlvbnM6IHR5cGVzLCByZXNldHM6IHJlc2V0VHlwZXMgfSA9IEFDVElPTl9UWVBFUztcblxuLyoqXG4gKiBVc2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSByZWxhdGlvbiBleGlzdHMgaW4gdGhlIHByb3ZpZGVkIG1hcC5cbiAqXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHJlbGF0aW9uTWFwXG4gKiBAcGFyYW0ge3N0cmluZ30gcXVldWVUeXBlXG4gKiBAcGFyYW0ge251bWJlcn0gZW50aXR5SWRcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgbWVhbnMgdGhlIHJlbGF0aW9uIGV4aXN0cyBmb3IgdGhlIGdpdmVuIGVudGl0eSBJZFxuICogZmFsc2UgbWVhbnMgaXQgZG9lcyBub3QgZXhpc3QuXG4gKi9cbmNvbnN0IHJlbGF0aW9uRXhpc3RzSW5NYXAgPSAoIHJlbGF0aW9uTWFwLCBxdWV1ZVR5cGUsIGVudGl0eUlkICkgPT4ge1xuXHRyZXR1cm4gcmVsYXRpb25NYXAuZ2V0KCBxdWV1ZVR5cGUsIFNldCgpICkuaW5jbHVkZXMoIGVudGl0eUlkICk7XG59O1xuXG4vKipcbiAqIFVzZWQgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgcmVsYXRpb24gZXhpc3RzIGFscmVhZHkgaW4gdGhlIHN0YXRlIGZvciB0aGVcbiAqIGdpdmVuIGRhdGEuXG4gKlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSByZWxhdGlvbk1hcFxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBtZWFucyB0aGUgcmVsYXRpb24gZXhpc3RzIGluIHRoZSBzdGF0ZS5cbiAqL1xuY29uc3QgaGFzUmVsYXRpb24gPSAoIHN0YXRlLCBhY3Rpb24sIHJlbGF0aW9uTWFwICkgPT4ge1xuXHRjb25zdCB7XG5cdFx0cmVsYXRpb25FbnRpdHlJZCxcblx0XHRlbnRpdHlJZCxcblx0XHRxdWV1ZVR5cGUsXG5cdH0gPSBhY3Rpb247XG5cdGxldCB7IHJlbGF0aW9uTmFtZSwgbW9kZWxOYW1lIH0gPSBhY3Rpb247XG5cdGlmICggcmVsYXRpb25FeGlzdHNJbk1hcCggcmVsYXRpb25NYXAsIHF1ZXVlVHlwZSwgZW50aXR5SWQgKSApIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIHN0aWxsIGhlcmU/IE9rYXksIGxldCdzIGRvIGEgcmV2ZXJzZSBsb29rdXAgdGhlbiwgd2hlcmUgdGhlIHJlbGF0aW9uIG1heVxuXHQvLyBiZSBzdG9yZWQgd2l0aCB0aGUgcmVsYXRpb24gYXMgdGhlIG9yaWdpbmF0aW5nIGVudGl0eS5cblx0cmVsYXRpb25OYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIHJlbGF0aW9uTmFtZSApO1xuXHRtb2RlbE5hbWUgPSBwbHVyYWxNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRjb25zdCBlbnRpdHlJZHMgPSBzdGF0ZS5nZXRJbihcblx0XHRbIHF1ZXVlVHlwZSwgcmVsYXRpb25OYW1lLCByZWxhdGlvbkVudGl0eUlkLCBtb2RlbE5hbWUgXSxcblx0KTtcblx0cmV0dXJuIGVudGl0eUlkcyA/IGVudGl0eUlkcy5pbmNsdWRlcyggZW50aXR5SWQgKSA6IGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgcmVsYXRpb24gbWFwIGZyb20gdGhlIGluZGV4IGZvciB0aGUgZ2l2ZW4gZGF0YS5cbiAqXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHN0YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uXG4gKiBAcmV0dXJuIHtJbW11dGFibGUuTWFwfSBBIG5ldyBtYXAgaXMgcmV0dXJuZWQgaWYgdGhlcmUgaXNuJ3QgYW4gZXhpc3RpbmcgbWFwIHByZXNlbnQuXG4gKi9cbmNvbnN0IGdldFJlbGF0aW9uTWFwID0gKCBzdGF0ZSwgYWN0aW9uICkgPT4ge1xuXHRjb25zdCB7IHJlbGF0aW9uTmFtZSwgcmVsYXRpb25FbnRpdHlJZDogcmVsYXRpb25JZCwgbW9kZWxOYW1lIH0gPSBhY3Rpb247XG5cdC8vIGdldCB0aGUgbWFwIGZvciB0aGUgcXVldWVUeXBlXG5cdHJldHVybiBzdGF0ZS5nZXRJbihcblx0XHRbICdpbmRleCcsIHJlbGF0aW9uTmFtZSwgcmVsYXRpb25JZCwgbW9kZWxOYW1lIF1cblx0KSB8fCBNYXAoKTtcbn07XG5cbi8qKlxuICogR2l2ZW4gYSBzZXQgb2YgaWRzLCB0aGlzIHJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gaWQgZXhpc3RzIGluIGl0LlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbnRpdHlJZFxuICogQHBhcmFtIHtJbW11dGFibGUuU2V0fSBpZFNldFxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBtZWFucyBpdCBleGlzdHMgaW4gdGhlIGFycmF5LlxuICovXG5jb25zdCBpZEV4aXN0c0luU2V0ID0gKCBlbnRpdHlJZCwgaWRTZXQgKSA9PiB7XG5cdHJldHVybiAoXG5cdFx0aWRTZXQgaW5zdGFuY2VvZiBTZXQgJiZcblx0XHRpZFNldC5pbmNsdWRlcyggZW50aXR5SWQgKVxuXHQpO1xufTtcblxuLyoqXG4gKiBSZWR1Y2VyIGZvciBhZGRpbmcgdG8gdGhlIHJlbGF0aW9ucyBpbmRleCBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHN0YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHJlbGF0aW9uTWFwXG4gKiBAcmV0dXJuIHtJbW11dGFibGUuTWFwfSAgRWl0aGVyIGV4aXN0aW5nIHN0YXRlIGlmIG5vIGNoYW5nZSBvciBuZXcgc3RhdGUgaWYgY2hhbmdlLlxuICovXG5mdW5jdGlvbiBpbmRleFJlbGF0aW9ucyggc3RhdGUsIGFjdGlvbiwgcmVsYXRpb25NYXAgKSB7XG5cdGNvbnN0IHtcblx0XHR0eXBlLFxuXHRcdHJlbGF0aW9uTmFtZSxcblx0XHRyZWxhdGlvbkVudGl0eUlkLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHlJZCxcblx0XHRxdWV1ZVR5cGUsXG5cdH0gPSBhY3Rpb247XG5cdGxldCBlbnRpdHlJZHMgPSByZWxhdGlvbk1hcC5nZXQoIHF1ZXVlVHlwZSApIHx8IFNldCgpO1xuXHRjb25zdCBwYXRoID0gWyByZWxhdGlvbk5hbWUsIHJlbGF0aW9uRW50aXR5SWQsIG1vZGVsTmFtZSwgcXVldWVUeXBlIF07XG5cdHN3aXRjaCAoIHR5cGUgKSB7XG5cdFx0Y2FzZSB0eXBlcy5SRUNFSVZFX0RJUlRZX1JFTEFUSU9OX0FERElUSU9OOlxuXHRcdGNhc2UgdHlwZXMuUkVDRUlWRV9ESVJUWV9SRUxBVElPTl9ERUxFVElPTjpcblx0XHRcdGlmICggaWRFeGlzdHNJblNldCggZW50aXR5SWQsIGVudGl0eUlkcyApICkge1xuXHRcdFx0XHRyZXR1cm4gc3RhdGU7XG5cdFx0XHR9XG5cdFx0XHRzdGF0ZSA9IHN0YXRlLnNldEluKCBwYXRoLCBlbnRpdHlJZHMuYWRkKCBlbnRpdHlJZCApICk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIHR5cGVzLlJFTU9WRV9ESVJUWV9SRUxBVElPTl9BRERJVElPTjpcblx0XHRjYXNlIHR5cGVzLlJFTU9WRV9ESVJUWV9SRUxBVElPTl9ERUxFVElPTjpcblx0XHRcdGlmICggISBpZEV4aXN0c0luU2V0KCBlbnRpdHlJZCwgZW50aXR5SWRzICkgKSB7XG5cdFx0XHRcdHJldHVybiBzdGF0ZTtcblx0XHRcdH1cblx0XHRcdGVudGl0eUlkcyA9IGVudGl0eUlkcy5kZWxldGUoIGVudGl0eUlkICk7XG5cdFx0XHRpZiAoIGVudGl0eUlkcy5pc0VtcHR5KCkgKSB7XG5cdFx0XHRcdHN0YXRlID0gcmVtb3ZlRW1wdHlGcm9tU3RhdGUoIHN0YXRlLCBwYXRoLCAwICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzdGF0ZSA9IHN0YXRlLnNldEluKCBwYXRoLCBlbnRpdHlJZHMgKTtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHR9XG5cdHJldHVybiBzdGF0ZTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgcmVsYXRpb24gaWRzIGZyb20gc3RhdGUgZm9yIGdpdmVuIGRhdGEuXG4gKlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblxuICogQHJldHVybiB7SW1tdXRhYmxlLlNldH0gQSBMaXN0IG9mIGlkcyBpZiBwcmVzZW50IG9yIGVtcHR5IExpc3QgaWYgbm90LlxuICovXG5mdW5jdGlvbiBnZXRSZWxhdGlvbklkc0Zyb21TdGF0ZSggc3RhdGUsIGFjdGlvbiApIHtcblx0Y29uc3Qge1xuXHRcdHJlbGF0aW9uTmFtZSxcblx0XHRtb2RlbE5hbWUsXG5cdFx0ZW50aXR5SWQsXG5cdH0gPSBhY3Rpb247XG5cdGNvbnN0IHBhdGggPSBbIG1vZGVsTmFtZSwgZW50aXR5SWQsIHJlbGF0aW9uTmFtZSBdO1xuXHRyZXR1cm4gc3RhdGUuaGFzSW4oIHBhdGggKSA/IHN0YXRlLmdldEluKCBwYXRoICkgOiBTZXQoKTtcbn1cblxuLyoqXG4gKiBVc2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBzdGF0ZSByZXF1aXJlcyBhbiB1cGRhdGUgb3Igbm90IGZvciB0aGUgZ2l2ZW5cbiAqIGRhdGEuXG4gKlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSByZWxhdGlvbk1hcFxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpbmRpY2F0ZXMgdXBkYXRlIGlzIG5lZWRlZC5cbiAqL1xuZnVuY3Rpb24gcmVxdWlyZXNVcGRhdGUoIHN0YXRlLCBhY3Rpb24sIHJlbGF0aW9uTWFwICkge1xuXHRzd2l0Y2ggKCBhY3Rpb24udHlwZSApIHtcblx0XHRjYXNlIHR5cGVzLlJFQ0VJVkVfRElSVFlfUkVMQVRJT05fQURESVRJT046XG5cdFx0Y2FzZSB0eXBlcy5SRUNFSVZFX0RJUlRZX1JFTEFUSU9OX0RFTEVUSU9OOlxuXHRcdFx0cmV0dXJuICEgaGFzUmVsYXRpb24oIHN0YXRlLCBhY3Rpb24sIHJlbGF0aW9uTWFwICk7XG5cdFx0Y2FzZSB0eXBlcy5SRU1PVkVfRElSVFlfUkVMQVRJT05fQURESVRJT046XG5cdFx0Y2FzZSB0eXBlcy5SRU1PVkVfRElSVFlfUkVMQVRJT05fREVMRVRJT046XG5cdFx0XHRyZXR1cm4gaGFzUmVsYXRpb24oIHN0YXRlLCBhY3Rpb24sIHJlbGF0aW9uTWFwICk7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFJlZHVjZXIgZm9yIHVwZGF0aW5nIGRpcnR5IHJlbGF0aW9uIHN0YXRlIGZvciBnaXZlbiBkYXRhLlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gcmVsYXRpb25NYXBcbiAqIEByZXR1cm4ge0ltbXV0YWJsZS5NYXB9IElmIG5vIGNoYW5nZSBvcmlnaW5hbCBzdGF0ZSBpcyByZXR1cm5lZCBvdGhlcndpc2UgbmV3IHN0YXRlLlxuICovXG5mdW5jdGlvbiB1cGRhdGVSZWxhdGlvblN0YXRlKCBzdGF0ZSwgYWN0aW9uLCByZWxhdGlvbk1hcCApIHtcblx0Y29uc3Qge1xuXHRcdHR5cGUsXG5cdFx0cmVsYXRpb25OYW1lLFxuXHRcdHJlbGF0aW9uRW50aXR5SWQsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkLFxuXHRcdHF1ZXVlVHlwZSxcblx0fSA9IGFjdGlvbjtcblx0Y29uc3QgaWRzID0gcmVsYXRpb25NYXAuZ2V0KCBxdWV1ZVR5cGUgKSB8fCBTZXQoKTtcblx0Y29uc3QgcGF0aCA9IFsgbW9kZWxOYW1lLCBlbnRpdHlJZCwgcmVsYXRpb25OYW1lIF07XG5cdGxldCByZWxhdGlvbklkcztcblx0c3dpdGNoICggdHlwZSApIHtcblx0XHRjYXNlIHR5cGVzLlJFQ0VJVkVfRElSVFlfUkVMQVRJT05fQURESVRJT046XG5cdFx0Y2FzZSB0eXBlcy5SRUNFSVZFX0RJUlRZX1JFTEFUSU9OX0RFTEVUSU9OOlxuXHRcdFx0aWYgKCBpZEV4aXN0c0luU2V0KCBlbnRpdHlJZCwgaWRzICkgKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0cmVsYXRpb25JZHMgPSBnZXRSZWxhdGlvbklkc0Zyb21TdGF0ZSggc3RhdGUsIGFjdGlvbiApO1xuXHRcdFx0aWYgKCByZWxhdGlvbklkcy5pbmNsdWRlcyggcmVsYXRpb25FbnRpdHlJZCApICkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdHN0YXRlID0gc3RhdGUuc2V0SW4oIHBhdGgsIHJlbGF0aW9uSWRzLmFkZCggcmVsYXRpb25FbnRpdHlJZCApICk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIHR5cGVzLlJFTU9WRV9ESVJUWV9SRUxBVElPTl9BRERJVElPTjpcblx0XHRjYXNlIHR5cGVzLlJFTU9WRV9ESVJUWV9SRUxBVElPTl9ERUxFVElPTjpcblx0XHRcdGlmICggISBpZEV4aXN0c0luU2V0KCBlbnRpdHlJZCwgaWRzICkgKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0cmVsYXRpb25JZHMgPSBnZXRSZWxhdGlvbklkc0Zyb21TdGF0ZSggc3RhdGUsIGFjdGlvbiApO1xuXHRcdFx0aWYgKCAhIHJlbGF0aW9uSWRzLmluY2x1ZGVzKCByZWxhdGlvbkVudGl0eUlkICkgKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0cmVsYXRpb25JZHMgPSByZWxhdGlvbklkcy5kZWxldGUoIHJlbGF0aW9uRW50aXR5SWQgKTtcblx0XHRcdGlmICggcmVsYXRpb25JZHMuaXNFbXB0eSgpICkge1xuXHRcdFx0XHRzdGF0ZSA9IHJlbW92ZUVtcHR5RnJvbVN0YXRlKCBzdGF0ZSwgcGF0aCwgMCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c3RhdGUgPSBzdGF0ZS5zZXRJbiggcGF0aCwgcmVsYXRpb25JZHMgKTtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHR9XG5cdHJldHVybiBzdGF0ZTtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IG1ldGhvZCBhc3Npc3Rpbmcgd2l0aCByZXBsYWNpbmcgYW4gb2xkIHJlbGF0aW9uIGlkIGZvciBhIG5ldyByZWxhdGlvblxuICogaWQuXG4gKlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblxuICogQHJldHVybiB7SW1tdXRhYmxlLk1hcH0gRWl0aGVyIG9yaWdpbmFsIG9yIG5ldyBzdGF0ZS5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZU9sZFJlbGF0aW9uSWRXaXRoTmV3UmVsYXRpb25JZCggc3RhdGUsIGFjdGlvbiApIHtcblx0bGV0IHsgb2xkRW50aXR5SWQsIG5ld0VudGl0eUlkIH0gPSBhY3Rpb247XG5cdGNvbnN0IHsgbW9kZWxOYW1lIH0gPSBhY3Rpb247XG5cdG9sZEVudGl0eUlkID0gbm9ybWFsaXplRW50aXR5SWQoIG9sZEVudGl0eUlkICk7XG5cdG5ld0VudGl0eUlkID0gbm9ybWFsaXplRW50aXR5SWQoIG5ld0VudGl0eUlkICk7XG5cdC8vIHJlcGxhY2VtZW50cyBpbiBpbmRleFxuXHRsZXQgbmV3U3RhdGUgPSByZXBsYWNlSWRzKFxuXHRcdCdpbmRleCcsXG5cdFx0c3RhdGUsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdG9sZEVudGl0eUlkLFxuXHRcdG5ld0VudGl0eUlkXG5cdCk7XG5cdGlmICggbmV3U3RhdGUgPT09IHN0YXRlICkge1xuXHRcdG5ld1N0YXRlID0gcmVwbGFjZUlkcyhcblx0XHRcdCdkZWxldGUnLFxuXHRcdFx0bmV3U3RhdGUsXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRvbGRFbnRpdHlJZCxcblx0XHRcdG5ld0VudGl0eUlkLFxuXHRcdCk7XG5cdH1cblx0aWYgKCBuZXdTdGF0ZSA9PT0gc3RhdGUgKSB7XG5cdFx0bmV3U3RhdGUgPSByZXBsYWNlSWRzKFxuXHRcdFx0J2FkZCcsXG5cdFx0XHRuZXdTdGF0ZSxcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdG9sZEVudGl0eUlkLFxuXHRcdFx0bmV3RW50aXR5SWQsXG5cdFx0KTtcblx0fVxuXHRyZXR1cm4gbmV3U3RhdGU7XG59XG5cbi8qKlxuICogSGFuZGxlcyBnb2luZyB0aHJvdWdoIHRoZSBwcm92aWRlZCBzdGF0ZSBvYmplY3QgYW5kIHVwZGF0aW5nIGFueSBvY2N1cnJlbmNlc1xuICogb2YgdGhlIHByb3ZpZGVkIG9sZElkIGZvciB0aGUgcHJvdmlkZWQgbW9kZWwgbmFtZSB3aXRoIHRoZSBuZXcgaWQuICBUaGlzXG4gKiBtdXRhdGVzIHRoZSBpbmNvbWluZyBzdGF0ZSBzbyBkbyBub3QgcHJvdmlkZSB0aGUgb3JpZ2luYWwgc3RhdGUgZnJvbSB0aGVcbiAqIHN0b3JlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0ZVByb3BlcnR5ICh3aGF0IHByb3BlcnR5IGZvciB0aGUgc3RhdGUgc2hvdWxkIGJlXG4gKiAgIHJldmlld2VkKVxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IG9sZElkXG4gKiBAcGFyYW0ge251bWJlcn0gbmV3SWRcbiAqIEByZXR1cm4ge0ltbXV0YWJsZS5NYXB9IFJldHVybnMgZWl0aGVyIG5ldyBzdGF0ZSBvciBleGlzdGluZyBzdGF0ZS5cbiAqL1xuY29uc3QgcmVwbGFjZUlkcyA9ICggc3RhdGVQcm9wZXJ0eSwgc3RhdGUsIG1vZGVsTmFtZSwgb2xkSWQsIG5ld0lkICkgPT4ge1xuXHRjb25zdCBwbHVyYWxOYW1lID0gcGx1cmFsTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0Y29uc3Qgc2luZ3VsYXJOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRjb25zdCB0b3BMZXZlbE5hbWUgPSBzdGF0ZVByb3BlcnR5ID09PSAnaW5kZXgnID8gcGx1cmFsTmFtZSA6IHNpbmd1bGFyTmFtZTtcblx0Y29uc3QgbWFpblBhdGggPSBbIHN0YXRlUHJvcGVydHksIHRvcExldmVsTmFtZSwgb2xkSWQgXTtcblxuXHQvLyBmaXJzdCBkbyB0b3AtbGV2ZWwgY2hlY2tzIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIGJhaWwuXG5cdGlmICggISBzdGF0ZS5oYXNJbiggbWFpblBhdGggKSApIHtcblx0XHRyZXR1cm4gc3RhdGU7XG5cdH1cblxuXHRjb25zdCBtYWluUmVjb3JkID0gc3RhdGUuZ2V0SW4oIG1haW5QYXRoICk7XG5cblx0c3RhdGUgPSBzdGF0ZVxuXHRcdC5kZWxldGVJbiggbWFpblBhdGggKVxuXHRcdC5zZXRJbiggWyBzdGF0ZVByb3BlcnR5LCB0b3BMZXZlbE5hbWUsIG5ld0lkIF0sIG1haW5SZWNvcmQgKTtcblxuXHQvLyBtYWluUmVjb3JkIHByb3ZpZGVzIHRoZSBpbmRleCB0byB0aGUgb3RoZXIgcmVjb3JkcyBuZWVkaW5nIHVwZGF0ZWQuXG5cdG1haW5SZWNvcmQuZm9yRWFjaCggKCBtYXBPcklkcywgcmVsYXRpb25Nb2RlbE5hbWUgKSA9PiB7XG5cdFx0Y29uc3QgdXBkYXRlSWRzID0gKCBxdWV1ZVR5cGUsIHJlbGF0aW9uSWQgKSA9PiB7XG5cdFx0XHRjb25zdCByZWxhdGlvblBhdGggPSBbXG5cdFx0XHRcdHF1ZXVlVHlwZSxcblx0XHRcdFx0cmVsYXRpb25Nb2RlbE5hbWUsXG5cdFx0XHRcdHJlbGF0aW9uSWQsXG5cdFx0XHRcdHRvcExldmVsTmFtZSxcblx0XHRcdF07XG5cdFx0XHRsZXQgaWRzID0gc3RhdGUuZ2V0SW4oIHJlbGF0aW9uUGF0aCApIHx8IFNldCgpO1xuXHRcdFx0aWRzID0gaWRzLmRlbGV0ZSggb2xkSWQgKS5hZGQoIG5ld0lkICk7XG5cdFx0XHRyZXR1cm4gc3RhdGUuc2V0SW4oIHJlbGF0aW9uUGF0aCwgaWRzICk7XG5cdFx0fTtcblx0XHRpZiAoIG1hcE9ySWRzIGluc3RhbmNlb2YgTWFwICkge1xuXHRcdFx0aWYgKCBtYXBPcklkcy5oYXMoICdhZGQnICkgKSB7XG5cdFx0XHRcdG1hcE9ySWRzLmdldCggJ2FkZCcgKS5mb3JFYWNoKCAoIHJlbGF0aW9uSWQgKSA9PiB7XG5cdFx0XHRcdFx0c3RhdGUgPSB1cGRhdGVJZHMoICdhZGQnLCByZWxhdGlvbklkICk7XG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblx0XHRcdGlmICggbWFwT3JJZHMuaGFzKCAnZGVsZXRlJyApICkge1xuXHRcdFx0XHRtYXBPcklkcy5nZXQoICdkZWxldGUnICkuZm9yRWFjaCggKCByZWxhdGlvbklkICkgPT4ge1xuXHRcdFx0XHRcdHN0YXRlID0gdXBkYXRlSWRzKCAnZGVsZXRlJywgcmVsYXRpb25JZCApO1xuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICggbWFwT3JJZHMgaW5zdGFuY2VvZiBTZXQgKSB7XG5cdFx0XHRjb25zdCByZWxhdGlvblBhdGggPSBbICdpbmRleCcsIHJlbGF0aW9uTW9kZWxOYW1lIF07XG5cdFx0XHRtYXBPcklkcy5mb3JFYWNoKCAoIHJlbGF0aW9uSWQgKSA9PiB7XG5cdFx0XHRcdGxldCBpbmRleFJlY29yZCA9IHN0YXRlLmdldEluKFxuXHRcdFx0XHRcdFsgLi4ucmVsYXRpb25QYXRoLCByZWxhdGlvbklkLCB0b3BMZXZlbE5hbWUgXVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRsZXQgaWRzID0gaW5kZXhSZWNvcmQuZ2V0KCBzdGF0ZVByb3BlcnR5ICkgfHwgU2V0KCk7XG5cdFx0XHRcdGlkcyA9IGlkcy5kZWxldGUoIG9sZElkICkuYWRkKCBuZXdJZCApO1xuXHRcdFx0XHRpbmRleFJlY29yZCA9IGluZGV4UmVjb3JkLnNldCggc3RhdGVQcm9wZXJ0eSwgaWRzICk7XG5cdFx0XHRcdHN0YXRlID0gc3RhdGUuc2V0SW4oXG5cdFx0XHRcdFx0WyAuLi5yZWxhdGlvblBhdGgsIHJlbGF0aW9uSWQsIHRvcExldmVsTmFtZSBdLFxuXHRcdFx0XHRcdGluZGV4UmVjb3JkXG5cdFx0XHRcdCk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXHR9ICk7XG5cdHJldHVybiBzdGF0ZTtcbn07XG5cbi8qKlxuICogVGhpcyBlbnN1cmVzIHRoYXQgZm9yIGluY29taW5nIHJlbGF0aW9uIHN0YXRlLCByZWxhdGlvbnMgYXJlIHJlY29yZGVkIGluIG9uZVxuICogZGlyZWN0aW9uLiAgRm9yIGV4YW1wbGUgYWRkaW5nIGEgcmVsYXRpb24gZm9yIGBldmVudGAgdG8gYGRhdGV0aW1lYCBhbmQgdGhlblxuICogc29tZXRpbWUgbGF0ZXIgYGRhdGV0aW1lYCB0byBgZXZlbnRgIGZvciB0aGUgc2FtZSBlbnRpdGllcyBzaG91bGQgcmVzdWx0IGluXG4gKiBqdXN0IGEgc2luZ2xlIHJlY29yZCwgbm90IHR3by5cbiAqXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHN0YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBhY3Rpb24gb2JqZWN0IHRvIHdvcmsgd2l0aCBhZnRlciBub3JtYWxpemF0aW9uLlxuICovXG5jb25zdCBub3JtYWxpemVBY3Rpb25Gb3JTdGF0ZSA9ICggc3RhdGUsIGFjdGlvbiApID0+IHtcblx0Ly8gbm9ybWFsaXplSWRzXG5cdGFjdGlvbi5lbnRpdHlJZCA9IG5vcm1hbGl6ZUVudGl0eUlkKCBhY3Rpb24uZW50aXR5SWQgKTtcblx0YWN0aW9uLnJlbGF0aW9uRW50aXR5SWQgPSBub3JtYWxpemVFbnRpdHlJZCggYWN0aW9uLnJlbGF0aW9uRW50aXR5SWQgKTtcblx0Ly8gd2Ugb25seSB1c2UgaW5kZXggdG8gaGVscCB3aXRoIG5vcm1hbGl6YXRpb25cblx0Y29uc3QgaW5kZXggPSBzdGF0ZS5nZXQoICdpbmRleCcgKTtcblx0Y29uc3QgeyBtb2RlbE5hbWUsIHJlbGF0aW9uTmFtZSwgcmVsYXRpb25FbnRpdHlJZCwgZW50aXR5SWQgfSA9IGFjdGlvbjtcblx0aWYgKCBtb2RlbE5hbWUgJiZcblx0XHRyZWxhdGlvbk5hbWUgJiZcblx0XHRpbmRleC5oYXMoIHBsdXJhbE1vZGVsTmFtZSggbW9kZWxOYW1lICkgKVxuXHQpIHtcblx0XHQvLyBva2F5IHRoaXMgbW9kZWwgaGFzIGFscmVhZHkgYmVlbiB1c2VkIGFzIGEgcmVsYXRpb24gb24gYW5vdGhlciBtb2RlbFxuXHRcdC8vIHNvIGxldCdzIG5vcm1hbGl6ZSBhbmQgbWFrZSBpdCB0aGUgcmVsYXRpb24gaW5zdGVhZC5cblx0XHRyZXR1cm4ge1xuXHRcdFx0Li4uYWN0aW9uLFxuXHRcdFx0bW9kZWxOYW1lOiBzaW5ndWxhck1vZGVsTmFtZSggcmVsYXRpb25OYW1lICksXG5cdFx0XHRlbnRpdHlJZDogcmVsYXRpb25FbnRpdHlJZCxcblx0XHRcdHJlbGF0aW9uTmFtZTogcGx1cmFsTW9kZWxOYW1lKCBtb2RlbE5hbWUgKSxcblx0XHRcdHJlbGF0aW9uRW50aXR5SWQ6IGVudGl0eUlkLFxuXHRcdH07XG5cdH1cblx0Ly8gd2UgY2FuIHJldHVybiBhcyBpcyBidXQgbGV0cyBub3JtYWxpemUgdGhlIGluY29taW5nIG5hbWVzXG5cdHJldHVybiB7XG5cdFx0Li4uYWN0aW9uLFxuXHRcdG1vZGVsTmFtZTogbW9kZWxOYW1lID8gc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApIDogbW9kZWxOYW1lLFxuXHRcdHJlbGF0aW9uTmFtZTogcmVsYXRpb25OYW1lID9cblx0XHRcdHBsdXJhbE1vZGVsTmFtZSggcmVsYXRpb25OYW1lICkgOlxuXHRcdFx0cmVsYXRpb25OYW1lLFxuXHR9O1xufTtcblxuLyoqXG4gKiBSZWR1Y2VyIGZvciBkaXJ0eSByZWxhdGlvbiBzdGF0ZSBhY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEByZXR1cm4ge0ltbXV0YWJsZS5NYXB9IFJldHVybnMgb3JpZ2luYWwgc3RhdGUgaWYgbm8gY2hhbmdlcywgb3RoZXJ3aXNlIG5ldyBzdGF0ZS5cbiAqL1xuZnVuY3Rpb24gZGlydHlSZWxhdGlvbnMoIHN0YXRlLCBhY3Rpb24gKSB7XG5cdGFjdGlvbiA9IG5vcm1hbGl6ZUFjdGlvbkZvclN0YXRlKCBzdGF0ZSwgYWN0aW9uICk7XG5cdGNvbnN0IHsgdHlwZSB9ID0gYWN0aW9uO1xuXHRjb25zdCByZWxhdGlvbk1hcCA9IGdldFJlbGF0aW9uTWFwKCBzdGF0ZSwgYWN0aW9uICk7XG5cdC8vIGRvZXMgdGhpcyBldmVuIG5lZWQgYW4gdXBkYXRlP1xuXHRpZiAoICEgcmVxdWlyZXNVcGRhdGUoIHN0YXRlLCBhY3Rpb24sIHJlbGF0aW9uTWFwICkgKSB7XG5cdFx0cmV0dXJuIHN0YXRlO1xuXHR9XG5cdHN3aXRjaCAoIHR5cGUgKSB7XG5cdFx0Y2FzZSB0eXBlcy5SRUNFSVZFX0RJUlRZX1JFTEFUSU9OX0FERElUSU9OOlxuXHRcdGNhc2UgdHlwZXMuUkVNT1ZFX0RJUlRZX1JFTEFUSU9OX0FERElUSU9OOlxuXHRcdFx0c3RhdGUgPSBzdGF0ZS5zZXQoXG5cdFx0XHRcdCdpbmRleCcsXG5cdFx0XHRcdGluZGV4UmVsYXRpb25zKFxuXHRcdFx0XHRcdE1hcCggc3RhdGUuZ2V0KCAnaW5kZXgnICkgKSxcblx0XHRcdFx0XHRhY3Rpb24sXG5cdFx0XHRcdFx0cmVsYXRpb25NYXBcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHRcdHJldHVybiBzdGF0ZS5zZXQoXG5cdFx0XHRcdCdhZGQnLFxuXHRcdFx0XHR1cGRhdGVSZWxhdGlvblN0YXRlKFxuXHRcdFx0XHRcdE1hcCggc3RhdGUuZ2V0KCAnYWRkJyApICksXG5cdFx0XHRcdFx0YWN0aW9uLFxuXHRcdFx0XHRcdHJlbGF0aW9uTWFwXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0Y2FzZSB0eXBlcy5SRUNFSVZFX0RJUlRZX1JFTEFUSU9OX0RFTEVUSU9OOlxuXHRcdGNhc2UgdHlwZXMuUkVNT1ZFX0RJUlRZX1JFTEFUSU9OX0RFTEVUSU9OOlxuXHRcdFx0Ly8gaWYgdGhlIHJlbGF0aW9uIG9yIGVudGl0eSBpZCBpcyBhIGN1aWQsIHRoZW4gd2Ugc2tpcCB0aGlzIGJlY2F1c2Vcblx0XHRcdC8vIHRoZSByZWxhdGlvbiBoYXMgbmV2ZXIgYmVlbiBwZXJzaXN0ZWQgYW55d2F5cy5cblx0XHRcdGlmIChcblx0XHRcdFx0Y3VpZC5pc0N1aWQoIGFjdGlvbi5yZWxhdGlvbkVudGl0eUlkICkgfHxcblx0XHRcdFx0Y3VpZC5pc0N1aWQoIGFjdGlvbi5lbnRpdHlJZCApXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIHN0YXRlO1xuXHRcdFx0fVxuXHRcdFx0c3RhdGUgPSBzdGF0ZS5zZXQoXG5cdFx0XHRcdCdpbmRleCcsXG5cdFx0XHRcdGluZGV4UmVsYXRpb25zKFxuXHRcdFx0XHRcdE1hcCggc3RhdGUuZ2V0KCAnaW5kZXgnICkgKSxcblx0XHRcdFx0XHRhY3Rpb24sXG5cdFx0XHRcdFx0cmVsYXRpb25NYXBcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHRcdHJldHVybiBzdGF0ZS5zZXQoXG5cdFx0XHRcdCdkZWxldGUnLFxuXHRcdFx0XHR1cGRhdGVSZWxhdGlvblN0YXRlKFxuXHRcdFx0XHRcdE1hcCggc3RhdGUuZ2V0KCAnZGVsZXRlJyApICksXG5cdFx0XHRcdFx0YWN0aW9uLFxuXHRcdFx0XHRcdHJlbGF0aW9uTWFwXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdH1cblx0cmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJlbW92aW5nIGVudGl0eSBpZCBpbiB0aGUgc3RhdGUgZm9yIGEgZ2l2ZW4gbW9kZWxOYW1lXG4gKiB3aGljaCBtYXkgZXhpc3QgYXMgYSByZWxhdGlvbiBpbiB0aGUgc3RhdGUuXG4gKlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZSBJbW11dGFibGUgY29sbGVjdGlvblxuICogQHBhcmFtIHtPYmplY3R9IG1vZGVsRGF0YSBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIGZvciB1c2UgaW4gdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybiB7SW1tdXRhYmxlLk1hcH0gSW1tdXRhYmxlIGNvbGxlY3Rpb24gIGVpdGhlciB0aGUgb3JpZ2luYWwgc3RhdGUgb3IgYSBuZXcgc3RhdGUuXG4gKi9cbmNvbnN0IGNsZWFyUmVsYXRlZEVudGl0aWVzRm9yRW50aXR5ID0gKFxuXHRzdGF0ZSxcblx0bW9kZWxEYXRhXG4pID0+IHtcblx0Y29uc3Qge1xuXHRcdG1vZGVsUmVtb3ZlZCxcblx0XHRlbnRpdHlJZFJlbW92ZWQsXG5cdFx0aW5kZXhUeXBlLFxuXHRcdHJlbGF0aW9uVHlwZXMsXG5cdH0gPSBtb2RlbERhdGE7XG5cblx0Y29uc3QgcmVjb3JkUGF0aCA9IFtcblx0XHRpbmRleFR5cGUsXG5cdFx0bW9kZWxSZW1vdmVkLFxuXHRcdGVudGl0eUlkUmVtb3ZlZCxcblx0XTtcblxuXHRjb25zdCBjbGVhckVudGl0eUlkc0luUGF0aCA9ICggc3ViU3RhdGUsIHBhdGggKSA9PiB7XG5cdFx0aWYgKCBzdWJTdGF0ZS5oYXNJbiggcGF0aCApICkge1xuXHRcdFx0bGV0IGVudGl0eUlkcyA9IHN1YlN0YXRlLmdldEluKCBwYXRoICkgfHwgU2V0KCk7XG5cdFx0XHRlbnRpdHlJZHMgPSBlbnRpdHlJZHMuZGVsZXRlKCBlbnRpdHlJZFJlbW92ZWQgKTtcblx0XHRcdGlmICggISBlbnRpdHlJZHMuaXNFbXB0eSgpICkge1xuXHRcdFx0XHRzdWJTdGF0ZS5zZXRJbiggcGF0aCwgZW50aXR5SWRzICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZW1vdmVFbXB0eUZyb21TdGF0ZShcblx0XHRcdFx0XHRzdWJTdGF0ZSxcblx0XHRcdFx0XHRwYXRoLFxuXHRcdFx0XHRcdDEsXG5cdFx0XHRcdFx0ZmFsc2Vcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0aWYgKCBzdGF0ZS5oYXNJbiggcmVjb3JkUGF0aCApICkge1xuXHRcdHN0YXRlID0gc3RhdGUud2l0aE11dGF0aW9ucyggKCBzdWJTdGF0ZSApID0+IHtcblx0XHRcdGNvbnN0IG1haW5SZWNvcmQgPSBzdWJTdGF0ZS5nZXRJbiggcmVjb3JkUGF0aCApO1xuXHRcdFx0cmVtb3ZlRW1wdHlGcm9tU3RhdGUoXG5cdFx0XHRcdHN1YlN0YXRlLFxuXHRcdFx0XHRyZWNvcmRQYXRoLFxuXHRcdFx0XHQxLFxuXHRcdFx0XHRmYWxzZVxuXHRcdFx0KTtcblx0XHRcdG1haW5SZWNvcmQuZm9yRWFjaCggKCByZWxhdGlvblJlY29yZCwgcmVsYXRpb25Nb2RlbE5hbWUgKSA9PiB7XG5cdFx0XHRcdGlmICggcmVsYXRpb25SZWNvcmQgaW5zdGFuY2VvZiBTZXQgKSB7XG5cdFx0XHRcdFx0cmVsYXRpb25SZWNvcmQuZm9yRWFjaCggKCByZWxhdGlvbklkICkgPT4ge1xuXHRcdFx0XHRcdFx0Y2xlYXJFbnRpdHlJZHNJblBhdGgoXG5cdFx0XHRcdFx0XHRcdHN1YlN0YXRlLFxuXHRcdFx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHRcdFx0J2luZGV4Jyxcblx0XHRcdFx0XHRcdFx0XHRyZWxhdGlvbk1vZGVsTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRyZWxhdGlvbklkLFxuXHRcdFx0XHRcdFx0XHRcdG1vZGVsUmVtb3ZlZCxcblx0XHRcdFx0XHRcdFx0XHRpbmRleFR5cGUsXG5cdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdHJlbGF0aW9uVHlwZXMgIT09IG51bGwgJiZcblx0XHRcdFx0XHRyZWxhdGlvblJlY29yZCBpbnN0YW5jZW9mIE1hcFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZWxhdGlvblR5cGVzLmZvckVhY2goICggcmVsYXRpb25UeXBlICkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKCByZWxhdGlvblJlY29yZC5oYXMoIHJlbGF0aW9uVHlwZSApICkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCByZWxhdGlvbklkcyA9IHJlbGF0aW9uUmVjb3JkLmdldChcblx0XHRcdFx0XHRcdFx0XHRyZWxhdGlvblR5cGVcblx0XHRcdFx0XHRcdFx0KSB8fCBTZXQoKTtcblx0XHRcdFx0XHRcdFx0cmVsYXRpb25JZHMuZm9yRWFjaCggKCByZWxhdGlvbklkICkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGNsZWFyRW50aXR5SWRzSW5QYXRoKFxuXHRcdFx0XHRcdFx0XHRcdFx0c3ViU3RhdGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlbGF0aW9uVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVsYXRpb25Nb2RlbE5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlbGF0aW9uSWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1vZGVsUmVtb3ZlZCxcblx0XHRcdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fSApO1xuXHR9XG5cdHJldHVybiBzdGF0ZTtcbn07XG5cbi8qKlxuICogSGFuZGxlcyByZW1vdmluZyBhbGwgcmVsYXRpb25zaGlwcyBpbiB0aGUgZGlydHkgcmVsYXRpb25zIHN0YXRlIGZvciB0aGUgZ2l2ZW5cbiAqIGFjdGlvbiBvYmplY3QgKGNvbnRhaW5pbmcgbW9kZWxOYW1lIGFuZCBlbnRpdHlJZClcbiAqXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHN0YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uXG4gKiBAcmV0dXJuIHtJbW11dGFibGUuTWFwfSBFaXRoZXIgdGhlIG9yaWdpbmFsIHN0YXRlIG9yIG5ldyBzdGF0ZSBpZiBpdCB3YXMgdXBkYXRlZC5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlUmVsYXRlZEVudGl0aWVzRm9yRW50aXR5KCBzdGF0ZSwgYWN0aW9uICkge1xuXHRjb25zdCB7IG1vZGVsTmFtZSB9ID0gYWN0aW9uO1xuXHRjb25zdCBwbHVyYWxOYW1lID0gcGx1cmFsTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0Y29uc3Qgc2luZ2xlTmFtZSA9IHNpbmd1bGFyTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0Y29uc3QgZW50aXR5SWQgPSBub3JtYWxpemVFbnRpdHlJZCggYWN0aW9uLmVudGl0eUlkICk7XG5cdFtcblx0XHRbIHBsdXJhbE5hbWUsIGVudGl0eUlkLCAnaW5kZXgnLCBbICdhZGQnLCAnZGVsZXRlJyBdIF0sXG5cdFx0WyBzaW5nbGVOYW1lLCBlbnRpdHlJZCwgJ2FkZCcgXSxcblx0XHRbIHNpbmdsZU5hbWUsIGVudGl0eUlkLCAnZGVsZXRlJyBdLFxuXHRdLmZvckVhY2goICggW1xuXHRcdG1vZGVsUmVtb3ZlZCxcblx0XHRlbnRpdHlJZFJlbW92ZWQsXG5cdFx0aW5kZXhUeXBlLFxuXHRcdHJlbGF0aW9uVHlwZXMgPSBudWxsLFxuXHRdICkgPT4ge1xuXHRcdHN0YXRlID0gY2xlYXJSZWxhdGVkRW50aXRpZXNGb3JFbnRpdHkoXG5cdFx0XHRzdGF0ZSxcblx0XHRcdHsgbW9kZWxSZW1vdmVkLCBlbnRpdHlJZFJlbW92ZWQsIGluZGV4VHlwZSwgcmVsYXRpb25UeXBlcyB9XG5cdFx0KTtcblx0fSApO1xuXHRyZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogSGFuZGxlcyBjbGVhcmluZyB0aGUgZ2l2ZW4gbW9kZWwgZnJvbSB0aGUgc3RhdGUuXG4gKlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblxuICpcbiAqIEByZXR1cm4ge0ltbXV0YWJsZS5NYXB9IE5ldyBzdGF0ZS5cbiAqL1xuY29uc3QgY2xlYXJTdGF0ZUZvck1vZGVsID0gKCBzdGF0ZSwgYWN0aW9uICkgPT4ge1xuXHRjb25zdCBzaW5ndWxhck5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggYWN0aW9uLm1vZGVsTmFtZSApO1xuXHRjb25zdCBwbHVyYWxOYW1lID0gcGx1cmFsTW9kZWxOYW1lKCBhY3Rpb24ubW9kZWxOYW1lICk7XG5cdC8vIGluZGV4IHJlY29yZCBwYXRoXG5cdHN0YXRlID0gY2xlYXJNb2RlbEZyb21TdWJzdGF0ZShcblx0XHRzdGF0ZSxcblx0XHQnaW5kZXgnLFxuXHRcdHBsdXJhbE5hbWUsXG5cdFx0c2luZ3VsYXJOYW1lXG5cdCk7XG5cblx0Ly8gZGVsZXRlIHJlY29yZCBwYXRoXG5cdHN0YXRlID0gY2xlYXJNb2RlbEZyb21TdWJzdGF0ZShcblx0XHRzdGF0ZSxcblx0XHQnZGVsZXRlJyxcblx0XHRzaW5ndWxhck5hbWUsXG5cdFx0cGx1cmFsTmFtZSxcblx0KTtcblxuXHQvLyBhZGQgcmVjb3JkIHBhdGhcblx0c3RhdGUgPSBjbGVhck1vZGVsRnJvbVN1YnN0YXRlKFxuXHRcdHN0YXRlLFxuXHRcdCdhZGQnLFxuXHRcdHNpbmd1bGFyTmFtZSxcblx0XHRwbHVyYWxOYW1lLFxuXHQpO1xuXHRyZXR1cm4gc3RhdGU7XG59O1xuXG4vKipcbiAqIEZvciB0aGUgZ2l2ZW4gYXJndW1lbnRzIGNsZWFycyB0aGUgbW9kZWwgZnJvbSB0aGUgc3Vic3RhdGUgb24gdGhlIGdpdmVuIHN0YXRlXG4gKiBmb3IgdGhlIGdpdmVuIHN1YnN0YXRlIGtleS5cbiAqXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3ViU3RhdGVLZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVBc1JlbGF0aW9uXG4gKiBAcmV0dXJuIHtJbW11dGFibGUuTWFwfSBUaGUgbmV3IHN0YXRlLlxuICovXG5jb25zdCBjbGVhck1vZGVsRnJvbVN1YnN0YXRlID0gKFxuXHRzdGF0ZSxcblx0c3ViU3RhdGVLZXksXG5cdG1vZGVsTmFtZSxcblx0bW9kZWxOYW1lQXNSZWxhdGlvblxuKSA9PiB7XG5cdHN0YXRlID0gc3RhdGUuZGVsZXRlSW4oIFsgc3ViU3RhdGVLZXksIG1vZGVsTmFtZSBdICk7XG5cdGxldCBzdWJTdGF0ZSA9IHN0YXRlLmdldCggc3ViU3RhdGVLZXkgKTtcblx0c3ViU3RhdGUgPSBzdWJTdGF0ZS53aXRoTXV0YXRpb25zKCAoIG11dGF0ZWRTdGF0ZSApID0+IHtcblx0XHRzdGF0ZS5nZXQoIHN1YlN0YXRlS2V5ICkuZm9yRWFjaCggKCBlbnRpdHlNYXBzLCByZWxhdGlvbk5hbWUgKSA9PiB7XG5cdFx0XHRlbnRpdHlNYXBzLmZvckVhY2goICggbW9kZWxNYXAsIHJlbGF0aW9uRW50aXR5SWQgKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGRlbGV0ZVBhdGggPSBbXG5cdFx0XHRcdFx0cmVsYXRpb25OYW1lLFxuXHRcdFx0XHRcdHJlbGF0aW9uRW50aXR5SWQsXG5cdFx0XHRcdFx0bW9kZWxOYW1lQXNSZWxhdGlvbixcblx0XHRcdFx0XTtcblx0XHRcdFx0bXV0YXRlZFN0YXRlLmRlbGV0ZUluKCBkZWxldGVQYXRoICk7XG5cdFx0XHRcdHJlbW92ZUVtcHR5RnJvbVN0YXRlKFxuXHRcdFx0XHRcdG11dGF0ZWRTdGF0ZSxcblx0XHRcdFx0XHRkZWxldGVQYXRoLFxuXHRcdFx0XHRcdDEsXG5cdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdCk7XG5cdFx0XHR9ICk7XG5cdFx0fSApO1xuXHR9ICk7XG5cdHN0YXRlID0gc3RhdGUuc2V0KCBzdWJTdGF0ZUtleSwgc3ViU3RhdGUgKTtcblx0cmV0dXJuIHN0YXRlO1xufTtcblxuLyoqXG4gKiBleHBvcnRzIHVzZWZ1bCBmb3IgdGVzdGluZy5cbiAqL1xuZXhwb3J0IHtcblx0cmVwbGFjZU9sZFJlbGF0aW9uSWRXaXRoTmV3UmVsYXRpb25JZCxcblx0cmVtb3ZlUmVsYXRlZEVudGl0aWVzRm9yRW50aXR5LFxuXHRkaXJ0eVJlbGF0aW9ucyxcbn07XG5cbi8qKlxuICogRGVmYXVsdCByZWR1Y2VyIGZvciBoYW5kbGluZyBkaXJ0eSByZWxhdGlvbiBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHN0YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uXG4gKiBAcmV0dXJuIHtJbW11dGFibGUuTWFwfSBSZXR1cm5zIG9yaWdpbmFsIHN0YXRlIGlmIG5vIGNoYW5nZXMsIG90aGVyd2lzZSBuZXcgc3RhdGUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IChcblx0c3RhdGUgPSBmcm9tSlMoIERFRkFVTFRfQ09SRV9TVEFURS5kaXJ0eS5yZWxhdGlvbnMgKSxcblx0YWN0aW9uXG4pID0+IHtcblx0c3dpdGNoICggYWN0aW9uLnR5cGUgKSB7XG5cdFx0Y2FzZSB0eXBlcy5SRUNFSVZFX1VQREFURURfRU5USVRZX0lEX0ZPUl9SRUxBVElPTlM6XG5cdFx0XHRyZXR1cm4gcmVwbGFjZU9sZFJlbGF0aW9uSWRXaXRoTmV3UmVsYXRpb25JZCggc3RhdGUsIGFjdGlvbiApO1xuXHRcdGNhc2UgdHlwZXMuUkVNT1ZFX1JFTEFURURfRU5USVRJRVNfRk9SX0VOVElUWTpcblx0XHRcdHJldHVybiByZW1vdmVSZWxhdGVkRW50aXRpZXNGb3JFbnRpdHkoIHN0YXRlLCBhY3Rpb24gKTtcblx0XHRjYXNlIHJlc2V0VHlwZXMuUkVTRVRfQUxMX1NUQVRFOlxuXHRcdFx0cmV0dXJuIGZyb21KUyggREVGQVVMVF9DT1JFX1NUQVRFLmRpcnR5LnJlbGF0aW9ucyApO1xuXHRcdGNhc2UgcmVzZXRUeXBlcy5SRVNFVF9TVEFURV9GT1JfTU9ERUw6XG5cdFx0XHRyZXR1cm4gY2xlYXJTdGF0ZUZvck1vZGVsKCBzdGF0ZSwgYWN0aW9uICk7XG5cdFx0Y2FzZSB0eXBlcy5SRUNFSVZFX0RJUlRZX1JFTEFUSU9OX0FERElUSU9OOlxuXHRcdGNhc2UgdHlwZXMuUkVNT1ZFX0RJUlRZX1JFTEFUSU9OX0FERElUSU9OOlxuXHRcdGNhc2UgdHlwZXMuUkVDRUlWRV9ESVJUWV9SRUxBVElPTl9ERUxFVElPTjpcblx0XHRjYXNlIHR5cGVzLlJFTU9WRV9ESVJUWV9SRUxBVElPTl9ERUxFVElPTjpcblx0XHRcdHJldHVybiBkaXJ0eVJlbGF0aW9ucyggc3RhdGUsIGFjdGlvbiApO1xuXHR9XG5cdHJldHVybiBzdGF0ZTtcbn07XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgY29tYmluZVJlZHVjZXJzIH0gZnJvbSAnQHdvcmRwcmVzcy9kYXRhJztcblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IGRlbGV0ZUVudGl0eSwgdHJhc2hFbnRpdHkgfSBmcm9tICcuL2RpcnR5LWVudGl0aWVzJztcbmltcG9ydCB7IGRlZmF1bHQgYXMgcmVsYXRpb25zIH0gZnJvbSAnLi9kaXJ0eS1yZWxhdGlvbnMnO1xuXG4vKipcbiAqIFRoZSByb290IHN0YXRlICgnZGVsZXRlJywgJ3RyYXNoJywgcmVsYXRpb25zJykgaXMgYSBwbGFpbiBvYmplY3QsIGJ1dCB0aGVcbiAqIHNsaWNlcyBhcmUgaW1tdXRhYmxlIE1hcHMpLlxuICovXG5leHBvcnQgZGVmYXVsdCBjb21iaW5lUmVkdWNlcnMoIHtcblx0ZGVsZXRlOiBkZWxldGVFbnRpdHksXG5cdHRyYXNoOiB0cmFzaEVudGl0eSxcblx0cmVsYXRpb25zLFxufSApO1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IGZyb21KUywgTWFwIH0gZnJvbSAnaW1tdXRhYmxlJztcbmltcG9ydCB7IGlzRW1wdHksIGRpZmZlcmVuY2UgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgREVGQVVMVF9DT1JFX1NUQVRFIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vbW9kZWwnO1xuaW1wb3J0IHsgaXNNb2RlbEVudGl0eSwgaXNNb2RlbEVudGl0eU9mTW9kZWwgfSBmcm9tICdAZXZlbnRlc3ByZXNzby92YWxpZGF0b3JzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUVudGl0eUlkIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vaGVscGVycyc7XG5cbi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBBQ1RJT05fVFlQRVMgfSBmcm9tICcuLi9hY3Rpb25zL2FjdGlvbi10eXBlcyc7XG5jb25zdCB7IGVudGl0aWVzOiB0eXBlcyB9ID0gQUNUSU9OX1RZUEVTO1xuXG4vKipcbiAqIFRoaXMgcmVwbGFjZXMgYW55IGVudGl0aWVzIGluIHRoZSBpbmNvbWluZyBvYmplY3Qgd2l0aCBtYXRjaGluZyBlbnRpdGllcyAoYnlcbiAqIGlkKSBpbiB0aGUgc3RhdGUgKGlmIHRoZXkgZXhpc3QpLlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gZW50aXR5UmVjb3Jkc1xuICogQHJldHVybiB7SW1tdXRhYmxlLk1hcH0gTmV3IGVudGl0eVJlY29yZHMgb2JqZWN0LlxuICovXG5jb25zdCByZXBsYWNlRXhpc3RpbmdFbnRpdGllc0Zyb21TdGF0ZSA9ICggc3RhdGUsIG1vZGVsTmFtZSwgZW50aXR5UmVjb3JkcyApID0+IHtcblx0Y29uc3QgZXhpc3RpbmdFbnRpdGllcyA9IHN0YXRlLmdldCggbW9kZWxOYW1lLCBudWxsICk7XG5cdGlmICggZXhpc3RpbmdFbnRpdGllcyA9PT0gbnVsbCApIHtcblx0XHRyZXR1cm4gZW50aXR5UmVjb3Jkcztcblx0fVxuXHRyZXR1cm4gZW50aXR5UmVjb3Jkcy5tZXJnZSggZXhpc3RpbmdFbnRpdGllcyApO1xufTtcblxuLyoqXG4gKiBSZWR1Y2VyIGZvciByZWNlaXZpbmcgYW4gZW50aXR5IGludG8gdGhlIHN0YXRlLlxuICpcbiAqIFRoaXMgZG9lcyBub3QgcmVwbGFjZSBhbnkgZW50aXR5IHRoYXQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHN0YXRlLlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEByZXR1cm4ge0ltbXV0YWJsZS5NYXB9IE5ldyBzdGF0ZSBpZiB0aGVyZSBpcyBhIGNoYW5nZSBvdGhlcndpc2UgZXhpc3Rpbmcgc3RhdGUuXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVFbnRpdHkoIHN0YXRlLCBhY3Rpb24gKSB7XG5cdC8qKlxuXHQgKiBAdHlwZSB7c3RyaW5nfSBtb2RlbE5hbWVcblx0ICogQHR5cGUge0Jhc2VFbnRpdHl8bnVsbH0gZW50aXR5XG5cdCAqL1xuXHRjb25zdCB7IGVudGl0eSB9ID0gYWN0aW9uO1xuXG5cdGlmIChcblx0XHQhIGlzTW9kZWxFbnRpdHkoIGVudGl0eSApIHx8XG5cdFx0c3RhdGUuaGFzSW4oIFsgZW50aXR5Lm1vZGVsTmFtZSwgZW50aXR5LmlkIF0gKVxuXHQpIHtcblx0XHRyZXR1cm4gc3RhdGU7XG5cdH1cblx0cmV0dXJuIHN0YXRlLnNldEluKCBbIGVudGl0eS5tb2RlbE5hbWUsIGVudGl0eS5pZCBdLCBlbnRpdHkgKTtcbn1cblxuLyoqXG4gKiBBIHJlZHVjZXIgcmV0dXJuaW5nIHRoZSBuZXcgc3RhdGUgZm9yIGFjdGlvbi5cbiAqXG4gKiBIYW5kbGVzIHJlY2VpdmluZyBlbnRpdHkgcmVjb3JkcyBmcm9tIGEgcmVzdCByZXNwb25zZSBhbmQgY29udmVydGluZyB0aGVtIHRvXG4gKiBtb2RlbCBlbnRpdGllcyB1c2luZyB0aGUgcHJvdmlkZWQgZmFjdG9yeS5cbiAqXG4gKiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBpbmNvbWluZyBlbnRpdHkgcmVjb3JkcyBhcmUgYW4gYXJyYXkgb2YgQmFzZUVudGl0eVxuICogY2hpbGRyZW4gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEByZXR1cm4ge0ltbXV0YWJsZS5NYXB9IFRoZSBuZXcgc3RhdGUgKG9yIHRoZSBvcmlnaW5hbCBpZiBub1xuICogY2hhbmdlIGRldGVjdGVkIG9yIGFjdGlvbiBpc24ndCBoYW5kbGVkIGJ5IHRoaXMgbWV0aG9kKVxuICovXG5mdW5jdGlvbiByZWNlaXZlRW50aXR5UmVjb3Jkcyggc3RhdGUsIGFjdGlvbiApIHtcblx0Y29uc3QgeyB0eXBlLCBtb2RlbE5hbWUgfSA9IGFjdGlvbjtcblx0Ly8gY29udmVydCBmcm9tIGFycmF5IG9mIGVudGl0aWVzIHRvIGEgTWFwIGluZGV4ZWQgYnkgZW50aXR5IGlkLlxuXHRjb25zdCBpbmNvbWluZ0VudGl0aWVzID0gTWFwKCkud2l0aE11dGF0aW9ucyggKCBzdWJTdGF0ZSApID0+IHtcblx0XHRhY3Rpb24uZW50aXRpZXMuZm9yRWFjaChcblx0XHRcdCggZW50aXR5ICkgPT4ge1xuXHRcdFx0XHRpZiAoIGlzTW9kZWxFbnRpdHlPZk1vZGVsKCBlbnRpdHksIG1vZGVsTmFtZSApICkge1xuXHRcdFx0XHRcdHN1YlN0YXRlLnNldCggZW50aXR5LmlkLCBlbnRpdHkgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdCk7XG5cdH0gKTtcblx0aWYgKCAhIHN0YXRlLmhhcyggbW9kZWxOYW1lICkgfHwgaW5jb21pbmdFbnRpdGllcy5pc0VtcHR5KCkgKSB7XG5cdFx0cmV0dXJuIHN0YXRlO1xuXHR9XG5cdGxldFx0dXBkYXRlU3RhdGUgPSBmYWxzZSxcblx0XHRlbnRpdHlSZWNvcmRzO1xuXHRzd2l0Y2ggKCB0eXBlICkge1xuXHRcdGNhc2UgdHlwZXMuUkVDRUlWRV9FTlRJVFlfUkVDT1JEUzpcblx0XHRcdC8vIGlmIGFsbCBpbmNvbWluZyBrZXlzIGV4aXN0IGluIHN0YXRlIGFscmVhZHkgdGhlbiB3ZSBkb24ndCBkb1xuXHRcdFx0Ly8gYW55dGhpbmdcblx0XHRcdGlmICggaXNFbXB0eSggZGlmZmVyZW5jZShcblx0XHRcdFx0QXJyYXkuZnJvbSggaW5jb21pbmdFbnRpdGllcy5rZXlzKCkgKSxcblx0XHRcdFx0QXJyYXkuZnJvbSggc3RhdGUuZ2V0KCBtb2RlbE5hbWUsIE1hcCgpICkua2V5cygpIClcblx0XHRcdCkgKSApIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHQvLyByZXBsYWNlIGFueSBpbmNvbWluZyBlbnRpdHlSZWNvcmRzIHdpdGggZXhpc3RpbmcgZW50aXR5UmVjb3JkcyBhbHJlYWR5XG5cdFx0XHQvLyBpbiB0aGUgc3RvcmUgc28gdGhpcyByZWdpc3RyeSBhY3RzIGFzIHRoZSBcImF1dGhvcml0eVwiXG5cdFx0XHQvLyBmb3IgZW50aXR5UmVjb3Jkcy5cblx0XHRcdGVudGl0eVJlY29yZHMgPSByZXBsYWNlRXhpc3RpbmdFbnRpdGllc0Zyb21TdGF0ZShcblx0XHRcdFx0c3RhdGUsXG5cdFx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdFx0aW5jb21pbmdFbnRpdGllc1xuXHRcdFx0KTtcblx0XHRcdHVwZGF0ZVN0YXRlID0gdHJ1ZTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgdHlwZXMuUkVDRUlWRV9BTkRfUkVQTEFDRV9FTlRJVFlfUkVDT1JEUzpcblx0XHRcdHVwZGF0ZVN0YXRlID0gdHJ1ZTtcblx0XHRcdGVudGl0eVJlY29yZHMgPSBzdGF0ZS5nZXQoIG1vZGVsTmFtZSwgTWFwKCkgKS5tZXJnZSggaW5jb21pbmdFbnRpdGllcyApO1xuXHRcdFx0YnJlYWs7XG5cdH1cblx0aWYgKCB1cGRhdGVTdGF0ZSApIHtcblx0XHRyZXR1cm4gc3RhdGUuc2V0KCBtb2RlbE5hbWUsIGVudGl0eVJlY29yZHMgKTtcblx0fVxuXHRyZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogQSByZWR1Y2VyIGhhbmRsaW5nIHRoZSByZW1vdmFsIG9mIGFuIGVudGl0eSBmcm9tIHN0YXRlIG1hdGNoaW5nIHRoZSBnaXZlblxuICogaWQuXG4gKlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblxuICogQHJldHVybiB7SW1tdXRhYmxlLk1hcH0gTmV3IG9yIGV4aXN0aW5nIHN0YXRlLlxuICovXG5mdW5jdGlvbiByZW1vdmVFbnRpdHlCeUlkKCBzdGF0ZSwgYWN0aW9uICkge1xuXHRjb25zdCB7IG1vZGVsTmFtZSwgZW50aXR5SWQgPSAwIH0gPSBhY3Rpb247XG5cdGNvbnN0IGlkID0gbm9ybWFsaXplRW50aXR5SWQoIGVudGl0eUlkICk7XG5cdHJldHVybiBzdGF0ZS5kZWxldGVJbiggWyBtb2RlbE5hbWUsIGlkIF0gKTtcbn1cblxuLyoqXG4gKiBFeHBvcnRzIHVzZWZ1bCBmb3IgdGVzdHMuXG4gKi9cbmV4cG9ydCB7XG5cdHJlY2VpdmVFbnRpdHksXG5cdHJlY2VpdmVFbnRpdHlSZWNvcmRzLFxuXHRyZW1vdmVFbnRpdHlCeUlkLFxufTtcblxuLyoqXG4gKiBEZWZhdWx0IHJlZHVjZXIgZm9yIGhhbmRsaW5nIGVudGl0aWVzIGluIHN0YXRlLlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEByZXR1cm4ge0ltbXV0YWJsZS5NYXB9IE5ldyBvciBleGlzdGluZyBzdGF0ZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBlbnRpdGllcyhcblx0c3RhdGUgPSBmcm9tSlMoIERFRkFVTFRfQ09SRV9TVEFURS5lbnRpdGllcyApLFxuXHRhY3Rpb25cbikge1xuXHRpZiAoIGFjdGlvbi50eXBlICkge1xuXHRcdHN3aXRjaCAoIGFjdGlvbi50eXBlICkge1xuXHRcdFx0Y2FzZSB0eXBlcy5SRUNFSVZFX0VOVElUWV9SRUNPUkRTOlxuXHRcdFx0Y2FzZSB0eXBlcy5SRUNFSVZFX0FORF9SRVBMQUNFX0VOVElUWV9SRUNPUkRTOlxuXHRcdFx0XHRyZXR1cm4gcmVjZWl2ZUVudGl0eVJlY29yZHMoIHN0YXRlLCBhY3Rpb24gKTtcblx0XHRcdGNhc2UgdHlwZXMuUkVDRUlWRV9FTlRJVFk6XG5cdFx0XHRcdHJldHVybiByZWNlaXZlRW50aXR5KCBzdGF0ZSwgYWN0aW9uICk7XG5cdFx0XHRjYXNlIHR5cGVzLlJFTU9WRV9FTlRJVFlfQllfSUQgOlxuXHRcdFx0XHRyZXR1cm4gcmVtb3ZlRW50aXR5QnlJZCggc3RhdGUsIGFjdGlvbiApO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gc3RhdGU7XG59XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgY29tYmluZVJlZHVjZXJzIH0gZnJvbSAnQHdvcmRwcmVzcy9kYXRhJztcblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCBlbnRpdGllcyBmcm9tICcuL2VudGl0aWVzJztcbmltcG9ydCByZWxhdGlvbnMgZnJvbSAnLi9yZWxhdGlvbnMnO1xuaW1wb3J0IGRpcnR5IGZyb20gJy4vZGlydHknO1xuaW1wb3J0IG1vZGVsU3BlY2lmaWMgZnJvbSAnLi9tb2RlbC1zcGVjaWZpYy1yZWR1Y2Vycyc7XG5cbi8qKlxuICogUmVkdWNlcnMgZm9yIGVudGl0aWVzLCByZWxhdGlvbnMgYW5kIGRpcnR5IHN0YXRlLlxuICpcbiAqIEJlIGF3YXJlIHRoYXQgdGhlIHJvb3Qgc3RhdGUgaXMgYSBwbGFpbiBvYmplY3QgYnV0IHRoZSBzbGljZXMgKGVudGl0aWVzLFxuICogcmVsYXRpb25zLCBkaXJ0eSkgYXJlIGltbXV0YWJsZSBNYXBzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjb21iaW5lUmVkdWNlcnMoIHtcblx0ZW50aXRpZXMsXG5cdHJlbGF0aW9ucyxcblx0ZGlydHksXG5cdG1vZGVsU3BlY2lmaWMsXG59ICk7XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgTWFwIH0gZnJvbSAnaW1tdXRhYmxlJztcblxuaW1wb3J0IHsgQUNUSU9OX1RZUEVTIH0gZnJvbSAnLi4vYWN0aW9ucy9hY3Rpb24tdHlwZXMnO1xuY29uc3QgeyBtb2RlbFNwZWNpZmljOiB0eXBlcywgcmVzZXRzOiByZXNldFR5cGVzIH0gPSBBQ1RJT05fVFlQRVM7XG5cbi8qKlxuICogSGFuZGxlIHJlY2VpdmluZyBhIG1vZGVsIHNwZWNpZmljIHNlbGVjdG9yIHJlY29yZCBpbnRvIHRoZSBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0ge01hcH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEByZXR1cm4ge01hcH0gTmV3IG9yIGV4aXN0aW5nIHN0YXRlLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBoYW5kbGVSZWNlaXZlU2VsZWN0b3IoIHN0YXRlID0gTWFwKCksIGFjdGlvbiApIHtcblx0Y29uc3Qge1xuXHRcdHR5cGUsXG5cdFx0c2VsZWN0b3IsXG5cdFx0YXJncyxcblx0XHR2YWx1ZSxcblx0fSA9IGFjdGlvbjtcblx0c3dpdGNoICggdHlwZSApIHtcblx0XHRjYXNlIHR5cGVzLlJFQ0VJVkVfU0VMRUNUT1JfVkFMVUU6XG5cdFx0XHRyZXR1cm4gc3RhdGUuc2V0SW4oIFsgc2VsZWN0b3IsIEpTT04uc3RyaW5naWZ5KCBhcmdzICkgXSwgdmFsdWUgKTtcblx0XHRjYXNlIHJlc2V0VHlwZXMuUkVTRVRfQUxMX01PREVMX1NQRUNJRklDOlxuXHRcdFx0cmV0dXJuIE1hcCgpO1xuXHRcdGNhc2UgcmVzZXRUeXBlcy5SRVNFVF9NT0RFTF9TUEVDSUZJQ19GT1JfU0VMRUNUT1I6XG5cdFx0XHRyZXR1cm4gc3RhdGUuZGVsZXRlSW4oIFsgc2VsZWN0b3IsIEpTT04uc3RyaW5naWZ5KCBhcmdzICkgXSApO1xuXHR9XG5cdHJldHVybiBzdGF0ZTtcbn1cbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0cy5cbiAqL1xuaW1wb3J0IHtcblx0REVGQVVMVF9DT1JFX1NUQVRFLFxuXHRwbHVyYWxNb2RlbE5hbWUsXG5cdHNpbmd1bGFyTW9kZWxOYW1lLFxufSBmcm9tICdAZXZlbnRlc3ByZXNzby9tb2RlbCc7XG5pbXBvcnQge1xuXHRyZW1vdmVFbXB0eUZyb21TdGF0ZSxcblx0bm9ybWFsaXplRW50aXR5SWQsXG59IGZyb20gJ0BldmVudGVzcHJlc3NvL2hlbHBlcnMnO1xuaW1wb3J0IHsgZnJvbUpTLCBTZXQsIE1hcCB9IGZyb20gJ2ltbXV0YWJsZSc7XG5cbi8qKlxuICogSW50ZXJuYWwgSW1wb3J0c1xuICovXG5pbXBvcnQgeyBBQ1RJT05fVFlQRVMgfSBmcm9tICcuLi9hY3Rpb25zL2FjdGlvbi10eXBlcyc7XG5jb25zdCB7IHJlbGF0aW9uczogdHlwZXMsIHJlc2V0czogcmVzZXRUeXBlcyB9ID0gQUNUSU9OX1RZUEVTO1xuXG4vKipcbiAqIEhhbmRsZXMgbm9ybWFsaXppbmcgdGhlIGluY29taW5nIGFjdGlvbiBzbyB0aGF0IHdlJ3JlIGFsd2F5cyBvbmx5IHJlY2VpdmluZ1xuICogcmVsYXRpb24gZGF0YSBpbiB0aGUgc3RhdGUgb3JpZW50ZWQgZnJvbSBvbmUgZGlyZWN0aW9uLlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEByZXR1cm4ge0ltbXV0YWJsZS5NYXB9IEV4aXN0aW5nIG9yIG5ldyBzdGF0ZS5cbiAqL1xuY29uc3Qgbm9ybWFsaXplZFJlY2VpdmVBbmRSZW1vdmVSZWxhdGlvbnMgPSAoIHN0YXRlLCBhY3Rpb24gKSA9PiB7XG5cdC8vIGZpcnN0IG5vcm1hbGl6ZSB0aGUgYWN0aW9uXG5cdGFjdGlvbiA9IHtcblx0XHQuLi5hY3Rpb24sXG5cdFx0bW9kZWxOYW1lOiBzaW5ndWxhck1vZGVsTmFtZSggYWN0aW9uLm1vZGVsTmFtZSApLFxuXHRcdHJlbGF0aW9uTmFtZTogcGx1cmFsTW9kZWxOYW1lKCBhY3Rpb24ucmVsYXRpb25OYW1lICksXG5cdFx0ZW50aXR5SWQ6IG5vcm1hbGl6ZUVudGl0eUlkKCBhY3Rpb24uZW50aXR5SWQgKSxcblx0fTtcblx0Y29uc3Qge1xuXHRcdG1vZGVsTmFtZSxcblx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0cmVsYXRlZEVudGl0eUlkcyxcblx0XHRlbnRpdHlJZCxcblx0fSA9IGFjdGlvbjtcblx0Ly8gaWYgbW9kZWxOYW1lIGV4aXN0cywgdGhlbiB3ZSBqdXN0IHByb2Nlc3MgYXMgaXMuXG5cdGlmICggc3RhdGUuaGFzSW4oIFsgJ2VudGl0eU1hcCcsIG1vZGVsTmFtZSBdICkgKSB7XG5cdFx0cmV0dXJuIHJlY2VpdmVBbmRSZW1vdmVSZWxhdGlvbnMoIHN0YXRlLCBhY3Rpb24gKTtcblx0fVxuXHQvLyBpZiB0aGUgc2luZ3VsYXIgZm9ybSBvZiB0aGUgcmVsYXRpb24gbW9kZWwgbmFtZSBleGlzdHMsIHRoZW4gd2UgbmVlZCB0b1xuXHQvLyBmbGlwIHRoaW5ncyBzbyB3ZSdyZSBub3JtYWxpemluZyB0byBhbHdheXMgaGF2ZSBhbiBpbmRleCBmcm9tIGEgc2luZ2xlXG5cdC8vIG1vZGVsTmFtZSBmb3IgdGhpcyByZWxhdGlvbiB0eXBlLlxuXHRpZiAoIHN0YXRlLmhhc0luKFxuXHRcdFsgJ2VudGl0eU1hcCcsIHNpbmd1bGFyTW9kZWxOYW1lKCByZWxhdGlvbk5hbWUgKSBdXG5cdCkgKSB7XG5cdFx0Y29uc3QgbmV3QWN0aW9uID0ge1xuXHRcdFx0Li4uYWN0aW9uLFxuXHRcdFx0bW9kZWxOYW1lOiBzaW5ndWxhck1vZGVsTmFtZSggcmVsYXRpb25OYW1lICksXG5cdFx0XHRyZWxhdGlvbk5hbWU6IHBsdXJhbE1vZGVsTmFtZSggbW9kZWxOYW1lICksXG5cdFx0XHRyZWxhdGVkRW50aXR5SWRzOiBbIGVudGl0eUlkIF0sXG5cdFx0fTtcblx0XHQvLyBsb29wIHRocm91Z2ggZWFjaCBleGlzdGluZyByZWxhdGlvbiBpZCBhbmQgZ2V0IHRoZSBzdGF0ZSBmb3IgZWFjaFxuXHRcdHdoaWxlICggcmVsYXRlZEVudGl0eUlkcy5sZW5ndGggPiAwICkge1xuXHRcdFx0bmV3QWN0aW9uLmVudGl0eUlkID0gbm9ybWFsaXplRW50aXR5SWQoIHJlbGF0ZWRFbnRpdHlJZHMucG9wKCkgKTtcblx0XHRcdHN0YXRlID0gcmVjZWl2ZUFuZFJlbW92ZVJlbGF0aW9ucyggc3RhdGUsIG5ld0FjdGlvbiApO1xuXHRcdH1cblx0XHRyZXR1cm4gc3RhdGU7XG5cdH1cblx0Ly8gbG9va3MgbGlrZSB0aGluZ3MgYXJlIGFscmVhZHkgbm9ybWFsaXplZCBjb3JyZWN0bHkgc28ganVzdCBwcm9jZXNzIGFzIGlzLlxuXHRyZXR1cm4gcmVjZWl2ZUFuZFJlbW92ZVJlbGF0aW9ucyggc3RhdGUsIGFjdGlvbiApO1xufTtcblxuLyoqXG4gKiBVc2VkIHRvIHNldCB0aGUgcmVsYXRpb24gaW5kZXggZm9yIHRoZSBnaXZlbiBkYXRhLlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWxhdGlvbkRhdGFcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVtb3ZhbCAgaWYgdHJ1ZSB0aGVuIHJlbW92ZXMgdGhlIGluY29taW5nIHJlbGF0aW9uIGlkcyBmcm9tXG4gKiB0aGUgc3RhdGUsIG90aGVyd2lzZSBhZGRzLlxuICogQHJldHVybiB7SW1tdXRhYmxlLk1hcH0gRXhpc3Rpbmcgb3IgY2hhbmdlZCBzdGF0ZS5cbiAqL1xuY29uc3Qgc2V0UmVsYXRpb25JbmRleCA9ICggc3RhdGUsIHJlbGF0aW9uRGF0YSwgcmVtb3ZhbCA9IGZhbHNlICkgPT4ge1xuXHRjb25zdCB7XG5cdFx0ZW50aXR5SWQsXG5cdFx0cmVsYXRlZEVudGl0eUlkcyxcblx0fSA9IHJlbGF0aW9uRGF0YTtcblx0Y29uc3QgbW9kZWxOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIHJlbGF0aW9uRGF0YS5tb2RlbE5hbWUgKTtcblx0Y29uc3QgcmVsYXRpb25OYW1lID0gcGx1cmFsTW9kZWxOYW1lKCByZWxhdGlvbkRhdGEucmVsYXRpb25OYW1lICk7XG5cdGNvbnN0IHJlbGF0aW9uSWRzID0gWyAuLi5yZWxhdGVkRW50aXR5SWRzIF07XG5cdHdoaWxlICggcmVsYXRpb25JZHMubGVuZ3RoID4gMCApIHtcblx0XHRjb25zdCBwYXRoID0gWyAnaW5kZXgnLCByZWxhdGlvbk5hbWUsIHJlbGF0aW9uSWRzLnBvcCgpLCBtb2RlbE5hbWUgXTtcblx0XHRsZXQgZXhpc3RpbmdJZHMgPSBzdGF0ZS5nZXRJbiggcGF0aCApIHx8IFNldCgpO1xuXHRcdGV4aXN0aW5nSWRzID0gcmVtb3ZhbCA/XG5cdFx0XHRleGlzdGluZ0lkcy5kZWxldGUoIGVudGl0eUlkICkgOlxuXHRcdFx0ZXhpc3RpbmdJZHMuYWRkKCBlbnRpdHlJZCApO1xuXHRcdHN0YXRlID0gZXhpc3RpbmdJZHMuaXNFbXB0eSgpID9cblx0XHRcdHJlbW92ZUVtcHR5RnJvbVN0YXRlKCBzdGF0ZSwgcGF0aCApIDpcblx0XHRcdHN0YXRlLnNldEluKCBwYXRoLCBleGlzdGluZ0lkcyApO1xuXHR9XG5cdHJldHVybiBzdGF0ZTtcbn07XG5cbi8qKlxuICogUmVkdWNlciBmb3IgdGhlIHJlbGF0aW9ucyBzdGF0ZSBpbiB0aGUgc3RvcmUuXG4gKlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblxuICogQHJldHVybiB7SW1tdXRhYmxlLk1hcH0gRWl0aGVyIGEgbmV3IHN0YXRlIG9yIHRoZSBleGlzdGluZyBzdGF0ZS5cbiAqL1xuZnVuY3Rpb24gcmVjZWl2ZUFuZFJlbW92ZVJlbGF0aW9ucyggc3RhdGUsIGFjdGlvbiApIHtcblx0Y29uc3Qge1xuXHRcdG1vZGVsTmFtZSxcblx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0ZW50aXR5SWQsXG5cdFx0dHlwZSxcblx0fSA9IGFjdGlvbjtcblx0Y29uc3QgcmVsYXRpb25FbnRpdHlJZHMgPSBTZXQoIGFjdGlvbi5yZWxhdGVkRW50aXR5SWRzICk7XG5cdGNvbnN0IHBhdGggPSBbICdlbnRpdHlNYXAnLCBtb2RlbE5hbWUsIGVudGl0eUlkLCByZWxhdGlvbk5hbWUgXTtcblxuXHRjb25zdCBleGlzdGluZ0lkcyA9IHN0YXRlLmdldEluKCBwYXRoLCBTZXQoKSApO1xuXG5cdHN3aXRjaCAoIHR5cGUgKSB7XG5cdFx0Y2FzZSB0eXBlcy5SRUNFSVZFX1JFTEFURURfRU5USVRZX0lEUzpcblx0XHRcdHN0YXRlID0gc3RhdGUuc2V0SW4oXG5cdFx0XHRcdHBhdGgsXG5cdFx0XHRcdGV4aXN0aW5nSWRzLmNvbmNhdCggcmVsYXRpb25FbnRpdHlJZHMgKVxuXHRcdFx0KTtcblx0XHRcdHN0YXRlID0gc2V0UmVsYXRpb25JbmRleCggc3RhdGUsIGFjdGlvbiApO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSB0eXBlcy5SRU1PVkVfUkVMQVRFRF9FTlRJVFlfSURTOlxuXHRcdFx0Y29uc3QgaWRzQWZ0ZXJSZW1vdmFsID0gZXhpc3RpbmdJZHMuZmlsdGVyKFxuXHRcdFx0XHQoIGlkICkgPT4gISByZWxhdGlvbkVudGl0eUlkcy5rZXlPZihcblx0XHRcdFx0XHRub3JtYWxpemVFbnRpdHlJZCggaWQgKVxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdFx0Ly8gSW1tdXRhYmxlLlNldCgpLmZpbHRlcigpIHJldHVybnMgbmV3IGluc3RhbmNlLCBzbyBsZXQncyBjb21wYXJlXG5cdFx0XHQvLyBzaXplLlxuXHRcdFx0aWYgKCBpZHNBZnRlclJlbW92YWwuY291bnQoKSA9PT0gZXhpc3RpbmdJZHMuY291bnQoKSApIHtcblx0XHRcdFx0cmV0dXJuIHN0YXRlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAhIGlkc0FmdGVyUmVtb3ZhbC5pc0VtcHR5KCkgKSB7XG5cdFx0XHRcdHN0YXRlID0gc3RhdGUuc2V0SW4oIHBhdGgsIGlkc0FmdGVyUmVtb3ZhbCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c3RhdGUgPSByZW1vdmVFbXB0eUZyb21TdGF0ZSggc3RhdGUsIHBhdGggKTtcblx0XHRcdH1cblx0XHRcdHN0YXRlID0gc2V0UmVsYXRpb25JbmRleCggc3RhdGUsIGFjdGlvbiwgdHJ1ZSApO1xuXHRcdFx0YnJlYWs7XG5cdH1cblx0cmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIFJlZHVjZXIgZm9yIGhhbmRsaW5nIGVudGl0eSBpZHMgaW4gdGhlIHJlbGF0aW9uIHRoYXQgaGF2ZSBhIGN1aWQgdGhhdCBoYXNcbiAqIGJlZW4gdXBkYXRlZCB3aXRoIGEgbmV3IGVudGl0eSBpZCBmcm9tIHRoZSBzZXJ2ZXIuXG4gKlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblxuICogQHJldHVybiB7SW1tdXRhYmxlLk1hcH0gRWl0aGVyIG5ldyBvciBvcmlnaW5hbCBzdGF0ZVxuICovXG5mdW5jdGlvbiB1cGRhdGVFbnRpdHlJZEZvclJlbGF0aW9ucyggc3RhdGUsIGFjdGlvbiApIHtcblx0bGV0IHtcblx0XHRvbGRFbnRpdHlJZCxcblx0XHRuZXdFbnRpdHlJZCxcblx0XHRtb2RlbE5hbWUsXG5cdH0gPSBhY3Rpb247XG5cdG1vZGVsTmFtZSA9IHNpbmd1bGFyTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0b2xkRW50aXR5SWQgPSBub3JtYWxpemVFbnRpdHlJZCggb2xkRW50aXR5SWQgKTtcblx0bmV3RW50aXR5SWQgPSBub3JtYWxpemVFbnRpdHlJZCggbmV3RW50aXR5SWQgKTtcblx0Y29uc3QgbW9kZWxBc1JlbGF0aW9uTmFtZSA9IHBsdXJhbE1vZGVsTmFtZSggbW9kZWxOYW1lICk7XG5cdGNvbnN0IG9sZEluZGV4UGF0aCA9IFsgJ2luZGV4JywgbW9kZWxBc1JlbGF0aW9uTmFtZSwgb2xkRW50aXR5SWQgXTtcblx0Y29uc3QgaW5kZXhSZWNvcmRUb1JlcGxhY2UgPSBzdGF0ZS5nZXRJbiggb2xkSW5kZXhQYXRoICkgfHwgTWFwKCk7XG5cdGlmICggISBpbmRleFJlY29yZFRvUmVwbGFjZS5pc0VtcHR5KCkgKSB7XG5cdFx0c3RhdGUgPSByZXBsYWNlUmVsYXRpb25SZWNvcmRzKFxuXHRcdFx0c3RhdGUsXG5cdFx0XHQnaW5kZXgnLFxuXHRcdFx0e1xuXHRcdFx0XHRtb2RlbE5hbWU6IG1vZGVsQXNSZWxhdGlvbk5hbWUsXG5cdFx0XHRcdG9sZEVudGl0eUlkLFxuXHRcdFx0XHRuZXdFbnRpdHlJZCxcblx0XHRcdFx0bWFpblJlY29yZFRvUmVwbGFjZTogaW5kZXhSZWNvcmRUb1JlcGxhY2UsXG5cdFx0XHR9XG5cdFx0KTtcblx0fVxuXHRjb25zdCBvbGRFbnRpdHlNYXBQYXRoID0gWyAnZW50aXR5TWFwJywgbW9kZWxOYW1lLCBvbGRFbnRpdHlJZCBdO1xuXHRjb25zdCBtYXBFbnRpdHlSZWNvcmRUb1JlcGxhY2UgPSBzdGF0ZS5nZXRJbiggb2xkRW50aXR5TWFwUGF0aCApIHx8IE1hcCgpO1xuXG5cdGlmICggISBtYXBFbnRpdHlSZWNvcmRUb1JlcGxhY2UuaXNFbXB0eSgpICkge1xuXHRcdHN0YXRlID0gcmVwbGFjZVJlbGF0aW9uUmVjb3Jkcyhcblx0XHRcdHN0YXRlLFxuXHRcdFx0J2VudGl0eU1hcCcsXG5cdFx0XHR7XG5cdFx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdFx0b2xkRW50aXR5SWQsXG5cdFx0XHRcdG5ld0VudGl0eUlkLFxuXHRcdFx0XHRtYWluUmVjb3JkVG9SZXBsYWNlOiBtYXBFbnRpdHlSZWNvcmRUb1JlcGxhY2UsXG5cdFx0XHR9XG5cdFx0KTtcblx0fVxuXHRyZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogVXRpbGl0eSBtZXRob2QgZm9yIGhhbmRsaW5nIHJlcGxhY2luZyB0aGUgb2xkIGVudGl0eSBpZCBmcm9tIGluY29taW5nIG1vZGVsXG4gKiB3aXRoIHRoZSBwcm92aWRlZCBuZXcgaWQgZGF0YSAob3IganVzdCByZW1vdmluZyBpdCBpZiByZW1vdmVPbmx5IGlzIHRydWUpXG4gKiBUaGlzIGhhbmRsZXMgYm90aCB0aGUgaW5kZXggYW5kIGVudGl0eU1hcCBvYmplY3RzIGluIHRoZSByZWxhdGlvbnMgc3RhdGUuXG4gKlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0YXRlUHJvcGVydHlOYW1lIChlaXRoZXIgYGluZGV4YCBvciBgZW50aXR5TWFwYClcbiAqIEBwYXJhbSB7T2JqZWN0fSBtb2RlbERhdGFcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVtb3ZlT25seSBJZiB0cnVlLCB0aGVuIHRoZSB2YWx1ZSBmb3Igb2xkRW50aXR5SWQgd2lsbCBiZVxuICogcmVtb3ZlZCBmcm9tIHN0YXRlIGFuZCBuZXdFbnRpdHkgd2lsbCBub3QgYmUgYWRkZWQgdG8gc3RhdGUuXG4gKiBAcmV0dXJuIHtJbW11dGFibGUuTWFwfSBSZXR1cm5zIGVpdGhlciBuZXcgb3IgZXhpc3Rpbmcgc3RhdGUuXG4gKi9cbmNvbnN0IHJlcGxhY2VSZWxhdGlvblJlY29yZHMgPSAoXG5cdHN0YXRlLFxuXHRzdGF0ZVByb3BlcnR5TmFtZSxcblx0bW9kZWxEYXRhLFxuXHRyZW1vdmVPbmx5ID0gZmFsc2UsXG4pID0+IHtcblx0Y29uc3Qge1xuXHRcdG1vZGVsTmFtZSxcblx0XHRvbGRFbnRpdHlJZCxcblx0XHRuZXdFbnRpdHlJZCA9IDAsXG5cdFx0bWFpblJlY29yZFRvUmVwbGFjZSxcblx0fSA9IG1vZGVsRGF0YTtcblx0Y29uc3QgbG9vcFByb3BlcnR5ID0gc3RhdGVQcm9wZXJ0eU5hbWUgPT09ICdpbmRleCcgPyAnZW50aXR5TWFwJyA6ICdpbmRleCc7XG5cdGNvbnN0IG9sZEVudGl0eVBhdGggPSBbIHN0YXRlUHJvcGVydHlOYW1lLCBtb2RlbE5hbWUsIG9sZEVudGl0eUlkIF07XG5cdHN0YXRlID0gc3RhdGUud2l0aE11dGF0aW9ucyggKCBzdWJTdGF0ZSApID0+IHtcblx0XHRzdWJTdGF0ZS5kZWxldGVJbiggb2xkRW50aXR5UGF0aCApO1xuXHRcdG9sZEVudGl0eVBhdGgucG9wKCk7XG5cdFx0aWYgKCByZW1vdmVPbmx5ICkge1xuXHRcdFx0aWYgKCBzdWJTdGF0ZS5nZXRJbiggb2xkRW50aXR5UGF0aCApLmlzRW1wdHkoKSApIHtcblx0XHRcdFx0c3ViU3RhdGUuZGVsZXRlSW4oIG9sZEVudGl0eVBhdGggKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0c3ViU3RhdGUuc2V0SW4oXG5cdFx0XHRcdFsgLi4ub2xkRW50aXR5UGF0aCwgbmV3RW50aXR5SWQgXSxcblx0XHRcdFx0bWFpblJlY29yZFRvUmVwbGFjZVxuXHRcdFx0KTtcblx0XHR9XG5cdH0gKTtcblxuXHQvL3JlcGxhY2UgcmVsYXRlZCBlbnRyaWVzXG5cdG1haW5SZWNvcmRUb1JlcGxhY2UuZm9yRWFjaCggKCByZWxhdGlvbklkcywgcmVsYXRpb25OYW1lICkgPT4ge1xuXHRcdHJlbGF0aW9uSWRzID0gcmVsYXRpb25JZHMudG9BcnJheSgpO1xuXHRcdHN0YXRlID0gc3RhdGUud2l0aE11dGF0aW9ucyggKCBzdWJTdGF0ZSApID0+IHtcblx0XHRcdHdoaWxlICggcmVsYXRpb25JZHMubGVuZ3RoID4gMCApIHtcblx0XHRcdFx0Y29uc3QgcmVsYXRpb25QYXRoID0gW1xuXHRcdFx0XHRcdGxvb3BQcm9wZXJ0eSxcblx0XHRcdFx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0XHRcdFx0cmVsYXRpb25JZHMucG9wKCksXG5cdFx0XHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0XHRdO1xuXHRcdFx0XHRsZXQgcmVsYXRpb25SZWNvcmQgPSBzdWJTdGF0ZS5nZXRJbiggcmVsYXRpb25QYXRoICkgfHwgU2V0KCk7XG5cdFx0XHRcdHJlbGF0aW9uUmVjb3JkID0gcmVsYXRpb25SZWNvcmQuZGVsZXRlKCBvbGRFbnRpdHlJZCApO1xuXHRcdFx0XHRpZiAoIHJlbW92ZU9ubHkgJiYgcmVsYXRpb25SZWNvcmQuaXNFbXB0eSgpICkge1xuXHRcdFx0XHRcdHJlbW92ZUVtcHR5RnJvbVN0YXRlKFxuXHRcdFx0XHRcdFx0c3ViU3RhdGUsXG5cdFx0XHRcdFx0XHRyZWxhdGlvblBhdGgsXG5cdFx0XHRcdFx0XHQxLFxuXHRcdFx0XHRcdFx0ZmFsc2Vcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlbGF0aW9uUmVjb3JkID0gcmVtb3ZlT25seSA/XG5cdFx0XHRcdFx0XHRyZWxhdGlvblJlY29yZCA6XG5cdFx0XHRcdFx0XHRyZWxhdGlvblJlY29yZC5hZGQoIG5ld0VudGl0eUlkICk7XG5cdFx0XHRcdFx0c3ViU3RhdGUuc2V0SW4oIHJlbGF0aW9uUGF0aCwgcmVsYXRpb25SZWNvcmQgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSApO1xuXHRyZXR1cm4gc3RhdGU7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgYW55IHJlbGF0aW9uIHJlcXVlc3RzIGZvciByZWxhdGVkIGVudGl0aWVzIGluIHRoZSBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHN0YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uXG4gKiBAcmV0dXJuIHtJbW11dGFibGUuTWFwfSBlaXRoZXIgZXhpc3RpbmcgKGlmIG5vIGNoYW5nZXMpIG9yIG5ldyBzdGF0ZS5cbiAqL1xuY29uc3QgcmVtb3ZlUmVsYXRlZEVudGl0aWVzRm9yRW50aXR5ID0gKCBzdGF0ZSwgYWN0aW9uICkgPT4ge1xuXHRsZXQge1xuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHlJZCxcblx0fSA9IGFjdGlvbjtcblx0bW9kZWxOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRlbnRpdHlJZCA9IG5vcm1hbGl6ZUVudGl0eUlkKCBlbnRpdHlJZCApO1xuXHRjb25zdCBtb2RlbEFzUmVsYXRpb25OYW1lID0gcGx1cmFsTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0Y29uc3QgaW5kZXhSZWNvcmRUb1JlcGxhY2UgPSBzdGF0ZS5nZXRJbihcblx0XHRbICdpbmRleCcsIG1vZGVsQXNSZWxhdGlvbk5hbWUsIGVudGl0eUlkIF1cblx0KSB8fCBNYXAoKTtcblxuXHRpZiAoICEgaW5kZXhSZWNvcmRUb1JlcGxhY2UuaXNFbXB0eSgpICkge1xuXHRcdHN0YXRlID0gcmVwbGFjZVJlbGF0aW9uUmVjb3Jkcyhcblx0XHRcdHN0YXRlLFxuXHRcdFx0J2luZGV4Jyxcblx0XHRcdHtcblx0XHRcdFx0bW9kZWxOYW1lOiBtb2RlbEFzUmVsYXRpb25OYW1lLFxuXHRcdFx0XHRvbGRFbnRpdHlJZDogZW50aXR5SWQsXG5cdFx0XHRcdG1haW5SZWNvcmRUb1JlcGxhY2U6IGluZGV4UmVjb3JkVG9SZXBsYWNlLFxuXHRcdFx0fSxcblx0XHRcdHRydWVcblx0XHQpO1xuXHR9XG5cblx0Y29uc3QgZW50aXR5TWFwUmVjb3JkVG9SZXBsYWNlID0gc3RhdGUuZ2V0SW4oXG5cdFx0WyAnZW50aXR5TWFwJywgbW9kZWxOYW1lLCBlbnRpdHlJZCBdXG5cdCkgfHwgTWFwKCk7XG5cblx0aWYgKCAhIGVudGl0eU1hcFJlY29yZFRvUmVwbGFjZS5pc0VtcHR5KCkgKSB7XG5cdFx0c3RhdGUgPSByZXBsYWNlUmVsYXRpb25SZWNvcmRzKFxuXHRcdFx0c3RhdGUsXG5cdFx0XHQnZW50aXR5TWFwJyxcblx0XHRcdHtcblx0XHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0XHRvbGRFbnRpdHlJZDogZW50aXR5SWQsXG5cdFx0XHRcdG1haW5SZWNvcmRUb1JlcGxhY2U6IGVudGl0eU1hcFJlY29yZFRvUmVwbGFjZSxcblx0XHRcdH0sXG5cdFx0XHR0cnVlXG5cdFx0KTtcblx0fVxuXHRyZXR1cm4gc3RhdGU7XG59O1xuXG4vKipcbiAqIEhhbmRsZXMgcmVzZXR0aW5nIHRoZSBzdGF0ZSBmb3IgdGhlIGdpdmVuIG1vZGVsTmFtZSBpbiB0aGUgYWN0aW9uLlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqXG4gKiBAcmV0dXJuIHtJbW11dGFibGUuTWFwfSBUaGUgbmV3IChvciBleGlzdGluZyBpZiBubyBjaGFuZ2VzKSBzdGF0ZS5cbiAqL1xuY29uc3QgcmVzZXRTdGF0ZUZvck1vZGVsID0gKCBzdGF0ZSwgYWN0aW9uICkgPT4ge1xuXHRjb25zdCBzaW5ndWxhck5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggYWN0aW9uLm1vZGVsTmFtZSApO1xuXHRjb25zdCBwbHVyYWxOYW1lID0gcGx1cmFsTW9kZWxOYW1lKCBhY3Rpb24ubW9kZWxOYW1lICk7XG5cdGNvbnN0IGluZGV4UGF0aCA9IFsgJ2luZGV4JywgcGx1cmFsTmFtZSBdO1xuXHRjb25zdCBlbnRpdHlNYXBQYXRoID0gWyAnZW50aXR5TWFwJywgc2luZ3VsYXJOYW1lIF07XG5cdGlmICggc3RhdGUuaGFzSW4oIGluZGV4UGF0aCApICkge1xuXHRcdHN0YXRlID0gY2xlYXJNb2RlbE5hbWVzRnJvbVBhdGgoXG5cdFx0XHRzdGF0ZSxcblx0XHRcdGluZGV4UGF0aCxcblx0XHRcdCdlbnRpdHlNYXAnLFxuXHRcdFx0cGx1cmFsTmFtZVxuXHRcdCk7XG5cdH1cblx0aWYgKCBzdGF0ZS5oYXNJbiggZW50aXR5TWFwUGF0aCApICkge1xuXHRcdHN0YXRlID0gY2xlYXJNb2RlbE5hbWVzRnJvbVBhdGgoXG5cdFx0XHRzdGF0ZSxcblx0XHRcdGVudGl0eU1hcFBhdGgsXG5cdFx0XHQnaW5kZXgnLFxuXHRcdFx0c2luZ3VsYXJOYW1lXG5cdFx0KTtcblx0fVxuXHRyZXR1cm4gc3RhdGU7XG59O1xuXG4vKipcbiAqIEhlbHBlciBmb3IgY2xlYXJpbmcgdGhlIGVudHJpZXMgaW4gdGhlIGRpcnR5IHJlbGF0aW9ucyBzdGF0ZSBmb3IgdGhlIGdpdmVuXG4gKiBtb2RlbE5hbWUuXG4gKlxuICogVGhpcyBjbGVhcnMgZW50cmllcyBpbiBib3RoIHRoZSBgaW5kZXhgIGFuZCBgZW50aXR5TWFwYCBtYXBzLlxuICpcbiAqIFwiTWFpbiBzdGF0ZVwiIGlzIHVzZWQgaW4gdGhpcyBmdW5jdGlvbiB0byByZXByZXNlbnQgdGhlIHRvcCBsZXZlbCBzdGF0ZSB0aGVcbiAqIG1vZGVsJ3MgZW50cmllcyBhcmUgYmVpbmcgZGVsZXRlZCBmcm9tIChpLmUuIGVudGl0eU1hcCBvciBpbmRleCkuXG4gKlxuICogXCJPcHBvc2l0ZSBzdGF0ZVwiIGlzIHVzZWQgaW4gdGhpcyBmdW5jdGlvbiB0byByZXByZXNlbnQgdGhlIG9wcG9zaXRlIHRvcCBsZXZlbFxuICogc3RhdGUuICBTbyBpZiB0aGUgbWFpbiBzdGF0ZSBwYXRoIHBvaW50cyB0byBlbnRyaWVzIGluIHRoZSBlbnRpdHlNYXAsIHRoZW5cbiAqIHRoZSBvcHBvc2l0ZSBzdGF0ZSB3aWxsIGJlIGVudHJpZXMgaW4gdGhlIGluZGV4LlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggZm9yIHRoZSBtYWluIHN0YXRlIGJlaW5nIGNsZWFyZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWFwUHJvcGVydHkgVGhlIHByb3BlcnR5IGZvciB0aGUgb3Bwb3NpdGUgc3RhdGUgaW5kZXggYmVpbmdcbiAqIGNsZWFyZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25Nb2RlbE5hbWUgIFRoZSBtb2RlbE5hbWUgc3RyaW5nIGZvciB0aGUgbW9kZWwgYmVpbmdcbiAqIGNsZWFyZWQgZnJvbSB0aGUgb3Bwb3NpdGUgc3RhdGUgbWFwLlxuICpcbiAqIEByZXR1cm4ge0ltbXV0YWJsZS5NYXB9IFRoZSBuZXcgKG9yIGV4aXN0aW5nIGlmIG5vIGNoYW5nZXMpIHN0YXRlLlxuICovXG5jb25zdCBjbGVhck1vZGVsTmFtZXNGcm9tUGF0aCA9IChcblx0c3RhdGUsXG5cdHBhdGgsXG5cdG1hcFByb3BlcnR5LFxuXHRyZWxhdGlvbk1vZGVsTmFtZVxuKSA9PiB7XG5cdGNvbnN0IG1haW5TdGF0ZSA9IHN0YXRlLmdldEluKCBwYXRoICk7XG5cdGxldCBvcHBvc2l0ZVN0YXRlID0gc3RhdGUuZ2V0KCBtYXBQcm9wZXJ0eSApO1xuXHRvcHBvc2l0ZVN0YXRlID0gb3Bwb3NpdGVTdGF0ZS53aXRoTXV0YXRpb25zKCAoIHN1YlN0YXRlICkgPT4ge1xuXHRcdG1haW5TdGF0ZS5mb3JFYWNoKCAoIHJlbGF0aW9uTWFwICkgPT4ge1xuXHRcdFx0cmVsYXRpb25NYXAuZm9yRWFjaCggKCByZWxhdGlvbklkcywgcmVsYXRpb25OYW1lICkgPT4ge1xuXHRcdFx0XHRyZWxhdGlvbklkcy5mb3JFYWNoKCAoIHJlbGF0aW9uSWQgKSA9PiB7XG5cdFx0XHRcdFx0c3ViU3RhdGUuZGVsZXRlSW4oXG5cdFx0XHRcdFx0XHRbIHJlbGF0aW9uTmFtZSwgcmVsYXRpb25JZCwgcmVsYXRpb25Nb2RlbE5hbWUgXVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0c3ViU3RhdGUuaGFzSW4oIFsgcmVsYXRpb25OYW1lLCByZWxhdGlvbklkIF0gKSAmJlxuXHRcdFx0XHRcdFx0c3ViU3RhdGUuZ2V0SW4oXG5cdFx0XHRcdFx0XHRcdFsgcmVsYXRpb25OYW1lLCByZWxhdGlvbklkIF1cblx0XHRcdFx0XHRcdCkuY291bnQoKSA8IDFcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdHJlbW92ZUVtcHR5RnJvbVN0YXRlKFxuXHRcdFx0XHRcdFx0XHRzdWJTdGF0ZSxcblx0XHRcdFx0XHRcdFx0WyByZWxhdGlvbk5hbWUsIHJlbGF0aW9uSWQgXSxcblx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fSApO1xuXHRzdGF0ZSA9IHN0YXRlLnNldCggbWFwUHJvcGVydHksIG9wcG9zaXRlU3RhdGUgKTtcblx0cmV0dXJuIHN0YXRlLmRlbGV0ZUluKCBwYXRoICk7XG59O1xuXG4vKipcbiAqIGV4cG9ydCBmb3IgdGVzdHNcbiAqL1xuZXhwb3J0IHtcblx0bm9ybWFsaXplZFJlY2VpdmVBbmRSZW1vdmVSZWxhdGlvbnMsXG5cdHVwZGF0ZUVudGl0eUlkRm9yUmVsYXRpb25zLFxuXHRyZW1vdmVSZWxhdGVkRW50aXRpZXNGb3JFbnRpdHksXG59O1xuXG4vKipcbiAqIFJlZHVjZXIgZm9yIHJlbGF0aW9uIHJlbGF0ZWQgc3RhdGUgY2hhbmdlcy5cbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEByZXR1cm4ge0ltbXV0YWJsZS5NYXB9IE9yaWdpbmFsIHN0YXRlIGlmIG5vIGNoYW5nZSwgbmV3IHN0YXRlIGlmIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVsYXRpb25zKFxuXHRzdGF0ZSA9IGZyb21KUyggREVGQVVMVF9DT1JFX1NUQVRFLnJlbGF0aW9ucyApLFxuXHRhY3Rpb25cbikge1xuXHRzd2l0Y2ggKCBhY3Rpb24udHlwZSApIHtcblx0XHRjYXNlIHR5cGVzLlJFQ0VJVkVfUkVMQVRFRF9FTlRJVFlfSURTOlxuXHRcdGNhc2UgdHlwZXMuUkVNT1ZFX1JFTEFURURfRU5USVRZX0lEUzpcblx0XHRcdHJldHVybiBub3JtYWxpemVkUmVjZWl2ZUFuZFJlbW92ZVJlbGF0aW9ucyggc3RhdGUsIGFjdGlvbiApO1xuXHRcdGNhc2UgdHlwZXMuUkVDRUlWRV9VUERBVEVEX0VOVElUWV9JRF9GT1JfUkVMQVRJT05TOlxuXHRcdFx0cmV0dXJuIHVwZGF0ZUVudGl0eUlkRm9yUmVsYXRpb25zKCBzdGF0ZSwgYWN0aW9uICk7XG5cdFx0Y2FzZSB0eXBlcy5SRU1PVkVfUkVMQVRFRF9FTlRJVElFU19GT1JfRU5USVRZOlxuXHRcdFx0cmV0dXJuIHJlbW92ZVJlbGF0ZWRFbnRpdGllc0ZvckVudGl0eSggc3RhdGUsIGFjdGlvbiApO1xuXHRcdGNhc2UgcmVzZXRUeXBlcy5SRVNFVF9BTExfU1RBVEU6XG5cdFx0XHRyZXR1cm4gZnJvbUpTKCBERUZBVUxUX0NPUkVfU1RBVEUucmVsYXRpb25zICk7XG5cdFx0Y2FzZSByZXNldFR5cGVzLlJFU0VUX1NUQVRFX0ZPUl9NT0RFTDpcblx0XHRcdHJldHVybiByZXNldFN0YXRlRm9yTW9kZWwoIHN0YXRlLCBhY3Rpb24gKTtcblx0fVxuXHRyZXR1cm4gc3RhdGU7XG59XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgZ2V0RW5kcG9pbnQgfSBmcm9tICdAZXZlbnRlc3ByZXNzby9tb2RlbCc7XG5pbXBvcnQgeyBpc01vZGVsRW50aXR5RmFjdG9yeU9mTW9kZWwgfSBmcm9tICdAZXZlbnRlc3ByZXNzby92YWxpZGF0b3JzJztcblxuLyoqXG4gKiBJbnRlcm5hbCBJbXBvcnRzXG4gKi9cbmltcG9ydCB7IGZldGNoLCByZXNvbHZlU2VsZWN0IH0gZnJvbSAnLi4vLi4vYmFzZS1jb250cm9scyc7XG5pbXBvcnQgeyByZWNlaXZlRW50aXR5UmVjb3JkcyB9IGZyb20gJy4vLi4vYWN0aW9ucyc7XG5pbXBvcnQgeyBSRURVQ0VSX0tFWSBhcyBTQ0hFTUFfUkVEVUNFUl9LRVkgfSBmcm9tICcuLi8uLi9zY2hlbWEvY29uc3RhbnRzJztcblxuLyoqXG4gKiBBIHJlc29sdmVyIGZvciBnZXR0aW5nIGFuIGVudGl0eSBmb3IgdGhlIGdpdmVuIG1vZGVsIG5hbWUgYW5kIGVudGl0eSBpZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gZW50aXR5SWRcbiAqIEByZXR1cm4ge251bGx8QmFzZUVudGl0eX0gSWYgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZCwgdGhlIGVudGl0eSxcbiAqIG90aGVyd2lzZSBudWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24qIGdldEVudGl0eUJ5SWQoIG1vZGVsTmFtZSwgZW50aXR5SWQgKSB7XG5cdGNvbnN0IGVudGl0eSA9IHlpZWxkIGZldGNoKCB7XG5cdFx0cGF0aDogZ2V0RW5kcG9pbnQoIG1vZGVsTmFtZSApICsgJy8nICsgZW50aXR5SWQsXG5cdH0gKTtcblx0Y29uc3QgZmFjdG9yeSA9IHlpZWxkIHJlc29sdmVTZWxlY3QoXG5cdFx0U0NIRU1BX1JFRFVDRVJfS0VZLFxuXHRcdCdnZXRGYWN0b3J5Rm9yTW9kZWwnLFxuXHRcdG1vZGVsTmFtZVxuXHQpO1xuXHRpZiAoICEgaXNNb2RlbEVudGl0eUZhY3RvcnlPZk1vZGVsKCBmYWN0b3J5LCBtb2RlbE5hbWUgKSApIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHRjb25zdCBmdWxsRW50aXR5ID0gZmFjdG9yeS5mcm9tRXhpc3RpbmcoIGVudGl0eSApO1xuXHR5aWVsZCByZWNlaXZlRW50aXR5UmVjb3JkcyggbW9kZWxOYW1lLCBbIGZ1bGxFbnRpdHkgXSApO1xuXHRyZXR1cm4gZnVsbEVudGl0eTtcbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vZW50aXRpZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9yZWxhdGlvbnMnO1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7XG5cdGNyZWF0ZUFuZEtleUVudGl0aWVzQnlQcmltYXJ5S2V5VmFsdWUsXG5cdGtleUVudGl0aWVzQnlQcmltYXJ5S2V5VmFsdWUsXG5cdHBsdXJhbE1vZGVsTmFtZSxcblx0c2luZ3VsYXJNb2RlbE5hbWUsXG5cdHN0cmlwQmFzZVJvdXRlRnJvbVVybCxcblx0Z2V0UHJpbWFyeUtleVF1ZXJ5U3RyaW5nLFxuXHRnZXRQcmltYXJ5S2V5LFxuXHRnZXRFbmRwb2ludCxcbn0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vbW9kZWwnO1xuaW1wb3J0IHtcblx0aXNNb2RlbEVudGl0eUZhY3RvcnlPZk1vZGVsLFxuXHRpc01vZGVsRW50aXR5LFxufSBmcm9tICdAZXZlbnRlc3ByZXNzby92YWxpZGF0b3JzJztcbmltcG9ydCB7IEludmFsaWRNb2RlbEVudGl0eSB9IGZyb20gJ0BldmVudGVzcHJlc3NvL2VlanMnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnd2FybmluZyc7XG5pbXBvcnQgeyBpc0VtcHR5LCBzdGFydENhc2UsIGlzVW5kZWZpbmVkLCBpc0FycmF5IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IE1hcCBhcyBJbW11dGFibGVNYXAgfSBmcm9tICdpbW11dGFibGUnO1xuXG4vKipcbiAqIEludGVybmFsIEltcG9ydHNcbiAqL1xuaW1wb3J0IHtcblx0ZmV0Y2gsXG5cdGRpc3BhdGNoLFxuXHRzZWxlY3QsXG5cdHJlc29sdmVTZWxlY3QsXG5cdHJlc29sdmVHZXRFbnRpdHlCeUlkRm9ySWRzLFxuXHRyZXNvbHZlR2V0UmVsYXRlZEVudGl0aWVzLFxufSBmcm9tICcuLi8uLi9iYXNlLWNvbnRyb2xzJztcbmltcG9ydCB7XG5cdHJlY2VpdmVFbnRpdHlSZWNvcmRzLFxuXHRyZWNlaXZlUmVsYXRlZEVudGl0aWVzLFxufSBmcm9tICcuLy4uL2FjdGlvbnMnO1xuaW1wb3J0IHsga2VlcEV4aXN0aW5nRW50aXRpZXNJbk9iamVjdCB9IGZyb20gJy4uLy4uL2Jhc2UtbW9kZWwnO1xuaW1wb3J0IHsgUkVEVUNFUl9LRVkgYXMgQ09SRV9SRURVQ0VSX0tFWSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBSRURVQ0VSX0tFWSBhcyBTQ0hFTUFfUkVEVUNFUl9LRVkgfSBmcm9tICcuLi8uLi9zY2hlbWEvY29uc3RhbnRzJztcblxuY29uc3QgREVGQVVMVF9FTVBUWV9BUlJBWSA9IFtdO1xuXG4vKipcbiAqIEEgcmVzb2x2ZXIgZm9yIGdldHRpbmcgcmVsYXRpb24gZW50aXRpZXMgZm9yIHRoZSBnaXZlbiBtb2RlbCBuYW1lIGFuZCBlbnRpdHlcbiAqIGZvciB0aGF0IG1vZGVsLlxuICpcbiAqIEBwYXJhbSB7QmFzZUVudGl0eX0gZW50aXR5XG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25Nb2RlbE5hbWVcbiAqIEByZXR1cm4ge1tdfEFycmF5PEJhc2VFbnRpdHk+fSBJZiB0aGVyZSBhcmUgcmVsYXRpb25zLCByZXR1cm5zIGFuIGFycmF5IG9mXG4gKiBCYXNlRW50aXR5IGluc3RhbmNlcyBmb3IgdGhlIHJlbGF0aW9ucywgb3RoZXJ3aXNlIGFuIGVtcHR5IGFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24qIGdldFJlbGF0ZWRFbnRpdGllcyggZW50aXR5LCByZWxhdGlvbk1vZGVsTmFtZSApIHtcblx0aWYgKCAhIGlzTW9kZWxFbnRpdHkoIGVudGl0eSApICkge1xuXHRcdHRocm93IG5ldyBJbnZhbGlkTW9kZWxFbnRpdHkoICcnLCBlbnRpdHkgKTtcblx0fVxuXHRjb25zdCBtb2RlbE5hbWUgPSBlbnRpdHkubW9kZWxOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdGNvbnN0IHBsdXJhbFJlbGF0aW9uTmFtZSA9IHBsdXJhbE1vZGVsTmFtZSggcmVsYXRpb25Nb2RlbE5hbWUgKTtcblx0Y29uc3Qgc2luZ3VsYXJSZWxhdGlvbk5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggcmVsYXRpb25Nb2RlbE5hbWUgKTtcblx0Y29uc3QgcmVsYXRpb25SZXNvdXJjZVByb3BlcnR5ID0gcGx1cmFsUmVsYXRpb25OYW1lICsgJ1Jlc291cmNlJztcblx0Y29uc3QgcmVsYXRpb25FbmRwb2ludCA9IGVudGl0eVsgcmVsYXRpb25SZXNvdXJjZVByb3BlcnR5IF0gP1xuXHRcdHN0cmlwQmFzZVJvdXRlRnJvbVVybChcblx0XHRcdGVudGl0eVsgcmVsYXRpb25SZXNvdXJjZVByb3BlcnR5IF0ucmVzb3VyY2VMaW5rXG5cdFx0KSA6XG5cdFx0Jyc7XG5cdGlmICggcmVsYXRpb25FbmRwb2ludCA9PT0gJycgKSB7XG5cdFx0d2FybmluZyhcblx0XHRcdGZhbHNlLFxuXHRcdFx0J1RoZXJlIGlzIG5vIHJlbGF0aW9uIHJlc291cmNlIGZvciB0aGUgZ2l2ZW4gbW9kZWwgKCVzKSBhbmQgcmVxdWVzdGVkIHJlbGF0aW9uICglcyknLFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0cGx1cmFsUmVsYXRpb25OYW1lXG5cdFx0KTtcblx0XHRyZXR1cm4gREVGQVVMVF9FTVBUWV9BUlJBWTtcblx0fVxuXHR5aWVsZCBkaXNwYXRjaChcblx0XHRTQ0hFTUFfUkVEVUNFUl9LRVksXG5cdFx0J3JlY2VpdmVSZWxhdGlvbkVuZHBvaW50Rm9yTW9kZWxFbnRpdHknLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHkuaWQsXG5cdFx0cGx1cmFsUmVsYXRpb25OYW1lLFxuXHRcdHJlbGF0aW9uRW5kcG9pbnRcblx0KTtcblx0eWllbGQgZGlzcGF0Y2goXG5cdFx0J2NvcmUvZGF0YScsXG5cdFx0J2ZpbmlzaFJlc29sdXRpb24nLFxuXHRcdFNDSEVNQV9SRURVQ0VSX0tFWSxcblx0XHQncmVjZWl2ZVJlbGF0aW9uRW5kcG9pbnRGb3JNb2RlbEVudGl0eScsXG5cdFx0WyBtb2RlbE5hbWUsIGVudGl0eS5pZCwgcGx1cmFsUmVsYXRpb25OYW1lLCByZWxhdGlvbkVuZHBvaW50IF1cblx0KTtcblx0Y29uc3QgcmVsYXRpb25FbnRpdGllcyA9IHlpZWxkIGZldGNoKCB7XG5cdFx0cGF0aDogcmVsYXRpb25FbmRwb2ludCxcblx0fSApO1xuXHRpZiAoICEgcmVsYXRpb25FbnRpdGllcy5sZW5ndGggKSB7XG5cdFx0cmV0dXJuIERFRkFVTFRfRU1QVFlfQVJSQVk7XG5cdH1cblxuXHRjb25zdCBmYWN0b3J5ID0geWllbGQgcmVzb2x2ZVNlbGVjdChcblx0XHRTQ0hFTUFfUkVEVUNFUl9LRVksXG5cdFx0J2dldEZhY3RvcnlGb3JNb2RlbCcsXG5cdFx0c2luZ3VsYXJSZWxhdGlvbk5hbWVcblx0KTtcblx0aWYgKCAhIGlzTW9kZWxFbnRpdHlGYWN0b3J5T2ZNb2RlbChcblx0XHRmYWN0b3J5LFxuXHRcdHNpbmd1bGFyUmVsYXRpb25OYW1lXG5cdCkgKSB7XG5cdFx0cmV0dXJuIERFRkFVTFRfRU1QVFlfQVJSQVk7XG5cdH1cblxuXHRsZXQgZnVsbEVudGl0aWVzID0ga2V5RW50aXRpZXNCeVByaW1hcnlLZXlWYWx1ZShcblx0XHRzaW5ndWxhclJlbGF0aW9uTmFtZSxcblx0XHRyZWxhdGlvbkVudGl0aWVzXG5cdCk7XG5cdGZ1bGxFbnRpdGllcyA9IGNyZWF0ZUFuZEtleUVudGl0aWVzQnlQcmltYXJ5S2V5VmFsdWUoXG5cdFx0ZmFjdG9yeSxcblx0XHRmdWxsRW50aXRpZXMsXG5cdCk7XG5cdGNvbnN0IGVudGl0eUlkcyA9IEFycmF5LmZyb20oIGZ1bGxFbnRpdGllcy5rZXlzKCkgKTtcblxuXHQvLyBhcmUgdGhlcmUgYWxyZWFkeSBlbnRpdGllcyBmb3IgdGhlIGlkcyBpbiB0aGUgc3RvcmU/IElmIHNvLi4ud2UgdXNlXG5cdC8vIHRob3NlLlxuXHRjb25zdCBleGlzdGluZ0VudGl0aWVzID0geWllbGQgc2VsZWN0KFxuXHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0J2dldEVudGl0aWVzQnlJZHMnLFxuXHRcdHNpbmd1bGFyUmVsYXRpb25OYW1lLFxuXHRcdGVudGl0eUlkc1xuXHQpO1xuXG5cdGlmICggISBpc0VtcHR5KCBleGlzdGluZ0VudGl0aWVzICkgKSB7XG5cdFx0ZnVsbEVudGl0aWVzID0ga2VlcEV4aXN0aW5nRW50aXRpZXNJbk9iamVjdChcblx0XHRcdGV4aXN0aW5nRW50aXRpZXMubWFwKFxuXHRcdFx0XHQoIGVudGl0aWVzT2JqZWN0LCBlbnRpdHlPYmogKSA9PlxuXHRcdFx0XHRcdGVudGl0aWVzT2JqZWN0WyBlbnRpdHlPYmouaWQgXSA9IGVudGl0eSxcblx0XHRcdFx0e31cblx0XHRcdCksXG5cdFx0XHRmdWxsRW50aXRpZXMsXG5cdFx0KTtcblx0fVxuXG5cdC8vIGlmIGZ1bGxFbnRpdGllcyBpcyBub3QgYSBtYXAsIHRoZW4gd2UgbmVlZCB0byBtYWtlIGl0IGEgbWFwXG5cdGNvbnN0IGVudGl0eUFycmF5ID0gZnVsbEVudGl0aWVzIGluc3RhbmNlb2YgTWFwID9cblx0XHRBcnJheS5mcm9tKCBmdWxsRW50aXRpZXMudmFsdWVzKCkgKSA6XG5cdFx0ZnVsbEVudGl0aWVzO1xuXG5cdHlpZWxkIHJlY2VpdmVFbnRpdHlSZWNvcmRzKFxuXHRcdHNpbmd1bGFyUmVsYXRpb25OYW1lLFxuXHRcdGVudGl0eUFycmF5XG5cdCk7XG5cdHlpZWxkIHJlY2VpdmVSZWxhdGVkRW50aXRpZXMoXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eS5pZCxcblx0XHRwbHVyYWxSZWxhdGlvbk5hbWUsXG5cdFx0ZW50aXR5SWRzLFxuXHQpO1xuXHR5aWVsZCByZXNvbHZlR2V0UmVsYXRlZEVudGl0aWVzKFxuXHRcdGVudGl0eSxcblx0XHRmdWxsRW50aXRpZXMsXG5cdFx0ZW50aXR5SWRzLFxuXHQpO1xuXHR5aWVsZCByZXNvbHZlR2V0RW50aXR5QnlJZEZvcklkcyhcblx0XHRzaW5ndWxhclJlbGF0aW9uTmFtZSxcblx0XHRlbnRpdHlJZHNcblx0KTtcblx0cmV0dXJuIGVudGl0eUFycmF5O1xufVxuXG4vKipcbiAqIFJlc29sdmVyIGZvciB0aGUgZ2V0UmVsYXRlZEVudGl0aWVzRm9ySWRzIHNlbGVjdG9yXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBlbnRpdHlJZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbk5hbWVcbiAqXG4gKiBAcmV0dXJuIHt1bmRlZmluZWR8QXJyYXl9IElmIHRoZXJlIGlzIG5vIHNjaGVtYSBmb3IgdGhlIHJlbGF0aW9uLCBhblxuICogZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiogZ2V0UmVsYXRlZEVudGl0aWVzRm9ySWRzKFxuXHRtb2RlbE5hbWUsXG5cdGVudGl0eUlkcyxcblx0cmVsYXRpb25OYW1lXG4pIHtcblx0bGV0IHBhdGgsIHJlc3BvbnNlLCByZWNvcmRzO1xuXHRjb25zdCBoYXNKb2luVGFibGUgPSB5aWVsZCByZXNvbHZlU2VsZWN0KFxuXHRcdFNDSEVNQV9SRURVQ0VSX0tFWSxcblx0XHQnaGFzSm9pblRhYmxlUmVsYXRpb24nLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRyZWxhdGlvbk5hbWUsXG5cdCk7XG5cdGNvbnN0IHJlbGF0aW9uU2NoZW1hID0geWllbGQgcmVzb2x2ZVNlbGVjdChcblx0XHRTQ0hFTUFfUkVEVUNFUl9LRVksXG5cdFx0J2dldFJlbGF0aW9uU2NoZW1hJyxcblx0XHRtb2RlbE5hbWUsXG5cdFx0cmVsYXRpb25OYW1lLFxuXHQpO1xuXHRjb25zdCByZWxhdGlvblByaW1hcnlLZXkgPSBnZXRQcmltYXJ5S2V5KFxuXHRcdHNpbmd1bGFyTW9kZWxOYW1lKCByZWxhdGlvbk5hbWUgKVxuXHQpO1xuXHRjb25zdCBtb2RlbFByaW1hcnlLZXkgPSBnZXRQcmltYXJ5S2V5KCBzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lICkgKTtcblx0Y29uc3Qgc2luZ3VsYXJSZWxhdGlvbk5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggcmVsYXRpb25OYW1lICk7XG5cdGNvbnN0IHBsdXJhbFJlbGF0aW9uTmFtZSA9IHBsdXJhbE1vZGVsTmFtZSggcmVsYXRpb25OYW1lICk7XG5cdGlmICggcmVsYXRpb25TY2hlbWEgPT09IG51bGwgKSB7XG5cdFx0cmV0dXJuIERFRkFVTFRfRU1QVFlfQVJSQVk7XG5cdH1cblx0Y29uc3QgZmFjdG9yeSA9IHlpZWxkIHJlc29sdmVTZWxlY3QoXG5cdFx0U0NIRU1BX1JFRFVDRVJfS0VZLFxuXHRcdCdnZXRGYWN0b3J5Rm9yTW9kZWwnLFxuXHRcdHNpbmd1bGFyUmVsYXRpb25OYW1lXG5cdCk7XG5cdGxldCBoYXNTZXRNYXAgPSBJbW11dGFibGVNYXAoKTtcblx0aWYgKCBoYXNKb2luVGFibGUgKSB7XG5cdFx0Ly8gcHJlcGFyZSBhIGZldGNoIHVzaW5nIHRoZSBqb2luIHRhYmxlIHdpdGggcmVsYXRpb25zIGluIHRoZSByZXNwb25zZS5cblx0XHRwYXRoID0gZ2V0RW5kcG9pbnQoXG5cdFx0XHRzaW5ndWxhck1vZGVsTmFtZSggcmVsYXRpb25TY2hlbWEuam9pbmluZ19tb2RlbF9uYW1lICkudG9Mb3dlckNhc2UoKVxuXHRcdCk7XG5cdFx0cGF0aCArPSAnLz93aGVyZScgKyBnZXRQcmltYXJ5S2V5UXVlcnlTdHJpbmcoXG5cdFx0XHRzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lICksXG5cdFx0XHRlbnRpdHlJZHNcblx0XHQpO1xuXHRcdHBhdGggKz0gJyZpbmNsdWRlPScgKyBnZXRNb2RlbE5hbWVGb3JSZXF1ZXN0KCByZWxhdGlvbk5hbWUgKSArICcuKic7XG5cdFx0cmVzcG9uc2UgPSB5aWVsZCBmZXRjaCggeyBwYXRoIH0gKTtcblx0XHRpZiAoICEgcmVzcG9uc2UubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRyZWNvcmRzID0gWyAuLi5yZXNwb25zZSBdO1xuXHRcdHdoaWxlICggcmVjb3Jkcy5sZW5ndGggPiAwICkge1xuXHRcdFx0Y29uc3QgcmVjb3JkID0gcmVjb3Jkcy5wb3AoKTtcblx0XHRcdGxldCByZWxhdGlvblJlY29yZHMgPSByZWNvcmRbIHBsdXJhbFJlbGF0aW9uTmFtZSBdIHx8IG51bGw7XG5cdFx0XHRyZWxhdGlvblJlY29yZHMgPSByZWxhdGlvblJlY29yZHMgPT09IG51bGwgJiZcblx0XHRcdCEgaXNVbmRlZmluZWQoIHJlY29yZFsgc2luZ3VsYXJSZWxhdGlvbk5hbWUgXSApID9cblx0XHRcdFx0cmVjb3JkWyBzaW5ndWxhclJlbGF0aW9uTmFtZSBdIDpcblx0XHRcdFx0cmVsYXRpb25SZWNvcmRzO1xuXHRcdFx0cmVsYXRpb25SZWNvcmRzID0gcmVsYXRpb25SZWNvcmRzICE9PSBudWxsICYmXG5cdFx0XHRcdCEgaXNBcnJheSggcmVsYXRpb25SZWNvcmRzICkgP1xuXHRcdFx0XHRbIHJlbGF0aW9uUmVjb3JkcyBdIDpcblx0XHRcdFx0cmVsYXRpb25SZWNvcmRzO1xuXHRcdFx0aWYgKCByZWxhdGlvblJlY29yZHMgIT09IG51bGwgKSB7XG5cdFx0XHRcdHdoaWxlICggcmVsYXRpb25SZWNvcmRzLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRcdFx0Y29uc3QgbW9kZWxJZCA9IHJlY29yZFsgbW9kZWxQcmltYXJ5S2V5IF07XG5cdFx0XHRcdFx0Y29uc3QgcmVsYXRpb25JZCA9IHJlY29yZFsgcmVsYXRpb25QcmltYXJ5S2V5IF07XG5cdFx0XHRcdFx0Y29uc3QgcmVsYXRpb25SZWNvcmQgPSByZWxhdGlvblJlY29yZHMucG9wKCk7XG5cdFx0XHRcdFx0aWYgKCByZWxhdGlvblJlY29yZCAhPT0gbnVsbCAmJlxuXHRcdFx0XHRcdFx0ISBoYXNTZXRNYXAuaGFzSW4oIFsgbW9kZWxJZCwgcmVsYXRpb25JZCBdIClcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHJlbGF0aW9uRW50aXR5ID0gZmFjdG9yeS5mcm9tRXhpc3RpbmcoXG5cdFx0XHRcdFx0XHRcdHJlbGF0aW9uUmVjb3JkICk7XG5cdFx0XHRcdFx0XHR5aWVsZCBkaXNwYXRjaChcblx0XHRcdFx0XHRcdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHRcdFx0XHRcdFx0J3Jlc29sdmVSZWxhdGlvblJlY29yZEZvclJlbGF0aW9uJyxcblx0XHRcdFx0XHRcdFx0cmVsYXRpb25FbnRpdHksXG5cdFx0XHRcdFx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdFx0XHRcdFx0bW9kZWxJZCxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRoYXNTZXRNYXAgPSBoYXNTZXRNYXAuc2V0SW4oXG5cdFx0XHRcdFx0XHRcdFsgbW9kZWxJZCwgcmVsYXRpb25JZCBdLFxuXHRcdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRwYXRoID0gZ2V0RW5kcG9pbnQoIHNpbmd1bGFyUmVsYXRpb25OYW1lICkgK1xuXHRcdFx0Jy8/d2hlcmUnICsgZ2V0UHJpbWFyeUtleVF1ZXJ5U3RyaW5nKCBtb2RlbE5hbWUsIGVudGl0eUlkcyApO1xuXHRcdHJlc3BvbnNlID0geWllbGQgZmV0Y2goIHsgcGF0aCB9ICk7XG5cdFx0aWYgKCAhIHJlc3BvbnNlLmxlbmd0aCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0cmVjb3JkcyA9IFsgLi4ucmVzcG9uc2UgXTtcblx0XHR3aGlsZSAoIHJlY29yZHMubGVuZ3RoID4gMCApIHtcblx0XHRcdGNvbnN0IHJlY29yZCA9IHJlY29yZHMucG9wKCk7XG5cdFx0XHRjb25zdCBtb2RlbElkID0gcmVjb3JkWyBtb2RlbFByaW1hcnlLZXkgXTtcblx0XHRcdGNvbnN0IHJlbGF0aW9uSWQgPSByZWNvcmRbIHJlbGF0aW9uUHJpbWFyeUtleSBdO1xuXHRcdFx0aWYgKCAhIGhhc1NldE1hcC5oYXNJbiggWyBtb2RlbElkLCByZWxhdGlvbklkIF0gKSApIHtcblx0XHRcdFx0Y29uc3QgcmVsYXRpb25FbnRpdHkgPSBmYWN0b3J5LmZyb21FeGlzdGluZyggcmVjb3JkICk7XG5cdFx0XHRcdHlpZWxkIGRpc3BhdGNoKFxuXHRcdFx0XHRcdENPUkVfUkVEVUNFUl9LRVksXG5cdFx0XHRcdFx0J3Jlc29sdmVSZWxhdGlvblJlY29yZEZvclJlbGF0aW9uJyxcblx0XHRcdFx0XHRyZWxhdGlvbkVudGl0eSxcblx0XHRcdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRcdFx0bW9kZWxJZCxcblx0XHRcdFx0KTtcblx0XHRcdFx0aGFzU2V0TWFwID0gaGFzU2V0TWFwLnNldEluKFxuXHRcdFx0XHRcdFsgbW9kZWxJZCwgcmVsYXRpb25JZCBdLFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuY29uc3QgZ2V0TW9kZWxOYW1lRm9yUmVxdWVzdCA9ICggbW9kZWxOYW1lICkgPT4ge1xuXHRtb2RlbE5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lICk7XG5cdG1vZGVsTmFtZSA9IG1vZGVsTmFtZS5yZXBsYWNlKCAnXycsICcgJyApO1xuXHRtb2RlbE5hbWUgPSBzdGFydENhc2UoIG1vZGVsTmFtZSApO1xuXHRyZXR1cm4gbW9kZWxOYW1lLnJlcGxhY2UoICcgJywgJ18nICk7XG59O1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCBjcmVhdGVTZWxlY3RvciBmcm9tICdyZW1lbW8nO1xuaW1wb3J0IHsgbm9ybWFsaXplRW50aXR5SWQgfSBmcm9tICdAZXZlbnRlc3ByZXNzby9oZWxwZXJzJztcbmltcG9ydCB7IHNpbmd1bGFyTW9kZWxOYW1lIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vbW9kZWwnO1xuXG4vKipcbiAqIFJldHVybnMgYWxsIGVudGl0eSByZWNvcmRzIGZvciB0aGUgZ2l2ZW4gbW9kZWxOYW1lIGluIHRoZSBjdXJyZW50IHN0YXRlLlxuICogQW4gZW50aXR5IHJlY29yZCBpcyB0aGUgTWFwIG9mIGVudGl0aWVzIChlbnRpdHlJZCA9PiBlbnRpdHkpLlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcmV0dXJuIHtPYmplY3Q8bnVtYmVyfHN0cmluZywgQmFzZUVudGl0eT59fG51bGx9IEEgY29sbGVjdGlvbiBvZiBlbnRpdHlcbiAqIHJlY29yZHMgZm9yIHRoZSBnaXZlbiBtb2RlbCBpbmRleGVkIGJ5IHByaW1hcnkga2V5IHZhbHVlIG9yIG51bGwgaWYgbm9uZVxuICogaGF2ZSBiZWVuIHNldCBpbiB0aGUgc3RhdGUuXG4gKi9cbmNvbnN0IGdldEVudGl0eVJlY29yZHNGb3JNb2RlbCA9IGNyZWF0ZVNlbGVjdG9yKFxuXHQoIHN0YXRlLCBtb2RlbE5hbWUgKSA9PiB7XG5cdFx0bW9kZWxOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRcdHJldHVybiBzdGF0ZS5lbnRpdGllcy5oYXMoIG1vZGVsTmFtZSApID9cblx0XHRcdHN0YXRlLmVudGl0aWVzLmdldCggbW9kZWxOYW1lICkudG9KUygpIDpcblx0XHRcdG51bGw7XG5cdH0sXG5cdCggc3RhdGUsIG1vZGVsTmFtZSApID0+IFsgc3RhdGUuZW50aXRpZXMuZ2V0KCBtb2RlbE5hbWUgKSBdXG4pO1xuXG4vKipcbiAqIFJldHVybnMgYWxsIGVudGl0aWVzIGZvciB0aGUgZ2l2ZW4gbW9kZWwuXG4gKiBUaGlzIGRpZmZlcnMgZnJvbSBlbnRpdHlSZWNvcmRzLCBpbiB0aGF0IHRoZSBlbnRpdGllcyBhcmUgTk9UIGluZGV4ZWQgYnlcbiAqIHByaW1hcnkga2V5IHZhbHVlIGFuZCBhbiBBcnJheSBvZiBlbnRpdGllcyBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEByZXR1cm4ge0FycmF5PEJhc2VFbnRpdHk+fG51bGx9IEFuIGFycmF5IG9mIGVudGl0aWVzIGZvciB0aGUgZ2l2ZW4gbW9kZWwgb3JcbiAqIG51bGwgaWYgbm9uZSBoYXZlIGJlZW4gc2V0IGluIHRoZSBzdGF0ZS5cbiAqL1xuY29uc3QgZ2V0RW50aXRpZXNGb3JNb2RlbCA9IGNyZWF0ZVNlbGVjdG9yKFxuXHQoIHN0YXRlLCBtb2RlbE5hbWUgKSA9PiB7XG5cdFx0bW9kZWxOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRcdHJldHVybiBzdGF0ZS5lbnRpdGllcy5oYXMoIG1vZGVsTmFtZSApID9cblx0XHRcdHN0YXRlLmVudGl0aWVzLmdldCggbW9kZWxOYW1lICkudmFsdWVTZXEoKS50b0FycmF5KCkgOlxuXHRcdFx0W107XG5cdH0sXG5cdCggc3RhdGUsIG1vZGVsTmFtZSApID0+IFsgc3RhdGUuZW50aXRpZXMuZ2V0KCBtb2RlbE5hbWUgKSBdLFxuKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtb2RlbCBlbnRpdHkgZm9yIHRoZSBnaXZlbiBtb2RlbCBhbmQgaWQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IGVudGl0eUlkXG4gKiBAcmV0dXJuIHtCYXNlRW50aXR5fG51bGx9IFJldHVybnMgdGhlIG1vZGVsIGVudGl0eSBvciBudWxsLlxuICovXG5mdW5jdGlvbiBnZXRFbnRpdHlCeUlkKCBzdGF0ZSwgbW9kZWxOYW1lLCBlbnRpdHlJZCApIHtcblx0bW9kZWxOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRyZXR1cm4gc3RhdGUuZW50aXRpZXMuZ2V0SW4oIFtcblx0XHRtb2RlbE5hbWUsXG5cdFx0bm9ybWFsaXplRW50aXR5SWQoIGVudGl0eUlkICksXG5cdF0gKSB8fCBudWxsO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhbiBhcnJheSBvZiBtb2RlbCBlbnRpdGllcyBmb3IgdGhlIHByb3ZpZGVkIGFycmF5IG9mIGlkcyBhbmQgbW9kZWwuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZ3xudW1iZXI+fSBlbnRpdHlJZHNcbiAqIEByZXR1cm4ge0FycmF5PEJhc2VFbnRpdHk+fG51bGx9IFJldHVybnMgYW4gYXJyYXkgb2YgbW9kZWwgZW50aXRpZXMgZm9yIHRoZVxuICogcHJvdmlkZWQgaWRzIG9yIG51bGwgaWYgbmV2ZXIgYmVlbiBzZXQuXG4gKi9cbmNvbnN0IGdldEVudGl0aWVzQnlJZHMgPSAoIHN0YXRlLCBtb2RlbE5hbWUsIGVudGl0eUlkcyApID0+IHtcblx0cmV0dXJuIHJldHJpZXZlRW50aXRpZXNCeUlkcyggc3RhdGUsIG1vZGVsTmFtZSwgZW50aXR5SWRzLmpvaW4oKSApO1xufTtcblxuZ2V0RW50aXRpZXNCeUlkcy5jbGVhciA9ICgpID0+IHJldHJpZXZlRW50aXRpZXNCeUlkcy5jbGVhcigpO1xuZ2V0RW50aXRpZXNCeUlkcy5nZXREZXBlbmRhbnRzID0gKCBzdGF0ZSwgbW9kZWxOYW1lICkgPT4gcmV0cmlldmVFbnRpdGllc0J5SWRzXG5cdC5nZXREZXBlbmRhbnRzKCBzdGF0ZSwgbW9kZWxOYW1lICk7XG5cbi8qKlxuICogUmV0cmlldmVzIGFuIGFycmF5IG9mIG1vZGVsIGVudGl0aWVzIGZvciB0aGUgcHJvdmlkZWQgYXJyYXkgb2YgaWRzIGFuZCBtb2RlbC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbnRpdHlJZHMgIEEgY29tbWEgZGVsaW1pdGVkIHN0cmluZyBvZiBpZHMuICBUaGlzIGlzIHNvXG4gKiB3ZSBhcmUgcGFzc2luZyBhIHByaW1pdGl2ZSBhcmcgdG8gcmVtZW1vIGZvciBiZXR0ZXIgY2FjaGUgdmFsaWRhdGlvbi5cbiAqIEByZXR1cm4ge0FycmF5PEJhc2VFbnRpdHk+fG51bGx9IFJldHVybnMgYW4gYXJyYXkgb2YgbW9kZWwgZW50aXRpZXMgZm9yIHRoZVxuICogcHJvdmlkZWQgaWRzIG9yIG51bGwgaWYgbmV2ZXIgYmVlbiBzZXQuXG4gKi9cbmNvbnN0IHJldHJpZXZlRW50aXRpZXNCeUlkcyA9IGNyZWF0ZVNlbGVjdG9yKFxuXHQoIHN0YXRlLCBtb2RlbE5hbWUsIGVudGl0eUlkcyApID0+IHtcblx0XHRtb2RlbE5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lICk7XG5cdFx0ZW50aXR5SWRzID0gZW50aXR5SWRzLnNwbGl0KCAnLCcgKTtcblx0XHRjb25zdCBlbnRpdGllcyA9IFtdO1xuXHRcdGlmICggc3RhdGUuZW50aXRpZXMuaGFzKCBtb2RlbE5hbWUgKSApIHtcblx0XHRcdGVudGl0eUlkcy5mb3JFYWNoKCAoIGVudGl0eUlkICkgPT4ge1xuXHRcdFx0XHRjb25zdCBlbnRpdHkgPSBnZXRFbnRpdHlCeUlkKCBzdGF0ZSwgbW9kZWxOYW1lLCBlbnRpdHlJZCApO1xuXHRcdFx0XHRpZiAoIGVudGl0eSAhPT0gbnVsbCApIHtcblx0XHRcdFx0XHRlbnRpdGllcy5wdXNoKCBlbnRpdHkgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH1cblx0XHRyZXR1cm4gZW50aXRpZXM7XG5cdH0sXG5cdCggc3RhdGUsIG1vZGVsTmFtZSApID0+IFsgc3RhdGUuZW50aXRpZXMuZ2V0KCBtb2RlbE5hbWUgKSBdXG4pO1xuXG4vKipcbiAqIFJldHJpZXZlcyBhbiBhcnJheSBvZiBlbnRpdHkgaWRzIHF1ZXVlZCBmb3IgdHJhc2ggZm9yIHRoZSBnaXZlbiBtb2RlbC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEByZXR1cm4ge0FycmF5PG51bWJlcj59IEFuIGFycmF5IG9mIGVudGl0eSBpZHMuXG4gKi9cbmNvbnN0IGdldEVudGl0eUlkc1F1ZXVlZEZvclRyYXNoID0gY3JlYXRlU2VsZWN0b3IoXG5cdCggc3RhdGUsIG1vZGVsTmFtZSApID0+IHtcblx0XHRtb2RlbE5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lICk7XG5cdFx0cmV0dXJuIHN0YXRlLmRpcnR5LnRyYXNoLmhhcyggbW9kZWxOYW1lICkgP1xuXHRcdFx0c3RhdGUuZGlydHkudHJhc2guZ2V0KCBtb2RlbE5hbWUgKS50b0FycmF5KCkgOlxuXHRcdFx0W107XG5cdH0sXG5cdCggc3RhdGUsIG1vZGVsTmFtZSApID0+IFsgc3RhdGUuZGlydHkudHJhc2guZ2V0KCBtb2RlbE5hbWUgKSBdXG4pO1xuXG4vKipcbiAqIFJldHJpZXZlcyBhbiBhcnJheSBvZiBlbnRpdHkgaWRzIHF1ZXVlZCBmb3IgZGVsZXRlIGZvciB0aGUgZ2l2ZW4gbW9kZWwuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcmV0dXJuIHtBcnJheTxudW1iZXJ8c3RyaW5nPn0gQW4gYXJyYXkgb2YgZW50aXR5IGlkcy5cbiAqL1xuY29uc3QgZ2V0RW50aXR5SWRzUXVldWVkRm9yRGVsZXRlID0gY3JlYXRlU2VsZWN0b3IoXG5cdCggc3RhdGUsIG1vZGVsTmFtZSApID0+IHtcblx0XHRtb2RlbE5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lICk7XG5cdFx0cmV0dXJuIHN0YXRlLmRpcnR5LmRlbGV0ZS5oYXMoIG1vZGVsTmFtZSApID9cblx0XHRcdHN0YXRlLmRpcnR5LmRlbGV0ZS5nZXQoIG1vZGVsTmFtZSApLnRvQXJyYXkoKSA6XG5cdFx0XHRbXTtcblx0fSxcblx0KCBzdGF0ZSwgbW9kZWxOYW1lICkgPT4gWyBzdGF0ZS5kaXJ0eS5kZWxldGUuZ2V0KCBtb2RlbE5hbWUgKSBdXG4pO1xuXG4vKipcbiAqIFJldHJpZXZlcyBhbGwgdGhlIG1vZGVscyBjdXJyZW50bHkgaGF2aW5nIGlkcyBxdWV1ZWQgZm9yIHRyYXNoXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcmV0dXJuIHtBcnJheTxzdHJpbmc+fSBBbiBhcnJheSBvZiBtb2RlbCBuYW1lcy5cbiAqL1xuY29uc3QgZ2V0TW9kZWxzUXVldWVkRm9yVHJhc2ggPSBjcmVhdGVTZWxlY3Rvcihcblx0KCBzdGF0ZSApID0+IHtcblx0XHRyZXR1cm4gc3RhdGUuZGlydHkudHJhc2gua2V5U2VxKCkudG9BcnJheSgpO1xuXHR9LFxuXHQoIHN0YXRlICkgPT4gWyBzdGF0ZS5kaXJ0eS50cmFzaCBdXG4pO1xuXG4vKipcbiAqIFJldHJpZXZlcyBhbGwgdGhlIG1vZGVscyBjdXJyZW50bHkgaGF2aW5nIGlkcyBxdWV1ZWQgZm9yIGRlbGV0ZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEByZXR1cm4ge0FycmF5PHN0cmluZz59IEFuIGFycmF5IG9mIG1vZGVsIG5hbWVzLlxuICovXG5jb25zdCBnZXRNb2RlbHNRdWV1ZWRGb3JEZWxldGUgPSBjcmVhdGVTZWxlY3Rvcihcblx0KCBzdGF0ZSApID0+IHtcblx0XHRyZXR1cm4gc3RhdGUuZGlydHkuZGVsZXRlLmtleVNlcSgpLnRvQXJyYXkoKTtcblx0fSxcblx0KCBzdGF0ZSApID0+IFsgc3RhdGUuZGlydHkuZGVsZXRlIF1cbik7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc3RhdGUuZW50aXRpZXMgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKlxuICogQHJldHVybiB7TWFwfSBUaGUgZW50aXRpZXMgc3RhdGUgaW1tdXRhYmxlIG1hcC5cbiAqL1xuY29uc3QgZ2V0QWxsRW50aXRpZXNJblN0YXRlID0gKCBzdGF0ZSApID0+IHN0YXRlLmVudGl0aWVzO1xuXG5leHBvcnQge1xuXHRnZXRFbnRpdHlSZWNvcmRzRm9yTW9kZWwsXG5cdGdldEVudGl0aWVzRm9yTW9kZWwsXG5cdGdldEVudGl0eUJ5SWQsXG5cdGdldEVudGl0aWVzQnlJZHMsXG5cdGdldEVudGl0eUlkc1F1ZXVlZEZvclRyYXNoLFxuXHRnZXRFbnRpdHlJZHNRdWV1ZWRGb3JEZWxldGUsXG5cdGdldE1vZGVsc1F1ZXVlZEZvckRlbGV0ZSxcblx0Z2V0TW9kZWxzUXVldWVkRm9yVHJhc2gsXG5cdGdldEFsbEVudGl0aWVzSW5TdGF0ZSxcbn07XG4iLCJleHBvcnQgKiBmcm9tICcuL2VudGl0aWVzJztcbmV4cG9ydCAqIGZyb20gJy4vcmVsYXRpb25zJztcbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBpc01vZGVsRW50aXR5IH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vdmFsaWRhdG9ycyc7XG5pbXBvcnQgeyBJbnZhbGlkTW9kZWxFbnRpdHkgfSBmcm9tICdAZXZlbnRlc3ByZXNzby9lZWpzJztcbmltcG9ydCB7XG5cdHBsdXJhbE1vZGVsTmFtZSxcblx0c2luZ3VsYXJNb2RlbE5hbWUsXG59IGZyb20gJ0BldmVudGVzcHJlc3NvL21vZGVsJztcbmltcG9ydCBjcmVhdGVTZWxlY3RvciBmcm9tICdyZW1lbW8nO1xuaW1wb3J0IHsgbm9ybWFsaXplRW50aXR5SWQgfSBmcm9tICdAZXZlbnRlc3ByZXNzby9oZWxwZXJzJztcbmltcG9ydCB7IE1hcCwgU2V0IH0gZnJvbSAnaW1tdXRhYmxlJztcblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7XG5cdGdldEVudGl0aWVzQnlJZHMsXG5cdGdldEVudGl0eUJ5SWQsXG59IGZyb20gJy4vZW50aXRpZXMnO1xuXG5jb25zdCBERUZBVUxUX0VNUFRZX1NFVCA9IFNldCgpO1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgcmVsYXRpb24gaWRzIGZvciB0aGUgZ2l2ZW4gZW50aXR5IGFuZCByZWxhdGlvbiBuYW1lIGZyb20gdGhlXG4gKiBzdGF0ZSBhbmQgY29uc2lkZXJzIGhvdyB0aGUgcmVsYXRpb24gbWlnaHQgYmUgc2F2ZWQgaW4gdGhlIHN0YXRlIChlaXRoZXIgYXNcbiAqIHJlbGF0aW9uIG1hcHBlZCB0byBtb2RlbCAoaW5kZXgpIG9yIG1vZGVsIG1hcHBlZCB0byByZWxhdGlvbiAoZW50aXR5TWFwKVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtIHtCYXNlRW50aXR5fSBlbnRpdHlcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbk5hbWVcbiAqIEByZXR1cm4ge0FycmF5fSBBbiBlbXB0eSBhcnJheSBpZiB0aGVyZSBhcmUgbm8gaWRzIGZvciB0aGUgZ2l2ZW4gcmVsYXRpb24uXG4gKi9cbmNvbnN0IGdldFJlbGF0aW9uSWRzRm9yRW50aXR5UmVsYXRpb24gPSBjcmVhdGVTZWxlY3Rvcihcblx0KCBzdGF0ZSwgZW50aXR5LCByZWxhdGlvbk5hbWUgKSA9PiB7XG5cdFx0aWYgKCAhIGlzTW9kZWxFbnRpdHkoIGVudGl0eSApICkge1xuXHRcdFx0dGhyb3cgbmV3IEludmFsaWRNb2RlbEVudGl0eSggJycsIGVudGl0eSApO1xuXHRcdH1cblx0XHRsZXQgbW9kZWxOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIGVudGl0eS5tb2RlbE5hbWUgKTtcblx0XHRyZWxhdGlvbk5hbWUgPSBwbHVyYWxNb2RlbE5hbWUoIHJlbGF0aW9uTmFtZSApO1xuXHRcdGlmICggc3RhdGUucmVsYXRpb25zLmhhc0luKCBbICdlbnRpdHlNYXAnLCBtb2RlbE5hbWUgXSApICkge1xuXHRcdFx0cmV0dXJuICggc3RhdGUucmVsYXRpb25zLmdldEluKFxuXHRcdFx0XHRbXG5cdFx0XHRcdFx0J2VudGl0eU1hcCcsXG5cdFx0XHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0XHRcdGVudGl0eS5pZCxcblx0XHRcdFx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0XHRcdF0sXG5cdFx0XHQpIHx8IFNldCgpICkudG9BcnJheSgpO1xuXHRcdH1cblx0XHRtb2RlbE5hbWUgPSBwbHVyYWxNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRcdHJlbGF0aW9uTmFtZSA9IHNpbmd1bGFyTW9kZWxOYW1lKCByZWxhdGlvbk5hbWUgKTtcblx0XHRpZiAoIHN0YXRlLnJlbGF0aW9ucy5oYXNJbiggWyAnaW5kZXgnLCBtb2RlbE5hbWUgXSApICkge1xuXHRcdFx0cmV0dXJuICggc3RhdGUucmVsYXRpb25zLmdldEluKFxuXHRcdFx0XHRbXG5cdFx0XHRcdFx0J2luZGV4Jyxcblx0XHRcdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRcdFx0ZW50aXR5LmlkLFxuXHRcdFx0XHRcdHJlbGF0aW9uTmFtZSxcblx0XHRcdFx0XVxuXHRcdFx0KSB8fCBTZXQoKSApLnRvQXJyYXkoKTtcblx0XHR9XG5cdFx0cmV0dXJuIFtdO1xuXHR9LFxuXHQoIHN0YXRlLCBlbnRpdHksIHJlbGF0aW9uTmFtZSApID0+IHtcblx0XHRpZiAoICEgaXNNb2RlbEVudGl0eSggZW50aXR5ICkgKSB7XG5cdFx0XHRyZXR1cm4gWyBERUZBVUxUX0VNUFRZX1NFVCBdO1xuXHRcdH1cblx0XHRjb25zdCBzaW5ndWxhck1vZGVsID0gc2luZ3VsYXJNb2RlbE5hbWUoIGVudGl0eS5tb2RlbE5hbWUgKSxcblx0XHRcdHBsdXJhbE1vZGVsID0gcGx1cmFsTW9kZWxOYW1lKCBzaW5ndWxhck1vZGVsICksXG5cdFx0XHRpZCA9IGVudGl0eS5pZCxcblx0XHRcdHNpbmd1bGFyUmVsYXRpb25OYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIHJlbGF0aW9uTmFtZSApLFxuXHRcdFx0cGx1cmFsUmVsYXRpb25OYW1lID0gcGx1cmFsTW9kZWxOYW1lKCBzaW5ndWxhclJlbGF0aW9uTmFtZSApO1xuXHRcdHJldHVybiBbXG5cdFx0XHRzdGF0ZS5yZWxhdGlvbnMuZ2V0SW4oIFtcblx0XHRcdFx0J2VudGl0eU1hcCcsXG5cdFx0XHRcdHNpbmd1bGFyTW9kZWwsXG5cdFx0XHRcdGlkLFxuXHRcdFx0XHRwbHVyYWxSZWxhdGlvbk5hbWUsXG5cdFx0XHRdICksXG5cdFx0XHRzdGF0ZS5yZWxhdGlvbnMuZ2V0SW4oIFtcblx0XHRcdFx0J2luZGV4Jyxcblx0XHRcdFx0cGx1cmFsTW9kZWwsXG5cdFx0XHRcdGlkLFxuXHRcdFx0XHRzaW5ndWxhclJlbGF0aW9uTmFtZSxcblx0XHRcdF0gKSxcblx0XHRdO1xuXHR9XG4pO1xuXG4vKipcbiAqIFJldHVybnMgYWxsIHRoZSByZWxhdGlvbiBlbnRpdGllcyBmb3IgdGhlIHJlbGF0aW9uIG9uIG1vZGVsIGVudGl0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7QmFzZUVudGl0eX0gZW50aXR5XG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25Nb2RlbE5hbWVcbiAqIEByZXR1cm4ge0FycmF5PEJhc2VFbnRpdHk+fSBBbiBhcnJheSBvZiBlbnRpdGllcyBmb3IgdGhlIHJlbGF0aW9uLlxuICovXG5jb25zdCBnZXRSZWxhdGVkRW50aXRpZXMgPSBjcmVhdGVTZWxlY3Rvcihcblx0KCBzdGF0ZSwgZW50aXR5LCByZWxhdGlvbk1vZGVsTmFtZSApID0+IHtcblx0XHRpZiAoICEgaXNNb2RlbEVudGl0eSggZW50aXR5ICkgKSB7XG5cdFx0XHR0aHJvdyBuZXcgSW52YWxpZE1vZGVsRW50aXR5KCAnJywgZW50aXR5ICk7XG5cdFx0fVxuXHRcdHJldHVybiBnZXRFbnRpdGllc0J5SWRzKFxuXHRcdFx0c3RhdGUsXG5cdFx0XHRzaW5ndWxhck1vZGVsTmFtZSggcmVsYXRpb25Nb2RlbE5hbWUgKSxcblx0XHRcdGdldFJlbGF0aW9uSWRzRm9yRW50aXR5UmVsYXRpb24oXG5cdFx0XHRcdHN0YXRlLFxuXHRcdFx0XHRlbnRpdHksXG5cdFx0XHRcdHJlbGF0aW9uTW9kZWxOYW1lXG5cdFx0XHQpXG5cdFx0KTtcblx0fSxcblx0KCBzdGF0ZSwgZW50aXR5LCByZWxhdGlvbk5hbWUgKSA9PiBbXG5cdFx0Li4uZ2V0RW50aXRpZXNCeUlkcy5nZXREZXBlbmRhbnRzKFxuXHRcdFx0c3RhdGUsXG5cdFx0XHRzaW5ndWxhck1vZGVsTmFtZSggcmVsYXRpb25OYW1lIClcblx0XHQpLFxuXHRcdC4uLmdldFJlbGF0aW9uSWRzRm9yRW50aXR5UmVsYXRpb24uZ2V0RGVwZW5kYW50cyhcblx0XHRcdHN0YXRlLFxuXHRcdFx0ZW50aXR5LFxuXHRcdFx0cmVsYXRpb25OYW1lXG5cdFx0KSxcblx0XVxuKTtcblxuLyoqXG4gKiBFZmZpY2llbnQgc2VsZWN0b3IgZm9yIGdldHRpbmcgYWxsIHRoZSByZWxhdGVkIGVudGl0aWVzIGZvciB0aGUgZ2l2ZW4gbW9kZWwsXG4gKiBpdCdzIGVudGl0eSBpZHMsIGFuZCB0aGUgcmVsYXRpb24gbmFtZS5cbiAqXG4gKiBJbnN0ZWFkIG9mIHVzaW5nIHRoZSBgZ2V0UmVsYXRpb25zYCBzZWxlY3RvciB3aGljaCBnZXRzIHRoZSByZWxhdGlvbnMgZm9yIGFcbiAqIHNpbmdsZSBlbnRpdHkuICBUaGlzIGFsbG93cyB5b3UgdG8gZ2V0IGFsbCB0aGUgcmVsYXRpb25zIGZvciBhIGdpdmVuIHNldCBvZlxuICogZW50aXR5IGlkcyAoaS5lLiBHZXQgYWxsIGRhdGV0aW1lcyByZWxhdGVkIHRvIHRoZSBldmVudCBpZHM6IDEwLCAyMCwgYW5kIDMwKS5cbiAqXG4gKiBUaGlzIHNlbGVjdG9yIGlzIHdpcmVkIHVwIHRvIGEgcmVzb2x2ZXIgdGhhdCBkb2VzIGFuIGVmZmljaWVudCByZXF1ZXN0IHRvXG4gKiByZXRyaWV2ZSBhbGwgdGhvc2UgZW50aXRpZXMgYW5kIHRoZW4gZGlzcGF0Y2ggdGhlIGFwcHJvcHJpYXRlIGFjdGlvbnMgc29cbiAqIHRoZSByZWxhdGlvbiBzdGF0ZSBpcyBjb3JyZWN0bHkgcmVjb3JkZWQgZm9yIGVhY2ggcmVsYXRpb24uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGVudGl0eUlkc1xuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uTmFtZVxuICogQHJldHVybiB7QXJyYXk8QmFzZUVudGl0eT59IEFuIGFycmF5IG9mIEJhc2VFbnRpdHkgaW5zdGFuY2VzIGZvciB0aGVcbiAqIHJlbGF0aW9ucy5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFJlbGF0ZWRFbnRpdGllc0ZvcklkcyA9IGNyZWF0ZVNlbGVjdG9yKFxuXHQoIHN0YXRlLCBtb2RlbE5hbWUsIGVudGl0eUlkcywgcmVsYXRpb25OYW1lICkgPT4ge1xuXHRcdGxldCByZWxhdGlvbkVudGl0aWVzID0gU2V0KCk7XG5cdFx0ZW50aXR5SWRzLmZvckVhY2goICggZW50aXR5SWQgKSA9PiB7XG5cdFx0XHRjb25zdCBlbnRpdHkgPSBnZXRFbnRpdHlCeUlkKFxuXHRcdFx0XHRzdGF0ZSxcblx0XHRcdFx0c2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApLFxuXHRcdFx0XHRlbnRpdHlJZFxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHJlbGF0ZWRFbnRpdGllcyA9IGdldFJlbGF0ZWRFbnRpdGllcyhcblx0XHRcdFx0c3RhdGUsXG5cdFx0XHRcdGVudGl0eSxcblx0XHRcdFx0cGx1cmFsTW9kZWxOYW1lKCByZWxhdGlvbk5hbWUgKVxuXHRcdFx0KTtcblx0XHRcdHJlbGF0aW9uRW50aXRpZXMgPSByZWxhdGlvbkVudGl0aWVzLm1lcmdlKCByZWxhdGVkRW50aXRpZXMgKTtcblx0XHR9ICk7XG5cdFx0cmV0dXJuIHJlbGF0aW9uRW50aXRpZXMudG9KUygpO1xuXHR9LFxuXHQoIHN0YXRlLCBtb2RlbE5hbWUsIGVudGl0eUlkcywgcmVsYXRpb25OYW1lICkgPT4gW1xuXHRcdC4uLmdldEVudGl0aWVzQnlJZHMuZ2V0RGVwZW5kYW50cyhcblx0XHRcdHN0YXRlLFxuXHRcdFx0c2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApLFxuXHRcdCksXG5cdFx0Li4uZ2V0RW50aXRpZXNCeUlkcy5nZXREZXBlbmRhbnRzKFxuXHRcdFx0c3RhdGUsXG5cdFx0XHRzaW5ndWxhck1vZGVsTmFtZSggcmVsYXRpb25OYW1lIClcblx0XHQpLFxuXHRdXG4pO1xuXG4vKipcbiAqIExvb2tzIHVwIHRoZSByZWxhdGlvbnMgcXVldWVkIGZvciBhIGdpdmVuIG1vZGVsIGZpcnN0IGZyb20gdGhlIGFjdHVhbCByZWxhdGlvblxuICogdHlwZSBpbiB0aGUgc3RhdGUsIGFuZCB0aGVuIGEgcmV2ZXJzZSBsb29rdXAgaW4gdGhlIGluZGV4IGlmIG5vdCB0aGVyZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlICdhZGQnIG9yICdkZWxldGUnXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IGtleWVkIGJ5IGVudGl0eSBpZHMgZm9yIHRoZSBnaXZlbiBtb2RlbC5cbiAqIFRoZSB2YWx1ZXMgb24gZm9yIGVhY2ggZW50aXR5IGlkIGlzIGFuIG9iamVjdCBrZXllZCBieSByZWxhdGlvbiBuYW1lcyBhbmRcbiAqIHdpdGggdmFsdWVzIGJlaW5nIGFuIGFycmF5IG9mIGlkcyBmb3IgcmVsYXRpb24uIEV4YW1wbGU6XG4gKiB7XG4gKiAgIDEwOiB7XG4gKiAgICAgZGF0ZXRpbWVzOiBbIDIyLCAyMyBdLFxuICogICAgIG1lc3NhZ2VfdGVtcGxhdGVfZ3JvdXBzOiBbIDIsIDQgXSxcbiAqICAgfSxcbiAqICAgMjA6IHtcbiAqICAgICBkYXRldGltZXM6IFsgMjQsIDI1IF0sXG4gKiAgIH0sXG4gKiB9XG4gKi9cbmNvbnN0IGxvb2t1cFJlbGF0aW9uc1F1ZXVlZEZvck1vZGVsID0gKCBzdGF0ZSwgbW9kZWxOYW1lLCB0eXBlID0gJ2FkZCcgKSA9PiB7XG5cdGNvbnN0IGZvckluZGV4TG9va3VwID0gcGx1cmFsTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0Y29uc3QgZm9yQWRkTG9va3VwID0gc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRpZiAoIHN0YXRlLmRpcnR5LnJlbGF0aW9ucy5oYXNJbiggWyB0eXBlLCBmb3JBZGRMb29rdXAgXSApICkge1xuXHRcdHJldHVybiBzdGF0ZS5kaXJ0eS5yZWxhdGlvbnMuZ2V0SW4oIFsgdHlwZSwgZm9yQWRkTG9va3VwIF0gKS50b0pTKCk7XG5cdH1cblx0aWYgKCBzdGF0ZS5kaXJ0eS5yZWxhdGlvbnMuaGFzSW4oIFsgJ2luZGV4JywgZm9ySW5kZXhMb29rdXAgXSApICkge1xuXHRcdGxldCByZWxhdGlvbnMgPSBNYXAoKTtcblx0XHRzdGF0ZS5kaXJ0eS5yZWxhdGlvbnMuZ2V0SW4oIFsgJ2luZGV4JywgZm9ySW5kZXhMb29rdXAgXSApLmZvckVhY2goXG5cdFx0XHQoIHJlbGF0aW9uTWFwLCBlbnRpdHlJZCApID0+IHtcblx0XHRcdFx0cmVsYXRpb25NYXAuZm9yRWFjaCggKCByZWxhdGlvblJlY29yZCwgbW9kZWwgKSA9PiB7XG5cdFx0XHRcdFx0aWYgKCByZWxhdGlvblJlY29yZC5oYXMoIHR5cGUgKSApIHtcblx0XHRcdFx0XHRcdHJlbGF0aW9ucyA9IHJlbGF0aW9ucy5zZXRJbihcblx0XHRcdFx0XHRcdFx0WyBlbnRpdHlJZCwgcGx1cmFsTW9kZWxOYW1lKCBtb2RlbCApIF0sXG5cdFx0XHRcdFx0XHRcdHJlbGF0aW9uUmVjb3JkLmdldCggdHlwZSApXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXHRcdCk7XG5cdFx0cmV0dXJuIHJlbGF0aW9ucy50b0pTKCk7XG5cdH1cblx0cmV0dXJuIHt9O1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgYWxsIHRoZSBxdWV1ZWQgcmVsYXRpb24gYWRkaXRpb25zIGZvciB0aGUgZ2l2ZW4gbW9kZWxcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qga2V5ZWQgYnkgZW50aXR5IGlkcyBmb3IgdGhlIGdpdmVuIG1vZGVsLlxuICogVGhlIHZhbHVlcyBvbiBmb3IgZWFjaCBlbnRpdHkgaWQgaXMgYW4gb2JqZWN0IGtleWVkIGJ5IHJlbGF0aW9uIG5hbWVzIGFuZFxuICogd2l0aCB2YWx1ZXMgYmVpbmcgYW4gYXJyYXkgb2YgaWRzIGZvciByZWxhdGlvbi4gRXhhbXBsZTpcbiAqIHtcbiAqICAgMTA6IHtcbiAqICAgICBkYXRldGltZXM6IFsgMjIsIDIzIF0sXG4gKiAgICAgbWVzc2FnZV90ZW1wbGF0ZV9ncm91cHM6IFsgMiwgNCBdLFxuICogICB9LFxuICogICAyMDoge1xuICogICAgIGRhdGV0aW1lczogWyAyNCwgMjUgXSxcbiAqICAgfSxcbiAqIH1cbiAqXG4gKi9cbmNvbnN0IGdldFJlbGF0aW9uQWRkaXRpb25zUXVldWVkRm9yTW9kZWwgPSBjcmVhdGVTZWxlY3Rvcihcblx0KCBzdGF0ZSwgbW9kZWxOYW1lICkgPT4ge1xuXHRcdHJldHVybiBsb29rdXBSZWxhdGlvbnNRdWV1ZWRGb3JNb2RlbCggc3RhdGUsIG1vZGVsTmFtZSApO1xuXHR9LFxuXHQoIHN0YXRlLCBtb2RlbE5hbWUgKSA9PiBbXG5cdFx0c3RhdGUuZGlydHkucmVsYXRpb25zLmdldEluKCBbICdhZGQnLCBzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lICkgXSApLFxuXHRcdHN0YXRlLmRpcnR5LnJlbGF0aW9ucy5nZXRJbiggWyAnaW5kZXgnLCBwbHVyYWxNb2RlbE5hbWUoIG1vZGVsTmFtZSApIF0gKSxcblx0XVxuKTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgYWxsIHRoZSBxdWV1ZWQgcmVsYXRpb24gZGVsZXRpb25zIGZvciB0aGUgZ2l2ZW4gbW9kZWxcbiAqIFNpbWlsYXIgdG8gYGdldFJlbGF0aW9uQWRkaXRpb25zUXVldWVkRm9yTW9kZWxgIGV4Y2VwdCB0aGlzIGlzIHJlbGF0aW9uc1xuICogcXVldWVkIGZvciBkZWxldGlvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qga2V5ZWQgYnkgZW50aXR5IGlkcyBmb3IgdGhlIGdpdmVuIG1vZGVsLlxuICogVGhlIHZhbHVlcyBvbiBmb3IgZWFjaCBlbnRpdHkgaWQgaXMgYW4gb2JqZWN0IGtleWVkIGJ5IHJlbGF0aW9uIG5hbWVzIGFuZFxuICogd2l0aCB2YWx1ZXMgYmVpbmcgYW4gYXJyYXkgb2YgaWRzIGZvciByZWxhdGlvbi5cbiAqL1xuY29uc3QgZ2V0UmVsYXRpb25EZWxldGlvbnNRdWV1ZWRGb3JNb2RlbCA9IGNyZWF0ZVNlbGVjdG9yKFxuXHQoIHN0YXRlLCBtb2RlbE5hbWUgKSA9PiB7XG5cdFx0cmV0dXJuIGxvb2t1cFJlbGF0aW9uc1F1ZXVlZEZvck1vZGVsKCBzdGF0ZSwgbW9kZWxOYW1lLCAnZGVsZXRlJyApO1xuXHR9LFxuXHQoIHN0YXRlLCBtb2RlbE5hbWUgKSA9PiBbXG5cdFx0c3RhdGUuZGlydHkucmVsYXRpb25zLmdldEluKFxuXHRcdFx0WyAnZGVsZXRlJywgc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApIF1cblx0XHQpLFxuXHRcdHN0YXRlLmRpcnR5LnJlbGF0aW9ucy5nZXRJbiggWyAnaW5kZXgnLCBwbHVyYWxNb2RlbE5hbWUoIG1vZGVsTmFtZSApIF0gKSxcblx0XVxuKTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgY291bnQgb2YgYWxsIHRoZSByZWxhdGlvbiBtb2RlbHMgKG5vdCBjb3VudCBvZiBlbnRpdGllcykgdGhhdCBleGlzdFxuICogaW4gdGhlIHN0YXRlIGJlaW5nIHJlbGF0ZWQgdG8gdGhlIGdpdmVuIG1vZGVsIGFuZCBlbnRpdHlJZC5cbiAqXG4gKiBOb3RlOiBUaGlzIG9ubHkgcXVlcmllcyB0aGUgc3RhdGUsIG5vdCBhbnkgcmVsYXRpb25zIHRoYXQgbWlnaHQgZXhpc3QgaW4gdGhlXG4gKiBkYi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gZW50aXR5SWRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNvdW50IG9mIHJlbGF0aW9ucy5cbiAqL1xuY29uc3QgY291bnRSZWxhdGlvbk1vZGVsc0luZGV4ZWRGb3JFbnRpdHkgPSBjcmVhdGVTZWxlY3Rvcihcblx0KFxuXHRcdHN0YXRlLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHlJZFxuXHQpID0+IHtcblx0XHRjb25zdCBzaW5nbGVOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRcdGNvbnN0IHBsdXJhbE5hbWUgPSBwbHVyYWxNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRcdGVudGl0eUlkID0gbm9ybWFsaXplRW50aXR5SWQoIGVudGl0eUlkICk7XG5cdFx0Ly8gZmlyc3QgZnJvbSB0aGUgZW50aXR5TWFwXG5cdFx0bGV0IGNvdW50UmVsYXRpb25zID0gKFxuXHRcdFx0c3RhdGUucmVsYXRpb25zXG5cdFx0XHRcdC5nZXRJbiggWyAnZW50aXR5TWFwJywgc2luZ2xlTmFtZSwgZW50aXR5SWQgXSApIHx8IE1hcCgpXG5cdFx0KS5jb3VudCgpO1xuXG5cdFx0Ly8gY29uc2lkZXIgbWF5YmUgaW4gdGhlIGluZGV4IChleGlzdHMgYXMgYSByZWxhdGlvbiBmb3IgYW5vdGhlciBtb2RlbClcblx0XHRjb3VudFJlbGF0aW9ucyArPSAoXG5cdFx0XHRzdGF0ZS5yZWxhdGlvbnNcblx0XHRcdFx0LmdldEluKCBbICdpbmRleCcsIHBsdXJhbE5hbWUsIGVudGl0eUlkIF0gKSB8fCBNYXAoKVxuXHRcdCkuY291bnQoKTtcblx0XHRyZXR1cm4gY291bnRSZWxhdGlvbnM7XG5cdH0sXG5cdCggc3RhdGUsIG1vZGVsTmFtZSwgZW50aXR5SWQgKSA9PiB7XG5cdFx0Y29uc3Qgc2luZ2xlTmFtZSA9IHNpbmd1bGFyTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0XHRjb25zdCBwbHVyYWxOYW1lID0gcGx1cmFsTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0XHRlbnRpdHlJZCA9IG5vcm1hbGl6ZUVudGl0eUlkKCBlbnRpdHlJZCApO1xuXHRcdHJldHVybiBbXG5cdFx0XHRzdGF0ZS5yZWxhdGlvbnMuZ2V0SW4oIFsgJ2VudGl0eU1hcCcsIHNpbmdsZU5hbWUsIGVudGl0eUlkIF0gKSxcblx0XHRcdHN0YXRlLnJlbGF0aW9ucy5nZXRJbiggWyAnaW5kZXgnLCBwbHVyYWxOYW1lLCBlbnRpdHlJZCBdICksXG5cdFx0XTtcblx0fVxuKTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBzdGF0ZS5yZWxhdGlvbnMgbWFwLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICpcbiAqIEByZXR1cm4ge01hcH0gVGhlIHN0YXRlLnJlbGF0aW9ucyBtYXAuXG4gKi9cbmNvbnN0IGdldEFsbFJlbGF0aW9uc0luU3RhdGUgPSAoIHN0YXRlICkgPT4gc3RhdGUucmVsYXRpb25zO1xuXG5leHBvcnQge1xuXHRnZXRSZWxhdGVkRW50aXRpZXMsXG5cdGdldFJlbGF0aW9uSWRzRm9yRW50aXR5UmVsYXRpb24sXG5cdGdldFJlbGF0aW9uQWRkaXRpb25zUXVldWVkRm9yTW9kZWwsXG5cdGdldFJlbGF0aW9uRGVsZXRpb25zUXVldWVkRm9yTW9kZWwsXG5cdGNvdW50UmVsYXRpb25Nb2RlbHNJbmRleGVkRm9yRW50aXR5LFxuXHRnZXRBbGxSZWxhdGlvbnNJblN0YXRlLFxufTtcbiIsImV4cG9ydCBjb25zdCBBQ1RJT05fVFlQRVMgPSB7XG5cdFJFQ0VJVkVfTElTVDogJ1JFQ0VJVkVfTElTVCcsXG5cdFJFQ0VJVkVfRU5USVRZX0xJU1Q6ICdSRUNFSVZFX0VOVElUWV9MSVNUJyxcbn07XG4iLCIvKipcbiAqIEludGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgQUNUSU9OX1RZUEVTIGFzIHR5cGVzIH0gZnJvbSAnLi9hY3Rpb24tdHlwZXMnO1xuXG4vKipcbiAqIFJldHVybnMgYW4gYWN0aW9uIG9iamVjdCB1c2VkIGluIHVwZGF0aW5nIHRoZSBzdG9yZSB3aXRoIHRoZSBwcm92aWRlZCBpdGVtc1xuICogcmV0cmlldmVkIGZyb20gYSByZXF1ZXN0IHVzaW5nIHRoZSBnaXZlbiBxdWVyeXN0cmluZy5cbiAqXG4gKiBUaGlzIGlzIGEgZ2VuZXJpYyByZXNwb25zZSBhY3Rpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlkZW50aWZpZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeVN0cmluZyAgUmVzdWx0cyBhcmUgc3RvcmVkIGluZGV4ZWQgYnkgdGhlIHF1ZXJ5XG4gKiBzdHJpbmcgZ2VuZXJhdGluZyB0aGVtLlxuICogQHBhcmFtIHtBcnJheTwqPn0gaXRlbXMgICAgIGl0ZW1zIGF0dGFjaGVkIHdpdGggdGhlIGxpc3QuXG4gKiBAcmV0dXJuIHtcbiAqIFx0e1xuICogXHRcdHR5cGU6IHN0cmluZyxcbiAqIFx0XHRpZGVudGlmaWVyOiBzdHJpbmcsXG4gKiBcdFx0cXVlcnlTdHJpbmc6IHN0cmluZyxcbiAqIFx0XHRpdGVtczogQXJyYXk8Kj5cbiAqXHR9XG4gKiB9IE9iamVjdCBmb3IgYWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjZWl2ZVJlc3BvbnNlKCBpZGVudGlmaWVyLCBxdWVyeVN0cmluZywgaXRlbXMgPSBbXSApIHtcblx0cmV0dXJuIHtcblx0XHR0eXBlOiB0eXBlcy5SRUNFSVZFX0xJU1QsXG5cdFx0aWRlbnRpZmllcixcblx0XHRxdWVyeVN0cmluZyxcblx0XHRpdGVtcyxcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFjdGlvbiBvYmplY3QgdXNlZCBpbiB1cGRhdGluZyB0aGUgc3RvcmUgd2l0aCB0aGUgcHJvdmlkZWQgZW50aXR5XG4gKiBpdGVtcyByZXRyaWV2ZWQgZnJvbSBhIHJlcXVlc3QgdXNpbmcgdGhlIGdpdmVuIHF1ZXJ5IHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcXVlcnlTdHJpbmdcbiAqIEBwYXJhbSB7QXJyYXk8QmFzZUVudGl0eT59ZW50aXRpZXNcbiAqIEByZXR1cm4ge3t0eXBlOiBzdHJpbmcsIGlkZW50aWZpZXI6IHN0cmluZywgcXVlcnlTdHJpbmc6IHN0cmluZywgaXRlbXM6XG4gKiAgIEFycmF5PEJhc2VFbnRpdHk+fX0gQW4gYWN0aW9uIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY2VpdmVFbnRpdHlSZXNwb25zZShcblx0bW9kZWxOYW1lLFxuXHRxdWVyeVN0cmluZyxcblx0ZW50aXRpZXMgPSBbXSxcbikge1xuXHRyZXR1cm4ge1xuXHRcdHR5cGU6IHR5cGVzLlJFQ0VJVkVfRU5USVRZX0xJU1QsXG5cdFx0aWRlbnRpZmllcjogbW9kZWxOYW1lLFxuXHRcdHF1ZXJ5U3RyaW5nLFxuXHRcdGl0ZW1zOiBlbnRpdGllcyxcblx0fTtcbn1cbiIsIi8qKlxuICogVGhlIGtleSBmb3IgdGhlIHJlZHVjZXIgb24gdGhlIHN0b3JlLlxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IFJFRFVDRVJfS0VZID0gJ2V2ZW50ZXNwcmVzc28vbGlzdHMnO1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqL1xuaW1wb3J0IHsgcmVnaXN0ZXJTdG9yZSB9IGZyb20gJ0B3b3JkcHJlc3MvZGF0YSc7XG5cbi8qKlxuICogSW50ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cbmltcG9ydCByZWR1Y2VyIGZyb20gJy4vcmVkdWNlcnMnO1xuaW1wb3J0ICogYXMgc2VsZWN0b3JzIGZyb20gJy4vc2VsZWN0b3JzJztcbmltcG9ydCAqIGFzIGFjdGlvbnMgZnJvbSAnLi9hY3Rpb25zJztcbmltcG9ydCAqIGFzIHJlc29sdmVycyBmcm9tICcuL3Jlc29sdmVycyc7XG5pbXBvcnQgeyBjcmVhdGVFbnRpdHlTZWxlY3RvcnMsIGNyZWF0ZUVudGl0eVJlc29sdmVycyB9IGZyb20gJy4vbW9kZWwnO1xuaW1wb3J0IHsgUkVEVUNFUl9LRVkgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgY29udHJvbHMgZnJvbSAnLi4vYmFzZS1jb250cm9scyc7XG5cbi8qKlxuICogQ3JlYXRlcyBzcGVjaWZpYyBtb2RlbCBlbnRpdHkgc2VsZWN0b3JzIChnZXRFdmVudHMsIGdldERhdGV0aW1lcyBldGMpXG4gKiBAdHlwZSB7T2JqZWN0PEZ1bmN0aW9uPn1cbiAqL1xuY29uc3QgZW50aXR5U2VsZWN0b3JzID0gY3JlYXRlRW50aXR5U2VsZWN0b3JzKCBzZWxlY3RvcnMgKTtcblxuLyoqXG4gKiBDcmVhdGVzIHNwZWNpZmljIG1vZGVsIGVudGl0eSByZXNvbHZlcnMgKGdldEV2ZW50cywgZ2V0RGF0ZXRpbWVzIGV0YylcbiAqIEB0eXBlIHtPYmplY3Q8RnVuY3Rpb24+fVxuICovXG5jb25zdCBlbnRpdHlSZXNvbHZlcnMgPSBjcmVhdGVFbnRpdHlSZXNvbHZlcnMoIHJlc29sdmVycyApO1xuXG4vKipcbiAqIFJlZ2lzdGVycyB0aGUgc3RvcmUgZm9yIHRoZSAnZXZlbnRlc3ByZXNzby9saXN0c2AgcmVkdWNlci5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXJTdG9yZSggUkVEVUNFUl9LRVksIHtcblx0cmVkdWNlcixcblx0YWN0aW9ucyxcblx0c2VsZWN0b3JzOiB7IC4uLnNlbGVjdG9ycywgLi4uZW50aXR5U2VsZWN0b3JzIH0sXG5cdHJlc29sdmVyczogeyAuLi5yZXNvbHZlcnMsIC4uLmVudGl0eVJlc29sdmVycyB9LFxuXHRjb250cm9scyxcbn0gKTtcbiIsIi8qKlxuICogSW50ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cbmltcG9ydCB7IGdldE1ldGhvZE5hbWUgfSBmcm9tICcuLi9iYXNlLW1vZGVsJztcbmltcG9ydCB7IE1PREVMX05BTUVTIH0gZnJvbSAnLi4vLi4vbW9kZWwnO1xuaW1wb3J0IHsgaXNSZXNvbHZpbmcgfSBmcm9tICcuLi9iYXNlLXNlbGVjdG9ycyc7XG5pbXBvcnQgeyBSRURVQ0VSX0tFWSB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjcmVhdGVzIHNlbGVjdG9ycyBmb3IgZWFjaCByZWdpc3RlcmVkIG1vZGVsIG5hbWUgd3JhcHBpbmcgdGhlXG4gKiBnZW5lcmljIHNvdXJjZSBzZWxlY3RvcnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3Q8ZnVuY3Rpb24+fSBzb3VyY2VcbiAqIEByZXR1cm4ge09iamVjdDxmdW5jdGlvbj59IEFsbCB0aGUgZ2VuZXJhdGVkIHNlbGVjdG9ycyBmb3IgZWFjaCBtb2RlbC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUVudGl0eVNlbGVjdG9ycyA9ICggc291cmNlICkgPT4gTU9ERUxfTkFNRVMucmVkdWNlKFxuXHQoIHNlbGVjdG9ycywgbW9kZWxOYW1lICkgPT4ge1xuXHRcdGNvbnN0IG1ldGhvZE5hbWVGb3JHZXQgPSBnZXRNZXRob2ROYW1lKCBtb2RlbE5hbWUsICcnLCAnZ2V0JywgdHJ1ZSApO1xuXHRcdHNlbGVjdG9yc1sgbWV0aG9kTmFtZUZvckdldCBdID0gKFxuXHRcdFx0c3RhdGUsXG5cdFx0XHRxdWVyeVN0cmluZyxcblx0XHQpID0+IHNvdXJjZS5nZXRFbnRpdGllcyggc3RhdGUsIG1vZGVsTmFtZSwgcXVlcnlTdHJpbmcgKTtcblx0XHRzZWxlY3RvcnNbXG5cdFx0XHRnZXRNZXRob2ROYW1lKCBtb2RlbE5hbWUsICdieUlkcycsICdnZXQnLCB0cnVlIClcblx0XHRdID0gKFxuXHRcdFx0c3RhdGUsXG5cdFx0XHRpZHMgPSBbXSxcblx0XHQpID0+IHNvdXJjZS5nZXRFbnRpdGllc0J5SWRzKCBzdGF0ZSwgbW9kZWxOYW1lLCBpZHMgKTtcblx0XHRzZWxlY3RvcnNbIGdldE1ldGhvZE5hbWUoIG1vZGVsTmFtZSwgJycsICdpc1JlcXVlc3RpbmcnLCB0cnVlICkgXSA9IChcblx0XHRcdHN0YXRlLFxuXHRcdFx0cXVlcnlTdHJpbmcsXG5cdFx0KSA9PiBpc1Jlc29sdmluZyhcblx0XHRcdFJFRFVDRVJfS0VZLFxuXHRcdFx0bWV0aG9kTmFtZUZvckdldCxcblx0XHRcdHF1ZXJ5U3RyaW5nXG5cdFx0KTtcblx0XHRyZXR1cm4gc2VsZWN0b3JzO1xuXHR9LFxuXHR7fSxcbik7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY3JlYXRlcyByZXNvbHZlcnMgZm9yIGVhY2ggcmVnaXN0ZXJlZCBtb2RlbCBuYW1lIHdyYXBwaW5nIHRoZVxuICogZ2VuZXJpYyBzb3VyY2UgcmVzb2x2ZXJzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0PGZ1bmN0aW9uPn0gc291cmNlXG4gKiBAcmV0dXJuIHtPYmplY3Q8ZnVuY3Rpb24+fSBBbGwgdGhlIGdlbmVyYXRlZCByZXNvbHZlcnMgZm9yIGVhY2ggbW9kZWwuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVFbnRpdHlSZXNvbHZlcnMgPSAoIHNvdXJjZSApID0+IE1PREVMX05BTUVTLnJlZHVjZShcblx0KCByZXNvbHZlcnMsIG1vZGVsTmFtZSApID0+IHtcblx0XHRyZXNvbHZlcnNbIGdldE1ldGhvZE5hbWUoIG1vZGVsTmFtZSwgJycsICdnZXQnLCB0cnVlICkgXSA9IChcblx0XHRcdHF1ZXJ5U3RyaW5nXG5cdFx0KSA9PiBzb3VyY2UuZ2V0RW50aXRpZXMoIG1vZGVsTmFtZSwgcXVlcnlTdHJpbmcgKTtcblx0XHRyZXNvbHZlcnNbIGdldE1ldGhvZE5hbWUoIG1vZGVsTmFtZSwgJ2J5SWRzJywgJ2dldCcsIHRydWUgKSBdID0gKFxuXHRcdFx0aWRzXG5cdFx0KSA9PiBzb3VyY2UuZ2V0RW50aXRpZXNCeUlkcyggbW9kZWxOYW1lLCBpZHMgKTtcblx0XHRyZXR1cm4gcmVzb2x2ZXJzO1xuXHR9LFxuXHR7fSxcbik7XG4iLCIvKipcbiAqIEludGVybmFsIGRlcGVuZGVuY2llc1xuICovXG5pbXBvcnQgeyBERUZBVUxUX0xJU1RTX1NUQVRFIH0gZnJvbSAnLi4vLi4vbW9kZWwnO1xuaW1wb3J0IHsgQUNUSU9OX1RZUEVTIGFzIHR5cGVzIH0gZnJvbSAnLi9hY3Rpb24tdHlwZXMnO1xuXG4vKipcbiAqIEV4dGVybmFsIGRlcGVuZGVuY2llc1xuICovXG5pbXBvcnQgeyBmcm9tSlMsIFNldCwgT3JkZXJlZE1hcCB9IGZyb20gJ2ltbXV0YWJsZSc7XG5cbi8qKlxuICogUmVkdWNlciBtYW5hZ2luZyBpdGVtIGxpc3Qgc3RhdGUuXG4gKlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZSAgQ3VycmVudCBzdGF0ZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cdERpc3BhdGNoZWQgYWN0aW9uLlxuICogQHJldHVybiB7SW1tdXRhYmxlLk1hcH1cdFVwZGF0ZWQgc3RhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNlaXZlTGlzdEl0ZW1zKFxuXHRzdGF0ZSA9IGZyb21KUyggREVGQVVMVF9MSVNUU19TVEFURSApLFxuXHRhY3Rpb25cbikge1xuXHRjb25zdCB7IHR5cGUsIGlkZW50aWZpZXIsIHF1ZXJ5U3RyaW5nIH0gPSBhY3Rpb247XG5cdGNvbnN0IHBhdGggPSBbIGlkZW50aWZpZXIsIHF1ZXJ5U3RyaW5nIF07XG5cdGxldCB7IGl0ZW1zIH0gPSBhY3Rpb247XG5cdGxldCBkb1VwZGF0ZSA9IHRydWUsXG5cdFx0ZXhpc3RpbmdWYWx1ZXM7XG5cdHN3aXRjaCAoIHR5cGUgKSB7XG5cdFx0Y2FzZSB0eXBlcy5SRUNFSVZFX0xJU1Q6XG5cdFx0XHRleGlzdGluZ1ZhbHVlcyA9IHN0YXRlLmdldEluKCBwYXRoICkgfHwgU2V0KCk7XG5cdFx0XHRpdGVtcyA9IGV4aXN0aW5nVmFsdWVzLm1lcmdlKCBpdGVtcyApO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSB0eXBlcy5SRUNFSVZFX0VOVElUWV9MSVNUOlxuXHRcdFx0ZXhpc3RpbmdWYWx1ZXMgPSBzdGF0ZS5nZXRJbiggcGF0aCApIHx8IE9yZGVyZWRNYXAoKTtcblx0XHRcdGl0ZW1zID0gZXhpc3RpbmdWYWx1ZXMubWVyZ2UoXG5cdFx0XHRcdGl0ZW1zLm1hcCggKCBlbnRpdHkgKSA9PiBbIGVudGl0eS5pZCwgZW50aXR5IF0gKVxuXHRcdFx0KTtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQgOlxuXHRcdFx0ZG9VcGRhdGUgPSBmYWxzZTtcblx0fVxuXHRyZXR1cm4gZG9VcGRhdGUgP1xuXHRcdHN0YXRlLnNldEluKCBbIGlkZW50aWZpZXIsIHF1ZXJ5U3RyaW5nIF0sIGl0ZW1zICkgOlxuXHRcdHN0YXRlO1xufVxuXG5leHBvcnQgZGVmYXVsdCByZWNlaXZlTGlzdEl0ZW1zO1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IGlzRW1wdHksIGZpbmQgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcblx0YXBwbHlRdWVyeVN0cmluZyxcblx0Z2V0UHJpbWFyeUtleVF1ZXJ5U3RyaW5nLFxufSBmcm9tICdAZXZlbnRlc3ByZXNzby9tb2RlbCc7XG5cbi8qKlxuICogSW50ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cbmltcG9ydCB7IHJlY2VpdmVSZXNwb25zZSwgcmVjZWl2ZUVudGl0eVJlc3BvbnNlIH0gZnJvbSAnLi9hY3Rpb25zJztcbmltcG9ydCB7XG5cdGZldGNoLFxuXHRzZWxlY3QsXG5cdGRpc3BhdGNoLFxuXHRyZXNvbHZlR2V0RW50aXR5QnlJZEZvcklkcyxcblx0cmVzb2x2ZVNlbGVjdCxcbn0gZnJvbSAnLi4vYmFzZS1jb250cm9scyc7XG5pbXBvcnQgeyBSRURVQ0VSX0tFWSBhcyBDT1JFX1JFRFVDRVJfS0VZIH0gZnJvbSAnLi4vY29yZS9jb25zdGFudHMnO1xuaW1wb3J0IHsgUkVEVUNFUl9LRVkgYXMgU0NIRU1BX1JFRFVDRVJfS0VZIH0gZnJvbSAnLi4vc2NoZW1hL2NvbnN0YW50cyc7XG5cbmNvbnN0IERFRkFVTFRfRU1QVFlfQVJSQVkgPSBbXTtcblxuLyoqXG4gKiBSZXNvbHZlciBmb3IgZ2VuZXJpYyBpdGVtcyByZXR1cm5lZCBmcm9tIGFuIGVuZHBvaW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpZGVudGlmaWVyICBUaGUgaWRlbnRpZmllciBmb3IgdGhlIGl0ZW1zLlxuICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5U3RyaW5nICBBZGRpdGlvbmFsIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzIHBhc3NlZCBvbiB0b1xuICogICB0aGUgUkVTVCByZXF1ZXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24qIGdldEl0ZW1zKCBpZGVudGlmaWVyLCBxdWVyeVN0cmluZyApIHtcblx0Y29uc3QgaXRlbXMgPSB5aWVsZCBmZXRjaCgge1xuXHRcdHBhdGg6IHF1ZXJ5U3RyaW5nLFxuXHR9ICk7XG5cdHlpZWxkIHJlY2VpdmVSZXNwb25zZSggaWRlbnRpZmllciwgcXVlcnlTdHJpbmcsIGl0ZW1zICk7XG59XG5cbi8qKlxuICogVXRpbGl0eSBmb3IgaGFuZGxpbmcgYW4gZW50aXR5IHJlc3BvbnNlIGFuZCBjb25zdHJ1Y3RpbmcgQmFzZUVudGl0eVxuICogY2hpbGRyZW4gZnJvbSB0aGVtLlxuICpcbiAqIE5vdGUsIHRoaXMgdXNlcyB0aGUgZW50aXRpZXMgc3RvcmVkIGluIHRoZSBldmVudGVzcHJlc3NvL2NvcmUgc3RvcmUgYXMgdGhlXG4gKiBhdXRob3JpdHkgc28gaWYgYW4gZW50aXR5IGFscmVhZHkgZXhpc3RzIHRoZXJlLCBpdCByZXBsYWNlcyB3aGF0IHdhc1xuICogcmV0cmlldmVkIGZyb20gdGhlIHNlcnZlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge0FycmF5fSByZXNwb25zZVxuICogQHJldHVybiB7SXRlcmFibGVJdGVyYXRvcjwqPnxBcnJheTxCYXNlRW50aXR5Pn0gIEFuIGVtcHR5IGFycmF5IGlmIHRoZVxuICogZmFjdG9yeSBjYW5ub3QgYmUgcmV0cmlldmVkIGZvciB0aGUgbW9kZWwuICBPdGhlcndpc2UgdGhlIGNvbnN0cnVjdGVkXG4gKiBlbnRpdGllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uKiBidWlsZEFuZERpc3BhdGNoRW50aXRpZXNGcm9tUmVzcG9uc2UoIG1vZGVsTmFtZSwgcmVzcG9uc2UgKSB7XG5cdGNvbnN0IGZhY3RvcnkgPSB5aWVsZCByZXNvbHZlU2VsZWN0KFxuXHRcdFNDSEVNQV9SRURVQ0VSX0tFWSxcblx0XHQnZ2V0RmFjdG9yeUZvck1vZGVsJyxcblx0XHRtb2RlbE5hbWVcblx0KTtcblx0aWYgKCBpc0VtcHR5KCBmYWN0b3J5ICkgKSB7XG5cdFx0cmV0dXJuIERFRkFVTFRfRU1QVFlfQVJSQVk7XG5cdH1cblx0bGV0IGZ1bGxFbnRpdGllcyA9IHJlc3BvbnNlLm1hcChcblx0XHQoIGVudGl0eSApID0+IGZhY3RvcnkuZnJvbUV4aXN0aW5nKCBlbnRpdHkgKVxuXHQpO1xuXHRjb25zdCBlbnRpdHlJZHMgPSBmdWxsRW50aXRpZXMubWFwKCAoIGVudGl0eSApID0+IGVudGl0eS5pZCApO1xuXHQvLyBhcmUgdGhlcmUgYWxyZWFkeSBlbnRpdGllcyBmb3IgdGhlIGlkcyBpbiB0aGUgc3RvcmU/ICBJZiBzbywgd2UgdXNlIHRob3NlXG5cdGNvbnN0IGV4aXN0aW5nRW50aXRpZXMgPSB5aWVsZCBzZWxlY3QoXG5cdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHQnZ2V0RW50aXRpZXNCeUlkcycsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkc1xuXHQpO1xuXHRpZiAoICEgaXNFbXB0eSggZXhpc3RpbmdFbnRpdGllcyApICkge1xuXHRcdGZ1bGxFbnRpdGllcyA9IGZ1bGxFbnRpdGllcy5tYXAoICggZW50aXR5ICkgPT4ge1xuXHRcdFx0cmV0dXJuIGZpbmQoIGV4aXN0aW5nRW50aXRpZXMsICggZXhpc3RpbmdFbnRpdHkgKSA9PiB7XG5cdFx0XHRcdHJldHVybiBleGlzdGluZ0VudGl0eS5pZCA9PT0gZW50aXR5LmlkO1xuXHRcdFx0fSApIHx8IGVudGl0eTtcblx0XHR9ICk7XG5cdH1cblx0eWllbGQgZGlzcGF0Y2goXG5cdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHQncmVjZWl2ZUVudGl0eVJlY29yZHMnLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRmdWxsRW50aXRpZXNcblx0KTtcblx0eWllbGQgcmVzb2x2ZUdldEVudGl0eUJ5SWRGb3JJZHMoIG1vZGVsTmFtZSwgZW50aXR5SWRzICk7XG5cdHJldHVybiBmdWxsRW50aXRpZXM7XG59XG5cbi8qKlxuICogUmVzb2x2ZXIgZm9yIG1vZGVsIGVudGl0aWVzIHJldHVybmVkIGZyb20gYW4gZW5kcG9pbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcXVlcnlTdHJpbmdcbiAqIEByZXR1cm4ge0l0ZXJhYmxlSXRlcmF0b3I8Kj58QXJyYXk8QmFzZUVudGl0eT59IEFuIGVtcHR5IGFycmF5IGlmIG5vXG4gKiBlbnRpdGllcyByZXRyaWV2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiogZ2V0RW50aXRpZXMoIG1vZGVsTmFtZSwgcXVlcnlTdHJpbmcgKSB7XG5cdGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goIHtcblx0XHRwYXRoOiBhcHBseVF1ZXJ5U3RyaW5nKCBtb2RlbE5hbWUsIHF1ZXJ5U3RyaW5nICksXG5cdH0gKTtcblx0aWYgKCBpc0VtcHR5KCByZXNwb25zZSApICkge1xuXHRcdHJldHVybiBERUZBVUxUX0VNUFRZX0FSUkFZO1xuXHR9XG5cdGNvbnN0IGZ1bGxFbnRpdGllcyA9IHlpZWxkIGJ1aWxkQW5kRGlzcGF0Y2hFbnRpdGllc0Zyb21SZXNwb25zZShcblx0XHRtb2RlbE5hbWUsXG5cdFx0cmVzcG9uc2Vcblx0KTtcblx0eWllbGQgcmVjZWl2ZUVudGl0eVJlc3BvbnNlKCBtb2RlbE5hbWUsIHF1ZXJ5U3RyaW5nLCBmdWxsRW50aXRpZXMgKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlciBmb3IgZ2V0dGluZyBtb2RlbCBlbnRpdGllcyBmb3IgYSBnaXZlbiBzZXQgb2YgaWRzXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59aWRzXG4gKiBAcmV0dXJuIHtJdGVyYWJsZUl0ZXJhdG9yPCo+fEFycmF5fSBBbiBlbXB0eSBhcnJheSBpZiBubyBlbnRpdGllcyByZXRyaWV2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiogZ2V0RW50aXRpZXNCeUlkcyggbW9kZWxOYW1lLCBpZHMgPSBbXSApIHtcblx0Y29uc3QgcXVlcnlTdHJpbmcgPSBnZXRQcmltYXJ5S2V5UXVlcnlTdHJpbmcoIG1vZGVsTmFtZSwgaWRzICk7XG5cdGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goIHtcblx0XHRwYXRoOiBhcHBseVF1ZXJ5U3RyaW5nKFxuXHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0cXVlcnlTdHJpbmdcblx0XHQpLFxuXHR9ICk7XG5cdGlmICggaXNFbXB0eSggcmVzcG9uc2UgKSApIHtcblx0XHRyZXR1cm4gREVGQVVMVF9FTVBUWV9BUlJBWTtcblx0fVxuXHRjb25zdCBmdWxsRW50aXRpZXMgPSB5aWVsZCBidWlsZEFuZERpc3BhdGNoRW50aXRpZXNGcm9tUmVzcG9uc2UoXG5cdFx0bW9kZWxOYW1lLFxuXHRcdHJlc3BvbnNlXG5cdCk7XG5cdHlpZWxkIHJlY2VpdmVFbnRpdHlSZXNwb25zZSggbW9kZWxOYW1lLCBxdWVyeVN0cmluZywgZnVsbEVudGl0aWVzICk7XG59XG4iLCIvKipcbiAqIEludGVybmFsIGRlcGVuZGVuY2llc1xuICovXG5pbXBvcnQgeyBpc1Jlc29sdmluZyB9IGZyb20gJy4uL2Jhc2Utc2VsZWN0b3JzJztcbmltcG9ydCB7IFJFRFVDRVJfS0VZIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG4vKipcbiAqIEV4dGVybmFsIGRlcGVuZGVuY2llc1xuICovXG5pbXBvcnQgeyBfXywgc3ByaW50ZiB9IGZyb20gJ0BldmVudGVzcHJlc3NvL2kxOG4nO1xuaW1wb3J0IGNyZWF0ZVNlbGVjdG9yIGZyb20gJ3JlbWVtbyc7XG5pbXBvcnQge1xuXHRhc3NlcnRJbW11dGFibGVPYmplY3RIYXNQYXRoLFxuXHRnZXRQcmltYXJ5S2V5UXVlcnlTdHJpbmcsXG59IGZyb20gJ0BldmVudGVzcHJlc3NvL21vZGVsJztcbmltcG9ydCB7IE9yZGVyZWRNYXAsIFNldCB9IGZyb20gJ2ltbXV0YWJsZSc7XG5cbmNvbnN0IERFRkFVTFRfRU1QVFlfQVJSQVkgPSBbXTtcblxuLyoqXG4gKiBHZW5lcmljIGhlbHBlciBmb3IgcmV0cmlldmluZyBpdGVtcyBmcm9tIHN0YXRlIGZvciBnaXZlbiBpZGVudGlmaWVyIGFuZFxuICogcXVlcnlTdHJpbmcuXG4gKlxuICogQHBhcmFtIHtJbW11dGFibGUuTWFwfSBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGlkZW50aWZpZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeVN0cmluZ1xuICogQHBhcmFtIHsqfSBkZWZhdWx0RW1wdHkgIENhbGxlciBjYW4gc3VwcGx5IHdoYXQgdGhlIGRlZmF1bHQgaXMgd2hlbiBzdGF0ZSBpc1xuICogZG9lc24ndCBoYXZlIGVudHJpZXMgZm9yIHRoZSBnaXZlbiBpZGVudGlmaWVyIGFuZCBxdWVyeVN0cmluZ1xuICogQHJldHVybiB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBpdGVtcyBpZiB0aGUgZ2l2ZW4gaWRlbnRpZmllci9cbiAqIHF1ZXJ5c3RyaW5nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBzdGF0ZSBvciB0aGUgZ2l2ZW4gaXRlbXMgYXMgYW4gYXJyYXkgb3JcbiAqIG9iamVjdCAoZGVwZW5kaW5nIG9uIGhvdyB0aGV5IGFyZSBzdG9yZWQgaW4gdGhlIHN0YXRlKS5cbiAqL1xuY29uc3QgcmV0cmlldmVJdGVtcyA9XG5cdChcblx0XHRzdGF0ZSxcblx0XHRpZGVudGlmaWVyLFxuXHRcdHF1ZXJ5U3RyaW5nLFxuXHRcdGRlZmF1bHRFbXB0eSA9IFNldCgpXG5cdCkgPT4gc3RhdGUuZ2V0SW4oIFsgaWRlbnRpZmllciwgcXVlcnlTdHJpbmcgXSApIHx8IGRlZmF1bHRFbXB0eTtcblxuLyoqXG4gKiBSZXR1cm5zIGFsbCB0aGUgaXRlbXMgZm9yIHRoZSBnaXZlbiBpZGVudGlmaWVyIGFuZCBxdWVyeVN0cmluZ1xuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGUgRGF0YSBzdGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIHRoZSBpdGVtcyBhcmUgYmVpbmcgcmV0cmlldmVkIGZvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeVN0cmluZyBUaGUgcXVlcnkgc3RyaW5nIGZvciByZXRyaWV2aW5nIHRoZSBpdGVtcy5cbiAqIEByZXR1cm4ge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIGl0ZW1zIGZvciB0aGUgZ2l2ZW4gbW9kZWwgYW5kIHF1ZXJ5LlxuICovXG5leHBvcnQgY29uc3QgZ2V0SXRlbXMgPSBjcmVhdGVTZWxlY3Rvcihcblx0KCBzdGF0ZSwgaWRlbnRpZmllciwgcXVlcnlTdHJpbmcgKSA9PiByZXRyaWV2ZUl0ZW1zKFxuXHRcdHN0YXRlLFxuXHRcdGlkZW50aWZpZXIsXG5cdFx0cXVlcnlTdHJpbmdcblx0KS50b0FycmF5KCksXG5cdCggc3RhdGUsIGlkZW50aWZpZXIsIHF1ZXJ5U3RyaW5nICkgPT4gW1xuXHRcdHN0YXRlLmdldEluKCBbIGlkZW50aWZpZXIsIHF1ZXJ5U3RyaW5nIF0gKSxcblx0XVxuKTtcblxuLyoqXG4gKiBSZXR1cm5zIGFsbCB0aGUgbW9kZWwgZW50aXRpZXMgZm9yIHRoZSBnaXZlbiBtb2RlbE5hbWUgYW5kIHF1ZXJ5IHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcXVlcnlTdHJpbmdcbiAqIEByZXR1cm4ge0FycmF5PEJhc2VFbnRpdHk+fSBSZXR1cm5zIGFycmF5IG9mIGVudGl0aWVzLlxuICovXG5leHBvcnQgY29uc3QgZ2V0RW50aXRpZXMgPSBjcmVhdGVTZWxlY3Rvcihcblx0KCBzdGF0ZSwgbW9kZWxOYW1lLCBxdWVyeVN0cmluZyApID0+IHJldHJpZXZlSXRlbXMoXG5cdFx0c3RhdGUsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdHF1ZXJ5U3RyaW5nLFxuXHRcdE9yZGVyZWRNYXAoKVxuXHQpLnZhbHVlU2VxKCkudG9BcnJheSgpLFxuXHQoIHN0YXRlLCBtb2RlbE5hbWUsIHF1ZXJ5U3RyaW5nICkgPT4gW1xuXHRcdHN0YXRlLmdldEluKCBbIG1vZGVsTmFtZSwgcXVlcnlTdHJpbmcgXSApLFxuXHRdXG4pO1xuXG4vKipcbiAqIFJldHVybnMgYWxsIHRoZSBtb2RlbCBlbnRpdGllcyBmb3IgdGhlIGdpdmVuIG1vZGVsTmFtZSBhbmQgcXVlcnkgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7QXJyYXl9IGlkc1xuICogQHJldHVybiB7QXJyYXk8QmFzZUVudGl0eT59IEFuIGFycmF5IG9mIGVudGl0aWVzLlxuICovXG5leHBvcnQgY29uc3QgZ2V0RW50aXRpZXNCeUlkcyA9ICggc3RhdGUsIG1vZGVsTmFtZSwgaWRzID0gW10gKSA9PiB7XG5cdHRyeSB7XG5cdFx0Y29uc3QgcXVlcnlTdHJpbmcgPSBnZXRQcmltYXJ5S2V5UXVlcnlTdHJpbmcoIG1vZGVsTmFtZSwgaWRzICk7XG5cdFx0cmV0dXJuIGdldEVudGl0aWVzKCBzdGF0ZSwgbW9kZWxOYW1lLCBxdWVyeVN0cmluZyApO1xuXHR9IGNhdGNoICggZSApIHtcblx0XHRyZXR1cm4gREVGQVVMVF9FTVBUWV9BUlJBWTtcblx0fVxufTtcblxuZ2V0RW50aXRpZXNCeUlkcy5jbGVhciA9ICgpID0+IGdldEVudGl0aWVzLmNsZWFyKCk7XG5cbi8qKlxuICogSGVscGVyIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gaWRlbnRpZmllciwgc2VsZWN0b3JOYW1lLCBhbmQgcXVlcnlTdHJpbmdcbiAqIGlzIGJlaW5nIHJlc29sdmVkIG9yIG5vdC5cbiAqXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gaWRlbnRpZmllclxuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yTmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5U3RyaW5nXG4gKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdG9yIGlzIGN1cnJlbnRseSByZXF1ZXN0aW5nIGl0ZW1zLlxuICovXG5mdW5jdGlvbiBpc1JlcXVlc3RpbmcoIHN0YXRlLCBpZGVudGlmaWVyLCBzZWxlY3Rvck5hbWUsIHF1ZXJ5U3RyaW5nICkge1xuXHRhc3NlcnRJbW11dGFibGVPYmplY3RIYXNQYXRoKFxuXHRcdFsgaWRlbnRpZmllciBdLFxuXHRcdHN0YXRlLFxuXHRcdHNwcmludGYoXG5cdFx0XHRfXyhcblx0XHRcdFx0J1RoZSBnaXZlbiBpZGVudGlmaWVyICglcykgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHN0YXRlLicsXG5cdFx0XHRcdCdldmVudF9lc3ByZXNzbycsXG5cdFx0XHQpLFxuXHRcdFx0aWRlbnRpZmllcixcblx0XHQpLFxuXHQpO1xuXHRyZXR1cm4gaXNSZXNvbHZpbmcoIFJFRFVDRVJfS0VZLCBzZWxlY3Rvck5hbWUsIGlkZW50aWZpZXIsIHF1ZXJ5U3RyaW5nICk7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBpdGVtcyBmb3IgdGhlIGdpdmVuIGlkZW50aWZpZXIgYW5kIHF1ZXJ5IHN0cmluZyBhcmUgYmVpbmdcbiAqIHJlcXVlc3RlZC5cbiAqXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB9IHN0YXRlIERhdGEgc3RhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gaWRlbnRpZmllciAgVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBpdGVtcyBiZWluZyByZXF1ZXN0ZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeVN0cmluZyBUaGUgcXVlcnkgc3RyaW5nIGZvciB0aGUgcmVxdWVzdFxuICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciBpdGVtcyBhcmUgYmVpbmcgcmVxdWVzdGVkIG9yIG5vdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVxdWVzdGluZ0l0ZW1zKCBzdGF0ZSwgaWRlbnRpZmllciwgcXVlcnlTdHJpbmcgKSB7XG5cdHJldHVybiBpc1JlcXVlc3RpbmcoIHN0YXRlLCBpZGVudGlmaWVyLCAnZ2V0SXRlbXMnLCBxdWVyeVN0cmluZyApO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciB0aGUgZ2V0IGVudGl0aWVzIHJlcXVlc3QgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgcmVzb2x2ZWRcbiAqIG9yIG5vdC5cbiAqIEBwYXJhbSB7SW1tdXRhYmxlLk1hcH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeVN0cmluZ1xuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBtZWFucyBlbnRpdGllcyAoZm9yIHRoZSBnaXZlbiBtb2RlbCkgYXJlIGJlaW5nXG4gKiByZXF1ZXN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JlcXVlc3RpbmdFbnRpdGllcyhcblx0c3RhdGUsXG5cdG1vZGVsTmFtZSxcblx0cXVlcnlTdHJpbmdcbikge1xuXHRyZXR1cm4gaXNSZXF1ZXN0aW5nKCBzdGF0ZSwgbW9kZWxOYW1lLCAnZ2V0RW50aXRpZXMnLCBxdWVyeVN0cmluZyApO1xufVxuIiwiZXhwb3J0IGNvbnN0IEFDVElPTl9UWVBFUyA9IHtcblx0UkVDRUlWRV9TQ0hFTUFfUkVDT1JEOiAnUkVDRUlWRV9TQ0hFTUFfUkVDT1JEJyxcblx0UkVDRUlWRV9GQUNUT1JZX0ZPUl9NT0RFTDogJ1JFQ0VJVkVfRkFDVE9SWV9GT1JfTU9ERUwnLFxuXHRSRUNFSVZFX1JFTEFUSU9OX0VORFBPSU5UX0ZPUl9NT0RFTF9FTlRJVFk6XG5cdFx0J1JFQ0VJVkVfUkVMQVRJT05fRU5EUE9JTlRfRk9SX01PREVMX0VOVElUWScsXG5cdFJFQ0VJVkVfUkVMQVRJT05fU0NIRU1BOiAnUkVDRUlWRV9SRUxBVElPTl9TQ0hFTUEnLFxufTtcbiIsIi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBBQ1RJT05fVFlQRVMgYXMgdHlwZXMgfSBmcm9tICcuL2FjdGlvbi10eXBlcyc7XG5cbi8qKlxuICogUmV0dXJucyBhbiBhY3Rpb24gb2JqZWN0IHVzZWQgdG8gdXBkYXRlIHRoZSBzdG9yZSB3aXRoIHRoZSBwcm92aWRlZCBzY2hlbWFcbiAqIGZvciB0aGUgcHJvdmlkZWQgbW9kZWxOYW1lLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWFcbiAqIEByZXR1cm4ge3t0eXBlOiBzdHJpbmcsIG1vZGVsTmFtZTogKiwgc2NoZW1hfX0gIFRoZSBhY3Rpb24gb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjZWl2ZVNjaGVtYUZvck1vZGVsKCBtb2RlbE5hbWUsIHNjaGVtYSA9IHt9ICkge1xuXHRyZXR1cm4ge1xuXHRcdHR5cGU6IHR5cGVzLlJFQ0VJVkVfU0NIRU1BX1JFQ09SRCxcblx0XHRtb2RlbE5hbWUsXG5cdFx0c2NoZW1hLFxuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gYWN0aW9uIG9iamVjdCB1c2VkIHRvIHVwZGF0ZSB0aGUgc3RvcmUgd2l0aCB0aGUgcHJvdmlkZWQgbW9kZWxcbiAqIGVudGl0eSBmYWN0b3J5IGZvciB0aGUgcHJvdmlkZWQgbW9kZWxOYW1lLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBmYWN0b3J5XG4gKiBAcmV0dXJuIHt7dHlwZTogc3RyaW5nLCBtb2RlbE5hbWU6IHN0cmluZywgZmFjdG9yeTogT2JqZWN0fX0gQW4gYWN0aW9uXG4gKiBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNlaXZlRmFjdG9yeUZvck1vZGVsKCBtb2RlbE5hbWUsIGZhY3RvcnkgPSB7fSApIHtcblx0cmV0dXJuIHtcblx0XHR0eXBlOiB0eXBlcy5SRUNFSVZFX0ZBQ1RPUllfRk9SX01PREVMLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRmYWN0b3J5LFxuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gYWN0aW9uIG9iamVjdCB1c2VkIHRvIHVwZGF0ZSB0aGUgc3RvcmUgd2l0aCB0aGUgcHJvdmlkZWQgcmVsYXRpb25cbiAqIGVuZHBvaW50IGZvciB0aGUgbW9kZWwgYW5kIGlkLCBhbmQgaXRzIHJlbGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gZW50aXR5SWRcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbk5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmRwb2ludFxuICogQHJldHVybiB7XG4gKiBcdHtcbiAqIFx0XHRtb2RlbE5hbWU6ICosXG4gKiBcdFx0ZW5kcG9pbnQ6ICosXG4gKiBcdFx0cmVsYXRpb25OYW1lOiAqLFxuICogXHRcdGVudGl0eUlkOiAqLFxuICogXHRcdHR5cGU6IHN0cmluZ1xuICogXHR9XG4gKiB9IEFuIGFjdGlvbiBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNlaXZlUmVsYXRpb25FbmRwb2ludEZvck1vZGVsRW50aXR5KFxuXHRtb2RlbE5hbWUsXG5cdGVudGl0eUlkLFxuXHRyZWxhdGlvbk5hbWUsXG5cdGVuZHBvaW50XG4pIHtcblx0cmV0dXJuIHtcblx0XHR0eXBlOiB0eXBlcy5SRUNFSVZFX1JFTEFUSU9OX0VORFBPSU5UX0ZPUl9NT0RFTF9FTlRJVFksXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkLFxuXHRcdHJlbGF0aW9uTmFtZSxcblx0XHRlbmRwb2ludCxcblx0fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlY2VpdmVSZWxhdGlvblNjaGVtYShcblx0bW9kZWxOYW1lLFxuXHRyZWxhdGlvbk5hbWUsXG5cdHJlbGF0aW9uU2NoZW1hXG4pIHtcblx0cmV0dXJuIHtcblx0XHR0eXBlOiB0eXBlcy5SRUNFSVZFX1JFTEFUSU9OX1NDSEVNQSxcblx0XHRtb2RlbE5hbWUsXG5cdFx0cmVsYXRpb25OYW1lLFxuXHRcdHJlbGF0aW9uU2NoZW1hLFxuXHR9O1xufVxuIiwiLyoqXG4gKiBJZGVudGlmaWVyIGtleSBmb3IgdGhpcyBzdG9yZSByZWR1Y2VyLlxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IFJFRFVDRVJfS0VZID0gJ2V2ZW50ZXNwcmVzc28vc2NoZW1hJztcblxuZXhwb3J0IGNvbnN0IEpPSU5fUkVMQVRJT05fVFlQRVMgPSBbXG5cdCdFRV9IQUJUTV9SZWxhdGlvbicsXG5cdCdFRV9IQUJUTV9BbnlfUmVsYXRpb24nLFxuXTtcbiIsIi8qKlxuICogRXh0ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cbmltcG9ydCB7IHJlZ2lzdGVyU3RvcmUgfSBmcm9tICdAd29yZHByZXNzL2RhdGEnO1xuXG4vKipcbiAqIEludGVybmFsIGRlcGVuZGVuY2llc1xuICovXG5pbXBvcnQgeyBSRURVQ0VSX0tFWSB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCAqIGFzIHNlbGVjdG9ycyBmcm9tICcuL3NlbGVjdG9ycyc7XG5pbXBvcnQgKiBhcyBhY3Rpb25zIGZyb20gJy4vYWN0aW9ucyc7XG5pbXBvcnQgKiBhcyByZXNvbHZlcnMgZnJvbSAnLi9yZXNvbHZlcnMnO1xuaW1wb3J0IHJlZHVjZXIgZnJvbSAnLi9yZWR1Y2Vycyc7XG5pbXBvcnQgY29udHJvbHMgZnJvbSAnLi4vYmFzZS1jb250cm9scyc7XG5pbXBvcnQgeyBjcmVhdGVFbnRpdHlTZWxlY3RvcnMsIGNyZWF0ZUVudGl0eVJlc29sdmVycyB9IGZyb20gJy4vbW9kZWwnO1xuXG4vKipcbiAqIENyZWF0ZXMgc3BlY2lmaWMgbW9kZWwgZW50aXR5IHNlbGVjdG9ycyAoZ2V0RmFjdG9yeUZvckV2ZW50IGV0YylcbiAqIEB0eXBlIHtPYmplY3Q8RnVuY3Rpb24+fVxuICovXG5jb25zdCBlbnRpdHlTZWxlY3RvcnMgPSBjcmVhdGVFbnRpdHlTZWxlY3RvcnMoIHNlbGVjdG9ycyApO1xuXG4vKipcbiAqIENyZWF0ZXMgc3BlY2lmaWMgbW9kZWwgZW50aXR5IHJlc29sdmVycyAoZ2V0RmFjdG9yeUZvckV2ZW50IGV0YylcbiAqIEB0eXBlIHtPYmplY3Q8RnVuY3Rpb24+fVxuICovXG5jb25zdCBlbnRpdHlSZXNvbHZlcnMgPSBjcmVhdGVFbnRpdHlSZXNvbHZlcnMoIHJlc29sdmVycyApO1xuXG4vKipcbiAqIFJlZ2lzdHJhdGlvbiBvZiBzdG9yZSBmb3IgZXZlbnRlc3ByZXNzby9zY2hlbWEuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyU3RvcmUoIFJFRFVDRVJfS0VZLCB7XG5cdHJlZHVjZXIsXG5cdGFjdGlvbnMsXG5cdGNvbnRyb2xzLFxuXHRzZWxlY3RvcnM6IHsgLi4uc2VsZWN0b3JzLCAuLi5lbnRpdHlTZWxlY3RvcnMgfSxcblx0cmVzb2x2ZXJzOiB7IC4uLnJlc29sdmVycywgLi4uZW50aXR5UmVzb2x2ZXJzIH0sXG59ICk7XG5cbmV4cG9ydCBjb25zdCBTQ0hFTUFfS0VZID0gUkVEVUNFUl9LRVk7XG4iLCIvKipcbiAqIEV4dGVybmFsIGRlcGVuZGVuY2llc1xuICovXG5pbXBvcnQgeyBNT0RFTF9OQU1FUyB9IGZyb20gJ0BldmVudGVzcHJlc3NvL21vZGVsJztcblxuLyoqXG4gKiBJbnRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqL1xuaW1wb3J0IHsgZ2V0TWV0aG9kTmFtZSB9IGZyb20gJy4uL2Jhc2UtbW9kZWwnO1xuaW1wb3J0IHsgaXNSZXNvbHZpbmcgfSBmcm9tICcuLi9iYXNlLXNlbGVjdG9ycyc7XG5pbXBvcnQgeyBSRURVQ0VSX0tFWSB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBDcmVhdGVzIHNlbGVjdG9ycyBmb3IgZWFjaCByZWdpc3RlcmVkIG1vZGVsIG5hbWUgd3JhcHBpbmcgdGhlIGdlbmVyaWMgc291cmNlXG4gKiBzZWxlY3RvcnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3Q8ZnVuY3Rpb24+fSBzb3VyY2VcbiAqIEByZXR1cm4ge09iamVjdDxmdW5jdGlvbj59IEFsbCB0aGUgZ2VuZXJhdGVkIHNlbGVjdG9ycyBmb3IgZWFjaCBtb2RlbC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUVudGl0eVNlbGVjdG9ycyA9ICggc291cmNlICkgPT4gTU9ERUxfTkFNRVMucmVkdWNlKFxuXHQoIHNlbGVjdG9ycywgbW9kZWxOYW1lICkgPT4ge1xuXHRcdGNvbnN0IHNjaGVtYU1ldGhvZE5hbWUgPSBnZXRNZXRob2ROYW1lKCBtb2RlbE5hbWUsICdzY2hlbWEnLCAnZ2V0JyApO1xuXHRcdGNvbnN0IGZhY3RvcnlNZXRob2ROYW1lID0gZ2V0TWV0aG9kTmFtZSggbW9kZWxOYW1lLCAnZmFjdG9yeScsICdnZXQnICk7XG5cdFx0c2VsZWN0b3JzWyBzY2hlbWFNZXRob2ROYW1lIF0gPSAoXG5cdFx0XHRzdGF0ZVxuXHRcdCkgPT4gc291cmNlLmdldFNjaGVtYUZvck1vZGVsKCBzdGF0ZSwgbW9kZWxOYW1lICk7XG5cdFx0c2VsZWN0b3JzWyBnZXRNZXRob2ROYW1lKCBtb2RlbE5hbWUsICdzY2hlbWEnLCAnaXNSZXF1ZXN0aW5nJyApIF0gPVxuXHRcdFx0KCkgPT4gaXNSZXNvbHZpbmcoIFJFRFVDRVJfS0VZLCBzY2hlbWFNZXRob2ROYW1lICk7XG5cdFx0c2VsZWN0b3JzWyBmYWN0b3J5TWV0aG9kTmFtZSBdID0gKFxuXHRcdFx0c3RhdGVcblx0XHQpID0+IHNvdXJjZS5nZXRGYWN0b3J5Rm9yTW9kZWwoIHN0YXRlLCBtb2RlbE5hbWUgKTtcblx0XHRzZWxlY3RvcnNbIGdldE1ldGhvZE5hbWUoIG1vZGVsTmFtZSwgJ2ZhY3RvcnknLCAnaXNSZXF1ZXN0aW5nJyApIF0gPVxuXHRcdFx0KCkgPT4gaXNSZXNvbHZpbmcoIFJFRFVDRVJfS0VZLCBmYWN0b3J5TWV0aG9kTmFtZSApO1xuXHRcdHJldHVybiBzZWxlY3RvcnM7XG5cdH0sXG5cdHt9XG4pO1xuXG4vKipcbiAqIENyZWF0ZXMgcmVzb2x2ZXJzIGZvciBlYWNoIHJlZ2lzdGVyZWQgbW9kZWwgbmFtZSB3cmFwcGluZyB0aGUgZ2VuZXJpYyBzb3VyY2VcbiAqIHJlc29sdmVycy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdDxmdW5jdGlvbj59IHNvdXJjZVxuICogQHJldHVybiB7T2JqZWN0PGZ1bmN0aW9uPn0gQWxsIHRoZSBnZW5lcmF0ZWQgcmVzb2x2ZXJzIGZvciBlYWNoIG1vZGVsLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlRW50aXR5UmVzb2x2ZXJzID0gKCBzb3VyY2UgKSA9PiBNT0RFTF9OQU1FUy5yZWR1Y2UoXG5cdCggcmVzb2x2ZXJzLCBtb2RlbE5hbWUgKSA9PiB7XG5cdFx0cmVzb2x2ZXJzWyBnZXRNZXRob2ROYW1lKCBtb2RlbE5hbWUsICdzY2hlbWEnLCAnZ2V0JyApIF0gPSAoKSA9PlxuXHRcdFx0c291cmNlLmdldFNjaGVtYUZvck1vZGVsKCBtb2RlbE5hbWUgKTtcblx0XHRyZXNvbHZlcnNbIGdldE1ldGhvZE5hbWUoIG1vZGVsTmFtZSwgJ2ZhY3RvcnknLCAnZ2V0JyApIF0gPSAoKSA9PlxuXHRcdFx0c291cmNlLmdldEZhY3RvcnlGb3JNb2RlbCggbW9kZWxOYW1lICk7XG5cdFx0cmV0dXJuIHJlc29sdmVycztcblx0fSxcblx0e31cbik7XG4iLCIvKipcbiAqIEV4dGVybmFsIGRlcGVuZGVuY2llc1xuICovXG5pbXBvcnQgeyBjb21iaW5lUmVkdWNlcnMgfSBmcm9tICdAd29yZHByZXNzL2RhdGEnO1xuaW1wb3J0IHsgbm9ybWFsaXplRW50aXR5SWQgfSBmcm9tICdAZXZlbnRlc3ByZXNzby9oZWxwZXJzJztcbmltcG9ydCB7XG5cdHBsdXJhbE1vZGVsTmFtZSxcblx0REVGQVVMVF9TQ0hFTUFfU1RBVEUsXG5cdHNpbmd1bGFyTW9kZWxOYW1lLFxufSBmcm9tICdAZXZlbnRlc3ByZXNzby9tb2RlbCc7XG5pbXBvcnQge1xuXHRpc1NjaGVtYVJlc3BvbnNlT2ZNb2RlbCxcblx0aXNNb2RlbEVudGl0eUZhY3RvcnlPZk1vZGVsLFxufSBmcm9tICdAZXZlbnRlc3ByZXNzby92YWxpZGF0b3JzJztcbmltcG9ydCB7IGZyb21KUywgTWFwIH0gZnJvbSAnaW1tdXRhYmxlJztcbmltcG9ydCBpc1NoYWxsb3dFcXVhbCBmcm9tICdAd29yZHByZXNzL2lzLXNoYWxsb3ctZXF1YWwnO1xuXG4vKipcbiAqIEludGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgQUNUSU9OX1RZUEVTIGFzIHR5cGVzIH0gZnJvbSAnLi9hY3Rpb24tdHlwZXMnO1xuLyoqXG4gKiBSZWR1Y2VyIGZvciBhIG1vZGVsIHNjaGVtYS5cbiAqIEBwYXJhbSB7TWFwfSBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblxuICogQHJldHVybiB7TWFwfSBUaGUgbmV3IChvciBvcmlnaW5hbCkgc3RhdGUuXG4gKi9cbmV4cG9ydCBjb25zdCByZWNlaXZlU2NoZW1hID0gKFxuXHRzdGF0ZSA9IGZyb21KUyggREVGQVVMVF9TQ0hFTUFfU1RBVEUuc2NoZW1hICksXG5cdGFjdGlvblxuKSA9PiB7XG5cdGNvbnN0IHsgdHlwZSwgc2NoZW1hIH0gPSBhY3Rpb247XG5cdHRyeSB7XG5cdFx0Y29uc3QgbW9kZWxOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIGFjdGlvbi5tb2RlbE5hbWUgKTtcblx0XHRpZiAoXG5cdFx0XHRpc1NjaGVtYVJlc3BvbnNlT2ZNb2RlbCggc2NoZW1hLCBtb2RlbE5hbWUgKSAmJlxuXHRcdFx0dHlwZSA9PT0gdHlwZXMuUkVDRUlWRV9TQ0hFTUFfUkVDT1JEXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gc3RhdGUuc2V0KCBtb2RlbE5hbWUsIHNjaGVtYSApO1xuXHRcdH1cblx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0cmV0dXJuIHN0YXRlO1xuXHR9XG5cdHJldHVybiBzdGF0ZTtcbn07XG5cbi8qKlxuICogUmVkdWNlciBmb3IgYSBtb2RlbCBmYWN0b3J5XG4gKiBAcGFyYW0ge01hcH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEByZXR1cm4ge01hcH0gdGhlIG5ldyAob3Igb3JpZ2luYWwpIHN0YXRlLlxuICovXG5leHBvcnQgY29uc3QgcmVjZWl2ZUZhY3RvcnkgPSAoXG5cdHN0YXRlID0gZnJvbUpTKCBERUZBVUxUX1NDSEVNQV9TVEFURS5mYWN0b3J5ICksXG5cdGFjdGlvblxuKSA9PiB7XG5cdGNvbnN0IHsgdHlwZSwgZmFjdG9yeSB9ID0gYWN0aW9uO1xuXHR0cnkge1xuXHRcdGNvbnN0IG1vZGVsTmFtZSA9IHNpbmd1bGFyTW9kZWxOYW1lKCBhY3Rpb24ubW9kZWxOYW1lICk7XG5cdFx0aWYgKFxuXHRcdFx0aXNNb2RlbEVudGl0eUZhY3RvcnlPZk1vZGVsKCBmYWN0b3J5LCBtb2RlbE5hbWUgKSAmJlxuXHRcdFx0dHlwZSA9PT0gdHlwZXMuUkVDRUlWRV9GQUNUT1JZX0ZPUl9NT0RFTFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHN0YXRlLnNldCggbW9kZWxOYW1lLCBmYWN0b3J5ICk7XG5cdFx0fVxuXHR9IGNhdGNoICggZSApIHtcblx0XHRyZXR1cm4gc3RhdGU7XG5cdH1cblx0cmV0dXJuIHN0YXRlO1xufTtcblxuLyoqXG4gKiBSZWR1Y2VyIGZvciByZWxhdGlvbiBlbmRwb2ludHMuXG4gKlxuICogQHBhcmFtIHtNYXB9c3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEByZXR1cm4ge01hcH0gTmV3IG9yIG9yaWdpbmFsIHN0YXRlLlxuICovXG5leHBvcnQgY29uc3QgcmVjZWl2ZVJlbGF0aW9uRW5kcG9pbnRGb3JFbnRpdHkgPSAoXG5cdHN0YXRlID0gZnJvbUpTKCBERUZBVUxUX1NDSEVNQV9TVEFURS5yZWxhdGlvbkVuZHBvaW50cyApLFxuXHRhY3Rpb25cbikgPT4ge1xuXHR0cnkge1xuXHRcdGNvbnN0IHsgdHlwZSwgZW50aXR5SWQsIGVuZHBvaW50IH0gPSBhY3Rpb247XG5cdFx0Y29uc3QgbW9kZWxOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIGFjdGlvbi5tb2RlbE5hbWUgKTtcblx0XHRjb25zdCByZWxhdGlvbk5hbWUgPSBwbHVyYWxNb2RlbE5hbWUoIGFjdGlvbi5yZWxhdGlvbk5hbWUgKTtcblx0XHRpZiAoIHR5cGUgPT09IHR5cGVzLlJFQ0VJVkVfUkVMQVRJT05fRU5EUE9JTlRfRk9SX01PREVMX0VOVElUWSApIHtcblx0XHRcdHJldHVybiBzdGF0ZS5zZXRJbihcblx0XHRcdFx0WyBtb2RlbE5hbWUsIG5vcm1hbGl6ZUVudGl0eUlkKCBlbnRpdHlJZCApLCByZWxhdGlvbk5hbWUgXSxcblx0XHRcdFx0ZW5kcG9pbnRcblx0XHRcdCk7XG5cdFx0fVxuXHR9IGNhdGNoICggZSApIHtcblx0XHRyZXR1cm4gc3RhdGU7XG5cdH1cblx0cmV0dXJuIHN0YXRlO1xufTtcblxuLyoqXG4gKiBSZWR1Y2VyIGZvciByZWxhdGlvbiBzY2hlbWFcbiAqXG4gKiBAcGFyYW0ge01hcH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEByZXR1cm4ge01hcH0gTmV3IG9yIG9yaWdpbmFsIHN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCByZWNlaXZlUmVsYXRpb25TY2hlbWEgPSAoIHN0YXRlID0gTWFwKCksIGFjdGlvbiApID0+IHtcblx0aWYgKCBhY3Rpb24udHlwZSA9PT0gdHlwZXMuUkVDRUlWRV9SRUxBVElPTl9TQ0hFTUEgKSB7XG5cdFx0Y29uc3QgbW9kZWxOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIGFjdGlvbi5tb2RlbE5hbWUgKTtcblx0XHRjb25zdCByZWxhdGlvbk5hbWUgPSBwbHVyYWxNb2RlbE5hbWUoIGFjdGlvbi5yZWxhdGlvbk5hbWUgKTtcblx0XHRpZiAoIGlzU2hhbGxvd0VxdWFsKFxuXHRcdFx0c3RhdGUuZ2V0SW4oIFsgbW9kZWxOYW1lLCByZWxhdGlvbk5hbWUgXSwge30gKSxcblx0XHRcdGFjdGlvbi5yZWxhdGlvblNjaGVtYSxcblx0XHQpICkge1xuXHRcdFx0cmV0dXJuIHN0YXRlO1xuXHRcdH1cblx0XHRyZXR1cm4gc3RhdGUuc2V0SW4oXG5cdFx0XHRbIG1vZGVsTmFtZSwgcmVsYXRpb25OYW1lIF0sXG5cdFx0XHRhY3Rpb24ucmVsYXRpb25TY2hlbWFcblx0XHQpO1xuXHR9XG5cdHJldHVybiBzdGF0ZTtcbn07XG5cbi8qKlxuICogQmUgYXdhcmUgdGhhdCB0aGUgcm9vdCBzdGF0ZSBpcyBhIHBsYWluIG9iamVjdCBidXQgZWFjaCBzbGljZSAoJ3NjaGVtYScsXG4gKiAnZmFjdG9yeScsICdyZWxhdGlvbkVuZHBvaW50cycpIGlzIGFuIGltbXV0YWJsZSBNYXAuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNvbWJpbmVSZWR1Y2Vycygge1xuXHRzY2hlbWE6IHJlY2VpdmVTY2hlbWEsXG5cdGZhY3Rvcnk6IHJlY2VpdmVGYWN0b3J5LFxuXHRyZWxhdGlvbkVuZHBvaW50czogcmVjZWl2ZVJlbGF0aW9uRW5kcG9pbnRGb3JFbnRpdHksXG5cdHJlbGF0aW9uU2NoZW1hOiByZWNlaXZlUmVsYXRpb25TY2hlbWEsXG59ICk7XG4iLCIvKipcbiAqIEV4dGVybmFsIGRlcGVuZGVuY2llc1xuICovXG5pbXBvcnQge1xuXHRpc1NjaGVtYVJlc3BvbnNlT2ZNb2RlbCxcblx0aXNNb2RlbEVudGl0eSxcbn0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vdmFsaWRhdG9ycyc7XG5pbXBvcnQge1xuXHRnZXRFbmRwb2ludCxcblx0c3RyaXBCYXNlUm91dGVGcm9tVXJsLFxuXHRjcmVhdGVFbnRpdHlGYWN0b3J5LFxuXHRNT0RFTF9QUkVGSVhFUyxcblx0cGx1cmFsTW9kZWxOYW1lLFxuXHRzaW5ndWxhck1vZGVsTmFtZSxcbn0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vbW9kZWwnO1xuaW1wb3J0IHsgaXNVbmRlZmluZWQgfSBmcm9tICdsb2Rhc2gnO1xuXG4vKipcbiAqIEludGVybmFsIGRlcGVuZGVuY2llc1xuICovXG5pbXBvcnQge1xuXHRyZWNlaXZlU2NoZW1hRm9yTW9kZWwsXG5cdHJlY2VpdmVGYWN0b3J5Rm9yTW9kZWwsXG5cdHJlY2VpdmVSZWxhdGlvbkVuZHBvaW50Rm9yTW9kZWxFbnRpdHksXG5cdHJlY2VpdmVSZWxhdGlvblNjaGVtYSxcbn0gZnJvbSAnLi9hY3Rpb25zJztcbmltcG9ydCB7IGZldGNoLCByZXNvbHZlU2VsZWN0IH0gZnJvbSAnLi4vYmFzZS1jb250cm9scyc7XG5pbXBvcnQgeyBSRURVQ0VSX0tFWSBhcyBDT1JFX1JFRFVDRVJfS0VZIH0gZnJvbSAnLi4vY29yZS9jb25zdGFudHMnO1xuaW1wb3J0IHtcblx0UkVEVUNFUl9LRVkgYXMgU0NIRU1BX1JFRFVDRVJfS0VZLFxuXHRKT0lOX1JFTEFUSU9OX1RZUEVTLFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbi8qKlxuICogQSByZXNvbHZlciBmb3IgZ2V0dGluZyB0aGUgc2NoZW1hIGZvciBhIGdpdmVuIG1vZGVsIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHJpZXZlZCBzY2hlbWEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiogZ2V0U2NoZW1hRm9yTW9kZWwoIG1vZGVsTmFtZSApIHtcblx0Y29uc3QgcGF0aCA9IGdldEVuZHBvaW50KCBzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lICkgKTtcblx0Y29uc3Qgc2NoZW1hID0geWllbGQgZmV0Y2goIHsgcGF0aCwgbWV0aG9kOiAnT1BUSU9OUycgfSApO1xuXHR5aWVsZCByZWNlaXZlU2NoZW1hRm9yTW9kZWwoIG1vZGVsTmFtZSwgc2NoZW1hICk7XG5cdHJldHVybiBzY2hlbWE7XG59XG5cbi8qKlxuICogQSByZXNvbHZlciBmb3IgZ2V0dGluZyB0aGUgbW9kZWwgZW50aXR5IGZhY3RvcnkgZm9yIGEgZ2l2ZW4gbW9kZWwgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWFcbiAqIEByZXR1cm4ge09iamVjdHxudWxsfSByZXRyaWV2ZWQgZmFjdG9yeVxuICovXG5leHBvcnQgZnVuY3Rpb24qIGdldEZhY3RvcnlGb3JNb2RlbCggbW9kZWxOYW1lLCBzY2hlbWEgPSB7fSApIHtcblx0aWYgKCAhIGlzU2NoZW1hUmVzcG9uc2VPZk1vZGVsKCBzY2hlbWEsIG1vZGVsTmFtZSApICkge1xuXHRcdHNjaGVtYSA9IHlpZWxkIHJlc29sdmVTZWxlY3QoXG5cdFx0XHRTQ0hFTUFfUkVEVUNFUl9LRVksXG5cdFx0XHQnZ2V0U2NoZW1hRm9yTW9kZWwnLFxuXHRcdFx0bW9kZWxOYW1lXG5cdFx0KTtcblx0fVxuXHRpZiAoICEgaXNTY2hlbWFSZXNwb25zZU9mTW9kZWwoIHNjaGVtYSwgbW9kZWxOYW1lICkgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0Y29uc3QgZmFjdG9yeSA9IGNyZWF0ZUVudGl0eUZhY3RvcnkoXG5cdFx0bW9kZWxOYW1lLFxuXHRcdHNjaGVtYS5zY2hlbWEsXG5cdFx0TU9ERUxfUFJFRklYRVMoIG1vZGVsTmFtZSApXG5cdCk7XG5cdHlpZWxkIHJlY2VpdmVGYWN0b3J5Rm9yTW9kZWwoIG1vZGVsTmFtZSwgZmFjdG9yeSApO1xuXHRyZXR1cm4gZmFjdG9yeTtcbn1cblxuLyoqXG4gKiBBIHJlc29sdmVyIGZvciBnZXR0aW5nIHRoZSByZWxhdGlvbiBlbmRwb2ludCBmb3IgYSBnaXZlbiBtb2RlbCwgaXQncyBpZCwgYW5kXG4gKiB0aGUgcmVxdWVzdGVkIHJlbGF0aW9uLlxuICpcbiAqIFRoZSBFRSBSRVNUIGFwaSBuYW1lcyByZWxhdGlvbnMgYWNjb3JkaW5nIHRvIHdoZXRoZXIgdGhleSB0aGVyZSBhcmUgc2luZ3VsYXJcbiAqIG9yIHBsdXJhbCByZWxhdGlvbnMgb24gYSBnaXZlbiBtb2RlbCAoZWcuIFJlZ2lzdHJhdGlvbnMgaGF2ZSBvbmUgZXZlbnRcbiAqIHJlbGF0aW9uLCBidXQgRXZlbnRzIGNhbiBoYXZlIG11bHRpcGxlIGRhdGV0aW1lcykuICBUaGlzIG1lYW5zIHRoZSBvbmx5IHdheVxuICogdG8gZGVyaXZlIGFuIGFjY3VyYXRlIGVuZHBvaW50IGZvciBhIGdpdmVuIHJlbGF0aW9uIHJlcXVlc3Qgb24gYW4gZW50aXR5IGlzXG4gKiB0byByZXRyaWV2ZSB0aGUgZW50aXR5IGZyb20gdGhlIHJlc291cmNlIGFuZCBkZXJpdmUgdGhlIGVuZHBvaW50IGZyb20gdGhlXG4gKiBsaW5rcyBpbiB0aGUgcmVzcG9uc2UuXG4gKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbnRpdHlJZFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uTW9kZWxOYW1lXG4gKiBAcmV0dXJuIHtJdGVyYWJsZUl0ZXJhdG9yPCo+fHN0cmluZ30gQSBnZW5lcmF0b3Igb3IgdGhlIGRlcml2ZWQgZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiogZ2V0UmVsYXRpb25FbmRwb2ludEZvckVudGl0eUlkKFxuXHRtb2RlbE5hbWUsXG5cdGVudGl0eUlkLFxuXHRyZWxhdGlvbk1vZGVsTmFtZVxuKSB7XG5cdC8vIGZpcnN0IGF0dGVtcHQgdG8gZ2V0IHRoZSByZWxhdGlvbiBlbmRwb2ludCBmcm9tIHRoZSBlbnRpdHkgdGhhdCBtaWdodFxuXHQvLyBhbHJlYWR5IGJlIGluIGNvcmUgc3RhdGUuXG5cdGNvbnN0IGVudGl0eSA9IHlpZWxkIHJlc29sdmVTZWxlY3QoXG5cdFx0Q09SRV9SRURVQ0VSX0tFWSxcblx0XHQnZ2V0RW50aXR5QnlJZCcsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdGVudGl0eUlkXG5cdCk7XG5cdGNvbnN0IHBsdXJhbFJlbGF0aW9uTmFtZSA9IHBsdXJhbE1vZGVsTmFtZSggcmVsYXRpb25Nb2RlbE5hbWUgKTtcblx0bGV0IGVuZHBvaW50ID0gJyc7XG5cdGlmICggaXNNb2RlbEVudGl0eSggZW50aXR5ICkgJiYgZW50aXR5WyBwbHVyYWxSZWxhdGlvbk5hbWUgKyAnUmVzb3VyY2UnIF0gKSB7XG5cdFx0ZW5kcG9pbnQgPSBzdHJpcEJhc2VSb3V0ZUZyb21VcmwoXG5cdFx0XHRlbnRpdHlbIHBsdXJhbFJlbGF0aW9uTmFtZSArICdSZXNvdXJjZScgXS5yZXNvdXJjZUxpbmtcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goXG5cdFx0XHR7XG5cdFx0XHRcdHBhdGg6IGdldEVuZHBvaW50KCBtb2RlbE5hbWUgKSArICcvJyArIGVudGl0eUlkLFxuXHRcdFx0fVxuXHRcdCk7XG5cdFx0aWYgKCAhIHJlc3BvbnNlLl9saW5rcyApIHtcblx0XHRcdHJldHVybiAnJztcblx0XHR9XG5cdFx0Y29uc3QgbGlua3MgPSByZXNwb25zZS5fbGlua3MgfHwge307XG5cdFx0Y29uc3QgYmFzZVJlbGF0aW9uUGF0aCA9ICdodHRwczovL2FwaS5ldmVudGVzcHJlc3NvLmNvbS8nO1xuXHRcdGVuZHBvaW50ID0gbGlua3NbXG5cdFx0XHRiYXNlUmVsYXRpb25QYXRoICsgc2luZ3VsYXJNb2RlbE5hbWUoIHJlbGF0aW9uTW9kZWxOYW1lIClcblx0XHRdIHx8ICcnO1xuXHRcdGVuZHBvaW50ID0gKCBlbmRwb2ludCA9PT0gJycgJiYgbGlua3NbXG5cdFx0XHRiYXNlUmVsYXRpb25QYXRoICsgcGx1cmFsUmVsYXRpb25OYW1lXG5cdFx0XSApIHx8IGVuZHBvaW50O1xuXHR9XG5cdGlmICggZW5kcG9pbnQgKSB7XG5cdFx0eWllbGQgcmVjZWl2ZVJlbGF0aW9uRW5kcG9pbnRGb3JNb2RlbEVudGl0eShcblx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdGVudGl0eUlkLFxuXHRcdFx0cmVsYXRpb25Nb2RlbE5hbWUsXG5cdFx0XHRlbmRwb2ludFxuXHRcdCk7XG5cdH1cblx0cmV0dXJuIGVuZHBvaW50O1xufVxuXG4vKipcbiAqIEEgcmVzb2x2ZXIgZm9yIHJldHVybmluZyB3aGV0aGVyIHRoZSBnaXZlbiBtb2RlbE5hbWUgYW5kIHJlbGF0aW9uTmFtZSBoYXZlXG4gKiBhIGpvaW4gdGFibGUgZm9yIHJlcHJlc2VudGluZyB0aGVpciByZWxhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25OYW1lXG4gKiBAcmV0dXJuIHtib29sZWFufSAgVHJ1ZSBtZWFucyB0aGVyZSBpcyBhIGpvaW4gdGFibGUsIGZhbHNlIG1lYW5zIHRoZXJlIGlzbid0LlxuICovXG5leHBvcnQgZnVuY3Rpb24qIGhhc0pvaW5UYWJsZVJlbGF0aW9uKCBtb2RlbE5hbWUsIHJlbGF0aW9uTmFtZSApIHtcblx0Y29uc3QgcmVsYXRpb25UeXBlID0geWllbGQgcmVzb2x2ZVNlbGVjdChcblx0XHRTQ0hFTUFfUkVEVUNFUl9LRVksXG5cdFx0J2dldFJlbGF0aW9uVHlwZScsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdHJlbGF0aW9uTmFtZSxcblx0KTtcblx0cmV0dXJuIEpPSU5fUkVMQVRJT05fVFlQRVMuaW5kZXhPZiggcmVsYXRpb25UeXBlICkgPiAtMTtcbn1cblxuLyoqXG4gKiBBIHJlc29sdmVyIGZvciBnZXR0aW5nIHRoZSByZWxhdGlvbiB0eXBlIGRlc2NyaWJpbmcgdGhlIHJlbGF0aW9uIGJldHdlZW5cbiAqIG1vZGVsTmFtZSBhbmQgcmVsYXRpb25OYW1lXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uTmFtZVxuICogQHJldHVybiB7c3RyaW5nfSAgVGhlIHJlbGF0aW9uIHR5cGUgdG8gZGVzY3JpYmUgdGhlIHJlbGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiogZ2V0UmVsYXRpb25UeXBlKCBtb2RlbE5hbWUsIHJlbGF0aW9uTmFtZSApIHtcblx0Y29uc3QgcmVsYXRpb25TY2hlbWEgPSB5aWVsZCByZXNvbHZlU2VsZWN0KFxuXHRcdFNDSEVNQV9SRURVQ0VSX0tFWSxcblx0XHQnZ2V0UmVsYXRpb25TY2hlbWEnLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRyZWxhdGlvbk5hbWVcblx0KTtcblx0cmV0dXJuIHJlbGF0aW9uU2NoZW1hICE9PSBudWxsID8gcmVsYXRpb25TY2hlbWEucmVsYXRpb25fdHlwZSA6ICcnO1xufVxuXG4vKipcbiAqIEEgcmVzb2x2ZXIgZm9yIHJldHJpZXZpbmcgdGhlIHJlbGF0aW9uIHNjaGVtYSBmcm9tIHRoZSBzZXJ2ZXIgZm9yIHRoZSBnaXZlblxuICogbW9kZWxOYW1lIGFuZCByZWxhdGlvbk5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uTmFtZVxuICogQHRocm93cyBFcnJvclxuICovXG5leHBvcnQgZnVuY3Rpb24qIGdldFJlbGF0aW9uU2NoZW1hKCBtb2RlbE5hbWUsIHJlbGF0aW9uTmFtZSApIHtcblx0bW9kZWxOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRjb25zdCBwbHVyYWxSZWxhdGlvbk5hbWUgPSBwbHVyYWxNb2RlbE5hbWUoIHJlbGF0aW9uTmFtZSApO1xuXHRjb25zdCBzaW5ndWxhclJlbGF0aW9uTmFtZSA9IHNpbmd1bGFyTW9kZWxOYW1lKCByZWxhdGlvbk5hbWUgKTtcblx0Y29uc3Qgc2NoZW1hID0geWllbGQgcmVzb2x2ZVNlbGVjdChcblx0XHRTQ0hFTUFfUkVEVUNFUl9LRVksXG5cdFx0J2dldFNjaGVtYUZvck1vZGVsJyxcblx0XHRtb2RlbE5hbWVcblx0KTtcblx0aWYgKCBzY2hlbWEgPT09IG51bGwgKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0J1RoZSAnICsgbW9kZWxOYW1lICsgJyBkb2VzIG5vdCBoYXZlIGEgc2NoZW1hJ1xuXHRcdCk7XG5cdH1cblx0Ly8gaXMgdGhlcmUgYSBzY2hlbWEgZm9yIHBsdXJhbCByZWxhdGlvbiBuYW1lP1xuXHRsZXQgdHlwZVNjaGVtYSA9IHNjaGVtYS5zY2hlbWEucHJvcGVydGllc1sgcGx1cmFsUmVsYXRpb25OYW1lIF0gfHwgbnVsbDtcblx0dHlwZVNjaGVtYSA9IHR5cGVTY2hlbWEgPT09IG51bGwgJiZcblx0XHQhIGlzVW5kZWZpbmVkKCBzY2hlbWEuc2NoZW1hLnByb3BlcnRpZXNbIHNpbmd1bGFyUmVsYXRpb25OYW1lIF0gKSA/XG5cdFx0c2NoZW1hLnNjaGVtYS5wcm9wZXJ0aWVzWyBzaW5ndWxhclJlbGF0aW9uTmFtZSBdIDpcblx0XHR0eXBlU2NoZW1hO1xuXHRpZiAoIHR5cGVTY2hlbWEgPT09IG51bGwgKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0J1RoZXJlIGlzIG5vIHJlbGF0aW9uIGZvciAnICsgcmVsYXRpb25OYW1lICsgJyBvbiB0aGUgJyArXG5cdFx0XHQnbW9kZWwgJyArIG1vZGVsTmFtZVxuXHRcdCk7XG5cdH1cblx0eWllbGQgcmVjZWl2ZVJlbGF0aW9uU2NoZW1hKFxuXHRcdG1vZGVsTmFtZSxcblx0XHRyZWxhdGlvbk5hbWUsXG5cdFx0dHlwZVNjaGVtYVxuXHQpO1xufVxuIiwiLyoqXG4gKiBJbnRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqL1xuaW1wb3J0IHsgaXNSZXNvbHZpbmcsIGhhc0ZpbmlzaGVkUmVzb2x2aW5nIH0gZnJvbSAnLi4vYmFzZS1zZWxlY3RvcnMnO1xuaW1wb3J0IHsgUkVEVUNFUl9LRVksIEpPSU5fUkVMQVRJT05fVFlQRVMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBNYXAgfSBmcm9tICdpbW11dGFibGUnO1xuXG4vKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgcGx1cmFsTW9kZWxOYW1lLCBzaW5ndWxhck1vZGVsTmFtZSB9IGZyb20gJ0BldmVudGVzcHJlc3NvL21vZGVsJztcbmltcG9ydCB7IG5vcm1hbGl6ZUVudGl0eUlkIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vaGVscGVycyc7XG5cbi8qKlxuICogU2VsZWN0b3IgZm9yIHJldHVybmluZyB0aGUgc2NoZW1hIG9iamVjdCBmb3IgYSBnaXZlbiBtb2RlbCBuYW1lIGZyb20gdGhlXG4gKiBzdGF0ZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgc2NoZW1hIG9iamVjdCBvciBudWxsIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2hlbWFGb3JNb2RlbCggc3RhdGUsIG1vZGVsTmFtZSApIHtcblx0cmV0dXJuIHN0YXRlLnNjaGVtYS5nZXQoIHNpbmd1bGFyTW9kZWxOYW1lKCBtb2RlbE5hbWUgKSwgbnVsbCApO1xufVxuXG4vKipcbiAqIFNlbGVjdG9yIGZvciByZXR1cm5pbmcgd2hldGhlciB0aGUgc2NoZW1hIGlzIGJlaW5nIHJlcXVlc3RlZCBvciBub3QgZm9yIHRoZVxuICogZ2l2ZW4gbW9kZWwgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEByZXR1cm4ge2Jvb2xlYW59ICBUcnVlIG1lYW5zIGl0cyBiZWluZyByZXF1ZXN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JlcXVlc3RpbmdTY2hlbWFGb3JNb2RlbCggc3RhdGUsIG1vZGVsTmFtZSApIHtcblx0cmV0dXJuIGlzUmVzb2x2aW5nKFxuXHRcdFJFRFVDRVJfS0VZLFxuXHRcdCdnZXRTY2hlbWFGb3JNb2RlbCcsXG5cdFx0c2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApXG5cdCk7XG59XG5cbi8qKlxuICogU2VsZWN0b3IgZm9yIHJldHVybmluZyB3aGV0aGVyIHRoZSBzY2hlbWEgaGFzIGJlZW4gcmVzb2x2ZWQgb3Igbm90IGZvciB0aGVcbiAqIGdpdmVuIG1vZGVsIG5hbWUuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgbWVhbnMgdGhhdCB0aGUgc2NoZW1hIGhhcyBmaW5pc2hlZCByZXNvbHZpbmcgZm9yIHRoaXNcbiAqIG1vZGVsIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNSZXNvbHZlZFNjaGVtYUZvck1vZGVsKCBzdGF0ZSwgbW9kZWxOYW1lICkge1xuXHRyZXR1cm4gaGFzRmluaXNoZWRSZXNvbHZpbmcoXG5cdFx0UkVEVUNFUl9LRVksXG5cdFx0J2dldFNjaGVtYUZvck1vZGVsJyxcblx0XHRzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lIClcblx0KTtcbn1cblxuLyoqXG4gKiBTZWxlY3RvciBmb3IgcmV0dXJuaW5nIHRoZSBtb2RlbCBlbnRpdHkgZmFjdG9yeSBvYmplY3QgZm9yIGEgZ2l2ZW5cbiAqIG1vZGVsIG5hbWUgZnJvbSB0aGUgc3RhdGUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgdGhlIG1vZGVsIGVudGl0eSBmYWN0b3J5IG9yIG51bGwgaWYgaXQgZG9lc24ndFxuICogZXhpc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGYWN0b3J5Rm9yTW9kZWwoIHN0YXRlLCBtb2RlbE5hbWUgKSB7XG5cdGNvbnN0IGZhY3RvcnkgPSBzdGF0ZS5mYWN0b3J5LmdldCggc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApLCBudWxsICk7XG5cdHJldHVybiAhICggZmFjdG9yeSBpbnN0YW5jZW9mIE1hcCApID8gZmFjdG9yeSA6IG51bGw7XG59XG5cbi8qKlxuICogU2VsZWN0b3IgZm9yIHJldHVybmluZyB3aGV0aGVyIHRoZSBtb2RlbCBlbnRpdHkgZmFjdG9yeSBpcyBiZWluZyByZXF1ZXN0ZWRcbiAqIG9yIG5vdCBmb3IgdGhlIGdpdmVuIG1vZGVsIG5hbWUgZnJvbSB0aGUgc3RhdGUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcmV0dXJuIHtib29sZWFufSAgVHJ1ZSBtZWFucyBpdCBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JlcXVlc3RpbmdGYWN0b3J5Rm9yTW9kZWwoIHN0YXRlLCBtb2RlbE5hbWUgKSB7XG5cdHJldHVybiBpc1Jlc29sdmluZyhcblx0XHRSRURVQ0VSX0tFWSxcblx0XHQnZ2V0RmFjdG9yeUZvck1vZGVsJyxcblx0XHRzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lIClcblx0KTtcbn1cblxuLyoqXG4gKiBTZWxlY3RvciBmb3IgcmV0dXJuaW5nIHdoZXRoZXIgdGhlIGZhY3RvcnkgaGFzIGJlZW4gcmVzb2x2ZWQgb3Igbm90IGZvciB0aGVcbiAqIGdpdmVuIG1vZGVsIG5hbWUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIG1lYW5zIHRoYXQgdGhlIGZhY3RvcnkgaGFzIGZpbmlzaGVkIHJlc29sdmluZyBmb3IgdGhpc1xuICogbW9kZWwgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1Jlc29sdmVkRmFjdG9yeUZvck1vZGVsKCBzdGF0ZSwgbW9kZWxOYW1lICkge1xuXHRyZXR1cm4gaGFzRmluaXNoZWRSZXNvbHZpbmcoXG5cdFx0UkVEVUNFUl9LRVksXG5cdFx0J2dldEZhY3RvcnlGb3JNb2RlbCcsXG5cdFx0c2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApXG5cdCk7XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSByZWxhdGlvbiBlbmRwb2ludCBmb3IgdGhlIGdpdmVuIG1vZGVsLCBlbnRpdHkgaWQgYW5kIHJlbGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBlbnRpdHlJZFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uTW9kZWxOYW1lXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFJldHVybnMgdGhlIHJlbGF0aW9uIGVuZHBvaW50IGlmIGF2YWlsYWJsZSBvciBhbiBlbXB0eVxuICogc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVsYXRpb25FbmRwb2ludEZvckVudGl0eUlkKFxuXHRzdGF0ZSxcblx0bW9kZWxOYW1lLFxuXHRlbnRpdHlJZCxcblx0cmVsYXRpb25Nb2RlbE5hbWVcbikge1xuXHRtb2RlbE5hbWUgPSBzaW5ndWxhck1vZGVsTmFtZSggbW9kZWxOYW1lICk7XG5cdHJlbGF0aW9uTW9kZWxOYW1lID0gcGx1cmFsTW9kZWxOYW1lKCByZWxhdGlvbk1vZGVsTmFtZSApO1xuXHRlbnRpdHlJZCA9IG5vcm1hbGl6ZUVudGl0eUlkKCBlbnRpdHlJZCApO1xuXHRyZXR1cm4gc3RhdGUucmVsYXRpb25FbmRwb2ludHMuZ2V0SW4oXG5cdFx0WyBtb2RlbE5hbWUsIGVudGl0eUlkLCByZWxhdGlvbk1vZGVsTmFtZSBdXG5cdCkgfHwgJyc7XG59XG5cbi8qKlxuICogU2VsZWN0b3IgZm9yIHJldHVybmluZyB3aGV0aGVyIHRoZSByZWxhdGlvbiBlbmRwb2ludCBpcyBiZWluZyByZXF1ZXN0ZWRcbiAqIG9yIG5vdCBmb3IgdGhlIGdpdmVuIG1vZGVsIG5hbWUsIGVudGl0eSBpZCwgYW5kIHJlbGF0aW9uIGZyb20gdGhlIHN0YXRlLlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IGVudGl0eUlkXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25Nb2RlbE5hbWVcbiAqIEByZXR1cm4ge2Jvb2xlYW59ICBUcnVlIG1lYW5zIGl0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVxdWVzdGluZ1JlbGF0aW9uRW5kcG9pbnRGb3JFbnRpdHlJZChcblx0c3RhdGUsXG5cdG1vZGVsTmFtZSxcblx0ZW50aXR5SWQsXG5cdHJlbGF0aW9uTW9kZWxOYW1lXG4pIHtcblx0bW9kZWxOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRlbnRpdHlJZCA9IG5vcm1hbGl6ZUVudGl0eUlkKCBlbnRpdHlJZCApO1xuXHRyZWxhdGlvbk1vZGVsTmFtZSA9IHBsdXJhbE1vZGVsTmFtZSggcmVsYXRpb25Nb2RlbE5hbWUgKTtcblx0cmV0dXJuIGlzUmVzb2x2aW5nKFxuXHRcdFJFRFVDRVJfS0VZLFxuXHRcdCdnZXRSZWxhdGlvbkVuZHBvaW50Rm9yRW50aXR5SWQnLFxuXHRcdG1vZGVsTmFtZSxcblx0XHRlbnRpdHlJZCxcblx0XHRyZWxhdGlvbk1vZGVsTmFtZSxcblx0KTtcbn1cblxuLyoqXG4gKiBTZWxlY3RvciByZXR1cm5pbmcgd2hldGhlciB0aGUgcmVsYXRpb24gYmV0d2VlbiB0aGUgZ2l2ZW4gbW9kZWwgbmFtZSBhbmRcbiAqIHJlbGF0aW9uIG5hbWUgaGFzIGEgam9pbiB0YWJsZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbk5hbWVcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgbWVhbnMgdGhlcmUgaXMgYSBqb2luIHRhYmxlLCBmYWxzZSBtZWFucyB0aGVyZSBpc24ndC5cbiAqL1xuZXhwb3J0IGNvbnN0IGhhc0pvaW5UYWJsZVJlbGF0aW9uID0gKCBzdGF0ZSwgbW9kZWxOYW1lLCByZWxhdGlvbk5hbWUgKSA9PiB7XG5cdG1vZGVsTmFtZSA9IHNpbmd1bGFyTW9kZWxOYW1lKCBtb2RlbE5hbWUgKTtcblx0cmVsYXRpb25OYW1lID0gcGx1cmFsTW9kZWxOYW1lKCByZWxhdGlvbk5hbWUgKTtcblx0Y29uc3QgcmVsYXRpb25UeXBlID0gZ2V0UmVsYXRpb25UeXBlKCBzdGF0ZSwgbW9kZWxOYW1lLCByZWxhdGlvbk5hbWUgKTtcblx0cmV0dXJuIEpPSU5fUkVMQVRJT05fVFlQRVMuaW5kZXhPZiggcmVsYXRpb25UeXBlICkgPiAtMTtcbn07XG5cbi8qKlxuICogU2VsZWN0b3IgcmV0dXJuaW5nIHRoZSByZWxhdGlvbiB0eXBlIGRlc2NyaWJpbmcgdGhlIHJlbGF0aW9uIGJldHdlZW4gdGhlXG4gKiBnaXZlbiBtb2RlbCBuYW1lIGFuZCByZWxhdGlvbiBuYW1lLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uTmFtZVxuICogQHJldHVybiB7c3RyaW5nfSAgVGhlIHJlbGF0aW9uIHR5cGUgKGVnLiBcIkVFX0hBQlRNX1JlbGF0aW9uXCIpXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRSZWxhdGlvblR5cGUgPSAoIHN0YXRlLCBtb2RlbE5hbWUsIHJlbGF0aW9uTmFtZSApID0+IHtcblx0bW9kZWxOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRyZWxhdGlvbk5hbWUgPSBwbHVyYWxNb2RlbE5hbWUoIHJlbGF0aW9uTmFtZSApO1xuXHRjb25zdCByZWxhdGlvblNjaGVtYSA9IGdldFJlbGF0aW9uU2NoZW1hKCBzdGF0ZSwgbW9kZWxOYW1lLCByZWxhdGlvbk5hbWUgKTtcblx0cmV0dXJuIHJlbGF0aW9uU2NoZW1hICE9PSBudWxsID9cblx0XHRyZWxhdGlvblNjaGVtYS5yZWxhdGlvbl90eXBlIDpcblx0XHQnJztcbn07XG5cbi8qKlxuICogU2VsZWN0b3IgcmV0dXJuaW5nIHRoZSByZWxhdGlvbiBzY2hlbWEgZGVzY3JpYmluZyB0aGUgcmVsYXRpb24gYmV0d2VlbiB0aGVcbiAqIGdpdmVuIG1vZGVsIG5hbWUgYW5kIHJlbGF0aW9uIG5hbWUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25OYW1lXG4gKiBAcmV0dXJuIHtPYmplY3R8bnVsbH0gQW4gb2JqZWN0IG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gcmVsYXRpb24gc2NoZW1hLlxuICovXG5leHBvcnQgY29uc3QgZ2V0UmVsYXRpb25TY2hlbWEgPSAoIHN0YXRlLCBtb2RlbE5hbWUsIHJlbGF0aW9uTmFtZSApID0+IHtcblx0bW9kZWxOYW1lID0gc2luZ3VsYXJNb2RlbE5hbWUoIG1vZGVsTmFtZSApO1xuXHRyZWxhdGlvbk5hbWUgPSBwbHVyYWxNb2RlbE5hbWUoIHJlbGF0aW9uTmFtZSApO1xuXHRyZXR1cm4gc3RhdGUucmVsYXRpb25TY2hlbWEuZ2V0SW4oIFsgbW9kZWxOYW1lLCByZWxhdGlvbk5hbWUgXSwgbnVsbCApO1xufTtcbiIsIi8qKlxuICogUmVnaXN0ZXIgc3RvcmVzXG4gKi9cbmltcG9ydCAnLi9ldmVudGVzcHJlc3NvL3NjaGVtYSc7XG5pbXBvcnQgJy4vZXZlbnRlc3ByZXNzby9jb3JlJztcbmltcG9ydCAnLi9ldmVudGVzcHJlc3NvL2xpc3RzJztcbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBFeGNlcHRpb24gfSBmcm9tICdAZXZlbnRlc3ByZXNzby9lZWpzJztcbmltcG9ydCB7IHNwcmludGYsIF9fIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vaTE4bic7XG5pbXBvcnQgeyBpc0FycmF5LCBpc0VtcHR5LCBpc01hcCB9IGZyb20gJ2xvZGFzaCc7XG5cbi8qKlxuICogQXNzZXJ0cyB3aGV0aGVyIHRoZSBnaXZlbiBrZXkgZXhpc3RzIGluIHRoZSBwcm92aWRlZCBlbnRpdHkgb2JqZWN0LlxuICogVGhpcyBpcyB1c2VkIHdoZW4gY2FsbGluZyBjb2RlIHdhbnRzIGFuIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24uXG4gKlxuICogQHBhcmFtIHsgc3RyaW5nIH0ga2V5XG4gKiBAcGFyYW0geyBPYmplY3QgfSBlbnRpdHlcbiAqIEBwYXJhbSB7IHN0cmluZyB9IG1lc3NhZ2VcbiAqIEB0aHJvd3MgeyBFeGNlcHRpb24gfSAgVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgcHJvdmlkZWQgZW50aXR5IGRvZXMgbm90XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSB0aGUgZ2l2ZW4ga2V5LlxuICovXG5leHBvcnQgY29uc3QgYXNzZXJ0RW50aXR5SGFzS2V5ID0gKCBrZXksIGVudGl0eSwgbWVzc2FnZSA9ICcnICkgPT4ge1xuXHRpZiAoIG1lc3NhZ2UgPT09ICcnICkge1xuXHRcdG1lc3NhZ2UgPSBzcHJpbnRmKFxuXHRcdFx0X18oXG5cdFx0XHRcdCdUaGUgcHJvdmlkZWQgZW50aXR5ICglcykgZG9lcyBub3QgaGF2ZSB0aGUgZ2l2ZW4gcHJvcGVydHkgKCVzKScsXG5cdFx0XHRcdCdldmVudF9lc3ByZXNzbycsXG5cdFx0XHQpLFxuXHRcdFx0ZW50aXR5LFxuXHRcdFx0a2V5LFxuXHRcdCk7XG5cdH1cblx0aWYgKCAhIGVudGl0eS5oYXNPd25Qcm9wZXJ0eSgga2V5ICkgKSB7XG5cdFx0dGhyb3cgbmV3IEV4Y2VwdGlvbiggbWVzc2FnZSApO1xuXHR9XG59O1xuXG4vKipcbiAqIEFzc2VydHMgd2hldGhlciB0aGUgZ2l2ZW4gcGF0aCBpbiB0aGUgcHJvdmlkZWQgaW1tdXRhYmxlIG9iamVjdCBleGlzdHMuXG4gKiBUaGlzIGlzIHVzZWQgd2hlbiBjYWxsaW5nIGNvZGUgd2FudHMgYW4gZXhjZXB0aW9uIHRvIGJlIHRocm93biBpZiB0aGUgZ2l2ZW5cbiAqIHNlYXJjaCBwYXRoIGFycmF5IGRvZXMgbm90IGV4aXN0IGluIHRoZSBpbW11dGFibGUgb2JqZWN0LlxuICpcbiAqIElmIHRoZSBpbW11dGFibGUgb2JqZWN0IGlzIHNldHVwIGxpa2UgdGhpczpcbiAqXG4gKiBpbW11dGFibGUgPSBJbW11dGFibGUuTWFwKCkuc2V0KCAnZXZlbnQnLCBJbW11dGFibGUuTWFwKCkuc2V0KCAxMCwgRXZlbnQgKSApO1xuICpcbiAqIFRoZW4gYSB2YWxpZCBzZWFyY2hhYmxlIHBhdGggY291bGQgYmUgYFsgJ2V2ZW50JywgMTAgXWAuICBBbiBpbnZhbGlkIHBhdGhcbiAqIHdvdWxkIGJlIGBbICdkYXRldGltZScsIDEwIF1gXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcGF0aCAgU2VhcmNoYWJsZSBwYXRoIGZvciB0aGUgaW1tdXRhYmxlIG9qYmVjdCB0byB2ZXJpZnkuXG4gKiBAcGFyYW0ge0ltbXV0YWJsZS5NYXB8SW1tdXRhYmxlLlNldH0gaW1tdXRhYmxlICBBbiBpbW11dGFibGUgb2JqZWN0IChNYXAsIFNldCwgTGlzdCBldGMpXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBBIGN1c3RvbSBtZXNzYWdlIHRvIHVzZS5cbiAqIEB0aHJvd3MgRXhjZXB0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBhc3NlcnRJbW11dGFibGVPYmplY3RIYXNQYXRoID0gKFxuXHRwYXRoLFxuXHRpbW11dGFibGUsXG5cdG1lc3NhZ2UgPSAnJ1xuKSA9PiB7XG5cdGlmICggbWVzc2FnZSA9PT0gJycgKSB7XG5cdFx0bWVzc2FnZSA9IHNwcmludGYoXG5cdFx0XHRfXyhcblx0XHRcdFx0J1RoZSBwcm92aWRlZCBpbW11dGFibGUgb2JqZWN0ICglcykgZG9lcyBub3QgaGF2ZSB0aGUgZ2l2ZW4gcGF0aCAoJXMpJyxcblx0XHRcdFx0J2V2ZW50X2VzcHJlc3NvJyxcblx0XHRcdCksXG5cdFx0XHRpbW11dGFibGUsXG5cdFx0XHRwYXRoLFxuXHRcdCk7XG5cdH1cblx0aWYgKCAhIGltbXV0YWJsZS5oYXNJbiggcGF0aCApICkge1xuXHRcdHRocm93IG5ldyBFeGNlcHRpb24oIG1lc3NhZ2UgKTtcblx0fVxufTtcblxuLyoqXG4gKiBBc3NlcnRzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGFuIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7Kn0gaXRlbXNcbiAqIEBwYXJhbSB7IHN0cmluZyB9ICBtZXNzYWdlXG4gKiBAdGhyb3dzIHsgRXhjZXB0aW9uIH0gVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgcHJvdmlkZWQgdmFsdWUgaXMgbm90IGFuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkuXG4gKi9cbmV4cG9ydCBjb25zdCBhc3NlcnRJc0FycmF5ID0gKCBpdGVtcywgbWVzc2FnZSA9ICcnICkgPT4ge1xuXHRpZiAoIG1lc3NhZ2UgPT09ICcnICkge1xuXHRcdG1lc3NhZ2UgPSBfXyggJ1RoZSBwcm92aWRlZCB2YWx1ZSBpcyBub3QgYW4gYXJyYXkuJywgJ2V2ZW50X2VzcHJlc3NvJyApO1xuXHR9XG5cdGlmICggISBpc0FycmF5KCBpdGVtcyApICkge1xuXHRcdHRocm93IG5ldyBFeGNlcHRpb24oIG1lc3NhZ2UgKTtcblx0fVxufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgZW1wdHkgb3Igbm90LlxuICpcbiAqIENhbGwgdGhpcyB2YWxpZGF0b3Igd2hlbiB5b3Ugd2FudCB0byBtYWtlIHN1cmUgdGhlIHZhbHVlIGlzIE5PVCBlbXB0eS5cbiAqXG4gKiBAcGFyYW0geyp9IGl0ZW1zXG4gKiBAcGFyYW0geyBzdHJpbmcgfSBtZXNzYWdlXG4gKiBAdGhyb3dzIHsgRXhjZXB0aW9uIH0gVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgcHJvdmlkZWQgdmFsdWUgaXMgZW1wdHkuXG4gKi9cbmV4cG9ydCBjb25zdCBhc3NlcnRJc05vdEVtcHR5ID0gKCBpdGVtcywgbWVzc2FnZSA9ICcnICkgPT4ge1xuXHRpZiAoIG1lc3NhZ2UgPT09ICcnICkge1xuXHRcdG1lc3NhZ2UgPSBfXyhcblx0XHRcdCdUaGUgcHJvdmlkZWQgaXRlbXMgbXVzdCBub3QgYmUgZW1wdHknLFxuXHRcdFx0J2V2ZW50X2VzcHJlc3NvJyxcblx0XHQpO1xuXHR9XG5cdGlmICggaXNFbXB0eSggaXRlbXMgKSApIHtcblx0XHR0aHJvdyBuZXcgRXhjZXB0aW9uKCBtZXNzYWdlICk7XG5cdH1cbn07XG5cbi8qKlxuICogQXNzZXJ0cyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIE1hcCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHsqfSBpdGVtXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICogQHRocm93cyB7IEV4Y2VwdGlvbiB9XG4gKi9cbmV4cG9ydCBjb25zdCBhc3NlcnRJc01hcCA9ICggaXRlbSwgbWVzc2FnZSA9ICcnICkgPT4ge1xuXHRpZiAoIG1lc3NhZ2UgPT09ICcnICkge1xuXHRcdG1lc3NhZ2UgPSBfXyhcblx0XHRcdCdUaGUgcHJvdmlkZWQgaXRlbSBtdXN0IGJlIGEgTWFwIG9iamVjdCcsXG5cdFx0XHQnZXZlbnRfZXNwcmVzc28nXG5cdFx0KTtcblx0fVxuXHRpZiAoICEgaXNNYXAoIGl0ZW0gKSApIHtcblx0XHR0aHJvdyBuZXcgRXhjZXB0aW9uKCBtZXNzYWdlICk7XG5cdH1cbn07XG4iLCJleHBvcnQgY29uc3QgTU9ERUxfTkFNRSA9ICdhdHRlbmRlZSc7XG4iLCJleHBvcnQgKiBmcm9tICcuL3F1ZXJ5JztcbmV4cG9ydCAqIGZyb20gJy4vY29uc3RhbnRzJztcbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBpc1VuZGVmaW5lZCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5pbXBvcnQge1xuXHRnZXRRdWVyeVN0cmluZyBhcyBiYXNlR2V0UXVlcnlTdHJpbmcsXG5cdFFVRVJZX09SREVSX0FTQyxcblx0QUxMT1dFRF9PUkRFUl9WQUxVRVMsXG59IGZyb20gJy4uL2Jhc2UnO1xuaW1wb3J0IHsgUkVHSVNUUkFUSU9OX1NUQVRVU19JRFMgfSBmcm9tICcuLi9yZWdpc3RyYXRpb24vY29uc3RhbnRzJztcblxuZXhwb3J0IGNvbnN0IG9yZGVyQnlNYXAgPSB7XG5cdGlkOiAnQVRUX0lEJyxcblx0bGFzdE5hbWVPbmx5OiAnQVRUX2xuYW1lJyxcblx0Zmlyc3ROYW1lT25seTogJ0FUVF9mbmFtZScsXG5cdGZpcnN0VGhlbkxhc3ROYW1lOiBbICdBVFRfZm5hbWUnLCAnQVRUX2xuYW1lJyBdLFxuXHRsYXN0VGhlbkZpcnN0TmFtZTogWyAnQVRUX2xuYW1lJywgJ0FUVF9mbmFtZScgXSxcbn07XG5cbi8qKlxuICogRGVzY3JpYmVkIGF0dHJpYnV0ZXMgZm9yIHRoaXMgbW9kZWxcbiAqIEB0eXBlIHt7YXR0cmlidXRlczogKn19XG4gKi9cbmV4cG9ydCBjb25zdCBxdWVyeURhdGFUeXBlcyA9IHtcblx0Zm9yRXZlbnRJZDogUHJvcFR5cGVzLm51bWJlcixcblx0Zm9yRGF0ZXRpbWVJZDogUHJvcFR5cGVzLm51bWJlcixcblx0Zm9yVGlja2V0SWQ6IFByb3BUeXBlcy5udW1iZXIsXG5cdGZvclN0YXR1c0lkOiBQcm9wVHlwZXMub25lT2YoIFJFR0lTVFJBVElPTl9TVEFUVVNfSURTICksXG5cdGZvclJlZ2lzdHJhdGlvbklkOiBQcm9wVHlwZXMubnVtYmVyLFxuXHRzaG93R3JhdmF0YXI6IFByb3BUeXBlcy5ib29sLFxuXHRxdWVyeURhdGE6IFByb3BUeXBlcy5zaGFwZSgge1xuXHRcdGxpbWl0OiBQcm9wVHlwZXMubnVtYmVyLFxuXHRcdG9yZGVyQnk6IFByb3BUeXBlcy5vbmVPZiggT2JqZWN0LmtleXMoIG9yZGVyQnlNYXAgKSApLFxuXHRcdG9yZGVyOiBQcm9wVHlwZXMub25lT2YoIEFMTE9XRURfT1JERVJfVkFMVUVTICksXG5cdH0gKSxcbn07XG5cbi8qKlxuICogRGVmYXVsdCBhdHRyaWJ1dGVzIGZvciB0aGlzIG1vZGVsXG4gKiBAdHlwZSB7XG4gKiBcdHtcbiAqIFx0XHRhdHRyaWJ1dGVzOiB7XG4gKiBcdFx0XHRsaW1pdDogbnVtYmVyLFxuICogXHRcdFx0b3JkZXJCeTogc3RyaW5nLFxuICogXHRcdFx0b3JkZXI6IHN0cmluZyxcbiAqICAgXHR9XG4gKiAgIH1cbiAqIH1cbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRRdWVyeURhdGEgPSB7XG5cdHF1ZXJ5RGF0YToge1xuXHRcdGxpbWl0OiAxMDAsXG5cdFx0b3JkZXJCeTogJ2xhc3RUaGVuRmlyc3ROYW1lJyxcblx0XHRvcmRlcjogUVVFUllfT1JERVJfQVNDLFxuXHR9LFxufTtcblxuLyoqXG4gKiBVc2VkIHRvIG1hcCBhbiBvcmRlckJ5IHN0cmluZyB0byB0aGUgYWN0dWFsIHZhbHVlIHVzZWRcbiAqIGluIGEgUkVTVCBxdWVyeSBmcm9tIHRoZSBjb250ZXh0IG9mIGEgYXR0ZW5kZWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFx0XHRvcmRlckJ5XG4gKiBAcmV0dXJuIHsgc3RyaW5nIH0gXHRSZXR1cm5zIGFuIGFjdHVhbCBvcmRlckJ5IHN0cmluZ1xuICogXHRcdFx0XHRcdFx0Zm9yIHRoZSBSRVNUIHF1ZXJ5IGZvciB0aGUgcHJvdmlkZWQgYWxpYXNcbiAqL1xuZXhwb3J0IGNvbnN0IG1hcE9yZGVyQnkgPSAoIG9yZGVyQnkgKSA9PiB7XG5cdHJldHVybiBpc1VuZGVmaW5lZCggb3JkZXJCeU1hcFsgb3JkZXJCeSBdICkgP1xuXHRcdG9yZGVyQnkgOlxuXHRcdG9yZGVyQnlNYXBbIG9yZGVyQnkgXTtcbn07XG5cbi8qKlxuICogQnVpbGRzIHdoZXJlIGNvbmRpdGlvbnMgZm9yIGFuIGF0dGVuZGVlcyBlbmRwb2ludCByZXF1ZXN0XG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGZvckV2ZW50SWQgICAgXHRJRCBvZiBFdmVudCB0byByZXRyaWV2ZSBhdHRlbmRlZXMgZm9yXG4gKiBAcGFyYW0ge251bWJlcn0gZm9yRGF0ZXRpbWVJZCBcdElEIG9mIERhdGV0aW1lIHRvIHJldHJpZXZlIGF0dGVuZGVlcyBmb3JcbiAqIEBwYXJhbSB7bnVtYmVyfSBmb3JUaWNrZXRJZCBcdFx0SUQgb2YgVGlja2V0IHRvIHJldHJpZXZlIGF0dGVuZGVlcyBmb3JcbiAqIEBwYXJhbSB7bnVtYmVyfSBmb3JSZWdpc3RyYXRpb25JZFxuICogQHBhcmFtIHtzdHJpbmd9IGZvclN0YXR1c0lkIFx0XHRJRCBvZiBTdGF0dXMgdG8gcmV0cmlldmUgYXR0ZW5kZWVzIGZvclxuICogQHBhcmFtIHtzdHJpbmd9IHNob3dHcmF2YXRhciBcdEJvb2xlYW4gdG9nZ2xlIGZvciB3aGV0aGVyIHRvIGRpc3BsYXkgdXNlciBHcmF2YXRhclxuICogQHJldHVybiB7c3RyaW5nfSAgICAgICAgICAgICAgICBcdFRoZSBhc3NlbWJsZWQgd2hlcmUgY29uZGl0aW9ucy5cbiAqL1xuZXhwb3J0IGNvbnN0IHdoZXJlQ29uZGl0aW9ucyA9ICgge1xuXHRmb3JFdmVudElkID0gMCxcblx0Zm9yRGF0ZXRpbWVJZCA9IDAsXG5cdGZvclRpY2tldElkID0gMCxcblx0Zm9yUmVnaXN0cmF0aW9uSWQgPSAwLFxuXHRmb3JTdGF0dXNJZCA9ICdSQVAnLFxuXHRzaG93R3JhdmF0YXIgPSBmYWxzZSxcbn0gKSA9PiB7XG5cdGNvbnN0IHdoZXJlID0gW107XG5cblx0Ly8gZW5zdXJlIHRoYXQgZW50aXR5IElEcyBhcmUgaW50ZWdlcnNcblx0Zm9yUmVnaXN0cmF0aW9uSWQgPSBwYXJzZUludCggZm9yUmVnaXN0cmF0aW9uSWQsIDEwICk7XG5cdGZvclRpY2tldElkID0gcGFyc2VJbnQoIGZvclRpY2tldElkLCAxMCApO1xuXHRmb3JEYXRldGltZUlkID0gcGFyc2VJbnQoIGZvckRhdGV0aW1lSWQsIDEwICk7XG5cdGZvckV2ZW50SWQgPSBwYXJzZUludCggZm9yRXZlbnRJZCwgMTAgKTtcblxuXHQvLyBvcmRlciBvZiBwcmlvcml0eSBmb3IgcHJvdmlkZWQgYXJndW1lbnRzLlxuXHRpZiAoIGZvclJlZ2lzdHJhdGlvbklkICE9PSAwICYmICEgaXNOYU4oIGZvclJlZ2lzdHJhdGlvbklkICkgKSB7XG5cdFx0d2hlcmUucHVzaCggYHdoZXJlW1JlZ2lzdHJhdGlvbi5SRUdfSURdPSR7IGZvclJlZ2lzdHJhdGlvbklkIH1gICk7XG5cdH0gZWxzZSBpZiAoIGZvclRpY2tldElkICE9PSAwICYmICEgaXNOYU4oIGZvclRpY2tldElkICkgKSB7XG5cdFx0d2hlcmUucHVzaCggYHdoZXJlW1JlZ2lzdHJhdGlvbi5UaWNrZXQuVEtUX0lEXT0keyBmb3JUaWNrZXRJZCB9YCApO1xuXHR9IGVsc2UgaWYgKCBmb3JEYXRldGltZUlkICE9PSAwICYmICEgaXNOYU4oIGZvckRhdGV0aW1lSWQgKSApIHtcblx0XHR3aGVyZS5wdXNoKCBgd2hlcmVbUmVnaXN0cmF0aW9uLlRpY2tldC5EYXRldGltZS5EVFRfSURdPSR7IGZvckRhdGV0aW1lSWQgfWAgKTtcblx0fSBlbHNlIGlmICggZm9yRXZlbnRJZCAhPT0gMCAmJiAhIGlzTmFOKCBmb3JFdmVudElkICkgKSB7XG5cdFx0d2hlcmUucHVzaCggYHdoZXJlW1JlZ2lzdHJhdGlvbi5FVlRfSURdPSR7IGZvckV2ZW50SWQgfWAgKTtcblx0fVxuXG5cdGlmICggUkVHSVNUUkFUSU9OX1NUQVRVU19JRFMuaW5jbHVkZXMoIGZvclN0YXR1c0lkICkgKSB7XG5cdFx0d2hlcmUucHVzaCggYHdoZXJlW1JlZ2lzdHJhdGlvbi5TdGF0dXMuU1RTX0lEXT0keyBmb3JTdGF0dXNJZCB9YCApO1xuXHR9XG5cdGlmICggc2hvd0dyYXZhdGFyID09PSB0cnVlICkge1xuXHRcdHdoZXJlLnB1c2goICdjYWxjdWxhdGU9dXNlcl9hdmF0YXInICk7XG5cdH1cblx0cmV0dXJuIHdoZXJlLmpvaW4oICcmJyApO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gYSBxdWVyeSBzdHJpbmcgZm9yIHVzZSBieSBhIFJFU1QgcmVxdWVzdCBnaXZlbiBhIHNldCBvZiBxdWVyeURhdGEuXG4gKiBAcGFyYW0geyBPYmplY3QgfSBxdWVyeURhdGFcbiAqIEByZXR1cm4geyBzdHJpbmcgfSAgUmV0dXJucyB0aGUgcXVlcnkgc3RyaW5nLlxuICovXG5leHBvcnQgY29uc3QgZ2V0UXVlcnlTdHJpbmcgPSAoIHF1ZXJ5RGF0YSA9IHt9ICkgPT4ge1xuXHRxdWVyeURhdGEgPSB7IC4uLmRlZmF1bHRRdWVyeURhdGEucXVlcnlEYXRhLCAuLi5xdWVyeURhdGEgfTtcblx0cmV0dXJuIGJhc2VHZXRRdWVyeVN0cmluZyggcXVlcnlEYXRhLCB3aGVyZUNvbmRpdGlvbnMsIG1hcE9yZGVyQnkgKTtcbn07XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0ICogYXMgZGF0ZUZvcm1hdHMgZnJvbSAnQGV2ZW50ZXNwcmVzc28vaGVscGVycyc7XG5pbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSAnbG9kYXNoJztcblxuLyoqXG4gKiBGb3JtYXRzIHRoZSBkYXRlIGZpZWxkcyBvbiBwcm92aWRlZCBlbnRpdGllcy4gIERvZXMgbm90IG11dGF0ZSBvcmlnaW5hbFxuICogZW50aXRpZXMuXG4gKlxuICogQHBhcmFtIHsgQXJyYXkgfSBlbnRpdGllcyAgQW4gYXJyYXkgb2YgZW50aXR5IG9iamVjdHNcbiAqIEBwYXJhbSB7IEFycmF5IH0gZW50aXR5RGF0ZUZpZWxkcyAgQW4gYXJyYXkgb2YgZmllbGQgbmFtZXMgdGhhdCBhcmUgZGF0ZVxuICogICBmaWVsZHMuXG4gKiBAcGFyYW0geyBzdHJpbmcgfSBmb3JtYXQgIFRoZSBmb3JtYXQgdG8gdHJhbnNmb3JtIHRoZSBkYXRlIGZpZWxkIHZhbHVlcyB0by5cbiAqIEBwYXJhbSB7IGJvb2xlYW4gfSBsb2NhbCAgICAgIFdoZXRoZXIgb3Igbm90IHRvIGNvbnZlcnQgdGhlIGRhdGUgZmllbGQgdmFsdWVcbiAqICAgdG8gdGhlIGxvY2FsIHRpbWV6b25lIGZvciB0aGUgaG9zdC5cbiAqIEByZXR1cm4geyBBcnJheSB9ICBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIG5ldyBlbnRpdGllcyB3aXRoIHRoZSBkYXRlIGZpZWxkXG4gKiAgIHZhbHVlcyBmb3JtYXR0ZWRcbiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1hdERhdGVzT25FbnRpdGllcyA9IChcblx0ZW50aXRpZXMgPSBbXSxcblx0ZW50aXR5RGF0ZUZpZWxkcyA9IFtdLFxuXHRmb3JtYXQgPSBkYXRlRm9ybWF0cy5EQVRFX1RJTUVfRk9STUFUX0lTTzg2MDEsXG5cdGxvY2FsID0gdHJ1ZSxcbikgPT4ge1xuXHRpZiAoIGlzRW1wdHkoIGVudGl0aWVzICkgfHwgaXNFbXB0eSggZW50aXR5RGF0ZUZpZWxkcyApICkge1xuXHRcdHJldHVybiBlbnRpdGllcztcblx0fVxuXHRjb25zdCBmb3JtYXR0ZWRFbnRpdGllcyA9IFtdO1xuXHRlbnRpdGllcy5mb3JFYWNoKCAoIGVudGl0eSApID0+IHtcblx0XHRmb3JtYXR0ZWRFbnRpdGllcy5wdXNoKCBmb3JtYXREYXRlc09uRW50aXR5KFxuXHRcdFx0ZW50aXR5LFxuXHRcdFx0ZW50aXR5RGF0ZUZpZWxkcyxcblx0XHRcdGZvcm1hdCxcblx0XHRcdGxvY2FsLFxuXHRcdCkgKTtcblx0fSApO1xuXHRyZXR1cm4gZm9ybWF0dGVkRW50aXRpZXM7XG59O1xuXG4vKipcbiAqIEZvcm1hdHMgdGhlIGRhdGUgZmllbGRzIG9uIHRoZSBwcm92aWRlZCBlbnRpdHkuICBEb2VzIG5vdCBtdXRhdGUgb3JpZ2luYWxcbiAqIGVudGl0eS5cbiAqXG4gKiBAcGFyYW0geyBPYmplY3QgfSBlbnRpdHkgIEFuIGVudGl0eVxuICogQHBhcmFtIHsgQXJyYXkgfSBlbnRpdHlEYXRlRmllbGRzICBBbiBhcnJheSBvZiBmaWVsZCBuYW1lcyB0aGF0IGFyZSBkYXRlXG4gKiAgIGZpZWxkcy5cbiAqIEBwYXJhbSB7IHN0cmluZyB9IGZvcm1hdCAgVGhlIGZvcm1hdCB0byB0cmFuc2Zvcm0gdGhlIGRhdGUgZmllbGQgdmFsdWVzIHRvLlxuICogQHBhcmFtIHsgYm9vbGVhbiB9IGxvY2FsICAgICAgV2hldGhlciBvciBub3QgdG8gY29udmVydCB0aGUgZGF0ZSBmaWVsZCB2YWx1ZVxuICogICB0byB0aGUgbG9jYWwgdGltZXpvbmUgZm9yIHRoZSBob3N0LlxuICogQHJldHVybiB7IE9iamVjdCB9ICBSZXR1cm5zIGEgbmV3IGVudGl0eSB3aXRoIHRoZSBkYXRlIGZpZWxkIHZhbHVlcyBmb3JtYXR0ZWRcbiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1hdERhdGVzT25FbnRpdHkgPSAoXG5cdGVudGl0eSA9IHt9LFxuXHRlbnRpdHlEYXRlRmllbGRzID0gW10sXG5cdGZvcm1hdCA9IGRhdGVGb3JtYXRzLkRBVEVfVElNRV9GT1JNQVRfSVNPODYwMSxcblx0bG9jYWwgPSB0cnVlLFxuKSA9PiB7XG5cdGNvbnN0IG5ld0VudGl0eSA9IHsgLi4uZW50aXR5IH07XG5cdGVudGl0eURhdGVGaWVsZHMuZm9yRWFjaCggKCBkYXRlRmllbGQgKSA9PiB7XG5cdFx0aWYgKCBuZXdFbnRpdHlbIGRhdGVGaWVsZCBdICkge1xuXHRcdFx0bmV3RW50aXR5WyBkYXRlRmllbGQgXSA9IGRhdGVGb3JtYXRzLmZvcm1hdERhdGVTdHJpbmcoXG5cdFx0XHRcdG5ld0VudGl0eVsgZGF0ZUZpZWxkIF0sXG5cdFx0XHRcdGZvcm1hdCxcblx0XHRcdFx0bG9jYWwsXG5cdFx0XHQpO1xuXHRcdH1cblx0fSApO1xuXHRyZXR1cm4gbmV3RW50aXR5O1xufTtcblxuLyoqXG4gKiBGb3JtYXRzIHRoZSBkYXRlIGZpZWxkcyB0byBteXNxbCBmb3JtYXQgb24gcHJvdmlkZWQgZW50aXRpZXMuICBEb2VzIG5vdFxuICogbXV0YXRlIG9yaWdpbmFsIGVudGl0aWVzLlxuICpcbiAqIEBwYXJhbSB7IEFycmF5IH0gZW50aXRpZXMgIEFuIGFycmF5IG9mIGVudGl0eSBvYmplY3RzXG4gKiBAcGFyYW0geyBBcnJheSB9IGVudGl0eURhdGVGaWVsZHMgIEFuIGFycmF5IG9mIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGRhdGVcbiAqICAgZmllbGRzLlxuICogQHBhcmFtIHsgYm9vbGVhbiB9IGxvY2FsICAgICAgV2hldGhlciBvciBub3QgdG8gY29udmVydCB0aGUgZGF0ZSBmaWVsZCB2YWx1ZVxuICogICB0byB0aGUgbG9jYWwgdGltZXpvbmUgZm9yIHRoZSBob3N0LlxuICogQHJldHVybiB7IEFycmF5IH0gIFJldHVybnMgYSBuZXcgYXJyYXkgb2YgbmV3IGVudGl0aWVzIHdpdGggdGhlIGRhdGUgZmllbGRcbiAqICAgdmFsdWVzIGZvcm1hdHRlZFxuICovXG5leHBvcnQgY29uc3QgZm9ybWF0RW50aXRpZXNEYXRlc1RvTXlzcWwgPSAoXG5cdGVudGl0aWVzID0gW10sXG5cdGVudGl0eURhdGVGaWVsZHMgPSBbXSxcblx0bG9jYWwgPSB0cnVlLFxuKSA9PiB7XG5cdHJldHVybiBmb3JtYXREYXRlc09uRW50aXRpZXMoXG5cdFx0ZW50aXRpZXMsXG5cdFx0ZW50aXR5RGF0ZUZpZWxkcyxcblx0XHRkYXRlRm9ybWF0cy5EQVRFX1RJTUVfRk9STUFUX01ZU1FMLFxuXHRcdGxvY2FsLFxuXHQpO1xufTtcblxuLyoqXG4gKiBGb3JtYXRzIHRoZSBkYXRlIGZpZWxkcyB0byBteXNxbCBmb3JtYXQgb24gcHJvdmlkZWQgZW50aXR5LiAgRG9lcyBub3RcbiAqIG11dGF0ZSBvcmlnaW5hbCBlbnRpdHkuXG4gKlxuICogQHBhcmFtIHsgT2JqZWN0IH0gZW50aXR5ICBBbiBhcnJheSBvZiBlbnRpdHkgb2JqZWN0c1xuICogQHBhcmFtIHsgQXJyYXkgfSBlbnRpdHlEYXRlRmllbGRzICBBbiBhcnJheSBvZiBmaWVsZCBuYW1lcyB0aGF0IGFyZSBkYXRlXG4gKiAgIGZpZWxkcy5cbiAqIEBwYXJhbSB7IGJvb2xlYW4gfSBsb2NhbCAgICAgIFdoZXRoZXIgb3Igbm90IHRvIGNvbnZlcnQgdGhlIGRhdGUgZmllbGQgdmFsdWVcbiAqICAgdG8gdGhlIGxvY2FsIHRpbWV6b25lIGZvciB0aGUgaG9zdC5cbiAqIEByZXR1cm4geyBPYmplY3QgfSAgUmV0dXJucyBhIG5ldyBlbnRpdHkgd2l0aCB0aGUgZGF0ZSBmaWVsZCB2YWx1ZXMgZm9ybWF0dGVkXG4gKi9cbmV4cG9ydCBjb25zdCBmb3JtYXRFbnRpdHlEYXRlc1RvTXlzcWwgPSAoXG5cdGVudGl0eSA9IHt9LFxuXHRlbnRpdHlEYXRlRmllbGRzID0gW10sXG5cdGxvY2FsID0gdHJ1ZSxcbikgPT4ge1xuXHRyZXR1cm4gZm9ybWF0RGF0ZXNPbkVudGl0eShcblx0XHRlbnRpdHksXG5cdFx0ZW50aXR5RGF0ZUZpZWxkcyxcblx0XHRkYXRlRm9ybWF0cy5EQVRFX1RJTUVfRk9STUFUX01ZU1FMLFxuXHRcdGxvY2FsLFxuXHQpO1xufTtcblxuLyoqXG4gKiBGb3JtYXRzIHRoZSBkYXRlIGZpZWxkcyB0byB0aGUgc2l0ZSBmb3JtYXQgb24gcHJvdmlkZWQgZW50aXRpZXMuICBEb2VzIG5vdFxuICogbXV0YXRlIG9yaWdpbmFsIGVudGl0aWVzLlxuICpcbiAqIEBwYXJhbSB7IEFycmF5IH0gZW50aXRpZXMgIEFuIGFycmF5IG9mIGVudGl0eSBvYmplY3RzXG4gKiBAcGFyYW0geyBBcnJheSB9IGVudGl0eURhdGVGaWVsZHMgIEFuIGFycmF5IG9mIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGRhdGVcbiAqICAgZmllbGRzLlxuICogQHBhcmFtIHsgYm9vbGVhbiB9IGxvY2FsICAgICAgV2hldGhlciBvciBub3QgdG8gY29udmVydCB0aGUgZGF0ZSBmaWVsZCB2YWx1ZVxuICogICB0byB0aGUgbG9jYWwgdGltZXpvbmUgZm9yIHRoZSBob3N0LlxuICogQHJldHVybiB7IEFycmF5IH0gIFJldHVybnMgYSBuZXcgYXJyYXkgb2YgbmV3IGVudGl0aWVzIHdpdGggdGhlIGRhdGUgZmllbGRcbiAqICAgdmFsdWVzIGZvcm1hdHRlZFxuICovXG5leHBvcnQgY29uc3QgZm9ybWF0RW50aXRpZXNEYXRlc1RvU2l0ZSA9IChcblx0ZW50aXRpZXMgPSBbXSxcblx0ZW50aXR5RGF0ZUZpZWxkcyA9IFtdLFxuXHRsb2NhbCA9IHRydWUsXG4pID0+IHtcblx0cmV0dXJuIGZvcm1hdERhdGVzT25FbnRpdGllcyhcblx0XHRlbnRpdGllcyxcblx0XHRlbnRpdHlEYXRlRmllbGRzLFxuXHRcdGRhdGVGb3JtYXRzLkRBVEVfVElNRV9GT1JNQVRfU0lURSxcblx0XHRsb2NhbCxcblx0KTtcbn07XG5cbi8qKlxuICogRm9ybWF0cyB0aGUgZGF0ZSBmaWVsZHMgdG8gdGhlIHNpdGUgZm9ybWF0IG9uIHByb3ZpZGVkIGVudGl0eS4gIERvZXMgbm90XG4gKiBtdXRhdGUgb3JpZ2luYWwgZW50aXR5LlxuICpcbiAqIEBwYXJhbSB7IE9iamVjdCB9IGVudGl0eSAgQW4gYXJyYXkgb2YgZW50aXR5IG9iamVjdHNcbiAqIEBwYXJhbSB7IEFycmF5IH0gZW50aXR5RGF0ZUZpZWxkcyAgQW4gYXJyYXkgb2YgZmllbGQgbmFtZXMgdGhhdCBhcmUgZGF0ZVxuICogICBmaWVsZHMuXG4gKiBAcGFyYW0geyBib29sZWFuIH0gbG9jYWwgICAgICBXaGV0aGVyIG9yIG5vdCB0byBjb252ZXJ0IHRoZSBkYXRlIGZpZWxkIHZhbHVlXG4gKiAgIHRvIHRoZSBsb2NhbCB0aW1lem9uZSBmb3IgdGhlIGhvc3QuXG4gKiBAcmV0dXJuIHsgT2JqZWN0IH0gIFJldHVybnMgYSBuZXcgZW50aXR5IHdpdGggdGhlIGRhdGUgZmllbGQgdmFsdWVzIGZvcm1hdHRlZFxuICovXG5leHBvcnQgY29uc3QgZm9ybWF0RW50aXR5RGF0ZXNUb1NpdGUgPSAoXG5cdGVudGl0eSA9IHt9LFxuXHRlbnRpdHlEYXRlRmllbGRzID0gW10sXG5cdGxvY2FsID0gdHJ1ZSxcbikgPT4ge1xuXHRyZXR1cm4gZm9ybWF0RGF0ZXNPbkVudGl0eShcblx0XHRlbnRpdHksXG5cdFx0ZW50aXR5RGF0ZUZpZWxkcyxcblx0XHRkYXRlRm9ybWF0cy5EQVRFX1RJTUVfRk9STUFUX1NJVEUsXG5cdFx0bG9jYWwsXG5cdCk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGRhdGUgZmllbGQgdmFsdWVzIHRvIG1vbWVudCBvYmplY3RzIGZvciB0aGUgcHJvdmlkZWQgZW50aXRpZXMuXG4gKiBEb2VzIG5vdCBtdXRhdGUgb3JpZ2luYWwgZW50aXRpZXMuXG4gKlxuICogQHBhcmFtIHsgQXJyYXkgfSBlbnRpdGllcyBBbiBhcnJheSBvZiBlbnRpdHkgb2JqZWN0c1xuICogQHBhcmFtIHsgQXJyYXkgfSBlbnRpdHlEYXRlRmllbGRzIEFuIGFycmF5IG9mIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGRhdGVcbiAqICAgZmllbGRzLlxuICogQHJldHVybiB7IEFycmF5IH0gUmV0dXJucyBhIG5ldyBhcnJheSBvZiBuZXcgZW50aXRpZXMgd2l0aCB0aGUgZGF0ZSBmaWVsZFxuICogICB2YWx1ZXMgY29udmVydGVkIHRvIG1vbWVudCBvYmplY3RzLlxuICovXG5leHBvcnQgY29uc3QgY29udmVydEVudGl0aWVzRGF0ZXNUb01vbWVudCA9IChcblx0ZW50aXRpZXMgPSBbXSxcblx0ZW50aXR5RGF0ZUZpZWxkcyA9IFtdLFxuKSA9PiB7XG5cdGlmICggaXNFbXB0eSggZW50aXRpZXMgKSB8fCBpc0VtcHR5KCBlbnRpdHlEYXRlRmllbGRzICkgKSB7XG5cdFx0cmV0dXJuIGVudGl0aWVzO1xuXHR9XG5cdGNvbnN0IGZvcm1hdHRlZEVudGl0aWVzID0gW107XG5cdGVudGl0aWVzLmZvckVhY2goICggZW50aXR5ICkgPT4ge1xuXHRcdGZvcm1hdHRlZEVudGl0aWVzLnB1c2goIGNvbnZlcnRFbnRpdHlEYXRlc1RvTW9tZW50KFxuXHRcdFx0ZW50aXR5LFxuXHRcdFx0ZW50aXR5RGF0ZUZpZWxkcyxcblx0XHQpICk7XG5cdH0gKTtcblx0cmV0dXJuIGZvcm1hdHRlZEVudGl0aWVzO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBkYXRlIGZpZWxkIHZhbHVlcyB0byBtb21lbnQgb2JqZWN0cyBmb3IgdGhlIHByb3ZpZGVkIGVudGl0eS5cbiAqIERvZXMgbm90IG11dGF0ZSBvcmlnaW5hbCBlbnRpdHkuXG4gKlxuICogQHBhcmFtIHsgT2JqZWN0IH0gZW50aXR5IEFuIGVudGl0eS5cbiAqIEBwYXJhbSB7IEFycmF5IH0gZW50aXR5RGF0ZUZpZWxkcyBBbiBhcnJheSBvZiBmaWVsZCBuYW1lcyB0aGF0IGFyZSBkYXRlXG4gKiAgIGZpZWxkcy5cbiAqIEByZXR1cm4geyBPYmplY3QgfSBSZXR1cm5zIGEgbmV3IGVudGl0eSB3aXRoIHRoZSBkYXRlIGZpZWxkIHZhbHVlcyBjb252ZXJ0ZWRcbiAqICAgdG8gbW9tZW50IG9iamVjdHMuXG4gKi9cbmV4cG9ydCBjb25zdCBjb252ZXJ0RW50aXR5RGF0ZXNUb01vbWVudCA9IChcblx0ZW50aXR5ID0ge30sXG5cdGVudGl0eURhdGVGaWVsZHMgPSBbXSxcbikgPT4ge1xuXHRjb25zdCBuZXdFbnRpdHkgPSB7IC4uLmVudGl0eSB9O1xuXHRlbnRpdHlEYXRlRmllbGRzLmZvckVhY2goICggZGF0ZUZpZWxkICkgPT4ge1xuXHRcdGlmICggbmV3RW50aXR5WyBkYXRlRmllbGQgXSApIHtcblx0XHRcdG5ld0VudGl0eVsgZGF0ZUZpZWxkIF0gPSBkYXRlRm9ybWF0cy5zdHJpbmdUb01vbWVudChcblx0XHRcdFx0bmV3RW50aXR5WyBkYXRlRmllbGQgXSxcblx0XHRcdCk7XG5cdFx0fVxuXHR9ICk7XG5cdHJldHVybiBuZXdFbnRpdHk7XG59O1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IGlzQXJyYXksIGlzVW5kZWZpbmVkIH0gZnJvbSAnbG9kYXNoJztcblxuZXhwb3J0IGNvbnN0IFFVRVJZX09SREVSX0FTQyA9ICdBU0MnO1xuZXhwb3J0IGNvbnN0IFFVRVJZX09SREVSX0RFU0MgPSAnREVTQyc7XG5leHBvcnQgY29uc3QgQUxMT1dFRF9PUkRFUl9WQUxVRVMgPSBbICdhc2MnLCAnZGVzYycsICdBU0MnLCAnREVTQycgXTtcbmV4cG9ydCBjb25zdCBHUkVBVEVSX1RIQU4gPSBlbmNvZGVVUklDb21wb25lbnQoICc+JyApO1xuZXhwb3J0IGNvbnN0IExFU1NfVEhBTiA9IGVuY29kZVVSSUNvbXBvbmVudCggJzwnICk7XG5leHBvcnQgY29uc3QgR1JFQVRFUl9USEFOX0FORF9FUVVBTCA9IGVuY29kZVVSSUNvbXBvbmVudCggJz49JyApO1xuZXhwb3J0IGNvbnN0IExFU1NfVEhBTl9BTkRfRVFVQUwgPSBlbmNvZGVVUklDb21wb25lbnQoICc8PScgKTtcblxuLyoqXG4gKiBSZXR1cm4gYSBxdWVyeSBzdHJpbmcgZm9yIHVzZSBieSBhIFJFU1QgcmVxdWVzdCBnaXZlbiBhIHNldCBvZiBxdWVyeURhdGEuXG4gKiBAcGFyYW0geyBPYmplY3QgfSBxdWVyeURhdGFcbiAqIEBwYXJhbSB7IGZ1bmN0aW9uIH0gd2hlcmVDb25kaXRpb25zICBBIGZ1bmN0aW9uIGZvciBwcmVwcGluZyB0aGUgd2hlcmVcbiAqIFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uZGl0aW9ucyBmcm9tIHRoZSBxdWVyeURhdGEuXG4gKiBAcGFyYW0geyBmdW5jdGlvbiB9IG1hcE9yZGVyQnlcdFx0QSBmdW5jdGlvbiBmb3IgbWFwcGluZyBpbmNvbWluZyBvcmRlcl9ieVxuICogXHRcdFx0XHRcdFx0XHRcdFx0XHRzdHJpbmdzIHRvIHRoZSB2YWx1ZSBuZWVkZWQgZm9yIHRoZVxuICogXHRcdFx0XHRcdFx0XHRcdFx0XHRxdWVyeV9zdHJpbmcuXG4gKiBAcmV0dXJuIHsgc3RyaW5nIH0gIFx0XHRcdFx0XHRSZXR1cm5zIHRoZSBxdWVyeSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRRdWVyeVN0cmluZyA9IChcblx0cXVlcnlEYXRhID0ge30sXG5cdHdoZXJlQ29uZGl0aW9ucyA9ICgpID0+IG51bGwsXG5cdG1hcE9yZGVyQnkgPSAoIG9yZGVyQnkgKSA9PiBvcmRlckJ5LFxuKSA9PiB7XG5cdGNvbnN0IHdoZXJlID0gd2hlcmVDb25kaXRpb25zKCBxdWVyeURhdGEgKTtcblx0Y29uc3QgeyBsaW1pdCwgb3JkZXIsIG9yZGVyQnksIGRlZmF1bHRXaGVyZUNvbmRpdGlvbnMgfSA9IHF1ZXJ5RGF0YTtcblx0Y29uc3QgcXVlcnlQYXJhbXMgPSBbXTtcblx0aWYgKCAhIGlzVW5kZWZpbmVkKCBsaW1pdCApICkge1xuXHRcdHF1ZXJ5UGFyYW1zLnB1c2goIGBsaW1pdD0keyBsaW1pdCB9YCApO1xuXHR9XG5cdGlmICggISBpc1VuZGVmaW5lZCggZGVmYXVsdFdoZXJlQ29uZGl0aW9ucyApICkge1xuXHRcdHF1ZXJ5UGFyYW1zLnB1c2goXG5cdFx0XHRgZGVmYXVsdF93aGVyZV9jb25kaXRpb25zPSR7IGRlZmF1bHRXaGVyZUNvbmRpdGlvbnMgfWBcblx0XHQpO1xuXHR9XG5cdGlmICggISBpc1VuZGVmaW5lZCggbWFwT3JkZXJCeSggb3JkZXJCeSApICkgKSB7XG5cdFx0aWYgKCBpc0FycmF5KCBtYXBPcmRlckJ5KCBvcmRlckJ5ICkgKSApIHtcblx0XHRcdGZvciAoIGNvbnN0IGZpZWxkIG9mIG1hcE9yZGVyQnkoIG9yZGVyQnkgKSApIHtcblx0XHRcdFx0cXVlcnlQYXJhbXMucHVzaCggYG9yZGVyX2J5WyR7IGZpZWxkIH1dPSR7IG9yZGVyIH1gICk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHF1ZXJ5UGFyYW1zLnB1c2goIGBvcmRlcj0keyBvcmRlciB9YCApO1xuXHRcdFx0cXVlcnlQYXJhbXMucHVzaCggYG9yZGVyX2J5PSR7IG1hcE9yZGVyQnkoIG9yZGVyQnkgKSB9YCApO1xuXHRcdH1cblx0fVxuXHRsZXQgcXVlcnlTdHJpbmcgPSBxdWVyeVBhcmFtcy5qb2luKCAnJicgKTtcblx0aWYgKCB3aGVyZSApIHtcblx0XHRxdWVyeVN0cmluZyArPSAnJicgKyB3aGVyZTtcblx0fVxuXHRyZXR1cm4gcXVlcnlTdHJpbmc7XG59O1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IHZhbHVlcyB9IGZyb20gJ2xvZGFzaCc7XG5cbmV4cG9ydCBjb25zdCBNT0RFTF9OQU1FID0gJ2NoZWNraW4nO1xuXG5leHBvcnQgY29uc3QgQ0hFQ0tJTl9TVEFUVVNfSUQgPSB7XG5cdFNUQVRVU19DSEVDS0VEX09VVDogMCxcblx0U1RBVFVTX0NIRUNLRURfSU46IDEsXG5cdFNUQVRVU19DSEVDS0VEX05FVkVSOiAyLFxufTtcblxuZXhwb3J0IGNvbnN0IENIRUNLSU5fU1RBVFVTX0lEUyA9IHZhbHVlcyhcblx0Q0hFQ0tJTl9TVEFUVVNfSURcbik7XG4iLCJleHBvcnQgKiBmcm9tICcuL2NvbnN0YW50cyc7XG5leHBvcnQgKiBmcm9tICcuL3F1ZXJ5JztcbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBpc1VuZGVmaW5lZCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgcHJldHR5U3RhdHVzIH0gZnJvbSAnLi4vc3RhdHVzJztcblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7XG5cdGdldFF1ZXJ5U3RyaW5nIGFzIGJhc2VHZXRRdWVyeVN0cmluZyxcblx0UVVFUllfT1JERVJfREVTQyxcblx0QUxMT1dFRF9PUkRFUl9WQUxVRVMsXG59IGZyb20gJy4uL2Jhc2UnO1xuaW1wb3J0ICogYXMgY2hlY2tpblN0YXR1cyBmcm9tICcuL2NvbnN0YW50cyc7XG5cbi8qKlxuICogRGVzY3JpYmVkIGF0dHJpYnV0ZXMgZm9yIHRoaXMgbW9kZWxcbiAqIEB0eXBlIHt7YXR0cmlidXRlczogKn19XG4gKi9cbmV4cG9ydCBjb25zdCBxdWVyeURhdGFUeXBlcyA9IHtcblx0Zm9yRGF0ZXRpbWVJZDogUHJvcFR5cGVzLm51bWJlcixcblx0Zm9yRXZlbnRJZDogUHJvcFR5cGVzLm51bWJlcixcblx0Zm9yUmVnaXN0cmF0aW9uSWQ6IFByb3BUeXBlcy5udW1iZXIsXG5cdGZvclRpY2tldElkOiBQcm9wVHlwZXMubnVtYmVyLFxuXHRmb3JTdGF0dXNJZDogUHJvcFR5cGVzLm9uZU9mKCBjaGVja2luU3RhdHVzLkNIRUNLSU5fU1RBVFVTX0lEUyApLFxuXHRxdWVyeURhdGE6IFByb3BUeXBlcy5zaGFwZSgge1xuXHRcdGxpbWl0OiBQcm9wVHlwZXMubnVtYmVyLFxuXHRcdG9yZGVyQnk6IFByb3BUeXBlcy5vbmVPZiggW1xuXHRcdFx0J0NIS19JRCcsXG5cdFx0XHQnUkVHX0lEJyxcblx0XHRcdCdDSEtfdGltZXN0YW1wJyxcblx0XHRcdCdEVFRfSUQnLFxuXHRcdF0gKSxcblx0XHRvcmRlcjogUHJvcFR5cGVzLm9uZU9mKCBBTExPV0VEX09SREVSX1ZBTFVFUyApLFxuXHR9ICksXG59O1xuXG5leHBvcnQgY29uc3Qgb3B0aW9uc0VudGl0eU1hcCA9IHtcblx0ZGVmYXVsdDogKCkgPT4ge1xuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdGxhYmVsOiBwcmV0dHlTdGF0dXMoXG5cdFx0XHRcdFx0Y2hlY2tpblN0YXR1cy5DSEVDS0lOX1NUQVRVU19JRC5TVEFUVVNfQ0hFQ0tFRF9PVVRcblx0XHRcdFx0KSxcblx0XHRcdFx0dmFsdWU6IGNoZWNraW5TdGF0dXMuQ0hFQ0tJTl9TVEFUVVNfSUQuU1RBVFVTX0NIRUNLRURfT1VULFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bGFiZWw6IHByZXR0eVN0YXR1cyhcblx0XHRcdFx0XHRjaGVja2luU3RhdHVzLkNIRUNLSU5fU1RBVFVTX0lELlNUQVRVU19DSEVDS0VEX0lOXG5cdFx0XHRcdCksXG5cdFx0XHRcdHZhbHVlOiBjaGVja2luU3RhdHVzLkNIRUNLSU5fU1RBVFVTX0lELlNUQVRVU19DSEVDS0VEX0lOLFxuXHRcdFx0fSxcblx0XHRdO1xuXHR9LFxufTtcblxuLyoqXG4gKiBEZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoaXMgbW9kZWxcbiAqIEB0eXBlIHtcbiAqIFx0e1xuICogXHRcdGF0dHJpYnV0ZXM6IHtcbiAqIFx0XHRcdGxpbWl0OiBudW1iZXIsXG4gKiBcdFx0XHRvcmRlckJ5OiBzdHJpbmcsXG4gKiBcdFx0XHRvcmRlcjogc3RyaW5nLFxuICogICBcdH1cbiAqICAgfVxuICogfVxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdFF1ZXJ5RGF0YSA9IHtcblx0cXVlcnlEYXRhOiB7XG5cdFx0bGltaXQ6IDEwMCxcblx0XHRvcmRlckJ5OiAnQ0hLX3RpbWVzdGFtcCcsXG5cdFx0b3JkZXI6IFFVRVJZX09SREVSX0RFU0MsXG5cdH0sXG59O1xuXG4vKipcbiAqIFVzZWQgdG8gbWFwIGFuIG9yZGVyQnkgc3RyaW5nIHRvIHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBpbiBhIFJFU1QgcXVlcnkgZnJvbVxuICogdGhlIGNvbnRleHQgb2YgYSByZWdpc3RyYXRpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG9yZGVyQnlcbiAqXG4gKiBAcmV0dXJuIHsgc3RyaW5nIH0gUmV0dXJucyBhbiBhY3R1YWwgb3JkZXJCeSBzdHJpbmcgZm9yIHRoZSBSRVNUIHF1ZXJ5IGZvclxuICogICAgICAgICAgICAgICAgICAgICAgdGhlIHByb3ZpZGVkIGFsaWFzXG4gKi9cbmV4cG9ydCBjb25zdCBtYXBPcmRlckJ5ID0gKCBvcmRlckJ5ICkgPT4ge1xuXHRjb25zdCBvcmRlckJ5TWFwID0ge1xuXHRcdHRpbWVzdGFtcDogJ0NIS190aW1lc3RhbXAnLFxuXHRcdGlkOiAnQ0hLX0lEJyxcblx0fTtcblx0cmV0dXJuIGlzVW5kZWZpbmVkKCBvcmRlckJ5TWFwWyBvcmRlckJ5IF0gKSA/XG5cdFx0b3JkZXJCeSA6XG5cdFx0b3JkZXJCeU1hcFsgb3JkZXJCeSBdO1xufTtcblxuLyoqXG4gKiBCdWlsZHMgd2hlcmUgY29uZGl0aW9ucyBmb3IgYW4gcmVnaXN0cmF0aW9ucyBlbmRwb2ludCByZXF1ZXN0XG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGZvckRhdGV0aW1lSWQgICAgXHRJRCBvZiBFdmVudCB0byByZXRyaWV2ZSByZWdpc3RyYXRpb25zIGZvclxuICogQHBhcmFtIHtudW1iZXJ9IGZvckV2ZW50SWQgICAgSUQgb2YgQXR0ZW5kZWUgdG8gcmV0cmlldmUgcmVnaXN0cmF0aW9ucyBmb3JcbiAqIEBwYXJhbSB7bnVtYmVyfSBmb3JSZWdpc3RyYXRpb25JZCBJRCBvZiBUcmFuc2FjdGlvbiB0byByZXRyaWV2ZSByZWdpc3RyYXRpb25zIGZvclxuICogQHBhcmFtIHtudW1iZXJ9IGZvclRpY2tldElkIFx0XHRJRCBvZiBUaWNrZXQgdG8gcmV0cmlldmUgcmVnaXN0cmF0aW9ucyBmb3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JTdGF0dXNJZCBcdFx0SUQgb2YgU3RhdHVzIHRvIHJldHJpZXZlIHJlZ2lzdHJhdGlvbnMgZm9yXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgICAgICAgICAgIFx0VGhlIGFzc2VtYmxlZCB3aGVyZSBjb25kaXRpb25zLlxuICovXG5leHBvcnQgY29uc3Qgd2hlcmVDb25kaXRpb25zID0gKCB7XG5cdGZvckRhdGV0aW1lSWQgPSAwLFxuXHRmb3JFdmVudElkID0gMCxcblx0Zm9yUmVnaXN0cmF0aW9uSWQgPSAwLFxuXHRmb3JUaWNrZXRJZCA9IDAsXG5cdGZvclN0YXR1c0lkID0gJycsXG59ICkgPT4ge1xuXHRjb25zdCB3aGVyZSA9IFtdO1xuXHRmb3JFdmVudElkID0gcGFyc2VJbnQoIGZvckV2ZW50SWQsIDEwICk7XG5cdGlmICggZm9yRXZlbnRJZCAhPT0gMCAmJiAhIGlzTmFOKCBmb3JFdmVudElkICkgKSB7XG5cdFx0d2hlcmUucHVzaCggJ3doZXJlW1JlZ2lzdHJhdGlvbi5FVlRfSURdPScgKyBmb3JFdmVudElkICk7XG5cdH1cblx0Zm9yRGF0ZXRpbWVJZCA9IHBhcnNlSW50KCBmb3JEYXRldGltZUlkLCAxMCApO1xuXHRpZiAoIGZvckRhdGV0aW1lSWQgIT09IDAgJiYgISBpc05hTiggZm9yRGF0ZXRpbWVJZCApICkge1xuXHRcdHdoZXJlLnB1c2goICd3aGVyZVtEVFRfSURdPScgKyBmb3JEYXRldGltZUlkICk7XG5cdH1cblx0Zm9yUmVnaXN0cmF0aW9uSWQgPSBwYXJzZUludCggZm9yUmVnaXN0cmF0aW9uSWQsIDEwICk7XG5cdGlmICggZm9yUmVnaXN0cmF0aW9uSWQgIT09IDAgJiYgISBpc05hTiggZm9yUmVnaXN0cmF0aW9uSWQgKSApIHtcblx0XHR3aGVyZS5wdXNoKCAnd2hlcmVbUkVHX0lEXT0nICsgZm9yUmVnaXN0cmF0aW9uSWQgKTtcblx0fVxuXHRmb3JUaWNrZXRJZCA9IHBhcnNlSW50KCBmb3JUaWNrZXRJZCwgMTAgKTtcblx0aWYgKCBmb3JUaWNrZXRJZCAhPT0gMCAmJiAhIGlzTmFOKCBmb3JUaWNrZXRJZCApICkge1xuXHRcdHdoZXJlLnB1c2goICd3aGVyZVtSZWdpc3RyYXRpb24uVEtUX0lEXT0nICsgZm9yVGlja2V0SWQgKTtcblx0fVxuXHRpZiAoIGZvclN0YXR1c0lkICE9PSAnJyAmJiBmb3JTdGF0dXNJZCAhPT0gbnVsbCApIHtcblx0XHR3aGVyZS5wdXNoKCAnd2hlcmVbQ0hLX2luXT0nICsgZm9yU3RhdHVzSWQgKTtcblx0fVxuXHRyZXR1cm4gd2hlcmUuam9pbiggJyYnICk7XG59O1xuXG4vKipcbiAqIFJldHVybiBhIHF1ZXJ5IHN0cmluZyBmb3IgdXNlIGJ5IGEgUkVTVCByZXF1ZXN0IGdpdmVuIGEgc2V0IG9mIHF1ZXJ5RGF0YS5cbiAqIEBwYXJhbSB7IE9iamVjdCB9IHF1ZXJ5RGF0YVxuICogQHJldHVybiB7IHN0cmluZyB9ICBSZXR1cm5zIHRoZSBxdWVyeSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRRdWVyeVN0cmluZyA9ICggcXVlcnlEYXRhID0ge30gKSA9PiB7XG5cdHF1ZXJ5RGF0YSA9IHsgLi4uZGVmYXVsdFF1ZXJ5RGF0YS5xdWVyeURhdGEsIC4uLnF1ZXJ5RGF0YSB9O1xuXHRyZXR1cm4gYmFzZUdldFF1ZXJ5U3RyaW5nKCBxdWVyeURhdGEsIHdoZXJlQ29uZGl0aW9ucywgbWFwT3JkZXJCeSApO1xufTtcbiIsImltcG9ydCB7IHZhbHVlcyB9IGZyb20gJ2xvZGFzaCc7XG5cbmV4cG9ydCBjb25zdCBNT0RFTF9OQU1FID0gJ2RhdGV0aW1lJztcblxuZXhwb3J0IGNvbnN0IERBVEVUSU1FX1NUQVRVU19JRCA9IHtcblx0U09MRF9PVVQ6ICdEVFMnLFxuXHRBQ1RJVkU6ICdEVEEnLFxuXHRVUENPTUlORzogJ0RUVScsXG5cdFBPU1RQT05FRDogJ0RUUCcsXG5cdENBTkNFTExFRDogJ0RUQycsXG5cdEVYUElSRUQ6ICdEVEUnLFxuXHRJTkFDVElWRTogJ0RUSScsXG59O1xuXG5leHBvcnQgY29uc3QgREFURVRJTUVfU1RBVFVTX0lEUyA9IHZhbHVlcyggREFURVRJTUVfU1RBVFVTX0lEICk7XG4iLCIvKipcbiAqIEludGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0ICogYXMgYmFzZUZvcm1hdHRlciBmcm9tICcuLi9iYXNlLWRhdGUtZm9ybWF0dGVyJztcblxuLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IGZvck93biwgcHVsbEF0IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7XG5cdFRJTUVfRk9STUFUX1NJVEUsXG5cdERBVEVfVElNRV9GT1JNQVRfU0lURSxcblx0YWxsRGF0ZVRpbWVzQXNTdHJpbmcsXG5cdFNFUEFSQVRPUl9TUEFDRV9EQVNIX1NQQUNFLFxufSBmcm9tICdAZXZlbnRlc3ByZXNzby9oZWxwZXJzJztcbmltcG9ydCB7IGlzTW9kZWxFbnRpdHlPZk1vZGVsIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vdmFsaWRhdG9ycyc7XG5cbi8qKlxuICogQXJyYXkgb2YgZmllbGRzIHRoYXQgaGF2ZSBkYXRlIGluZm9ybWF0aW9uXG4gKiBAdHlwZSB7IHN0cmluZ1tdIH1cbiAqL1xuZXhwb3J0IGNvbnN0IERBVEVfRklFTERTID0gW1xuXHQnRFRUX0VWVF9zdGFydCcsXG5cdCdEVFRfRVZUX2VuZCcsXG5dO1xuXG4vKipcbiAqIFdpbGwgaG9sZCB0aGUgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIGxpc3Qgb2YgZm9ybWF0dGVycyBmb3IgZGF0ZXMuICBGb3JtYXR0ZXJzXG4gKiBhcmUgZnVuY3Rpb25zIGRlZmluZWQgaW4gYC4uL2Jhc2UtZGF0ZS1mb3JtYXR0ZXJgIGJ1dCB3cmFwcGVkIGJ5IGR5bmFtaWNhbGx5XG4gKiBnZW5lcmF0ZWQgZnVuY3Rpb25zIChjYWxsYWJsZSB2aWEgc2FtZSBuYW1lKSB0aGF0IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZSB0aGVcbiAqIGNvcnJlY3QgZGF0ZUZpZWxkc01hcCBhcmd1bWVudC5cbiAqXG4gKiBFZy4gIGAuLi9iYXNlLWRhdGUtZm9ybWF0dGVyIGhhc1xuICogZm9ybWF0RGF0ZXNPbkVudGl0aWVzKCBlbnRpdGllcywgZW50aXR5RGF0ZUZpZWxkcywgZm9ybWF0LCBsb2NhbCApO1xuICogV2hlbiBpbXBvcnRpbmcgYGZvcm1hdERhdGVzT25FbnRpdGllc2AgZnJvbSB0aGlzIGZpbGUsIHlvdSBjYW4gY2FsbCBpdCBzaW1wbHlcbiAqIGJ5IGRvaW5nIHRoaXM6XG4gKlxuICogZm9ybWF0RGF0ZXNPbkVudGl0aWVzKCBkYXRlVGltZU9iamVjdHMsIGZvcm1hdCwgbG9jYWwgKTtcbiAqXG4gKiBOb3RpY2UgdGhhdCBpdCdzIGNhbGxlZCB3aXRob3V0IHRoZSBlbnRpdHlEYXRlRmllbGRzIGFyZ3VtZW50IGJlY2F1c2UgdGhhdCdzXG4gKiBwcm92aWRlZCBieSB0aGlzIGdlbmVyYXRvci5cbiAqXG4gKiBAdHlwZSB7e319XG4gKi9cbmNvbnN0IGZvcm1hdHRlcnMgPSB7fTtcblxuZm9yT3duKCBiYXNlRm9ybWF0dGVyLCAoIGltcGxlbWVudGF0aW9uLCBmdW5jdGlvbk5hbWUgKSA9PiB7XG5cdGZvcm1hdHRlcnNbIGZ1bmN0aW9uTmFtZSBdID0gKCAuLi5pbmNvbWluZ0FyZ3MgKSA9PiB7XG5cdFx0Y29uc3QgZmlyc3RBcmcgPSBwdWxsQXQoIGluY29taW5nQXJncywgMCApO1xuXHRcdHJldHVybiBpbXBsZW1lbnRhdGlvbiggZmlyc3RBcmdbIDAgXSwgREFURV9GSUVMRFMsIC4uLmluY29taW5nQXJncyApO1xuXHR9O1xufSApO1xuXG4vKipcbiAqIFRoaXMgd2lsbCBzcGl0IG91dCBhIHByZXR0aWZpZWQgbGFiZWwgZm9yIHRoZSBwcm92aWRlZCBEYXRlVGltZSBlbnRpdHkuXG4gKlxuICogSWYgdGhlcmUgaXMgYSBEVFRfbmFtZSwgdGhlIGZvcm1hdCB3aWxsIGJlOlxuICogYERUVF9uYW1lIChEVFRfRVZUX3N0YXJ0IC0gRFRUX0VWVF9lbmQpYFxuICpcbiAqIElmIG5vIERUVF9uYW1lIHRoZW46XG4gKiBgRFRUX0VWVF9zdGFydCAtIERUVF9FVlRfZW5kYFxuICpcbiAqIFRoaXMgd2lsbCBhY2NvdW50IGZvciBpZiBib3RoIHN0YXJ0IGFuZCBlbmQgYXJlIGluIHRoZSBzYW1lIGRheSBhbmQgc2ltcGx5XG4gKiB1c2UgdGltZSBmb3IgdGhlIGVuZCBwYXJ0LlxuICpcbiAqIEBwYXJhbSB7IEJhc2VFbnRpdHkgfSBEYXRlVGltZUVudGl0eVxuICogQHJldHVybiB7IHN0cmluZyB9ICBBIGZvcm1hdHRlZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwcm92aWRlZFxuICogICAgRGF0ZVRpbWVFbnRpdHkuXG4gKi9cbmV4cG9ydCBjb25zdCBwcmV0dHlEYXRlRnJvbURhdGVUaW1lID0gKCBEYXRlVGltZUVudGl0eSApID0+IHtcblx0bGV0IGNvbnRlbnQgPSAnJztcblx0aWYgKCBpc01vZGVsRW50aXR5T2ZNb2RlbCggRGF0ZVRpbWVFbnRpdHksICdkYXRldGltZScgKSApIHtcblx0XHRpZiAoIERhdGVUaW1lRW50aXR5LkRUVF9FVlRfc3RhcnQuaGFzU2FtZShcblx0XHRcdERhdGVUaW1lRW50aXR5LkRUVF9FVlRfZW5kLFxuXHRcdFx0J2RheSdcblx0XHQpICkge1xuXHRcdFx0Y29udGVudCArPSBhbGxEYXRlVGltZXNBc1N0cmluZyhcblx0XHRcdFx0U0VQQVJBVE9SX1NQQUNFX0RBU0hfU1BBQ0UsXG5cdFx0XHRcdERhdGVUaW1lRW50aXR5LkRUVF9FVlRfc3RhcnQudG9Gb3JtYXQoXG5cdFx0XHRcdFx0REFURV9USU1FX0ZPUk1BVF9TSVRFXG5cdFx0XHRcdCksXG5cdFx0XHRcdERhdGVUaW1lRW50aXR5LkRUVF9FVlRfZW5kLnRvRm9ybWF0KFxuXHRcdFx0XHRcdFRJTUVfRk9STUFUX1NJVEVcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnRlbnQgKz0gYWxsRGF0ZVRpbWVzQXNTdHJpbmcoXG5cdFx0XHRcdFNFUEFSQVRPUl9TUEFDRV9EQVNIX1NQQUNFLFxuXHRcdFx0XHREYXRlVGltZUVudGl0eS5EVFRfRVZUX3N0YXJ0LnRvRm9ybWF0KFxuXHRcdFx0XHRcdERBVEVfVElNRV9GT1JNQVRfU0lURVxuXHRcdFx0XHQpLFxuXHRcdFx0XHREYXRlVGltZUVudGl0eS5EVFRfRVZUX2VuZC50b0Zvcm1hdChcblx0XHRcdFx0XHREQVRFX1RJTUVfRk9STUFUX1NJVEVcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXHRcdGNvbnRlbnQgPSBEYXRlVGltZUVudGl0eS5EVFRfbmFtZSA/XG5cdFx0XHRgJHsgRGF0ZVRpbWVFbnRpdHkuRFRUX25hbWUgfSAoJHsgY29udGVudCB9KWAgOlxuXHRcdFx0Y29udGVudDtcblx0fVxuXHRyZXR1cm4gY29udGVudDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZvcm1hdHRlcnM7XG4iLCJleHBvcnQgKiBmcm9tICcuL2NvbnN0YW50cyc7XG5leHBvcnQgKiBmcm9tICcuL3F1ZXJ5JztcbmV4cG9ydCAqIGZyb20gJy4vZm9ybWF0dGVyJztcbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudC10aW1lem9uZSc7XG5pbXBvcnQgeyBpc1VuZGVmaW5lZCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG4vKipcbiAqIEludGVybmFsIGRlcGVuZGVuY2llc1xuICovXG5pbXBvcnQge1xuXHRnZXRRdWVyeVN0cmluZyBhcyBiYXNlR2V0UXVlcnlTdHJpbmcsXG5cdFFVRVJZX09SREVSX0RFU0MsXG5cdEFMTE9XRURfT1JERVJfVkFMVUVTLFxuXHRHUkVBVEVSX1RIQU4sXG5cdEdSRUFURVJfVEhBTl9BTkRfRVFVQUwsXG5cdExFU1NfVEhBTl9BTkRfRVFVQUwsXG59IGZyb20gJy4uL2Jhc2UnO1xuXG5leHBvcnQgY29uc3Qgbm93RGF0ZUFuZFRpbWUgPSBtb21lbnQoKTtcblxuLyoqXG4gKiBEZXNjcmliZWQgYXR0cmlidXRlcyBmb3IgdGhpcyBtb2RlbFxuICogQHR5cGUge3thdHRyaWJ1dGVzOiAqfX1cbiAqL1xuZXhwb3J0IGNvbnN0IHF1ZXJ5RGF0YVR5cGVzID0ge1xuXHRxdWVyeURhdGE6IFByb3BUeXBlcy5zaGFwZSgge1xuXHRcdGxpbWl0OiBQcm9wVHlwZXMubnVtYmVyLFxuXHRcdG9yZGVyQnk6IFByb3BUeXBlcy5vbmVPZiggW1xuXHRcdFx0J0RUVF9uYW1lJyxcblx0XHRcdCdEVFRfSUQnLFxuXHRcdFx0J3N0YXJ0X2RhdGUnLFxuXHRcdFx0J2VuZF9kYXRlJyxcblx0XHRdICksXG5cdFx0b3JkZXI6IFByb3BUeXBlcy5vbmVPZiggQUxMT1dFRF9PUkRFUl9WQUxVRVMgKSxcblx0XHRzaG93RXhwaXJlZDogUHJvcFR5cGVzLmJvb2wsXG5cdFx0bW9udGg6IFByb3BUeXBlcy5tb250aCxcblx0fSApLFxufTtcblxuLyoqXG4gKiBEZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoaXMgbW9kZWxcbiAqIEB0eXBlIHtcbiAqIFx0e1xuICogXHRcdGF0dHJpYnV0ZXM6IHtcbiAqIFx0XHRcdGxpbWl0OiBudW1iZXIsXG4gKiBcdFx0XHRvcmRlckJ5OiBzdHJpbmcsXG4gKiBcdFx0XHRvcmRlcjogc3RyaW5nLFxuICogICBcdFx0c2hvd0V4cGlyZWQ6IGJvb2xlYW5cbiAqICAgXHR9XG4gKiAgIH1cbiAqIH1cbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRRdWVyeURhdGEgPSB7XG5cdHF1ZXJ5RGF0YToge1xuXHRcdGxpbWl0OiAxMDAsXG5cdFx0b3JkZXJCeTogJ3N0YXJ0X2RhdGUnLFxuXHRcdG9yZGVyOiBRVUVSWV9PUkRFUl9ERVNDLFxuXHRcdHNob3dFeHBpcmVkOiBmYWxzZSxcblx0fSxcbn07XG5cbi8qKlxuICogVXNlZCB0byBtYXAgYW4gb3JkZXJCeSBzdHJpbmcgdG8gdGhlIGFjdHVhbCB2YWx1ZSB1c2VkIGluIGEgUkVTVCBxdWVyeSBmcm9tXG4gKiB0aGUgY29udGV4dCBvZiBhbiBldmVudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gb3JkZXJCeVxuICpcbiAqIEByZXR1cm4geyBzdHJpbmcgfSBSZXR1cm5zIGFuIGFjdHVhbCBvcmRlckJ5IHN0cmluZyBmb3IgdGhlIFJFU1QgcXVlcnkgZm9yXG4gKiAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJvdmlkZWQgYWxpYXNcbiAqL1xuZXhwb3J0IGNvbnN0IG1hcE9yZGVyQnkgPSAoIG9yZGVyQnkgKSA9PiB7XG5cdGNvbnN0IG9yZGVyQnlNYXAgPSB7XG5cdFx0c3RhcnRfZGF0ZTogJ0RUVF9FVlRfc3RhcnQnLFxuXHRcdGVuZF9kYXRlOiAnRFRUX0VWVF9lbmQnLFxuXHR9O1xuXHRyZXR1cm4gaXNVbmRlZmluZWQoIG9yZGVyQnlNYXBbIG9yZGVyQnkgXSApID9cblx0XHRvcmRlckJ5IDpcblx0XHRvcmRlckJ5TWFwWyBvcmRlckJ5IF07XG59O1xuXG4vKipcbiAqIEJ1aWxkcyB3aGVyZSBjb25kaXRpb25zIGZvciBhbiBldmVudHMgZW5kcG9pbnQgcmVxdWVzdCB1c2luZyBwcm92aWRlZFxuICogaW5mb3JtYXRpb24uXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGZvckV2ZW50SWQgIElEIGZvciBFdmVudCB0byByZXRyaWV2ZSBkYXRldGltZXMgZnJvbVxuICogQHBhcmFtIHtib29sZWFufSBzaG93RXhwaXJlZCAgV2hldGhlciBvciBub3QgdG8gaW5jbHVkZSBleHBpcmVkIGV2ZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb250aCAgICAgICAgIFJldHVybiBldmVudHMgZm9yIHRoZSBnaXZlbiBtb250aC4gIENhbiBiZSBhbnlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYW55IG1vbnRoIGZvcm1hdCByZWNvZ25pemVkIGJ5IG1vbWVudC5cbiAqIEByZXR1cm4ge3N0cmluZ30gICAgICAgICAgICAgVGhlIGFzc2VtYmxlZCB3aGVyZSBjb25kaXRpb25zLlxuICovXG5leHBvcnQgY29uc3Qgd2hlcmVDb25kaXRpb25zID0gKCB7XG5cdGZvckV2ZW50SWQgPSAwLFxuXHRzaG93RXhwaXJlZCA9IGZhbHNlLFxuXHRtb250aCA9ICdub25lJyxcbn0gKSA9PiB7XG5cdGNvbnN0IHdoZXJlID0gW107XG5cdGlmICggISBzaG93RXhwaXJlZCApIHtcblx0XHR3aGVyZS5wdXNoKFxuXHRcdFx0J3doZXJlW0RUVF9FVlRfZW5kKipleHBpcmVkXVtdPScgKyBHUkVBVEVSX1RIQU4gK1xuXHRcdFx0JyZ3aGVyZVtEVFRfRVZUX2VuZCoqZXhwaXJlZF1bXT0nICtcblx0XHRcdG5vd0RhdGVBbmRUaW1lLmxvY2FsKCkuZm9ybWF0KClcblx0XHQpO1xuXHR9XG5cdGlmICggbW9udGggJiYgbW9udGggIT09ICdub25lJyApIHtcblx0XHR3aGVyZS5wdXNoKFxuXHRcdFx0J3doZXJlW0RUVF9FVlRfc3RhcnRdW109JyArIEdSRUFURVJfVEhBTl9BTkRfRVFVQUwgK1xuXHRcdFx0JyZ3aGVyZVtEVFRfRVZUX3N0YXJ0XVtdPScgK1xuXHRcdFx0bW9tZW50KCkubW9udGgoIG1vbnRoICkuc3RhcnRPZiggJ21vbnRoJyApLmxvY2FsKCkuZm9ybWF0KClcblx0XHQpO1xuXHRcdHdoZXJlLnB1c2goXG5cdFx0XHQnd2hlcmVbRFRUX0VWVF9lbmRdW109JyArIExFU1NfVEhBTl9BTkRfRVFVQUwgK1xuXHRcdFx0JyZ3aGVyZVtEVFRfRVZUX2VuZF1bXT0nICtcblx0XHRcdG1vbWVudCgpLm1vbnRoKCBtb250aCApLmVuZE9mKCAnbW9udGgnICkubG9jYWwoKS5mb3JtYXQoKVxuXHRcdCk7XG5cdH1cblx0aWYgKCBwYXJzZUludCggZm9yRXZlbnRJZCwgMTAgKSAhPT0gMCApIHtcblx0XHR3aGVyZS5wdXNoKCAnd2hlcmVbRXZlbnQuRVZUX0lEXT0nICsgZm9yRXZlbnRJZCApO1xuXHR9XG5cdHJldHVybiB3aGVyZS5qb2luKCAnJicgKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIGEgcXVlcnkgc3RyaW5nIGZvciB1c2UgYnkgYSBSRVNUIHJlcXVlc3QgZ2l2ZW4gYSBzZXQgb2YgcXVlcnlEYXRhLlxuICogQHBhcmFtIHsgT2JqZWN0IH0gcXVlcnlEYXRhXG4gKiBAcmV0dXJuIHsgc3RyaW5nIH0gIFJldHVybnMgdGhlIHF1ZXJ5IHN0cmluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFF1ZXJ5U3RyaW5nID0gKCBxdWVyeURhdGEgPSB7fSApID0+IHtcblx0cXVlcnlEYXRhID0geyAuLi5kZWZhdWx0UXVlcnlEYXRhLnF1ZXJ5RGF0YSwgLi4ucXVlcnlEYXRhIH07XG5cdHJldHVybiBiYXNlR2V0UXVlcnlTdHJpbmcoIHF1ZXJ5RGF0YSwgd2hlcmVDb25kaXRpb25zLCBtYXBPcmRlckJ5ICk7XG59O1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqL1xuaW1wb3J0IHsgbWFwVmFsdWVzIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBtZW1vaXplIGZyb20gJ21lbWl6ZSc7XG5cbi8qKlxuICogSW50ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cbmltcG9ydCB7IGVuZHBvaW50cyB9IGZyb20gJy4vZW5kcG9pbnRzLmpzJztcblxuLyoqXG4gKiBSZWNlaXZlcyBhbiBvYmplY3QgbWFwIG9mIG1vZGVsTmFtZSB0byBlbmRwb2ludCBhbmQgbWFwcyB0aGF0IHRvIGEgZGVmYXVsdFxuICogbWFwIG9mIG1vZGVsTmFtZSB0byBlbXB0eSBvYmplY3QuXG4gKlxuICogQHBhcmFtIHsgT2JqZWN0IH0gbW9kZWxOYW1lRW5kcG9pbnRzXG4gKiBAcmV0dXJuIHsgT2JqZWN0IH0gQW4gb2JqZWN0IG9mIHsgeyBtb2RlbE5hbWUgfSA6IHt9IH1cbiAqL1xuY29uc3QgbWFwVG9PYmplY3RWYWx1ZXMgPSAoIG1vZGVsTmFtZUVuZHBvaW50cyApID0+IHtcblx0cmV0dXJuIG1hcFZhbHVlcyggbW9kZWxOYW1lRW5kcG9pbnRzLFxuXHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHt9O1xuXHRcdH0sXG5cdCk7XG59O1xuXG5jb25zdCBnZXREZWZhdWx0TW9kZWxFbnRpdGllc09iamVjdCA9IG1lbW9pemUoXG5cdCgpID0+IG1hcFRvT2JqZWN0VmFsdWVzKCBlbmRwb2ludHMgKVxuKTtcblxuLyoqXG4gKiBQcm92aWRlcyB0aGUgZGVmYXVsdCBzdGF0ZSB0byBiZSB1c2VkIGJ5IHN0b3JlcyBjb250YWluaW5nIGxpc3RzLlxuICpcbiAqIEB0eXBlIHsgT2JqZWN0IH1cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTElTVFNfU1RBVEUgPSBtYXBUb09iamVjdFZhbHVlcyggZW5kcG9pbnRzICk7XG5cbi8qKlxuICogUHJvdmlkZXMgdGhlIGRlZmF1bHQgc3RhdGUgdG8gYmUgdXNlZCBieSB0aGUgY29yZSBzdG9yZS5cbiAqXG4gKiBAdHlwZSB7e2VudGl0aWVzOiB7fSwgZW50aXR5SWRzOiB7fSwgZGlydHk6IHt9fX1cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ09SRV9TVEFURSA9IHtcblx0ZW50aXRpZXM6IHtcblx0XHQuLi5nZXREZWZhdWx0TW9kZWxFbnRpdGllc09iamVjdCgpLFxuXHR9LFxuXHRyZWxhdGlvbnM6IHtcblx0XHRpbmRleDoge30sXG5cdFx0ZW50aXR5TWFwOiB7fSxcblx0fSxcblx0ZGlydHk6IHtcblx0XHRyZWxhdGlvbnM6IHtcblx0XHRcdGluZGV4OiB7fSxcblx0XHRcdGRlbGV0ZToge30sXG5cdFx0XHRhZGQ6IHt9LFxuXHRcdH0sXG5cdFx0dHJhc2g6IHt9LFxuXHRcdGRlbGV0ZToge30sXG5cdH0sXG59O1xuXG4vKipcbiAqIFByb3ZpZGVzIHRoZSBkZWZhdWx0IHN0YXRlIHRvIGJlIHVzZWQgYnkgdGhlIHNjaGVtYSBzdG9yZS5cbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NDSEVNQV9TVEFURSA9IHtcblx0c2NoZW1hOiB7XG5cdFx0Li4uZ2V0RGVmYXVsdE1vZGVsRW50aXRpZXNPYmplY3QoKSxcblx0fSxcblx0ZmFjdG9yeToge1xuXHRcdC4uLmdldERlZmF1bHRNb2RlbEVudGl0aWVzT2JqZWN0KCksXG5cdH0sXG5cdHJlbGF0aW9uRW5kcG9pbnRzOiB7XG5cdFx0Li4uZ2V0RGVmYXVsdE1vZGVsRW50aXRpZXNPYmplY3QoKSxcblx0fSxcblx0cmVsYXRpb25TY2hlbWE6IHt9LFxufTtcbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBkYXRhIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vZWVqcyc7XG5cbi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBhc3NlcnRFbnRpdHlIYXNLZXkgfSBmcm9tICcuL2Fzc2VydGlvbnMnO1xuXG4vKipcbiAqIEFsbCBhdmFpbGFibGUgZW5kcG9pbnRzIGV4cG9zZWQgdmlhIHRoZSBlZWpzLmRhdGEgZ2xvYmFsIGZyb20gdGhlIHNlcnZlci5cbiAqXG4gKiBAdHlwZSB7e319XG4gKi9cbmV4cG9ydCBjb25zdCB7XG5cdGNvbGxlY3Rpb25fZW5kcG9pbnRzOiBlbmRwb2ludHMgPSB7fSxcblx0YmFzZV9yZXN0X3JvdXRlOiBiYXNlUmVzdFJvdXRlLFxufSA9IGRhdGEucGF0aHM7XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBlbmRwb2ludCBmb3IgdGhlIHByb3ZpZGVkIG1vZGVsLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWUgIFdoYXQgbW9kZWwgdG8gcmV0cmlldmUgdGhlIGVuZHBvaW50IGZvci5cbiAqIEByZXR1cm4ge3N0cmluZ30gIFRoZSBlbmRwb2ludCBmb3IgdGhlIHByb3ZpZGVkIG1vZGVsLlxuICogQHRocm93cyB7RXhjZXB0aW9ufVxuICovXG5leHBvcnQgY29uc3QgZ2V0RW5kcG9pbnQgPSAoIG1vZGVsTmFtZSApID0+IHtcblx0YXNzZXJ0RW50aXR5SGFzS2V5KCBtb2RlbE5hbWUsIGVuZHBvaW50cyApO1xuXHRyZXR1cm4gZW5kcG9pbnRzWyBtb2RlbE5hbWUgXTtcbn07XG5cbi8qKlxuICogQXBwbGllcyB0aGUgcHJvdmlkZWQgcXVlcnlTdHJpbmcgdG8gdGhlIGVuZHBvaW50IGZvciB0aGUgcHJvdmlkZWQgbW9kZWwgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWUgIFdoYXQgbW9kZWwgdGhlIGZpbmFsIHN0cmluZyBpcyBmb3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gcXVlcnlTdHJpbmcgIFRoZSBxdWVyeSBiZWluZyBhcHBlbmRlZCB0byB0aGUgZW5kcG9pbnQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBmaW5hbCBhc3NlbWJsZWQgcXVlcnkgc3RyaW5nLlxuICovXG5leHBvcnQgY29uc3QgYXBwbHlRdWVyeVN0cmluZyA9ICggbW9kZWxOYW1lLCBxdWVyeVN0cmluZyA9ICcnICkgPT4ge1xuXHRyZXR1cm4gcXVlcnlTdHJpbmcgIT09ICcnID9cblx0XHRnZXRFbmRwb2ludCggbW9kZWxOYW1lICkgKyAnPycgKyBxdWVyeVN0cmluZyA6XG5cdFx0Z2V0RW5kcG9pbnQoIG1vZGVsTmFtZSApO1xufTtcblxuLyoqXG4gKiBTdHJpcHMgdGhlIGJhc2VfcmVzdF9yb3V0ZSAoaS5lLiBodHRwczovL215dXJsLmNvbS93cC1qc29uLykgZnJvbSB0aGUgcHJvdmlkZWRcbiAqIHVybCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgdXJsIHdpdGggdGhlIGJhc2UgcmVzdCByb3V0ZSByZW1vdmVkLlxuICovXG5leHBvcnQgY29uc3Qgc3RyaXBCYXNlUm91dGVGcm9tVXJsID0gKCB1cmwgKSA9PiB7XG5cdHJldHVybiB1cmwucmVwbGFjZSggYmFzZVJlc3RSb3V0ZSwgJycgKTtcbn07XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgaXNVbmRlZmluZWQgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgc3ByaW50ZiB9IGZyb20gJ0BldmVudGVzcHJlc3NvL2kxOG4nO1xuaW1wb3J0IHsgSW52YWxpZFNjaGVtYSB9IGZyb20gJ0BldmVudGVzcHJlc3NvL2VlanMnO1xuaW1wb3J0IHsgaXNTY2hlbWEgfSBmcm9tICdAZXZlbnRlc3ByZXNzby92YWxpZGF0b3JzJztcbmltcG9ydCB7XG5cdE1vbmV5LFxuXHRTZXJ2ZXJEYXRlVGltZSBhcyBEYXRlVGltZSxcbn0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vdmFsdWUtb2JqZWN0cyc7XG4vKipcbiAqIEludGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHtcblx0aXNEYXRlVGltZUZpZWxkLFxuXHRpc01vbmV5RmllbGQsXG59IGZyb20gJy4vYm9vbGVhbnMnO1xuaW1wb3J0IHtcblx0aXNTaGFsbG93VmFsaWRWYWx1ZUZvckZpZWxkLFxuXHR2YWxpZGF0ZUVudW1UeXBlLFxuXHR2YWxpZGF0ZVR5cGUsXG5cdHZhbGlkYXRlVHlwZUZvckZpZWxkLFxufSBmcm9tICcuL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHsgbWF5YmVDb252ZXJ0RnJvbVZhbHVlT2JqZWN0V2l0aEFzc2VydGlvbnMgfSBmcm9tICcuL2V4dHJhY3RvcnMnO1xuXG4vKipcbiAqIEFzc2VydHMgd2hldGhlciB0aGUgcHJvdmlkZWQgZmllbGQgdmFsdWUgaXMgYSBrbm93biB2YWx1ZSBvYmplY3QuXG4gKlxuICogTm90ZTogdGhpcyBvbmx5IGFzc2VydHMga25vd24gdmFsdWUgb2JqZWN0cywgaWYgdGhlIHZhbHVlIGlzIG5vdCBkZXRlY3RlZCBhc1xuICogYSBrbm93biB2YWx1ZSBvYmplY3QgaXQgaXMgcGFzc2VkIGJhY2sgYXMgaXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZVxuICogQHBhcmFtIHsqfSBmaWVsZFZhbHVlXG4gKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hXG4gKiBAdGhyb3dzIEludmFsaWREYXRlVGltZVxuICogQHRocm93cyBUeXBlRXJyb3JcbiAqL1xuZXhwb3J0IGNvbnN0IG1heWJlQXNzZXJ0VmFsdWVPYmplY3QgPSAoIGZpZWxkTmFtZSwgZmllbGRWYWx1ZSwgc2NoZW1hICkgPT4ge1xuXHRpZiAoIGlzRGF0ZVRpbWVGaWVsZCggZmllbGROYW1lLCBzY2hlbWEgKSApIHtcblx0XHREYXRlVGltZS5hc3NlcnRJc0RhdGVUaW1lKCBmaWVsZFZhbHVlICk7XG5cdH1cblx0aWYgKCBpc01vbmV5RmllbGQoIGZpZWxkTmFtZSwgc2NoZW1hICkgKSB7XG5cdFx0TW9uZXkuYXNzZXJ0TW9uZXkoIGZpZWxkVmFsdWUgKTtcblx0fVxufTtcblxuLyoqXG4gKiBBc3NlcnRzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIG9iamVjdCBpcyBhIHZhbGlkIG1vZGVsIHNjaGVtYSBvYmplY3QuXG4gKlxuICogQ3VycmVudGx5LCBhbiBvYmplY3QgaXMgY29uc2lkZXJlZCBhIHZhbGlkIG1vZGVsIHNjaGVtYSBpZiBpdCBoYXMgYVxuICogJ3Byb3BlcnRpZXMnIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7Kn0gc2NoZW1hXG4gKiBAdGhyb3dzIEludmFsaWRTY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IGFzc2VydFZhbGlkU2NoZW1hID0gKCBzY2hlbWEgKSA9PiB7XG5cdGlmICggISBpc1NjaGVtYSggc2NoZW1hICkgKSB7XG5cdFx0dGhyb3cgbmV3IEludmFsaWRTY2hlbWEoXG5cdFx0XHQnVGhpcyBpcyBhbiBpbnZhbGlkIHNjaGVtYSBmb3IgYSBtb2RlbC4nLFxuXHRcdCk7XG5cdH1cbn07XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBmaWVsZCBleGlzdHMgaW4gdGhlIHByb3ZpZGVkIHNjaGVtYSBhbmQgdGhlIHNoYXBlIGZvclxuICogdGhlIHNjaGVtYSBlbnRyeSBvbiB0aGF0IGZpZWxkIGlzIGV4cGVjdGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWUgIFRoZSBtb2RlbCB0aGUgc2NoZW1hIGJlbG9uZ3MgdG8sIHRoaXMgaXMgdXNlZCBmb3JcbiAqIGVycm9yIG1lc3NhZ2VzLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZSAgVGhlIGZpZWxkIGJlaW5nIGNoZWNrZWQgYWdhaW5zdCB0aGUgc2NoZW1hXG4gKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hICAgICBUaGUgc2NoZW1hIGZvciB0aGUgbW9kZWwgdXNlZCBmb3IgdmFsaWRhdGlvblxuICogQHRocm93cyBJbnZhbGlkU2NoZW1hXG4gKiBAdGhyb3dzIFR5cGVFcnJvclxuICovXG5leHBvcnQgY29uc3QgYXNzZXJ0VmFsaWRTY2hlbWFGaWVsZFByb3BlcnRpZXMgPSAoXG5cdG1vZGVsTmFtZSxcblx0ZmllbGROYW1lLFxuXHRzY2hlbWEsXG4pID0+IHtcblx0aWYgKCBpc1VuZGVmaW5lZCggc2NoZW1hWyBmaWVsZE5hbWUgXSApICkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXG5cdFx0XHRzcHJpbnRmKFxuXHRcdFx0XHQnVGhlIGdpdmVuIFwiJXNcIiBmaWVsZE5hbWUgZG9lcyBub3QgaGF2ZSBhIGRlZmluZWQgc2NoZW1hICcgK1xuXHRcdFx0XHQnZm9yIHRoZSBtb2RlbCBcIiVzXCInLFxuXHRcdFx0XHRmaWVsZE5hbWUsXG5cdFx0XHRcdG1vZGVsTmFtZSxcblx0XHRcdCksXG5cdFx0KTtcblx0fVxuXHRpZiAoIHNjaGVtYVsgZmllbGROYW1lIF0udHlwZSA9PT0gJ29iamVjdCcgKSB7XG5cdFx0aWYgKCBpc1VuZGVmaW5lZCggc2NoZW1hWyBmaWVsZE5hbWUgXS5wcm9wZXJ0aWVzICkgKSB7XG5cdFx0XHR0aHJvdyBuZXcgSW52YWxpZFNjaGVtYShcblx0XHRcdFx0c3ByaW50Zihcblx0XHRcdFx0XHQnVGhlIHNjaGVtYSBmb3IgdGhlIGZpZWxkICVzIG9uIHRoZSBtb2RlbCAlcyBpcyBvZiB0eXBlICcgK1xuXHRcdFx0XHRcdCdcIm9iamVjdFwiIGJ1dCBkb2VzIG5vdCBoYXZlIGEgcHJvcGVydGllcyBwcm9wZXJ0eS4nLFxuXHRcdFx0XHRcdGZpZWxkTmFtZSxcblx0XHRcdFx0XHRtb2RlbE5hbWVcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHR9XG5cdFx0aWYgKCBpc1VuZGVmaW5lZCggc2NoZW1hWyBmaWVsZE5hbWUgXS5wcm9wZXJ0aWVzLnJhdyApICkge1xuXHRcdFx0dGhyb3cgbmV3IEludmFsaWRTY2hlbWEoXG5cdFx0XHRcdHNwcmludGYoXG5cdFx0XHRcdFx0J1RoZSBzY2hlbWEgZm9yIHRoZSBmaWVsZCAlcyBvbiB0aGUgbW9kZWwgJXMgaXMgb2YgdHlwZSAnICtcblx0XHRcdFx0XHQnXCJvYmplY3RcIiBidXQgZG9lcyBub3QgaGF2ZSBhIHJhdyBwcm9wZXJ0eSBpbiBpdFxcJ3MgJyArXG5cdFx0XHRcdFx0J1wicHJvcGVydGllc1wiIHByb3BlcnR5LicsXG5cdFx0XHRcdFx0ZmllbGROYW1lLFxuXHRcdFx0XHRcdG1vZGVsTmFtZVxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRpZiAoIGlzVW5kZWZpbmVkKCBzY2hlbWFbIGZpZWxkTmFtZSBdLnByb3BlcnRpZXMucmF3LnR5cGUgKSApIHtcblx0XHRcdHRocm93IG5ldyBJbnZhbGlkU2NoZW1hKFxuXHRcdFx0XHRzcHJpbnRmKFxuXHRcdFx0XHRcdCdUaGUgc2NoZW1hIGZvciB0aGUgZmllbGQgJXMgb24gdGhlIG1vZGVsICVzIGlzIG9mIHR5cGUgJyArXG5cdFx0XHRcdFx0J1wib2JqZWN0XCIgYW5kIGhhcyBhIHByb3BlcnRpZXMucmF3IHByb3BlcnR5LCBob3dldmVyIHRoZXJlJyArXG5cdFx0XHRcdFx0J2lzIG5vIFwidHlwZVwiIGRlZmluZWQgZm9yIHRoZSByYXcgcHJvcGVydHkuJyxcblx0XHRcdFx0XHRmaWVsZE5hbWUsXG5cdFx0XHRcdFx0bW9kZWxOYW1lXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxufTtcblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgdGhlIHZhbHVlIHByb3ZpZGVkIGZvciB0aGUgcHJlcGFyZWQgZmllbGQgaXMgdmFsaWQgYWNjb3JkaW5nIHRvXG4gKiB0aGUgc2NoZW1hLlxuICpcbiAqIFByZXBhcmVkIGZpZWxkcyBhcmU6XG4gKlxuICogLSBmaWVsZHMgaGF2aW5nIHZhbHVlcyB0aGF0IGFyZSBzZXQgYXMgYSB2YWx1ZSBvYmplY3QgYW5kIGV4cGVjdCBhIHZhbHVlXG4gKiAgIG9iamVjdCBvbiB1cGRhdGVzL2luc2VydHMuXG4gKiAtIGZpZWxkcyB0aGF0IGFyZSB0aGUgZXF1aXZhbGVudCBgcmF3YCB2YWx1ZSB3aGVuIHRoZSBmaWVsZCBpbiB0aGUgc2NoZW1hIGlzXG4gKiAgIGRlZmluZWQgdG8gaGF2ZSByYXcgYW5kIHJlbmRlcmVkL3ByZXR0eSB2YWx1ZXMuXG4gKlxuICogTm90ZTogIFRoaXMgdmFsaWRhdGVzIGFnYWluc3QgcHJlcGFyZWQgZmllbGRzIHdoaWNoIG1lYW5zIHRoYXQ6XG4gKlxuICogLSBpZiB0aGUgcHJlcGFyZWQgZmllbGQgaGFzIGEgdmFsdWUgb2JqZWN0IGFzIGl0cyB2YWx1ZSwgdGhlbiB0aGF0IHZhbHVlXG4gKiAgIG9iamVjdCBpcyB2YWxpZGF0ZWQgYmVmb3JlIGFueSBvdGhlciB2YWxpZGF0aW9uLlxuICogLSBpZiB0aGUgcHJlcGFyZWQgZmllbGQgcmVwcmVzZW50cyBhbiBvYmplY3QgaW4gdGhlIHNjaGVtYSwgdGhlbiBpdHMgdmFsdWUgaXNcbiAqICAgdmFsaWRhdGVkIGFnYWluc3QgdGhlIGByYXdgIHR5cGUgaW4gdGhlIHNjaGVtYS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lXG4gKiBAcGFyYW0geyp9IGZpZWxkVmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHRocm93cyBUeXBlRXJyb3JcbiAqIEB0aHJvd3MgSW52YWxpZERhdGVUaW1lXG4gKi9cbmV4cG9ydCBjb25zdCBhc3NlcnRWYWxpZFZhbHVlRm9yUHJlcGFyZWRGaWVsZCA9IChcblx0ZmllbGROYW1lLFxuXHRmaWVsZFZhbHVlLFxuXHRpbnN0YW5jZSxcbikgPT4ge1xuXHRjb25zdCB7IHNjaGVtYSB9ID0gaW5zdGFuY2U7XG5cdGxldCBpc1ZhbGlkID0gaXNTaGFsbG93VmFsaWRWYWx1ZUZvckZpZWxkKFxuXHRcdGZpZWxkTmFtZSxcblx0XHRmaWVsZFZhbHVlLFxuXHRcdHNjaGVtYSxcblx0KTtcblx0aWYgKCAhIGlzVmFsaWQgJiYgc2NoZW1hWyBmaWVsZE5hbWUgXS50eXBlID09PSAnb2JqZWN0JyAmJlxuXHRcdHNjaGVtYVsgZmllbGROYW1lIF0ucHJvcGVydGllc1xuXHQpIHtcblx0XHRpc1ZhbGlkID0gc2NoZW1hWyBmaWVsZE5hbWUgXS5wcm9wZXJ0aWVzLnJhdy5lbnVtID9cblx0XHRcdHZhbGlkYXRlRW51bVR5cGUoXG5cdFx0XHRcdHNjaGVtYVsgZmllbGROYW1lIF0ucHJvcGVydGllcy5yYXcudHlwZSxcblx0XHRcdFx0c2NoZW1hWyBmaWVsZE5hbWUgXS5wcm9wZXJ0aWVzLnJhdy5lbnVtLFxuXHRcdFx0XHRmaWVsZFZhbHVlLFxuXHRcdFx0KSA6XG5cdFx0XHR2YWxpZGF0ZVR5cGUoXG5cdFx0XHRcdHNjaGVtYVsgZmllbGROYW1lIF0ucHJvcGVydGllcy5yYXcudHlwZSxcblx0XHRcdFx0bWF5YmVDb252ZXJ0RnJvbVZhbHVlT2JqZWN0V2l0aEFzc2VydGlvbnMoXG5cdFx0XHRcdFx0ZmllbGROYW1lLFxuXHRcdFx0XHRcdGZpZWxkVmFsdWUsXG5cdFx0XHRcdFx0c2NoZW1hXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0aWYgKCAhIGlzVmFsaWQgKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFxuXHRcdFx0XHRzcHJpbnRmKFxuXHRcdFx0XHRcdCdUaGUgZ2l2ZW4gXCIlMSRzXCIgZmllbGQgIGlzIG5vdCB2YWxpZCBmb3IgdGhlIGRlZmluZWQgJyArXG5cdFx0XHRcdFx0J3NjaGVtYS4gIEl0XFwncyBgcmF3YCBwcm9wZXJ0eSBWYWx1ZSAoJTIkcykgaXMgbm90ICcgK1xuXHRcdFx0XHRcdCd0aGUgY29ycmVjdCBleHBlY3RlZCB0eXBlICglMyRzKS4nLFxuXHRcdFx0XHRcdGZpZWxkTmFtZSxcblx0XHRcdFx0XHRmaWVsZFZhbHVlLFxuXHRcdFx0XHRcdHNjaGVtYVsgZmllbGROYW1lIF0ucHJvcGVydGllcy5yYXcudHlwZSxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cdGlmICggISBpc1ZhbGlkICkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXG5cdFx0XHRzcHJpbnRmKFxuXHRcdFx0XHQnVGhlIGdpdmVuIFwiJTEkc1wiIGZpZWxkXFwncyBWYWx1ZSAoJTIkcykgaXMgbm90IHZhbGlkIGZvcicgK1xuXHRcdFx0XHQnIHRoZSBkZWZpbmVkIHNjaGVtYSB0eXBlICglMyRzKS4nLFxuXHRcdFx0XHRmaWVsZE5hbWUsXG5cdFx0XHRcdGZpZWxkVmFsdWUsXG5cdFx0XHRcdHNjaGVtYVsgZmllbGROYW1lIF0udHlwZSxcblx0XHRcdCksXG5cdFx0KTtcblx0fVxufTtcblxuLyoqXG4gKiBBc3NlcnRzIHdoZXRoZXIgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZmllbGQgaXMgdmFsaWQgYWNjb3JkaW5nIHRvIHRoZVxuICogc2NoZW1hLlxuICpcbiAqIFRoaXMgaXMgdXNlZCBvbiBlbnRpdHkgY29uc3RydWN0aW9uIGFuZCBkb2VzIG5vdCB2YWxpZGF0ZSBwcmVwYXJlZCBmaWVsZFxuICogdmFsdWVzIChzZWUgYXNzZXJ0IGFzc2VydFZhbGlkVmFsdWVGb3JQcmVwYXJlZEZpZWxkKS5cbiAqXG4gKiBUaGlzIG1ldGhvZCBhbHNvIGFzc2VydHMgdGhhdCB0aGUgc2NoZW1hIGhhcyB2YWxpZCBzY2hlbWEgZmllbGQgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lXG4gKiBAcGFyYW0geyp9IGZpZWxkVmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHRocm93cyBUeXBlRXJyb3JcbiAqIEB0aHJvd3MgSW52YWxpZFNjaGVtYVxuICovXG5leHBvcnQgY29uc3QgYXNzZXJ0VmFsaWRGaWVsZEFuZFZhbHVlQWdhaW5zdFNjaGVtYSA9IChcblx0bW9kZWxOYW1lLFxuXHRmaWVsZE5hbWUsXG5cdGZpZWxkVmFsdWUsXG5cdGluc3RhbmNlLFxuKSA9PiB7XG5cdGNvbnN0IHNjaGVtYSA9IGluc3RhbmNlLnNjaGVtYTtcblx0Y29uc3QgdmFsaWRhdGlvblR5cGUgPSB2YWxpZGF0ZVR5cGVGb3JGaWVsZCggZmllbGROYW1lLCBpbnN0YW5jZSApO1xuXHRhc3NlcnRWYWxpZFNjaGVtYUZpZWxkUHJvcGVydGllcyggbW9kZWxOYW1lLCBmaWVsZE5hbWUsIHNjaGVtYSApO1xuXHRsZXQgaXNWYWxpZCA9IGlzU2hhbGxvd1ZhbGlkVmFsdWVGb3JGaWVsZChcblx0XHRmaWVsZE5hbWUsXG5cdFx0ZmllbGRWYWx1ZSxcblx0XHRzY2hlbWEsXG5cdFx0ZmFsc2UsXG5cdCk7XG5cdC8vIGFjY291bnQgZm9yIGZpZWxkTmFtZSBmaWVsZFZhbHVlcyB0aGF0IGhhdmUgcHJvcGVydHkgc2NoZW1hLiBGb3IgTW9kZWxcblx0Ly8gRW50aXRpZXMsIG9ubHkgdGhlIFZBTElEQVRFX1RZUEUgcHJvcGVydHkgaXMgY2FyZWQgYWJvdXQuXG5cdGlmICggc2NoZW1hWyBmaWVsZE5hbWUgXS50eXBlID09PSAnb2JqZWN0JyAmJlxuXHRcdHNjaGVtYVsgZmllbGROYW1lIF0ucHJvcGVydGllc1xuXHQpIHtcblx0XHRpZiAoIGlzVW5kZWZpbmVkKCBmaWVsZFZhbHVlWyB2YWxpZGF0aW9uVHlwZSBdICkgKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFxuXHRcdFx0XHRzcHJpbnRmKFxuXHRcdFx0XHRcdCdUaGUgZ2l2ZW4gXCIlMSRzXCIgdmFsdWUgaXMgbm90IHZhbGlkIGZvciB0aGUgZGVmaW5lZCAnICtcblx0XHRcdFx0XHQnc2NoZW1hLiBJdCBtdXN0IGJlIGFuIG9iamVjdCBhbmQgaXQgbXVzdCBoYXZlIGEgJyArXG5cdFx0XHRcdFx0J2AlMiRzYCBrZXkuJyxcblx0XHRcdFx0XHRmaWVsZE5hbWUsXG5cdFx0XHRcdFx0dmFsaWRhdGlvblR5cGUsXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRpc1ZhbGlkID0gc2NoZW1hWyBmaWVsZE5hbWUgXS5wcm9wZXJ0aWVzWyB2YWxpZGF0aW9uVHlwZSBdLmVudW0gP1xuXHRcdFx0dmFsaWRhdGVFbnVtVHlwZShcblx0XHRcdFx0c2NoZW1hWyBmaWVsZE5hbWUgXS5wcm9wZXJ0aWVzWyB2YWxpZGF0aW9uVHlwZSBdLnR5cGUsXG5cdFx0XHRcdHNjaGVtYVsgZmllbGROYW1lIF0ucHJvcGVydGllcy5yYXcuZW51bSxcblx0XHRcdFx0ZmllbGRWYWx1ZVsgdmFsaWRhdGlvblR5cGUgXSxcblx0XHRcdCkgOlxuXHRcdFx0dmFsaWRhdGVUeXBlKFxuXHRcdFx0XHRzY2hlbWFbIGZpZWxkTmFtZSBdLnByb3BlcnRpZXNbIHZhbGlkYXRpb25UeXBlIF0udHlwZSxcblx0XHRcdFx0ZmllbGRWYWx1ZVsgdmFsaWRhdGlvblR5cGUgXVxuXHRcdFx0KTtcblx0XHRpZiAoICEgaXNWYWxpZCApIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXG5cdFx0XHRcdHNwcmludGYoXG5cdFx0XHRcdFx0J1RoZSBnaXZlbiBcIiUxJHNcIiB2YWx1ZSBpcyBub3QgdmFsaWQgZm9yIHRoZSBkZWZpbmVkICcgK1xuXHRcdFx0XHRcdCdzY2hlbWEuICBJdFxcJ3MgYCUyJHNgIHByb3BlcnR5IHZhbHVlICglMyRzKSBpcyBub3QgJyArXG5cdFx0XHRcdFx0J3RoZSBjb3JyZWN0IGV4cGVjdGVkIHR5cGUgKCU0JHMpLicsXG5cdFx0XHRcdFx0ZmllbGROYW1lLFxuXHRcdFx0XHRcdHZhbGlkYXRpb25UeXBlLFxuXHRcdFx0XHRcdGZpZWxkVmFsdWUsXG5cdFx0XHRcdFx0c2NoZW1hWyBmaWVsZE5hbWUgXS5wcm9wZXJ0aWVzWyB2YWxpZGF0aW9uVHlwZSBdLnR5cGUsXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXHRpZiAoICEgaXNWYWxpZCApIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFxuXHRcdFx0c3ByaW50Zihcblx0XHRcdFx0J1RoZSBnaXZlbiBcIiUxJHNcIiBmaWVsZFxcJ3MgdmFsdWUgKCUyJHMpIGlzIG5vdCB2YWxpZCBmb3InICtcblx0XHRcdFx0JyB0aGUgZGVmaW5lZCBzY2hlbWEgdHlwZSAoJTMkcykuJyxcblx0XHRcdFx0ZmllbGROYW1lLFxuXHRcdFx0XHRmaWVsZFZhbHVlLFxuXHRcdFx0XHRzY2hlbWFbIGZpZWxkTmFtZSBdLnR5cGUsXG5cdFx0XHQpLFxuXHRcdCk7XG5cdH1cbn07XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgaXNBcnJheSwgdXBwZXJGaXJzdCwgY2FtZWxDYXNlIH0gZnJvbSAnbG9kYXNoJztcblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IGFzc2VydFZhbGlkU2NoZW1hIH0gZnJvbSAnLi9hc3NlcnRpb25zJztcbmltcG9ydCB7XG5cdGNyZWF0ZUdldHRlcixcblx0Y3JlYXRlRW50aXR5R2V0dGVyc0FuZFNldHRlcnMsXG5cdGNyZWF0ZVBlcnNpc3RpbmdHZXR0ZXJzQW5kU2V0dGVycyxcblx0c2V0U2F2ZVN0YXRlLFxufSBmcm9tICcuL2NyZWF0ZSc7XG5pbXBvcnQge1xuXHRTQVZFX1NUQVRFLFxuXHRQUklWQVRFX1BST1BFUlRJRVMsXG59IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBCYXNlRW50aXR5IGlzIHRoZSBiYXNpYyBjbGFzcyBmb3IgYWxsIGVudGl0aWVzLiAgY3JlYXRlRW50aXR5RmFjdG9yeSByZXR1cm5zXG4gKiBhbiBpbnN0YW5jZSBvZiB0aGlzIGFuZCBhbGwgdGhlIGdldHRlcnMvc2V0dGVycyBmb3IgZmllbGRzIGV0YyBhcmVcbiAqIGR5bmFtaWNhbGx5IGNyZWF0ZWQgdmlhIHRoZSBjb25zdHJ1Y3Rvci5cbiAqL1xuY2xhc3MgQmFzZUVudGl0eSB7XG5cdFsgUFJJVkFURV9QUk9QRVJUSUVTLlNBVkVfU1RBVEUgXSA9IFNBVkVfU1RBVEUuQ0xFQU47XG5cdFsgUFJJVkFURV9QUk9QRVJUSUVTLlZBTElEQVRFX1RZUEVTIF0gPSB7fTtcblxuXHQvKipcblx0ICogQ29uc3RydWN0b3IgZm9yIEJhc2UgRW50aXR5XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcblx0ICogQHBhcmFtIHtPYmplY3R9IGVudGl0eUZpZWxkc0FuZFZhbHVlc1xuXHQgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hXG5cdCAqIEBwYXJhbSB7QXJyYXl9ZmllbGRQcmVmaXhlc1xuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGlzTmV3XG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcihcblx0XHRtb2RlbE5hbWUsXG5cdFx0ZW50aXR5RmllbGRzQW5kVmFsdWVzLFxuXHRcdHNjaGVtYSxcblx0XHRmaWVsZFByZWZpeGVzID0gW10sXG5cdFx0aXNOZXcgPSBmYWxzZSxcblx0KSB7XG5cdFx0YXNzZXJ0VmFsaWRTY2hlbWEoIHNjaGVtYSApO1xuXHRcdGZpZWxkUHJlZml4ZXMgPSBpc0FycmF5KCBmaWVsZFByZWZpeGVzICkgPyBmaWVsZFByZWZpeGVzIDogW107XG5cdFx0Y3JlYXRlR2V0dGVyKCB0aGlzLCAnZmllbGRQcmVmaXhlcycsIGZpZWxkUHJlZml4ZXMgKTtcblx0XHRjcmVhdGVHZXR0ZXIoIHRoaXMsICdzY2hlbWEnLCBzY2hlbWEucHJvcGVydGllcyApO1xuXHRcdHNldFNhdmVTdGF0ZShcblx0XHRcdHRoaXMsXG5cdFx0XHRpc05ldyA/IFNBVkVfU1RBVEUuTkVXIDogU0FWRV9TVEFURS5DTEVBTlxuXHRcdCk7XG5cdFx0Y3JlYXRlR2V0dGVyKCB0aGlzLCAnbW9kZWxOYW1lJywgbW9kZWxOYW1lICk7XG5cdFx0Y3JlYXRlR2V0dGVyKCB0aGlzLCAnb3JpZ2luYWxGaWVsZHNBbmRWYWx1ZXMnLCBlbnRpdHlGaWVsZHNBbmRWYWx1ZXMgKTtcblx0XHRjcmVhdGVHZXR0ZXIoXG5cdFx0XHR0aGlzLFxuXHRcdFx0J2ZpZWxkc1RvUGVyc2lzdE9uSW5zZXJ0Jyxcblx0XHRcdG5ldyBTZXQoIE9iamVjdC5rZXlzKCBlbnRpdHlGaWVsZHNBbmRWYWx1ZXMgKSApXG5cdFx0KTtcblx0XHRjcmVhdGVFbnRpdHlHZXR0ZXJzQW5kU2V0dGVycyggdGhpcyApO1xuXHRcdGNyZWF0ZVBlcnNpc3RpbmdHZXR0ZXJzQW5kU2V0dGVycyggdGhpcyApO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2F2ZSBzdGF0ZSBvbiB0aGUgZW50aXR5LlxuXHQgKlxuXHQgKiBTYXZlIHN0YXRlIGRlc2NyaWJlcyB3aGV0aGVyIHRoZSBlbnRpdHkgaXM6XG5cdCAqXG5cdCAqIC0gU0FWRV9TVEFURS5ORVc6IFRoZSBlbnRpdHkgaGFzIG5ldmVyIGJlZW4gcGVyc2lzdGVkIHRvIHN0b3JhZ2UuXG5cdCAqIC0gU0FWRV9TVEFURS5DTEVBTjogVGhlIGVudGl0eSBleGlzdHMgaW4gc3RvcmFnZSBhbmQgaGFzIG5vdCBiZWVuIG11dGF0ZWQuXG5cdCAqIC0gU0FWRV9TVEFURS5ESVJUWTogVGhlIGVudGl0eSBpcyBtdXRhdGVkIGFuZCBjaGFuZ2VzIGhhdmUgbm90IGJlZW5cblx0ICogcGVyc2lzdGVkIHRvIHN0b3JhZ2UuXG5cdCAqXG5cdCAqIEByZXR1cm4ge1N5bWJvbH0gIFJldHVybnMgdGhlIGN1cnJlbnQgc2F2ZSBzdGF0ZSBmb3IgdGhlIGVudGl0eS5cblx0ICovXG5cdGdldCBzYXZlU3RhdGUoKSB7XG5cdFx0cmV0dXJuIHRoaXNbIFBSSVZBVEVfUFJPUEVSVElFUy5TQVZFX1NUQVRFIF07XG5cdH1cblxuXHQvKipcblx0ICogV2hldGhlciB0aGUgY3VycmVudCBzYXZlIHN0YXRlIGlzIFNBVkVfU1RBVEUuTkVXXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59ICBUcnVlIG1lYW5zIFNBVkVfU1RBVEUuTkVXIGlzIHRoZSBzYXZlIHN0YXRlLlxuXHQgKi9cblx0Z2V0IGlzTmV3KCkge1xuXHRcdHJldHVybiB0aGlzLnNhdmVTdGF0ZSA9PT0gU0FWRV9TVEFURS5ORVc7XG5cdH1cblxuXHQvKipcblx0ICogV2hldGhlciB0aGUgY3VycmVudCBzYXZlIHN0YXRlIGlzIFNBVkVfU1RBVEUuRElSVFlcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gIFRydWUgbWVhbnMgU0FWRV9TVEFURS5ESVJUWSBpcyB0aGUgc2F2ZSBzdGF0ZS5cblx0ICovXG5cdGdldCBpc0RpcnR5KCkge1xuXHRcdHJldHVybiB0aGlzLnNhdmVTdGF0ZSA9PT0gU0FWRV9TVEFURS5ESVJUWTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaGV0aGVyIHRoZSBjdXJyZW50IHNhdmUgc3RhdGUgaXMgU0FWRV9TVEFURS5DTEVBTlxuXHQgKiBAcmV0dXJuIHtib29sZWFufSAgVHJ1ZSBtZWFucyBTQVZFX1NUQVRFLkNMRUFOIGlzIHRoZSBzYXZlIHN0YXRlLlxuXHQgKi9cblx0Z2V0IGlzQ2xlYW4oKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2F2ZVN0YXRlID09PSBTQVZFX1NUQVRFLkNMRUFOO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdoZXRoZXIgdGhlIGVudGl0eSBoYXMgYW55IHBhc3N3b3JkIHByb3RlY3RlZCBmaWVsZHMuXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgbWVhbnMgaXQgZG9lcywgZmFsc2UgbWVhbnMgaXQgZG9lc24ndC5cblx0ICovXG5cdGdldCBpc1Bhc3N3b3JkUHJvdGVjdGVkKCkge1xuXHRcdHJldHVybiB0aGlzLnByb3RlY3RlZEZpZWxkcy5sZW5ndGggPiAwO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdoZXRoZXIgdGhlIGdpdmVuIGZpZWxkTmFtZSBpcyBhIHBhc3N3b3JkIHByb3RlY3RlZCBmaWVsZC5cblx0ICogQHJldHVybiB7ZnVuY3Rpb24oc3RyaW5nKTogYm9vbGVhbn0gIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkXG5cdCAqIHRvIGNoZWNrIGlmIHRoZSBnaXZlbiBmaWVsZCBuYW1lIGlzIGEgcHJvdGVjdGVkIGZpZWxkIGluIHRoaXMgZW50aXR5LlxuXHQgKi9cblx0Z2V0IGlzRmllbGRQYXNzd29yZFByb3RlY3RlZCgpIHtcblx0XHRyZXR1cm4gKCBmaWVsZE5hbWUgKSA9PiB0aGlzLnByb3RlY3RlZEZpZWxkcy5pbmRleE9mKCBmaWVsZE5hbWUgKSA+IC0xO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVzZWQgdG8gY2xvbmUgdGhlIGN1cnJlbnQgZW50aXR5IG9iamVjdC4gIFRoaXMgcmVzdWx0cyBpbiBhbiBpbnN0YW5jZSBvZlxuXHQgKiBCYXNlRW50aXR5IHRoYXQgaXMgZXF1aXZhbGVudCBhcyB0aGlzIGN1cnJlbnQgaW5zdGFuY2UgKGV4Y2VwdCBpdCB3aWxsXG5cdCAqIGhhdmUgYSBuZXcgZ2VuZXJhdGVkIGlkKS5cblx0ICpcblx0ICogQHJldHVybiB7QmFzZUVudGl0eX0gQSBuZXcgaW5zdGFuY2Ugb2YgQmFzZUVudGl0eVxuXHQgKi9cblx0Z2V0IGNsb25lKCkge1xuXHRcdHJldHVybiBuZXcgQmFzZUVudGl0eShcblx0XHRcdHRoaXMubW9kZWxOYW1lLFxuXHRcdFx0dGhpcy5mb3JDbG9uZSxcblx0XHRcdHsgJHNjaGVtYToge30sIHByb3BlcnRpZXM6IHRoaXMuc2NoZW1hIH0sXG5cdFx0XHR0aGlzLmZpZWxkUHJlZml4ZXMsXG5cdFx0XHR0cnVlXG5cdFx0KTtcblx0fVxuXG5cdHN0YXRpYyBuYW1lID0gJ0Jhc2VFbnRpdHknXG59XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGdpdmVzIGEgY2xhc3MgdGhlIHByb3ZpZGVkIG5hbWVcbiAqIChhbmQgb3B0aW9uYWxseSBleHRlbmRzIHRoZSBwcm92aWRlZCBvYmplY3QpLlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBleHRlbmRlZENsYXNzXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBmdW5jdGlvblxuICovXG5jb25zdCBuYW1lQ2xhc3MgPSAoIG5hbWUsIGV4dGVuZGVkQ2xhc3MgKSA9PiB7XG5cdHJldHVybiBjbGFzcyBleHRlbmRzIGV4dGVuZGVkQ2xhc3Mge1xuXHRcdHN0YXRpYyBnZXQgbmFtZSgpIHtcblx0XHRcdHJldHVybiBuYW1lO1xuXHRcdH1cblx0fTtcbn07XG5cbi8qKlxuICogQSBmYWN0b3J5IGZvciBlbnRpdHkgZmFjdG9yaWVzLlxuICpcbiAqIENhbGxpbmcgdGhpcyByZXR1cm5zIGFuIG9iamVjdCBvZiBmYWN0b3J5IGZ1bmN0aW9ucyB0aGF0IGluc3RhbnRpYXRlIGFuXG4gKiBpbnN0YW5jZSBvZiBhIG5hbWVkIEVudGl0eS4gIFRoZSBtb2RlbE5hbWUgaXMgdXNlZCBhcyB0aGUgbmFtZSBmb3IgdGhlIG5ld1xuICogZW50aXR5LlxuICpcbiAqIFR3byBtZXRob2RzIGFyZSBhdmFpbGFibGUgb24gdGhlIG9iamVjdCByZXR1cm5lZDogYGNyZWF0ZU5ld2AgYW5kXG4gKiBgZnJvbUV4aXN0aW5nYC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lICBUaGUgbW9kZWwgZm9yIHRoZSBlbnRpdHlcbiAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWEgICAgIFRoZSBzY2hlbWEgZm9yIHRoZSBtb2RlbC4gVGhpcyBpcyB0aGUgc2NoZW1hXG4gKiBwcm92aWRlZCBieSB0aGUgT1BUSU9OUyBlbmRwb2ludCBmb3IgdGhlIG1vZGVsLlxuICogQHBhcmFtIHtBcnJheX0gZmllbGRQcmVmaXhlcyBBbiBhcnJheSBvZiBmaWVsZCBwcmVmaXhlcyBmb3IgYmFzZSBmaWVsZHMgb25cbiAqIG9uIHRoZSBtb2RlbCAoZWcuIEV2ZW50IG1vZGVsIGhhcyBgWyBFVlQgXWAgcHJlZml4ZXMgb24gZmllbGRzLCBEYXRldGltZSBtb2RlbFxuICogaGFzIFsgYERUVGAsIGBEVFRfRVZUYCBdXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgZmFjdG9yeSBmb3IgaW5zdGFudGlhdGluZyBhbiBlbnRpdHkgaW5zdGFuY2UuXG4gKi9cbmNvbnN0IGNyZWF0ZUVudGl0eUZhY3RvcnkgPSAoIG1vZGVsTmFtZSwgc2NoZW1hLCBmaWVsZFByZWZpeGVzID0gW10gKSA9PiB7XG5cdGNvbnN0IEVudGl0eSA9IG5hbWVDbGFzcyhcblx0XHR1cHBlckZpcnN0KCBjYW1lbENhc2UoIG1vZGVsTmFtZSApICksXG5cdFx0QmFzZUVudGl0eVxuXHQpO1xuXHRyZXR1cm4ge1xuXHRcdC8qKlxuXHRcdCAqIEV4cG9zZXMgbW9kZWxOYW1lIHNvIGNsaWVudCBjb2RlIGNhbiBkZXJpdmUgd2hhdCBtb2RlbCB0aGlzIGZhY3Rvcnlcblx0XHQgKiBpcyBmb3IgZnJvbSBhbnkgZ2l2ZW4gZmFjdG9yeS5cblx0XHQgKiBAdHlwZSBzdHJpbmdcblx0XHQgKi9cblx0XHRtb2RlbE5hbWU6IG1vZGVsTmFtZSxcblx0XHQvKipcblx0XHQgKiBUaGlzIGlzIHRoZSBjbGFzcyBkZWZpbml0aW9uIGZvciB0aGUgRW50aXR5LiAgVHlwaWNhbGx5IHRoaXMgaXNcblx0XHQgKiByZXRyaWV2ZWQgZm9yIHRoZSBhYmlsaXR5IHRvIGRvIGluc3RhbmNlb2YgY2hlY2tzLlxuXHRcdCAqL1xuXHRcdGNsYXNzRGVmOiBFbnRpdHksXG5cdFx0LyoqXG5cdFx0ICogVGhpcyByZXR1cm5zIGFuIGluc3RhbmNlIG9mIEVudGl0eSBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50cyB3aXRoIHRoZVxuXHRcdCAqIGluZGljYXRpb24gdGhpcyBpcyBhIG5ldyBub24tcGVyc2lzdGVkIGVudGl0eS4gIFRoaXMgbWVhbnM6XG5cdFx0ICpcblx0XHQgKiAtIEFsbCBmaWVsZCB2YWx1ZXMgYXJlIHBvcHVsYXRlZCBhbmQgYW55IG5vdCBwcm92aWRlZCB3aWxsIGJlXG5cdFx0ICogICBwb3B1bGF0ZWQgd2l0aCBkZWZhdWx0IHZhbHVlcyBkZWZpbmVkIGJ5IHRoZSBzY2hlbWEuXG5cdFx0ICogLSBHZW5lcmF0ZXMgdGVtcG9yYXJ5IHVuaXF1ZSBpZHMgZm9yIHRoZSBwcmltYXJ5IGtleSBmaWVsZHMgb24gdGhlXG5cdFx0ICogICBlbnRpdHkgKHVzaW5nIGN1aWQpLlxuXHRcdCAqIC0gU2V0cyB0aGUgYGlzTmV3YCBmbGFnIHRvIHRydWUgZm9yIHRoZSBlbnRpdHkgc28gY2xpZW50IGNvZGUgaXMgYWJsZVxuXHRcdCAqICAgdG8gZGlzY292ZXIgd2hpY2ggZW50aXRpZXMgaGF2ZSBuZXZlciBiZWVuIHBlcnNpc3RlZC5cblx0XHQgKiAtIFRoaXMgZmFjdG9yeSBtZXRob2QgZXhwZWN0cyBmaWVsZHMgYW5kIHZhbHVlcyB0byBiZSBcInByZXBhcmVkXCIuXG5cdFx0ICogICBXaGF0IHRoYXQgbWVhbnMgaXMgdGhhdCBmb3IgYW55IGZpZWxkcyB0aGF0IHRoZSBzY2hlbWEgZGVzY3JpYmVkIGFzXG5cdFx0ICogICBoYXZpbmcgYSBgcmF3YCBwcm9wZXJ0eSAoaS5lLiB7IEVWVF9kZXNjOiB7IHJhdzogJ3NvbWV0aGluZycgfSB9KVxuXHRcdCAqICAgdGhlIHZhbHVlIHNob3VsZCBiZSBvZiB0aGUgY29ycmVjdCB0eXBlIGZvciB0aGF0IHJhdyBwcm9wZXJ0eSBhbmQuXG5cdFx0ICogICBUaGlzIGFsc28gbWVhbnMgaXMgdGhhdCBmb3IgYW55IGZpZWxkcyB0aGUgc2NoZW1hIGRlc2NyaWJlcyBhcyBhXG5cdFx0ICogICBkYXRlLXRpbWUgKGZvcm1hdCkgb3IgbW9uZXkgKGZvcm1hdCkgZmllbGQsIHRoZSB2YWx1ZSBpcyBleHBlY3RlZFxuXHRcdCAqICAgdG8gYmUgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2JqZWN0LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGZpZWxkc0FuZFZhbHVlc1xuXHRcdCAqIEByZXR1cm4ge0VudGl0eX0gYW4gaW5zdGFuY2Ugb2YgRW50aXR5XG5cdFx0ICovXG5cdFx0Y3JlYXRlTmV3OiAoIGZpZWxkc0FuZFZhbHVlcyApID0+IG5ldyBFbnRpdHkoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRmaWVsZHNBbmRWYWx1ZXMsXG5cdFx0XHRzY2hlbWEsXG5cdFx0XHRmaWVsZFByZWZpeGVzLFxuXHRcdFx0dHJ1ZVxuXHRcdCksXG5cdFx0LyoqXG5cdFx0ICogVGhpcyByZXR1cm5zIGFuIGluc3RhbmNlIG9mIEVudGl0eSBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50cyB3aXRoIHRoZVxuXHRcdCAqIGluZGljYXRpb24gdGhpcyByZXByZXNlbnRzIHRoZSBlbnRpdHkgYXMgaXMgaW4gdGhlIGRiLiAgVGhpcyBtZWFuczpcblx0XHQgKlxuXHRcdCAqIC0gQWxsIGZpZWxkIHZhbHVlcyBhcmUgTk9UIHBvcHVsYXRlZCBpZiBtaXNzaW5nIHZhbHVlcy4gIFRoaXMgaXNcblx0XHQgKiAgIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvciBjb250ZXh0cyBsaWtlIHVuYXV0aG9yaXplZCB2aWV3cyB3aGVyZVxuXHRcdCAqICAgb25seSBwYXJ0aWFsIGVudGl0aWVzIGFyZSByZXR1cm5lZCBpbiBSRVNUIHJlc3BvbnNlcy5cblx0XHQgKiAtIGlzTmV3IGZsYWcgaXMgc2V0IHRvIGZhbHNlIChhbmQgbmV2ZXIgY2hhbmdlcyBmb3IgdGhpcyBlbnRpdHkpXG5cdFx0ICogLSBUaGUgaW5jb21pbmcgdmFsdWVzIGFyZSBleHBlY3RlZCB0byBiZSBpbiB0aGUgZXhhY3Qgc2hhcGUgYXNcblx0XHQgKiAgIGRlc2NyaWJlZCBieSB0aGUgc2NoZW1hIGZvciB0aGUgZW50aXR5IG1vZGVsLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGZpZWxkc0FuZFZhbHVlc1xuXHRcdCAqIEByZXR1cm4ge0VudGl0eX0gYW4gaW5zdGFuY2Ugb2YgRW50aXR5XG5cdFx0ICovXG5cdFx0ZnJvbUV4aXN0aW5nOiAoIGZpZWxkc0FuZFZhbHVlcyApID0+IG5ldyBFbnRpdHkoXG5cdFx0XHRtb2RlbE5hbWUsXG5cdFx0XHRmaWVsZHNBbmRWYWx1ZXMsXG5cdFx0XHRzY2hlbWEsXG5cdFx0XHRmaWVsZFByZWZpeGVzXG5cdFx0KSxcblx0fTtcbn07XG5leHBvcnQgZGVmYXVsdCBjcmVhdGVFbnRpdHlGYWN0b3J5O1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IGlzUGxhaW5PYmplY3QsIGlzVW5kZWZpbmVkIH0gZnJvbSAnbG9kYXNoJztcblxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcHJvdmlkZWQgdmFsdWUgaGFzIGEgXCJyYXdcIiBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdCBhbmQgaGFzIGEgYHJhd2AgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBjb25zdCBoYXNSYXdQcm9wZXJ0eSA9ICggdmFsdWUgKSA9PiBpc1BsYWluT2JqZWN0KCB2YWx1ZSApICYmXG5cdCEgaXNVbmRlZmluZWQoIHZhbHVlLnJhdyApO1xuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBwcm92aWRlZCB2YWx1ZSBoYXMgYSBcInByZXR0eVwiIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm4geyp9IFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0IGFuZCBoYXMgYSBgcHJldHR5YCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGNvbnN0IGhhc1ByZXR0eVByb3BlcnR5ID0gKCB2YWx1ZSApID0+IGlzUGxhaW5PYmplY3QoIHZhbHVlICkgJiZcblx0ISBpc1VuZGVmaW5lZCggdmFsdWUucHJldHR5ICk7XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIHZhbHVlIGhhcyBhIFwicmVuZGVyZWRcIiBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdCBhbmQgaGFzIGEgYHJlbmRlcmVkYCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGNvbnN0IGhhc1JlbmRlcmVkUHJvcGVydHkgPSAoIHZhbHVlICkgPT4gaXNQbGFpbk9iamVjdCggdmFsdWUgKSAmJlxuXHQhIGlzVW5kZWZpbmVkKCB2YWx1ZS5yZW5kZXJlZCApO1xuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBwcm92aWRlZCB2YWx1ZSBoYXMgYSBcImZvcm1hdFwiIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0IGFuZCBoYXMgYSBgZm9ybWF0YCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGNvbnN0IGhhc0Zvcm1hdFByb3BlcnR5ID0gKCB2YWx1ZSApID0+IGlzUGxhaW5PYmplY3QoIHZhbHVlICkgJiZcblx0ISBpc1VuZGVmaW5lZCggdmFsdWUuZm9ybWF0ICk7XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIHZhbHVlIGhhcyBhIFwiZW51bVwiIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0IGFuZCBoYXMgYW4gZW51bVxuICogcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBjb25zdCBoYXNFbnVtUHJvcGVydHkgPSAoIHZhbHVlICkgPT4gaXNQbGFpbk9iamVjdCggdmFsdWUgKSAmJlxuXHQhIGlzVW5kZWZpbmVkKCB2YWx1ZS5lbnVtICk7XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIHZhbHVlIGlzIGEgXCJ2YWx1ZSBvYmplY3RcIiBmaWVsZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGRcbiAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWFcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgdmFsdWUgb2JqZWN0IGZpZWxkLlxuICovXG5leHBvcnQgY29uc3QgaXNWYWx1ZU9iamVjdEZpZWxkID0gKCBmaWVsZCwgc2NoZW1hICkgPT4ge1xuXHRyZXR1cm4gaXNEYXRlVGltZUZpZWxkKCBmaWVsZCwgc2NoZW1hICkgfHwgaXNNb25leUZpZWxkKCBmaWVsZCwgc2NoZW1hICk7XG59O1xuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBwcm92aWRlZCBmaWVsZCBpcyBhIGRhdGUtdGltZSBmaWVsZCBhY2NvcmRpbmcgdG8gdGhlXG4gKiBwcm92aWRlZCBzY2hlbWEuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkXG4gKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIG1lYW5zIGl0IGlzIGEgZGF0ZS10aW1lIGZpZWxkLlxuICovXG5leHBvcnQgY29uc3QgaXNEYXRlVGltZUZpZWxkID0gKCBmaWVsZCwgc2NoZW1hICkgPT5cblx0ISBpc1VuZGVmaW5lZCggc2NoZW1hWyBmaWVsZCBdICkgJiZcblx0aGFzRm9ybWF0UHJvcGVydHkoIHNjaGVtYVsgZmllbGQgXSApICYmXG5cdHNjaGVtYVsgZmllbGQgXS5mb3JtYXQgPT09ICdkYXRlLXRpbWUnO1xuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBwcm92aWRlZCBmaWVsZCBpcyBhIFVUQyBkYXRlLXRpbWUgZmllbGQuXG4gKlxuICogSWYgc2NoZW1hIGlzIHByb3ZpZGVkLCB0aGlzIGFsc28gY29uc2lkZXJzIHdoZXRoZXIgdGhpcyBpcyBhIGRhdGUtdGltZSBmaWVsZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0ZVRpbWVGaWVsZE5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWEgW29wdGlvbmFsXVxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBtZWFucyB0aGlzIGlzIGEgVVRDIGZpZWxkLiAgSWYgc2NoZW1hIGlzIHByb3ZpZGVkIGl0XG4gKiBtZWFucyB0aGlzIGlzIGFsc28gYSBkYXRlLXRpbWUgZmllbGQuXG4gKi9cbmV4cG9ydCBjb25zdCBpc1VUQ0RhdGVUaW1lRmllbGQgPSAoIGRhdGVUaW1lRmllbGROYW1lLCBzY2hlbWEgPSBudWxsICkgPT4ge1xuXHRyZXR1cm4gc2NoZW1hICE9PSBudWxsID9cblx0XHRpc0RhdGVUaW1lRmllbGQoIGRhdGVUaW1lRmllbGROYW1lLCBzY2hlbWEgKSAmJlxuXHRcdFx0ZGF0ZVRpbWVGaWVsZE5hbWUuaW5kZXhPZiggJ19nbXQnICkgPiAwIDpcblx0XHRkYXRlVGltZUZpZWxkTmFtZS5pbmRleE9mKCAnX2dtdCcgKSA+IDA7XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciB0aGUgcHJvdmlkZWQgZmllbGQgcmVwcmVzZW50cyBhIHByaW1hcnkga2V5IGZpZWxkIHVzaW5nIHRoZVxuICogcHJvdmlkZWQgc2NoZW1hLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWFcbiAqIEByZXR1cm4ge2Jvb2xlYW59ICBUcnVlIG1lYW5zIGl0IGlzIGEgcHJpbWFyeSBrZXkgZmllbGQuXG4gKi9cbmV4cG9ydCBjb25zdCBpc1ByaW1hcnlLZXlGaWVsZCA9ICggZmllbGROYW1lLCBzY2hlbWEgKSA9PlxuXHQhIGlzVW5kZWZpbmVkKCBzY2hlbWFbIGZpZWxkTmFtZSBdICkgJiZcblx0ISBpc1VuZGVmaW5lZCggc2NoZW1hWyBmaWVsZE5hbWUgXS5wcmltYXJ5X2tleSApO1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciB0aGUgcHJvdmlkZWQgZmllbGQgcmVwcmVzZW50cyBhIHJlYWRvbmx5IGZpZWxkIHVzaW5nIHRoZVxuICogcHJvdmlkZWQgc2NoZW1hLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWFcbiAqIEByZXR1cm4ge2Jvb2xlYW59ICBUcnVlIG1lYW5zIGl0IGlzIGEgcmVhZG9ubHkgZmllbGQuXG4gKi9cbmV4cG9ydCBjb25zdCBpc1JlYWRPbmx5ID0gKCBmaWVsZE5hbWUsIHNjaGVtYSApID0+XG5cdCEgaXNVbmRlZmluZWQoIHNjaGVtYVsgZmllbGROYW1lIF0gKSAmJlxuXHQhIGlzVW5kZWZpbmVkKCBzY2hlbWFbIGZpZWxkTmFtZSBdLnJlYWRvbmx5ICkgJiZcblx0c2NoZW1hWyBmaWVsZE5hbWUgXS5yZWFkb25seTtcblxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcHJvdmlkZWQgZmllbGQgaXMgYSBcImVudGl0eVwiIGZpZWxkIHVzaW5nIHRoZSBwcm92aWRlZFxuICogc2NoZW1hLlxuICpcbiAqIEFuIFwiZW50aXR5XCIgZmllbGQgaXMgYW55IGZpZWxkIHRoYXQgc2F0aXNmaWVzIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiAtIGZpZWxkIGV4aXN0cyBpbiB0aGUgc2NoZW1hXG4gKiAtIGl0IGlzIG5vdCByZWFkb25seSBvciBpcyBhIHByaW1hcnkga2V5IGZpZWxkLlxuICogLSBpdCBpcyBub3QgYSB1dGMgZmllbGQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZVxuICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYVxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGlzIGlzIGFuIGVudGl0eSBmaWVsZFxuICovXG5leHBvcnQgY29uc3QgaXNFbnRpdHlGaWVsZCA9ICggZmllbGROYW1lLCBzY2hlbWEgKSA9PlxuXHQhIGlzVW5kZWZpbmVkKCBzY2hlbWFbIGZpZWxkTmFtZSBdICkgJiZcblx0KCAhIGlzUmVhZE9ubHkoIGZpZWxkTmFtZSwgc2NoZW1hICkgfHxcblx0XHRpc1ByaW1hcnlLZXlGaWVsZCggZmllbGROYW1lLCBzY2hlbWEgKVxuXHQpICYmXG5cdCEgaXNVVENEYXRlVGltZUZpZWxkKCBmaWVsZE5hbWUgKSAmJlxuXHRmaWVsZE5hbWUgIT09ICdfcHJvdGVjdGVkJztcblxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZmllbGQgcmVwcmVzZW50cyBhIHZhbHVlIG9mIG1vbmV5IGZyb20gdGhlIHByb3ZpZGVkXG4gKiBzY2hlbWEuXG4gKlxuICogQSBmaWVsZCBpcyBhIG1vbmV5IGZpZWxkIGlmIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgc2F0aXNmaWVkOlxuICpcbiAqIC0gSXQgZXhpc3RzIGluIHRoZSBzY2hlbWFcbiAqIC0gSXQgaGFzIGEgcHJldHR5IHByb3BlcnR5XG4gKiAtIFRoZSBwcmV0dHkgcHJvcGVydHkgdmFsdWUgaGFzIGEgZm9ybWF0IHByb3BlcnR5LlxuICogLSBUaGUgZm9ybWF0IHByb3BlcnR5IGlzIGVxdWFsIHRvICdtb25leSdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lXG4gKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGl0IGlzIGEgbW9uZXkgZmllbGQuXG4gKi9cbmV4cG9ydCBjb25zdCBpc01vbmV5RmllbGQgPSAoIGZpZWxkTmFtZSwgc2NoZW1hICkgPT5cblx0ISBpc1VuZGVmaW5lZCggc2NoZW1hWyBmaWVsZE5hbWUgXSApICYmXG5cdCEgaXNVbmRlZmluZWQoIHNjaGVtYVsgZmllbGROYW1lIF0ucHJvcGVydGllcyApICYmXG5cdGhhc1ByZXR0eVByb3BlcnR5KCBzY2hlbWFbIGZpZWxkTmFtZSBdLnByb3BlcnRpZXMgKSAmJlxuXHRoYXNGb3JtYXRQcm9wZXJ0eSggc2NoZW1hWyBmaWVsZE5hbWUgXS5wcm9wZXJ0aWVzLnByZXR0eSApICYmXG5cdHNjaGVtYVsgZmllbGROYW1lIF0ucHJvcGVydGllcy5wcmV0dHkuZm9ybWF0ID09PSAnbW9uZXknO1xuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZCBpcyBhbiBlbnVtIHR5cGUgZmllbGQgYXMgZGVmaW5lZCBpbiB0aGUgcHJvdmlkZWRcbiAqIHNjaGVtYS5cbiAqXG4gKiBOb3RlOiB0aGlzIG9ubHkgZXZhbHVhdGVzIHRoZSB0b3AtbGV2ZWwgZm9yIHRoZSBmaWVsZCBzY2hlbWEuICBJZiB0aGUgZmllbGRcbiAqIGluIHRoZSBzY2hlbWEgaXMgb2YgdHlwZSAnb2JqZWN0JyBhbmQgb25lIG9mIHRoZSBvYmplY3QgcHJvcGVydGllcyBpcyBvZiB0eXBlXG4gKiAnZW51bScgdGhpcyB3aWxsIG5vdCBjb25zaWRlciBpdCBhbiBcImVudW1cIiBmaWVsZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lXG4gKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hXG4gKiBAcmV0dXJuIHtib29sZWFufSAgVHJ1ZSBpZiB0aGUgZmllbGQgaXMgYW4gZW51bSB0eXBlIGZpZWxkLlxuICovXG5leHBvcnQgY29uc3QgaXNFbnVtRmllbGQgPSAoIGZpZWxkTmFtZSwgc2NoZW1hICkgPT5cblx0ISBpc1VuZGVmaW5lZCggc2NoZW1hWyBmaWVsZE5hbWUgXSApICYmXG5cdGhhc0VudW1Qcm9wZXJ0eSggc2NoZW1hWyBmaWVsZE5hbWUgXSApICYmXG5cdCEgaXNVbmRlZmluZWQoIHNjaGVtYVsgZmllbGROYW1lIF0uZW51bS5sZW5ndGggKSAmJlxuXHRzY2hlbWFbIGZpZWxkTmFtZSBdLmVudW0ubGVuZ3RoID4gMDtcbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBhcHBseUZpbHRlcnMgfSBmcm9tICdAd29yZHByZXNzL2hvb2tzJztcbmltcG9ydCB7IGlzVW5kZWZpbmVkIH0gZnJvbSAnbG9kYXNoJztcblxuLyoqXG4gKiBDb25zdGFudHMgZGVzY3JpYmluZyB0aGUgY3VycmVudCBcInNhdmUgc3RhdGVcIiBmb3IgYW4gZW50aXR5LlxuICpcbiAqIEB0eXBlIHt7Q0xFQU46IFN5bWJvbCwgTkVXOiBTeW1ib2wsIERJUlRZOiBTeW1ib2x9fVxuICovXG5leHBvcnQgY29uc3QgU0FWRV9TVEFURSA9IHtcblx0Q0xFQU46IFN5bWJvbCggJ0VudGl0eSBpcyBwZXJzaXN0ZWQuJyApLFxuXHRORVc6IFN5bWJvbCggJ0VudGl0eSBpcyBuZXcuJyApLFxuXHRESVJUWTogU3ltYm9sKCAnRXhpc3RpbmcgZW50aXR5IGhhcyBjaGFuZ2VzIGFuZCBuZWVkcyBwZXJzaXN0ZWQuJyApLFxufTtcblxuLyoqXG4gKiBWYWxpZGF0aW9uIHR5cGVzIGFyZSBmb3Igc2NoZW1hJ3MgdGhhdCBoYXZlIHZhbHVlIHZhcmlhdGlvbnMuXG4gKiBAdHlwZSB7e1JBVzogc3RyaW5nLCBSRU5ERVJFRDogc3RyaW5nLCBQUkVUVFk6IHN0cmluZ319XG4gKi9cbmV4cG9ydCBjb25zdCBWQUxJREFURV9UWVBFID0ge1xuXHRSQVc6ICdyYXcnLFxuXHRSRU5ERVJFRDogJ3JlbmRlcmVkJyxcblx0UFJFVFRZOiAncHJldHR5Jyxcbn07XG5cbi8qKlxuICogUHJpdmF0ZSBwcm9wZXJ0aWVzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgQmFzZSBFbnRpdHkgQ2xhc3NcbiAqIEB0eXBlIHt7c2F2ZVN0YXRlOiBib29sZWFufX1cbiAqL1xuZXhwb3J0IGNvbnN0IFBSSVZBVEVfUFJPUEVSVElFUyA9IHtcblx0U0FWRV9TVEFURTogU3ltYm9sKCAnYmFzZUVudGl0eVByaXZhdGVQcm9wZXJ0aWVzU2F2ZVN0YXRlJyApLFxuXHRWQUxJREFURV9UWVBFUzogU3ltYm9sKCAnYmFzZUVudGl0eVByaXZhdGVQcm9wZXJ0aWVzVmFsaWRhdGVUeXBlcycgKSxcbn07XG5cbi8qKlxuICogSGFyZGNvZGVkIGxpc3Qgb2YgbW9kZWwgcHJlZml4ZXMgZm9yIGZpZWxkcyBvbiBtb2RlbHMuXG5cbiAqIEEgbW9kZWwgcHJlZml4IGlzIHNvbWV0aGluZyB0aGF0IFwibmFtZXNwYWNlc1wiIGEgZmllbGQgb24gYSBtb2RlbC4gIEZvclxuICogZXhhbXBsZSwgaWYgdGhlIGZpZWxkIGlzIFwiRVZUX0lEXCIsIHRoZW4gdGhlIHByZWZpeCBpcyBcIkVWVFwiOyBpZiB0aGUgZmllbGQgaXNcbiAqIFwiRFRUX0VWVF9zdGFydFwiLCB0aGVuIHRoZSBwcmVmaXhlcyBhcmUgXCJEVFRcIiwgYW5kIFwiRFRUX0VWVFwiLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgZmlsdGVyZWQgb2JqZWN0IGluZGV4ZWQgYnkgbW9kZWwgbmFtZSBhbmQgdGhlIHZhbHVlcyBhcmVcbiAqIGFuIGFycmF5IG9mIG1vZGVsIHByZWZpeGVzIGZvciB0aGF0IG1vZGVsLlxuICovXG5leHBvcnQgY29uc3QgTU9ERUxfUFJFRklYRVMgPSAoIG1vZGVsTmFtZSApID0+IHtcblx0Y29uc3QgcHJlZml4TWFwID0gYXBwbHlGaWx0ZXJzKFxuXHRcdCdGSEVFX19FTlRJVFlfRkFDVE9SWV9fQ09OU1RBTlRTX19NT0RFTF9QUkVGSVhFUycsXG5cdFx0e1xuXHRcdFx0YW5zd2VyOiBbICdBTlMnIF0sXG5cdFx0XHRhdHRlbmRlZTogWyAnQVRUJyBdLFxuXHRcdFx0Y2hhbmdlX2xvZzogWyAnTE9HJyBdLFxuXHRcdFx0Y2hlY2tpbjogWyAnQ0hLJyBdLFxuXHRcdFx0Y291bnRyeTogWyAnQ05UJyBdLFxuXHRcdFx0Y3VycmVuY3k6IFsgJ0NVUicgXSxcblx0XHRcdGN1cnJlbmN5X3BheW1lbnRfbWV0aG9kOiBbICdDUE0nIF0sXG5cdFx0XHRkYXRldGltZTogWyAnRFRUJywgJ0RUVF9FVlQnIF0sXG5cdFx0XHRkYXRldGltZV90aWNrZXQ6IFsgJ0RUSycgXSxcblx0XHRcdGV2ZW50OiBbICdFVlQnIF0sXG5cdFx0XHRldmVudF9tZXNzYWdlX3RlbXBsYXRlOiBbICdFTVQnIF0sXG5cdFx0XHRldmVudF9xdWVzdGlvbl9ncm91cDogWyAnRVFHJyBdLFxuXHRcdFx0ZXZlbnRfdmVudWU6IFsgJ0VWVicgXSxcblx0XHRcdGV4dHJhX2pvaW46IFsgJ0VYSicgXSxcblx0XHRcdGV4dHJhX21ldGE6IFsgJ0VYTScgXSxcblx0XHRcdGxpbmVfaXRlbTogWyAnTElOJyBdLFxuXHRcdFx0bWVzc2FnZTogWyAnTVNHJyBdLFxuXHRcdFx0bWVzc2FnZV90ZW1wbGF0ZTogWyAnTVRQJyBdLFxuXHRcdFx0bWVzc2FnZV90ZW1wbGF0ZV9ncm91cDogWyAnR1JQJywgJ01UUCcgXSxcblx0XHRcdHBheW1lbnQ6IFsgJ1BBWScgXSxcblx0XHRcdHBheW1lbnRfbWV0aG9kOiBbICdQTUQnIF0sXG5cdFx0XHRwb3N0X21ldGE6IFsgJ21ldGEnIF0sXG5cdFx0XHRwcmljZTogWyAnUFJDJyBdLFxuXHRcdFx0cHJpY2VfdHlwZTogWyAnUFJUJyBdLFxuXHRcdFx0cXVlc3Rpb246IFsgJ1FTVCcgXSxcblx0XHRcdHF1ZXN0aW9uX2dyb3VwOiBbICdRU0cnIF0sXG5cdFx0XHRxdWVzdGlvbl9ncm91cF9xdWVzdGlvbjogWyAnUUdRJyBdLFxuXHRcdFx0cXVlc3Rpb25fb3B0aW9uOiBbICdRU08nIF0sXG5cdFx0XHRyZWdpc3RyYXRpb246IFsgJ1JFRycgXSxcblx0XHRcdHJlZ2lzdHJhdGlvbl9wYXltZW50OiBbICdSUFknIF0sXG5cdFx0XHRzdGF0ZTogWyAnU1RBJyBdLFxuXHRcdFx0c3RhdHVzOiBbICdTVFMnIF0sXG5cdFx0XHR0ZXJtOiBbICd0ZXJtJyBdLFxuXHRcdFx0dGVybV9yZWxhdGlvbnNoaXA6IFtdLFxuXHRcdFx0dGVybV90YXhvbm9teTogWyAndGVybV90YXhvbm9teScgXSxcblx0XHRcdHRpY2tldDogWyAnVEtUJyBdLFxuXHRcdFx0dGlja2V0X3ByaWNlOiBbICdUS1AnIF0sXG5cdFx0XHR0aWNrZXRfdGVtcGxhdGU6IFsgJ1RUTScgXSxcblx0XHRcdHRyYW5zYWN0aW9uOiBbICdUWE4nIF0sXG5cdFx0XHR2ZW51ZTogWyAnVk5VJyBdLFxuXHRcdFx0d3BfdXNlcjogWyAndXNlcicgXSxcblx0XHR9ICk7XG5cdHJldHVybiAhIGlzVW5kZWZpbmVkKCBwcmVmaXhNYXBbIG1vZGVsTmFtZSBdICkgP1xuXHRcdHByZWZpeE1hcFsgbW9kZWxOYW1lIF0gOlxuXHRcdFtdO1xufTtcbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQge1xuXHRjYW1lbENhc2UsXG5cdHVwcGVyRmlyc3QsXG5cdGZvckVhY2gsXG5cdGlzVW5kZWZpbmVkLFxuXHRpc0FycmF5LFxuXHRrZXlzLFxuXHRzb3J0QnksXG59IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgY3VpZCBmcm9tICdjdWlkJztcbmltcG9ydCB7IEludmFsaWRBcmd1bWVudCB9IGZyb20gJ0BldmVudGVzcHJlc3NvL2VlanMnO1xuXG4vKipcbiAqIEludGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHtcblx0YXNzZXJ0VmFsaWRGaWVsZEFuZFZhbHVlQWdhaW5zdFNjaGVtYSxcblx0YXNzZXJ0VmFsaWRWYWx1ZUZvclByZXBhcmVkRmllbGQsXG59IGZyb20gJy4vYXNzZXJ0aW9ucyc7XG5pbXBvcnQge1xuXHRkZXJpdmVSZW5kZXJlZFZhbHVlLFxuXHRkZXJpdmVQcmVwYXJlZFZhbHVlRm9yRmllbGQsXG5cdGdldFJlbGF0aW9uTmFtZUZyb21MaW5rLFxuXHRnZXRCYXNlRmllbGRzQW5kVmFsdWVzRm9yQ2xvbmluZyxcblx0Z2V0QmFzZUZpZWxkc0FuZFZhbHVlc0ZvclBlcnNpc3RpbmcsXG5cdGdldFByaW1hcnlLZXlGaWVsZHNGcm9tU2NoZW1hLFxuXHRnZXRFbnRpdHlGaWVsZHNGcm9tU2NoZW1hLFxuXHRnZXREZWZhdWx0VmFsdWVGb3JGaWVsZCxcblx0ZGVyaXZlVmFsaWRhdGVUeXBlRm9yRmllbGQsXG59IGZyb20gJy4vZXh0cmFjdG9ycyc7XG5pbXBvcnQge1xuXHRpc0VudGl0eUZpZWxkLFxuXHRpc1ByaW1hcnlLZXlGaWVsZCxcbn0gZnJvbSAnLi9ib29sZWFucyc7XG5pbXBvcnQgeyBQUklWQVRFX1BST1BFUlRJRVMsIFNBVkVfU1RBVEUgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbi8qKihcbiAqIEEgZ2VuZXJpYyBnZXR0ZXIgY3JlYXRvciBmb3IgYSBwcm92aWRlZCBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWUgIFRoZSBuYW1lIG9mIHRoZSBhY2Nlc3Nvci5cbiAqIEBwYXJhbSB7Kn0gZmllbGRWYWx1ZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgdXNlZCB0byBwYXNzIHRocm91Z2ggYWRkaXRpb25hbCBvcHRpb25zIGZvciB0aGVcbiAqIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBjYWxsLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlR2V0dGVyID0gKCBpbnN0YW5jZSwgZmllbGROYW1lLCBmaWVsZFZhbHVlLCBvcHRzID0ge30gKSA9PiB7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggaW5zdGFuY2UsIGZpZWxkTmFtZSwge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBmaWVsZFZhbHVlO1xuXHRcdH0sXG5cdFx0Li4ub3B0cyxcblx0fSApO1xufTtcblxuLyoqXG4gKiBUaGlzIGNyZWF0ZXMgYSBnZXR0ZXIgdGhhdCBjYWxscyB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgd2hlbiBpbnZva2VkLlxuICpcbiAqIFRoZSBjYWxsYmFjayByZWNlaXZlcyB0aGUgYGluc3RhbmNlYCBhcmd1bWVudCBwYXNzZWQgdGhyb3VnaFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5TmFtZVxuICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QpfSBjYWxsQmFja1xuICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUNhbGxiYWNrR2V0dGVyID0gKFxuXHRpbnN0YW5jZSxcblx0cHJvcGVydHlOYW1lLFxuXHRjYWxsQmFjayxcblx0b3B0cyA9IHt9XG4pID0+IHtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCBpbnN0YW5jZSwgcHJvcGVydHlOYW1lLCB7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIGNhbGxCYWNrKCBpbnN0YW5jZSApO1xuXHRcdH0sXG5cdFx0Li4ub3B0cyxcblx0fSApO1xufTtcblxuLyoqXG4gKiBBIGdlbmVyaWMgZ2V0dGVyIGFuZCBzZXR0ZXIgY3JlYXRvciBmb3IgYSBwcm92aWRlZCBpbnN0YW5jZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZVxuICogQHBhcmFtIHsqfSAgaW5pdGlhbEZpZWxkVmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIE9wdGlvbmFsLCBwYXNzIHRocm91Z2ggb3B0aW9ucyB1c2VkIGJ5XG4gKiBPYmplY3QuZGVmaW5lUHJvcGVydHlcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUdldHRlckFuZFNldHRlciA9IChcblx0aW5zdGFuY2UsXG5cdGZpZWxkTmFtZSxcblx0aW5pdGlhbEZpZWxkVmFsdWUsXG5cdG9wdHMgPSB7fSxcbikgPT4ge1xuXHRsZXQgcHJvcGVydHlWYWx1ZSA9IGluaXRpYWxGaWVsZFZhbHVlO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIGluc3RhbmNlLCBmaWVsZE5hbWUsIHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gcHJvcGVydHlWYWx1ZTtcblx0XHR9LFxuXHRcdHNldCggcmVjZWl2ZWRWYWx1ZSApIHtcblx0XHRcdGFzc2VydFZhbGlkVmFsdWVGb3JQcmVwYXJlZEZpZWxkKFxuXHRcdFx0XHRmaWVsZE5hbWUsXG5cdFx0XHRcdHJlY2VpdmVkVmFsdWUsXG5cdFx0XHRcdGluc3RhbmNlXG5cdFx0XHQpO1xuXHRcdFx0c2V0U2F2ZVN0YXRlKCBpbnN0YW5jZSwgU0FWRV9TVEFURS5ESVJUWSApO1xuXHRcdFx0c2V0RmllbGRUb1BlcnNpc3QoIGluc3RhbmNlLCBmaWVsZE5hbWUgKTtcblx0XHRcdHByb3BlcnR5VmFsdWUgPSByZWNlaXZlZFZhbHVlO1xuXHRcdH0sXG5cdFx0Li4ub3B0cyxcblx0fSApO1xufTtcblxuLyoqXG4gKiBBIGdldHRlciBhbmQgc2V0dGVyIGNyZWF0b3IgZm9yIGFuIGZpZWxkIGFsaWFzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IG9yaWdpbmFsRmllbGROYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gYWxpYXNGaWVsZE5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVBbGlhc0dldHRlckFuZFNldHRlciA9IChcblx0aW5zdGFuY2UsXG5cdG9yaWdpbmFsRmllbGROYW1lLFxuXHRhbGlhc0ZpZWxkTmFtZSxcblx0b3B0cyA9IHt9LFxuKSA9PiB7XG5cdGlmICggb3JpZ2luYWxGaWVsZE5hbWUgIT09IGFsaWFzRmllbGROYW1lICkge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggaW5zdGFuY2UsIGFsaWFzRmllbGROYW1lLCB7XG5cdFx0XHRnZXQoKSB7XG5cdFx0XHRcdHJldHVybiBpbnN0YW5jZVsgb3JpZ2luYWxGaWVsZE5hbWUgXTtcblx0XHRcdH0sXG5cdFx0XHRzZXQoIHJlY2VpdmVkVmFsdWUgKSB7XG5cdFx0XHRcdHJldHVybiBpbnN0YW5jZVsgb3JpZ2luYWxGaWVsZE5hbWUgXSA9IHJlY2VpdmVkVmFsdWU7XG5cdFx0XHR9LFxuXHRcdFx0Li4ub3B0cyxcblx0XHR9ICk7XG5cdH1cbn07XG5cbi8qKlxuICogQSBnZXR0ZXIgY3JlYXRvciBmb3IgYSBmaWVsZCBhbGlhcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcmlnaW5hbEZpZWxkTmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IGFsaWFzRmllbGROYW1lXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQWxpYXNHZXR0ZXIgPSAoXG5cdGluc3RhbmNlLFxuXHRvcmlnaW5hbEZpZWxkTmFtZSxcblx0YWxpYXNGaWVsZE5hbWUsXG5cdG9wdHMgPSB7fSxcbikgPT4ge1xuXHRpZiAoIG9yaWdpbmFsRmllbGROYW1lICE9PSBhbGlhc0ZpZWxkTmFtZSApIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIGluc3RhbmNlLCBhbGlhc0ZpZWxkTmFtZSwge1xuXHRcdFx0Z2V0KCkge1xuXHRcdFx0XHRyZXR1cm4gaW5zdGFuY2VbIG9yaWdpbmFsRmllbGROYW1lIF07XG5cdFx0XHR9LFxuXHRcdFx0Li4ub3B0cyxcblx0XHR9ICk7XG5cdH1cbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZsdWVudCBzZXR0ZXIgb24gdGhlIHByb3ZpZGVkIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gZmllbGQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICBPcHRpb25zIGZvciBPYmplY3QuZGVmaW5lUHJvcGVydHlcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUZsdWVudFNldHRlciA9ICggaW5zdGFuY2UsIGZpZWxkTmFtZSwgb3B0cyA9IHt9ICkgPT4ge1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIGluc3RhbmNlLCAnc2V0JyArIHVwcGVyRmlyc3QoIGZpZWxkTmFtZSApLCB7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuICggcmVjZWl2ZWRWYWx1ZSApID0+IHtcblx0XHRcdFx0aW5zdGFuY2VbIGZpZWxkTmFtZSBdID0gcmVjZWl2ZWRWYWx1ZTtcblx0XHRcdFx0cmV0dXJuIGluc3RhbmNlO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdC4uLm9wdHMsXG5cdH0gKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBpbml0aWFsIGdldHRlcnMgYW5kIHNldHRlcnMgZm9yIGVudGl0aWVzIG9uIHRoZSBwcm92aWRlZCBlbnRpdHlcbiAqIGluc3RhbmNlIHVzaW5nIHRoZSBnaXZlbiBkYXRhLlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlXG4gKiBrZXlzIG9uIGluc3RhbmNlLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlRW50aXR5R2V0dGVyc0FuZFNldHRlcnMgPSAoIGluc3RhbmNlICkgPT4ge1xuXHRjb25zdCBwcmltYXJ5S2V5cyA9IFtdO1xuXHRmb3JFYWNoKFxuXHRcdGluc3RhbmNlLm9yaWdpbmFsRmllbGRzQW5kVmFsdWVzLFxuXHRcdCggZmllbGRWYWx1ZSwgZmllbGROYW1lICkgPT4ge1xuXHRcdFx0Y29uc3QgaXNQcmltYXJ5S2V5ID0gaXNQcmltYXJ5S2V5RmllbGQoIGZpZWxkTmFtZSwgaW5zdGFuY2Uuc2NoZW1hICk7XG5cdFx0XHRzZXRWYWxpZGF0ZVR5cGVGb3JGaWVsZCggaW5zdGFuY2UsIGZpZWxkTmFtZSwgZmllbGRWYWx1ZSApO1xuXHRcdFx0aWYgKCBpc0VudGl0eUZpZWxkKCBmaWVsZE5hbWUsIGluc3RhbmNlLnNjaGVtYSApICkge1xuXHRcdFx0XHRpZiAoIGluc3RhbmNlLmlzTmV3ICkge1xuXHRcdFx0XHRcdGFzc2VydFZhbGlkVmFsdWVGb3JQcmVwYXJlZEZpZWxkKFxuXHRcdFx0XHRcdFx0ZmllbGROYW1lLFxuXHRcdFx0XHRcdFx0ZmllbGRWYWx1ZSxcblx0XHRcdFx0XHRcdGluc3RhbmNlXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhc3NlcnRWYWxpZEZpZWxkQW5kVmFsdWVBZ2FpbnN0U2NoZW1hKFxuXHRcdFx0XHRcdFx0aW5zdGFuY2UubW9kZWxOYW1lLFxuXHRcdFx0XHRcdFx0ZmllbGROYW1lLFxuXHRcdFx0XHRcdFx0ZmllbGRWYWx1ZSxcblx0XHRcdFx0XHRcdGluc3RhbmNlXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzZXRJbml0aWFsRW50aXR5RmllbGRzQW5kVmFsdWVzKFxuXHRcdFx0XHRcdGluc3RhbmNlLFxuXHRcdFx0XHRcdGZpZWxkTmFtZSxcblx0XHRcdFx0XHRmaWVsZFZhbHVlLFxuXHRcdFx0XHRcdGlzUHJpbWFyeUtleVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBmaWVsZE5hbWUgPT09ICdfY2FsY3VsYXRlZF9maWVsZHMnICkge1xuXHRcdFx0XHRzZXRDYWxjdWxhdGVkRmllbGRBbmRWYWx1ZXMoIGluc3RhbmNlLCBmaWVsZFZhbHVlICk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGZpZWxkTmFtZSA9PT0gJ19wcm90ZWN0ZWQnICkge1xuXHRcdFx0XHRwb3B1bGF0ZVByb3RlY3RlZEZpZWxkc1Byb3BlcnR5KCBpbnN0YW5jZSwgZmllbGRWYWx1ZSApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBmaWVsZE5hbWUgPT09ICdsaW5rJyApIHtcblx0XHRcdFx0Y3JlYXRlR2V0dGVyKCBpbnN0YW5jZSwgJ2xpbmsnLCBmaWVsZFZhbHVlICk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGZpZWxkTmFtZSA9PT0gJ19saW5rcycgKSB7XG5cdFx0XHRcdHNldFJlc291cmNlcyggaW5zdGFuY2UsIGZpZWxkVmFsdWUgKTtcblx0XHRcdH1cblx0XHRcdGlmICggISBpbnN0YW5jZS5pc05ldyAmJiBpc1ByaW1hcnlLZXkgKSB7XG5cdFx0XHRcdHByaW1hcnlLZXlzLnB1c2goIGZpZWxkTmFtZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0KTtcblx0aWYgKCAhIGluc3RhbmNlLmlzTmV3ICYmIHByaW1hcnlLZXlzLmxlbmd0aCApIHtcblx0XHRjcmVhdGVQcmltYXJ5S2V5RmllbGRHZXR0ZXJzKCBpbnN0YW5jZSwgcHJpbWFyeUtleXMgKTtcblx0fVxuXG5cdHBvcHVsYXRlUHJpbWFyeUtleXMoIGluc3RhbmNlICk7XG5cdHBvcHVsYXRlTWlzc2luZ0ZpZWxkcyggaW5zdGFuY2UgKTtcbn07XG5cbi8qKlxuICogUG9wdWxhdGVzIHRoZSBgcHJvdGVjdGVkRmllbGRzYCBwcm9wZXJ0eSBvbiB0aGUgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlXG4gKiBAcGFyYW0ge0FycmF5fSBwcm90ZWN0ZWRGaWVsZHNcbiAqL1xuY29uc3QgcG9wdWxhdGVQcm90ZWN0ZWRGaWVsZHNQcm9wZXJ0eSA9ICggaW5zdGFuY2UsIHByb3RlY3RlZEZpZWxkcyApID0+IHtcblx0Ly8gZ2V0IGFueSBjYWxjdWxhdGVkIHByb3RlY3RlZCBmaWVsZHMuXG5cdGNvbnN0IGNhbGN1bGF0ZWRGaWVsZHMgPSBpbnN0YW5jZVxuXHRcdC5vcmlnaW5hbEZpZWxkc0FuZFZhbHVlc1xuXHRcdC5fY2FsY3VsYXRlZF9maWVsZHMgfHwge307XG5cdGlmIChcblx0XHRjYWxjdWxhdGVkRmllbGRzLl9wcm90ZWN0ZWQgJiZcblx0XHRpc0FycmF5KCBjYWxjdWxhdGVkRmllbGRzLl9wcm90ZWN0ZWQgKVxuXHQpIHtcblx0XHRwcm90ZWN0ZWRGaWVsZHMgPSBbXG5cdFx0XHQuLi5wcm90ZWN0ZWRGaWVsZHMsXG5cdFx0XHQuLi5jYWxjdWxhdGVkRmllbGRzLl9wcm90ZWN0ZWQsXG5cdFx0XTtcblx0fVxuXHRjcmVhdGVHZXR0ZXIoIGluc3RhbmNlLCAncHJvdGVjdGVkRmllbGRzJywgcHJvdGVjdGVkRmllbGRzICk7XG59O1xuXG4vKipcbiAqIFRoaXMgcG9wdWxhdGVzIHByaW1hcnkga2V5IGZpZWxkcy5cbiAqIE5vdGUgdGhhdCBpdCBhbHNvIG92ZXJyaWRlcyBhbnkgcHJpbWFyeSBrZXkgdmFsdWVzL3Byb3BlcnRpZXMgdGhhdCBhcmVcbiAqIGFscmVhZHkgc2V0IGluIHRoZSBlbnRpdHkgc28gaXMgb25seSBwcm9jZXNzZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgbmV3LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICovXG5jb25zdCBwb3B1bGF0ZVByaW1hcnlLZXlzID0gKCBpbnN0YW5jZSApID0+IHtcblx0aWYgKCAhIGluc3RhbmNlLmlzTmV3ICkge1xuXHRcdHJldHVybjtcblx0fVxuXHRjb25zdCBwcmltYXJ5S2V5cyA9IGdldFByaW1hcnlLZXlGaWVsZHNGcm9tU2NoZW1hKCBpbnN0YW5jZSApO1xuXHRmb3JFYWNoKCBwcmltYXJ5S2V5cywgKFxuXHRcdHNjaGVtYVByb3BlcnRpZXMsXG5cdFx0c2NoZW1hRmllbGRcblx0KSA9PiB7XG5cdFx0Ly8gYWx3YXlzIGRlbGV0ZSBhbmQgb3ZlcnJpZGUgd2hhdCBpcyBleGlzdGluZy5cblx0XHRpZiAoIGluc3RhbmNlWyBzY2hlbWFGaWVsZCBdICkge1xuXHRcdFx0ZGVsZXRlIGluc3RhbmNlWyBzY2hlbWFGaWVsZCBdO1xuXHRcdH1cblx0XHRjcmVhdGVHZXR0ZXIoXG5cdFx0XHRpbnN0YW5jZSxcblx0XHRcdHNjaGVtYUZpZWxkLFxuXHRcdFx0Y3VpZCgpLFxuXHRcdFx0eyBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUgfVxuXHRcdCk7XG5cdFx0Y3JlYXRlQWxpYXNHZXR0ZXJGb3JGaWVsZCggaW5zdGFuY2UsIHNjaGVtYUZpZWxkICk7XG5cdH0gKTtcblx0Y3JlYXRlUHJpbWFyeUtleUZpZWxkR2V0dGVycyhcblx0XHRpbnN0YW5jZSxcblx0XHRrZXlzKCBwcmltYXJ5S2V5cyApXG5cdCk7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIHZhbGlkYXRlIHR5cGUgZm9yIGEgZmllbGQgcHJvcGVydHkuXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWVcbiAqIEBwYXJhbSB7Kn0gZmllbGRWYWx1ZVxuICovXG5jb25zdCBzZXRWYWxpZGF0ZVR5cGVGb3JGaWVsZCA9ICggaW5zdGFuY2UsIGZpZWxkTmFtZSwgZmllbGRWYWx1ZSApID0+IHtcblx0aW5zdGFuY2VbIFBSSVZBVEVfUFJPUEVSVElFUy5WQUxJREFURV9UWVBFUyBdWyBmaWVsZE5hbWUgXSA9XG5cdFx0ZGVyaXZlVmFsaWRhdGVUeXBlRm9yRmllbGQoIGZpZWxkTmFtZSwgZmllbGRWYWx1ZSwgaW5zdGFuY2Uuc2NoZW1hICk7XG59O1xuXG4vKipcbiAqICBQb3B1bGF0ZXMgbWlzc2luZyBmaWVsZHMgYW5kIHZhbHVlcyB1c2luZyBkZWZhdWx0cyBwcm92aWRlZCBieSBzY2hlbWEuICBJZlxuICogIHNjaGVtYSBkb2Vzbid0IHByb3ZpZGUgYSBkZWZhdWx0IHRoZW4gdGhpcyB3aWxsIHBvcHVsYXRlIHRoZSBmaWVsZCB3aXRoIGFcbiAqICBkZWZhdWx0IHZhbHVlIHRoYXQgbWF0Y2hlcyB0aGUgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VcbiAqL1xuY29uc3QgcG9wdWxhdGVNaXNzaW5nRmllbGRzID0gKCBpbnN0YW5jZSApID0+IHtcblx0aWYgKCB0eXBlb2YgaW5zdGFuY2UucHJvdGVjdGVkRmllbGRzID09PSAndW5kZWZpbmVkJyApIHtcblx0XHRwb3B1bGF0ZVByb3RlY3RlZEZpZWxkc1Byb3BlcnR5KCBpbnN0YW5jZSwgW10gKTtcblx0fVxuXHRpZiAoICEgaW5zdGFuY2UuaXNOZXcgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGZvckVhY2goXG5cdFx0Z2V0RW50aXR5RmllbGRzRnJvbVNjaGVtYSggaW5zdGFuY2UgKSxcblx0XHQoIHNjaGVtYVByb3BlcnRpZXMsIGZpZWxkTmFtZSApID0+IHtcblx0XHRcdGlmIChcblx0XHRcdFx0dHlwZW9mIGluc3RhbmNlWyBmaWVsZE5hbWUgXSA9PT0gJ3VuZGVmaW5lZCcgJiZcblx0XHRcdFx0ISBpc1ByaW1hcnlLZXlGaWVsZCggZmllbGROYW1lLCBpbnN0YW5jZS5zY2hlbWEgKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHNldEluaXRpYWxFbnRpdHlGaWVsZHNBbmRWYWx1ZXMoXG5cdFx0XHRcdFx0aW5zdGFuY2UsXG5cdFx0XHRcdFx0ZmllbGROYW1lLFxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBwbGFpbiBvYmplY3Qgb2YgZW50aXR5IGZpZWxkcyBhbmQgdmFsdWVzIGZyb20gdGhpcyBlbnRpdHkgaW5zdGFuY2VcbiAqIGZvciB1c2UgaW4gY2xvbmluZyB0aGUgZW50aXR5LlxuICpcbiAqIEBwYXJhbSB7QmFzZUVudGl0eX0gaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IFBsYWluIG9iamVjdCBvZiBhbGwgZmllbGQ6dmFsdWUgcGFpcnMuXG4gKi9cbmNvbnN0IGZvckNsb25lID0gKCBpbnN0YW5jZSApID0+IHtcblx0cmV0dXJuIGdldEJhc2VGaWVsZHNBbmRWYWx1ZXNGb3JDbG9uaW5nKCBpbnN0YW5jZSApO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgcGxhaW4gb2JqZWN0IG9mIHRoZSBlbnRpdHkgZmllbGRzIGFuZCB2YWx1ZXMgZnJvbSB0aGlzIGVudGl0eVxuICogaW5zdGFuY2UgcHJlcGFyZWQgZm9yIHVzZSBpbiBhbiB1cGRhdGUgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VcbiAqIEByZXR1cm4ge09iamVjdH0gUGxhaW4gb2JqZWN0IG9mIGZpZWxkOnZhbHVlIHBhaXJzLlxuICovXG5jb25zdCBmb3JVcGRhdGUgPSAoIGluc3RhbmNlICkgPT4ge1xuXHRyZXR1cm4gZ2V0QmFzZUZpZWxkc0FuZFZhbHVlc0ZvclBlcnNpc3RpbmcoIGluc3RhbmNlICk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBwbGFpbiBvYmplY3Qgb2YgdGhlIGVudGl0eSBmaWVsZHMgYW5kIHZhbHVlcyBmcm9tIHRoaXMgZW50aXR5XG4gKiBpbnN0YW5jZSBwcmVwYXJlZCBmb3IgdXNlIGluIGFuIGluc2VydCByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHJldHVybiB7T2JqZWN0fSBQbGFpbiBvYmplY3Qgb2YgZmllbGQ6dmFsdWUgcGFpcnMuXG4gKi9cbmNvbnN0IGZvckluc2VydCA9ICggaW5zdGFuY2UgKSA9PiB7XG5cdGNvbnN0IGVudGl0eVZhbHVlcyA9IGdldEJhc2VGaWVsZHNBbmRWYWx1ZXNGb3JQZXJzaXN0aW5nKFxuXHRcdGluc3RhbmNlLFxuXHRcdHRydWVcblx0KTtcblx0aW5zdGFuY2UucHJpbWFyeUtleXMuZm9yRWFjaCggKCBwcmltYXJ5S2V5ICkgPT4ge1xuXHRcdGVudGl0eVZhbHVlc1sgcHJpbWFyeUtleSBdID0gaW5zdGFuY2VbIHByaW1hcnlLZXkgXTtcblx0fSApO1xuXHRyZXR1cm4gZW50aXR5VmFsdWVzO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgcGxhaW4gb2JqZWN0IG9mIHRoZSBlbnRpdHkgZmllbGRzIGFuZCB2YWx1ZXMgZnJvbSB0aGlzIGVudGl0eVxuICogaW5zdGFuY2UgcHJlcGFyZWQgZm9yIHVzZSBpbiBlaXRoZXIgYW4gaW5zZXJ0IG9yIHVwZGF0ZSByZXF1ZXN0LiAgVGhlIHR5cGVcbiAqIGlzIGF1dG9tYXRpY2FsbHkgZGVyaXZlZCBmcm9tIHRoZSBkZXRlcm1pbmluZyB3aGV0aGVyIHRoZSBlbnRpdHkgaXMgXCJuZXdcIiBvclxuICogbm90LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHJldHVybiB7T2JqZWN0fSBQbGFpbiBvYmplY3Qgb2YgZmllbGQ6dmFsdWUgcGFpcnMuXG4gKi9cbmNvbnN0IGZvclBlcnNpc3QgPSAoIGluc3RhbmNlICkgPT4ge1xuXHRpZiAoIGluc3RhbmNlLmlzTmV3ICkge1xuXHRcdHJldHVybiBmb3JJbnNlcnQoIGluc3RhbmNlICk7XG5cdH1cblx0cmV0dXJuIGZvclVwZGF0ZSggaW5zdGFuY2UgKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBnZXR0ZXJzIGZvciByZXRyaWV2aW5nIHRoZSBmaWVsZHMgYW5kIHZhbHVlcyBvZiB0aGUgZW50aXR5IGluc3RhbmNlXG4gKiBmb3IgaW5zZXJ0IG9yIHVwZGF0ZSByZXF1ZXN0cy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVBlcnNpc3RpbmdHZXR0ZXJzQW5kU2V0dGVycyA9ICggaW5zdGFuY2UgKSA9PiB7XG5cdGNyZWF0ZUNhbGxiYWNrR2V0dGVyKCBpbnN0YW5jZSwgJ2ZvclVwZGF0ZScsIGZvclVwZGF0ZSApO1xuXHRjcmVhdGVDYWxsYmFja0dldHRlciggaW5zdGFuY2UsICdmb3JJbnNlcnQnLCBmb3JJbnNlcnQgKTtcblx0Y3JlYXRlQ2FsbGJhY2tHZXR0ZXIoIGluc3RhbmNlLCAnZm9yUGVyc2lzdCcsIGZvclBlcnNpc3QgKTtcblx0Y3JlYXRlQ2FsbGJhY2tHZXR0ZXIoIGluc3RhbmNlLCAnZm9yQ2xvbmUnLCBmb3JDbG9uZSApO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGluaXRpYWwgZW50aXR5IGZpZWxkIGFjY2Vzc29ycy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWVcbiAqIEBwYXJhbSB7Kn0gZmllbGRWYWx1ZVxuICogQHBhcmFtIHtib29sZWFufSBpc1ByaW1hcnlLZXlcbiAqL1xuY29uc3Qgc2V0SW5pdGlhbEVudGl0eUZpZWxkc0FuZFZhbHVlcyA9IChcblx0aW5zdGFuY2UsXG5cdGZpZWxkTmFtZSxcblx0ZmllbGRWYWx1ZSxcblx0aXNQcmltYXJ5S2V5ID0gZmFsc2UsXG4pID0+IHtcblx0aWYgKCBpc1VuZGVmaW5lZCggZmllbGRWYWx1ZSApICkge1xuXHRcdGZpZWxkVmFsdWUgPSBnZXREZWZhdWx0VmFsdWVGb3JGaWVsZCggZmllbGROYW1lLCBpbnN0YW5jZS5zY2hlbWEgKTtcblx0XHRzZXRWYWxpZGF0ZVR5cGVGb3JGaWVsZCggaW5zdGFuY2UsIGZpZWxkTmFtZSwgZmllbGRWYWx1ZSApO1xuXHR9XG5cdGNyZWF0ZVJhd0VudGl0eUdldHRlcnNTZXR0ZXJzKFxuXHRcdGluc3RhbmNlLFxuXHRcdGZpZWxkTmFtZSxcblx0XHRkZXJpdmVQcmVwYXJlZFZhbHVlRm9yRmllbGQoIGZpZWxkTmFtZSwgZmllbGRWYWx1ZSwgaW5zdGFuY2UgKSxcblx0XHRpc1ByaW1hcnlLZXlcblx0KTtcblx0aWYgKCAhIGlzUHJpbWFyeUtleSApIHtcblx0XHRjcmVhdGVSZW5kZXJlZEdldHRlcnMoXG5cdFx0XHRpbnN0YW5jZSxcblx0XHRcdGZpZWxkTmFtZSxcblx0XHRcdGRlcml2ZVJlbmRlcmVkVmFsdWUoIGZpZWxkVmFsdWUgKVxuXHRcdCk7XG5cdH1cbn07XG5cbi8qKlxuICogQ3JlYXRlcyByYXcgZW50aXR5IGdldHRlcnMgYW5kIHNldHRlcnMuICBUaGVzZSBhcmUgdGhlIHByb3BlcnRpZXMgb2YgYW5cbiAqIGVudGl0eSB0aGF0IGhhdmUgdGhlIHZhbHVlcyB1c2VkIGZvciBub3Qgb25seSBnZXR0aW5nIGJ1dCBhbHNvIHNldHRpbmcuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lXG4gKiBAcGFyYW0geyp9IGZpZWxkVmFsdWVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNQcmltYXJ5S2V5IHNldCB0byB0cnVlIGlmIGZpZWxkIGlzIHRoZSBtb2RlbCdzIHByaW1hcnkga2V5XG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVSYXdFbnRpdHlHZXR0ZXJzU2V0dGVycyA9IChcblx0aW5zdGFuY2UsXG5cdGZpZWxkTmFtZSxcblx0ZmllbGRWYWx1ZSxcblx0aXNQcmltYXJ5S2V5ID0gZmFsc2UsXG4pID0+IHtcblx0Y29uc3Qgb3B0cyA9IHsgZW51bWVyYWJsZTogdHJ1ZSB9O1xuXHQvLyBwcmltYXJ5IGtleSBpcyBpbW11dGFibGVcblx0aWYgKCBpc1ByaW1hcnlLZXkgKSB7XG5cdFx0Y3JlYXRlR2V0dGVyKFxuXHRcdFx0aW5zdGFuY2UsXG5cdFx0XHRmaWVsZE5hbWUsXG5cdFx0XHRmaWVsZFZhbHVlLFxuXHRcdFx0b3B0c1xuXHRcdCk7XG5cdFx0Y3JlYXRlQWxpYXNHZXR0ZXJGb3JGaWVsZCggaW5zdGFuY2UsIGZpZWxkTmFtZSApO1xuXHR9IGVsc2Uge1xuXHRcdGNyZWF0ZUdldHRlckFuZFNldHRlcihcblx0XHRcdGluc3RhbmNlLFxuXHRcdFx0ZmllbGROYW1lLFxuXHRcdFx0ZmllbGRWYWx1ZSxcblx0XHRcdG9wdHNcblx0XHQpO1xuXHRcdGNyZWF0ZUZsdWVudFNldHRlciggaW5zdGFuY2UsIGZpZWxkTmFtZSApO1xuXHRcdGNyZWF0ZUFsaWFzR2V0dGVyQW5kU2V0dGVyRm9yRmllbGQoIGluc3RhbmNlLCBmaWVsZE5hbWUgKTtcblx0fVxufTtcblxuLyoqXG4gKiBDcmVhdGVzIFwiYWxpYXNcIiBnZXR0ZXIgZm9yIHRoZSBnaXZlbiBmaWVsZCBuYW1lIG9uIHRoZSBlbnRpdHkgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWVcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUFsaWFzR2V0dGVyRm9yRmllbGQgPSAoIGluc3RhbmNlLCBmaWVsZE5hbWUgKSA9PiB7XG5cdGNyZWF0ZUFsaWFzZXNGb3JNZXRob2QoIGluc3RhbmNlLCBmaWVsZE5hbWUsIGNyZWF0ZUFsaWFzR2V0dGVyICk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgXCJhbGlhc1wiIGdldHRlcnMgYW5kIHNldHRlcnMgZm9yIHRoZSBnaXZlbiBmaWVsZCBvbiB0aGUgZW50aXR5XG4gKiBpbnN0YW5jZS5cbiAqXG4gKiBFeGFtcGxlOiBEYXRldGltZSBlbnRpdGllcyBoYXZlIGEgYERUVF9FVlRfc3RhcnRgIGZpZWxkLiAgT24gdGhlIGVudGl0eVxuICogaW5zdGFuY2UsIHlvdSB3aWxsIGJlIGFibGUgdG8gYWNjZXNzIHRoZSB2YWx1ZSBvZiB0aGF0IGZpZWxkIHZpYTpcbiAqIC0gZGF0ZXRpbWUuRFRUX0VWVF9zdGFydFxuICogLSBkYXRldGltZS5kdHRFdnRTdGFydFxuICogLSBkYXRldGltZS5ldnRTdGFydFxuICogLSBkYXRldGltZS5zdGFydFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZVxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQWxpYXNHZXR0ZXJBbmRTZXR0ZXJGb3JGaWVsZCA9ICggaW5zdGFuY2UsIGZpZWxkTmFtZSApID0+IHtcblx0Y3JlYXRlQWxpYXNlc0Zvck1ldGhvZCggaW5zdGFuY2UsIGZpZWxkTmFtZSwgY3JlYXRlQWxpYXNHZXR0ZXJBbmRTZXR0ZXIgKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBBbGlhc2VzIHVzaW5nIHRoZSBwcm92aWRlZCBtZXRob2QuXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWVcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IG1ldGhvZFxuICovXG5jb25zdCBjcmVhdGVBbGlhc2VzRm9yTWV0aG9kID0gKCBpbnN0YW5jZSwgZmllbGROYW1lLCBtZXRob2QgKSA9PiB7XG5cdC8vIGNhbWVsQ2FzZSBnZXR0ZXIgKG9yIHNldHRlcikgZm9yIGZ1bGwgZmllbGQgbmFtZSAoZWcuIEVWVF9kZXNjID0+IGV2dERlc2MpXG5cdG1ldGhvZCggaW5zdGFuY2UsIGZpZWxkTmFtZSwgY2FtZWxDYXNlKCBmaWVsZE5hbWUgKSApO1xuXHQvLyBzdHJpcCBmaWVsZCBwcmVmaXhlcyBhbmQgY2FtZWxDYXNlIChpZiB0aGVyZSBhcmUgZmllbGQgcHJlZml4ZXMgZm9yIHRoZVxuXHQvLyBlbnRpdHkuIChlZy4gRVZUX2Rlc2MgPT4gZGVzYyk7XG5cdGlmICggaW5zdGFuY2UuZmllbGRQcmVmaXhlcyApIHtcblx0XHRsZXQgbmV3RmllbGROYW1lID0gJyc7XG5cdFx0Ly8gWWVzLCBpdHMgaW50ZW5kZWQgdGhhdCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgcHJlZml4ZXMsIHRoaXMgY291bGRcblx0XHQvLyBlbmQgdXAgY3JlYXRpbmcgbXVsdGlwbGUgYWxpYXNlZCBnZXR0ZXJzIChvciBzZXR0ZXJzKVxuXHRcdC8vIChlZyBEYXRldGltZTogRFRUX0VWVF9zdGFydCB3b3VsZCBlbmQgdXAgd2l0aCBgZXZ0U3RhcnRgIGFuZCBgc3RhcnRgXG5cdFx0Ly8gYXMgZ2V0dGVyIGFjY2Vzc29ycykuXG5cdFx0aW5zdGFuY2UuZmllbGRQcmVmaXhlcy5mb3JFYWNoKCAoIGZpZWxkUHJlZml4ICkgPT4ge1xuXHRcdFx0bmV3RmllbGROYW1lID0gZmllbGROYW1lLnJlcGxhY2UoIGZpZWxkUHJlZml4ICsgJ18nLCAnJyApO1xuXHRcdFx0aWYgKCBuZXdGaWVsZE5hbWUgIT09IGZpZWxkTmFtZSApIHtcblx0XHRcdFx0bWV0aG9kKFxuXHRcdFx0XHRcdGluc3RhbmNlLFxuXHRcdFx0XHRcdGZpZWxkTmFtZSxcblx0XHRcdFx0XHRjYW1lbENhc2UoIG5ld0ZpZWxkTmFtZSApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBjYWxsYmFjayB0aGF0IGlzIHVzZWQgaW4gdGhlIGBnZXRSZW5kZXJlZGAgZmllbGQgZ2V0dGVyLlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihzdHJpbmcpOiAqfSAgQSBjYWxsYmFjay5cbiAqL1xuY29uc3QgZ2V0UmVuZGVyZWRDYWxsYmFjayA9ICggaW5zdGFuY2UgKSA9PiAoIHJlcXVlc3RlZEZpZWxkTmFtZSApID0+XG5cdGluc3RhbmNlWyByZXF1ZXN0ZWRGaWVsZE5hbWUgKyAnUmVuZGVyZWQnIF07XG5cbi8qKlxuICogUmV0dXJucyBhIGZpZWxkTmFtZSBzdHJpcHBlZCBvZiBhbGwgcG9zc2libGUgcHJlZml4ZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwcmVmaXggZnJlZSBmaWVsZE5hbWUuXG4gKi9cbmNvbnN0IHJlbW92ZVByZWZpeGVzRnJvbUZpZWxkID0gKCBpbnN0YW5jZSwgZmllbGROYW1lICkgPT4ge1xuXHRjb25zdCBwcmVmaXhlc1RvUmVtb3ZlID0gc29ydEJ5KFxuXHRcdGluc3RhbmNlLmZpZWxkUHJlZml4ZXMsXG5cdFx0KCBwcmVmaXggKSA9PiBwcmVmaXgubGVuZ3RoICogLTFcblx0KTtcblx0bGV0IG5ld0ZpZWxkTmFtZSA9IGZpZWxkTmFtZTtcblx0Zm9yRWFjaCggcHJlZml4ZXNUb1JlbW92ZSwgKCBwcmVmaXggKSA9PiB7XG5cdFx0bmV3RmllbGROYW1lID0gZmllbGROYW1lLnJlcGxhY2UoIHByZWZpeCwgJycgKTtcblx0XHRpZiAoIG5ld0ZpZWxkTmFtZSAhPT0gZmllbGROYW1lICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fSApO1xuXHRyZXR1cm4gbmV3RmllbGROYW1lO1xufTtcblxuLyoqXG4gKiBUaGlzIGNyZWF0ZXMgdGhlIGdldHRlcnMgZm9yIHRoZSByZW5kZXJlZCBwcm9wZXJ0eSBvZiBtb2RlbCBmaWVsZHMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lXG4gKiBAcGFyYW0geyp9ICBmaWVsZFZhbHVlXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVSZW5kZXJlZEdldHRlcnMgPSAoIGluc3RhbmNlLCBmaWVsZE5hbWUsIGZpZWxkVmFsdWUgKSA9PiB7XG5cdGNyZWF0ZUdldHRlcihcblx0XHRpbnN0YW5jZSxcblx0XHRjYW1lbENhc2UoIHJlbW92ZVByZWZpeGVzRnJvbUZpZWxkKCBpbnN0YW5jZSwgZmllbGROYW1lICkgKSArXG5cdFx0J1JlbmRlcmVkJyxcblx0XHRmaWVsZFZhbHVlXG5cdCk7XG5cdGlmICggaXNVbmRlZmluZWQoIGluc3RhbmNlLmdldFJlbmRlcmVkICkgKSB7XG5cdFx0Y3JlYXRlQ2FsbGJhY2tHZXR0ZXIoXG5cdFx0XHRpbnN0YW5jZSxcblx0XHRcdCdnZXRSZW5kZXJlZCcsXG5cdFx0XHRnZXRSZW5kZXJlZENhbGxiYWNrLFxuXHRcdCk7XG5cdH1cbn07XG5cbi8qKlxuICogQ2FsbGJhY2sgZm9yIHRoZSBgaGFzTXVsdGlwbGVQcmltYXJ5S2V5c2AgZ2V0dGVyLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHJldHVybiB7ZnVuY3Rpb24oKTogYm9vbGVhbn0gVGhlIGNhbGxiYWNrIGZvciBoYXNNdWx0aXBsZVByaW1hcnlLZXlzIGdldHRlclxuICovXG5jb25zdCBoYXNNdWx0aXBsZVByaW1hcnlLZXlzQ2FsbGJhY2sgPSAoIGluc3RhbmNlICkgPT5cblx0aW5zdGFuY2UucHJpbWFyeUtleXMubGVuZ3RoID4gMTtcblxuLyoqXG4gKiBDcmVhdGVzIGdldHRlcnMgZm9yIHByaW1hcnkga2V5IHJlbGF0ZWQgZGF0YS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VcbiAqIEBwYXJhbSB7QXJyYXl9IHByaW1hcnlLZXlzXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVQcmltYXJ5S2V5RmllbGRHZXR0ZXJzID0gKCBpbnN0YW5jZSwgcHJpbWFyeUtleXMgKSA9PiB7XG5cdGNvbnN0IG9wdHMgPSB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9O1xuXHRpZiAoIGlzQXJyYXkoIHByaW1hcnlLZXlzICkgKSB7XG5cdFx0Y3JlYXRlR2V0dGVyKFxuXHRcdFx0aW5zdGFuY2UsXG5cdFx0XHQncHJpbWFyeUtleScsXG5cdFx0XHRwcmltYXJ5S2V5c1sgMCBdLFxuXHRcdFx0b3B0c1xuXHRcdCk7XG5cdFx0Y3JlYXRlR2V0dGVyQW5kU2V0dGVyKFxuXHRcdFx0aW5zdGFuY2UsXG5cdFx0XHQncHJpbWFyeUtleXMnLFxuXHRcdFx0cHJpbWFyeUtleXMsXG5cdFx0XHRvcHRzXG5cdFx0KTtcblx0XHRjcmVhdGVDYWxsYmFja0dldHRlcihcblx0XHRcdGluc3RhbmNlLFxuXHRcdFx0J2hhc011bHRpcGxlUHJpbWFyeUtleXMnLFxuXHRcdFx0aGFzTXVsdGlwbGVQcmltYXJ5S2V5c0NhbGxiYWNrLFxuXHRcdFx0b3B0c1xuXHRcdCk7XG5cdH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihzdHJpbmcpOiBib29sZWFufSBSZXR1cm5zIGEgY2FsbGJhY2sgZm9yIHRoZVxuICogaGFzQ2FsY3VsYXRlZEZpZWxkIGdldHRlclxuICovXG5jb25zdCBoYXNDYWxjdWxhdGVkRmllbGRDYWxsYmFjayA9ICggaW5zdGFuY2UgKSA9PlxuXHQoIGZpZWxkTmFtZVRvQ2hlY2sgKSA9PiAhIGlzVW5kZWZpbmVkKCBpbnN0YW5jZVsgZmllbGROYW1lVG9DaGVjayBdICk7XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgZ2V0dGVycyBmb3IgYWxsIHRoZSBjYWxjdWxhdGVkIGZpZWxkcyBhbmQgdmFsdWUgb24gdGhlIGVudGl0eS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHBhcmFtIHtPYmplY3QuPHN0cmluZywqPn1maWVsZHNBbmRWYWx1ZXNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldENhbGN1bGF0ZWRGaWVsZEFuZFZhbHVlcyA9ICggaW5zdGFuY2UsIGZpZWxkc0FuZFZhbHVlcyApID0+IHtcblx0Zm9yRWFjaCggZmllbGRzQW5kVmFsdWVzLCAoIGNhbGN1bGF0ZWRGaWVsZFZhbHVlLCBjYWxjdWxhdGVkRmllbGROYW1lICkgPT4ge1xuXHRcdGlmICggY2FsY3VsYXRlZEZpZWxkTmFtZSAhPT0gJ19wcm90ZWN0ZWQnICkge1xuXHRcdFx0Y3JlYXRlR2V0dGVyKFxuXHRcdFx0XHRpbnN0YW5jZSxcblx0XHRcdFx0Y2FtZWxDYXNlKCBjYWxjdWxhdGVkRmllbGROYW1lICksXG5cdFx0XHRcdGNhbGN1bGF0ZWRGaWVsZFZhbHVlXG5cdFx0XHQpO1xuXHRcdH1cblx0fSApO1xuXHRjcmVhdGVDYWxsYmFja0dldHRlcihcblx0XHRpbnN0YW5jZSxcblx0XHQnaGFzQ2FsY3VsYXRlZEZpZWxkJyxcblx0XHRoYXNDYWxjdWxhdGVkRmllbGRDYWxsYmFja1xuXHQpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgZ2V0dGVycyBmb3IgdGhlIHZhcmlvdXMgcmVzb3VyY2UgbGlua3Mgb24gdGhlIGVudGl0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VcbiAqIEBwYXJhbSB7T2JqZWN0LjxzdHJpbmcsKj59ZmllbGRzQW5kVmFsdWVzXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRSZXNvdXJjZXMgPSAoIGluc3RhbmNlLCBmaWVsZHNBbmRWYWx1ZXMgKSA9PiB7XG5cdGNvbnN0IHJlbGF0aW9ucyA9IFtdO1xuXHRsZXQgcmVsYXRpb25OYW1lO1xuXHRmb3JFYWNoKCBmaWVsZHNBbmRWYWx1ZXMsICggcmVzb3VyY2VWYWx1ZSwgcmVzb3VyY2VOYW1lICkgPT4ge1xuXHRcdGlmICggcmVzb3VyY2VOYW1lID09PSAnc2VsZicgKSB7XG5cdFx0XHRjcmVhdGVHZXR0ZXIoIGluc3RhbmNlLCAncmVzb3VyY2VMaW5rJywgcmVzb3VyY2VWYWx1ZVsgMCBdLmhyZWYgKTtcblx0XHR9IGVsc2UgaWYgKCByZXNvdXJjZU5hbWUgPT09ICdjb2xsZWN0aW9uJyApIHtcblx0XHRcdGNyZWF0ZUdldHRlcihcblx0XHRcdFx0aW5zdGFuY2UsXG5cdFx0XHRcdCdjb2xsZWN0aW9uUmVzb3VyY2VMaW5rJyxcblx0XHRcdFx0cmVzb3VyY2VWYWx1ZVsgMCBdLmhyZWZcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlbGF0aW9uTmFtZSA9IGdldFJlbGF0aW9uTmFtZUZyb21MaW5rKCByZXNvdXJjZU5hbWUgKTtcblx0XHRcdHJlbGF0aW9ucy5wdXNoKCByZWxhdGlvbk5hbWUgKTtcblx0XHRcdHNldFJlbGF0aW9uc1Jlc291cmNlKFxuXHRcdFx0XHRpbnN0YW5jZSxcblx0XHRcdFx0cmVsYXRpb25OYW1lICsgJ1Jlc291cmNlJyxcblx0XHRcdFx0cmVzb3VyY2VWYWx1ZVxuXHRcdFx0KTtcblx0XHR9XG5cdH0gKTtcblx0Ly9zZXQgcmVsYXRpb25zIGdldHRlclxuXHRjcmVhdGVHZXR0ZXIoIGluc3RhbmNlLCAnZ2V0UmVsYXRpb25zJywgcmVsYXRpb25zICk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHJldHVybiB7ZnVuY3Rpb24oc3RyaW5nKTogT2JqZWN0fSBSZXR1cm5zIHRoZSBjYWxsYmFjayBmb3IgZ2V0dGluZyBhXG4gKiByZWxhdGlvbiByZXNvdXJjZVxuICovXG5jb25zdCBnZXRSZWxhdGlvblJlc291cmNlQ2FsbGJhY2sgPSAoIGluc3RhbmNlICkgPT5cblx0KCByZWxhdGlvbk5hbWUgKSA9PiBpbnN0YW5jZVsgcmVsYXRpb25OYW1lLnJlcGxhY2UoICdSZXNvdXJjZScsICcnICkgXTtcblxuLyoqXG4gKiBDcmVhdGVzIGdldHRlcnMgZm9yIHRoZSByZWxhdGlvbnMgcmVzb3VyY2Ugb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uTmFtZVxuICogQHBhcmFtIHtPYmplY3QuPHN0cmluZywgc3RyaW5nPn0gcmVzb3VyY2VJbmZvXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRSZWxhdGlvbnNSZXNvdXJjZSA9IChcblx0aW5zdGFuY2UsXG5cdHJlbGF0aW9uTmFtZSxcblx0cmVzb3VyY2VJbmZvXG4pID0+IHtcblx0Y3JlYXRlR2V0dGVyKFxuXHRcdGluc3RhbmNlLFxuXHRcdHJlbGF0aW9uTmFtZSxcblx0XHR7XG5cdFx0XHRyZXNvdXJjZUxpbms6IHJlc291cmNlSW5mb1sgMCBdLmhyZWYsXG5cdFx0XHRzaW5nbGU6IHJlc291cmNlSW5mb1sgMCBdLnNpbmdsZSxcblx0XHR9XG5cdCk7XG5cdGlmICggaXNVbmRlZmluZWQoIGluc3RhbmNlLmdldFJlbGF0aW9uUmVzb3VyY2UgKSApIHtcblx0XHRjcmVhdGVDYWxsYmFja0dldHRlciggaW5zdGFuY2UsXG5cdFx0XHQnZ2V0UmVsYXRpb25SZXNvdXJjZScsXG5cdFx0XHRnZXRSZWxhdGlvblJlc291cmNlQ2FsbGJhY2tcblx0XHQpO1xuXHR9XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIGludGVybmFsIHNhdmUgc3RhdGUgdG8gdGhlIGdpdmVuIHZhbHVlIHdoZW4gY3VycmVudCBzdGF0ZSBpc1xuICogU0FWRV9TVEFURS5jbGVhbiBvdGhlcndpc2UgY3VycmVudCBzYXZlIHN0YXRlIGlzIHJldGFpbmVkLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IHNhdmVTdGF0ZSBFeHBlY3RlZCB0byBiZSBvbmUgb2YgU0FWRV9TVEFURSBjb25zdGFudCB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRTYXZlU3RhdGUgPSAoIGluc3RhbmNlLCBzYXZlU3RhdGUgKSA9PiB7XG5cdGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGluc3RhbmNlWyBQUklWQVRFX1BST1BFUlRJRVMuU0FWRV9TVEFURSBdO1xuXHRzd2l0Y2ggKCBzYXZlU3RhdGUgKSB7XG5cdFx0Y2FzZSBTQVZFX1NUQVRFLkRJUlRZOlxuXHRcdGNhc2UgU0FWRV9TVEFURS5ORVc6XG5cdFx0Y2FzZSBTQVZFX1NUQVRFLkNMRUFOOlxuXHRcdFx0aW5zdGFuY2VbIFBSSVZBVEVfUFJPUEVSVElFUy5TQVZFX1NUQVRFIF0gPVxuXHRcdFx0XHRjdXJyZW50U3RhdGUgPT09IFNBVkVfU1RBVEUuQ0xFQU4gP1xuXHRcdFx0XHRcdHNhdmVTdGF0ZSA6XG5cdFx0XHRcdFx0Y3VycmVudFN0YXRlO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnQoXG5cdFx0XHRcdCdTYXZlIHN0YXRlIGZvciBlbnRpdHkgY2FuIG9ubHkgYmUgc2V0IHRvIGVpdGhlciAnICtcblx0XHRcdFx0J1NBVkVfU1RBVEUuRElSVFksIFNBVkVfU1RBVEUuTkVXIG9yIFNBVkVfU1RBVEUuQ0xFQU4nXG5cdFx0XHQpO1xuXHR9XG59O1xuXG4vKipcbiAqIEFkZCB0aGUgZmllbGQgbmFtZSB0byB0aGUgZmllbGRUb1BlcnNpc3RPbkluc2VydCBwcm9wZXJ0eSBvbiB0aGUgaW5zdGFuY2VcbiAqIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWVcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEZpZWxkVG9QZXJzaXN0ID0gKCBpbnN0YW5jZSwgZmllbGROYW1lICkgPT4ge1xuXHRpZiAoIGluc3RhbmNlLmZpZWxkc1RvUGVyc2lzdE9uSW5zZXJ0ICkge1xuXHRcdGluc3RhbmNlLmZpZWxkc1RvUGVyc2lzdE9uSW5zZXJ0LmFkZCggZmllbGROYW1lICk7XG5cdH1cbn07XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHtcblx0aXNQbGFpbk9iamVjdCxcblx0Y2FtZWxDYXNlLFxuXHRsYXN0LFxuXHRwaWNrLFxuXHRwaWNrQnksXG5cdGlzQXJyYXksXG59IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBpbnN0YW5jZU9mIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vdmFsaWRhdG9ycyc7XG5cbi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQge1xuXHRNb25leSxcblx0U2l0ZUN1cnJlbmN5LFxuXHRTZXJ2ZXJEYXRlVGltZSBhcyBEYXRlVGltZSxcbn0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vdmFsdWUtb2JqZWN0cyc7XG5cbmltcG9ydCB7IHBsdXJhbE1vZGVsTmFtZSB9IGZyb20gJy4uL21vZGVsLW5hbWVzJztcblxuaW1wb3J0IHtcblx0aGFzUmF3UHJvcGVydHksXG5cdGhhc1ByZXR0eVByb3BlcnR5LFxuXHRoYXNSZW5kZXJlZFByb3BlcnR5LFxuXHRpc0RhdGVUaW1lRmllbGQsXG5cdGlzTW9uZXlGaWVsZCxcblx0aXNQcmltYXJ5S2V5RmllbGQsXG5cdGlzRW50aXR5RmllbGQsXG59IGZyb20gJy4vYm9vbGVhbnMnO1xuaW1wb3J0IHsgdmFsaWRhdGVUeXBlRm9yRmllbGQgfSBmcm9tICcuL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHsgVkFMSURBVEVfVFlQRSB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBUaGlzIHJlY2VpdmVzIGEgZmllbGQgbmFtZSwgaXQncyB2YWx1ZSBhbmQgdGhlIHNjaGVtYSBhbmQgY29udmVydHMgaXQgdG8gdGhlXG4gKiByZWxhdGVkIHZhbHVlIG9iamVjdCBJRiB0aGUgc2NoZW1hIGluZGljYXRlcyBpdCBpcyBvZiBhIHR5cGUgdGhhdCB0aGVyZSBpcyBhXG4gKiBrbm93biB2YWx1ZSBvYmplY3QgZm9yLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWVcbiAqIEBwYXJhbSB7Kn0gZmllbGRWYWx1ZVxuICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYVxuICogQHJldHVybiB7RGF0ZVRpbWV8TW9uZXl8Kn0gIElmIHRoaXMgaXMgbm90IGEgdmFsdWUgb2JqZWN0LCB0aGUgb3JpZ2luYWwgZmllbGRcbiAqIHZhbHVlIGlzIHJldHVybmVkLlxuICovXG5leHBvcnQgY29uc3QgbWF5YmVDb252ZXJ0VG9WYWx1ZU9iamVjdCA9ICggZmllbGROYW1lLCBmaWVsZFZhbHVlLCBzY2hlbWEgKSA9PiB7XG5cdGlmIChcblx0XHRpc0RhdGVUaW1lRmllbGQoIGZpZWxkTmFtZSwgc2NoZW1hICkgJiZcblx0XHQhIERhdGVUaW1lLnZhbGlkYXRlSXNEYXRlVGltZSggZmllbGRWYWx1ZSApXG5cdCkge1xuXHRcdHJldHVybiBEYXRlVGltZS5mcm9tSVNPKCBmaWVsZFZhbHVlICk7XG5cdH1cblx0aWYgKFxuXHRcdGlzTW9uZXlGaWVsZCggZmllbGROYW1lLCBzY2hlbWEgKSAmJlxuXHRcdCEgKCBpbnN0YW5jZU9mKCBmaWVsZFZhbHVlLCAnTW9uZXknICkgKVxuXHQpIHtcblx0XHRyZXR1cm4gbmV3IE1vbmV5KCBmaWVsZFZhbHVlLCBTaXRlQ3VycmVuY3kgKTtcblx0fVxuXHQvLyBpZiBtb3JlIFZPcyBnZXQgYWRkZWQsIHRoZW4gaW5zdGVhZCBvZiBhZGRpbmcgbW9yZSBpZiBlbHNlIGJsb2Nrc1xuXHQvLyB0byB0aGlzIGZ1bmN0aW9uIGFuZCB0aGUgb25lcyBiZWxvdywgYWxsIFZPIGxvZ2ljIHNob3VsZCBiZSBleHRyYWN0ZWRcblx0Ly8gaW50byBzb21lIGtpbmQgb2YgIFZhbHVlT2JqZWN0RXh0cmFjdG9yIG9iamVjdCB0aGF0IHdvdWxkIGhvbGQgYWxsIG9mXG5cdC8vIHRoZSBuZWNlc3NhcnkgY2FsbGJhY2tzIGZvciBtYW5hZ2luZyB0aGUgZGV0ZWN0aW9uIG9mIFZPIGZpZWxkcyBhbmRcblx0Ly8gY29udmVyc2lvbiBvZiBkYXRhIHRvIGFuZCBmcm9tIHRoZSB2YXJpb3VzIFZPc1xuXHQvLyBwbHogc2VlOlxuXHQvLyBodHRwczovL2dpdGh1Yi5jb20vZXZlbnRlc3ByZXNzby9ldmVudC1lc3ByZXNzby1jb3JlL3B1bGwvNjM3L2ZpbGVzI3IyMjg2OTA3ODlcblx0cmV0dXJuIGZpZWxkVmFsdWU7XG59O1xuXG4vKipcbiAqIFRoaXMgY29udmVydHMgdGhlIGluY29taW5nIHZhbHVlIGZvciBhIGZpZWxkIHRvIGl0cyBlcXVpdmFsZW50IFwicmF3XCIgdmFsdWVcbiAqIGZyb20gYSB2YWx1ZSBvYmplY3QgaWYgaXQgaXMgYSB2YWx1ZSBvYmplY3QuICBPdGhlcndpc2UgaXQganVzdCByZXR1cm5zIHRoZVxuICogb3JpZ2luYWwgaW5jb21pbmcgdmFsdWUuICBUaGlzIGFsc28gYXNzZXJ0cyB0aGF0IGlmIHRoZSBwcm92aWRlZCBmaWVsZCBpc1xuICogZXhwZWN0ZWQgdG8gYmUgYSB2YWx1ZSBvYmplY3QgdGhhdCB0aGUgaW5jb21pbmcgdmFsdWUgSVMgYSB2YWxpZCB2YWx1ZSBvYmplY3RcbiAqIGFuZCBpdCBpcyB0aGUgZXhwZWN0ZWQgaW5zdGFuY2Ugb2YgYSB2YWx1ZSBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZVxuICogQHBhcmFtIHsqfE1vbmV5fERhdGVUaW1lfSBmaWVsZFZhbHVlXG4gKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hXG4gKiBAcmV0dXJuIHtzdHJpbmd8bnVtYmVyfCp9ICBJZiB0aGUgdmFsdWUgaXMgbm90IGEgdmFsdWUgb2JqZWN0LCByZXR1cm5zIHRoZVxuICogb3JpZ2luYWwgdmFsdWVcbiAqL1xuZXhwb3J0IGNvbnN0IG1heWJlQ29udmVydEZyb21WYWx1ZU9iamVjdFdpdGhBc3NlcnRpb25zID0gKFxuXHRmaWVsZE5hbWUsXG5cdGZpZWxkVmFsdWUsXG5cdHNjaGVtYVxuKSA9PiB7XG5cdGlmICggaXNEYXRlVGltZUZpZWxkKCBmaWVsZE5hbWUsIHNjaGVtYSApICkge1xuXHRcdERhdGVUaW1lLmFzc2VydElzRGF0ZVRpbWUoIGZpZWxkVmFsdWUgKTtcblx0XHRmaWVsZFZhbHVlID0gZmllbGRWYWx1ZS50b0lTTygpO1xuXHR9IGVsc2UgaWYgKCBpc01vbmV5RmllbGQoIGZpZWxkTmFtZSwgc2NoZW1hICkgKSB7XG5cdFx0TW9uZXkuYXNzZXJ0TW9uZXkoIGZpZWxkVmFsdWUgKTtcblx0XHRmaWVsZFZhbHVlID0gZmllbGRWYWx1ZS50b051bWJlcigpO1xuXHR9XG5cdHJldHVybiBmaWVsZFZhbHVlO1xufTtcblxuLyoqXG4gKiBUaGlzIGNvbnZlcnRzIHRoZSBpbmNvbWluZyB2YWx1ZSBmb3IgYSBmaWVsZCB0byBpdHMgZXF1aXZhbGVudCBcInJhd1wiIHZhbHVlXG4gKiBpZiB0aGUgaW5jb21pbmcgdmFsdWUgIGlzIGEgdmFsdWUgb2JqZWN0LiAgT3RoZXJ3aXNlIGl0IGp1c3QgcmV0dXJucyB0aGVcbiAqIG9yaWdpbmFsIGluY29taW5nIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7KnxEYXRlVGltZXxNb25leX1maWVsZFZhbHVlXG4gKiBAcmV0dXJuIHsqfSBUaGUgcmF3IHZhbHVlIGZvciB0aGUgdmFsdWUgb2JqZWN0IG9yIHRoZSBvcmlnaW5hbCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IG1heWJlQ29udmVydEZyb21WYWx1ZU9iamVjdCA9ICggZmllbGRWYWx1ZSApID0+IHtcblx0aWYgKCBEYXRlVGltZS52YWxpZGF0ZUlzRGF0ZVRpbWUoIGZpZWxkVmFsdWUgKSApIHtcblx0XHRmaWVsZFZhbHVlID0gZmllbGRWYWx1ZS50b0lTTygpO1xuXHR9IGVsc2UgaWYgKCBpbnN0YW5jZU9mKCBmaWVsZFZhbHVlLCAnTW9uZXknICkgKSB7XG5cdFx0ZmllbGRWYWx1ZSA9IGZpZWxkVmFsdWUudG9OdW1iZXIoKTtcblx0fVxuXHRyZXR1cm4gZmllbGRWYWx1ZTtcbn07XG5cbi8qKlxuICogVGhpcyBkZXJpdmVzIHRoZSBcInByZXBhcmVkXCIgdmFsdWUgZm9yIHRoZSBnaXZlbiBmaWVsZCBhbmQgdmFsdWUuXG4gKlxuICogXCJQcmVwYXJlZFwiIG1lYW5zOlxuICpcbiAqIC0gY29udmVydGluZyB0byBhIHZhbHVlIG9iamVjdCBpZiB0aGlzIGlzIGEgZmllbGQgdGhhdCB0aGVyZSBhcmUgZGVmaW5lZFxuICogICB2YWx1ZSBvYmplY3RzIGZvci5cbiAqIC0gcmV0cmlldmluZyB0aGUgXCJyYXdcIiB2YWx1ZSBmcm9tIGZpZWxkIHZhbHVlcyB0aGF0IGhhdmUgYHJhd2AgYW5kIGByZW5kZXJlZGBcbiAqICAgb3IgYHByZXR0eWAgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lXG4gKiBAcGFyYW0geyp9ICBmaWVsZFZhbHVlXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VcbiAqIEByZXR1cm4ge0RhdGVUaW1lfE1vbmV5fCp9ICBSZXR1cm5zIHRoZSBvcmlnaW5hbCBpbmNvbWluZyB2YWx1ZSBpZiBpdCBkb2VzXG4gKiBub3QgaGF2ZSBhIHJhdyBlcXVpdmFsZW50IG9yIGlzIG5vdCBhIHZhbHVlIG9iamVjdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGRlcml2ZVByZXBhcmVkVmFsdWVGb3JGaWVsZCA9IChcblx0ZmllbGROYW1lLFxuXHRmaWVsZFZhbHVlLFxuXHRpbnN0YW5jZVxuKSA9PiB7XG5cdGNvbnN0IHZhbGlkYXRpb25UeXBlID0gdmFsaWRhdGVUeXBlRm9yRmllbGQoIGZpZWxkTmFtZSwgaW5zdGFuY2UgKTtcblx0ZmllbGRWYWx1ZSA9IGlzUGxhaW5PYmplY3QoIGZpZWxkVmFsdWUgKSA/XG5cdFx0ZmllbGRWYWx1ZVsgdmFsaWRhdGlvblR5cGUgXSA6XG5cdFx0ZmllbGRWYWx1ZTtcblx0cmV0dXJuIG1heWJlQ29udmVydFRvVmFsdWVPYmplY3QoIGZpZWxkTmFtZSwgZmllbGRWYWx1ZSwgaW5zdGFuY2Uuc2NoZW1hICk7XG59O1xuXG4vKipcbiAqIFRoaXMgcmV0dXJucyB0aGUgXCJyZW5kZXJlZFwiIG9yIFwicHJldHR5XCIgZXF1aXZhbGVudCBmcm9tIGEgdmFsdWUgaWYgaXQgZXhpc3RzXG4gKiBhcyBhIHByb3BlcnR5IG9uIGl0LlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm4geyp9ICBUaGUgb3JpZ2luYWwgdmFsdWUgaXMgcmV0dXJuZWQgaWYgaXRzIG5vdCBhIHBsYWluIG9iamVjdCBvciBpZlxuICogaXQgaGFzIG5vIGByZW5kZXJlZGAgb3IgYHByZXR0eWAgcHJvcGVydHkuICBIb3dldmVyLCBpZiBpdCBpcyBhIHBsYWluIG9iamVjdFxuICogYW5kIGhhcyBubyBwcmV0dHkvcmVuZGVyZWQgcHJvcGVydGllcyBidXQgRE9FUyBoYXZlIGEgcmF3IHByb3BlcnR5LCB0aGVuIHRoYXRcbiAqIGlzIHJldHVybmVkLlxuICovXG5leHBvcnQgY29uc3QgZGVyaXZlUmVuZGVyZWRWYWx1ZSA9ICggdmFsdWUgKSA9PiB7XG5cdGlmICggISBpc1BsYWluT2JqZWN0KCB2YWx1ZSApICkge1xuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXHR2YWx1ZSA9IGhhc1ByZXR0eVByb3BlcnR5KCB2YWx1ZSApID8gdmFsdWUucHJldHR5IDogdmFsdWU7XG5cdHZhbHVlID0gaGFzUmVuZGVyZWRQcm9wZXJ0eSggdmFsdWUgKSA/IHZhbHVlLnJlbmRlcmVkIDogdmFsdWU7XG5cdHJldHVybiBoYXNSYXdQcm9wZXJ0eSggdmFsdWUgKSA/IHZhbHVlLnJhdyA6IHZhbHVlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGEgcmVzb3VyY2UgZnJvbSB0aGUgZ2l2ZW4gYHJlc291cmNlTGlua2AuXG4gKlxuICogZWcuIFwiaHR0cHM6Ly9hcGkuZXZlbnRlc3ByZXNzby5jb20vcmVnaXN0cmF0aW9uXCIgd2lsbCByZXR1cm4gJ3JlZ2lzdHJhdGlvbic7XG5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZXNvdXJjZUxpbmtcbiAqIEByZXR1cm4ge3N0cmluZ30gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgZnJvbSBhIHByb3ZpZGVkIHJlc291cmNlXG4gKiBsaW5rLlxuICovXG5leHBvcnQgY29uc3QgZ2V0UmVsYXRpb25OYW1lRnJvbUxpbmsgPSAoIHJlc291cmNlTGluayApID0+IHtcblx0cmV0dXJuIHBsdXJhbE1vZGVsTmFtZSggY2FtZWxDYXNlKCBsYXN0KCByZXNvdXJjZUxpbmsuc3BsaXQoICcvJyApICkgKSApO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgcGxhaW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGVudGl0eSBmaWVsZCBuYW1lcyBhbmQgdmFsdWVzIGZyb20gdGhlXG4gKiBwcm92aWRlZCBlbnRpdHkgaW5zdGFuY2UuICBUaGUgdmFsdWVzIGFyZSBub3QgcHJlcGFyZWQgYW5kIG1hdGNoIGV4YWN0bHkgd2hhdFxuICogaXMgY3VycmVudGx5IHNldCBvbiB0aGlzIGVudGl0eS5cbiAqXG4gKiBAcGFyYW0ge0Jhc2VFbnRpdHl9IGVudGl0eUluc3RhbmNlXG4gKlxuICogQHJldHVybiB7T2JqZWN0fSBBIHBsYWluIG9iamVjdFxuICovXG5leHBvcnQgY29uc3QgZ2V0QmFzZUZpZWxkc0FuZFZhbHVlc0ZvckNsb25pbmcgPSAoIGVudGl0eUluc3RhbmNlICkgPT4ge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMoIGVudGl0eUluc3RhbmNlICkucmVkdWNlKCAoXG5cdFx0ZmllbGRzQW5kVmFsdWVzLFxuXHRcdGZpZWxkTmFtZVxuXHQpID0+IHtcblx0XHRpZiAoXG5cdFx0XHRpc0VudGl0eUZpZWxkKCBmaWVsZE5hbWUsIGVudGl0eUluc3RhbmNlLnNjaGVtYSApICYmXG5cdFx0XHQhIGlzUHJpbWFyeUtleUZpZWxkKCBmaWVsZE5hbWUsIGVudGl0eUluc3RhbmNlLnNjaGVtYSApXG5cdFx0KSB7XG5cdFx0XHRmaWVsZHNBbmRWYWx1ZXNbIGZpZWxkTmFtZSBdID0gZW50aXR5SW5zdGFuY2VbIGZpZWxkTmFtZSBdO1xuXHRcdFx0cmV0dXJuIGZpZWxkc0FuZFZhbHVlcztcblx0XHR9XG5cdFx0cmV0dXJuIGZpZWxkc0FuZFZhbHVlcztcblx0fSwge30gKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHBsYWluIG9iamVjdCBjb250YWluaW5nIHRoZSBlbnRpdHkgZmllbGQgbmFtZSBhbmQgdmFsdWVzIGZyb20gdGhlXG4gKiBwcm92aWRlZCBlbnRpdHkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBlbnRpdHlJbnN0YW5jZVxuICogQHBhcmFtIHtib29sZWFufSBmb3JJbnNlcnQgIFdoZXRoZXIgdG8gcmV0dXJuIHRoZSBmaWVsZHMgYW5kIHZhbHVlcyBmb3JcbiAqIGluc2VydCBvciBmb3IgdXBkYXRlLlxuICogQHJldHVybiB7T2JqZWN0fSBBIHBsYWluIG9iamVjdFxuICovXG5leHBvcnQgY29uc3QgZ2V0QmFzZUZpZWxkc0FuZFZhbHVlc0ZvclBlcnNpc3RpbmcgPSAoXG5cdGVudGl0eUluc3RhbmNlLFxuXHRmb3JJbnNlcnQgPSBmYWxzZVxuKSA9PiB7XG5cdGNvbnN0IGl0ZXJhdG9yID0gZm9ySW5zZXJ0ID9cblx0XHRBcnJheS5mcm9tKCBlbnRpdHlJbnN0YW5jZS5maWVsZHNUb1BlcnNpc3RPbkluc2VydC52YWx1ZXMoKSApIDpcblx0XHRPYmplY3Qua2V5cyggZW50aXR5SW5zdGFuY2UgKTtcblxuXHRyZXR1cm4gaXRlcmF0b3IucmVkdWNlKCAoXG5cdFx0ZmllbGRzQW5kVmFsdWVzLFxuXHRcdGZpZWxkTmFtZVxuXHQpID0+IHtcblx0XHRpZiAoXG5cdFx0XHRpc0VudGl0eUZpZWxkKCBmaWVsZE5hbWUsIGVudGl0eUluc3RhbmNlLnNjaGVtYSApICYmXG5cdFx0XHQhIGlzUHJpbWFyeUtleUZpZWxkKCBmaWVsZE5hbWUsIGVudGl0eUluc3RhbmNlLnNjaGVtYSApXG5cdFx0KSB7XG5cdFx0XHRmaWVsZHNBbmRWYWx1ZXNbIGZpZWxkTmFtZSBdID0gbWF5YmVDb252ZXJ0RnJvbVZhbHVlT2JqZWN0KFxuXHRcdFx0XHRlbnRpdHlJbnN0YW5jZVsgZmllbGROYW1lIF0sXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIGZpZWxkc0FuZFZhbHVlcztcblx0XHR9XG5cdFx0cmV0dXJuIGZpZWxkc0FuZFZhbHVlcztcblx0fSwge30gKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcHJpbWFyeSBrZXkocykgYW5kIHZhbHVlcyBmb3IgdGhlIGdpdmVuIGVudGl0eUluc3RhbmNlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGVudGl0eUluc3RhbmNlXG4gKiBAcmV0dXJuIHtPYmplY3R9IGFuIGFycmF5IG9mIHZhbHVlcyBmb3IgdGhlIHByaW1hcnkga2V5cy5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFByaW1hcnlLZXlWYWx1ZXMgPSAoIGVudGl0eUluc3RhbmNlICkgPT4gcGljayhcblx0ZW50aXR5SW5zdGFuY2UsXG5cdGVudGl0eUluc3RhbmNlLnByaW1hcnlLZXlzXG4pO1xuXG4vKipcbiAqIFRoaXMgcmV0dXJucyBhIHBsYWluIG9iamVjdCBvZiBlbnRpdHkgZmllbGRzIGZyb20gdGhlIHNjaGVtYSBmb3IgdGhlIGVudGl0eVxuICogaW5zdGFuY2UgKHNjaGVtYSBmb3IgZmllbGRzIGFyZSBleHRyYWN0ZWQgYXMgd2VsbCkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGVudGl0eUluc3RhbmNlXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgcGxhaW4gb2JqZWN0IHdpdGggZmllbGRzIGFuZCBzY2hlbWEgcHJvcGVydGllcyB0aGF0IGFyZVxuICogZW50aXR5IHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFbnRpdHlGaWVsZHNGcm9tU2NoZW1hID0gKCBlbnRpdHlJbnN0YW5jZSApID0+IHBpY2tCeShcblx0ZW50aXR5SW5zdGFuY2Uuc2NoZW1hLFxuXHQoIGZpZWxkVmFsdWUsIGZpZWxkTmFtZSApID0+IGlzRW50aXR5RmllbGQoXG5cdFx0ZmllbGROYW1lLFxuXHRcdGVudGl0eUluc3RhbmNlLnNjaGVtYVxuXHQpXG4pO1xuXG4vKipcbiAqIFRoaXMgcmV0dXJucyBhIHBsYWluIG9iamVjdCBvZiBleHRyYWN0ZWQgcHJpbWFyeUtleSBmaWVsZHMgZnJvbSB0aGUgc2NoZW1hXG4gKiBmb3IgdGhlIGVudGl0eSBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZW50aXR5SW5zdGFuY2VcbiAqIEByZXR1cm4ge09iamVjdH0gQSBwbGFpbiBvYmplY3Qgd2l0aCBmaWVsZHMgYW5kIHNjaGVtYSBwcm9wZXJ0aWVzIHRoYXRcbiAqIFx0XHRcdFx0XHRyZXByZXNlbnQgcHJpbWFyeSBrZXkgZmllbGRzLlxuICovXG5leHBvcnQgY29uc3QgZ2V0UHJpbWFyeUtleUZpZWxkc0Zyb21TY2hlbWEgPSAoIGVudGl0eUluc3RhbmNlICkgPT4gcGlja0J5KFxuXHRlbnRpdHlJbnN0YW5jZS5zY2hlbWEsXG5cdCggZmllbGRWYWx1ZSwgZmllbGROYW1lICkgPT4gaXNQcmltYXJ5S2V5RmllbGQoXG5cdFx0ZmllbGROYW1lLFxuXHRcdGVudGl0eUluc3RhbmNlLnNjaGVtYVxuXHQpXG4pO1xuXG4vKipcbiAqIERlcml2ZXMgdGhlIGRlZmF1bHQgdmFsdWUgdG8gdXNlIGZvciBhIGdpdmVuIHR5cGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4geyp9ICBBIHZhbHVlIHRvIHVzZSBmb3IgdGhlIGdpdmVuIHR5cGUuXG4gKi9cbmV4cG9ydCBjb25zdCBkZXJpdmVEZWZhdWx0VmFsdWVGb3JUeXBlID0gKCB0eXBlICkgPT4ge1xuXHRpZiAoIGlzQXJyYXkoIHR5cGUgKSApIHtcblx0XHRyZXR1cm4gdHlwZS5pbmRleE9mKCAnbnVsbCcgKSA+IC0xID9cblx0XHRcdG51bGwgOlxuXHRcdFx0ZGVyaXZlRGVmYXVsdFZhbHVlRm9yVHlwZSggdHlwZVsgMCBdICk7XG5cdH1cblx0c3dpdGNoICggdHlwZSApIHtcblx0XHRjYXNlICdzdHJpbmcnOlxuXHRcdFx0cmV0dXJuICcnO1xuXHRcdGNhc2UgJ251bWJlcic6XG5cdFx0Y2FzZSAnaW50ZWdlcic6XG5cdFx0XHRyZXR1cm4gMDtcblx0XHRjYXNlICdudWxsJzpcblx0XHRjYXNlICdvYmplY3QnOlxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0Y2FzZSAnYm9vbGVhbic6XG5cdFx0Y2FzZSAnYm9vbCc6XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0Y2FzZSAnZGF0ZS10aW1lJzpcblx0XHRcdHJldHVybiAoIG5ldyBEYXRlKCkgKS50b0lTT1N0cmluZygpO1xuXHR9XG5cdHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBEZXJpdmVzIHdoYXQgYHR5cGVgIGEgZmllbGQgaXMgZnJvbSB0aGUgc2NoZW1hLlxuICogSXQgYWNjb3VudHMgZm9yIGNhc2VzIHdoZXJlIHRoZSBcInR5cGVcIiBvZiBhIGZpZWxkIG1pZ2h0IGJlIGBkYXRlLXRpbWVgIG9yXG4gKiB3aGVyZSB0aGUgdHlwZSBpcyBhbiBvYmplY3QgYW5kIHRodXMgdGhlIGB0eXBlYCBmb3IgdGhlIHB1cnBvc2VzIG9mIG1vZGVsXG4gKiBlbnRpdGllcyBpcyBkZWZpbmVkIGJ5IHRoZSBgcmF3YCBwcm9wZXJ0eSBmb3IgdGhlIGZpZWxkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWFcbiAqIEByZXR1cm4geyp9ICBXaGF0IHR5cGUgdGhlIGZpbGVkIGlzLlxuICovXG5leHBvcnQgY29uc3QgZGVyaXZlVHlwZUZvckZpZWxkID0gKCBmaWVsZE5hbWUsIHNjaGVtYSApID0+IHtcblx0aWYgKCBpc0RhdGVUaW1lRmllbGQoIGZpZWxkTmFtZSwgc2NoZW1hICkgKSB7XG5cdFx0cmV0dXJuICdkYXRlLXRpbWUnO1xuXHR9XG5cdGlmICggc2NoZW1hWyBmaWVsZE5hbWUgXSAmJiBzY2hlbWFbIGZpZWxkTmFtZSBdLnR5cGUgKSB7XG5cdFx0aWYgKCBzY2hlbWFbIGZpZWxkTmFtZSBdLnR5cGUgPT09ICdvYmplY3QnICkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRzY2hlbWFbIGZpZWxkTmFtZSBdLnByb3BlcnRpZXMgJiZcblx0XHRcdFx0aGFzUmF3UHJvcGVydHkoIHNjaGVtYVsgZmllbGROYW1lIF0ucHJvcGVydGllcyApXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIHNjaGVtYVsgZmllbGROYW1lIF0ucHJvcGVydGllcy5yYXcudHlwZSA/XG5cdFx0XHRcdFx0c2NoZW1hWyBmaWVsZE5hbWUgXS5wcm9wZXJ0aWVzLnJhdy50eXBlIDpcblx0XHRcdFx0XHRudWxsO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdHJldHVybiBzY2hlbWFbIGZpZWxkTmFtZSBdLnR5cGU7XG5cdH1cblx0cmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIFRoaXMgZGVyaXZlcyB0aGUgdmFsaWRhdGUgdHlwZSBmcm9tIHRoZSBpbmNvbWluZyBmaWVsZCBhbmQgdmFsdWUgYWNjb3JkaW5nXG4gKiB0byB0aGUgc2NoZW1hIGFuZCBpbmNvbWluZyB2YWx1ZS5cbiAqXG4gKiBUaGlzIGFjY291bnRzIGZvciB0aGUgZmFjdCB0aGF0IGVudGl0aWVzIG1heSBiZSBjb25zdHJ1Y3RlZCBmcm9tIHRoZVxuICogZm9sbG93aW5nIGNvbnRleHRzOlxuICpcbiAqIDEuIEF1dGhlZCBSRVNUIHJlc3BvbnNlICh3aGljaCBjb3VsZCBoYXZlIGJvdGggcmF3LCByZW5kZXJlZCBvciBwcmV0dHlcbiAqICAgIHZhbHVlcyBpbiB0aGUgZmllbGQgdmFsdWUpLlxuICogMi4gTm9uLWF1dGhlZCBSRVNUIHJlc3BvbnNlICh3aGljaCB3aWxsIG5vdCBoYXZlIGEgcmF3IHZhbHVlLCBidXQgY291bGQgaGF2ZVxuICogICAgYSBwcmV0dHkgb3IgcmVuZGVyZWQgdmFsdWUpLiAgVGhpcyBpcyBwb3RlbnRpYWxseSBwcm9ibGVtYXRpYyBpZiB0aGVcbiAqICAgIHJlbmRlcmVkIG9yIHByZXR0eSB2YWx1ZSBpcyBvZiBhIGRpZmZlcmVudCBkYXRhIHR5cGUgdGhhbiB0aGUgcmF3IHZhbHVlLlxuICogMy4gTmV3IGVudGl0aWVzIGJ1aWx0IGNsaWVudCBzaWRlLCB3aGljaCB3aWxsIGJlIGFzc3VtZWQgdG8gYmUgcHJlcGFyZWRcbiAqICAgIGFnYWluc3QgdGhlIFwicmF3XCIgdmFsaWRhdGUgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lXG4gKiBAcGFyYW0geyp9IGZpZWxkVmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWFcbiAqIEByZXR1cm4ge1N5bWJvbH0gIFRoZSB2YWxpZGF0ZSB0eXBlIGZvciB0aGUgZmllbGQuXG4gKi9cbmV4cG9ydCBjb25zdCBkZXJpdmVWYWxpZGF0ZVR5cGVGb3JGaWVsZCA9ICggZmllbGROYW1lLCBmaWVsZFZhbHVlLCBzY2hlbWEgKSA9PiB7XG5cdGlmICggaGFzUmF3UHJvcGVydHkoIGZpZWxkVmFsdWUgKSApIHtcblx0XHRyZXR1cm4gVkFMSURBVEVfVFlQRS5SQVc7XG5cdH1cblx0aWYgKCBzY2hlbWFbIGZpZWxkTmFtZSBdICYmIHNjaGVtYVsgZmllbGROYW1lIF0udHlwZSApIHtcblx0XHRpZiAoXG5cdFx0XHRzY2hlbWFbIGZpZWxkTmFtZSBdLnR5cGUgPT09ICdvYmplY3QnICYmXG5cdFx0XHRpc1BsYWluT2JqZWN0KCBmaWVsZFZhbHVlIClcblx0XHQpIHtcblx0XHRcdHJldHVybiBoYXNSZW5kZXJlZFByb3BlcnR5KCBmaWVsZFZhbHVlICkgP1xuXHRcdFx0XHRWQUxJREFURV9UWVBFLlJFTkRFUkVEIDpcblx0XHRcdFx0VkFMSURBVEVfVFlQRS5QUkVUVFk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBWQUxJREFURV9UWVBFLlJBVztcbn07XG5cbi8qKlxuICogVGhpcyBnZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBhIGZpZWxkIGZyb20gdGhlIHByb3ZpZGVkIHNjaGVtYS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lXG4gKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hXG4gKiBAcmV0dXJuIHsqfSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGZpZWxkIGZyb20gdGhlIHNjaGVtYSBvciBpZiBub3RcbiAqIHByZXNlbnQgaW4gdGhlIHNjaGVtYSwgYSBkZXJpdmVkIGRlZmF1bHQgdmFsdWUgZnJvbSB0aGUgc2NoZW1hIHR5cGUuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0VmFsdWVGb3JGaWVsZCA9ICggZmllbGROYW1lLCBzY2hlbWEgKSA9PiB7XG5cdGlmICggc2NoZW1hWyBmaWVsZE5hbWUgXSApIHtcblx0XHRyZXR1cm4gc2NoZW1hWyBmaWVsZE5hbWUgXS5kZWZhdWx0ID9cblx0XHRcdHNjaGVtYVsgZmllbGROYW1lIF0uZGVmYXVsdCA6XG5cdFx0XHRkZXJpdmVEZWZhdWx0VmFsdWVGb3JUeXBlKCBzY2hlbWFbIGZpZWxkTmFtZSBdLnR5cGUgKTtcblx0fVxuXHRyZXR1cm4gbnVsbDtcbn07XG4iLCJleHBvcnQgeyBkZWZhdWx0IGFzIGNyZWF0ZUVudGl0eUZhY3RvcnkgfSBmcm9tICcuL2Jhc2UtZW50aXR5JztcbmV4cG9ydCB7IE1PREVMX1BSRUZJWEVTLCBTQVZFX1NUQVRFIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7XG5cdGlzQXJyYXksXG5cdGlzSW50ZWdlcixcblx0aXNTdHJpbmcsXG5cdGlzUGxhaW5PYmplY3QsXG5cdGlzQm9vbGVhbixcblx0aXNOdW1iZXIsXG59IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBzcHJpbnRmIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vaTE4bic7XG5cbi8qKlxuICogSW50ZXJuYWwgSW1wb3J0c1xuICovXG5pbXBvcnQgeyBpc0VudW1GaWVsZCwgaXNQcmltYXJ5S2V5RmllbGQsIGlzVmFsdWVPYmplY3RGaWVsZCB9IGZyb20gJy4vYm9vbGVhbnMnO1xuaW1wb3J0IHsgbWF5YmVDb252ZXJ0RnJvbVZhbHVlT2JqZWN0V2l0aEFzc2VydGlvbnMgfSBmcm9tICcuL2V4dHJhY3RvcnMnO1xuaW1wb3J0IHsgUFJJVkFURV9QUk9QRVJUSUVTLCBWQUxJREFURV9UWVBFIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgaW5jb21pbmcgdmFsdWUgZm9yIGdpdmVuIHR5cGUuICBUeXBlcyBhbGxvd2VkIGFyZTpcbiAqXG4gKiAtIGludGVnZXI6IGNoZWNrcyBpZiB2YWx1ZSBpcyBhbiBpbnRlZ2VyLlxuICogLSBudW1iZXI6IGNoZWNrcyBpZiB2YWx1ZSBpcyBjbGFzc2lmaWVkIGFzIGEgTnVtYmVyIHByaW1pdGl2ZSBvciBvYmplY3QgKHRoaXNcbiAqICAgbWVhbnMgYEluZmluaXR5YCwgYC1JbmZpbml0eWAsIGFuZCBgTmFOYCBhcmUgY29uc2lkZXJlZCB2YWxpZCBmb3IgdGhpcyB0eXBlXG4gKiAtIHN0cmluZ1xuICogLSBvYmplY3QgLSB0aGlzIHZhbGlkYXRlcyBhcyBhIFwicGxhaW5PYmplY3RcIiwgdGhhdCBpcyBhbiBvYmplY3QgY3JlYXRlZCBieVxuICogICB0aGUgT2JqZWN0IGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEgW1tQcm90b3R5cGVdXSBvZiBudWxsLlxuICogLSBib29sZWFuXG4gKiAtIGJvb2w6IChzYW1lIGFzIGJvb2xlYW4gY2hlY2spXG4gKiAtIG51bGw6IHZhbHVlIG11c3QgZXhwbGljaXRseSBiZSBgbnVsbGBcbiAqXG4gKiBOb3RlOiBpZiB0aGUgcGFzc2VkIGluIHR5cGUgZG9lcyBub3QgZXhpc3QsIHRoZW4gdGhlIHZhbHVlIGlzIGNvbnNpZGVyZWRcbiAqIGludmFsaWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8QXJyYXl9IHR5cGUgIFRoZSB0eXBlIG9yIHR5cGVzIHRvIGNoZWNrXG4gKiBAcGFyYW0geyp9IHZhbHVlICBUaGUgdmFsdWUgYmVpbmcgdmFsaWRhdGVkXG4gKiBAcmV0dXJuIHtib29sZWFufSAgVHJ1ZSBtZWFucyB0aGUgdmFsdWUgaXMgdmFsaWQgZm9yIHRoZSBnaXZlbiB0eXBlLlxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVUeXBlID0gKCB0eXBlLCB2YWx1ZSApID0+IHtcblx0bGV0IHZhbGlkID0gZmFsc2U7XG5cdC8vIGFjY291bnQgZm9yIHR5cGUgZGVmaW5pdGlvbnMgdGhhdCBhcmUgYW4gYXJyYXkgb2YgYWxsb3dlZCB0eXBlcy5cblx0aWYgKCBpc0FycmF5KCB0eXBlICkgKSB7XG5cdFx0Zm9yICggY29uc3Qgc2luZ2xlVHlwZSBvZiB0eXBlICkge1xuXHRcdFx0dmFsaWQgPSB2YWxpZGF0ZVR5cGUoIHNpbmdsZVR5cGUsIHZhbHVlICk7XG5cdFx0XHRpZiAoIHZhbGlkICkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gcmV0dXJuIHJpZ2h0IGF3YXkgYmVjYXVzZSB3ZSd2ZSBkZXRlcm1pbmVkIHRoZSB2YWxpZGl0eSBvZiB0aGUgdHlwZS5cblx0XHRyZXR1cm4gdmFsaWQ7XG5cdH1cblx0c3dpdGNoICggdHlwZSApIHtcblx0XHRjYXNlICdpbnRlZ2VyJzpcblx0XHRcdHZhbGlkID0gaXNJbnRlZ2VyKCB2YWx1ZSApO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnbnVtYmVyJzpcblx0XHRcdHZhbGlkID0gaXNOdW1iZXIoIHZhbHVlICk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdzdHJpbmcnOlxuXHRcdFx0dmFsaWQgPSBpc1N0cmluZyggdmFsdWUgKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ29iamVjdCc6XG5cdFx0XHR2YWxpZCA9IGlzUGxhaW5PYmplY3QoIHZhbHVlICk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdib29sZWFuJzpcblx0XHRjYXNlICdib29sJzpcblx0XHRcdHZhbGlkID0gaXNCb29sZWFuKCB2YWx1ZSApO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnbnVsbCc6XG5cdFx0XHR2YWxpZCA9IHZhbHVlID09PSBudWxsO1xuXHRcdFx0YnJlYWs7XG5cdH1cblx0cmV0dXJuIHZhbGlkO1xufTtcblxuLyoqXG4gKiBUaGlzIHZhbGlkYXRlcyBlbnVtIHR5cGUgb2YgdmFsdWVzLlxuICpcbiAqIFRoaXMgbWVhbnMgdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHByb3ZpZGVkIGFycmF5IG9mIGVudW1WYWx1ZXMgYXNcbiAqIHdlbGwgYXMgYmVpbmcgb2YgdGhlIGV4cGVjdGVkIHR5cGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7QXJyYXl9IGVudW1WYWx1ZXNcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm4ge2Jvb2xlYW59ICBUcnVlIG1lYW5zIHRoaXMgdmFsdWUgaXMgdmFsaWQuXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUVudW1UeXBlID0gKCB0eXBlLCBlbnVtVmFsdWVzLCB2YWx1ZSApID0+IHtcblx0cmV0dXJuIHZhbGlkYXRlVHlwZSggdHlwZSwgdmFsdWUgKSAmJlxuXHRcdGlzQXJyYXkoIGVudW1WYWx1ZXMgKSAmJlxuXHRcdGVudW1WYWx1ZXMuaW5kZXhPZiggdmFsdWUgKSA+IC0xO1xufTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBkb2VzIGEgc2hhbGxvdyB2YWxpZGF0aW9uIGZvciB0aGUgZ2l2ZW4gdmFsdWUgYW5kIGZpZWxkLlxuICpcbiAqIFwiU2hhbGxvd1wiIGhlcmUgbWVhbnMgdGhhdCBpZiB0aGUgZmllbGQgc2NoZW1hIGlzIG9mIHR5cGUgJ29iamVjdCcsIHRoZW4gdGhlXG4gKiB2YWxpZGF0aW9uIG9ubHkgdmVyaWZpZXMgdGhhdCB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0LiAgVGhlIG9iamVjdCBjb250ZW50c1xuICogYXJlIG5vdCB2YWxpZGF0ZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZVxuICogQHBhcmFtIHsqfSBmaWVsZFZhbHVlXG4gKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGV4cGVjdFZhbHVlT2JqZWN0cyAgSWYgdHJ1ZSwgdGhlbiB0aGlzIGZsYWdzIHRoZSB2YWxpZGF0b3JcbiAqIHRvIGFzc3VtZSB0aGUgdmFsdWUgbWlnaHQgYmUgYSB2YWx1ZSBvYmplY3QgYW5kIGF0dGVtcHQgdG8gcmV0cmlldmUgdGhlIHJhd1xuICogdmFsdWUgZnJvbSB0aGF0IHZhbHVlIG9iamVjdCBmb3IgdmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBleHBlY3RlZCB0eXBlIGluIHRoZVxuICogc2NoZW1hIGZvciB0aGF0IGZpZWxkLlxuICogQHJldHVybiB7Ym9vbGVhbn0gIFRydWUgbWVhbnMgdGhlIHZhbHVlIGlzIHZhbGlkLlxuICogQHRocm93cyBUeXBlRXJyb3JcbiAqIEB0aHJvd3MgSW52YWxpZERhdGVUaW1lXG4gKi9cbmV4cG9ydCBjb25zdCBpc1NoYWxsb3dWYWxpZFZhbHVlRm9yRmllbGQgPSAoXG5cdGZpZWxkTmFtZSxcblx0ZmllbGRWYWx1ZSxcblx0c2NoZW1hLFxuXHRleHBlY3RWYWx1ZU9iamVjdHMgPSB0cnVlXG4pID0+IHtcblx0Ly8gaWYgZmllbGQgaXMgYSBwcmltYXJ5IEtleSBmaWVsZCB0aGVuIHdlIG92ZXJyaWRlIHRoZSB2YWxpZGF0aW9uIHNvIGl0IGNhblxuXHQvLyBiZSBlaXRoZXIgc3RyaW5nIG9yIG51bWJlclxuXHRpZiAoIGlzUHJpbWFyeUtleUZpZWxkKCBmaWVsZE5hbWUsIHNjaGVtYSApICkge1xuXHRcdHJldHVybiB2YWxpZGF0ZVR5cGUoICdzdHJpbmcnLCBmaWVsZFZhbHVlICkgfHxcblx0XHRcdHZhbGlkYXRlVHlwZSggJ251bWJlcicsIGZpZWxkVmFsdWUgKTtcblx0fVxuXHRjb25zdCBpc0VudW0gPSBpc0VudW1GaWVsZCggZmllbGROYW1lLCBzY2hlbWEgKTtcblx0Y29uc3QgaXNWYWx1ZU9iamVjdCA9IGlzVmFsdWVPYmplY3RGaWVsZCggZmllbGROYW1lLCBzY2hlbWEgKTtcblx0ZmllbGRWYWx1ZSA9IGV4cGVjdFZhbHVlT2JqZWN0cyAmJiBpc1ZhbHVlT2JqZWN0ID9cblx0XHRtYXliZUNvbnZlcnRGcm9tVmFsdWVPYmplY3RXaXRoQXNzZXJ0aW9ucyhcblx0XHRcdGZpZWxkTmFtZSxcblx0XHRcdGZpZWxkVmFsdWUsXG5cdFx0XHRzY2hlbWFcblx0XHQpIDpcblx0XHRmaWVsZFZhbHVlO1xuXHRmaWVsZFZhbHVlID0gZXhwZWN0VmFsdWVPYmplY3RzICYmXG5cdFx0XHRzY2hlbWFbIGZpZWxkTmFtZSBdLnR5cGUgPT09ICdvYmplY3QnICYmXG5cdFx0XHRpc1ZhbHVlT2JqZWN0ID9cblx0XHR7IHJhdzogZmllbGRWYWx1ZSB9IDpcblx0XHRmaWVsZFZhbHVlO1xuXHRjb25zdCBpc1ZhbGlkID0gaXNFbnVtID9cblx0XHR2YWxpZGF0ZUVudW1UeXBlKFxuXHRcdFx0c2NoZW1hWyBmaWVsZE5hbWUgXS50eXBlLFxuXHRcdFx0c2NoZW1hWyBmaWVsZE5hbWUgXS5lbnVtLFxuXHRcdFx0ZmllbGRWYWx1ZVxuXHRcdCkgOlxuXHRcdHZhbGlkYXRlVHlwZSggc2NoZW1hWyBmaWVsZE5hbWUgXS50eXBlLCBmaWVsZFZhbHVlICk7XG5cdC8vIGlmIGlzRW51bSBhbmQgbm90IHZhbGlkLCB0aGVuIGxldHMgYmFpbCB3aXRoIGVycm9yXG5cdGlmICggaXNFbnVtICYmICEgaXNWYWxpZCApIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFxuXHRcdFx0c3ByaW50Zihcblx0XHRcdFx0J1RoZSBnaXZlbiBcIiVzXCIgZmllbGROYW1lIGlzIG5vdCB2YWxpZCBmb3IgdGhlIGRlZmluZWQgJyArXG5cdFx0XHRcdCdzY2hlbWEuICBJdCBtdXN0IGJlIGEgXCIlc1wiIGFuZCBpdCBtdXN0IGJlIG9uZSBvZiBcIiVzXCIuICcgK1xuXHRcdFx0XHQnVGhlIGZpZWxkVmFsdWUgZ2l2ZW4gd2FzIFwiJXNcIicsXG5cdFx0XHRcdGZpZWxkTmFtZSxcblx0XHRcdFx0c2NoZW1hWyBmaWVsZE5hbWUgXS5lbnVtLmpvaW4oKSxcblx0XHRcdFx0ZmllbGRWYWx1ZVxuXHRcdFx0KVxuXHRcdCk7XG5cdH1cblx0cmV0dXJuIGlzVmFsaWQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hhdCBpcyBzZXQgYXMgdGhlIHZhbGlkYXRlVHlwZSBmb3IgdGhlIGdpdmVuIGZpZWxkIGFuZCBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZhbGlkYXRpb24gdHlwZSBmb3IgdGhlIGdpdmVuIGZpZWxkIGFuZCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlVHlwZUZvckZpZWxkID0gKCBmaWVsZE5hbWUsIGluc3RhbmNlICkgPT4ge1xuXHRyZXR1cm4gaW5zdGFuY2VbIFBSSVZBVEVfUFJPUEVSVElFUy5WQUxJREFURV9UWVBFUyBdWyBmaWVsZE5hbWUgXSA/XG5cdFx0aW5zdGFuY2VbIFBSSVZBVEVfUFJPUEVSVElFUy5WQUxJREFURV9UWVBFUyBdWyBmaWVsZE5hbWUgXSA6XG5cdFx0VkFMSURBVEVfVFlQRS5SQVc7XG59O1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IHZhbHVlcyB9IGZyb20gJ2xvZGFzaCc7XG5cbmV4cG9ydCBjb25zdCBNT0RFTF9OQU1FID0gJ2V2ZW50JztcblxuZXhwb3J0IGNvbnN0IEVWRU5UX1NUQVRVU19JRCA9IHtcblx0U09MRF9PVVQ6ICdzb2xkX291dCcsXG5cdFBPU1RQT05FRDogJ3Bvc3Rwb25lZCcsXG5cdENBTkNFTExFRDogJ2NhbmNlbGxlZCcsXG59O1xuXG5leHBvcnQgY29uc3QgRVZFTlRfU1RBVFVTX0lEUyA9IHZhbHVlcyggRVZFTlRfU1RBVFVTX0lEICk7XG4iLCJleHBvcnQgKiBmcm9tICcuL2NvbnN0YW50cyc7XG5leHBvcnQgKiBmcm9tICcuL3F1ZXJ5JztcbiIsIi8qKlxuICogRXh0ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50LXRpbWV6b25lJztcbmltcG9ydCB7IGlzVW5kZWZpbmVkIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbi8qKlxuICogSW50ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQge1xuXHRnZXRRdWVyeVN0cmluZyBhcyBiYXNlR2V0UXVlcnlTdHJpbmcsXG5cdFFVRVJZX09SREVSX0RFU0MsXG5cdEFMTE9XRURfT1JERVJfVkFMVUVTLFxuXHRHUkVBVEVSX1RIQU4sXG5cdEdSRUFURVJfVEhBTl9BTkRfRVFVQUwsXG5cdExFU1NfVEhBTl9BTkRfRVFVQUwsXG59IGZyb20gJy4uL2Jhc2UnO1xuXG5leHBvcnQgY29uc3Qgbm93RGF0ZUFuZFRpbWUgPSBtb21lbnQoKTtcblxuLyoqXG4gKiBEZXNjcmliZWQgYXR0cmlidXRlcyBmb3IgdGhpcyBtb2RlbFxuICogQHR5cGUge3thdHRyaWJ1dGVzOiAqfX1cbiAqL1xuZXhwb3J0IGNvbnN0IHF1ZXJ5RGF0YVR5cGVzID0ge1xuXHRxdWVyeURhdGE6IFByb3BUeXBlcy5zaGFwZSgge1xuXHRcdGxpbWl0OiBQcm9wVHlwZXMubnVtYmVyLFxuXHRcdG9yZGVyQnk6IFByb3BUeXBlcy5vbmVPZiggW1xuXHRcdFx0J0VWVF9uYW1lJyxcblx0XHRcdCdFVlRfSUQnLFxuXHRcdFx0J3N0YXJ0X2RhdGUnLFxuXHRcdFx0J2VuZF9kYXRlJyxcblx0XHRcdCd0aWNrZXRfc3RhcnQnLFxuXHRcdFx0J3RpY2tldF9lbmQnLFxuXHRcdF0gKSxcblx0XHRvcmRlcjogUHJvcFR5cGVzLm9uZU9mKCBBTExPV0VEX09SREVSX1ZBTFVFUyApLFxuXHRcdHNob3dFeHBpcmVkOiBQcm9wVHlwZXMuYm9vbCxcblx0XHRjYXRlZ29yeVNsdWc6IFByb3BUeXBlcy5zdHJpbmcsXG5cdFx0bW9udGg6IFByb3BUeXBlcy5tb250aCxcblx0fSApLFxufTtcblxuLyoqXG4gKiBEZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoaXMgbW9kZWxcbiAqIEB0eXBlIHtcbiAqIFx0e1xuICogXHRcdGF0dHJpYnV0ZXM6IHtcbiAqIFx0XHRcdGxpbWl0OiBudW1iZXIsXG4gKiBcdFx0XHRvcmRlckJ5OiBzdHJpbmcsXG4gKiBcdFx0XHRvcmRlcjogc3RyaW5nLFxuICogICBcdFx0c2hvd0V4cGlyZWQ6IGJvb2xlYW5cbiAqICAgXHR9XG4gKiAgIH1cbiAqIH1cbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRRdWVyeURhdGEgPSB7XG5cdHF1ZXJ5RGF0YToge1xuXHRcdGxpbWl0OiAxMDAsXG5cdFx0b3JkZXJCeTogJ3N0YXJ0X2RhdGUnLFxuXHRcdG9yZGVyOiBRVUVSWV9PUkRFUl9ERVNDLFxuXHRcdHNob3dFeHBpcmVkOiBmYWxzZSxcblx0fSxcbn07XG5cbi8qKlxuICogVXNlZCB0byBtYXAgYW4gb3JkZXJCeSBzdHJpbmcgdG8gdGhlIGFjdHVhbCB2YWx1ZSB1c2VkIGluIGEgUkVTVCBxdWVyeSBmcm9tXG4gKiB0aGUgY29udGV4dCBvZiBhbiBldmVudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gb3JkZXJCeVxuICpcbiAqIEByZXR1cm4geyBzdHJpbmcgfSBSZXR1cm5zIGFuIGFjdHVhbCBvcmRlckJ5IHN0cmluZyBmb3IgdGhlIFJFU1QgcXVlcnkgZm9yXG4gKiAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJvdmlkZWQgYWxpYXNcbiAqL1xuZXhwb3J0IGNvbnN0IG1hcE9yZGVyQnkgPSAoIG9yZGVyQnkgKSA9PiB7XG5cdGNvbnN0IG9yZGVyQnlNYXAgPSB7XG5cdFx0c3RhcnRfZGF0ZTogJ0RhdGV0aW1lLkRUVF9FVlRfc3RhcnQnLFxuXHRcdGVuZF9kYXRlOiAnRGF0ZXRpbWUuRFRUX0VWVF9lbmQnLFxuXHRcdHRpY2tldF9zdGFydDogJ0RhdGV0aW1lLlRpY2tldC5US1Rfc3RhcnRfZGF0ZScsXG5cdFx0dGlja2V0X2VuZDogJ0RhdGV0aW1lLlRpY2tldC5US1RfZW5kX2RhdGUnLFxuXHR9O1xuXHRyZXR1cm4gaXNVbmRlZmluZWQoIG9yZGVyQnlNYXBbIG9yZGVyQnkgXSApID9cblx0XHRvcmRlckJ5IDpcblx0XHRvcmRlckJ5TWFwWyBvcmRlckJ5IF07XG59O1xuXG4vKipcbiAqIEJ1aWxkcyB3aGVyZSBjb25kaXRpb25zIGZvciBhbiBldmVudHMgZW5kcG9pbnQgcmVxdWVzdCB1c2luZyBwcm92aWRlZFxuICogaW5mb3JtYXRpb24uXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBzaG93RXhwaXJlZCAgV2hldGhlciBvciBub3QgdG8gaW5jbHVkZSBleHBpcmVkIGV2ZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjYXRlZ29yeVNsdWcgIFJldHVybiBldmVudHMgZm9yIHRoZSBnaXZlbiBjYXRlZ29yeVNsdWdcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb250aCAgICAgICAgIFJldHVybiBldmVudHMgZm9yIHRoZSBnaXZlbiBtb250aC5cbiAqIFx0XHRcdFx0XHRcdFx0XHQgQ2FuIGJlIGFueSBtb250aCBmb3JtYXQgcmVjb2duaXplZCBieSBtb21lbnQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgICAgICAgICBUaGUgYXNzZW1ibGVkIHdoZXJlIGNvbmRpdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCB3aGVyZUNvbmRpdGlvbnMgPSAoIHtcblx0c2hvd0V4cGlyZWQgPSBmYWxzZSxcblx0Y2F0ZWdvcnlTbHVnLFxuXHRtb250aCA9ICdub25lJyxcbn0gKSA9PiB7XG5cdGNvbnN0IHdoZXJlID0gW107XG5cblx0aWYgKCAhIHNob3dFeHBpcmVkICkge1xuXHRcdHdoZXJlLnB1c2goXG5cdFx0XHQnd2hlcmVbRGF0ZXRpbWUuRFRUX0VWVF9lbmQqKmV4cGlyZWRdW109JyArIEdSRUFURVJfVEhBTiArXG5cdFx0XHQnJndoZXJlW0RhdGV0aW1lLkRUVF9FVlRfZW5kKipleHBpcmVkXVtdPScgK1xuXHRcdFx0bm93RGF0ZUFuZFRpbWUubG9jYWwoKS5mb3JtYXQoKVxuXHRcdCk7XG5cdH1cblx0aWYgKCBjYXRlZ29yeVNsdWcgKSB7XG5cdFx0d2hlcmUucHVzaChcblx0XHRcdCd3aGVyZVtUZXJtX1JlbGF0aW9uc2hpcC5UZXJtX1RheG9ub215LlRlcm0uc2x1Z109JyArIGNhdGVnb3J5U2x1Z1xuXHRcdCk7XG5cdH1cblx0aWYgKCBtb250aCAmJiBtb250aCAhPT0gJ25vbmUnICkge1xuXHRcdHdoZXJlLnB1c2goXG5cdFx0XHQnd2hlcmVbRGF0ZXRpbWUuRFRUX0VWVF9zdGFydF1bXT0nICsgR1JFQVRFUl9USEFOX0FORF9FUVVBTCArXG5cdFx0XHQnJndoZXJlW0RhdGV0aW1lLkRUVF9FVlRfc3RhcnRdW109JyArXG5cdFx0XHRtb21lbnQoKS5tb250aCggbW9udGggKS5zdGFydE9mKCAnbW9udGgnICkubG9jYWwoKS5mb3JtYXQoKVxuXHRcdCk7XG5cdFx0d2hlcmUucHVzaChcblx0XHRcdCd3aGVyZVtEYXRldGltZS5EVFRfRVZUX2VuZF1bXT0nICsgTEVTU19USEFOX0FORF9FUVVBTCArXG5cdFx0XHQnJndoZXJlW0RhdGV0aW1lLkRUVF9FVlRfZW5kXVtdPScgK1xuXHRcdFx0bW9tZW50KCkubW9udGgoIG1vbnRoICkuZW5kT2YoICdtb250aCcgKS5sb2NhbCgpLmZvcm1hdCgpXG5cdFx0KTtcblx0fVxuXHRyZXR1cm4gd2hlcmUuam9pbiggJyYnICk7XG59O1xuXG4vKipcbiAqIFJldHVybiBhIHF1ZXJ5IHN0cmluZyBmb3IgdXNlIGJ5IGEgUkVTVCByZXF1ZXN0IGdpdmVuIGEgc2V0IG9mIHF1ZXJ5RGF0YS5cbiAqIEBwYXJhbSB7IE9iamVjdCB9IHF1ZXJ5RGF0YVxuICogQHJldHVybiB7IHN0cmluZyB9ICBSZXR1cm5zIHRoZSBxdWVyeSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRRdWVyeVN0cmluZyA9ICggcXVlcnlEYXRhID0ge30gKSA9PiB7XG5cdHF1ZXJ5RGF0YSA9IHsgLi4uZGVmYXVsdFF1ZXJ5RGF0YS5xdWVyeURhdGEsIC4uLnF1ZXJ5RGF0YSB9O1xuXHRyZXR1cm4gYmFzZUdldFF1ZXJ5U3RyaW5nKCBxdWVyeURhdGEsIHdoZXJlQ29uZGl0aW9ucywgbWFwT3JkZXJCeSApO1xufTtcbiIsImV4cG9ydCAqIGZyb20gJy4vZGVmYXVsdC1tb2RlbC1zdGF0ZSc7XG5leHBvcnQgKiBmcm9tICcuL2VuZHBvaW50cyc7XG5leHBvcnQgKiBmcm9tICcuL3ByaW1hcnkta2V5cyc7XG5leHBvcnQgKiBmcm9tICcuL2Fzc2VydGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2RlbC1uYW1lcyc7XG5leHBvcnQgKiBmcm9tICcuL2Jhc2UnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2RlbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9lbnRpdHktZmFjdG9yeSc7XG4iLCIvKipcbiAqIEludGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgcHJpbWFyeUtleXMgfSBmcm9tICcuL3ByaW1hcnkta2V5cy5qcyc7XG5cbi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBrZXlzIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwbHVyYWxpemUgZnJvbSAncGx1cmFsaXplJztcbmltcG9ydCBtZW1vaXplIGZyb20gJ21lbWl6ZSc7XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBtb2RlbCBuYW1lcyBjdXJyZW50bHkgZXhwb3NlZCBmb3IgUkVTVCBBUEkgcmVxdWVzdC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1PREVMX05BTUVTID0ga2V5cyggcHJpbWFyeUtleXMgKTtcblxuLyoqXG4gKiBVc2VkIHRvIG5vcm1hbGl6ZSB0aGUgcGx1cmFsIGZvcm0gb2YgYSBnaXZlbiBtb2RlbCBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHJldHVybiB7c3RyaW5nfSAgRW5zdXJlcyB0aGUgZ2l2ZW4gbW9kZWxOYW1lIGlzIGl0cyBwbHVyYWwgZm9ybS5cbiAqL1xuZXhwb3J0IGNvbnN0IHBsdXJhbE1vZGVsTmFtZSA9IG1lbW9pemUoXG5cdCggbW9kZWxOYW1lICkgPT4gcGx1cmFsaXplKCBtb2RlbE5hbWUgKVxuKTtcblxuLyoqXG4gKiBVc2VkIHRvIG5vcm1hbGl6ZSB0aGUgc2luZ3VsYXIgZm9ybSBvZiBhIGdpdmVuIG1vZGVsIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEVuc3VyZXMgdGhlIGdpdmVuIG1vZGVsTmFtZSBpcyBpbiBpdHMgc2luZ3VsYXIgZm9ybS5cbiAqL1xuZXhwb3J0IGNvbnN0IHNpbmd1bGFyTW9kZWxOYW1lID0gbWVtb2l6ZShcblx0KCBtb2RlbE5hbWUgKSA9PiBwbHVyYWxpemUuc2luZ3VsYXIoIG1vZGVsTmFtZSApXG4pO1xuIiwiaW1wb3J0ICogYXMgZGF0ZVRpbWVNb2RlbCBmcm9tICcuL2RhdGV0aW1lJztcbmltcG9ydCAqIGFzIGV2ZW50TW9kZWwgZnJvbSAnLi9ldmVudCc7XG5pbXBvcnQgKiBhcyByZWdpc3RyYXRpb25Nb2RlbCBmcm9tICcuL3JlZ2lzdHJhdGlvbic7XG5pbXBvcnQgKiBhcyBzdGF0dXNNb2RlbCBmcm9tICcuL3N0YXR1cyc7XG5pbXBvcnQgKiBhcyB0aWNrZXRNb2RlbCBmcm9tICcuL3RpY2tldCc7XG5pbXBvcnQgKiBhcyBjaGVja0luTW9kZWwgZnJvbSAnLi9jaGVja2luJztcbmltcG9ydCAqIGFzIGF0dGVuZGVlTW9kZWwgZnJvbSAnLi9hdHRlbmRlZSc7XG5leHBvcnQge1xuXHRjaGVja0luTW9kZWwsXG5cdGRhdGVUaW1lTW9kZWwsXG5cdGV2ZW50TW9kZWwsXG5cdHJlZ2lzdHJhdGlvbk1vZGVsLFxuXHRzdGF0dXNNb2RlbCxcblx0dGlja2V0TW9kZWwsXG5cdGF0dGVuZGVlTW9kZWwsXG59O1xuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IGRhdGEgfSBmcm9tICdAZXZlbnRlc3ByZXNzby9lZWpzJztcbmltcG9ydCB7IF9fIH0gZnJvbSAnQGV2ZW50ZXNwcmVzc28vaTE4bic7XG5pbXBvcnQgeyBpc0FycmF5LCByZWR1Y2UsIHRyaW1FbmQgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG1lbW9pemUgZnJvbSAnbWVtaXplJztcblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7XG5cdGFzc2VydEVudGl0eUhhc0tleSxcblx0YXNzZXJ0SXNBcnJheSxcblx0YXNzZXJ0SXNOb3RFbXB0eSxcblx0YXNzZXJ0SXNNYXAsXG59IGZyb20gJy4vYXNzZXJ0aW9ucyc7XG5cbi8qKlxuICogRXhwb3NlcyBhIG1hcCBvZiBtb2RlbG5hbWUgdG8gcHJpbWFyeSBrZXkgZXhwb3NlZCBieSB0aGUgZWVqcy5kYXRhIGdsb2JhbFxuICogdmlhIHRoZSBzZXJ2ZXIuXG4gKlxuICogQHR5cGUge3t9fVxuICovXG5leHBvcnQgY29uc3QgeyBwcmltYXJ5X2tleXM6IHByaW1hcnlLZXlzID0ge30gfSA9IGRhdGEucGF0aHM7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdmFsdWVzIGZvciB0aGUgZ2l2ZW4ga2V5cyBmcm9tIHRoZSBwcm92aWRlZCBlbnRpdHkuXG4gKiBUaGlzIGZ1bmN0aW9uIHdvdWxkIGJlIHVzZWQgZm9yIG1vZGVscyB0aGF0IGhhdmUgY29tYmluZWQgcHJpbWFyeSBrZXlzXG4gKiAoZGVsaXZlcmVkIGFzIGFuIGFycmF5KS5cbiAqXG4gKiBAdHlwZSB7IG1lbW9pemVkIH1cbiAqIEByZXR1cm4geyBzdHJpbmcgfSBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgdmFsdWVzLlxuICogQHRocm93cyB7IEV4Y2VwdGlvbiB9XG4gKi9cbmV4cG9ydCBjb25zdCB2YWx1ZXNGb3JDb21iaW5lZFByaW1hcnlLZXlzID0gbWVtb2l6ZSggKCBrZXlzLCBlbnRpdHkgKSA9PiB7XG5cdGFzc2VydElzQXJyYXkoIGtleXMgKTtcblx0Y29uc3QgcHJpbWFyeUtleSA9IHJlZHVjZSgga2V5cywgZnVuY3Rpb24oIHJlc3VsdCwga2V5ICkge1xuXHRcdGFzc2VydEVudGl0eUhhc0tleSgga2V5LCBlbnRpdHkgKTtcblx0XHRyZXR1cm4gZW50aXR5WyByZXN1bHQgXSArICc6JyArIGVudGl0eVsga2V5IF07XG5cdH0gKTtcblx0cmV0dXJuIHRyaW1FbmQoIHByaW1hcnlLZXksICc6JyApO1xufSApO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5IGZyb20gdGhlIHByb3ZpZGVkIGVudGl0eS5cbiAqIFRoaXMgZnVuY3Rpb24gd291bGQgYmUgdXNlZCBmb3IgbW9kZWxzIHRoYXQgaGF2ZSBvbmx5IG9uZSBwcmltYXJ5IGtleS5cbiAqXG4gKiBAdHlwZSB7bWVtb2l6ZWR9XG4gKiBAcmV0dXJuIHsgZnVuY3Rpb24gfSBUaGUgdmFsdWUgZm9yIHRoZSBrZXkgaW4gdGhlIHByb3ZpZGVkIGVudGl0eS5cbiAqIEB0aHJvd3MgeyBFeGNlcHRpb24gfVxuICovXG5leHBvcnQgY29uc3QgdmFsdWVGb3JQcmltYXJ5S2V5ID0gbWVtb2l6ZSggKCBrZXksIGVudGl0eSApID0+IHtcblx0YXNzZXJ0RW50aXR5SGFzS2V5KCBrZXksIGVudGl0eSApO1xuXHRyZXR1cm4gZW50aXR5WyBrZXkgXTtcbn0gKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwcmltYXJ5IGtleSAob3IgY29tYmluZWQgcHJpbWFyeSBrZXlzKSBmcm9tIHRoZSBhdmFpbGFibGUgZGF0YS5cbiAqXG4gKiBAdHlwZSB7bWVtb2l6ZWR9XG4gKiBAcmV0dXJuIHsgZnVuY3Rpb24oc3RyaW5nKSB9XG4gKiBAdGhyb3dzIHsgRXhjZXB0aW9uIH1cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFByaW1hcnlLZXkgPSBtZW1vaXplKCAoIG1vZGVsTmFtZSApID0+IHtcblx0YXNzZXJ0RW50aXR5SGFzS2V5KCBtb2RlbE5hbWUsIHByaW1hcnlLZXlzICk7XG5cdHJldHVybiBwcmltYXJ5S2V5c1sgbW9kZWxOYW1lIF07XG59ICk7XG5cbi8qKlxuICogUmV0dXJucyBhIHF1ZXJ5IHN0cmluZyBmb3IgZ2V0dGluZyB0aGUgZW50aXRpZXMgYmVsb25naW5nIHRvIGEgbW9kZWwgZm9yIHRoZVxuICogZ2l2ZW4gcHJpbWFyeSBrZXkgdmFsdWVzXG4gKlxuICogQHR5cGUge21lbW9pemVkfVxuICovXG5leHBvcnQgY29uc3QgZ2V0UHJpbWFyeUtleVF1ZXJ5U3RyaW5nID0gbWVtb2l6ZShcblx0KCBtb2RlbE5hbWUsIGtleVZhbHVlcyA9IFtdICkgPT4ge1xuXHRcdGNvbnN0IHByaW1hcnlLZXkgPSBnZXRQcmltYXJ5S2V5KCBtb2RlbE5hbWUgKTtcblx0XHRyZXR1cm4gYFskeyBwcmltYXJ5S2V5IH1dW0lOXT1gICsga2V5VmFsdWVzLmpvaW4oKTtcblx0fVxuKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZXMgZm9yIHRoZSBwcmltYXJ5IGtleXMgZnJvbSB0aGUgcHJvdmlkZWQgZW50aXR5LlxuICpcbiAqIEB0eXBlIHttZW1vaXplZH1cbiAqIEByZXR1cm4geyBmdW5jdGlvbiB9ICBJZiB0aGUgbW9kZWwgaGFzIG9ubHkgb25lIHByaW1hcnkga2V5IHRoZW4gdGhlIHZhbHVlIHdpbGxcbiAqIGJlIGEgc2ltcGxlIHN0cmluZy4gIElmIHRoZSBtb2RlbCBoYXMgY29tYmluZWQgcHJpbWFyeSBrZXlzLCB0aGVuIHRoZSB2YWx1ZVxuICogd2lsbCBiZSBhcyBzdHJpbmcgaW4gdGhlIGZvcm1hdCBgJXMuJXNgIGZvciB0aGUgcHJpbWFyeSBrZXkgdmFsdWVzLlxuICogQHRocm93cyB7IEV4Y2VwdGlvbiB9XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFbnRpdHlQcmltYXJ5S2V5VmFsdWVzID0gbWVtb2l6ZSggKCBtb2RlbE5hbWUsIGVudGl0eSApID0+IHtcblx0Y29uc3Qga2V5cyA9IGdldFByaW1hcnlLZXkoIG1vZGVsTmFtZSApO1xuXHRyZXR1cm4gaXNBcnJheSgga2V5cyApID9cblx0XHR2YWx1ZXNGb3JDb21iaW5lZFByaW1hcnlLZXlzKCBrZXlzLCBlbnRpdHkgKSA6XG5cdFx0dmFsdWVGb3JQcmltYXJ5S2V5KCBrZXlzLCBlbnRpdHkgKTtcbn0gKTtcblxuLyoqXG4gKiBUaGlzIHJlY2VpdmVzIGFuIGFycmF5IG9mIGVudGl0aWVzIGFuZCByZXR1cm5zIGEgY29sbGVjdGlvbiBvZiB0aG9zZSBzYW1lXG4gKiBlbnRpdGllcyBpbmRleGVkIGJ5IHRoZSBwcmltYXJ5IGtleSB2YWx1ZSBmb3IgZWFjaCBlbnRpdHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICogQHBhcmFtIHtBcnJheX0gZW50aXRpZXNcbiAqIEByZXR1cm4ge01hcH0gIEEgY29sbGVjdGlvbiBpbmRleGVkIGJ5IHRoZSBwcmltYXJ5IGtleSB2YWx1ZXMgZm9yIGVhY2ggZW50aXR5LlxuICogQHRocm93cyB7RXhjZXB0aW9ufVxuICovXG5leHBvcnQgY29uc3Qga2V5RW50aXRpZXNCeVByaW1hcnlLZXlWYWx1ZSA9ICggbW9kZWxOYW1lLCBlbnRpdGllcyA9IFtdICkgPT4ge1xuXHRhc3NlcnRJc05vdEVtcHR5KFxuXHRcdGVudGl0aWVzLFxuXHRcdF9fKFxuXHRcdFx0J1RoZSBwcm92aWRlZCBhcnJheSBvZiBlbnRpdGllcyBtdXN0IG5vdCBiZSBlbXB0eScsXG5cdFx0XHQnZXZlbnRfZXNwcmVzc28nLFxuXHRcdClcblx0KTtcblx0YXNzZXJ0SXNBcnJheSggZW50aXRpZXMgKTtcblxuXHRjb25zdCBtYXBwZWRFbnRpdGllcyA9IG5ldyBNYXAoKTtcblx0ZW50aXRpZXMuZm9yRWFjaCggKCBlbnRpdHkgKSA9PiB7XG5cdFx0bWFwcGVkRW50aXRpZXMuc2V0KFxuXHRcdFx0Z2V0RW50aXR5UHJpbWFyeUtleVZhbHVlcyggbW9kZWxOYW1lLCBlbnRpdHkgKSxcblx0XHRcdGVudGl0eVxuXHRcdCk7XG5cdH0gKTtcblx0cmV0dXJuIG1hcHBlZEVudGl0aWVzO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVudGl0eSBpbnN0YW5jZXMgdXNpbmcgdGhlIGdpdmVuIGZhY3RvcnkgYW5kIGFycmF5XG4gKiBvZiBlbnRpdHkgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBmYWN0b3J5XG4gKiBAcGFyYW0ge01hcH0gZW50aXRpZXNcbiAqIEByZXR1cm4ge01hcH0gIEFuIGFycmF5IG9mIGVudGl0eSBpbnN0YW5jZXMgaW5kZXhlZCBieVxuICogdGhlaXIgcHJpbWFyeSBrZXkgdmFsdWVcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUFuZEtleUVudGl0aWVzQnlQcmltYXJ5S2V5VmFsdWUgPSAoXG5cdGZhY3RvcnksXG5cdGVudGl0aWVzLFxuKSA9PiB7XG5cdGFzc2VydElzTWFwKFxuXHRcdGVudGl0aWVzLFxuXHRcdF9fKFxuXHRcdFx0J1RoZSBwcm92aWRlZCBvYmplY3Qgb2YgZW50aXRpZXMgbXVzdCBiZSBhIE1hcCBvYmplY3QnLFxuXHRcdFx0J2V2ZW50X2VzcHJlc3NvJyxcblx0XHQpXG5cdCk7XG5cdGVudGl0aWVzLmZvckVhY2goICggZW50aXR5LCBlbnRpdHlJZCApID0+IHtcblx0XHRlbnRpdGllcy5zZXQoIGVudGl0eUlkLCBmYWN0b3J5LmZyb21FeGlzdGluZyggZW50aXR5ICkgKTtcblx0fSApO1xuXHRyZXR1cm4gZW50aXRpZXM7XG59O1xuIiwiLyoqXG4gKiBJbnRlcm5hbCBJbXBvcnRzXG4gKi9cbmltcG9ydCAqIGFzIHN0YXR1c01vZGVsIGZyb20gJy4uL3N0YXR1cy9jb25zdGFudHMnO1xuXG4vKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgdmFsdWVzIH0gZnJvbSAnbG9kYXNoJztcblxuZXhwb3J0IGNvbnN0IE1PREVMX05BTUUgPSAncmVnaXN0cmF0aW9uJztcblxuZXhwb3J0IGNvbnN0IFJFR0lTVFJBVElPTl9TVEFUVVNfSURTID0gdmFsdWVzKFxuXHRzdGF0dXNNb2RlbC5SRUdJU1RSQVRJT05fU1RBVFVTX0lEXG4pO1xuIiwiZXhwb3J0ICogZnJvbSAnLi9jb25zdGFudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9xdWVyeSc7XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgaXNVbmRlZmluZWQsIHZhbHVlcyB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG4vKipcbiAqIEludGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHtcblx0Z2V0UXVlcnlTdHJpbmcgYXMgYmFzZUdldFF1ZXJ5U3RyaW5nLFxuXHRRVUVSWV9PUkRFUl9ERVNDLFxuXHRBTExPV0VEX09SREVSX1ZBTFVFUyxcbn0gZnJvbSAnLi4vYmFzZSc7XG5pbXBvcnQgKiBhcyBzdGF0dXNNb2RlbCBmcm9tICcuLi9zdGF0dXMvY29uc3RhbnRzJztcblxuLyoqXG4gKiBEZXNjcmliZWQgYXR0cmlidXRlcyBmb3IgdGhpcyBtb2RlbFxuICogQHR5cGUge3thdHRyaWJ1dGVzOiAqfX1cbiAqL1xuZXhwb3J0IGNvbnN0IHF1ZXJ5RGF0YVR5cGVzID0ge1xuXHRmb3JFdmVudElkOiBQcm9wVHlwZXMubnVtYmVyLFxuXHRmb3JBdHRlbmRlZUlkOiBQcm9wVHlwZXMubnVtYmVyLFxuXHRmb3JUcmFuc2FjdGlvbklkOiBQcm9wVHlwZXMubnVtYmVyLFxuXHRmb3JUaWNrZXRJZDogUHJvcFR5cGVzLm51bWJlcixcblx0Zm9yU3RhdHVzSWQ6IFByb3BUeXBlcy5vbmVPZiggdmFsdWVzKCBzdGF0dXNNb2RlbC5SRUdJU1RSQVRJT05fU1RBVFVTX0lEICkgKSxcblx0cXVlcnlEYXRhOiBQcm9wVHlwZXMuc2hhcGUoIHtcblx0XHRsaW1pdDogUHJvcFR5cGVzLm51bWJlcixcblx0XHRvcmRlckJ5OiBQcm9wVHlwZXMub25lT2YoIFtcblx0XHRcdCdSRUdfSUQnLFxuXHRcdFx0J1JFR19kYXRlJyxcblx0XHRdICksXG5cdFx0b3JkZXI6IFByb3BUeXBlcy5vbmVPZiggQUxMT1dFRF9PUkRFUl9WQUxVRVMgKSxcblx0fSApLFxufTtcblxuZXhwb3J0IGNvbnN0IG9wdGlvbnNFbnRpdHlNYXAgPSB7XG5cdGRlZmF1bHQ6IHtcblx0XHR2YWx1ZTogJ1JFR19JRCcsXG5cdFx0bGFiZWw6ICdSRUdfY29kZScsXG5cdH0sXG59O1xuXG4vKipcbiAqIERlZmF1bHQgYXR0cmlidXRlcyBmb3IgdGhpcyBtb2RlbFxuICogQHR5cGUge1xuICogXHR7XG4gKiBcdFx0YXR0cmlidXRlczoge1xuICogXHRcdFx0bGltaXQ6IG51bWJlcixcbiAqIFx0XHRcdG9yZGVyQnk6IHN0cmluZyxcbiAqIFx0XHRcdG9yZGVyOiBzdHJpbmcsXG4gKiAgIFx0fVxuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0UXVlcnlEYXRhID0ge1xuXHRxdWVyeURhdGE6IHtcblx0XHRsaW1pdDogMTAwLFxuXHRcdG9yZGVyQnk6ICdyZWdfZGF0ZScsXG5cdFx0b3JkZXI6IFFVRVJZX09SREVSX0RFU0MsXG5cdH0sXG59O1xuXG4vKipcbiAqIFVzZWQgdG8gbWFwIGFuIG9yZGVyQnkgc3RyaW5nIHRvIHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBpbiBhIFJFU1QgcXVlcnkgZnJvbVxuICogdGhlIGNvbnRleHQgb2YgYSByZWdpc3RyYXRpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG9yZGVyQnlcbiAqXG4gKiBAcmV0dXJuIHsgc3RyaW5nIH0gUmV0dXJucyBhbiBhY3R1YWwgb3JkZXJCeSBzdHJpbmcgZm9yIHRoZSBSRVNUIHF1ZXJ5IGZvclxuICogICAgICAgICAgICAgICAgICAgICAgdGhlIHByb3ZpZGVkIGFsaWFzXG4gKi9cbmV4cG9ydCBjb25zdCBtYXBPcmRlckJ5ID0gKCBvcmRlckJ5ICkgPT4ge1xuXHRjb25zdCBvcmRlckJ5TWFwID0ge1xuXHRcdHJlZ19pZDogJ1JFR19JRCcsXG5cdFx0cmVnX2RhdGU6ICdSRUdfZGF0ZScsXG5cdH07XG5cdHJldHVybiBpc1VuZGVmaW5lZCggb3JkZXJCeU1hcFsgb3JkZXJCeSBdICkgP1xuXHRcdG9yZGVyQnkgOlxuXHRcdG9yZGVyQnlNYXBbIG9yZGVyQnkgXTtcbn07XG5cbi8qKlxuICogQnVpbGRzIHdoZXJlIGNvbmRpdGlvbnMgZm9yIGFuIHJlZ2lzdHJhdGlvbnMgZW5kcG9pbnQgcmVxdWVzdFxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBmb3JFdmVudElkICAgIFx0SUQgb2YgRXZlbnQgdG8gcmV0cmlldmUgcmVnaXN0cmF0aW9ucyBmb3JcbiAqIEBwYXJhbSB7bnVtYmVyfSBmb3JBdHRlbmRlZUlkICAgIElEIG9mIEF0dGVuZGVlIHRvIHJldHJpZXZlIHJlZ2lzdHJhdGlvbnMgZm9yXG4gKiBAcGFyYW0ge251bWJlcn0gZm9yVHJhbnNhY3Rpb25JZCBJRCBvZiBUcmFuc2FjdGlvbiB0byByZXRyaWV2ZSByZWdpc3RyYXRpb25zIGZvclxuICogQHBhcmFtIHtudW1iZXJ9IGZvclRpY2tldElkIFx0XHRJRCBvZiBUaWNrZXQgdG8gcmV0cmlldmUgcmVnaXN0cmF0aW9ucyBmb3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JTdGF0dXNJZCBcdFx0SUQgb2YgU3RhdHVzIHRvIHJldHJpZXZlIHJlZ2lzdHJhdGlvbnMgZm9yXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgICAgICAgICAgIFx0VGhlIGFzc2VtYmxlZCB3aGVyZSBjb25kaXRpb25zLlxuICovXG5leHBvcnQgY29uc3Qgd2hlcmVDb25kaXRpb25zID0gKCB7XG5cdGZvckV2ZW50SWQgPSAwLFxuXHRmb3JBdHRlbmRlZUlkID0gMCxcblx0Zm9yVHJhbnNhY3Rpb25JZCA9IDAsXG5cdGZvclRpY2tldElkID0gMCxcblx0Zm9yU3RhdHVzSWQgPSAnJyxcbn0gKSA9PiB7XG5cdGNvbnN0IHdoZXJlID0gW107XG5cdGZvckV2ZW50SWQgPSBwYXJzZUludCggZm9yRXZlbnRJZCwgMTAgKTtcblx0aWYgKCBmb3JFdmVudElkICE9PSAwICYmICEgaXNOYU4oIGZvckV2ZW50SWQgKSApIHtcblx0XHR3aGVyZS5wdXNoKCAnd2hlcmVbRVZUX0lEXT0nICsgZm9yRXZlbnRJZCApO1xuXHR9XG5cdGZvckF0dGVuZGVlSWQgPSBwYXJzZUludCggZm9yQXR0ZW5kZWVJZCwgMTAgKTtcblx0aWYgKCBmb3JBdHRlbmRlZUlkICE9PSAwICYmICEgaXNOYU4oIGZvckF0dGVuZGVlSWQgKSApIHtcblx0XHR3aGVyZS5wdXNoKCAnd2hlcmVbQVRUX0lEXT0nICsgZm9yQXR0ZW5kZWVJZCApO1xuXHR9XG5cdGZvclRyYW5zYWN0aW9uSWQgPSBwYXJzZUludCggZm9yVHJhbnNhY3Rpb25JZCwgMTAgKTtcblx0aWYgKCBmb3JUcmFuc2FjdGlvbklkICE9PSAwICYmICEgaXNOYU4oIGZvclRyYW5zYWN0aW9uSWQgKSApIHtcblx0XHR3aGVyZS5wdXNoKCAnd2hlcmVbVFhOX0lEXT0nICsgZm9yVHJhbnNhY3Rpb25JZCApO1xuXHR9XG5cdGZvclRpY2tldElkID0gcGFyc2VJbnQoIGZvclRpY2tldElkLCAxMCApO1xuXHRpZiAoIGZvclRpY2tldElkICE9PSAwICYmICEgaXNOYU4oIGZvclRpY2tldElkICkgKSB7XG5cdFx0d2hlcmUucHVzaCggJ3doZXJlW1RLVF9JRF09JyArIGZvclRpY2tldElkICk7XG5cdH1cblx0aWYgKCBmb3JTdGF0dXNJZCAhPT0gJycgJiYgZm9yU3RhdHVzSWQgIT09IG51bGwgKSB7XG5cdFx0d2hlcmUucHVzaCggJ3doZXJlW1NUU19JRF09JyArIGZvclN0YXR1c0lkICk7XG5cdH1cblx0cmV0dXJuIHdoZXJlLmpvaW4oICcmJyApO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gYSBxdWVyeSBzdHJpbmcgZm9yIHVzZSBieSBhIFJFU1QgcmVxdWVzdCBnaXZlbiBhIHNldCBvZiBxdWVyeURhdGEuXG4gKiBAcGFyYW0geyBPYmplY3QgfSBxdWVyeURhdGFcbiAqIEByZXR1cm4geyBzdHJpbmcgfSAgUmV0dXJucyB0aGUgcXVlcnkgc3RyaW5nLlxuICovXG5leHBvcnQgY29uc3QgZ2V0UXVlcnlTdHJpbmcgPSAoIHF1ZXJ5RGF0YSA9IHt9ICkgPT4ge1xuXHRxdWVyeURhdGEgPSB7IC4uLmRlZmF1bHRRdWVyeURhdGEucXVlcnlEYXRhLCAuLi5xdWVyeURhdGEgfTtcblx0cmV0dXJuIGJhc2VHZXRRdWVyeVN0cmluZyggcXVlcnlEYXRhLCB3aGVyZUNvbmRpdGlvbnMsIG1hcE9yZGVyQnkgKTtcbn07XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgdmFsdWVzIH0gZnJvbSAnbG9kYXNoJztcblxuZXhwb3J0IGNvbnN0IE1PREVMX05BTUUgPSAnc3RhdHVzJztcbi8vIHR5cGVzXG5leHBvcnQgY29uc3QgU1RBVFVTX1RZUEVfRU1BSUwgPSAnZW1haWwnO1xuZXhwb3J0IGNvbnN0IFNUQVRVU19UWVBFX0VWRU5UID0gJ2V2ZW50JztcbmV4cG9ydCBjb25zdCBTVEFUVVNfVFlQRV9NRVNTQUdFID0gJ21lc3NhZ2UnO1xuZXhwb3J0IGNvbnN0IFNUQVRVU19UWVBFX1BBWU1FTlQgPSAncGF5bWVudCc7XG5leHBvcnQgY29uc3QgU1RBVFVTX1RZUEVfUkVHSVNUUkFUSU9OID0gJ3JlZ2lzdHJhdGlvbic7XG5leHBvcnQgY29uc3QgU1RBVFVTX1RZUEVfVFJBTlNBQ1RJT04gPSAndHJhbnNhY3Rpb24nO1xuLy8gZW1haWxcbmV4cG9ydCBjb25zdCBFTUFJTF9TVEFUVVNfSUQgPSB7XG5cdERSQUZUOiAnRURSJyxcblx0U0VOVDogJ0VTTicsXG5cdEVYUElSRUQ6ICdFWFAnLFxufTtcbi8vIGV2ZW50XG5leHBvcnQgY29uc3QgRVZFTlRfU1RBVFVTX0lEID0ge1xuXHRBQ1RJVkU6ICdBQ1QnLFxuXHRSRUdJU1RSQVRJT05fQ0xPU0VEOiAnQ0xTJyxcblx0REVMRVRFRDogJ0RFTCcsXG5cdERFTklFRDogJ0RFTicsXG5cdERSQUZUOiAnRFJGJyxcblx0Tk9UX0FDVElWRTogJ05BQycsXG5cdE5PVF9PUEVOOiAnTk9QJyxcblx0T05HT0lORzogJ09ORycsXG5cdFJFR0lTVFJBVElPTl9PUEVOOiAnT1BOJyxcblx0UEVORElORzogJ1BORCcsXG5cdFNFQ09OREFSWTogJ1NFQycsXG59O1xuLy8gbWVzc2FnZVxuZXhwb3J0IGNvbnN0IE1FU1NBR0VfU1RBVFVTX0lEID0ge1xuXHRERUJVRzogJ01ETycsXG5cdEVYRUNVVElORzogJ01FWCcsXG5cdEZBSUw6ICdNRkwnLFxuXHRJTkNPTVBMRVRFOiAnTUlDJyxcblx0SURMRTogJ01JRCcsXG5cdFJFU0VORDogJ01SUycsXG5cdFJFVFJZOiAnTVJUJyxcblx0U0VOVDogJ01TTicsXG59O1xuLy8gcGF5bWVudFxuZXhwb3J0IGNvbnN0IFBBWU1FTlRfU1RBVFVTX0lEID0ge1xuXHRBUFBST1ZFRDogJ1BBUCcsXG5cdENBTkNFTExFRDogJ1BDTicsXG5cdERFQ0xJTkVEOiAnUERDJyxcblx0RkFJTEVEOiAnUEZMJyxcblx0UEVORElORzogJ1BQTicsXG59O1xuLy8gcmVnaXN0cmF0aW9uXG5leHBvcnQgY29uc3QgUkVHSVNUUkFUSU9OX1NUQVRVU19JRCA9IHtcblx0QVBQUk9WRUQ6ICdSQVAnLFxuXHRDQU5DRUxMRUQ6ICdSQ04nLFxuXHRERUNMSU5FRDogJ1JEQycsXG5cdElOQ09NUExFVEU6ICdSSUMnLFxuXHROT1RfQVBQUk9WRUQ6ICdSTkEnLFxuXHRQRU5ESU5HX1BBWU1FTlQ6ICdSUFAnLFxuXHRXQUlUX0xJU1Q6ICdSV0wnLFxufTtcbi8vIHRyYW5zYWN0aW9uXG5leHBvcnQgY29uc3QgVFJBTlNBQ1RJT05fU1RBVFVTX0lEID0ge1xuXHRBQkFORE9ORUQ6ICdUQUInLFxuXHRDT01QTEVURTogJ1RDTScsXG5cdEZBSUxFRDogJ1RGTCcsXG5cdElOQ09NUExFVEU6ICdUSU4nLFxuXHRPVkVSUEFJRDogJ1RPUCcsXG59O1xuXG4vLyB0aGUgZm9sbG93aW5nIGFyZSBub3QgaW4gdGhlIHN0YXR1cyBkYXRhYmFzZSBidXQgYXJlIGtlcHQgaGVyZSBmb3Jcbi8vIGNvbnZlbmllbmNlXG5cbi8vIGN1c3RvbSBwb3N0IHR5cGVzXG5leHBvcnQgY29uc3QgQ1BUX1NUQVRVU19JRCA9IHtcblx0UFVCTElTSDogJ3B1Ymxpc2gnLFxuXHRGVVRVUkU6ICdmdXR1cmUnLFxuXHREUkFGVDogJ2RyYWZ0Jyxcblx0UEVORElORzogJ3BlbmRpbmcnLFxuXHRQUklWQVRFOiAncHJpdmF0ZScsXG5cdFRSQVNIRUQ6ICd0cmFzaCcsXG59O1xuXG5leHBvcnQgY29uc3QgVU5LTk9XTl9TVEFUVVNfSUQgPSAndW5rbm93bic7XG5cbmV4cG9ydCBjb25zdCBBTExfU1RBVFVTX0lEUyA9IFtcblx0Li4udmFsdWVzKCBFTUFJTF9TVEFUVVNfSUQgKSxcblx0Li4udmFsdWVzKCBFVkVOVF9TVEFUVVNfSUQgKSxcblx0Li4udmFsdWVzKCBNRVNTQUdFX1NUQVRVU19JRCApLFxuXHQuLi52YWx1ZXMoIFBBWU1FTlRfU1RBVFVTX0lEICksXG5cdC4uLnZhbHVlcyggUkVHSVNUUkFUSU9OX1NUQVRVU19JRCApLFxuXHQuLi52YWx1ZXMoIFRSQU5TQUNUSU9OX1NUQVRVU19JRCApLFxuXHQuLi52YWx1ZXMoIENQVF9TVEFUVVNfSUQgKSxcblx0VU5LTk9XTl9TVEFUVVNfSUQsXG5dO1xuIiwiLyoqXG4gKiBJbnRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCAqIGFzIHN0YXR1cyBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBFVkVOVF9TVEFUVVNfSUQgfSBmcm9tICcuLi9ldmVudCc7XG5pbXBvcnQgeyBUSUNLRVRfU1RBVFVTX0lEIH0gZnJvbSAnLi4vdGlja2V0JztcbmltcG9ydCB7IERBVEVUSU1FX1NUQVRVU19JRCB9IGZyb20gJy4uL2RhdGV0aW1lJztcbmltcG9ydCB7IENIRUNLSU5fU1RBVFVTX0lEIH0gZnJvbSAnLi4vY2hlY2tpbic7XG5cbi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgeyBfXyB9IGZyb20gJ0BldmVudGVzcHJlc3NvL2kxOG4nO1xuaW1wb3J0IHsgTGFiZWwgfSBmcm9tICdAZXZlbnRlc3ByZXNzby92YWx1ZS1vYmplY3RzJztcbmltcG9ydCB7IGlzQXJyYXkgfSBmcm9tICdsb2Rhc2gnO1xuXG4vKipcbiAqIFRyYW5zbGF0aW9uIG1hcCBmb3IgUmVnaXN0cmF0aW9uIHN0YXR1c2VzXG4gKiBAdHlwZSB7e319XG4gKi9cbmNvbnN0IFNUQVRVU19UUkFOU0xBVElPTl9NQVBfUkVHSVNUUkFUSU9OID0ge1xuXHRbIHN0YXR1cy5SRUdJU1RSQVRJT05fU1RBVFVTX0lELlBFTkRJTkdfUEFZTUVOVCBdOiBuZXcgTGFiZWwoXG5cdFx0X18oICdwZW5kaW5nIHBheW1lbnQnLCAnZXZlbnRfZXNwcmVzc28nICksXG5cdFx0X18oICdwZW5kaW5nIHBheW1lbnRzJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgc3RhdHVzLlJFR0lTVFJBVElPTl9TVEFUVVNfSUQuQVBQUk9WRUQgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdhcHByb3ZlZCcsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIHN0YXR1cy5SRUdJU1RSQVRJT05fU1RBVFVTX0lELk5PVF9BUFBST1ZFRCBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ25vdCBhcHByb3ZlZCcsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIHN0YXR1cy5SRUdJU1RSQVRJT05fU1RBVFVTX0lELkNBTkNFTExFRCBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ2NhbmNlbGxlZCcsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIHN0YXR1cy5SRUdJU1RSQVRJT05fU1RBVFVTX0lELklOQ09NUExFVEUgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdpbmNvbXBsZXRlJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgc3RhdHVzLlJFR0lTVFJBVElPTl9TVEFUVVNfSUQuREVDTElORUQgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdkZWNsaW5lZCcsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIHN0YXR1cy5SRUdJU1RSQVRJT05fU1RBVFVTX0lELldBSVRfTElTVCBdOiBuZXcgTGFiZWwoXG5cdFx0X18oICd3YWl0IGxpc3QnLCAnZXZlbnRfZXNwcmVzc28nICksXG5cdFx0X18oICd3YWl0IGxpc3RzJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG59O1xuXG4vKipcbiAqIFRyYW5zbGF0aW9uIG1hcCBmb3IgVHJhbnNhY3Rpb24gc3RhdHVzZXNcbiAqIEB0eXBlIHt7fX1cbiAqXG4gKi9cbmNvbnN0IFNUQVRVU19UUkFOU0xBVElPTl9NQVBfVFJBTlNBQ1RJT04gPSB7XG5cdFsgc3RhdHVzLlRSQU5TQUNUSU9OX1NUQVRVU19JRC5PVkVSUEFJRCBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ292ZXJwYWlkJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgc3RhdHVzLlRSQU5TQUNUSU9OX1NUQVRVU19JRC5DT01QTEVURSBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ2NvbXBsZXRlJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgc3RhdHVzLlRSQU5TQUNUSU9OX1NUQVRVU19JRC5JTkNPTVBMRVRFIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAnaW5jb21wbGV0ZScsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIHN0YXR1cy5UUkFOU0FDVElPTl9TVEFUVVNfSUQuRkFJTEVEIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAnZmFpbGVkJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgc3RhdHVzLlRSQU5TQUNUSU9OX1NUQVRVU19JRC5BQkFORE9ORUQgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdhYmFuZG9uZWQnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcbn07XG5cbi8qKlxuICogVHJhbnNsYXRpb24gbWFwIGZvciBwYXltZW50IHN0YXR1c2VzXG4gKiBAdHlwZSB7e319XG4gKi9cbmNvbnN0IFNUQVRVU19UUkFOU0xBVElPTl9NQVBfUEFZTUVOVCA9IHtcblx0WyBzdGF0dXMuUEFZTUVOVF9TVEFUVVNfSUQuQVBQUk9WRUQgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdhY2NlcHRlZCcsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIHN0YXR1cy5QQVlNRU5UX1NUQVRVU19JRC5QRU5ESU5HIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAncGVuZGluZycsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIHN0YXR1cy5QQVlNRU5UX1NUQVRVU19JRC5DQU5DRUxMRUQgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdjYW5jZWxsZWQnLCAnZXZlbnRfZXNwcmVzc28nICksXG5cdCksXG5cdFsgc3RhdHVzLlBBWU1FTlRfU1RBVFVTX0lELkRFQ0xJTkVEIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAnZGVjbGluZWQnLCAnZXZlbnRfZXNwcmVzc28nICksXG5cdCksXG5cdFsgc3RhdHVzLlBBWU1FTlRfU1RBVFVTX0lELkZBSUxFRCBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ2ZhaWxlZCcsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxufTtcblxuLyoqXG4gKiBUcmFuc2xhdGlvbiBtYXAgZm9yIE1lc3NhZ2Ugc3RhdHVzZXNcbiAqIEB0eXBlIHt7fX1cbiAqL1xuY29uc3QgU1RBVFVTX1RSQU5TTEFUSU9OX01BUF9NRVNTQUdFID0ge1xuXHRbIHN0YXR1cy5NRVNTQUdFX1NUQVRVU19JRC5TRU5UIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAnc2VudCcsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIHN0YXR1cy5NRVNTQUdFX1NUQVRVU19JRC5JRExFIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAncXVldWVkIGZvciBzZW5kaW5nJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgc3RhdHVzLk1FU1NBR0VfU1RBVFVTX0lELkZBSUwgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdmYWlsZWQnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcblx0WyBzdGF0dXMuTUVTU0FHRV9TVEFUVVNfSUQuREVCVUcgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdkZWJ1ZyBvbmx5JywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgc3RhdHVzLk1FU1NBR0VfU1RBVFVTX0lELkVYRUNVVElORyBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ21lc3NlbmdlciBpcyBleGVjdXRpbmcnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcblx0WyBzdGF0dXMuTUVTU0FHRV9TVEFUVVNfSUQuUkVTRU5EIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAncXVldWVkIGZvciByZXNlbmRpbmcnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcblx0WyBzdGF0dXMuTUVTU0FHRV9TVEFUVVNfSUQuSU5DT01QTEVURSBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ3F1ZXVlZCBmb3IgZ2VuZXJhdGluZycsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIHN0YXR1cy5NRVNTQUdFX1NUQVRVU19JRC5SRVRSWSBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ2ZhaWxlZCBzZW5kaW5nLCBjYW4gYmUgcmV0cmllZCcsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxufTtcblxuLyoqXG4gKiBUcmFuc2xhdGlvbiBtYXAgZm9yIENQVCBzdGF0dXNlc1xuICogQHR5cGUge3t9fVxuICovXG5jb25zdCBTVEFUVVNfVFJBTlNMQVRJT05fTUFQX0NQVCA9IHtcblx0WyBzdGF0dXMuQ1BUX1NUQVRVU19JRC5QVUJMSVNIIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAncHVibGlzaGVkJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgc3RhdHVzLkNQVF9TVEFUVVNfSUQuRlVUVVJFIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAnc2NoZWR1bGVkJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgc3RhdHVzLkNQVF9TVEFUVVNfSUQuRFJBRlQgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdkcmFmdCcsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIHN0YXR1cy5DUFRfU1RBVFVTX0lELlBFTkRJTkcgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdwZW5kaW5nJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgc3RhdHVzLkNQVF9TVEFUVVNfSUQuUFJJVkFURSBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ3ByaXZhdGUnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcblx0WyBzdGF0dXMuQ1BUX1NUQVRVU19JRC5UUkFTSEVEIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAndHJhc2hlZCcsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxufTtcblxuLy8gdGhlIGZvbGxvd2luZyBzdGF0dXMgbWFwcyBhcmUgZm9yIG1vZGVsIHN0YXR1c2VzIHRoYXQgYXJlIG5vdCBzYXZlZCBpbiB0aGVcbi8vIHN0YXR1cyB0YWJsZSBidXQgZm9yIGNvbnZlbmllbmNlIGhhdmUgdGhlaXIgbGFiZWxzIHJldHJpZXZhYmxlIHZpYSBoZXJlLlxuXG4vKipcbiAqIFRyYW5zbGF0aW9uIG1hcCBmb3IgRXZlbnQgU3RhdHVzZXNcbiAqIEB0eXBlIHt7fX1cbiAqL1xuY29uc3QgU1RBVFVTX1RSQU5TTEFUSU9OX01BUF9FVkVOVCA9IHtcblx0WyBFVkVOVF9TVEFUVVNfSUQuU09MRF9PVVQgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdzb2xkIG91dCcsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIEVWRU5UX1NUQVRVU19JRC5QT1NUUE9ORUQgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdwb3N0cG9uZWQnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcblx0WyBFVkVOVF9TVEFUVVNfSUQuQ0FOQ0VMTEVEIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAnY2FuY2VsbGVkJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG59O1xuXG4vKipcbiAqIFRyYW5zbGF0aW9uIG1hcCBmb3IgVGlja2V0IHN0YXR1c2VzXG4gKiBAdHlwZSB7e319XG4gKi9cbmNvbnN0IFNUQVRVU19UUkFOU0xBVElPTl9NQVBfVElDS0VUID0ge1xuXHRbIFRJQ0tFVF9TVEFUVVNfSUQuQVJDSElWRUQgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdhcmNoaXZlZCcsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIFRJQ0tFVF9TVEFUVVNfSUQuRVhQSVJFRCBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ2V4cGlyZWQnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcblx0WyBUSUNLRVRfU1RBVFVTX0lELlNPTERfT1VUIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAnc29sZCBvdXQnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcblx0WyBUSUNLRVRfU1RBVFVTX0lELlBFTkRJTkcgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICd1cGNvbWluZycsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIFRJQ0tFVF9TVEFUVVNfSUQuT05TQUxFIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAnb24gc2FsZScsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxufTtcblxuLyoqXG4gKiBUcmFuc2xhdGlvbiBtYXAgZm9yIGRhdGV0aW1lIHN0YXR1c2VzXG4gKiBAdHlwZSB7e319XG4gKi9cbmNvbnN0IFNUQVRVU19UUkFOU0xBVElPTl9NQVBfREFURVRJTUUgPSB7XG5cdFsgREFURVRJTUVfU1RBVFVTX0lELkNBTkNFTExFRCBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ2NhbmNlbGxlZCcsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIERBVEVUSU1FX1NUQVRVU19JRC5TT0xEX09VVCBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ3NvbGQgb3V0JywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgREFURVRJTUVfU1RBVFVTX0lELkVYUElSRUQgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdleHBpcmVkJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgREFURVRJTUVfU1RBVFVTX0lELklOQUNUSVZFIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAnaW5hY3RpdmUnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcblx0WyBEQVRFVElNRV9TVEFUVVNfSUQuVVBDT01JTkcgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICd1cGNvbWluZycsICdldmVudF9lc3ByZXNzbycgKVxuXHQpLFxuXHRbIERBVEVUSU1FX1NUQVRVU19JRC5BQ1RJVkUgXTogTGFiZWwuZnJvbVNhbWVTaW5nbGVBbmRQbHVyYWwoXG5cdFx0X18oICdhY3RpdmUnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcblx0WyBEQVRFVElNRV9TVEFUVVNfSUQuUE9TVFBPTkVEIF06IExhYmVsLmZyb21TYW1lU2luZ2xlQW5kUGx1cmFsKFxuXHRcdF9fKCAncG9zdHBvbmVkJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG59O1xuXG4vKipcbiAqIFRyYW5zbGF0aW9uIG1hcCBmb3IgY2hlY2tpbiBzdGF0dXNlc1xuICpcbiAqIEB0eXBlIHt7fX1cbiAqL1xuY29uc3QgU1RBVFVTX1RSQU5TTEFUSU9OX01BUF9DSEVDS0lOID0ge1xuXHRbIENIRUNLSU5fU1RBVFVTX0lELlNUQVRVU19DSEVDS0VEX0lOIF06IG5ldyBMYWJlbChcblx0XHRfXyggJ2NoZWNrLWluJywgJ2V2ZW50X2VzcHJlc3NvJyApLFxuXHRcdF9fKCAnY2hlY2staW5zJywgJ2V2ZW50X2VzcHJlc3NvJyApXG5cdCksXG5cdFsgQ0hFQ0tJTl9TVEFUVVNfSUQuU1RBVFVTX0NIRUNLRURfT1VUIF06IG5ldyBMYWJlbChcblx0XHRfXyggJ2NoZWNrLW91dCcsICdldmVudF9lc3ByZXNzbycgKSxcblx0XHRfXyggJ2NoZWNrLW91dHMnLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcblx0WyBDSEVDS0lOX1NUQVRVU19JRC5TVEFUVVNfQ0hFQ0tFRF9ORVZFUiBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ25ldmVyIGNoZWNrZWQgaW4nLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcbn07XG5cbi8qKlxuICogQ29tYmluZWQgdHJhbnNsYXRpb24gbWFwIGZvciBhbGwgc3RhdHVzZXMuXG4gKiBAdHlwZSB7e319XG4gKi9cbmNvbnN0IFNUQVRVU19UUkFOU0xBVElPTl9NQVBfQUxMID0ge1xuXHQuLi5TVEFUVVNfVFJBTlNMQVRJT05fTUFQX1JFR0lTVFJBVElPTixcblx0Li4uU1RBVFVTX1RSQU5TTEFUSU9OX01BUF9UUkFOU0FDVElPTixcblx0Li4uU1RBVFVTX1RSQU5TTEFUSU9OX01BUF9QQVlNRU5ULFxuXHQuLi5TVEFUVVNfVFJBTlNMQVRJT05fTUFQX01FU1NBR0UsXG5cdC4uLlNUQVRVU19UUkFOU0xBVElPTl9NQVBfQ1BULFxuXHQuLi5TVEFUVVNfVFJBTlNMQVRJT05fTUFQX0VWRU5ULFxuXHQuLi5TVEFUVVNfVFJBTlNMQVRJT05fTUFQX1RJQ0tFVCxcblx0Li4uU1RBVFVTX1RSQU5TTEFUSU9OX01BUF9EQVRFVElNRSxcblx0Li4uU1RBVFVTX1RSQU5TTEFUSU9OX01BUF9DSEVDS0lOLFxuXHRbIHN0YXR1cy5VTktOT1dOX1NUQVRVU19JRCBdOiBMYWJlbC5mcm9tU2FtZVNpbmdsZUFuZFBsdXJhbChcblx0XHRfXyggJ3Vua25vd24nLCAnZXZlbnRfZXNwcmVzc28nIClcblx0KSxcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcHJldHR5IHN0YXR1cyBsYWJlbCBzdHJpbmcgZm9yIHRoZSBnaXZlbiBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0YXR1c0NvZGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2luZ3VsYXIgIFdoZXRoZXIgdG8gcmV0dXJuIHRoZSBzaW5ndWxhciBvciBwbHVyYWwgbGFiZWxcbiAqIHZhbHVlXG4gKiBAcGFyYW0geyhzZW50ZW5jZXxsb3dlcnx1cHBlcil9IHNjaGVtYVxuICogQHJldHVybiB7c3RyaW5nfSBSZXR1cm5zIHRoZSBtYXBwZWQgcHJldHR5IGxhYmVsIGZvciB0aGUgZ2l2ZW4gc3RhdHVzIGNvZGUgb3JcbiAqIGEgZm9ybWF0dGVkICd1bmtvd24nIHN0cmluZyBpZiB0aGVyZSBpcyBubyBtYXBwZWQgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2RlLlxuICovXG5leHBvcnQgY29uc3QgcHJldHR5U3RhdHVzID0gKFxuXHRzdGF0dXNDb2RlLFxuXHRzaW5ndWxhciA9IHRydWUsXG5cdHNjaGVtYSA9IExhYmVsLkZPUk1BVF9TRU5URU5DRV9DQVNFXG4pID0+IHtcblx0cmV0dXJuIFNUQVRVU19UUkFOU0xBVElPTl9NQVBfQUxMWyBzdGF0dXNDb2RlIF0gP1xuXHRcdFNUQVRVU19UUkFOU0xBVElPTl9NQVBfQUxMWyBzdGF0dXNDb2RlIF0uYXNGb3JtYXR0ZWQoIHNpbmd1bGFyLCBzY2hlbWEgKSA6XG5cdFx0U1RBVFVTX1RSQU5TTEFUSU9OX01BUF9BTExbIHN0YXR1cy5VTktOT1dOX1NUQVRVU19JRCBdLmFzRm9ybWF0dGVkKFxuXHRcdFx0c2luZ3VsYXIsXG5cdFx0XHRzY2hlbWFcblx0XHQpO1xufTtcblxuLyoqXG4gKiBFeHBlY3RzIGFuIGFycmF5IG9mIHN0YXR1cyBjb2RlcyBhbmQgcmV0dXJucyBhbiBvYmplY3QgaW5kZXhlZCBieSBjb2RlcyB3aXRoXG4gKiB2YWx1ZXMgYmVpbmcgdGhlIGZvcm1hdHRlZCBwcmV0dHkgbGFiZWxzIGZvciBlYWNoIGNvZGUgYWNjb3JkaW5nIHRvIHRoZVxuICogcHJvdmlkZWQgYXJndW1lbnRzXG4gKlxuICogQHBhcmFtIHtBcnJheX0gc3RhdHVzQ29kZXNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2luZ3VsYXJcbiAqIEBwYXJhbSB7KHNlbnRlbmNlfGxvd2VyfHVwcGVyKX0gc2NoZW1hXG4gKiBAcmV0dXJuIHtPYmplY3R9IEFuIG9iamVjdCBtYXBwaW5nIHN0YXR1cyBjb2RlIHRvIHByZXR0eSBsYWJlbC5cbiAqL1xuZXhwb3J0IGNvbnN0IHByZXR0eVN0YXR1c2VzID0gKFxuXHRzdGF0dXNDb2Rlcyxcblx0c2luZ3VsYXIgPSB0cnVlLFxuXHRzY2hlbWEgPSBMYWJlbC5GT1JNQVRfU0VOVEVOQ0VfQ0FTRVxuKSA9PiB7XG5cdGlmICggISBpc0FycmF5KCBzdGF0dXNDb2RlcyApICkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoICdFeHBlY3QgaW5jb21pbmcgc3RhdHVzQ29kZXMgYXJndW1lbnQnICtcblx0XHRcdCcgdG8gYmUgYW4gYXJyYXknICk7XG5cdH1cblx0Y29uc3QgbWFwcGVkU3RhdHVzZXMgPSB7fTtcblx0c3RhdHVzQ29kZXMuZm9yRWFjaCggKCBzdGF0dXNDb2RlICkgPT4ge1xuXHRcdG1hcHBlZFN0YXR1c2VzWyBzdGF0dXNDb2RlIF0gPSBwcmV0dHlTdGF0dXMoXG5cdFx0XHRzdGF0dXNDb2RlLFxuXHRcdFx0c2luZ3VsYXIsXG5cdFx0XHRzY2hlbWFcblx0XHQpO1xuXHR9ICk7XG5cdHJldHVybiBtYXBwZWRTdGF0dXNlcztcbn07XG4iLCJleHBvcnQgKiBmcm9tICcuL2NvbnN0YW50cyc7XG5leHBvcnQgKiBmcm9tICcuL3F1ZXJ5JztcbmV4cG9ydCAqIGZyb20gJy4vaGVscGVycyc7XG4iLCIvKipcbiAqIEV4dGVybmFsIGltcG9ydHNcbiAqL1xuaW1wb3J0IHsgaXNVbmRlZmluZWQgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcblxuLyoqXG4gKiBJbnRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqL1xuaW1wb3J0IHtcblx0Z2V0UXVlcnlTdHJpbmcgYXMgYmFzZUdldFF1ZXJ5U3RyaW5nLFxuXHRRVUVSWV9PUkRFUl9BU0MsXG5cdEFMTE9XRURfT1JERVJfVkFMVUVTLFxufSBmcm9tICcuLi9iYXNlJztcblxuLyoqXG4gKiBEZXNjcmliZWQgYXR0cmlidXRlcyBmb3IgdGhpcyBtb2RlbFxuICogQHR5cGUge3thdHRyaWJ1dGVzOiAqfX1cbiAqL1xuZXhwb3J0IGNvbnN0IHF1ZXJ5RGF0YVR5cGVzID0ge1xuXHRxdWVyeURhdGE6IFByb3BUeXBlcy5zaGFwZSgge1xuXHRcdGxpbWl0OiBQcm9wVHlwZXMubnVtYmVyLFxuXHRcdG9yZGVyQnk6IFByb3BUeXBlcy5zdHJpbmcsXG5cdFx0b3JkZXI6IFByb3BUeXBlcy5vbmVPZiggQUxMT1dFRF9PUkRFUl9WQUxVRVMgKSxcblx0fSApLFxufTtcblxuLyoqXG4gKiBEZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoaXMgbW9kZWxcbiAqIEB0eXBlIHtcbiAqIFx0e1xuICogXHRcdGF0dHJpYnV0ZXM6IHtcbiAqIFx0XHRcdGxpbWl0OiBudW1iZXIsXG4gKiBcdFx0XHRvcmRlckJ5OiBzdHJpbmcsXG4gKiBcdFx0XHRvcmRlcjogc3RyaW5nLFxuICogICBcdH1cbiAqICAgfVxuICogfVxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdFF1ZXJ5RGF0YSA9IHtcblx0cXVlcnlEYXRhOiB7XG5cdFx0bGltaXQ6IDI1LFxuXHRcdG9yZGVyQnk6ICdzdGF0dXNDb2RlJyxcblx0XHRvcmRlcjogUVVFUllfT1JERVJfQVNDLFxuXHR9LFxufTtcblxuLyoqXG4gKiBVc2VkIHRvIG1hcCBhbiBvcmRlckJ5IHN0cmluZyB0byB0aGUgYWN0dWFsIHZhbHVlIHVzZWQgaW4gYSBSRVNUIHF1ZXJ5IGZyb21cbiAqIHRoZSBjb250ZXh0IG9mIGFuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcmRlckJ5XG4gKlxuICogQHJldHVybiB7IHN0cmluZyB9IFJldHVybnMgYW4gYWN0dWFsIG9yZGVyQnkgc3RyaW5nIGZvciB0aGUgUkVTVCBxdWVyeSBmb3JcbiAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm92aWRlZCBhbGlhc1xuICovXG5leHBvcnQgY29uc3QgbWFwT3JkZXJCeSA9ICggb3JkZXJCeSApID0+IHtcblx0Y29uc3Qgb3JkZXJCeU1hcCA9IHtcblx0XHRzdGF0dXNDb2RlOiAnU1RTX2NvZGUnLFxuXHR9O1xuXHRyZXR1cm4gaXNVbmRlZmluZWQoIG9yZGVyQnlNYXBbIG9yZGVyQnkgXSApID9cblx0XHRvcmRlckJ5IDpcblx0XHRvcmRlckJ5TWFwWyBvcmRlckJ5IF07XG59O1xuXG4vKipcbiAqIEJ1aWxkcyB3aGVyZSBjb25kaXRpb25zIGZvciBhbiBldmVudHMgZW5kcG9pbnQgcmVxdWVzdCB1c2luZyBwcm92aWRlZFxuICogaW5mb3JtYXRpb24uXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXR1c1R5cGUgXHRJRCBmb3IgdHlwZSBvZiBTdGF0dXMgdG8gcmV0cmlldmVcbiAqIEByZXR1cm4ge3N0cmluZ30gICAgICAgICAgICAgVGhlIGFzc2VtYmxlZCB3aGVyZSBjb25kaXRpb25zLlxuICovXG5leHBvcnQgY29uc3Qgd2hlcmVDb25kaXRpb25zID0gKCB7IHN0YXR1c1R5cGUgfSApID0+IHtcblx0Y29uc3Qgd2hlcmUgPSBbXTtcblx0aWYgKCBzdGF0dXNUeXBlICkge1xuXHRcdHdoZXJlLnB1c2goICd3aGVyZVtTVFNfdHlwZV09JyArIHN0YXR1c1R5cGUgKTtcblx0fVxuXHRyZXR1cm4gd2hlcmUuam9pbiggJyYnICk7XG59O1xuXG4vKipcbiAqIFJldHVybiBhIHF1ZXJ5IHN0cmluZyBmb3IgdXNlIGJ5IGEgUkVTVCByZXF1ZXN0IGdpdmVuIGEgc2V0IG9mIHF1ZXJ5RGF0YS5cbiAqIEBwYXJhbSB7IE9iamVjdCB9IHF1ZXJ5RGF0YVxuICogQHJldHVybiB7IHN0cmluZyB9ICBSZXR1cm5zIHRoZSBxdWVyeSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRRdWVyeVN0cmluZyA9ICggcXVlcnlEYXRhID0ge30gKSA9PiB7XG5cdHF1ZXJ5RGF0YSA9IHsgLi4uZGVmYXVsdFF1ZXJ5RGF0YS5xdWVyeURhdGEsIC4uLnF1ZXJ5RGF0YSB9O1xuXHRyZXR1cm4gYmFzZUdldFF1ZXJ5U3RyaW5nKCBxdWVyeURhdGEsIHdoZXJlQ29uZGl0aW9ucywgbWFwT3JkZXJCeSApO1xufTtcblxuIiwiLyoqXG4gKiBFeHRlcm5hbCBpbXBvcnRzXG4gKi9cbmltcG9ydCB7IHZhbHVlcyB9IGZyb20gJ2xvZGFzaCc7XG5cbmV4cG9ydCBjb25zdCBNT0RFTF9OQU1FID0gJ3RpY2tldCc7XG5cbmV4cG9ydCBjb25zdCBUSUNLRVRfU1RBVFVTX0lEID0ge1xuXHRTT0xEX09VVDogJ1RLUycsXG5cdEVYUElSRUQ6ICdUS0UnLFxuXHRBUkNISVZFRDogJ1RLQScsXG5cdFBFTkRJTkc6ICdUS1AnLFxuXHRPTlNBTEU6ICdUS08nLFxufTtcblxuZXhwb3J0IGNvbnN0IFRJQ0tFVF9TVEFUVVNfSURTID0gdmFsdWVzKCBUSUNLRVRfU1RBVFVTX0lEICk7XG4iLCJleHBvcnQgKiBmcm9tICcuL2NvbnN0YW50cyc7XG5leHBvcnQgKiBmcm9tICcuL3F1ZXJ5JztcbiIsIi8qKlxuICogRXh0ZXJuYWwgaW1wb3J0c1xuICovXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudC10aW1lem9uZSc7XG5pbXBvcnQgeyBpc1VuZGVmaW5lZCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5pbXBvcnQge1xuXHRnZXRRdWVyeVN0cmluZyBhcyBiYXNlR2V0UXVlcnlTdHJpbmcsXG5cdFFVRVJZX09SREVSX0RFU0MsXG5cdEFMTE9XRURfT1JERVJfVkFMVUVTLFxuXHRHUkVBVEVSX1RIQU4sXG5cdEdSRUFURVJfVEhBTl9BTkRfRVFVQUwsXG5cdExFU1NfVEhBTl9BTkRfRVFVQUwsXG59IGZyb20gJy4uL2Jhc2UnO1xuXG5leHBvcnQgY29uc3Qgbm93RGF0ZUFuZFRpbWUgPSBtb21lbnQoKTtcblxuLyoqXG4gKiBEZXNjcmliZWQgYXR0cmlidXRlcyBmb3IgdGhpcyBtb2RlbFxuICogQHR5cGUge3thdHRyaWJ1dGVzOiAqfX1cbiAqL1xuZXhwb3J0IGNvbnN0IHF1ZXJ5RGF0YVR5cGVzID0ge1xuXHRxdWVyeURhdGE6IFByb3BUeXBlcy5zaGFwZSgge1xuXHRcdGxpbWl0OiBQcm9wVHlwZXMubnVtYmVyLFxuXHRcdG9yZGVyQnk6IFByb3BUeXBlcy5vbmVPZiggW1xuXHRcdFx0J1RLVF9uYW1lJyxcblx0XHRcdCdUS1RfSUQnLFxuXHRcdFx0J3N0YXJ0X2RhdGUnLFxuXHRcdFx0J2VuZF9kYXRlJyxcblx0XHRdICksXG5cdFx0b3JkZXI6IFByb3BUeXBlcy5vbmVPZiggQUxMT1dFRF9PUkRFUl9WQUxVRVMgKSxcblx0XHRzaG93RXhwaXJlZDogUHJvcFR5cGVzLmJvb2wsXG5cdFx0bW9udGg6IFByb3BUeXBlcy5tb250aCxcblx0fSApLFxufTtcblxuLyoqXG4gKiBEZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoaXMgbW9kZWxcbiAqIEB0eXBlIHtcbiAqIFx0e1xuICogXHRcdGF0dHJpYnV0ZXM6IHtcbiAqIFx0XHRcdGxpbWl0OiBudW1iZXIsXG4gKiBcdFx0XHRvcmRlckJ5OiBzdHJpbmcsXG4gKiBcdFx0XHRvcmRlcjogc3RyaW5nLFxuICogICBcdFx0c2hvd0V4cGlyZWQ6IGJvb2xlYW5cbiAqICAgXHR9XG4gKiAgIH1cbiAqIH1cbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRRdWVyeURhdGEgPSB7XG5cdHF1ZXJ5RGF0YToge1xuXHRcdGxpbWl0OiAxMDAsXG5cdFx0b3JkZXJCeTogJ3N0YXJ0X2RhdGUnLFxuXHRcdG9yZGVyOiBRVUVSWV9PUkRFUl9ERVNDLFxuXHRcdHNob3dFeHBpcmVkOiBmYWxzZSxcblx0fSxcbn07XG5cbi8qKlxuICogVXNlZCB0byBtYXAgYW4gb3JkZXJCeSBzdHJpbmcgdG8gdGhlIGFjdHVhbCB2YWx1ZSB1c2VkIGluIGEgUkVTVCBxdWVyeSBmcm9tXG4gKiB0aGUgY29udGV4dCBvZiBhIHRpY2tldC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gb3JkZXJCeVxuICpcbiAqIEByZXR1cm4geyBzdHJpbmcgfSBSZXR1cm5zIGFuIGFjdHVhbCBvcmRlckJ5IHN0cmluZyBmb3IgdGhlIFJFU1QgcXVlcnkgZm9yXG4gKiAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJvdmlkZWQgYWxpYXNcbiAqL1xuZXhwb3J0IGNvbnN0IG1hcE9yZGVyQnkgPSAoIG9yZGVyQnkgKSA9PiB7XG5cdGNvbnN0IG9yZGVyQnlNYXAgPSB7XG5cdFx0c3RhcnRfZGF0ZTogJ1RLVF9zdGFydF9kYXRlJyxcblx0XHRlbmRfZGF0ZTogJ1RLVF9lbmRfZGF0ZScsXG5cdH07XG5cdHJldHVybiBpc1VuZGVmaW5lZCggb3JkZXJCeU1hcFsgb3JkZXJCeSBdICkgP1xuXHRcdG9yZGVyQnkgOlxuXHRcdG9yZGVyQnlNYXBbIG9yZGVyQnkgXTtcbn07XG5cbi8qKlxuICogQnVpbGRzIHdoZXJlIGNvbmRpdGlvbnMgZm9yIGFuIHRpY2tldHMgZW5kcG9pbnQgcmVxdWVzdCB1c2luZyBwcm92aWRlZFxuICogaW5mb3JtYXRpb24uXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBzaG93RXhwaXJlZCBcdFdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgZXhwaXJlZCB0aWNrZXRzLlxuICogQHBhcmFtIHtzdHJpbmd9IG1vbnRoICAgICAgICAgICAgUmV0dXJuIHRpY2tldHMgZm9yIHRoZSBnaXZlbiBtb250aC4gQ2FuIGJlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRpbiBhbnkgbW9udGggZm9ybWF0IHJlY29nbml6ZWQgYnkgbW9tZW50XG4gKiBAcGFyYW0ge251bWJlcn0gZm9yRXZlbnRJZCAgICBcdElEIG9mIEV2ZW50IHRvIHJldHJpZXZlIHRpY2tldHMgZm9yXG4gKiBAcGFyYW0ge251bWJlcn0gZm9yRGF0ZXRpbWVJZCAgICBJRCBvZiBEYXRldGltZSB0byByZXRyaWV2ZSB0aWNrZXRzIGZvclxuICogQHJldHVybiB7c3RyaW5nfSAgICAgICAgICAgICAgICBcdFRoZSBhc3NlbWJsZWQgd2hlcmUgY29uZGl0aW9ucy5cbiAqL1xuZXhwb3J0IGNvbnN0IHdoZXJlQ29uZGl0aW9ucyA9ICgge1xuXHRmb3JFdmVudElkID0gMCxcblx0Zm9yRGF0ZXRpbWVJZCA9IDAsXG5cdHNob3dFeHBpcmVkID0gZmFsc2UsXG5cdG1vbnRoID0gJ25vbmUnLFxufSApID0+IHtcblx0Y29uc3Qgd2hlcmUgPSBbXTtcblx0aWYgKCAhIHNob3dFeHBpcmVkICkge1xuXHRcdHdoZXJlLnB1c2goXG5cdFx0XHQnd2hlcmVbVEtUX2VuZF9kYXRlKipleHBpcmVkXVtdPScgKyBHUkVBVEVSX1RIQU4gK1xuXHRcdFx0JyZ3aGVyZVtUS1RfZW5kX2RhdGUqKmV4cGlyZWRdW109JyArXG5cdFx0XHRub3dEYXRlQW5kVGltZS5sb2NhbCgpLmZvcm1hdCgpXG5cdFx0KTtcblx0fVxuXHRpZiAoIG1vbnRoICYmIG1vbnRoICE9PSAnbm9uZScgKSB7XG5cdFx0d2hlcmUucHVzaChcblx0XHRcdCd3aGVyZVtUS1Rfc3RhcnRfZGF0ZV1bXT0nICsgR1JFQVRFUl9USEFOX0FORF9FUVVBTCArXG5cdFx0XHQnJndoZXJlW1RLVF9zdGFydF9kYXRlXVtdPScgK1xuXHRcdFx0bW9tZW50KCkubW9udGgoIG1vbnRoICkuc3RhcnRPZiggJ21vbnRoJyApLmxvY2FsKCkuZm9ybWF0KClcblx0XHQpO1xuXHRcdHdoZXJlLnB1c2goXG5cdFx0XHQnd2hlcmVbVEtUX2VuZF9kYXRlXVtdPScgKyBMRVNTX1RIQU5fQU5EX0VRVUFMICtcblx0XHRcdCcmd2hlcmVbVEtUX2VuZF9kYXRlXVtdPScgK1xuXHRcdFx0bW9tZW50KCkubW9udGgoIG1vbnRoICkuZW5kT2YoICdtb250aCcgKS5sb2NhbCgpLmZvcm1hdCgpXG5cdFx0KTtcblx0fVxuXHRmb3JFdmVudElkID0gcGFyc2VJbnQoIGZvckV2ZW50SWQsIDEwICk7XG5cdGlmICggZm9yRXZlbnRJZCAhPT0gMCAmJiAhIGlzTmFOKCBmb3JFdmVudElkICkgKSB7XG5cdFx0d2hlcmUucHVzaCggJ3doZXJlW0RhdGV0aW1lLkV2ZW50LkVWVF9JRF09JyArIGZvckV2ZW50SWQgKTtcblx0fVxuXHRmb3JEYXRldGltZUlkID0gcGFyc2VJbnQoIGZvckRhdGV0aW1lSWQsIDEwICk7XG5cdGlmICggZm9yRGF0ZXRpbWVJZCAhPT0gMCAmJiAhIGlzTmFOKCBmb3JEYXRldGltZUlkICkgKSB7XG5cdFx0d2hlcmUucHVzaCggJ3doZXJlW0RhdGV0aW1lLkRUVF9JRF09JyArIGZvckRhdGV0aW1lSWQgKTtcblx0fVxuXHRyZXR1cm4gd2hlcmUuam9pbiggJyYnICk7XG59O1xuXG4vKipcbiAqIFJldHVybiBhIHF1ZXJ5IHN0cmluZyBmb3IgdXNlIGJ5IGEgUkVTVCByZXF1ZXN0IGdpdmVuIGEgc2V0IG9mIHF1ZXJ5RGF0YS5cbiAqIEBwYXJhbSB7IE9iamVjdCB9IHF1ZXJ5RGF0YVxuICogQHJldHVybiB7IHN0cmluZyB9ICBSZXR1cm5zIHRoZSBxdWVyeSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRRdWVyeVN0cmluZyA9ICggcXVlcnlEYXRhID0ge30gKSA9PiB7XG5cdHF1ZXJ5RGF0YSA9IHsgLi4uZGVmYXVsdFF1ZXJ5RGF0YS5xdWVyeURhdGEsIC4uLnF1ZXJ5RGF0YSB9O1xuXHRyZXR1cm4gYmFzZUdldFF1ZXJ5U3RyaW5nKCBxdWVyeURhdGEsIHdoZXJlQ29uZGl0aW9ucywgbWFwT3JkZXJCeSApO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9hcnJheS9mcm9tXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9hcnJheS9pcy1hcnJheVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vZ2V0LWl0ZXJhdG9yXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9pcy1pdGVyYWJsZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vanNvbi9zdHJpbmdpZnlcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL21hcFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2NyZWF0ZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvclwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2dldC1vd24tcHJvcGVydHktc3ltYm9sc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2dldC1wcm90b3R5cGUtb2ZcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9rZXlzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3Qvc2V0LXByb3RvdHlwZS1vZlwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vcGFyc2UtaW50XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9wcm9taXNlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9zZXRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vc3ltYm9sL2l0ZXJhdG9yXCIpOyIsInZhciBfQXJyYXkkaXNBcnJheSA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL2FycmF5L2lzLWFycmF5XCIpO1xuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7XG4gIGlmIChfQXJyYXkkaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hcnJheVdpdGhIb2xlczsiLCJ2YXIgX0FycmF5JGlzQXJyYXkgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9hcnJheS9pcy1hcnJheVwiKTtcblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikge1xuICBpZiAoX0FycmF5JGlzQXJyYXkoYXJyKSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcnIyW2ldID0gYXJyW2ldO1xuICAgIH1cblxuICAgIHJldHVybiBhcnIyO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5V2l0aG91dEhvbGVzOyIsImZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikge1xuICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGY7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2Fzc2VydFRoaXNJbml0aWFsaXplZDsiLCJ2YXIgX1Byb21pc2UgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9wcm9taXNlXCIpO1xuXG5mdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7XG4gIHRyeSB7XG4gICAgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpO1xuICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVqZWN0KGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaW5mby5kb25lKSB7XG4gICAgcmVzb2x2ZSh2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgX1Byb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gbmV3IF9Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcblxuICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7XG4gICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJ0aHJvd1wiLCBlcnIpO1xuICAgICAgfVxuXG4gICAgICBfbmV4dCh1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hc3luY1RvR2VuZXJhdG9yOyIsImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2NsYXNzQ2FsbENoZWNrOyIsInZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIi4uL2NvcmUtanMvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG5cbiAgICBfT2JqZWN0JGRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9jcmVhdGVDbGFzczsiLCJ2YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBfT2JqZWN0JGRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfZGVmaW5lUHJvcGVydHk7IiwidmFyIF9PYmplY3QkZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZlwiKTtcblxudmFyIF9PYmplY3Qkc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9vYmplY3Qvc2V0LXByb3RvdHlwZS1vZlwiKTtcblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfZ2V0UHJvdG90eXBlT2YgPSBfT2JqZWN0JHNldFByb3RvdHlwZU9mID8gX09iamVjdCRnZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IF9PYmplY3QkZ2V0UHJvdG90eXBlT2Yobyk7XG4gIH07XG4gIHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2dldFByb3RvdHlwZU9mOyIsInZhciBfT2JqZWN0JGNyZWF0ZSA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9jcmVhdGVcIik7XG5cbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuL3NldFByb3RvdHlwZU9mXCIpO1xuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IF9PYmplY3QkY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IHN1YkNsYXNzLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuICBpZiAoc3VwZXJDbGFzcykgc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pbmhlcml0czsiLCJ2YXIgX0FycmF5JGZyb20gPSByZXF1aXJlKFwiLi4vY29yZS1qcy9hcnJheS9mcm9tXCIpO1xuXG52YXIgX2lzSXRlcmFibGUgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9pcy1pdGVyYWJsZVwiKTtcblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7XG4gIGlmIChfaXNJdGVyYWJsZShPYmplY3QoaXRlcikpIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVyKSA9PT0gXCJbb2JqZWN0IEFyZ3VtZW50c11cIikgcmV0dXJuIF9BcnJheSRmcm9tKGl0ZXIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pdGVyYWJsZVRvQXJyYXk7IiwidmFyIF9nZXRJdGVyYXRvciA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL2dldC1pdGVyYXRvclwiKTtcblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkge1xuICB2YXIgX2FyciA9IFtdO1xuICB2YXIgX24gPSB0cnVlO1xuICB2YXIgX2QgPSBmYWxzZTtcbiAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2kgPSBfZ2V0SXRlcmF0b3IoYXJyKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgIF9hcnIucHVzaChfcy52YWx1ZSk7XG5cbiAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kID0gdHJ1ZTtcbiAgICBfZSA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2QpIHRocm93IF9lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBfYXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pdGVyYWJsZVRvQXJyYXlMaW1pdDsiLCJmdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfbm9uSXRlcmFibGVSZXN0OyIsImZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9ub25JdGVyYWJsZVNwcmVhZDsiLCJ2YXIgX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yXCIpO1xuXG52YXIgX09iamVjdCRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzXCIpO1xuXG52YXIgX09iamVjdCRrZXlzID0gcmVxdWlyZShcIi4uL2NvcmUtanMvb2JqZWN0L2tleXNcIik7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCIuL2RlZmluZVByb3BlcnR5XCIpO1xuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgdmFyIG93bktleXMgPSBfT2JqZWN0JGtleXMoc291cmNlKTtcblxuICAgIGlmICh0eXBlb2YgX09iamVjdCRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG93bktleXMgPSBvd25LZXlzLmNvbmNhdChfT2JqZWN0JGdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICAgIHJldHVybiBfT2JqZWN0JGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTtcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX29iamVjdFNwcmVhZDsiLCJ2YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCIuLi9oZWxwZXJzL3R5cGVvZlwiKTtcblxudmFyIGFzc2VydFRoaXNJbml0aWFsaXplZCA9IHJlcXVpcmUoXCIuL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiKTtcblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkge1xuICBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgIHJldHVybiBjYWxsO1xuICB9XG5cbiAgcmV0dXJuIGFzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjsiLCJ2YXIgX09iamVjdCRzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9zZXQtcHJvdG90eXBlLW9mXCIpO1xuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IF9zZXRQcm90b3R5cGVPZiA9IF9PYmplY3Qkc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgcmV0dXJuIG87XG4gIH07XG5cbiAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfc2V0UHJvdG90eXBlT2Y7IiwidmFyIGFycmF5V2l0aEhvbGVzID0gcmVxdWlyZShcIi4vYXJyYXlXaXRoSG9sZXNcIik7XG5cbnZhciBpdGVyYWJsZVRvQXJyYXlMaW1pdCA9IHJlcXVpcmUoXCIuL2l0ZXJhYmxlVG9BcnJheUxpbWl0XCIpO1xuXG52YXIgbm9uSXRlcmFibGVSZXN0ID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVSZXN0XCIpO1xuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIGFycmF5V2l0aEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBub25JdGVyYWJsZVJlc3QoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfc2xpY2VkVG9BcnJheTsiLCJ2YXIgYXJyYXlXaXRob3V0SG9sZXMgPSByZXF1aXJlKFwiLi9hcnJheVdpdGhvdXRIb2xlc1wiKTtcblxudmFyIGl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2l0ZXJhYmxlVG9BcnJheVwiKTtcblxudmFyIG5vbkl0ZXJhYmxlU3ByZWFkID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVTcHJlYWRcIik7XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgcmV0dXJuIGFycmF5V2l0aG91dEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5KGFycikgfHwgbm9uSXRlcmFibGVTcHJlYWQoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfdG9Db25zdW1hYmxlQXJyYXk7IiwidmFyIF9TeW1ib2wkaXRlcmF0b3IgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9zeW1ib2wvaXRlcmF0b3JcIik7XG5cbnZhciBfU3ltYm9sID0gcmVxdWlyZShcIi4uL2NvcmUtanMvc3ltYm9sXCIpO1xuXG5mdW5jdGlvbiBfdHlwZW9mMihvYmopIHsgaWYgKHR5cGVvZiBfU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIF9TeW1ib2wkaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZjIgPSBmdW5jdGlvbiBfdHlwZW9mMihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YyID0gZnVuY3Rpb24gX3R5cGVvZjIob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIF9TeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IF9TeW1ib2wgJiYgb2JqICE9PSBfU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mMihvYmopOyB9XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIGlmICh0eXBlb2YgX1N5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIF90eXBlb2YyKF9TeW1ib2wkaXRlcmF0b3IpID09PSBcInN5bWJvbFwiKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICAgIHJldHVybiBfdHlwZW9mMihvYmopO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIF9TeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IF9TeW1ib2wgJiYgb2JqICE9PSBfU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiBfdHlwZW9mMihvYmopO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX3R5cGVvZihvYmopO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF90eXBlb2Y7IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4vLyBUaGlzIG1ldGhvZCBvZiBvYnRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QgbmVlZHMgdG8gYmVcbi8vIGtlcHQgaWRlbnRpY2FsIHRvIHRoZSB3YXkgaXQgaXMgb2J0YWluZWQgaW4gcnVudGltZS5qc1xudmFyIGcgPSAoZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzIHx8ICh0eXBlb2Ygc2VsZiA9PT0gXCJvYmplY3RcIiAmJiBzZWxmKTtcbn0pKCkgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xuXG4vLyBVc2UgYGdldE93blByb3BlcnR5TmFtZXNgIGJlY2F1c2Ugbm90IGFsbCBicm93c2VycyBzdXBwb3J0IGNhbGxpbmdcbi8vIGBoYXNPd25Qcm9wZXJ0eWAgb24gdGhlIGdsb2JhbCBgc2VsZmAgb2JqZWN0IGluIGEgd29ya2VyLiBTZWUgIzE4My5cbnZhciBoYWRSdW50aW1lID0gZy5yZWdlbmVyYXRvclJ1bnRpbWUgJiZcbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZykuaW5kZXhPZihcInJlZ2VuZXJhdG9yUnVudGltZVwiKSA+PSAwO1xuXG4vLyBTYXZlIHRoZSBvbGQgcmVnZW5lcmF0b3JSdW50aW1lIGluIGNhc2UgaXQgbmVlZHMgdG8gYmUgcmVzdG9yZWQgbGF0ZXIuXG52YXIgb2xkUnVudGltZSA9IGhhZFJ1bnRpbWUgJiYgZy5yZWdlbmVyYXRvclJ1bnRpbWU7XG5cbi8vIEZvcmNlIHJlZXZhbHV0YXRpb24gb2YgcnVudGltZS5qcy5cbmcucmVnZW5lcmF0b3JSdW50aW1lID0gdW5kZWZpbmVkO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuL3J1bnRpbWVcIik7XG5cbmlmIChoYWRSdW50aW1lKSB7XG4gIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHJ1bnRpbWUuXG4gIGcucmVnZW5lcmF0b3JSdW50aW1lID0gb2xkUnVudGltZTtcbn0gZWxzZSB7XG4gIC8vIFJlbW92ZSB0aGUgZ2xvYmFsIHByb3BlcnR5IGFkZGVkIGJ5IHJ1bnRpbWUuanMuXG4gIHRyeSB7XG4gICAgZGVsZXRlIGcucmVnZW5lcmF0b3JSdW50aW1lO1xuICB9IGNhdGNoKGUpIHtcbiAgICBnLnJlZ2VuZXJhdG9yUnVudGltZSA9IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4hKGZ1bmN0aW9uKGdsb2JhbCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgT3AgPSBPYmplY3QucHJvdG90eXBlO1xuICB2YXIgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHk7XG4gIHZhciB1bmRlZmluZWQ7IC8vIE1vcmUgY29tcHJlc3NpYmxlIHRoYW4gdm9pZCAwLlxuICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbCA6IHt9O1xuICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiO1xuICB2YXIgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiO1xuICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuXG4gIHZhciBpbk1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCI7XG4gIHZhciBydW50aW1lID0gZ2xvYmFsLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgaWYgKHJ1bnRpbWUpIHtcbiAgICBpZiAoaW5Nb2R1bGUpIHtcbiAgICAgIC8vIElmIHJlZ2VuZXJhdG9yUnVudGltZSBpcyBkZWZpbmVkIGdsb2JhbGx5IGFuZCB3ZSdyZSBpbiBhIG1vZHVsZSxcbiAgICAgIC8vIG1ha2UgdGhlIGV4cG9ydHMgb2JqZWN0IGlkZW50aWNhbCB0byByZWdlbmVyYXRvclJ1bnRpbWUuXG4gICAgICBtb2R1bGUuZXhwb3J0cyA9IHJ1bnRpbWU7XG4gICAgfVxuICAgIC8vIERvbid0IGJvdGhlciBldmFsdWF0aW5nIHRoZSByZXN0IG9mIHRoaXMgZmlsZSBpZiB0aGUgcnVudGltZSB3YXNcbiAgICAvLyBhbHJlYWR5IGRlZmluZWQgZ2xvYmFsbHkuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRGVmaW5lIHRoZSBydW50aW1lIGdsb2JhbGx5IChhcyBleHBlY3RlZCBieSBnZW5lcmF0ZWQgY29kZSkgYXMgZWl0aGVyXG4gIC8vIG1vZHVsZS5leHBvcnRzIChpZiB3ZSdyZSBpbiBhIG1vZHVsZSkgb3IgYSBuZXcsIGVtcHR5IG9iamVjdC5cbiAgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWUgPSBpbk1vZHVsZSA/IG1vZHVsZS5leHBvcnRzIDoge307XG5cbiAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIC8vIElmIG91dGVyRm4gcHJvdmlkZWQgYW5kIG91dGVyRm4ucHJvdG90eXBlIGlzIGEgR2VuZXJhdG9yLCB0aGVuIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yLlxuICAgIHZhciBwcm90b0dlbmVyYXRvciA9IG91dGVyRm4gJiYgb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBvdXRlckZuIDogR2VuZXJhdG9yO1xuICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSk7XG4gICAgdmFyIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7XG5cbiAgICAvLyBUaGUgLl9pbnZva2UgbWV0aG9kIHVuaWZpZXMgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzLlxuICAgIGdlbmVyYXRvci5faW52b2tlID0gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH1cbiAgcnVudGltZS53cmFwID0gd3JhcDtcblxuICAvLyBUcnkvY2F0Y2ggaGVscGVyIHRvIG1pbmltaXplIGRlb3B0aW1pemF0aW9ucy4gUmV0dXJucyBhIGNvbXBsZXRpb25cbiAgLy8gcmVjb3JkIGxpa2UgY29udGV4dC50cnlFbnRyaWVzW2ldLmNvbXBsZXRpb24uIFRoaXMgaW50ZXJmYWNlIGNvdWxkXG4gIC8vIGhhdmUgYmVlbiAoYW5kIHdhcyBwcmV2aW91c2x5KSBkZXNpZ25lZCB0byB0YWtlIGEgY2xvc3VyZSB0byBiZVxuICAvLyBpbnZva2VkIHdpdGhvdXQgYXJndW1lbnRzLCBidXQgaW4gYWxsIHRoZSBjYXNlcyB3ZSBjYXJlIGFib3V0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBtZXRob2Qgd2Ugd2FudCB0byBjYWxsLCBzbyB0aGVyZSdzIG5vIG5lZWRcbiAgLy8gdG8gY3JlYXRlIGEgbmV3IGZ1bmN0aW9uIG9iamVjdC4gV2UgY2FuIGV2ZW4gZ2V0IGF3YXkgd2l0aCBhc3N1bWluZ1xuICAvLyB0aGUgbWV0aG9kIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50LCBzaW5jZSB0aGF0IGhhcHBlbnMgdG8gYmUgdHJ1ZVxuICAvLyBpbiBldmVyeSBjYXNlLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHRvdWNoIHRoZSBhcmd1bWVudHMgb2JqZWN0LiBUaGVcbiAgLy8gb25seSBhZGRpdGlvbmFsIGFsbG9jYXRpb24gcmVxdWlyZWQgaXMgdGhlIGNvbXBsZXRpb24gcmVjb3JkLCB3aGljaFxuICAvLyBoYXMgYSBzdGFibGUgc2hhcGUgYW5kIHNvIGhvcGVmdWxseSBzaG91bGQgYmUgY2hlYXAgdG8gYWxsb2NhdGUuXG4gIGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcIm5vcm1hbFwiLCBhcmc6IGZuLmNhbGwob2JqLCBhcmcpIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInRocm93XCIsIGFyZzogZXJyIH07XG4gICAgfVxuICB9XG5cbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkU3RhcnQgPSBcInN1c3BlbmRlZFN0YXJ0XCI7XG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkID0gXCJzdXNwZW5kZWRZaWVsZFwiO1xuICB2YXIgR2VuU3RhdGVFeGVjdXRpbmcgPSBcImV4ZWN1dGluZ1wiO1xuICB2YXIgR2VuU3RhdGVDb21wbGV0ZWQgPSBcImNvbXBsZXRlZFwiO1xuXG4gIC8vIFJldHVybmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBpbm5lckZuIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXNcbiAgLy8gYnJlYWtpbmcgb3V0IG9mIHRoZSBkaXNwYXRjaCBzd2l0Y2ggc3RhdGVtZW50LlxuICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9O1xuXG4gIC8vIER1bW15IGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyB0aGF0IHdlIHVzZSBhcyB0aGUgLmNvbnN0cnVjdG9yIGFuZFxuICAvLyAuY29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMgZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0cy4gRm9yIGZ1bGwgc3BlYyBjb21wbGlhbmNlLCB5b3UgbWF5IHdpc2ggdG8gY29uZmlndXJlIHlvdXJcbiAgLy8gbWluaWZpZXIgbm90IHRvIG1hbmdsZSB0aGUgbmFtZXMgb2YgdGhlc2UgdHdvIGZ1bmN0aW9ucy5cbiAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9XG5cbiAgLy8gVGhpcyBpcyBhIHBvbHlmaWxsIGZvciAlSXRlcmF0b3JQcm90b3R5cGUlIGZvciBlbnZpcm9ubWVudHMgdGhhdFxuICAvLyBkb24ndCBuYXRpdmVseSBzdXBwb3J0IGl0LlxuICB2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcbiAgSXRlcmF0b3JQcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiAgdmFyIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpO1xuICBpZiAoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiZcbiAgICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJlxuICAgICAgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSkge1xuICAgIC8vIFRoaXMgZW52aXJvbm1lbnQgaGFzIGEgbmF0aXZlICVJdGVyYXRvclByb3RvdHlwZSU7IHVzZSBpdCBpbnN0ZWFkXG4gICAgLy8gb2YgdGhlIHBvbHlmaWxsLlxuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cblxuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPVxuICAgIEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR3AuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvbjtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGVbdG9TdHJpbmdUYWdTeW1ib2xdID1cbiAgICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcblxuICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLlxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICBwcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKGFyZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBydW50aW1lLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGlmICghKHRvU3RyaW5nVGFnU3ltYm9sIGluIGdlbkZ1bikpIHtcbiAgICAgICAgZ2VuRnVuW3RvU3RyaW5nVGFnU3ltYm9sXSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgIHJldHVybiBnZW5GdW47XG4gIH07XG5cbiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvXG4gIC8vIGB5aWVsZCByZWdlbmVyYXRvclJ1bnRpbWUuYXdyYXAoeClgLCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiB0ZXN0XG4gIC8vIGBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpYCB0byBkZXRlcm1pbmUgaWYgdGhlIHlpZWxkZWQgdmFsdWUgaXNcbiAgLy8gbWVhbnQgdG8gYmUgYXdhaXRlZC5cbiAgcnVudGltZS5hd3JhcCA9IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB7IF9fYXdhaXQ6IGFyZyB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJ0aHJvd1wiLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uKHVud3JhcHBlZCkge1xuICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzXG4gICAgICAgICAgLy8gdGhlIC52YWx1ZSBvZiB0aGUgUHJvbWlzZTx7dmFsdWUsZG9uZX0+IHJlc3VsdCBmb3IgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCBpdGVyYXRpb24uXG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkO1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSwgZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAvLyBJZiBhIHJlamVjdGVkIFByb21pc2Ugd2FzIHlpZWxkZWQsIHRocm93IHRoZSByZWplY3Rpb24gYmFja1xuICAgICAgICAgIC8vIGludG8gdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBzbyBpdCBjYW4gYmUgaGFuZGxlZCB0aGVyZS5cbiAgICAgICAgICByZXR1cm4gaW52b2tlKFwidGhyb3dcIiwgZXJyb3IsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcmV2aW91c1Byb21pc2U7XG5cbiAgICBmdW5jdGlvbiBlbnF1ZXVlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPVxuICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsXG4gICAgICAgIC8vIGFsbCBwcmV2aW91cyBQcm9taXNlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgaW52b2tlLFxuICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmXG4gICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvXG4gICAgICAgIC8vIGNhbGwgaW52b2tlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgb24gYSBjYWxsYmFjayB0byBmaXJlLFxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkb1xuICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5XG4gICAgICAgIC8vIGlzIHdoeSB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGludm9rZXMgaXRzXG4gICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlXG4gICAgICAgIC8vIGFzeW5jIGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiBhc3luYyBnZW5lcmF0b3JzLCBpdCBpcyBlc3BlY2lhbGx5XG4gICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS5cbiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsXG4gICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXJcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmdcbiAgICAgICAgKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIHRoZSB1bmlmaWVkIGhlbHBlciBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cbiAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcbiAgQXN5bmNJdGVyYXRvci5wcm90b3R5cGVbYXN5bmNJdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIHJ1bnRpbWUuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIHJ1bnRpbWUuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3IoXG4gICAgICB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KVxuICAgICk7XG5cbiAgICByZXR1cm4gcnVudGltZS5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pXG4gICAgICA/IGl0ZXIgLy8gSWYgb3V0ZXJGbiBpcyBhIGdlbmVyYXRvciwgcmV0dXJuIHRoZSBmdWxsIGl0ZXJhdG9yLlxuICAgICAgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpO1xuICAgICAgICB9KTtcbiAgfTtcblxuICBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHtcbiAgICB2YXIgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZykge1xuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUV4ZWN1dGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlQ29tcGxldGVkKSB7XG4gICAgICAgIGlmIChtZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHRocm93IGFyZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJlIGZvcmdpdmluZywgcGVyIDI1LjMuMy4zLjMgb2YgdGhlIHNwZWM6XG4gICAgICAgIC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1nZW5lcmF0b3JyZXN1bWVcbiAgICAgICAgcmV0dXJuIGRvbmVSZXN1bHQoKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5tZXRob2QgPSBtZXRob2Q7XG4gICAgICBjb250ZXh0LmFyZyA9IGFyZztcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGRlbGVnYXRlID0gY29udGV4dC5kZWxlZ2F0ZTtcbiAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG4gICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgICAgIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZztcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmFyZztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInJldHVyblwiKSB7XG4gICAgICAgICAgY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgY29udGV4dC5hcmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUV4ZWN1dGluZztcblxuICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG4gICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICAgIC8vIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSBpbm5lckZuLCB3ZSBsZWF2ZSBzdGF0ZSA9PT1cbiAgICAgICAgICAvLyBHZW5TdGF0ZUV4ZWN1dGluZyBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVyIGludm9jYXRpb24uXG4gICAgICAgICAgc3RhdGUgPSBjb250ZXh0LmRvbmVcbiAgICAgICAgICAgID8gR2VuU3RhdGVDb21wbGV0ZWRcbiAgICAgICAgICAgIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDtcblxuICAgICAgICAgIGlmIChyZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsXG4gICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmVcbiAgICAgICAgICB9O1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV4Y2VwdGlvbiBieSBsb29waW5nIGJhY2sgYXJvdW5kIHRvIHRoZVxuICAgICAgICAgIC8vIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpIGNhbGwgYWJvdmUuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIENhbGwgZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdKGNvbnRleHQuYXJnKSBhbmQgaGFuZGxlIHRoZVxuICAvLyByZXN1bHQsIGVpdGhlciBieSByZXR1cm5pbmcgYSB7IHZhbHVlLCBkb25lIH0gcmVzdWx0IGZyb20gdGhlXG4gIC8vIGRlbGVnYXRlIGl0ZXJhdG9yLCBvciBieSBtb2RpZnlpbmcgY29udGV4dC5tZXRob2QgYW5kIGNvbnRleHQuYXJnLFxuICAvLyBzZXR0aW5nIGNvbnRleHQuZGVsZWdhdGUgdG8gbnVsbCwgYW5kIHJldHVybmluZyB0aGUgQ29udGludWVTZW50aW5lbC5cbiAgZnVuY3Rpb24gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCkge1xuICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF07XG4gICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBBIC50aHJvdyBvciAucmV0dXJuIHdoZW4gdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBubyAudGhyb3dcbiAgICAgIC8vIG1ldGhvZCBhbHdheXMgdGVybWluYXRlcyB0aGUgeWllbGQqIGxvb3AuXG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgaWYgKGRlbGVnYXRlLml0ZXJhdG9yLnJldHVybikge1xuICAgICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIC8vIElmIG1heWJlSW52b2tlRGVsZWdhdGUoY29udGV4dCkgY2hhbmdlZCBjb250ZXh0Lm1ldGhvZCBmcm9tXG4gICAgICAgICAgICAvLyBcInJldHVyblwiIHRvIFwidGhyb3dcIiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy5cbiAgICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuXG4gICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG5cbiAgICBpZiAoISBpbmZvKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAvLyBBc3NpZ24gdGhlIHJlc3VsdCBvZiB0aGUgZmluaXNoZWQgZGVsZWdhdGUgdG8gdGhlIHRlbXBvcmFyeVxuICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuXG4gICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jO1xuXG4gICAgICAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgXCJ0aHJvd1wiIGJ1dCB0aGUgZGVsZWdhdGUgaGFuZGxlZCB0aGVcbiAgICAgIC8vIGV4Y2VwdGlvbiwgbGV0IHRoZSBvdXRlciBnZW5lcmF0b3IgcHJvY2VlZCBub3JtYWxseS4gSWZcbiAgICAgIC8vIGNvbnRleHQubWV0aG9kIHdhcyBcIm5leHRcIiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuXG4gICAgICAvLyBcImNvbnN1bWVkXCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXNcbiAgICAgIC8vIFwicmV0dXJuXCIsIGFsbG93IHRoZSBvcmlnaW5hbCAucmV0dXJuIGNhbGwgdG8gY29udGludWUgaW4gdGhlXG4gICAgICAvLyBvdXRlciBnZW5lcmF0b3IuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgIT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLlxuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgLy8gVGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGlzIGZpbmlzaGVkLCBzbyBmb3JnZXQgaXQgYW5kIGNvbnRpbnVlIHdpdGhcbiAgICAvLyB0aGUgb3V0ZXIgZ2VuZXJhdG9yLlxuICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICB9XG5cbiAgLy8gRGVmaW5lIEdlbmVyYXRvci5wcm90b3R5cGUue25leHQsdGhyb3cscmV0dXJufSBpbiB0ZXJtcyBvZiB0aGVcbiAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLlxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuXG4gIEdwW3RvU3RyaW5nVGFnU3ltYm9sXSA9IFwiR2VuZXJhdG9yXCI7XG5cbiAgLy8gQSBHZW5lcmF0b3Igc2hvdWxkIGFsd2F5cyByZXR1cm4gaXRzZWxmIGFzIHRoZSBpdGVyYXRvciBvYmplY3Qgd2hlbiB0aGVcbiAgLy8gQEBpdGVyYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgb24gaXQuIFNvbWUgYnJvd3NlcnMnIGltcGxlbWVudGF0aW9ucyBvZiB0aGVcbiAgLy8gaXRlcmF0b3IgcHJvdG90eXBlIGNoYWluIGluY29ycmVjdGx5IGltcGxlbWVudCB0aGlzLCBjYXVzaW5nIHRoZSBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0IHRvIG5vdCBiZSByZXR1cm5lZCBmcm9tIHRoaXMgY2FsbC4gVGhpcyBlbnN1cmVzIHRoYXQgZG9lc24ndCBoYXBwZW4uXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvaXNzdWVzLzI3NCBmb3IgbW9yZSBkZXRhaWxzLlxuICBHcFtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBHcC50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcIltvYmplY3QgR2VuZXJhdG9yXVwiO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgdmFyIGVudHJ5ID0geyB0cnlMb2M6IGxvY3NbMF0gfTtcblxuICAgIGlmICgxIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXTtcbiAgICB9XG5cbiAgICBpZiAoMiBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXTtcbiAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTtcbiAgICB9XG5cbiAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7XG4gICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307XG4gICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiO1xuICAgIGRlbGV0ZSByZWNvcmQuYXJnO1xuICAgIGVudHJ5LmNvbXBsZXRpb24gPSByZWNvcmQ7XG4gIH1cblxuICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gVGhlIHJvb3QgZW50cnkgb2JqZWN0IChlZmZlY3RpdmVseSBhIHRyeSBzdGF0ZW1lbnQgd2l0aG91dCBhIGNhdGNoXG4gICAgLy8gb3IgYSBmaW5hbGx5IGJsb2NrKSBnaXZlcyB1cyBhIHBsYWNlIHRvIHN0b3JlIHZhbHVlcyB0aHJvd24gZnJvbVxuICAgIC8vIGxvY2F0aW9ucyB3aGVyZSB0aGVyZSBpcyBubyBlbmNsb3NpbmcgdHJ5IHN0YXRlbWVudC5cbiAgICB0aGlzLnRyeUVudHJpZXMgPSBbeyB0cnlMb2M6IFwicm9vdFwiIH1dO1xuICAgIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKTtcbiAgICB0aGlzLnJlc2V0KHRydWUpO1xuICB9XG5cbiAgcnVudGltZS5rZXlzID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gICAga2V5cy5yZXZlcnNlKCk7XG5cbiAgICAvLyBSYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdpdGggYSBuZXh0IG1ldGhvZCwgd2Uga2VlcFxuICAgIC8vIHRoaW5ncyBzaW1wbGUgYW5kIHJldHVybiB0aGUgbmV4dCBmdW5jdGlvbiBpdHNlbGYuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB3aGlsZSAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgbmV4dC52YWx1ZSA9IGtleTtcbiAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUbyBhdm9pZCBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIG9iamVjdCwgd2UganVzdCBoYW5nIHRoZSAudmFsdWVcbiAgICAgIC8vIGFuZCAuZG9uZSBwcm9wZXJ0aWVzIG9mZiB0aGUgbmV4dCBmdW5jdGlvbiBvYmplY3QgaXRzZWxmLiBUaGlzXG4gICAgICAvLyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgbWluaWZpZXIgd2lsbCBub3QgYW5vbnltaXplIHRoZSBmdW5jdGlvbi5cbiAgICAgIG5leHQuZG9uZSA9IHRydWU7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkge1xuICAgIGlmIChpdGVyYWJsZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gaXRlcmFibGVbaXRlcmF0b3JTeW1ib2xdO1xuICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYWJsZS5uZXh0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIGkgPSAtMSwgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGl0ZXJhYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkge1xuICAgICAgICAgICAgICBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXh0LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG5leHQuZG9uZSA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV4dC5uZXh0ID0gbmV4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYW4gaXRlcmF0b3Igd2l0aCBubyB2YWx1ZXMuXG4gICAgcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9O1xuICB9XG4gIHJ1bnRpbWUudmFsdWVzID0gdmFsdWVzO1xuXG4gIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG5cbiAgQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6IENvbnRleHQsXG5cbiAgICByZXNldDogZnVuY3Rpb24oc2tpcFRlbXBSZXNldCkge1xuICAgICAgdGhpcy5wcmV2ID0gMDtcbiAgICAgIHRoaXMubmV4dCA9IDA7XG4gICAgICAvLyBSZXNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpO1xuXG4gICAgICBpZiAoIXNraXBUZW1wUmVzZXQpIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSB7XG4gICAgICAgICAgLy8gTm90IHN1cmUgYWJvdXQgdGhlIG9wdGltYWwgb3JkZXIgb2YgdGhlc2UgY29uZGl0aW9uczpcbiAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT09IFwidFwiICYmXG4gICAgICAgICAgICAgIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmXG4gICAgICAgICAgICAgICFpc05hTigrbmFtZS5zbGljZSgxKSkpIHtcbiAgICAgICAgICAgIHRoaXNbbmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcblxuICAgICAgdmFyIHJvb3RFbnRyeSA9IHRoaXMudHJ5RW50cmllc1swXTtcbiAgICAgIHZhciByb290UmVjb3JkID0gcm9vdEVudHJ5LmNvbXBsZXRpb247XG4gICAgICBpZiAocm9vdFJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcm9vdFJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJ2YWw7XG4gICAgfSxcblxuICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbihleGNlcHRpb24pIHtcbiAgICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgICBmdW5jdGlvbiBoYW5kbGUobG9jLCBjYXVnaHQpIHtcbiAgICAgICAgcmVjb3JkLnR5cGUgPSBcInRocm93XCI7XG4gICAgICAgIHJlY29yZC5hcmcgPSBleGNlcHRpb247XG4gICAgICAgIGNvbnRleHQubmV4dCA9IGxvYztcblxuICAgICAgICBpZiAoY2F1Z2h0KSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRpc3BhdGNoZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgYnkgYSBjYXRjaCBibG9jayxcbiAgICAgICAgICAvLyB0aGVuIGxldCB0aGF0IGNhdGNoIGJsb2NrIGhhbmRsZSB0aGUgZXhjZXB0aW9uIG5vcm1hbGx5LlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gISEgY2F1Z2h0O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gXCJyb290XCIpIHtcbiAgICAgICAgICAvLyBFeGNlcHRpb24gdGhyb3duIG91dHNpZGUgb2YgYW55IHRyeSBibG9jayB0aGF0IGNvdWxkIGhhbmRsZVxuICAgICAgICAgIC8vIGl0LCBzbyBzZXQgdGhlIGNvbXBsZXRpb24gdmFsdWUgb2YgdGhlIGVudGlyZSBmdW5jdGlvbiB0b1xuICAgICAgICAgIC8vIHRocm93IHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmV0dXJuIGhhbmRsZShcImVuZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7XG4gICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksIFwiY2F0Y2hMb2NcIik7XG4gICAgICAgICAgdmFyIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpO1xuXG4gICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhYnJ1cHQ6IGZ1bmN0aW9uKHR5cGUsIGFyZykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2ICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmXG4gICAgICAgICAgICB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkgJiZcbiAgICAgICAgICAodHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgIHR5cGUgPT09IFwiY29udGludWVcIikgJiZcbiAgICAgICAgICBmaW5hbGx5RW50cnkudHJ5TG9jIDw9IGFyZyAmJlxuICAgICAgICAgIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAvLyBJZ25vcmUgdGhlIGZpbmFsbHkgZW50cnkgaWYgY29udHJvbCBpcyBub3QganVtcGluZyB0byBhXG4gICAgICAgIC8vIGxvY2F0aW9uIG91dHNpZGUgdGhlIHRyeS9jYXRjaCBibG9jay5cbiAgICAgICAgZmluYWxseUVudHJ5ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307XG4gICAgICByZWNvcmQudHlwZSA9IHR5cGU7XG4gICAgICByZWNvcmQuYXJnID0gYXJnO1xuXG4gICAgICBpZiAoZmluYWxseUVudHJ5KSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jO1xuICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY29tcGxldGUocmVjb3JkKTtcbiAgICB9LFxuXG4gICAgY29tcGxldGU6IGZ1bmN0aW9uKHJlY29yZCwgYWZ0ZXJMb2MpIHtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgcmVjb3JkLnR5cGUgPT09IFwiY29udGludWVcIikge1xuICAgICAgICB0aGlzLm5leHQgPSByZWNvcmQuYXJnO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICB0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gXCJlbmRcIjtcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgYWZ0ZXJMb2MpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gYWZ0ZXJMb2M7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH0sXG5cbiAgICBmaW5pc2g6IGZ1bmN0aW9uKGZpbmFsbHlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykge1xuICAgICAgICAgIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpO1xuICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIFwiY2F0Y2hcIjogZnVuY3Rpb24odHJ5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG4gICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnO1xuICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aHJvd247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNvbnRleHQuY2F0Y2ggbWV0aG9kIG11c3Qgb25seSBiZSBjYWxsZWQgd2l0aCBhIGxvY2F0aW9uXG4gICAgICAvLyBhcmd1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEga25vd24gY2F0Y2ggYmxvY2suXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHRcIik7XG4gICAgfSxcblxuICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uKGl0ZXJhYmxlLCByZXN1bHROYW1lLCBuZXh0TG9jKSB7XG4gICAgICB0aGlzLmRlbGVnYXRlID0ge1xuICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSxcbiAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSxcbiAgICAgICAgbmV4dExvYzogbmV4dExvY1xuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZm9yZ2V0IHRoZSBsYXN0IHNlbnQgdmFsdWUgc28gdGhhdCB3ZSBkb24ndFxuICAgICAgICAvLyBhY2NpZGVudGFsbHkgcGFzcyBpdCBvbiB0byB0aGUgZGVsZWdhdGUuXG4gICAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG4gIH07XG59KShcbiAgLy8gSW4gc2xvcHB5IG1vZGUsIHVuYm91bmQgYHRoaXNgIHJlZmVycyB0byB0aGUgZ2xvYmFsIG9iamVjdCwgZmFsbGJhY2sgdG9cbiAgLy8gRnVuY3Rpb24gY29uc3RydWN0b3IgaWYgd2UncmUgaW4gZ2xvYmFsIHN0cmljdCBtb2RlLiBUaGF0IGlzIHNhZGx5IGEgZm9ybVxuICAvLyBvZiBpbmRpcmVjdCBldmFsIHdoaWNoIHZpb2xhdGVzIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5LlxuICAoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMgfHwgKHR5cGVvZiBzZWxmID09PSBcIm9iamVjdFwiICYmIHNlbGYpO1xuICB9KSgpIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKVxuKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlZ2VuZXJhdG9yLXJ1bnRpbWVcIik7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gYXJyYXlzIGFyZSBzaGFsbG93IGVxdWFsLCBvciBmYWxzZSBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYSBGaXJzdCBhcnJheSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtBcnJheX0gYiBTZWNvbmQgYXJyYXkgdG8gY29tcGFyZS5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSB0d28gYXJyYXlzIGFyZSBzaGFsbG93IGVxdWFsLlxuICovXG5mdW5jdGlvbiBpc1NoYWxsb3dFcXVhbEFycmF5cyggYSwgYiApIHtcblx0dmFyIGk7XG5cblx0aWYgKCBhID09PSBiICkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0aWYgKCBhLmxlbmd0aCAhPT0gYi5sZW5ndGggKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Zm9yICggaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrICkge1xuXHRcdGlmICggYVsgaSBdICE9PSBiWyBpIF0gKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTaGFsbG93RXF1YWxBcnJheXM7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogSW50ZXJuYWwgZGVwZW5kZW5jaWVzO1xuICovXG52YXIgaXNTaGFsbG93RXF1YWxPYmplY3RzID0gcmVxdWlyZSggJy4vb2JqZWN0cycgKTtcbnZhciBpc1NoYWxsb3dFcXVhbEFycmF5cyA9IHJlcXVpcmUoICcuL2FycmF5cycgKTtcblxudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIGFycmF5cyBvciBvYmplY3RzIGFyZSBzaGFsbG93IGVxdWFsLCBvciBmYWxzZVxuICogb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7KEFycmF5fE9iamVjdCl9IGEgRmlyc3Qgb2JqZWN0IG9yIGFycmF5IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyhBcnJheXxPYmplY3QpfSBiIFNlY29uZCBvYmplY3Qgb3IgYXJyYXkgdG8gY29tcGFyZS5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSB0d28gdmFsdWVzIGFyZSBzaGFsbG93IGVxdWFsLlxuICovXG5mdW5jdGlvbiBpc1NoYWxsb3dFcXVhbCggYSwgYiApIHtcblx0aWYgKCBhICYmIGIgKSB7XG5cdFx0aWYgKCBhLmNvbnN0cnVjdG9yID09PSBPYmplY3QgJiYgYi5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0ICkge1xuXHRcdFx0cmV0dXJuIGlzU2hhbGxvd0VxdWFsT2JqZWN0cyggYSwgYiApO1xuXHRcdH0gZWxzZSBpZiAoIGlzQXJyYXkoIGEgKSAmJiBpc0FycmF5KCBiICkgKSB7XG5cdFx0XHRyZXR1cm4gaXNTaGFsbG93RXF1YWxBcnJheXMoIGEsIGIgKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gYSA9PT0gYjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1NoYWxsb3dFcXVhbDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGtleXMgPSBPYmplY3Qua2V5cztcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR3byBvYmplY3RzIGFyZSBzaGFsbG93IGVxdWFsLCBvciBmYWxzZSBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGEgRmlyc3Qgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gYiBTZWNvbmQgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgdHdvIG9iamVjdHMgYXJlIHNoYWxsb3cgZXF1YWwuXG4gKi9cbmZ1bmN0aW9uIGlzU2hhbGxvd0VxdWFsT2JqZWN0cyggYSwgYiApIHtcblx0dmFyIGFLZXlzLCBiS2V5cywgaSwga2V5O1xuXG5cdGlmICggYSA9PT0gYiApIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGFLZXlzID0ga2V5cyggYSApO1xuXHRiS2V5cyA9IGtleXMoIGIgKTtcblxuXHRpZiAoIGFLZXlzLmxlbmd0aCAhPT0gYktleXMubGVuZ3RoICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGkgPSAwO1xuXG5cdHdoaWxlICggaSA8IGFLZXlzLmxlbmd0aCApIHtcblx0XHRrZXkgPSBhS2V5c1sgaSBdO1xuXHRcdGlmICggYVsga2V5IF0gIT09IGJbIGtleSBdICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGkrKztcblx0fVxuXG5cdHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU2hhbGxvd0VxdWFsT2JqZWN0cztcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYuYXJyYXkuZnJvbScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuQXJyYXkuZnJvbTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2LmFycmF5LmlzLWFycmF5Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5BcnJheS5pc0FycmF5O1xuIiwicmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvcicpO1xuIiwicmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vbW9kdWxlcy9jb3JlLmlzLWl0ZXJhYmxlJyk7XG4iLCJ2YXIgY29yZSA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKTtcbnZhciAkSlNPTiA9IGNvcmUuSlNPTiB8fCAoY29yZS5KU09OID0geyBzdHJpbmdpZnk6IEpTT04uc3RyaW5naWZ5IH0pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzdHJpbmdpZnkoaXQpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICByZXR1cm4gJEpTT04uc3RyaW5naWZ5LmFwcGx5KCRKU09OLCBhcmd1bWVudHMpO1xufTtcbiIsInJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5tYXAnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM3Lm1hcC50by1qc29uJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNy5tYXAub2YnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM3Lm1hcC5mcm9tJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvX2NvcmUnKS5NYXA7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuY3JlYXRlJyk7XG52YXIgJE9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZShQLCBEKSB7XG4gIHJldHVybiAkT2JqZWN0LmNyZWF0ZShQLCBEKTtcbn07XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgJE9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KGl0LCBrZXksIGRlc2MpIHtcbiAgcmV0dXJuICRPYmplY3QuZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgZGVzYyk7XG59O1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyICRPYmplY3QgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSkge1xuICByZXR1cm4gJE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSk7XG59O1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYuc3ltYm9sJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Qua2V5cztcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5zZXQtcHJvdG90eXBlLW9mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Quc2V0UHJvdG90eXBlT2Y7XG4iLCJyZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5wYXJzZS1pbnQnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vbW9kdWxlcy9fY29yZScpLnBhcnNlSW50O1xuIiwicmVxdWlyZSgnLi4vbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnByb21pc2UnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM3LnByb21pc2UuZmluYWxseScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczcucHJvbWlzZS50cnknKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vbW9kdWxlcy9fY29yZScpLlByb21pc2U7XG4iLCJyZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc2V0Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNy5zZXQudG8tanNvbicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczcuc2V0Lm9mJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNy5zZXQuZnJvbScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9tb2R1bGVzL19jb3JlJykuU2V0O1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYuc3ltYm9sJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNy5zeW1ib2wuYXN5bmMtaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM3LnN5bWJvbC5vYnNlcnZhYmxlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5TeW1ib2w7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL193a3MtZXh0JykuZignaXRlcmF0b3InKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICh0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSBmdW5jdGlvbiEnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIENvbnN0cnVjdG9yLCBuYW1lLCBmb3JiaWRkZW5GaWVsZCkge1xuICBpZiAoIShpdCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSB8fCAoZm9yYmlkZGVuRmllbGQgIT09IHVuZGVmaW5lZCAmJiBmb3JiaWRkZW5GaWVsZCBpbiBpdCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IobmFtZSArICc6IGluY29ycmVjdCBpbnZvY2F0aW9uIScpO1xuICB9IHJldHVybiBpdDtcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhbiBvYmplY3QhJyk7XG4gIHJldHVybiBpdDtcbn07XG4iLCJ2YXIgZm9yT2YgPSByZXF1aXJlKCcuL19mb3Itb2YnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlciwgSVRFUkFUT1IpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBmb3JPZihpdGVyLCBmYWxzZSwgcmVzdWx0LnB1c2gsIHJlc3VsdCwgSVRFUkFUT1IpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSU9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSB7XG4gICAgICBpZiAoT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuIiwiLy8gMCAtPiBBcnJheSNmb3JFYWNoXG4vLyAxIC0+IEFycmF5I21hcFxuLy8gMiAtPiBBcnJheSNmaWx0ZXJcbi8vIDMgLT4gQXJyYXkjc29tZVxuLy8gNCAtPiBBcnJheSNldmVyeVxuLy8gNSAtPiBBcnJheSNmaW5kXG4vLyA2IC0+IEFycmF5I2ZpbmRJbmRleFxudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGFzYyA9IHJlcXVpcmUoJy4vX2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUWVBFLCAkY3JlYXRlKSB7XG4gIHZhciBJU19NQVAgPSBUWVBFID09IDE7XG4gIHZhciBJU19GSUxURVIgPSBUWVBFID09IDI7XG4gIHZhciBJU19TT01FID0gVFlQRSA9PSAzO1xuICB2YXIgSVNfRVZFUlkgPSBUWVBFID09IDQ7XG4gIHZhciBJU19GSU5EX0lOREVYID0gVFlQRSA9PSA2O1xuICB2YXIgTk9fSE9MRVMgPSBUWVBFID09IDUgfHwgSVNfRklORF9JTkRFWDtcbiAgdmFyIGNyZWF0ZSA9ICRjcmVhdGUgfHwgYXNjO1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBjYWxsYmFja2ZuLCB0aGF0KSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCgkdGhpcyk7XG4gICAgdmFyIHNlbGYgPSBJT2JqZWN0KE8pO1xuICAgIHZhciBmID0gY3R4KGNhbGxiYWNrZm4sIHRoYXQsIDMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChzZWxmLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgcmVzdWx0ID0gSVNfTUFQID8gY3JlYXRlKCR0aGlzLCBsZW5ndGgpIDogSVNfRklMVEVSID8gY3JlYXRlKCR0aGlzLCAwKSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgdmFsLCByZXM7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChOT19IT0xFUyB8fCBpbmRleCBpbiBzZWxmKSB7XG4gICAgICB2YWwgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlcyA9IGYodmFsLCBpbmRleCwgTyk7XG4gICAgICBpZiAoVFlQRSkge1xuICAgICAgICBpZiAoSVNfTUFQKSByZXN1bHRbaW5kZXhdID0gcmVzOyAgIC8vIG1hcFxuICAgICAgICBlbHNlIGlmIChyZXMpIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuIHRydWU7ICAgICAgICAgICAgIC8vIHNvbWVcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiB2YWw7ICAgICAgICAgICAgICAvLyBmaW5kXG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgLy8gZmluZEluZGV4XG4gICAgICAgICAgY2FzZSAyOiByZXN1bHQucHVzaCh2YWwpOyAgICAgICAgLy8gZmlsdGVyXG4gICAgICAgIH0gZWxzZSBpZiAoSVNfRVZFUlkpIHJldHVybiBmYWxzZTsgLy8gZXZlcnlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHJlc3VsdDtcbiAgfTtcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9faXMtYXJyYXknKTtcbnZhciBTUEVDSUVTID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWwpIHtcbiAgdmFyIEM7XG4gIGlmIChpc0FycmF5KG9yaWdpbmFsKSkge1xuICAgIEMgPSBvcmlnaW5hbC5jb25zdHJ1Y3RvcjtcbiAgICAvLyBjcm9zcy1yZWFsbSBmYWxsYmFja1xuICAgIGlmICh0eXBlb2YgQyA9PSAnZnVuY3Rpb24nICYmIChDID09PSBBcnJheSB8fCBpc0FycmF5KEMucHJvdG90eXBlKSkpIEMgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGlzT2JqZWN0KEMpKSB7XG4gICAgICBDID0gQ1tTUEVDSUVTXTtcbiAgICAgIGlmIChDID09PSBudWxsKSBDID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSByZXR1cm4gQyA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDO1xufTtcbiIsIi8vIDkuNC4yLjMgQXJyYXlTcGVjaWVzQ3JlYXRlKG9yaWdpbmFsQXJyYXksIGxlbmd0aClcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19hcnJheS1zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9yaWdpbmFsLCBsZW5ndGgpIHtcbiAgcmV0dXJuIG5ldyAoc3BlY2llc0NvbnN0cnVjdG9yKG9yaWdpbmFsKSkobGVuZ3RoKTtcbn07XG4iLCIvLyBnZXR0aW5nIHRhZyBmcm9tIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBBUkcgPSBjb2YoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8sIFQsIEI7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mIChUID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUQUcpKSA9PSAnc3RyaW5nJyA/IFRcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IEFSRyA/IGNvZihPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChCID0gY29mKE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogQjtcbn07XG4iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgJGl0ZXJEZWZpbmUgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpO1xudmFyIHN0ZXAgPSByZXF1aXJlKCcuL19pdGVyLXN0ZXAnKTtcbnZhciBzZXRTcGVjaWVzID0gcmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFzdEtleSA9IHJlcXVpcmUoJy4vX21ldGEnKS5mYXN0S2V5O1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIFNJWkUgPSBERVNDUklQVE9SUyA/ICdfcycgOiAnc2l6ZSc7XG5cbnZhciBnZXRFbnRyeSA9IGZ1bmN0aW9uICh0aGF0LCBrZXkpIHtcbiAgLy8gZmFzdCBjYXNlXG4gIHZhciBpbmRleCA9IGZhc3RLZXkoa2V5KTtcbiAgdmFyIGVudHJ5O1xuICBpZiAoaW5kZXggIT09ICdGJykgcmV0dXJuIHRoYXQuX2lbaW5kZXhdO1xuICAvLyBmcm96ZW4gb2JqZWN0IGNhc2VcbiAgZm9yIChlbnRyeSA9IHRoYXQuX2Y7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm4pIHtcbiAgICBpZiAoZW50cnkuayA9PSBrZXkpIHJldHVybiBlbnRyeTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUikge1xuICAgIHZhciBDID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhhdCwgQywgTkFNRSwgJ19pJyk7XG4gICAgICB0aGF0Ll90ID0gTkFNRTsgICAgICAgICAvLyBjb2xsZWN0aW9uIHR5cGVcbiAgICAgIHRoYXQuX2kgPSBjcmVhdGUobnVsbCk7IC8vIGluZGV4XG4gICAgICB0aGF0Ll9mID0gdW5kZWZpbmVkOyAgICAvLyBmaXJzdCBlbnRyeVxuICAgICAgdGhhdC5fbCA9IHVuZGVmaW5lZDsgICAgLy8gbGFzdCBlbnRyeVxuICAgICAgdGhhdFtTSVpFXSA9IDA7ICAgICAgICAgLy8gc2l6ZVxuICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGhhdFtBRERFUl0sIHRoYXQpO1xuICAgIH0pO1xuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCB7XG4gICAgICAvLyAyMy4xLjMuMSBNYXAucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIC8vIDIzLjIuMy4yIFNldC5wcm90b3R5cGUuY2xlYXIoKVxuICAgICAgY2xlYXI6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgICBmb3IgKHZhciB0aGF0ID0gdmFsaWRhdGUodGhpcywgTkFNRSksIGRhdGEgPSB0aGF0Ll9pLCBlbnRyeSA9IHRoYXQuX2Y7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm4pIHtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZW50cnkucCkgZW50cnkucCA9IGVudHJ5LnAubiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBkZWxldGUgZGF0YVtlbnRyeS5pXTtcbiAgICAgICAgfVxuICAgICAgICB0aGF0Ll9mID0gdGhhdC5fbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhhdFtTSVpFXSA9IDA7XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjMgTWFwLnByb3RvdHlwZS5kZWxldGUoa2V5KVxuICAgICAgLy8gMjMuMi4zLjQgU2V0LnByb3RvdHlwZS5kZWxldGUodmFsdWUpXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdGhhdCA9IHZhbGlkYXRlKHRoaXMsIE5BTUUpO1xuICAgICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICB2YXIgbmV4dCA9IGVudHJ5Lm47XG4gICAgICAgICAgdmFyIHByZXYgPSBlbnRyeS5wO1xuICAgICAgICAgIGRlbGV0ZSB0aGF0Ll9pW2VudHJ5LmldO1xuICAgICAgICAgIGVudHJ5LnIgPSB0cnVlO1xuICAgICAgICAgIGlmIChwcmV2KSBwcmV2Lm4gPSBuZXh0O1xuICAgICAgICAgIGlmIChuZXh0KSBuZXh0LnAgPSBwcmV2O1xuICAgICAgICAgIGlmICh0aGF0Ll9mID09IGVudHJ5KSB0aGF0Ll9mID0gbmV4dDtcbiAgICAgICAgICBpZiAodGhhdC5fbCA9PSBlbnRyeSkgdGhhdC5fbCA9IHByZXY7XG4gICAgICAgICAgdGhhdFtTSVpFXS0tO1xuICAgICAgICB9IHJldHVybiAhIWVudHJ5O1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjIuMy42IFNldC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgLy8gMjMuMS4zLjUgTWFwLnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gICAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgICAgIHZhbGlkYXRlKHRoaXMsIE5BTUUpO1xuICAgICAgICB2YXIgZiA9IGN0eChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7XG4gICAgICAgIHZhciBlbnRyeTtcbiAgICAgICAgd2hpbGUgKGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uIDogdGhpcy5fZikge1xuICAgICAgICAgIGYoZW50cnkudiwgZW50cnkuaywgdGhpcyk7XG4gICAgICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICAgICAgd2hpbGUgKGVudHJ5ICYmIGVudHJ5LnIpIGVudHJ5ID0gZW50cnkucDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy43IE1hcC5wcm90b3R5cGUuaGFzKGtleSlcbiAgICAgIC8vIDIzLjIuMy43IFNldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIWdldEVudHJ5KHZhbGlkYXRlKHRoaXMsIE5BTUUpLCBrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChERVNDUklQVE9SUykgZFAoQy5wcm90b3R5cGUsICdzaXplJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZSh0aGlzLCBOQU1FKVtTSVpFXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQztcbiAgfSxcbiAgZGVmOiBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgdmFyIHByZXYsIGluZGV4O1xuICAgIC8vIGNoYW5nZSBleGlzdGluZyBlbnRyeVxuICAgIGlmIChlbnRyeSkge1xuICAgICAgZW50cnkudiA9IHZhbHVlO1xuICAgIC8vIGNyZWF0ZSBuZXcgZW50cnlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhhdC5fbCA9IGVudHJ5ID0ge1xuICAgICAgICBpOiBpbmRleCA9IGZhc3RLZXkoa2V5LCB0cnVlKSwgLy8gPC0gaW5kZXhcbiAgICAgICAgazoga2V5LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIGtleVxuICAgICAgICB2OiB2YWx1ZSwgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gdmFsdWVcbiAgICAgICAgcDogcHJldiA9IHRoYXQuX2wsICAgICAgICAgICAgIC8vIDwtIHByZXZpb3VzIGVudHJ5XG4gICAgICAgIG46IHVuZGVmaW5lZCwgICAgICAgICAgICAgICAgICAvLyA8LSBuZXh0IGVudHJ5XG4gICAgICAgIHI6IGZhbHNlICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSByZW1vdmVkXG4gICAgICB9O1xuICAgICAgaWYgKCF0aGF0Ll9mKSB0aGF0Ll9mID0gZW50cnk7XG4gICAgICBpZiAocHJldikgcHJldi5uID0gZW50cnk7XG4gICAgICB0aGF0W1NJWkVdKys7XG4gICAgICAvLyBhZGQgdG8gaW5kZXhcbiAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSB0aGF0Ll9pW2luZGV4XSA9IGVudHJ5O1xuICAgIH0gcmV0dXJuIHRoYXQ7XG4gIH0sXG4gIGdldEVudHJ5OiBnZXRFbnRyeSxcbiAgc2V0U3Ryb25nOiBmdW5jdGlvbiAoQywgTkFNRSwgSVNfTUFQKSB7XG4gICAgLy8gYWRkIC5rZXlzLCAudmFsdWVzLCAuZW50cmllcywgW0BAaXRlcmF0b3JdXG4gICAgLy8gMjMuMS4zLjQsIDIzLjEuMy44LCAyMy4xLjMuMTEsIDIzLjEuMy4xMiwgMjMuMi4zLjUsIDIzLjIuMy44LCAyMy4yLjMuMTAsIDIzLjIuMy4xMVxuICAgICRpdGVyRGVmaW5lKEMsIE5BTUUsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICAgICAgdGhpcy5fdCA9IHZhbGlkYXRlKGl0ZXJhdGVkLCBOQU1FKTsgLy8gdGFyZ2V0XG4gICAgICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgICAgICAvLyBraW5kXG4gICAgICB0aGlzLl9sID0gdW5kZWZpbmVkOyAgICAgICAgICAgICAgICAvLyBwcmV2aW91c1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHZhciBraW5kID0gdGhhdC5faztcbiAgICAgIHZhciBlbnRyeSA9IHRoYXQuX2w7XG4gICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yKSBlbnRyeSA9IGVudHJ5LnA7XG4gICAgICAvLyBnZXQgbmV4dCBlbnRyeVxuICAgICAgaWYgKCF0aGF0Ll90IHx8ICEodGhhdC5fbCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uIDogdGhhdC5fdC5fZikpIHtcbiAgICAgICAgLy8gb3IgZmluaXNoIHRoZSBpdGVyYXRpb25cbiAgICAgICAgdGhhdC5fdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHN0ZXAoMSk7XG4gICAgICB9XG4gICAgICAvLyByZXR1cm4gc3RlcCBieSBraW5kXG4gICAgICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiBzdGVwKDAsIGVudHJ5LmspO1xuICAgICAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiBzdGVwKDAsIGVudHJ5LnYpO1xuICAgICAgcmV0dXJuIHN0ZXAoMCwgW2VudHJ5LmssIGVudHJ5LnZdKTtcbiAgICB9LCBJU19NQVAgPyAnZW50cmllcycgOiAndmFsdWVzJywgIUlTX01BUCwgdHJ1ZSk7XG5cbiAgICAvLyBhZGQgW0BAc3BlY2llc10sIDIzLjEuMi4yLCAyMy4yLjIuMlxuICAgIHNldFNwZWNpZXMoTkFNRSk7XG4gIH1cbn07XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vRGF2aWRCcnVhbnQvTWFwLVNldC5wcm90b3R5cGUudG9KU09OXG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciBmcm9tID0gcmVxdWlyZSgnLi9fYXJyYXktZnJvbS1pdGVyYWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTkFNRSkge1xuICByZXR1cm4gZnVuY3Rpb24gdG9KU09OKCkge1xuICAgIGlmIChjbGFzc29mKHRoaXMpICE9IE5BTUUpIHRocm93IFR5cGVFcnJvcihOQU1FICsgXCIjdG9KU09OIGlzbid0IGdlbmVyaWNcIik7XG4gICAgcmV0dXJuIGZyb20odGhpcyk7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBtZXRhID0gcmVxdWlyZSgnLi9fbWV0YScpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJyk7XG52YXIgZm9yT2YgPSByZXF1aXJlKCcuL19mb3Itb2YnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgZWFjaCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgwKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE5BTUUsIHdyYXBwZXIsIG1ldGhvZHMsIGNvbW1vbiwgSVNfTUFQLCBJU19XRUFLKSB7XG4gIHZhciBCYXNlID0gZ2xvYmFsW05BTUVdO1xuICB2YXIgQyA9IEJhc2U7XG4gIHZhciBBRERFUiA9IElTX01BUCA/ICdzZXQnIDogJ2FkZCc7XG4gIHZhciBwcm90byA9IEMgJiYgQy5wcm90b3R5cGU7XG4gIHZhciBPID0ge307XG4gIGlmICghREVTQ1JJUFRPUlMgfHwgdHlwZW9mIEMgIT0gJ2Z1bmN0aW9uJyB8fCAhKElTX1dFQUsgfHwgcHJvdG8uZm9yRWFjaCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIG5ldyBDKCkuZW50cmllcygpLm5leHQoKTtcbiAgfSkpKSB7XG4gICAgLy8gY3JlYXRlIGNvbGxlY3Rpb24gY29uc3RydWN0b3JcbiAgICBDID0gY29tbW9uLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIE5BTUUsIElTX01BUCwgQURERVIpO1xuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBtZXRob2RzKTtcbiAgICBtZXRhLk5FRUQgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIEMgPSB3cmFwcGVyKGZ1bmN0aW9uICh0YXJnZXQsIGl0ZXJhYmxlKSB7XG4gICAgICBhbkluc3RhbmNlKHRhcmdldCwgQywgTkFNRSwgJ19jJyk7XG4gICAgICB0YXJnZXQuX2MgPSBuZXcgQmFzZSgpO1xuICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGFyZ2V0W0FEREVSXSwgdGFyZ2V0KTtcbiAgICB9KTtcbiAgICBlYWNoKCdhZGQsY2xlYXIsZGVsZXRlLGZvckVhY2gsZ2V0LGhhcyxzZXQsa2V5cyx2YWx1ZXMsZW50cmllcyx0b0pTT04nLnNwbGl0KCcsJyksIGZ1bmN0aW9uIChLRVkpIHtcbiAgICAgIHZhciBJU19BRERFUiA9IEtFWSA9PSAnYWRkJyB8fCBLRVkgPT0gJ3NldCc7XG4gICAgICBpZiAoS0VZIGluIHByb3RvICYmICEoSVNfV0VBSyAmJiBLRVkgPT0gJ2NsZWFyJykpIGhpZGUoQy5wcm90b3R5cGUsIEtFWSwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgYW5JbnN0YW5jZSh0aGlzLCBDLCBLRVkpO1xuICAgICAgICBpZiAoIUlTX0FEREVSICYmIElTX1dFQUsgJiYgIWlzT2JqZWN0KGEpKSByZXR1cm4gS0VZID09ICdnZXQnID8gdW5kZWZpbmVkIDogZmFsc2U7XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9jW0tFWV0oYSA9PT0gMCA/IDAgOiBhLCBiKTtcbiAgICAgICAgcmV0dXJuIElTX0FEREVSID8gdGhpcyA6IHJlc3VsdDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIElTX1dFQUsgfHwgZFAoQy5wcm90b3R5cGUsICdzaXplJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jLnNpemU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZXRUb1N0cmluZ1RhZyhDLCBOQU1FKTtcblxuICBPW05BTUVdID0gQztcbiAgJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYsIE8pO1xuXG4gIGlmICghSVNfV0VBSykgY29tbW9uLnNldFN0cm9uZyhDLCBOQU1FLCBJU19NQVApO1xuXG4gIHJldHVybiBDO1xufTtcbiIsInZhciBjb3JlID0gbW9kdWxlLmV4cG9ydHMgPSB7IHZlcnNpb246ICcyLjUuNycgfTtcbmlmICh0eXBlb2YgX19lID09ICdudW1iZXInKSBfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBpbmRleCwgdmFsdWUpIHtcbiAgaWYgKGluZGV4IGluIG9iamVjdCkgJGRlZmluZVByb3BlcnR5LmYob2JqZWN0LCBpbmRleCwgY3JlYXRlRGVzYygwLCB2YWx1ZSkpO1xuICBlbHNlIG9iamVjdFtpbmRleF0gPSB2YWx1ZTtcbn07XG4iLCIvLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCwgbGVuZ3RoKSB7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmICh0aGF0ID09PSB1bmRlZmluZWQpIHJldHVybiBmbjtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iLCIvLyA3LjIuMSBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ID09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwiLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBkb2N1bWVudCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50O1xuLy8gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCcgaW4gb2xkIElFXG52YXIgaXMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTtcbiIsIi8vIElFIDgtIGRvbid0IGVudW0gYnVnIGtleXNcbm1vZHVsZS5leHBvcnRzID0gKFxuICAnY29uc3RydWN0b3IsaGFzT3duUHJvcGVydHksaXNQcm90b3R5cGVPZixwcm9wZXJ0eUlzRW51bWVyYWJsZSx0b0xvY2FsZVN0cmluZyx0b1N0cmluZyx2YWx1ZU9mJ1xuKS5zcGxpdCgnLCcpO1xuIiwiLy8gYWxsIGVudW1lcmFibGUgb2JqZWN0IGtleXMsIGluY2x1ZGVzIHN5bWJvbHNcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciBnT1BTID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKTtcbnZhciBwSUUgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgcmVzdWx0ID0gZ2V0S2V5cyhpdCk7XG4gIHZhciBnZXRTeW1ib2xzID0gZ09QUy5mO1xuICBpZiAoZ2V0U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gZ2V0U3ltYm9scyhpdCk7XG4gICAgdmFyIGlzRW51bSA9IHBJRS5mO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChzeW1ib2xzLmxlbmd0aCA+IGkpIGlmIChpc0VudW0uY2FsbChpdCwga2V5ID0gc3ltYm9sc1tpKytdKSkgcmVzdWx0LnB1c2goa2V5KTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbnZhciAkZXhwb3J0ID0gZnVuY3Rpb24gKHR5cGUsIG5hbWUsIHNvdXJjZSkge1xuICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRjtcbiAgdmFyIElTX0dMT0JBTCA9IHR5cGUgJiAkZXhwb3J0Lkc7XG4gIHZhciBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TO1xuICB2YXIgSVNfUFJPVE8gPSB0eXBlICYgJGV4cG9ydC5QO1xuICB2YXIgSVNfQklORCA9IHR5cGUgJiAkZXhwb3J0LkI7XG4gIHZhciBJU19XUkFQID0gdHlwZSAmICRleHBvcnQuVztcbiAgdmFyIGV4cG9ydHMgPSBJU19HTE9CQUwgPyBjb3JlIDogY29yZVtuYW1lXSB8fCAoY29yZVtuYW1lXSA9IHt9KTtcbiAgdmFyIGV4cFByb3RvID0gZXhwb3J0c1tQUk9UT1RZUEVdO1xuICB2YXIgdGFyZ2V0ID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIDogKGdsb2JhbFtuYW1lXSB8fCB7fSlbUFJPVE9UWVBFXTtcbiAgdmFyIGtleSwgb3duLCBvdXQ7XG4gIGlmIChJU19HTE9CQUwpIHNvdXJjZSA9IG5hbWU7XG4gIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgIC8vIGNvbnRhaW5zIGluIG5hdGl2ZVxuICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKG93biAmJiBoYXMoZXhwb3J0cywga2V5KSkgY29udGludWU7XG4gICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBwYXNzZWRcbiAgICBvdXQgPSBvd24gPyB0YXJnZXRba2V5XSA6IHNvdXJjZVtrZXldO1xuICAgIC8vIHByZXZlbnQgZ2xvYmFsIHBvbGx1dGlvbiBmb3IgbmFtZXNwYWNlc1xuICAgIGV4cG9ydHNba2V5XSA9IElTX0dMT0JBTCAmJiB0eXBlb2YgdGFyZ2V0W2tleV0gIT0gJ2Z1bmN0aW9uJyA/IHNvdXJjZVtrZXldXG4gICAgLy8gYmluZCB0aW1lcnMgdG8gZ2xvYmFsIGZvciBjYWxsIGZyb20gZXhwb3J0IGNvbnRleHRcbiAgICA6IElTX0JJTkQgJiYgb3duID8gY3R4KG91dCwgZ2xvYmFsKVxuICAgIC8vIHdyYXAgZ2xvYmFsIGNvbnN0cnVjdG9ycyBmb3IgcHJldmVudCBjaGFuZ2UgdGhlbSBpbiBsaWJyYXJ5XG4gICAgOiBJU19XUkFQICYmIHRhcmdldFtrZXldID09IG91dCA/IChmdW5jdGlvbiAoQykge1xuICAgICAgdmFyIEYgPSBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEMpIHtcbiAgICAgICAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBDKCk7XG4gICAgICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgQyhhKTtcbiAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBDKGEsIGIpO1xuICAgICAgICAgIH0gcmV0dXJuIG5ldyBDKGEsIGIsIGMpO1xuICAgICAgICB9IHJldHVybiBDLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgICAgRltQUk9UT1RZUEVdID0gQ1tQUk9UT1RZUEVdO1xuICAgICAgcmV0dXJuIEY7XG4gICAgLy8gbWFrZSBzdGF0aWMgdmVyc2lvbnMgZm9yIHByb3RvdHlwZSBtZXRob2RzXG4gICAgfSkob3V0KSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuICAgIC8vIGV4cG9ydCBwcm90byBtZXRob2RzIHRvIGNvcmUuJUNPTlNUUlVDVE9SJS5tZXRob2RzLiVOQU1FJVxuICAgIGlmIChJU19QUk9UTykge1xuICAgICAgKGV4cG9ydHMudmlydHVhbCB8fCAoZXhwb3J0cy52aXJ0dWFsID0ge30pKVtrZXldID0gb3V0O1xuICAgICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLnByb3RvdHlwZS4lTkFNRSVcbiAgICAgIGlmICh0eXBlICYgJGV4cG9ydC5SICYmIGV4cFByb3RvICYmICFleHBQcm90b1trZXldKSBoaWRlKGV4cFByb3RvLCBrZXksIG91dCk7XG4gICAgfVxuICB9XG59O1xuLy8gdHlwZSBiaXRtYXBcbiRleHBvcnQuRiA9IDE7ICAgLy8gZm9yY2VkXG4kZXhwb3J0LkcgPSAyOyAgIC8vIGdsb2JhbFxuJGV4cG9ydC5TID0gNDsgICAvLyBzdGF0aWNcbiRleHBvcnQuUCA9IDg7ICAgLy8gcHJvdG9cbiRleHBvcnQuQiA9IDE2OyAgLy8gYmluZFxuJGV4cG9ydC5XID0gMzI7ICAvLyB3cmFwXG4kZXhwb3J0LlUgPSA2NDsgIC8vIHNhZmVcbiRleHBvcnQuUiA9IDEyODsgLy8gcmVhbCBwcm90byBtZXRob2QgZm9yIGBsaWJyYXJ5YFxubW9kdWxlLmV4cG9ydHMgPSAkZXhwb3J0O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuIiwidmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuL19pdGVyLWNhbGwnKTtcbnZhciBpc0FycmF5SXRlciA9IHJlcXVpcmUoJy4vX2lzLWFycmF5LWl0ZXInKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgZ2V0SXRlckZuID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBCUkVBSyA9IHt9O1xudmFyIFJFVFVSTiA9IHt9O1xudmFyIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYWJsZSwgZW50cmllcywgZm4sIHRoYXQsIElURVJBVE9SKSB7XG4gIHZhciBpdGVyRm4gPSBJVEVSQVRPUiA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGl0ZXJhYmxlOyB9IDogZ2V0SXRlckZuKGl0ZXJhYmxlKTtcbiAgdmFyIGYgPSBjdHgoZm4sIHRoYXQsIGVudHJpZXMgPyAyIDogMSk7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsZW5ndGgsIHN0ZXAsIGl0ZXJhdG9yLCByZXN1bHQ7XG4gIGlmICh0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcihpdGVyYWJsZSArICcgaXMgbm90IGl0ZXJhYmxlIScpO1xuICAvLyBmYXN0IGNhc2UgZm9yIGFycmF5cyB3aXRoIGRlZmF1bHQgaXRlcmF0b3JcbiAgaWYgKGlzQXJyYXlJdGVyKGl0ZXJGbikpIGZvciAobGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICByZXN1bHQgPSBlbnRyaWVzID8gZihhbk9iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSkgOiBmKGl0ZXJhYmxlW2luZGV4XSk7XG4gICAgaWYgKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pIHJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSBmb3IgKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoaXRlcmFibGUpOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7KSB7XG4gICAgcmVzdWx0ID0gY2FsbChpdGVyYXRvciwgZiwgc3RlcC52YWx1ZSwgZW50cmllcyk7XG4gICAgaWYgKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5leHBvcnRzLkJSRUFLID0gQlJFQUs7XG5leHBvcnRzLlJFVFVSTiA9IFJFVFVSTjtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG52YXIgZ2xvYmFsID0gbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09IE1hdGhcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT0gTWF0aCA/IHNlbGZcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gIDogRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbmlmICh0eXBlb2YgX19nID09ICdudW1iZXInKSBfX2cgPSBnbG9iYWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiIsInZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07XG4iLCJ2YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICByZXR1cm4gZFAuZihvYmplY3QsIGtleSwgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xufSA6IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iamVjdDtcbn07XG4iLCJ2YXIgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudDtcbm1vZHVsZS5leHBvcnRzID0gZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuIiwibW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdkaXYnKSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcbiIsIi8vIGZhc3QgYXBwbHksIGh0dHA6Ly9qc3BlcmYubG5raXQuY29tL2Zhc3QtYXBwbHkvNVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIGFyZ3MsIHRoYXQpIHtcbiAgdmFyIHVuID0gdGhhdCA9PT0gdW5kZWZpbmVkO1xuICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gdW4gPyBmbigpXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQpO1xuICAgIGNhc2UgMTogcmV0dXJuIHVuID8gZm4oYXJnc1swXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIGNhc2UgNDogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gIH0gcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3MpO1xufTtcbiIsIi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApID8gT2JqZWN0IDogZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBjb2YoaXQpID09ICdTdHJpbmcnID8gaXQuc3BsaXQoJycpIDogT2JqZWN0KGl0KTtcbn07XG4iLCIvLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvW0lURVJBVE9SXSA9PT0gaXQpO1xufTtcbiIsIi8vIDcuMi4yIElzQXJyYXkoYXJndW1lbnQpXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmcpIHtcbiAgcmV0dXJuIGNvZihhcmcpID09ICdBcnJheSc7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG4iLCIvLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIGVudHJpZXMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZW50cmllcyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICAvLyA3LjQuNiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCBjb21wbGV0aW9uKVxuICB9IGNhdGNoIChlKSB7XG4gICAgdmFyIHJldCA9IGl0ZXJhdG9yWydyZXR1cm4nXTtcbiAgICBpZiAocmV0ICE9PSB1bmRlZmluZWQpIGFuT2JqZWN0KHJldC5jYWxsKGl0ZXJhdG9yKSk7XG4gICAgdGhyb3cgZTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgZGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblxuLy8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2hpZGUnKShJdGVyYXRvclByb3RvdHlwZSwgcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyksIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCkge1xuICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHsgbmV4dDogZGVzY3JpcHRvcigxLCBuZXh0KSB9KTtcbiAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIE5BTUUgKyAnIEl0ZXJhdG9yJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIExJQlJBUlkgPSByZXF1aXJlKCcuL19saWJyYXJ5Jyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyICRpdGVyQ3JlYXRlID0gcmVxdWlyZSgnLi9faXRlci1jcmVhdGUnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBCVUdHWSA9ICEoW10ua2V5cyAmJiAnbmV4dCcgaW4gW10ua2V5cygpKTsgLy8gU2FmYXJpIGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxudmFyIEZGX0lURVJBVE9SID0gJ0BAaXRlcmF0b3InO1xudmFyIEtFWVMgPSAna2V5cyc7XG52YXIgVkFMVUVTID0gJ3ZhbHVlcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQmFzZSwgTkFNRSwgQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7XG4gICRpdGVyQ3JlYXRlKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcbiAgdmFyIGdldE1ldGhvZCA9IGZ1bmN0aW9uIChraW5kKSB7XG4gICAgaWYgKCFCVUdHWSAmJiBraW5kIGluIHByb3RvKSByZXR1cm4gcHJvdG9ba2luZF07XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgfSByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgfTtcbiAgdmFyIFRBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJztcbiAgdmFyIERFRl9WQUxVRVMgPSBERUZBVUxUID09IFZBTFVFUztcbiAgdmFyIFZBTFVFU19CVUcgPSBmYWxzZTtcbiAgdmFyIHByb3RvID0gQmFzZS5wcm90b3R5cGU7XG4gIHZhciAkbmF0aXZlID0gcHJvdG9bSVRFUkFUT1JdIHx8IHByb3RvW0ZGX0lURVJBVE9SXSB8fCBERUZBVUxUICYmIHByb3RvW0RFRkFVTFRdO1xuICB2YXIgJGRlZmF1bHQgPSAkbmF0aXZlIHx8IGdldE1ldGhvZChERUZBVUxUKTtcbiAgdmFyICRlbnRyaWVzID0gREVGQVVMVCA/ICFERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoJ2VudHJpZXMnKSA6IHVuZGVmaW5lZDtcbiAgdmFyICRhbnlOYXRpdmUgPSBOQU1FID09ICdBcnJheScgPyBwcm90by5lbnRyaWVzIHx8ICRuYXRpdmUgOiAkbmF0aXZlO1xuICB2YXIgbWV0aG9kcywga2V5LCBJdGVyYXRvclByb3RvdHlwZTtcbiAgLy8gRml4IG5hdGl2ZVxuICBpZiAoJGFueU5hdGl2ZSkge1xuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoJGFueU5hdGl2ZS5jYWxsKG5ldyBCYXNlKCkpKTtcbiAgICBpZiAoSXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgSXRlcmF0b3JQcm90b3R5cGUubmV4dCkge1xuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JQcm90b3R5cGUsIFRBRywgdHJ1ZSk7XG4gICAgICAvLyBmaXggZm9yIHNvbWUgb2xkIGVuZ2luZXNcbiAgICAgIGlmICghTElCUkFSWSAmJiB0eXBlb2YgSXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdICE9ICdmdW5jdGlvbicpIGhpZGUoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbiAgICB9XG4gIH1cbiAgLy8gZml4IEFycmF5I3t2YWx1ZXMsIEBAaXRlcmF0b3J9Lm5hbWUgaW4gVjggLyBGRlxuICBpZiAoREVGX1ZBTFVFUyAmJiAkbmF0aXZlICYmICRuYXRpdmUubmFtZSAhPT0gVkFMVUVTKSB7XG4gICAgVkFMVUVTX0JVRyA9IHRydWU7XG4gICAgJGRlZmF1bHQgPSBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiAkbmF0aXZlLmNhbGwodGhpcyk7IH07XG4gIH1cbiAgLy8gRGVmaW5lIGl0ZXJhdG9yXG4gIGlmICgoIUxJQlJBUlkgfHwgRk9SQ0VEKSAmJiAoQlVHR1kgfHwgVkFMVUVTX0JVRyB8fCAhcHJvdG9bSVRFUkFUT1JdKSkge1xuICAgIGhpZGUocHJvdG8sIElURVJBVE9SLCAkZGVmYXVsdCk7XG4gIH1cbiAgLy8gUGx1ZyBmb3IgbGlicmFyeVxuICBJdGVyYXRvcnNbTkFNRV0gPSAkZGVmYXVsdDtcbiAgSXRlcmF0b3JzW1RBR10gPSByZXR1cm5UaGlzO1xuICBpZiAoREVGQVVMVCkge1xuICAgIG1ldGhvZHMgPSB7XG4gICAgICB2YWx1ZXM6IERFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChWQUxVRVMpLFxuICAgICAga2V5czogSVNfU0VUID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiAkZW50cmllc1xuICAgIH07XG4gICAgaWYgKEZPUkNFRCkgZm9yIChrZXkgaW4gbWV0aG9kcykge1xuICAgICAgaWYgKCEoa2V5IGluIHByb3RvKSkgcmVkZWZpbmUocHJvdG8sIGtleSwgbWV0aG9kc1trZXldKTtcbiAgICB9IGVsc2UgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoQlVHR1kgfHwgVkFMVUVTX0JVRyksIE5BTUUsIG1ldGhvZHMpO1xuICB9XG4gIHJldHVybiBtZXRob2RzO1xufTtcbiIsInZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIFNBRkVfQ0xPU0lORyA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgcml0ZXIgPSBbN11bSVRFUkFUT1JdKCk7XG4gIHJpdGVyWydyZXR1cm4nXSA9IGZ1bmN0aW9uICgpIHsgU0FGRV9DTE9TSU5HID0gdHJ1ZTsgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgQXJyYXkuZnJvbShyaXRlciwgZnVuY3Rpb24gKCkgeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjLCBza2lwQ2xvc2luZykge1xuICBpZiAoIXNraXBDbG9zaW5nICYmICFTQUZFX0NMT1NJTkcpIHJldHVybiBmYWxzZTtcbiAgdmFyIHNhZmUgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gWzddO1xuICAgIHZhciBpdGVyID0gYXJyW0lURVJBVE9SXSgpO1xuICAgIGl0ZXIubmV4dCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHsgZG9uZTogc2FmZSA9IHRydWUgfTsgfTtcbiAgICBhcnJbSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gaXRlcjsgfTtcbiAgICBleGVjKGFycik7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gc2FmZTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChkb25lLCB2YWx1ZSkge1xuICByZXR1cm4geyB2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZSB9O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge307XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHRydWU7XG4iLCJ2YXIgTUVUQSA9IHJlcXVpcmUoJy4vX3VpZCcpKCdtZXRhJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBzZXREZXNjID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBpZCA9IDA7XG52YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZSB8fCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBGUkVFWkUgPSAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBpc0V4dGVuc2libGUoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KSk7XG59KTtcbnZhciBzZXRNZXRhID0gZnVuY3Rpb24gKGl0KSB7XG4gIHNldERlc2MoaXQsIE1FVEEsIHsgdmFsdWU6IHtcbiAgICBpOiAnTycgKyArK2lkLCAvLyBvYmplY3QgSURcbiAgICB3OiB7fSAgICAgICAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IH0pO1xufTtcbnZhciBmYXN0S2V5ID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgLy8gcmV0dXJuIHByaW1pdGl2ZSB3aXRoIHByZWZpeFxuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyA/ICdTJyA6ICdQJykgKyBpdDtcbiAgaWYgKCFoYXMoaXQsIE1FVEEpKSB7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpIHJldHVybiAnRic7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuICdFJztcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGEoaXQpO1xuICAvLyByZXR1cm4gb2JqZWN0IElEXG4gIH0gcmV0dXJuIGl0W01FVEFdLmk7XG59O1xudmFyIGdldFdlYWsgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICBpZiAoIWhhcyhpdCwgTUVUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuIHRydWU7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YShpdCk7XG4gIC8vIHJldHVybiBoYXNoIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gcmV0dXJuIGl0W01FVEFdLnc7XG59O1xuLy8gYWRkIG1ldGFkYXRhIG9uIGZyZWV6ZS1mYW1pbHkgbWV0aG9kcyBjYWxsaW5nXG52YXIgb25GcmVlemUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKEZSRUVaRSAmJiBtZXRhLk5FRUQgJiYgaXNFeHRlbnNpYmxlKGl0KSAmJiAhaGFzKGl0LCBNRVRBKSkgc2V0TWV0YShpdCk7XG4gIHJldHVybiBpdDtcbn07XG52YXIgbWV0YSA9IG1vZHVsZS5leHBvcnRzID0ge1xuICBLRVk6IE1FVEEsXG4gIE5FRUQ6IGZhbHNlLFxuICBmYXN0S2V5OiBmYXN0S2V5LFxuICBnZXRXZWFrOiBnZXRXZWFrLFxuICBvbkZyZWV6ZTogb25GcmVlemVcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgbWFjcm90YXNrID0gcmVxdWlyZSgnLi9fdGFzaycpLnNldDtcbnZhciBPYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBQcm9taXNlID0gZ2xvYmFsLlByb21pc2U7XG52YXIgaXNOb2RlID0gcmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGhlYWQsIGxhc3QsIG5vdGlmeTtcblxuICB2YXIgZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBhcmVudCwgZm47XG4gICAgaWYgKGlzTm9kZSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKSBwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlIChoZWFkKSB7XG4gICAgICBmbiA9IGhlYWQuZm47XG4gICAgICBoZWFkID0gaGVhZC5uZXh0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGhlYWQpIG5vdGlmeSgpO1xuICAgICAgICBlbHNlIGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgIGlmIChwYXJlbnQpIHBhcmVudC5lbnRlcigpO1xuICB9O1xuXG4gIC8vIE5vZGUuanNcbiAgaWYgKGlzTm9kZSkge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICAgIH07XG4gIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlciwgZXhjZXB0IGlPUyBTYWZhcmkgLSBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMzM5XG4gIH0gZWxzZSBpZiAoT2JzZXJ2ZXIgJiYgIShnbG9iYWwubmF2aWdhdG9yICYmIGdsb2JhbC5uYXZpZ2F0b3Iuc3RhbmRhbG9uZSkpIHtcbiAgICB2YXIgdG9nZ2xlID0gdHJ1ZTtcbiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7XG4gICAgfTtcbiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2VcbiAgfSBlbHNlIGlmIChQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSkge1xuICAgIC8vIFByb21pc2UucmVzb2x2ZSB3aXRob3V0IGFuIGFyZ3VtZW50IHRocm93cyBhbiBlcnJvciBpbiBMRyBXZWJPUyAyXG4gICAgdmFyIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9taXNlLnRoZW4oZmx1c2gpO1xuICAgIH07XG4gIC8vIGZvciBvdGhlciBlbnZpcm9ubWVudHMgLSBtYWNyb3Rhc2sgYmFzZWQgb246XG4gIC8vIC0gc2V0SW1tZWRpYXRlXG4gIC8vIC0gTWVzc2FnZUNoYW5uZWxcbiAgLy8gLSB3aW5kb3cucG9zdE1lc3NhZ1xuICAvLyAtIG9ucmVhZHlzdGF0ZWNoYW5nZVxuICAvLyAtIHNldFRpbWVvdXRcbiAgfSBlbHNlIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBzdHJhbmdlIElFICsgd2VicGFjayBkZXYgc2VydmVyIGJ1ZyAtIHVzZSAuY2FsbChnbG9iYWwpXG4gICAgICBtYWNyb3Rhc2suY2FsbChnbG9iYWwsIGZsdXNoKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChmbikge1xuICAgIHZhciB0YXNrID0geyBmbjogZm4sIG5leHQ6IHVuZGVmaW5lZCB9O1xuICAgIGlmIChsYXN0KSBsYXN0Lm5leHQgPSB0YXNrO1xuICAgIGlmICghaGVhZCkge1xuICAgICAgaGVhZCA9IHRhc2s7XG4gICAgICBub3RpZnkoKTtcbiAgICB9IGxhc3QgPSB0YXNrO1xuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIDI1LjQuMS41IE5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xuXG5mdW5jdGlvbiBQcm9taXNlQ2FwYWJpbGl0eShDKSB7XG4gIHZhciByZXNvbHZlLCByZWplY3Q7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBDKGZ1bmN0aW9uICgkJHJlc29sdmUsICQkcmVqZWN0KSB7XG4gICAgaWYgKHJlc29sdmUgIT09IHVuZGVmaW5lZCB8fCByZWplY3QgIT09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ID0gJCRyZWplY3Q7XG4gIH0pO1xuICB0aGlzLnJlc29sdmUgPSBhRnVuY3Rpb24ocmVzb2x2ZSk7XG4gIHRoaXMucmVqZWN0ID0gYUZ1bmN0aW9uKHJlamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiAoQykge1xuICByZXR1cm4gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcbiIsIi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZFBzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwcycpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xudmFyIEVtcHR5ID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnaWZyYW1lJyk7XG4gIHZhciBpID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB2YXIgbHQgPSAnPCc7XG4gIHZhciBndCA9ICc+JztcbiAgdmFyIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVxdWlyZSgnLi9faHRtbCcpLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZS5zcmMgPSAnamF2YXNjcmlwdDonOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNjcmlwdC11cmxcbiAgLy8gY3JlYXRlRGljdCA9IGlmcmFtZS5jb250ZW50V2luZG93Lk9iamVjdDtcbiAgLy8gaHRtbC5yZW1vdmVDaGlsZChpZnJhbWUpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKGx0ICsgJ3NjcmlwdCcgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvc2NyaXB0JyArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlIChpLS0pIGRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbaV1dO1xuICByZXR1cm4gY3JlYXRlRGljdCgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eSgpO1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGRQID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iLCJ2YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykge1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleXMgPSBnZXRLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpID0gMDtcbiAgdmFyIFA7XG4gIHdoaWxlIChsZW5ndGggPiBpKSBkUC5mKE8sIFAgPSBrZXlzW2krK10sIFByb3BlcnRpZXNbUF0pO1xuICByZXR1cm4gTztcbn07XG4iLCJ2YXIgcElFID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuL19pZTgtZG9tLWRlZmluZScpO1xudmFyIGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gZ09QRCA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIE8gPSB0b0lPYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBnT1BEKE8sIFApO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKGhhcyhPLCBQKSkgcmV0dXJuIGNyZWF0ZURlc2MoIXBJRS5mLmNhbGwoTywgUCksIE9bUF0pO1xufTtcbiIsIi8vIGZhbGxiYWNrIGZvciBJRTExIGJ1Z2d5IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHdpdGggaWZyYW1lIGFuZCB3aW5kb3dcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgZ09QTiA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZjtcbnZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG52YXIgd2luZG93TmFtZXMgPSB0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc1xuICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHdpbmRvdykgOiBbXTtcblxudmFyIGdldFdpbmRvd05hbWVzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGdPUE4oaXQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHdpbmRvd05hbWVzLnNsaWNlKCk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KSB7XG4gIHJldHVybiB3aW5kb3dOYW1lcyAmJiB0b1N0cmluZy5jYWxsKGl0KSA9PSAnW29iamVjdCBXaW5kb3ddJyA/IGdldFdpbmRvd05hbWVzKGl0KSA6IGdPUE4odG9JT2JqZWN0KGl0KSk7XG59O1xuIiwiLy8gMTkuMS4yLjcgLyAxNS4yLjMuNCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpLmNvbmNhdCgnbGVuZ3RoJywgJ3Byb3RvdHlwZScpO1xuXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHtcbiAgcmV0dXJuICRrZXlzKE8sIGhpZGRlbktleXMpO1xufTtcbiIsImV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG4iLCIvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiAoTykge1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsO1xufTtcbiIsInZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgYXJyYXlJbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHtcbiAgdmFyIE8gPSB0b0lPYmplY3Qob2JqZWN0KTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIE8pIGlmIChrZXkgIT0gSUVfUFJPVE8pIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiLy8gMTkuMS4yLjE0IC8gMTUuMi4zLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykge1xuICByZXR1cm4gJGtleXMoTywgZW51bUJ1Z0tleXMpO1xufTtcbiIsImV4cG9ydHMuZiA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuIiwiLy8gbW9zdCBPYmplY3QgbWV0aG9kcyBieSBFUzYgc2hvdWxkIGFjY2VwdCBwcmltaXRpdmVzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZLCBleGVjKSB7XG4gIHZhciBmbiA9IChjb3JlLk9iamVjdCB8fCB7fSlbS0VZXSB8fCBPYmplY3RbS0VZXTtcbiAgdmFyIGV4cCA9IHt9O1xuICBleHBbS0VZXSA9IGV4ZWMoZm4pO1xuICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uICgpIHsgZm4oMSk7IH0pLCAnT2JqZWN0JywgZXhwKTtcbn07XG4iLCJ2YXIgJHBhcnNlSW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykucGFyc2VJbnQ7XG52YXIgJHRyaW0gPSByZXF1aXJlKCcuL19zdHJpbmctdHJpbScpLnRyaW07XG52YXIgd3MgPSByZXF1aXJlKCcuL19zdHJpbmctd3MnKTtcbnZhciBoZXggPSAvXlstK10/MFt4WF0vO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICRwYXJzZUludCh3cyArICcwOCcpICE9PSA4IHx8ICRwYXJzZUludCh3cyArICcweDE2JykgIT09IDIyID8gZnVuY3Rpb24gcGFyc2VJbnQoc3RyLCByYWRpeCkge1xuICB2YXIgc3RyaW5nID0gJHRyaW0oU3RyaW5nKHN0ciksIDMpO1xuICByZXR1cm4gJHBhcnNlSW50KHN0cmluZywgKHJhZGl4ID4+PiAwKSB8fCAoaGV4LnRlc3Qoc3RyaW5nKSA/IDE2IDogMTApKTtcbn0gOiAkcGFyc2VJbnQ7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHsgZTogZmFsc2UsIHY6IGV4ZWMoKSB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHsgZTogdHJ1ZSwgdjogZSB9O1xuICB9XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4vX25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQywgeCkge1xuICBhbk9iamVjdChDKTtcbiAgaWYgKGlzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpIHJldHVybiB4O1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKEMpO1xuICB2YXIgcmVzb2x2ZSA9IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmU7XG4gIHJlc29sdmUoeCk7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG4iLCJ2YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc3JjLCBzYWZlKSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICBpZiAoc2FmZSAmJiB0YXJnZXRba2V5XSkgdGFyZ2V0W2tleV0gPSBzcmNba2V5XTtcbiAgICBlbHNlIGhpZGUodGFyZ2V0LCBrZXksIHNyY1trZXldKTtcbiAgfSByZXR1cm4gdGFyZ2V0O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9faGlkZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgZm9yT2YgPSByZXF1aXJlKCcuL19mb3Itb2YnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09MTEVDVElPTikge1xuICAkZXhwb3J0KCRleHBvcnQuUywgQ09MTEVDVElPTiwgeyBmcm9tOiBmdW5jdGlvbiBmcm9tKHNvdXJjZSAvKiAsIG1hcEZuLCB0aGlzQXJnICovKSB7XG4gICAgdmFyIG1hcEZuID0gYXJndW1lbnRzWzFdO1xuICAgIHZhciBtYXBwaW5nLCBBLCBuLCBjYjtcbiAgICBhRnVuY3Rpb24odGhpcyk7XG4gICAgbWFwcGluZyA9IG1hcEZuICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKG1hcHBpbmcpIGFGdW5jdGlvbihtYXBGbik7XG4gICAgaWYgKHNvdXJjZSA9PSB1bmRlZmluZWQpIHJldHVybiBuZXcgdGhpcygpO1xuICAgIEEgPSBbXTtcbiAgICBpZiAobWFwcGluZykge1xuICAgICAgbiA9IDA7XG4gICAgICBjYiA9IGN0eChtYXBGbiwgYXJndW1lbnRzWzJdLCAyKTtcbiAgICAgIGZvck9mKHNvdXJjZSwgZmFsc2UsIGZ1bmN0aW9uIChuZXh0SXRlbSkge1xuICAgICAgICBBLnB1c2goY2IobmV4dEl0ZW0sIG4rKykpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvck9mKHNvdXJjZSwgZmFsc2UsIEEucHVzaCwgQSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgdGhpcyhBKTtcbiAgfSB9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT0xMRUNUSU9OKSB7XG4gICRleHBvcnQoJGV4cG9ydC5TLCBDT0xMRUNUSU9OLCB7IG9mOiBmdW5jdGlvbiBvZigpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgQSA9IG5ldyBBcnJheShsZW5ndGgpO1xuICAgIHdoaWxlIChsZW5ndGgtLSkgQVtsZW5ndGhdID0gYXJndW1lbnRzW2xlbmd0aF07XG4gICAgcmV0dXJuIG5ldyB0aGlzKEEpO1xuICB9IH0pO1xufTtcbiIsIi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLlxuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgY2hlY2sgPSBmdW5jdGlvbiAoTywgcHJvdG8pIHtcbiAgYW5PYmplY3QoTyk7XG4gIGlmICghaXNPYmplY3QocHJvdG8pICYmIHByb3RvICE9PSBudWxsKSB0aHJvdyBUeXBlRXJyb3IocHJvdG8gKyBcIjogY2FuJ3Qgc2V0IGFzIHByb3RvdHlwZSFcIik7XG59O1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICBmdW5jdGlvbiAodGVzdCwgYnVnZ3ksIHNldCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0ID0gcmVxdWlyZSgnLi9fY3R4JykoRnVuY3Rpb24uY2FsbCwgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQsIDIpO1xuICAgICAgICBzZXQodGVzdCwgW10pO1xuICAgICAgICBidWdneSA9ICEodGVzdCBpbnN0YW5jZW9mIEFycmF5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgYnVnZ3kgPSB0cnVlOyB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pIHtcbiAgICAgICAgY2hlY2soTywgcHJvdG8pO1xuICAgICAgICBpZiAoYnVnZ3kpIE8uX19wcm90b19fID0gcHJvdG87XG4gICAgICAgIGVsc2Ugc2V0KE8sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIE87XG4gICAgICB9O1xuICAgIH0oe30sIGZhbHNlKSA6IHVuZGVmaW5lZCksXG4gIGNoZWNrOiBjaGVja1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgdmFyIEMgPSB0eXBlb2YgY29yZVtLRVldID09ICdmdW5jdGlvbicgPyBjb3JlW0tFWV0gOiBnbG9iYWxbS0VZXTtcbiAgaWYgKERFU0NSSVBUT1JTICYmIEMgJiYgIUNbU1BFQ0lFU10pIGRQLmYoQywgU1BFQ0lFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgfSk7XG59O1xuIiwidmFyIGRlZiA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCB0YWcsIHN0YXQpIHtcbiAgaWYgKGl0ICYmICFoYXMoaXQgPSBzdGF0ID8gaXQgOiBpdC5wcm90b3R5cGUsIFRBRykpIGRlZihpdCwgVEFHLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHRhZyB9KTtcbn07XG4iLCJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ2tleXMnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gc2hhcmVkW2tleV0gfHwgKHNoYXJlZFtrZXldID0gdWlkKGtleSkpO1xufTtcbiIsInZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHt9KTtcbn0pKCd2ZXJzaW9ucycsIFtdKS5wdXNoKHtcbiAgdmVyc2lvbjogY29yZS52ZXJzaW9uLFxuICBtb2RlOiByZXF1aXJlKCcuL19saWJyYXJ5JykgPyAncHVyZScgOiAnZ2xvYmFsJyxcbiAgY29weXJpZ2h0OiAnwqkgMjAxOCBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSdcbn0pO1xuIiwiLy8gNy4zLjIwIFNwZWNpZXNDb25zdHJ1Y3RvcihPLCBkZWZhdWx0Q29uc3RydWN0b3IpXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgU1BFQ0lFUyA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBEKSB7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3I7XG4gIHZhciBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IEQgOiBhRnVuY3Rpb24oUyk7XG59O1xuIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuLy8gdHJ1ZSAgLT4gU3RyaW5nI2F0XG4vLyBmYWxzZSAtPiBTdHJpbmcjY29kZVBvaW50QXRcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFRPX1NUUklORykge1xuICByZXR1cm4gZnVuY3Rpb24gKHRoYXQsIHBvcykge1xuICAgIHZhciBzID0gU3RyaW5nKGRlZmluZWQodGhhdCkpO1xuICAgIHZhciBpID0gdG9JbnRlZ2VyKHBvcyk7XG4gICAgdmFyIGwgPSBzLmxlbmd0aDtcbiAgICB2YXIgYSwgYjtcbiAgICBpZiAoaSA8IDAgfHwgaSA+PSBsKSByZXR1cm4gVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgYSA9IHMuY2hhckNvZGVBdChpKTtcbiAgICByZXR1cm4gYSA8IDB4ZDgwMCB8fCBhID4gMHhkYmZmIHx8IGkgKyAxID09PSBsIHx8IChiID0gcy5jaGFyQ29kZUF0KGkgKyAxKSkgPCAweGRjMDAgfHwgYiA+IDB4ZGZmZlxuICAgICAgPyBUT19TVFJJTkcgPyBzLmNoYXJBdChpKSA6IGFcbiAgICAgIDogVE9fU1RSSU5HID8gcy5zbGljZShpLCBpICsgMikgOiAoYSAtIDB4ZDgwMCA8PCAxMCkgKyAoYiAtIDB4ZGMwMCkgKyAweDEwMDAwO1xuICB9O1xufTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgc3BhY2VzID0gcmVxdWlyZSgnLi9fc3RyaW5nLXdzJyk7XG52YXIgc3BhY2UgPSAnWycgKyBzcGFjZXMgKyAnXSc7XG52YXIgbm9uID0gJ1xcdTIwMGJcXHUwMDg1JztcbnZhciBsdHJpbSA9IFJlZ0V4cCgnXicgKyBzcGFjZSArIHNwYWNlICsgJyonKTtcbnZhciBydHJpbSA9IFJlZ0V4cChzcGFjZSArIHNwYWNlICsgJyokJyk7XG5cbnZhciBleHBvcnRlciA9IGZ1bmN0aW9uIChLRVksIGV4ZWMsIEFMSUFTKSB7XG4gIHZhciBleHAgPSB7fTtcbiAgdmFyIEZPUkNFID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIXNwYWNlc1tLRVldKCkgfHwgbm9uW0tFWV0oKSAhPSBub247XG4gIH0pO1xuICB2YXIgZm4gPSBleHBbS0VZXSA9IEZPUkNFID8gZXhlYyh0cmltKSA6IHNwYWNlc1tLRVldO1xuICBpZiAoQUxJQVMpIGV4cFtBTElBU10gPSBmbjtcbiAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBGT1JDRSwgJ1N0cmluZycsIGV4cCk7XG59O1xuXG4vLyAxIC0+IFN0cmluZyN0cmltTGVmdFxuLy8gMiAtPiBTdHJpbmcjdHJpbVJpZ2h0XG4vLyAzIC0+IFN0cmluZyN0cmltXG52YXIgdHJpbSA9IGV4cG9ydGVyLnRyaW0gPSBmdW5jdGlvbiAoc3RyaW5nLCBUWVBFKSB7XG4gIHN0cmluZyA9IFN0cmluZyhkZWZpbmVkKHN0cmluZykpO1xuICBpZiAoVFlQRSAmIDEpIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGx0cmltLCAnJyk7XG4gIGlmIChUWVBFICYgMikgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocnRyaW0sICcnKTtcbiAgcmV0dXJuIHN0cmluZztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0ZXI7XG4iLCJtb2R1bGUuZXhwb3J0cyA9ICdcXHgwOVxceDBBXFx4MEJcXHgwQ1xceDBEXFx4MjBcXHhBMFxcdTE2ODBcXHUxODBFXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwMycgK1xuICAnXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjhcXHUyMDI5XFx1RkVGRic7XG4iLCJ2YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgaW52b2tlID0gcmVxdWlyZSgnLi9faW52b2tlJyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4vX2h0bWwnKTtcbnZhciBjZWwgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIHNldFRhc2sgPSBnbG9iYWwuc2V0SW1tZWRpYXRlO1xudmFyIGNsZWFyVGFzayA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbnZhciBNZXNzYWdlQ2hhbm5lbCA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbDtcbnZhciBEaXNwYXRjaCA9IGdsb2JhbC5EaXNwYXRjaDtcbnZhciBjb3VudGVyID0gMDtcbnZhciBxdWV1ZSA9IHt9O1xudmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xudmFyIGRlZmVyLCBjaGFubmVsLCBwb3J0O1xudmFyIHJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGlkID0gK3RoaXM7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgaWYgKHF1ZXVlLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG52YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgcnVuLmNhbGwoZXZlbnQuZGF0YSk7XG59O1xuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYgKCFzZXRUYXNrIHx8ICFjbGVhclRhc2spIHtcbiAgc2V0VGFzayA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbikge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgdmFyIGkgPSAxO1xuICAgIHdoaWxlIChhcmd1bWVudHMubGVuZ3RoID4gaSkgYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgICBpbnZva2UodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXJUYXNrID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpIHtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYgKHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gU3BoZXJlIChKUyBnYW1lIGVuZ2luZSkgRGlzcGF0Y2ggQVBJXG4gIH0gZWxzZSBpZiAoRGlzcGF0Y2ggJiYgRGlzcGF0Y2gubm93KSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIERpc3BhdGNoLm5vdyhjdHgocnVuLCBpZCwgMSkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgfSBlbHNlIGlmIChNZXNzYWdlQ2hhbm5lbCkge1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyO1xuICAgIGRlZmVyID0gY3R4KHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKGlkICsgJycsICcqJyk7XG4gICAgfTtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmIChPTlJFQURZU1RBVEVDSEFOR0UgaW4gY2VsKCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNlbCgnc2NyaXB0JykpW09OUkVBRFlTVEFURUNIQU5HRV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICAgIHJ1bi5jYWxsKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgc2V0VGltZW91dChjdHgocnVuLCBpZCwgMSksIDApO1xuICAgIH07XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldFRhc2ssXG4gIGNsZWFyOiBjbGVhclRhc2tcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICBpbmRleCA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpO1xufTtcbiIsIi8vIDcuMS40IFRvSW50ZWdlclxudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59O1xuIiwiLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiIsIi8vIDcuMS4xNSBUb0xlbmd0aFxudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuIiwiLy8gNy4xLjEzIFRvT2JqZWN0KGFyZ3VtZW50KVxudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG4iLCIvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUykge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iLCJ2YXIgaWQgPSAwO1xudmFyIHB4ID0gTWF0aC5yYW5kb20oKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBuYXZpZ2F0b3IgPSBnbG9iYWwubmF2aWdhdG9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdmlnYXRvciAmJiBuYXZpZ2F0b3IudXNlckFnZW50IHx8ICcnO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgVFlQRSkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSB8fCBpdC5fdCAhPT0gVFlQRSkgdGhyb3cgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIExJQlJBUlkgPSByZXF1aXJlKCcuL19saWJyYXJ5Jyk7XG52YXIgd2tzRXh0ID0gcmVxdWlyZSgnLi9fd2tzLWV4dCcpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgdmFyICRTeW1ib2wgPSBjb3JlLlN5bWJvbCB8fCAoY29yZS5TeW1ib2wgPSBMSUJSQVJZID8ge30gOiBnbG9iYWwuU3ltYm9sIHx8IHt9KTtcbiAgaWYgKG5hbWUuY2hhckF0KDApICE9ICdfJyAmJiAhKG5hbWUgaW4gJFN5bWJvbCkpIGRlZmluZVByb3BlcnR5KCRTeW1ib2wsIG5hbWUsIHsgdmFsdWU6IHdrc0V4dC5mKG5hbWUpIH0pO1xufTtcbiIsImV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX3drcycpO1xuIiwidmFyIHN0b3JlID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ3drcycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xudmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLlN5bWJvbDtcbnZhciBVU0VfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PSAnZnVuY3Rpb24nO1xuXG52YXIgJGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiBzdG9yZVtuYW1lXSB8fCAoc3RvcmVbbmFtZV0gPVxuICAgIFVTRV9TWU1CT0wgJiYgU3ltYm9sW25hbWVdIHx8IChVU0VfU1lNQk9MID8gU3ltYm9sIDogdWlkKSgnU3ltYm9sLicgKyBuYW1lKSk7XG59O1xuXG4kZXhwb3J0cy5zdG9yZSA9IHN0b3JlO1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29yZScpLmdldEl0ZXJhdG9yTWV0aG9kID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCAhPSB1bmRlZmluZWQpIHJldHVybiBpdFtJVEVSQVRPUl1cbiAgICB8fCBpdFsnQEBpdGVyYXRvciddXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBnZXQgPSByZXF1aXJlKCcuL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb3JlJykuZ2V0SXRlcmF0b3IgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIGl0ZXJGbiA9IGdldChpdCk7XG4gIGlmICh0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGl0ZXJhYmxlIScpO1xuICByZXR1cm4gYW5PYmplY3QoaXRlckZuLmNhbGwoaXQpKTtcbn07XG4iLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb3JlJykuaXNJdGVyYWJsZSA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgTyA9IE9iamVjdChpdCk7XG4gIHJldHVybiBPW0lURVJBVE9SXSAhPT0gdW5kZWZpbmVkXG4gICAgfHwgJ0BAaXRlcmF0b3InIGluIE9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgfHwgSXRlcmF0b3JzLmhhc093blByb3BlcnR5KGNsYXNzb2YoTykpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJyk7XG52YXIgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIGdldEl0ZXJGbiA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24gKGl0ZXIpIHsgQXJyYXkuZnJvbShpdGVyKTsgfSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4yLjEgQXJyYXkuZnJvbShhcnJheUxpa2UsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICBmcm9tOiBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZSAvKiAsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkICovKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdChhcnJheUxpa2UpO1xuICAgIHZhciBDID0gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBBcnJheTtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIG1hcGZuID0gYUxlbiA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGl0ZXJGbiA9IGdldEl0ZXJGbihPKTtcbiAgICB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yO1xuICAgIGlmIChtYXBwaW5nKSBtYXBmbiA9IGN0eChtYXBmbiwgYUxlbiA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQsIDIpO1xuICAgIC8vIGlmIG9iamVjdCBpc24ndCBpdGVyYWJsZSBvciBpdCdzIGFycmF5IHdpdGggZGVmYXVsdCBpdGVyYXRvciAtIHVzZSBzaW1wbGUgY2FzZVxuICAgIGlmIChpdGVyRm4gIT0gdW5kZWZpbmVkICYmICEoQyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcihpdGVyRm4pKSkge1xuICAgICAgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKE8pLCByZXN1bHQgPSBuZXcgQygpOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7IGluZGV4KyspIHtcbiAgICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZyA/IGNhbGwoaXRlcmF0b3IsIG1hcGZuLCBbc3RlcC52YWx1ZSwgaW5kZXhdLCB0cnVlKSA6IHN0ZXAudmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgICBmb3IgKHJlc3VsdCA9IG5ldyBDKGxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQubGVuZ3RoID0gaW5kZXg7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG4iLCIvLyAyMi4xLjIuMiAvIDE1LjQuMy4yIEFycmF5LmlzQXJyYXkoYXJnKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdBcnJheScsIHsgaXNBcnJheTogcmVxdWlyZSgnLi9faXMtYXJyYXknKSB9KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgc3RlcCA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuLy8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGtpbmQgPSB0aGlzLl9rO1xuICB2YXIgaW5kZXggPSB0aGlzLl9pKys7XG4gIGlmICghTyB8fCBpbmRleCA+PSBPLmxlbmd0aCkge1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHN0ZXAoMSk7XG4gIH1cbiAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4gc3RlcCgwLCBpbmRleCk7XG4gIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gc3RlcCgwLCBPW2luZGV4XSk7XG4gIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgc3Ryb25nID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbi1zdHJvbmcnKTtcbnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJy4vX3ZhbGlkYXRlLWNvbGxlY3Rpb24nKTtcbnZhciBNQVAgPSAnTWFwJztcblxuLy8gMjMuMSBNYXAgT2JqZWN0c1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uJykoTUFQLCBmdW5jdGlvbiAoZ2V0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBNYXAoKSB7IHJldHVybiBnZXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwge1xuICAvLyAyMy4xLjMuNiBNYXAucHJvdG90eXBlLmdldChrZXkpXG4gIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgIHZhciBlbnRyeSA9IHN0cm9uZy5nZXRFbnRyeSh2YWxpZGF0ZSh0aGlzLCBNQVApLCBrZXkpO1xuICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeS52O1xuICB9LFxuICAvLyAyMy4xLjMuOSBNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKVxuICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHN0cm9uZy5kZWYodmFsaWRhdGUodGhpcywgTUFQKSwga2V5ID09PSAwID8gMCA6IGtleSwgdmFsdWUpO1xuICB9XG59LCBzdHJvbmcsIHRydWUpO1xuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7IGNyZWF0ZTogcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpIH0pO1xuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbi8vIDE5LjEuMi40IC8gMTUuMi4zLjYgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpLCAnT2JqZWN0JywgeyBkZWZpbmVQcm9wZXJ0eTogcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZiB9KTtcbiIsIi8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSkge1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRvSU9iamVjdChpdCksIGtleSk7XG4gIH07XG59KTtcbiIsIi8vIDE5LjEuMi45IE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgJGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2dldFByb3RvdHlwZU9mJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24gZ2V0UHJvdG90eXBlT2YoaXQpIHtcbiAgICByZXR1cm4gJGdldFByb3RvdHlwZU9mKHRvT2JqZWN0KGl0KSk7XG4gIH07XG59KTtcbiIsIi8vIDE5LjEuMi4xNCBPYmplY3Qua2V5cyhPKVxudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2tleXMnLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBrZXlzKGl0KSB7XG4gICAgcmV0dXJuICRrZXlzKHRvT2JqZWN0KGl0KSk7XG4gIH07XG59KTtcbiIsIi8vIDE5LjEuMy4xOSBPYmplY3Quc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7IHNldFByb3RvdHlwZU9mOiByZXF1aXJlKCcuL19zZXQtcHJvdG8nKS5zZXQgfSk7XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRwYXJzZUludCA9IHJlcXVpcmUoJy4vX3BhcnNlLWludCcpO1xuLy8gMTguMi41IHBhcnNlSW50KHN0cmluZywgcmFkaXgpXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuRiAqIChwYXJzZUludCAhPSAkcGFyc2VJbnQpLCB7IHBhcnNlSW50OiAkcGFyc2VJbnQgfSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciB0YXNrID0gcmVxdWlyZSgnLi9fdGFzaycpLnNldDtcbnZhciBtaWNyb3Rhc2sgPSByZXF1aXJlKCcuL19taWNyb3Rhc2snKSgpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi9fbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuL19wZXJmb3JtJyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi9fdXNlci1hZ2VudCcpO1xudmFyIHByb21pc2VSZXNvbHZlID0gcmVxdWlyZSgnLi9fcHJvbWlzZS1yZXNvbHZlJyk7XG52YXIgUFJPTUlTRSA9ICdQcm9taXNlJztcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciB2ZXJzaW9ucyA9IHByb2Nlc3MgJiYgcHJvY2Vzcy52ZXJzaW9ucztcbnZhciB2OCA9IHZlcnNpb25zICYmIHZlcnNpb25zLnY4IHx8ICcnO1xudmFyICRQcm9taXNlID0gZ2xvYmFsW1BST01JU0VdO1xudmFyIGlzTm9kZSA9IGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xudmFyIGVtcHR5ID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIEludGVybmFsLCBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHksIE93blByb21pc2VDYXBhYmlsaXR5LCBXcmFwcGVyO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZjtcblxudmFyIFVTRV9OQVRJVkUgPSAhIWZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICAvLyBjb3JyZWN0IHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnRcbiAgICB2YXIgcHJvbWlzZSA9ICRQcm9taXNlLnJlc29sdmUoMSk7XG4gICAgdmFyIEZha2VQcm9taXNlID0gKHByb21pc2UuY29uc3RydWN0b3IgPSB7fSlbcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKV0gPSBmdW5jdGlvbiAoZXhlYykge1xuICAgICAgZXhlYyhlbXB0eSwgZW1wdHkpO1xuICAgIH07XG4gICAgLy8gdW5oYW5kbGVkIHJlamVjdGlvbnMgdHJhY2tpbmcgc3VwcG9ydCwgTm9kZUpTIFByb21pc2Ugd2l0aG91dCBpdCBmYWlscyBAQHNwZWNpZXMgdGVzdFxuICAgIHJldHVybiAoaXNOb2RlIHx8IHR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQgPT0gJ2Z1bmN0aW9uJylcbiAgICAgICYmIHByb21pc2UudGhlbihlbXB0eSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZVxuICAgICAgLy8gdjggNi42IChOb2RlIDEwIGFuZCBDaHJvbWUgNjYpIGhhdmUgYSBidWcgd2l0aCByZXNvbHZpbmcgY3VzdG9tIHRoZW5hYmxlc1xuICAgICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9ODMwNTY1XG4gICAgICAvLyB3ZSBjYW4ndCBkZXRlY3QgaXQgc3luY2hyb25vdXNseSwgc28ganVzdCBjaGVjayB2ZXJzaW9uc1xuICAgICAgJiYgdjguaW5kZXhPZignNi42JykgIT09IDBcbiAgICAgICYmIHVzZXJBZ2VudC5pbmRleE9mKCdDaHJvbWUvNjYnKSA9PT0gLTE7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxufSgpO1xuXG4vLyBoZWxwZXJzXG52YXIgaXNUaGVuYWJsZSA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiB0eXBlb2YgKHRoZW4gPSBpdC50aGVuKSA9PSAnZnVuY3Rpb24nID8gdGhlbiA6IGZhbHNlO1xufTtcbnZhciBub3RpZnkgPSBmdW5jdGlvbiAocHJvbWlzZSwgaXNSZWplY3QpIHtcbiAgaWYgKHByb21pc2UuX24pIHJldHVybjtcbiAgcHJvbWlzZS5fbiA9IHRydWU7XG4gIHZhciBjaGFpbiA9IHByb21pc2UuX2M7XG4gIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdjtcbiAgICB2YXIgb2sgPSBwcm9taXNlLl9zID09IDE7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBydW4gPSBmdW5jdGlvbiAocmVhY3Rpb24pIHtcbiAgICAgIHZhciBoYW5kbGVyID0gb2sgPyByZWFjdGlvbi5vayA6IHJlYWN0aW9uLmZhaWw7XG4gICAgICB2YXIgcmVzb2x2ZSA9IHJlYWN0aW9uLnJlc29sdmU7XG4gICAgICB2YXIgcmVqZWN0ID0gcmVhY3Rpb24ucmVqZWN0O1xuICAgICAgdmFyIGRvbWFpbiA9IHJlYWN0aW9uLmRvbWFpbjtcbiAgICAgIHZhciByZXN1bHQsIHRoZW4sIGV4aXRlZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgaWYgKCFvaykge1xuICAgICAgICAgICAgaWYgKHByb21pc2UuX2ggPT0gMikgb25IYW5kbGVVbmhhbmRsZWQocHJvbWlzZSk7XG4gICAgICAgICAgICBwcm9taXNlLl9oID0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhbmRsZXIgPT09IHRydWUpIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRvbWFpbikgZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTsgLy8gbWF5IHRocm93XG4gICAgICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgICAgIGRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgICAgIGV4aXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHJlYWN0aW9uLnByb21pc2UpIHtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgICAgICB0aGVuLmNhbGwocmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSByZWplY3QodmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZG9tYWluICYmICFleGl0ZWQpIGRvbWFpbi5leGl0KCk7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdoaWxlIChjaGFpbi5sZW5ndGggPiBpKSBydW4oY2hhaW5baSsrXSk7IC8vIHZhcmlhYmxlIGxlbmd0aCAtIGNhbid0IHVzZSBmb3JFYWNoXG4gICAgcHJvbWlzZS5fYyA9IFtdO1xuICAgIHByb21pc2UuX24gPSBmYWxzZTtcbiAgICBpZiAoaXNSZWplY3QgJiYgIXByb21pc2UuX2gpIG9uVW5oYW5kbGVkKHByb21pc2UpO1xuICB9KTtcbn07XG52YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdjtcbiAgICB2YXIgdW5oYW5kbGVkID0gaXNVbmhhbmRsZWQocHJvbWlzZSk7XG4gICAgdmFyIHJlc3VsdCwgaGFuZGxlciwgY29uc29sZTtcbiAgICBpZiAodW5oYW5kbGVkKSB7XG4gICAgICByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGlzTm9kZSkge1xuICAgICAgICAgIHByb2Nlc3MuZW1pdCgndW5oYW5kbGVkUmVqZWN0aW9uJywgdmFsdWUsIHByb21pc2UpO1xuICAgICAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPSBnbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb24pIHtcbiAgICAgICAgICBoYW5kbGVyKHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiB2YWx1ZSB9KTtcbiAgICAgICAgfSBlbHNlIGlmICgoY29uc29sZSA9IGdsb2JhbC5jb25zb2xlKSAmJiBjb25zb2xlLmVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIEJyb3dzZXJzIHNob3VsZCBub3QgdHJpZ2dlciBgcmVqZWN0aW9uSGFuZGxlZGAgZXZlbnQgaWYgaXQgd2FzIGhhbmRsZWQgaGVyZSwgTm9kZUpTIC0gc2hvdWxkXG4gICAgICBwcm9taXNlLl9oID0gaXNOb2RlIHx8IGlzVW5oYW5kbGVkKHByb21pc2UpID8gMiA6IDE7XG4gICAgfSBwcm9taXNlLl9hID0gdW5kZWZpbmVkO1xuICAgIGlmICh1bmhhbmRsZWQgJiYgcmVzdWx0LmUpIHRocm93IHJlc3VsdC52O1xuICB9KTtcbn07XG52YXIgaXNVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICByZXR1cm4gcHJvbWlzZS5faCAhPT0gMSAmJiAocHJvbWlzZS5fYSB8fCBwcm9taXNlLl9jKS5sZW5ndGggPT09IDA7XG59O1xudmFyIG9uSGFuZGxlVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBoYW5kbGVyO1xuICAgIGlmIChpc05vZGUpIHtcbiAgICAgIHByb2Nlc3MuZW1pdCgncmVqZWN0aW9uSGFuZGxlZCcsIHByb21pc2UpO1xuICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9IGdsb2JhbC5vbnJlamVjdGlvbmhhbmRsZWQpIHtcbiAgICAgIGhhbmRsZXIoeyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHByb21pc2UuX3YgfSk7XG4gICAgfVxuICB9KTtcbn07XG52YXIgJHJlamVjdCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgcHJvbWlzZSA9IHRoaXM7XG4gIGlmIChwcm9taXNlLl9kKSByZXR1cm47XG4gIHByb21pc2UuX2QgPSB0cnVlO1xuICBwcm9taXNlID0gcHJvbWlzZS5fdyB8fCBwcm9taXNlOyAvLyB1bndyYXBcbiAgcHJvbWlzZS5fdiA9IHZhbHVlO1xuICBwcm9taXNlLl9zID0gMjtcbiAgaWYgKCFwcm9taXNlLl9hKSBwcm9taXNlLl9hID0gcHJvbWlzZS5fYy5zbGljZSgpO1xuICBub3RpZnkocHJvbWlzZSwgdHJ1ZSk7XG59O1xudmFyICRyZXNvbHZlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgdmFyIHRoZW47XG4gIGlmIChwcm9taXNlLl9kKSByZXR1cm47XG4gIHByb21pc2UuX2QgPSB0cnVlO1xuICBwcm9taXNlID0gcHJvbWlzZS5fdyB8fCBwcm9taXNlOyAvLyB1bndyYXBcbiAgdHJ5IHtcbiAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHRocm93IFR5cGVFcnJvcihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIGlmICh0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSkpIHtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3cmFwcGVyID0geyBfdzogcHJvbWlzZSwgX2Q6IGZhbHNlIH07IC8vIHdyYXBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsIGN0eCgkcmVzb2x2ZSwgd3JhcHBlciwgMSksIGN0eCgkcmVqZWN0LCB3cmFwcGVyLCAxKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAkcmVqZWN0LmNhbGwod3JhcHBlciwgZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9taXNlLl92ID0gdmFsdWU7XG4gICAgICBwcm9taXNlLl9zID0gMTtcbiAgICAgIG5vdGlmeShwcm9taXNlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgJHJlamVjdC5jYWxsKHsgX3c6IHByb21pc2UsIF9kOiBmYWxzZSB9LCBlKTsgLy8gd3JhcFxuICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RvciBwb2x5ZmlsbFxuaWYgKCFVU0VfTkFUSVZFKSB7XG4gIC8vIDI1LjQuMy4xIFByb21pc2UoZXhlY3V0b3IpXG4gICRQcm9taXNlID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIGFuSW5zdGFuY2UodGhpcywgJFByb21pc2UsIFBST01JU0UsICdfaCcpO1xuICAgIGFGdW5jdGlvbihleGVjdXRvcik7XG4gICAgSW50ZXJuYWwuY2FsbCh0aGlzKTtcbiAgICB0cnkge1xuICAgICAgZXhlY3V0b3IoY3R4KCRyZXNvbHZlLCB0aGlzLCAxKSwgY3R4KCRyZWplY3QsIHRoaXMsIDEpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICRyZWplY3QuY2FsbCh0aGlzLCBlcnIpO1xuICAgIH1cbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIEludGVybmFsID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIHRoaXMuX2MgPSBbXTsgICAgICAgICAgICAgLy8gPC0gYXdhaXRpbmcgcmVhY3Rpb25zXG4gICAgdGhpcy5fYSA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSBjaGVja2VkIGluIGlzVW5oYW5kbGVkIHJlYWN0aW9uc1xuICAgIHRoaXMuX3MgPSAwOyAgICAgICAgICAgICAgLy8gPC0gc3RhdGVcbiAgICB0aGlzLl9kID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIGRvbmVcbiAgICB0aGlzLl92ID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIHZhbHVlXG4gICAgdGhpcy5faCA9IDA7ICAgICAgICAgICAgICAvLyA8LSByZWplY3Rpb24gc3RhdGUsIDAgLSBkZWZhdWx0LCAxIC0gaGFuZGxlZCwgMiAtIHVuaGFuZGxlZFxuICAgIHRoaXMuX24gPSBmYWxzZTsgICAgICAgICAgLy8gPC0gbm90aWZ5XG4gIH07XG4gIEludGVybmFsLnByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpKCRQcm9taXNlLnByb3RvdHlwZSwge1xuICAgIC8vIDI1LjQuNS4zIFByb21pc2UucHJvdG90eXBlLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpXG4gICAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgdmFyIHJlYWN0aW9uID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsICRQcm9taXNlKSk7XG4gICAgICByZWFjdGlvbi5vayA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PSAnZnVuY3Rpb24nID8gb25GdWxmaWxsZWQgOiB0cnVlO1xuICAgICAgcmVhY3Rpb24uZmFpbCA9IHR5cGVvZiBvblJlamVjdGVkID09ICdmdW5jdGlvbicgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IGlzTm9kZSA/IHByb2Nlc3MuZG9tYWluIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fYy5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmICh0aGlzLl9hKSB0aGlzLl9hLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHRoaXMuX3MpIG5vdGlmeSh0aGlzLCBmYWxzZSk7XG4gICAgICByZXR1cm4gcmVhY3Rpb24ucHJvbWlzZTtcbiAgICB9LFxuICAgIC8vIDI1LjQuNS4xIFByb21pc2UucHJvdG90eXBlLmNhdGNoKG9uUmVqZWN0ZWQpXG4gICAgJ2NhdGNoJzogZnVuY3Rpb24gKG9uUmVqZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcbiAgICB9XG4gIH0pO1xuICBPd25Qcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBJbnRlcm5hbCgpO1xuICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgdGhpcy5yZXNvbHZlID0gY3R4KCRyZXNvbHZlLCBwcm9taXNlLCAxKTtcbiAgICB0aGlzLnJlamVjdCA9IGN0eCgkcmVqZWN0LCBwcm9taXNlLCAxKTtcbiAgfTtcbiAgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgICByZXR1cm4gQyA9PT0gJFByb21pc2UgfHwgQyA9PT0gV3JhcHBlclxuICAgICAgPyBuZXcgT3duUHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgIDogbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICB9O1xufVxuXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCB7IFByb21pc2U6ICRQcm9taXNlIH0pO1xucmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKSgkUHJvbWlzZSwgUFJPTUlTRSk7XG5yZXF1aXJlKCcuL19zZXQtc3BlY2llcycpKFBST01JU0UpO1xuV3JhcHBlciA9IHJlcXVpcmUoJy4vX2NvcmUnKVtQUk9NSVNFXTtcblxuLy8gc3RhdGljc1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNSBQcm9taXNlLnJlamVjdChyKVxuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKSB7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKTtcbiAgICB2YXIgJCRyZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICAkJHJlamVjdChyKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKExJQlJBUlkgfHwgIVVTRV9OQVRJVkUpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC42IFByb21pc2UucmVzb2x2ZSh4KVxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHgpIHtcbiAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoTElCUkFSWSAmJiB0aGlzID09PSBXcmFwcGVyID8gJFByb21pc2UgOiB0aGlzLCB4KTtcbiAgfVxufSk7XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoVVNFX05BVElWRSAmJiByZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpKGZ1bmN0aW9uIChpdGVyKSB7XG4gICRQcm9taXNlLmFsbChpdGVyKVsnY2F0Y2gnXShlbXB0eSk7XG59KSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjEgUHJvbWlzZS5hbGwoaXRlcmFibGUpXG4gIGFsbDogZnVuY3Rpb24gYWxsKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlc29sdmUgPSBjYXBhYmlsaXR5LnJlc29sdmU7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyICRpbmRleCA9IGluZGV4Kys7XG4gICAgICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHZhbHVlcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBDLnJlc29sdmUocHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1skaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lKSByZWplY3QocmVzdWx0LnYpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH0sXG4gIC8vIDI1LjQuNC40IFByb21pc2UucmFjZShpdGVyYWJsZSlcbiAgcmFjZTogZnVuY3Rpb24gcmFjZShpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZSkgcmVqZWN0KHJlc3VsdC52KTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBzdHJvbmcgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uLXN0cm9uZycpO1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIFNFVCA9ICdTZXQnO1xuXG4vLyAyMy4yIFNldCBPYmplY3RzXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24nKShTRVQsIGZ1bmN0aW9uIChnZXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFNldCgpIHsgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCB7XG4gIC8vIDIzLjIuMy4xIFNldC5wcm90b3R5cGUuYWRkKHZhbHVlKVxuICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICAgIHJldHVybiBzdHJvbmcuZGVmKHZhbGlkYXRlKHRoaXMsIFNFVCksIHZhbHVlID0gdmFsdWUgPT09IDAgPyAwIDogdmFsdWUsIHZhbHVlKTtcbiAgfVxufSwgc3Ryb25nKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkYXQgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKSh0cnVlKTtcblxuLy8gMjEuMS4zLjI3IFN0cmluZy5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKShTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbiAoaXRlcmF0ZWQpIHtcbiAgdGhpcy5fdCA9IFN0cmluZyhpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuLy8gMjEuMS41LjIuMSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgTyA9IHRoaXMuX3Q7XG4gIHZhciBpbmRleCA9IHRoaXMuX2k7XG4gIHZhciBwb2ludDtcbiAgaWYgKGluZGV4ID49IE8ubGVuZ3RoKSByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIHBvaW50ID0gJGF0KE8sIGluZGV4KTtcbiAgdGhpcy5faSArPSBwb2ludC5sZW5ndGg7XG4gIHJldHVybiB7IHZhbHVlOiBwb2ludCwgZG9uZTogZmFsc2UgfTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gRUNNQVNjcmlwdCA2IHN5bWJvbHMgc2hpbVxudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIE1FVEEgPSByZXF1aXJlKCcuL19tZXRhJykuS0VZO1xudmFyICRmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi9fc2hhcmVkJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xudmFyIHdrcyA9IHJlcXVpcmUoJy4vX3drcycpO1xudmFyIHdrc0V4dCA9IHJlcXVpcmUoJy4vX3drcy1leHQnKTtcbnZhciB3a3NEZWZpbmUgPSByZXF1aXJlKCcuL193a3MtZGVmaW5lJyk7XG52YXIgZW51bUtleXMgPSByZXF1aXJlKCcuL19lbnVtLWtleXMnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9faXMtYXJyYXknKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbnZhciBfY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xudmFyIGdPUE5FeHQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbi1leHQnKTtcbnZhciAkR09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG52YXIgJERQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIGdPUEQgPSAkR09QRC5mO1xudmFyIGRQID0gJERQLmY7XG52YXIgZ09QTiA9IGdPUE5FeHQuZjtcbnZhciAkU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciAkSlNPTiA9IGdsb2JhbC5KU09OO1xudmFyIF9zdHJpbmdpZnkgPSAkSlNPTiAmJiAkSlNPTi5zdHJpbmdpZnk7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG52YXIgSElEREVOID0gd2tzKCdfaGlkZGVuJyk7XG52YXIgVE9fUFJJTUlUSVZFID0gd2tzKCd0b1ByaW1pdGl2ZScpO1xudmFyIGlzRW51bSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIFN5bWJvbFJlZ2lzdHJ5ID0gc2hhcmVkKCdzeW1ib2wtcmVnaXN0cnknKTtcbnZhciBBbGxTeW1ib2xzID0gc2hhcmVkKCdzeW1ib2xzJyk7XG52YXIgT1BTeW1ib2xzID0gc2hhcmVkKCdvcC1zeW1ib2xzJyk7XG52YXIgT2JqZWN0UHJvdG8gPSBPYmplY3RbUFJPVE9UWVBFXTtcbnZhciBVU0VfTkFUSVZFID0gdHlwZW9mICRTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcbnZhciBRT2JqZWN0ID0gZ2xvYmFsLlFPYmplY3Q7XG4vLyBEb24ndCB1c2Ugc2V0dGVycyBpbiBRdCBTY3JpcHQsIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8xNzNcbnZhciBzZXR0ZXIgPSAhUU9iamVjdCB8fCAhUU9iamVjdFtQUk9UT1RZUEVdIHx8ICFRT2JqZWN0W1BST1RPVFlQRV0uZmluZENoaWxkO1xuXG4vLyBmYWxsYmFjayBmb3Igb2xkIEFuZHJvaWQsIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD02ODdcbnZhciBzZXRTeW1ib2xEZXNjID0gREVTQ1JJUFRPUlMgJiYgJGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIF9jcmVhdGUoZFAoe30sICdhJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZFAodGhpcywgJ2EnLCB7IHZhbHVlOiA3IH0pLmE7IH1cbiAgfSkpLmEgIT0gNztcbn0pID8gZnVuY3Rpb24gKGl0LCBrZXksIEQpIHtcbiAgdmFyIHByb3RvRGVzYyA9IGdPUEQoT2JqZWN0UHJvdG8sIGtleSk7XG4gIGlmIChwcm90b0Rlc2MpIGRlbGV0ZSBPYmplY3RQcm90b1trZXldO1xuICBkUChpdCwga2V5LCBEKTtcbiAgaWYgKHByb3RvRGVzYyAmJiBpdCAhPT0gT2JqZWN0UHJvdG8pIGRQKE9iamVjdFByb3RvLCBrZXksIHByb3RvRGVzYyk7XG59IDogZFA7XG5cbnZhciB3cmFwID0gZnVuY3Rpb24gKHRhZykge1xuICB2YXIgc3ltID0gQWxsU3ltYm9sc1t0YWddID0gX2NyZWF0ZSgkU3ltYm9sW1BST1RPVFlQRV0pO1xuICBzeW0uX2sgPSB0YWc7XG4gIHJldHVybiBzeW07XG59O1xuXG52YXIgaXNTeW1ib2wgPSBVU0VfTkFUSVZFICYmIHR5cGVvZiAkU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnID8gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCc7XG59IDogZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCBpbnN0YW5jZW9mICRTeW1ib2w7XG59O1xuXG52YXIgJGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgRCkge1xuICBpZiAoaXQgPT09IE9iamVjdFByb3RvKSAkZGVmaW5lUHJvcGVydHkoT1BTeW1ib2xzLCBrZXksIEQpO1xuICBhbk9iamVjdChpdCk7XG4gIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEQpO1xuICBpZiAoaGFzKEFsbFN5bWJvbHMsIGtleSkpIHtcbiAgICBpZiAoIUQuZW51bWVyYWJsZSkge1xuICAgICAgaWYgKCFoYXMoaXQsIEhJRERFTikpIGRQKGl0LCBISURERU4sIGNyZWF0ZURlc2MoMSwge30pKTtcbiAgICAgIGl0W0hJRERFTl1ba2V5XSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSBpdFtISURERU5dW2tleV0gPSBmYWxzZTtcbiAgICAgIEQgPSBfY3JlYXRlKEQsIHsgZW51bWVyYWJsZTogY3JlYXRlRGVzYygwLCBmYWxzZSkgfSk7XG4gICAgfSByZXR1cm4gc2V0U3ltYm9sRGVzYyhpdCwga2V5LCBEKTtcbiAgfSByZXR1cm4gZFAoaXQsIGtleSwgRCk7XG59O1xudmFyICRkZWZpbmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhpdCwgUCkge1xuICBhbk9iamVjdChpdCk7XG4gIHZhciBrZXlzID0gZW51bUtleXMoUCA9IHRvSU9iamVjdChQKSk7XG4gIHZhciBpID0gMDtcbiAgdmFyIGwgPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKGwgPiBpKSAkZGVmaW5lUHJvcGVydHkoaXQsIGtleSA9IGtleXNbaSsrXSwgUFtrZXldKTtcbiAgcmV0dXJuIGl0O1xufTtcbnZhciAkY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGl0LCBQKSB7XG4gIHJldHVybiBQID09PSB1bmRlZmluZWQgPyBfY3JlYXRlKGl0KSA6ICRkZWZpbmVQcm9wZXJ0aWVzKF9jcmVhdGUoaXQpLCBQKTtcbn07XG52YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoa2V5KSB7XG4gIHZhciBFID0gaXNFbnVtLmNhbGwodGhpcywga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKSk7XG4gIGlmICh0aGlzID09PSBPYmplY3RQcm90byAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9QU3ltYm9scywga2V5KSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gRSB8fCAhaGFzKHRoaXMsIGtleSkgfHwgIWhhcyhBbGxTeW1ib2xzLCBrZXkpIHx8IGhhcyh0aGlzLCBISURERU4pICYmIHRoaXNbSElEREVOXVtrZXldID8gRSA6IHRydWU7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSkge1xuICBpdCA9IHRvSU9iamVjdChpdCk7XG4gIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSk7XG4gIGlmIChpdCA9PT0gT2JqZWN0UHJvdG8gJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhPUFN5bWJvbHMsIGtleSkpIHJldHVybjtcbiAgdmFyIEQgPSBnT1BEKGl0LCBrZXkpO1xuICBpZiAoRCAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pKSBELmVudW1lcmFibGUgPSB0cnVlO1xuICByZXR1cm4gRDtcbn07XG52YXIgJGdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KSB7XG4gIHZhciBuYW1lcyA9IGdPUE4odG9JT2JqZWN0KGl0KSk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGkgPSAwO1xuICB2YXIga2V5O1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkge1xuICAgIGlmICghaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pICYmIGtleSAhPSBISURERU4gJiYga2V5ICE9IE1FVEEpIHJlc3VsdC5wdXNoKGtleSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgJGdldE93blByb3BlcnR5U3ltYm9scyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhpdCkge1xuICB2YXIgSVNfT1AgPSBpdCA9PT0gT2JqZWN0UHJvdG87XG4gIHZhciBuYW1lcyA9IGdPUE4oSVNfT1AgPyBPUFN5bWJvbHMgOiB0b0lPYmplY3QoaXQpKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgaSA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSB7XG4gICAgaWYgKGhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiAoSVNfT1AgPyBoYXMoT2JqZWN0UHJvdG8sIGtleSkgOiB0cnVlKSkgcmVzdWx0LnB1c2goQWxsU3ltYm9sc1trZXldKTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gMTkuNC4xLjEgU3ltYm9sKFtkZXNjcmlwdGlvbl0pXG5pZiAoIVVTRV9OQVRJVkUpIHtcbiAgJFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbCgpIHtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mICRTeW1ib2wpIHRocm93IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yIScpO1xuICAgIHZhciB0YWcgPSB1aWQoYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpO1xuICAgIHZhciAkc2V0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAodGhpcyA9PT0gT2JqZWN0UHJvdG8pICRzZXQuY2FsbChPUFN5bWJvbHMsIHZhbHVlKTtcbiAgICAgIGlmIChoYXModGhpcywgSElEREVOKSAmJiBoYXModGhpc1tISURERU5dLCB0YWcpKSB0aGlzW0hJRERFTl1bdGFnXSA9IGZhbHNlO1xuICAgICAgc2V0U3ltYm9sRGVzYyh0aGlzLCB0YWcsIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbiAgICB9O1xuICAgIGlmIChERVNDUklQVE9SUyAmJiBzZXR0ZXIpIHNldFN5bWJvbERlc2MoT2JqZWN0UHJvdG8sIHRhZywgeyBjb25maWd1cmFibGU6IHRydWUsIHNldDogJHNldCB9KTtcbiAgICByZXR1cm4gd3JhcCh0YWcpO1xuICB9O1xuICByZWRlZmluZSgkU3ltYm9sW1BST1RPVFlQRV0sICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9rO1xuICB9KTtcblxuICAkR09QRC5mID0gJGdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgJERQLmYgPSAkZGVmaW5lUHJvcGVydHk7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZiA9IGdPUE5FeHQuZiA9ICRnZXRPd25Qcm9wZXJ0eU5hbWVzO1xuICByZXF1aXJlKCcuL19vYmplY3QtcGllJykuZiA9ICRwcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKS5mID0gJGdldE93blByb3BlcnR5U3ltYm9scztcblxuICBpZiAoREVTQ1JJUFRPUlMgJiYgIXJlcXVpcmUoJy4vX2xpYnJhcnknKSkge1xuICAgIHJlZGVmaW5lKE9iamVjdFByb3RvLCAncHJvcGVydHlJc0VudW1lcmFibGUnLCAkcHJvcGVydHlJc0VudW1lcmFibGUsIHRydWUpO1xuICB9XG5cbiAgd2tzRXh0LmYgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiB3cmFwKHdrcyhuYW1lKSk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHsgU3ltYm9sOiAkU3ltYm9sIH0pO1xuXG5mb3IgKHZhciBlczZTeW1ib2xzID0gKFxuICAvLyAxOS40LjIuMiwgMTkuNC4yLjMsIDE5LjQuMi40LCAxOS40LjIuNiwgMTkuNC4yLjgsIDE5LjQuMi45LCAxOS40LjIuMTAsIDE5LjQuMi4xMSwgMTkuNC4yLjEyLCAxOS40LjIuMTMsIDE5LjQuMi4xNFxuICAnaGFzSW5zdGFuY2UsaXNDb25jYXRTcHJlYWRhYmxlLGl0ZXJhdG9yLG1hdGNoLHJlcGxhY2Usc2VhcmNoLHNwZWNpZXMsc3BsaXQsdG9QcmltaXRpdmUsdG9TdHJpbmdUYWcsdW5zY29wYWJsZXMnXG4pLnNwbGl0KCcsJyksIGogPSAwOyBlczZTeW1ib2xzLmxlbmd0aCA+IGo7KXdrcyhlczZTeW1ib2xzW2orK10pO1xuXG5mb3IgKHZhciB3ZWxsS25vd25TeW1ib2xzID0gJGtleXMod2tzLnN0b3JlKSwgayA9IDA7IHdlbGxLbm93blN5bWJvbHMubGVuZ3RoID4gazspIHdrc0RlZmluZSh3ZWxsS25vd25TeW1ib2xzW2srK10pO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCAnU3ltYm9sJywge1xuICAvLyAxOS40LjIuMSBTeW1ib2wuZm9yKGtleSlcbiAgJ2Zvcic6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gaGFzKFN5bWJvbFJlZ2lzdHJ5LCBrZXkgKz0gJycpXG4gICAgICA/IFN5bWJvbFJlZ2lzdHJ5W2tleV1cbiAgICAgIDogU3ltYm9sUmVnaXN0cnlba2V5XSA9ICRTeW1ib2woa2V5KTtcbiAgfSxcbiAgLy8gMTkuNC4yLjUgU3ltYm9sLmtleUZvcihzeW0pXG4gIGtleUZvcjogZnVuY3Rpb24ga2V5Rm9yKHN5bSkge1xuICAgIGlmICghaXNTeW1ib2woc3ltKSkgdGhyb3cgVHlwZUVycm9yKHN5bSArICcgaXMgbm90IGEgc3ltYm9sIScpO1xuICAgIGZvciAodmFyIGtleSBpbiBTeW1ib2xSZWdpc3RyeSkgaWYgKFN5bWJvbFJlZ2lzdHJ5W2tleV0gPT09IHN5bSkgcmV0dXJuIGtleTtcbiAgfSxcbiAgdXNlU2V0dGVyOiBmdW5jdGlvbiAoKSB7IHNldHRlciA9IHRydWU7IH0sXG4gIHVzZVNpbXBsZTogZnVuY3Rpb24gKCkgeyBzZXR0ZXIgPSBmYWxzZTsgfVxufSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdPYmplY3QnLCB7XG4gIC8vIDE5LjEuMi4yIE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbiAgY3JlYXRlOiAkY3JlYXRlLFxuICAvLyAxOS4xLjIuNCBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcbiAgZGVmaW5lUHJvcGVydHk6ICRkZWZpbmVQcm9wZXJ0eSxcbiAgLy8gMTkuMS4yLjMgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcylcbiAgZGVmaW5lUHJvcGVydGllczogJGRlZmluZVByb3BlcnRpZXMsXG4gIC8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICAvLyAxOS4xLjIuNyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxuICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiAkZ2V0T3duUHJvcGVydHlOYW1lcyxcbiAgLy8gMTkuMS4yLjggT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhPKVxuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcbn0pO1xuXG4vLyAyNC4zLjIgSlNPTi5zdHJpbmdpZnkodmFsdWUgWywgcmVwbGFjZXIgWywgc3BhY2VdXSlcbiRKU09OICYmICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKCFVU0VfTkFUSVZFIHx8ICRmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBTID0gJFN5bWJvbCgpO1xuICAvLyBNUyBFZGdlIGNvbnZlcnRzIHN5bWJvbCB2YWx1ZXMgdG8gSlNPTiBhcyB7fVxuICAvLyBXZWJLaXQgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIG51bGxcbiAgLy8gVjggdGhyb3dzIG9uIGJveGVkIHN5bWJvbHNcbiAgcmV0dXJuIF9zdHJpbmdpZnkoW1NdKSAhPSAnW251bGxdJyB8fCBfc3RyaW5naWZ5KHsgYTogUyB9KSAhPSAne30nIHx8IF9zdHJpbmdpZnkoT2JqZWN0KFMpKSAhPSAne30nO1xufSkpLCAnSlNPTicsIHtcbiAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQpIHtcbiAgICB2YXIgYXJncyA9IFtpdF07XG4gICAgdmFyIGkgPSAxO1xuICAgIHZhciByZXBsYWNlciwgJHJlcGxhY2VyO1xuICAgIHdoaWxlIChhcmd1bWVudHMubGVuZ3RoID4gaSkgYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICAkcmVwbGFjZXIgPSByZXBsYWNlciA9IGFyZ3NbMV07XG4gICAgaWYgKCFpc09iamVjdChyZXBsYWNlcikgJiYgaXQgPT09IHVuZGVmaW5lZCB8fCBpc1N5bWJvbChpdCkpIHJldHVybjsgLy8gSUU4IHJldHVybnMgc3RyaW5nIG9uIHVuZGVmaW5lZFxuICAgIGlmICghaXNBcnJheShyZXBsYWNlcikpIHJlcGxhY2VyID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgJHJlcGxhY2VyID09ICdmdW5jdGlvbicpIHZhbHVlID0gJHJlcGxhY2VyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICBpZiAoIWlzU3ltYm9sKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgYXJnc1sxXSA9IHJlcGxhY2VyO1xuICAgIHJldHVybiBfc3RyaW5naWZ5LmFwcGx5KCRKU09OLCBhcmdzKTtcbiAgfVxufSk7XG5cbi8vIDE5LjQuMy40IFN5bWJvbC5wcm90b3R5cGVbQEB0b1ByaW1pdGl2ZV0oaGludClcbiRTeW1ib2xbUFJPVE9UWVBFXVtUT19QUklNSVRJVkVdIHx8IHJlcXVpcmUoJy4vX2hpZGUnKSgkU3ltYm9sW1BST1RPVFlQRV0sIFRPX1BSSU1JVElWRSwgJFN5bWJvbFtQUk9UT1RZUEVdLnZhbHVlT2YpO1xuLy8gMTkuNC4zLjUgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXVxuc2V0VG9TdHJpbmdUYWcoJFN5bWJvbCwgJ1N5bWJvbCcpO1xuLy8gMjAuMi4xLjkgTWF0aFtAQHRvU3RyaW5nVGFnXVxuc2V0VG9TdHJpbmdUYWcoTWF0aCwgJ01hdGgnLCB0cnVlKTtcbi8vIDI0LjMuMyBKU09OW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZyhnbG9iYWwuSlNPTiwgJ0pTT04nLCB0cnVlKTtcbiIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLW1hcC5mcm9tXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1mcm9tJykoJ01hcCcpO1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtbWFwLm9mXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1vZicpKCdNYXAnKTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EYXZpZEJydWFudC9NYXAtU2V0LnByb3RvdHlwZS50b0pTT05cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5SLCAnTWFwJywgeyB0b0pTT046IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tdG8tanNvbicpKCdNYXAnKSB9KTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXByb21pc2UtZmluYWxseVxuJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4vX3Byb21pc2UtcmVzb2x2ZScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuUiwgJ1Byb21pc2UnLCB7ICdmaW5hbGx5JzogZnVuY3Rpb24gKG9uRmluYWxseSkge1xuICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBjb3JlLlByb21pc2UgfHwgZ2xvYmFsLlByb21pc2UpO1xuICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiBvbkZpbmFsbHkgPT0gJ2Z1bmN0aW9uJztcbiAgcmV0dXJuIHRoaXMudGhlbihcbiAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB4OyB9KTtcbiAgICB9IDogb25GaW5hbGx5LFxuICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgdGhyb3cgZTsgfSk7XG4gICAgfSA6IG9uRmluYWxseVxuICApO1xufSB9KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXByb21pc2UtdHJ5XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi9fbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuL19wZXJmb3JtJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUHJvbWlzZScsIHsgJ3RyeSc6IGZ1bmN0aW9uIChjYWxsYmFja2ZuKSB7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYodGhpcyk7XG4gIHZhciByZXN1bHQgPSBwZXJmb3JtKGNhbGxiYWNrZm4pO1xuICAocmVzdWx0LmUgPyBwcm9taXNlQ2FwYWJpbGl0eS5yZWplY3QgOiBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlKShyZXN1bHQudik7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufSB9KTtcbiIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLXNldC5mcm9tXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1mcm9tJykoJ1NldCcpO1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtc2V0Lm9mXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1vZicpKCdTZXQnKTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EYXZpZEJydWFudC9NYXAtU2V0LnByb3RvdHlwZS50b0pTT05cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5SLCAnU2V0JywgeyB0b0pTT046IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tdG8tanNvbicpKCdTZXQnKSB9KTtcbiIsInJlcXVpcmUoJy4vX3drcy1kZWZpbmUnKSgnYXN5bmNJdGVyYXRvcicpO1xuIiwicmVxdWlyZSgnLi9fd2tzLWRlZmluZScpKCdvYnNlcnZhYmxlJyk7XG4iLCJyZXF1aXJlKCcuL2VzNi5hcnJheS5pdGVyYXRvcicpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgVE9fU1RSSU5HX1RBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG52YXIgRE9NSXRlcmFibGVzID0gKCdDU1NSdWxlTGlzdCxDU1NTdHlsZURlY2xhcmF0aW9uLENTU1ZhbHVlTGlzdCxDbGllbnRSZWN0TGlzdCxET01SZWN0TGlzdCxET01TdHJpbmdMaXN0LCcgK1xuICAnRE9NVG9rZW5MaXN0LERhdGFUcmFuc2Zlckl0ZW1MaXN0LEZpbGVMaXN0LEhUTUxBbGxDb2xsZWN0aW9uLEhUTUxDb2xsZWN0aW9uLEhUTUxGb3JtRWxlbWVudCxIVE1MU2VsZWN0RWxlbWVudCwnICtcbiAgJ01lZGlhTGlzdCxNaW1lVHlwZUFycmF5LE5hbWVkTm9kZU1hcCxOb2RlTGlzdCxQYWludFJlcXVlc3RMaXN0LFBsdWdpbixQbHVnaW5BcnJheSxTVkdMZW5ndGhMaXN0LFNWR051bWJlckxpc3QsJyArXG4gICdTVkdQYXRoU2VnTGlzdCxTVkdQb2ludExpc3QsU1ZHU3RyaW5nTGlzdCxTVkdUcmFuc2Zvcm1MaXN0LFNvdXJjZUJ1ZmZlckxpc3QsU3R5bGVTaGVldExpc3QsVGV4dFRyYWNrQ3VlTGlzdCwnICtcbiAgJ1RleHRUcmFja0xpc3QsVG91Y2hMaXN0Jykuc3BsaXQoJywnKTtcblxuZm9yICh2YXIgaSA9IDA7IGkgPCBET01JdGVyYWJsZXMubGVuZ3RoOyBpKyspIHtcbiAgdmFyIE5BTUUgPSBET01JdGVyYWJsZXNbaV07XG4gIHZhciBDb2xsZWN0aW9uID0gZ2xvYmFsW05BTUVdO1xuICB2YXIgcHJvdG8gPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlO1xuICBpZiAocHJvdG8gJiYgIXByb3RvW1RPX1NUUklOR19UQUddKSBoaWRlKHByb3RvLCBUT19TVFJJTkdfVEFHLCBOQU1FKTtcbiAgSXRlcmF0b3JzW05BTUVdID0gSXRlcmF0b3JzLkFycmF5O1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwiLy8gMjIuMS4zLjMxIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXVxudmFyIFVOU0NPUEFCTEVTID0gcmVxdWlyZSgnLi9fd2tzJykoJ3Vuc2NvcGFibGVzJyk7XG52YXIgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcbmlmIChBcnJheVByb3RvW1VOU0NPUEFCTEVTXSA9PSB1bmRlZmluZWQpIHJlcXVpcmUoJy4vX2hpZGUnKShBcnJheVByb3RvLCBVTlNDT1BBQkxFUywge30pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIEFycmF5UHJvdG9bVU5TQ09QQUJMRVNdW2tleV0gPSB0cnVlO1xufTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsIi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSU9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSB7XG4gICAgICBpZiAoT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59O1xuIiwidmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHsgdmVyc2lvbjogJzIuNS43JyB9O1xuaWYgKHR5cGVvZiBfX2UgPT0gJ251bWJlcicpIF9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiIsIi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0LCBsZW5ndGgpIHtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uIChhKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoLyogLi4uYXJncyAqLykge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsIi8vIDcuMi4xIFJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07XG4iLCIvLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBpcyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpcyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59O1xuIiwiLy8gSUUgOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSAoXG4gICdjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YnXG4pLnNwbGl0KCcsJyk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxudmFyICRleHBvcnQgPSBmdW5jdGlvbiAodHlwZSwgbmFtZSwgc291cmNlKSB7XG4gIHZhciBJU19GT1JDRUQgPSB0eXBlICYgJGV4cG9ydC5GO1xuICB2YXIgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuRztcbiAgdmFyIElTX1NUQVRJQyA9IHR5cGUgJiAkZXhwb3J0LlM7XG4gIHZhciBJU19QUk9UTyA9IHR5cGUgJiAkZXhwb3J0LlA7XG4gIHZhciBJU19CSU5EID0gdHlwZSAmICRleHBvcnQuQjtcbiAgdmFyIHRhcmdldCA9IElTX0dMT0JBTCA/IGdsb2JhbCA6IElTX1NUQVRJQyA/IGdsb2JhbFtuYW1lXSB8fCAoZ2xvYmFsW25hbWVdID0ge30pIDogKGdsb2JhbFtuYW1lXSB8fCB7fSlbUFJPVE9UWVBFXTtcbiAgdmFyIGV4cG9ydHMgPSBJU19HTE9CQUwgPyBjb3JlIDogY29yZVtuYW1lXSB8fCAoY29yZVtuYW1lXSA9IHt9KTtcbiAgdmFyIGV4cFByb3RvID0gZXhwb3J0c1tQUk9UT1RZUEVdIHx8IChleHBvcnRzW1BST1RPVFlQRV0gPSB7fSk7XG4gIHZhciBrZXksIG93biwgb3V0LCBleHA7XG4gIGlmIChJU19HTE9CQUwpIHNvdXJjZSA9IG5hbWU7XG4gIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgIC8vIGNvbnRhaW5zIGluIG5hdGl2ZVxuICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBwYXNzZWRcbiAgICBvdXQgPSAob3duID8gdGFyZ2V0IDogc291cmNlKVtrZXldO1xuICAgIC8vIGJpbmQgdGltZXJzIHRvIGdsb2JhbCBmb3IgY2FsbCBmcm9tIGV4cG9ydCBjb250ZXh0XG4gICAgZXhwID0gSVNfQklORCAmJiBvd24gPyBjdHgob3V0LCBnbG9iYWwpIDogSVNfUFJPVE8gJiYgdHlwZW9mIG91dCA9PSAnZnVuY3Rpb24nID8gY3R4KEZ1bmN0aW9uLmNhbGwsIG91dCkgOiBvdXQ7XG4gICAgLy8gZXh0ZW5kIGdsb2JhbFxuICAgIGlmICh0YXJnZXQpIHJlZGVmaW5lKHRhcmdldCwga2V5LCBvdXQsIHR5cGUgJiAkZXhwb3J0LlUpO1xuICAgIC8vIGV4cG9ydFxuICAgIGlmIChleHBvcnRzW2tleV0gIT0gb3V0KSBoaWRlKGV4cG9ydHMsIGtleSwgZXhwKTtcbiAgICBpZiAoSVNfUFJPVE8gJiYgZXhwUHJvdG9ba2V5XSAhPSBvdXQpIGV4cFByb3RvW2tleV0gPSBvdXQ7XG4gIH1cbn07XG5nbG9iYWwuY29yZSA9IGNvcmU7XG4vLyB0eXBlIGJpdG1hcFxuJGV4cG9ydC5GID0gMTsgICAvLyBmb3JjZWRcbiRleHBvcnQuRyA9IDI7ICAgLy8gZ2xvYmFsXG4kZXhwb3J0LlMgPSA0OyAgIC8vIHN0YXRpY1xuJGV4cG9ydC5QID0gODsgICAvLyBwcm90b1xuJGV4cG9ydC5CID0gMTY7ICAvLyBiaW5kXG4kZXhwb3J0LlcgPSAzMjsgIC8vIHdyYXBcbiRleHBvcnQuVSA9IDY0OyAgLy8gc2FmZVxuJGV4cG9ydC5SID0gMTI4OyAvLyByZWFsIHByb3RvIG1ldGhvZCBmb3IgYGxpYnJhcnlgXG5tb2R1bGUuZXhwb3J0cyA9ICRleHBvcnQ7XG4iLCJ2YXIgTUFUQ0ggPSByZXF1aXJlKCcuL193a3MnKSgnbWF0Y2gnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEtFWSkge1xuICB2YXIgcmUgPSAvLi87XG4gIHRyeSB7XG4gICAgJy8uLydbS0VZXShyZSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0cnkge1xuICAgICAgcmVbTUFUQ0hdID0gZmFsc2U7XG4gICAgICByZXR1cm4gIScvLi8nW0tFWV0ocmUpO1xuICAgIH0gY2F0Y2ggKGYpIHsgLyogZW1wdHkgKi8gfVxuICB9IHJldHVybiB0cnVlO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbnZhciB3a3MgPSByZXF1aXJlKCcuL193a3MnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZLCBsZW5ndGgsIGV4ZWMpIHtcbiAgdmFyIFNZTUJPTCA9IHdrcyhLRVkpO1xuICB2YXIgZm5zID0gZXhlYyhkZWZpbmVkLCBTWU1CT0wsICcnW0tFWV0pO1xuICB2YXIgc3RyZm4gPSBmbnNbMF07XG4gIHZhciByeGZuID0gZm5zWzFdO1xuICBpZiAoZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHZhciBPID0ge307XG4gICAgT1tTWU1CT0xdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfTtcbiAgICByZXR1cm4gJydbS0VZXShPKSAhPSA3O1xuICB9KSkge1xuICAgIHJlZGVmaW5lKFN0cmluZy5wcm90b3R5cGUsIEtFWSwgc3RyZm4pO1xuICAgIGhpZGUoUmVnRXhwLnByb3RvdHlwZSwgU1lNQk9MLCBsZW5ndGggPT0gMlxuICAgICAgLy8gMjEuMi41LjggUmVnRXhwLnByb3RvdHlwZVtAQHJlcGxhY2VdKHN0cmluZywgcmVwbGFjZVZhbHVlKVxuICAgICAgLy8gMjEuMi41LjExIFJlZ0V4cC5wcm90b3R5cGVbQEBzcGxpdF0oc3RyaW5nLCBsaW1pdClcbiAgICAgID8gZnVuY3Rpb24gKHN0cmluZywgYXJnKSB7IHJldHVybiByeGZuLmNhbGwoc3RyaW5nLCB0aGlzLCBhcmcpOyB9XG4gICAgICAvLyAyMS4yLjUuNiBSZWdFeHAucHJvdG90eXBlW0BAbWF0Y2hdKHN0cmluZylcbiAgICAgIC8vIDIxLjIuNS45IFJlZ0V4cC5wcm90b3R5cGVbQEBzZWFyY2hdKHN0cmluZylcbiAgICAgIDogZnVuY3Rpb24gKHN0cmluZykgeyByZXR1cm4gcnhmbi5jYWxsKHN0cmluZywgdGhpcyk7IH1cbiAgICApO1xuICB9XG59O1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbnZhciBnbG9iYWwgPSBtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lk1hdGggPT0gTWF0aFxuICA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuaWYgKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpIF9fZyA9IGdsb2JhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuIiwidmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xufTtcbiIsInZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkUC5mKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcbiIsInZhciBkb2N1bWVudCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50O1xubW9kdWxlLmV4cG9ydHMgPSBkb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4iLCJtb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2RpdicpLCAnYScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pLmEgIT0gNztcbn0pO1xuIiwiLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59O1xuIiwiLy8gNy4yLjggSXNSZWdFeHAoYXJndW1lbnQpXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbnZhciBNQVRDSCA9IHJlcXVpcmUoJy4vX3drcycpKCdtYXRjaCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIGlzUmVnRXhwO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmICgoaXNSZWdFeHAgPSBpdFtNQVRDSF0pICE9PSB1bmRlZmluZWQgPyAhIWlzUmVnRXhwIDogY29mKGl0KSA9PSAnUmVnRXhwJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciBkZXNjcmlwdG9yID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faGlkZScpKEl0ZXJhdG9yUHJvdG90eXBlLCByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7XG4gIENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBkZXNjcmlwdG9yKDEsIG5leHQpIH0pO1xuICBzZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgTkFNRSArICcgSXRlcmF0b3InKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgJGl0ZXJDcmVhdGUgPSByZXF1aXJlKCcuL19pdGVyLWNyZWF0ZScpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIEJVR0dZID0gIShbXS5rZXlzICYmICduZXh0JyBpbiBbXS5rZXlzKCkpOyAvLyBTYWZhcmkgaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG52YXIgRkZfSVRFUkFUT1IgPSAnQEBpdGVyYXRvcic7XG52YXIgS0VZUyA9ICdrZXlzJztcbnZhciBWQUxVRVMgPSAndmFsdWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChCYXNlLCBOQU1FLCBDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpIHtcbiAgJGl0ZXJDcmVhdGUoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpO1xuICB2YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24gKGtpbmQpIHtcbiAgICBpZiAoIUJVR0dZICYmIGtpbmQgaW4gcHJvdG8pIHJldHVybiBwcm90b1traW5kXTtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICB9IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICB9O1xuICB2YXIgVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgREVGX1ZBTFVFUyA9IERFRkFVTFQgPT0gVkFMVUVTO1xuICB2YXIgVkFMVUVTX0JVRyA9IGZhbHNlO1xuICB2YXIgcHJvdG8gPSBCYXNlLnByb3RvdHlwZTtcbiAgdmFyICRuYXRpdmUgPSBwcm90b1tJVEVSQVRPUl0gfHwgcHJvdG9bRkZfSVRFUkFUT1JdIHx8IERFRkFVTFQgJiYgcHJvdG9bREVGQVVMVF07XG4gIHZhciAkZGVmYXVsdCA9ICRuYXRpdmUgfHwgZ2V0TWV0aG9kKERFRkFVTFQpO1xuICB2YXIgJGVudHJpZXMgPSBERUZBVUxUID8gIURFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZCgnZW50cmllcycpIDogdW5kZWZpbmVkO1xuICB2YXIgJGFueU5hdGl2ZSA9IE5BTUUgPT0gJ0FycmF5JyA/IHByb3RvLmVudHJpZXMgfHwgJG5hdGl2ZSA6ICRuYXRpdmU7XG4gIHZhciBtZXRob2RzLCBrZXksIEl0ZXJhdG9yUHJvdG90eXBlO1xuICAvLyBGaXggbmF0aXZlXG4gIGlmICgkYW55TmF0aXZlKSB7XG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZigkYW55TmF0aXZlLmNhbGwobmV3IEJhc2UoKSkpO1xuICAgIGlmIChJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBJdGVyYXRvclByb3RvdHlwZS5uZXh0KSB7XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvclByb3RvdHlwZSwgVEFHLCB0cnVlKTtcbiAgICAgIC8vIGZpeCBmb3Igc29tZSBvbGQgZW5naW5lc1xuICAgICAgaWYgKCFMSUJSQVJZICYmIHR5cGVvZiBJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0gIT0gJ2Z1bmN0aW9uJykgaGlkZShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgIH1cbiAgfVxuICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGXG4gIGlmIChERUZfVkFMVUVTICYmICRuYXRpdmUgJiYgJG5hdGl2ZS5uYW1lICE9PSBWQUxVRVMpIHtcbiAgICBWQUxVRVNfQlVHID0gdHJ1ZTtcbiAgICAkZGVmYXVsdCA9IGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuICRuYXRpdmUuY2FsbCh0aGlzKTsgfTtcbiAgfVxuICAvLyBEZWZpbmUgaXRlcmF0b3JcbiAgaWYgKCghTElCUkFSWSB8fCBGT1JDRUQpICYmIChCVUdHWSB8fCBWQUxVRVNfQlVHIHx8ICFwcm90b1tJVEVSQVRPUl0pKSB7XG4gICAgaGlkZShwcm90bywgSVRFUkFUT1IsICRkZWZhdWx0KTtcbiAgfVxuICAvLyBQbHVnIGZvciBsaWJyYXJ5XG4gIEl0ZXJhdG9yc1tOQU1FXSA9ICRkZWZhdWx0O1xuICBJdGVyYXRvcnNbVEFHXSA9IHJldHVyblRoaXM7XG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChLRVlTKSxcbiAgICAgIGVudHJpZXM6ICRlbnRyaWVzXG4gICAgfTtcbiAgICBpZiAoRk9SQ0VEKSBmb3IgKGtleSBpbiBtZXRob2RzKSB7XG4gICAgICBpZiAoIShrZXkgaW4gcHJvdG8pKSByZWRlZmluZShwcm90bywga2V5LCBtZXRob2RzW2tleV0pO1xuICAgIH0gZWxzZSAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChCVUdHWSB8fCBWQUxVRVNfQlVHKSwgTkFNRSwgbWV0aG9kcyk7XG4gIH1cbiAgcmV0dXJuIG1ldGhvZHM7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZG9uZSwgdmFsdWUpIHtcbiAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiAhIWRvbmUgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcbiIsIi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZFBzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwcycpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xudmFyIEVtcHR5ID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnaWZyYW1lJyk7XG4gIHZhciBpID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB2YXIgbHQgPSAnPCc7XG4gIHZhciBndCA9ICc+JztcbiAgdmFyIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVxdWlyZSgnLi9faHRtbCcpLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZS5zcmMgPSAnamF2YXNjcmlwdDonOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNjcmlwdC11cmxcbiAgLy8gY3JlYXRlRGljdCA9IGlmcmFtZS5jb250ZW50V2luZG93Lk9iamVjdDtcbiAgLy8gaHRtbC5yZW1vdmVDaGlsZChpZnJhbWUpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKGx0ICsgJ3NjcmlwdCcgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvc2NyaXB0JyArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlIChpLS0pIGRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbaV1dO1xuICByZXR1cm4gY3JlYXRlRGljdCgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eSgpO1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGRQID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iLCJ2YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykge1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleXMgPSBnZXRLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpID0gMDtcbiAgdmFyIFA7XG4gIHdoaWxlIChsZW5ndGggPiBpKSBkUC5mKE8sIFAgPSBrZXlzW2krK10sIFByb3BlcnRpZXNbUF0pO1xuICByZXR1cm4gTztcbn07XG4iLCIvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiAoTykge1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsO1xufTtcbiIsInZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgYXJyYXlJbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHtcbiAgdmFyIE8gPSB0b0lPYmplY3Qob2JqZWN0KTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIE8pIGlmIChrZXkgIT0gSUVfUFJPVE8pIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiLy8gMTkuMS4yLjE0IC8gMTUuMi4zLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykge1xuICByZXR1cm4gJGtleXMoTywgZW51bUJ1Z0tleXMpO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBTUkMgPSByZXF1aXJlKCcuL191aWQnKSgnc3JjJyk7XG52YXIgVE9fU1RSSU5HID0gJ3RvU3RyaW5nJztcbnZhciAkdG9TdHJpbmcgPSBGdW5jdGlvbltUT19TVFJJTkddO1xudmFyIFRQTCA9ICgnJyArICR0b1N0cmluZykuc3BsaXQoVE9fU1RSSU5HKTtcblxucmVxdWlyZSgnLi9fY29yZScpLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuICR0b1N0cmluZy5jYWxsKGl0KTtcbn07XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBrZXksIHZhbCwgc2FmZSkge1xuICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiB2YWwgPT0gJ2Z1bmN0aW9uJztcbiAgaWYgKGlzRnVuY3Rpb24pIGhhcyh2YWwsICduYW1lJykgfHwgaGlkZSh2YWwsICduYW1lJywga2V5KTtcbiAgaWYgKE9ba2V5XSA9PT0gdmFsKSByZXR1cm47XG4gIGlmIChpc0Z1bmN0aW9uKSBoYXModmFsLCBTUkMpIHx8IGhpZGUodmFsLCBTUkMsIE9ba2V5XSA/ICcnICsgT1trZXldIDogVFBMLmpvaW4oU3RyaW5nKGtleSkpKTtcbiAgaWYgKE8gPT09IGdsb2JhbCkge1xuICAgIE9ba2V5XSA9IHZhbDtcbiAgfSBlbHNlIGlmICghc2FmZSkge1xuICAgIGRlbGV0ZSBPW2tleV07XG4gICAgaGlkZShPLCBrZXksIHZhbCk7XG4gIH0gZWxzZSBpZiAoT1trZXldKSB7XG4gICAgT1trZXldID0gdmFsO1xuICB9IGVsc2Uge1xuICAgIGhpZGUoTywga2V5LCB2YWwpO1xuICB9XG4vLyBhZGQgZmFrZSBGdW5jdGlvbiN0b1N0cmluZyBmb3IgY29ycmVjdCB3b3JrIHdyYXBwZWQgbWV0aG9kcyAvIGNvbnN0cnVjdG9ycyB3aXRoIG1ldGhvZHMgbGlrZSBMb0Rhc2ggaXNOYXRpdmVcbn0pKEZ1bmN0aW9uLnByb3RvdHlwZSwgVE9fU1RSSU5HLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgJiYgdGhpc1tTUkNdIHx8ICR0b1N0cmluZy5jYWxsKHRoaXMpO1xufSk7XG4iLCJ2YXIgZGVmID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIHRhZywgc3RhdCkge1xuICBpZiAoaXQgJiYgIWhhcyhpdCA9IHN0YXQgPyBpdCA6IGl0LnByb3RvdHlwZSwgVEFHKSkgZGVmKGl0LCBUQUcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdGFnIH0pO1xufTtcbiIsInZhciBzaGFyZWQgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgna2V5cycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBzaGFyZWRba2V5XSB8fCAoc2hhcmVkW2tleV0gPSB1aWQoa2V5KSk7XG59O1xuIiwidmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXyc7XG52YXIgc3RvcmUgPSBnbG9iYWxbU0hBUkVEXSB8fCAoZ2xvYmFsW1NIQVJFRF0gPSB7fSk7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pO1xufSkoJ3ZlcnNpb25zJywgW10pLnB1c2goe1xuICB2ZXJzaW9uOiBjb3JlLnZlcnNpb24sXG4gIG1vZGU6IHJlcXVpcmUoJy4vX2xpYnJhcnknKSA/ICdwdXJlJyA6ICdnbG9iYWwnLFxuICBjb3B5cmlnaHQ6ICfCqSAyMDE4IERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpJ1xufSk7XG4iLCIvLyBoZWxwZXIgZm9yIFN0cmluZyN7c3RhcnRzV2l0aCwgZW5kc1dpdGgsIGluY2x1ZGVzfVxudmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi9faXMtcmVnZXhwJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGhhdCwgc2VhcmNoU3RyaW5nLCBOQU1FKSB7XG4gIGlmIChpc1JlZ0V4cChzZWFyY2hTdHJpbmcpKSB0aHJvdyBUeXBlRXJyb3IoJ1N0cmluZyMnICsgTkFNRSArIFwiIGRvZXNuJ3QgYWNjZXB0IHJlZ2V4IVwiKTtcbiAgcmV0dXJuIFN0cmluZyhkZWZpbmVkKHRoYXQpKTtcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICBpbmRleCA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpO1xufTtcbiIsIi8vIDcuMS40IFRvSW50ZWdlclxudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59O1xuIiwiLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiIsIi8vIDcuMS4xNSBUb0xlbmd0aFxudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuIiwiLy8gNy4xLjEzIFRvT2JqZWN0KGFyZ3VtZW50KVxudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG4iLCIvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUykge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iLCJ2YXIgaWQgPSAwO1xudmFyIHB4ID0gTWF0aC5yYW5kb20oKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTtcbiIsInZhciBzdG9yZSA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCd3a3MnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbnZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5TeW1ib2w7XG52YXIgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblxudmFyICRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTtcblxuJGV4cG9ydHMuc3RvcmUgPSBzdG9yZTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgc3RlcCA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuLy8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGtpbmQgPSB0aGlzLl9rO1xuICB2YXIgaW5kZXggPSB0aGlzLl9pKys7XG4gIGlmICghTyB8fCBpbmRleCA+PSBPLmxlbmd0aCkge1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHN0ZXAoMSk7XG4gIH1cbiAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4gc3RlcCgwLCBpbmRleCk7XG4gIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gc3RlcCgwLCBPW2luZGV4XSk7XG4gIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7XG4iLCIvLyBAQHJlcGxhY2UgbG9naWNcbnJlcXVpcmUoJy4vX2ZpeC1yZS13a3MnKSgncmVwbGFjZScsIDIsIGZ1bmN0aW9uIChkZWZpbmVkLCBSRVBMQUNFLCAkcmVwbGFjZSkge1xuICAvLyAyMS4xLjMuMTQgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpXG4gIHJldHVybiBbZnVuY3Rpb24gcmVwbGFjZShzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuICAgIHZhciBPID0gZGVmaW5lZCh0aGlzKTtcbiAgICB2YXIgZm4gPSBzZWFyY2hWYWx1ZSA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzZWFyY2hWYWx1ZVtSRVBMQUNFXTtcbiAgICByZXR1cm4gZm4gIT09IHVuZGVmaW5lZFxuICAgICAgPyBmbi5jYWxsKHNlYXJjaFZhbHVlLCBPLCByZXBsYWNlVmFsdWUpXG4gICAgICA6ICRyZXBsYWNlLmNhbGwoU3RyaW5nKE8pLCBzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKTtcbiAgfSwgJHJlcGxhY2VdO1xufSk7XG4iLCIvLyBAQHNwbGl0IGxvZ2ljXG5yZXF1aXJlKCcuL19maXgtcmUtd2tzJykoJ3NwbGl0JywgMiwgZnVuY3Rpb24gKGRlZmluZWQsIFNQTElULCAkc3BsaXQpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICB2YXIgaXNSZWdFeHAgPSByZXF1aXJlKCcuL19pcy1yZWdleHAnKTtcbiAgdmFyIF9zcGxpdCA9ICRzcGxpdDtcbiAgdmFyICRwdXNoID0gW10ucHVzaDtcbiAgdmFyICRTUExJVCA9ICdzcGxpdCc7XG4gIHZhciBMRU5HVEggPSAnbGVuZ3RoJztcbiAgdmFyIExBU1RfSU5ERVggPSAnbGFzdEluZGV4JztcbiAgaWYgKFxuICAgICdhYmJjJ1skU1BMSVRdKC8oYikqLylbMV0gPT0gJ2MnIHx8XG4gICAgJ3Rlc3QnWyRTUExJVF0oLyg/OikvLCAtMSlbTEVOR1RIXSAhPSA0IHx8XG4gICAgJ2FiJ1skU1BMSVRdKC8oPzphYikqLylbTEVOR1RIXSAhPSAyIHx8XG4gICAgJy4nWyRTUExJVF0oLyguPykoLj8pLylbTEVOR1RIXSAhPSA0IHx8XG4gICAgJy4nWyRTUExJVF0oLygpKCkvKVtMRU5HVEhdID4gMSB8fFxuICAgICcnWyRTUExJVF0oLy4/LylbTEVOR1RIXVxuICApIHtcbiAgICB2YXIgTlBDRyA9IC8oKT8/Ly5leGVjKCcnKVsxXSA9PT0gdW5kZWZpbmVkOyAvLyBub25wYXJ0aWNpcGF0aW5nIGNhcHR1cmluZyBncm91cFxuICAgIC8vIGJhc2VkIG9uIGVzNS1zaGltIGltcGxlbWVudGF0aW9uLCBuZWVkIHRvIHJld29yayBpdFxuICAgICRzcGxpdCA9IGZ1bmN0aW9uIChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICB2YXIgc3RyaW5nID0gU3RyaW5nKHRoaXMpO1xuICAgICAgaWYgKHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkICYmIGxpbWl0ID09PSAwKSByZXR1cm4gW107XG4gICAgICAvLyBJZiBgc2VwYXJhdG9yYCBpcyBub3QgYSByZWdleCwgdXNlIG5hdGl2ZSBzcGxpdFxuICAgICAgaWYgKCFpc1JlZ0V4cChzZXBhcmF0b3IpKSByZXR1cm4gX3NwbGl0LmNhbGwoc3RyaW5nLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICAgIHZhciBvdXRwdXQgPSBbXTtcbiAgICAgIHZhciBmbGFncyA9IChzZXBhcmF0b3IuaWdub3JlQ2FzZSA/ICdpJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAoc2VwYXJhdG9yLm11bHRpbGluZSA/ICdtJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAoc2VwYXJhdG9yLnVuaWNvZGUgPyAndScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5zdGlja3kgPyAneScgOiAnJyk7XG4gICAgICB2YXIgbGFzdExhc3RJbmRleCA9IDA7XG4gICAgICB2YXIgc3BsaXRMaW1pdCA9IGxpbWl0ID09PSB1bmRlZmluZWQgPyA0Mjk0OTY3Mjk1IDogbGltaXQgPj4+IDA7XG4gICAgICAvLyBNYWtlIGBnbG9iYWxgIGFuZCBhdm9pZCBgbGFzdEluZGV4YCBpc3N1ZXMgYnkgd29ya2luZyB3aXRoIGEgY29weVxuICAgICAgdmFyIHNlcGFyYXRvckNvcHkgPSBuZXcgUmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsIGZsYWdzICsgJ2cnKTtcbiAgICAgIHZhciBzZXBhcmF0b3IyLCBtYXRjaCwgbGFzdEluZGV4LCBsYXN0TGVuZ3RoLCBpO1xuICAgICAgLy8gRG9lc24ndCBuZWVkIGZsYWdzIGd5LCBidXQgdGhleSBkb24ndCBodXJ0XG4gICAgICBpZiAoIU5QQ0cpIHNlcGFyYXRvcjIgPSBuZXcgUmVnRXhwKCdeJyArIHNlcGFyYXRvckNvcHkuc291cmNlICsgJyQoPyFcXFxccyknLCBmbGFncyk7XG4gICAgICB3aGlsZSAobWF0Y2ggPSBzZXBhcmF0b3JDb3B5LmV4ZWMoc3RyaW5nKSkge1xuICAgICAgICAvLyBgc2VwYXJhdG9yQ29weS5sYXN0SW5kZXhgIGlzIG5vdCByZWxpYWJsZSBjcm9zcy1icm93c2VyXG4gICAgICAgIGxhc3RJbmRleCA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF1bTEVOR1RIXTtcbiAgICAgICAgaWYgKGxhc3RJbmRleCA+IGxhc3RMYXN0SW5kZXgpIHtcbiAgICAgICAgICBvdXRwdXQucHVzaChzdHJpbmcuc2xpY2UobGFzdExhc3RJbmRleCwgbWF0Y2guaW5kZXgpKTtcbiAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgd2hvc2UgYGV4ZWNgIG1ldGhvZHMgZG9uJ3QgY29uc2lzdGVudGx5IHJldHVybiBgdW5kZWZpbmVkYCBmb3IgTlBDR1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sb29wLWZ1bmNcbiAgICAgICAgICBpZiAoIU5QQ0cgJiYgbWF0Y2hbTEVOR1RIXSA+IDEpIG1hdGNoWzBdLnJlcGxhY2Uoc2VwYXJhdG9yMiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IGFyZ3VtZW50c1tMRU5HVEhdIC0gMjsgaSsrKSBpZiAoYXJndW1lbnRzW2ldID09PSB1bmRlZmluZWQpIG1hdGNoW2ldID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChtYXRjaFtMRU5HVEhdID4gMSAmJiBtYXRjaC5pbmRleCA8IHN0cmluZ1tMRU5HVEhdKSAkcHVzaC5hcHBseShvdXRwdXQsIG1hdGNoLnNsaWNlKDEpKTtcbiAgICAgICAgICBsYXN0TGVuZ3RoID0gbWF0Y2hbMF1bTEVOR1RIXTtcbiAgICAgICAgICBsYXN0TGFzdEluZGV4ID0gbGFzdEluZGV4O1xuICAgICAgICAgIGlmIChvdXRwdXRbTEVOR1RIXSA+PSBzcGxpdExpbWl0KSBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VwYXJhdG9yQ29weVtMQVNUX0lOREVYXSA9PT0gbWF0Y2guaW5kZXgpIHNlcGFyYXRvckNvcHlbTEFTVF9JTkRFWF0rKzsgLy8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcFxuICAgICAgfVxuICAgICAgaWYgKGxhc3RMYXN0SW5kZXggPT09IHN0cmluZ1tMRU5HVEhdKSB7XG4gICAgICAgIGlmIChsYXN0TGVuZ3RoIHx8ICFzZXBhcmF0b3JDb3B5LnRlc3QoJycpKSBvdXRwdXQucHVzaCgnJyk7XG4gICAgICB9IGVsc2Ugb3V0cHV0LnB1c2goc3RyaW5nLnNsaWNlKGxhc3RMYXN0SW5kZXgpKTtcbiAgICAgIHJldHVybiBvdXRwdXRbTEVOR1RIXSA+IHNwbGl0TGltaXQgPyBvdXRwdXQuc2xpY2UoMCwgc3BsaXRMaW1pdCkgOiBvdXRwdXQ7XG4gICAgfTtcbiAgLy8gQ2hha3JhLCBWOFxuICB9IGVsc2UgaWYgKCcwJ1skU1BMSVRdKHVuZGVmaW5lZCwgMClbTEVOR1RIXSkge1xuICAgICRzcGxpdCA9IGZ1bmN0aW9uIChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICByZXR1cm4gc2VwYXJhdG9yID09PSB1bmRlZmluZWQgJiYgbGltaXQgPT09IDAgPyBbXSA6IF9zcGxpdC5jYWxsKHRoaXMsIHNlcGFyYXRvciwgbGltaXQpO1xuICAgIH07XG4gIH1cbiAgLy8gMjEuMS4zLjE3IFN0cmluZy5wcm90b3R5cGUuc3BsaXQoc2VwYXJhdG9yLCBsaW1pdClcbiAgcmV0dXJuIFtmdW5jdGlvbiBzcGxpdChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgdmFyIE8gPSBkZWZpbmVkKHRoaXMpO1xuICAgIHZhciBmbiA9IHNlcGFyYXRvciA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzZXBhcmF0b3JbU1BMSVRdO1xuICAgIHJldHVybiBmbiAhPT0gdW5kZWZpbmVkID8gZm4uY2FsbChzZXBhcmF0b3IsIE8sIGxpbWl0KSA6ICRzcGxpdC5jYWxsKFN0cmluZyhPKSwgc2VwYXJhdG9yLCBsaW1pdCk7XG4gIH0sICRzcGxpdF07XG59KTtcbiIsIi8vIDIxLjEuMy43IFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMoc2VhcmNoU3RyaW5nLCBwb3NpdGlvbiA9IDApXG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNvbnRleHQgPSByZXF1aXJlKCcuL19zdHJpbmctY29udGV4dCcpO1xudmFyIElOQ0xVREVTID0gJ2luY2x1ZGVzJztcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscy1pcy1yZWdleHAnKShJTkNMVURFUyksICdTdHJpbmcnLCB7XG4gIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhzZWFyY2hTdHJpbmcgLyogLCBwb3NpdGlvbiA9IDAgKi8pIHtcbiAgICByZXR1cm4gISF+Y29udGV4dCh0aGlzLCBzZWFyY2hTdHJpbmcsIElOQ0xVREVTKVxuICAgICAgLmluZGV4T2Yoc2VhcmNoU3RyaW5nLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRpbmNsdWRlcyA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykodHJ1ZSk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnQXJyYXknLCB7XG4gIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhlbCAvKiAsIGZyb21JbmRleCA9IDAgKi8pIHtcbiAgICByZXR1cm4gJGluY2x1ZGVzKHRoaXMsIGVsLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuXG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKSgnaW5jbHVkZXMnKTtcbiIsInZhciAkaXRlcmF0b3JzID0gcmVxdWlyZSgnLi9lczYuYXJyYXkuaXRlcmF0b3InKTtcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciB3a3MgPSByZXF1aXJlKCcuL193a3MnKTtcbnZhciBJVEVSQVRPUiA9IHdrcygnaXRlcmF0b3InKTtcbnZhciBUT19TVFJJTkdfVEFHID0gd2tzKCd0b1N0cmluZ1RhZycpO1xudmFyIEFycmF5VmFsdWVzID0gSXRlcmF0b3JzLkFycmF5O1xuXG52YXIgRE9NSXRlcmFibGVzID0ge1xuICBDU1NSdWxlTGlzdDogdHJ1ZSwgLy8gVE9ETzogTm90IHNwZWMgY29tcGxpYW50LCBzaG91bGQgYmUgZmFsc2UuXG4gIENTU1N0eWxlRGVjbGFyYXRpb246IGZhbHNlLFxuICBDU1NWYWx1ZUxpc3Q6IGZhbHNlLFxuICBDbGllbnRSZWN0TGlzdDogZmFsc2UsXG4gIERPTVJlY3RMaXN0OiBmYWxzZSxcbiAgRE9NU3RyaW5nTGlzdDogZmFsc2UsXG4gIERPTVRva2VuTGlzdDogdHJ1ZSxcbiAgRGF0YVRyYW5zZmVySXRlbUxpc3Q6IGZhbHNlLFxuICBGaWxlTGlzdDogZmFsc2UsXG4gIEhUTUxBbGxDb2xsZWN0aW9uOiBmYWxzZSxcbiAgSFRNTENvbGxlY3Rpb246IGZhbHNlLFxuICBIVE1MRm9ybUVsZW1lbnQ6IGZhbHNlLFxuICBIVE1MU2VsZWN0RWxlbWVudDogZmFsc2UsXG4gIE1lZGlhTGlzdDogdHJ1ZSwgLy8gVE9ETzogTm90IHNwZWMgY29tcGxpYW50LCBzaG91bGQgYmUgZmFsc2UuXG4gIE1pbWVUeXBlQXJyYXk6IGZhbHNlLFxuICBOYW1lZE5vZGVNYXA6IGZhbHNlLFxuICBOb2RlTGlzdDogdHJ1ZSxcbiAgUGFpbnRSZXF1ZXN0TGlzdDogZmFsc2UsXG4gIFBsdWdpbjogZmFsc2UsXG4gIFBsdWdpbkFycmF5OiBmYWxzZSxcbiAgU1ZHTGVuZ3RoTGlzdDogZmFsc2UsXG4gIFNWR051bWJlckxpc3Q6IGZhbHNlLFxuICBTVkdQYXRoU2VnTGlzdDogZmFsc2UsXG4gIFNWR1BvaW50TGlzdDogZmFsc2UsXG4gIFNWR1N0cmluZ0xpc3Q6IGZhbHNlLFxuICBTVkdUcmFuc2Zvcm1MaXN0OiBmYWxzZSxcbiAgU291cmNlQnVmZmVyTGlzdDogZmFsc2UsXG4gIFN0eWxlU2hlZXRMaXN0OiB0cnVlLCAvLyBUT0RPOiBOb3Qgc3BlYyBjb21wbGlhbnQsIHNob3VsZCBiZSBmYWxzZS5cbiAgVGV4dFRyYWNrQ3VlTGlzdDogZmFsc2UsXG4gIFRleHRUcmFja0xpc3Q6IGZhbHNlLFxuICBUb3VjaExpc3Q6IGZhbHNlXG59O1xuXG5mb3IgKHZhciBjb2xsZWN0aW9ucyA9IGdldEtleXMoRE9NSXRlcmFibGVzKSwgaSA9IDA7IGkgPCBjb2xsZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICB2YXIgTkFNRSA9IGNvbGxlY3Rpb25zW2ldO1xuICB2YXIgZXhwbGljaXQgPSBET01JdGVyYWJsZXNbTkFNRV07XG4gIHZhciBDb2xsZWN0aW9uID0gZ2xvYmFsW05BTUVdO1xuICB2YXIgcHJvdG8gPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlO1xuICB2YXIga2V5O1xuICBpZiAocHJvdG8pIHtcbiAgICBpZiAoIXByb3RvW0lURVJBVE9SXSkgaGlkZShwcm90bywgSVRFUkFUT1IsIEFycmF5VmFsdWVzKTtcbiAgICBpZiAoIXByb3RvW1RPX1NUUklOR19UQUddKSBoaWRlKHByb3RvLCBUT19TVFJJTkdfVEFHLCBOQU1FKTtcbiAgICBJdGVyYXRvcnNbTkFNRV0gPSBBcnJheVZhbHVlcztcbiAgICBpZiAoZXhwbGljaXQpIGZvciAoa2V5IGluICRpdGVyYXRvcnMpIGlmICghcHJvdG9ba2V5XSkgcmVkZWZpbmUocHJvdG8sIGtleSwgJGl0ZXJhdG9yc1trZXldLCB0cnVlKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4vLyBVc2VkIGZvciBzZXR0aW5nIHByb3RvdHlwZSBtZXRob2RzIHRoYXQgSUU4IGNob2tlcyBvbi5cbnZhciBERUxFVEUgPSAnZGVsZXRlJztcblxuLy8gQ29uc3RhbnRzIGRlc2NyaWJpbmcgdGhlIHNpemUgb2YgdHJpZSBub2Rlcy5cbnZhciBTSElGVCA9IDU7IC8vIFJlc3VsdGVkIGluIGJlc3QgcGVyZm9ybWFuY2UgYWZ0ZXIgX19fX19fP1xudmFyIFNJWkUgPSAxIDw8IFNISUZUO1xudmFyIE1BU0sgPSBTSVpFIC0gMTtcblxuLy8gQSBjb25zaXN0ZW50IHNoYXJlZCB2YWx1ZSByZXByZXNlbnRpbmcgXCJub3Qgc2V0XCIgd2hpY2ggZXF1YWxzIG5vdGhpbmcgb3RoZXJcbi8vIHRoYW4gaXRzZWxmLCBhbmQgbm90aGluZyB0aGF0IGNvdWxkIGJlIHByb3ZpZGVkIGV4dGVybmFsbHkuXG52YXIgTk9UX1NFVCA9IHt9O1xuXG4vLyBCb29sZWFuIHJlZmVyZW5jZXMsIFJvdWdoIGVxdWl2YWxlbnQgb2YgYGJvb2wgJmAuXG5mdW5jdGlvbiBNYWtlUmVmKCkge1xuICByZXR1cm4geyB2YWx1ZTogZmFsc2UgfTtcbn1cblxuZnVuY3Rpb24gU2V0UmVmKHJlZikge1xuICBpZiAocmVmKSB7XG4gICAgcmVmLnZhbHVlID0gdHJ1ZTtcbiAgfVxufVxuXG4vLyBBIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYSB2YWx1ZSByZXByZXNlbnRpbmcgYW4gXCJvd25lclwiIGZvciB0cmFuc2llbnQgd3JpdGVzXG4vLyB0byB0cmllcy4gVGhlIHJldHVybiB2YWx1ZSB3aWxsIG9ubHkgZXZlciBlcXVhbCBpdHNlbGYsIGFuZCB3aWxsIG5vdCBlcXVhbFxuLy8gdGhlIHJldHVybiBvZiBhbnkgc3Vic2VxdWVudCBjYWxsIG9mIHRoaXMgZnVuY3Rpb24uXG5mdW5jdGlvbiBPd25lcklEKCkge31cblxuZnVuY3Rpb24gZW5zdXJlU2l6ZShpdGVyKSB7XG4gIGlmIChpdGVyLnNpemUgPT09IHVuZGVmaW5lZCkge1xuICAgIGl0ZXIuc2l6ZSA9IGl0ZXIuX19pdGVyYXRlKHJldHVyblRydWUpO1xuICB9XG4gIHJldHVybiBpdGVyLnNpemU7XG59XG5cbmZ1bmN0aW9uIHdyYXBJbmRleChpdGVyLCBpbmRleCkge1xuICAvLyBUaGlzIGltcGxlbWVudHMgXCJpcyBhcnJheSBpbmRleFwiIHdoaWNoIHRoZSBFQ01BU3RyaW5nIHNwZWMgZGVmaW5lcyBhczpcbiAgLy9cbiAgLy8gICAgIEEgU3RyaW5nIHByb3BlcnR5IG5hbWUgUCBpcyBhbiBhcnJheSBpbmRleCBpZiBhbmQgb25seSBpZlxuICAvLyAgICAgVG9TdHJpbmcoVG9VaW50MzIoUCkpIGlzIGVxdWFsIHRvIFAgYW5kIFRvVWludDMyKFApIGlzIG5vdCBlcXVhbFxuICAvLyAgICAgdG8gMl4zMuKIkjEuXG4gIC8vXG4gIC8vIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1hcnJheS1leG90aWMtb2JqZWN0c1xuICBpZiAodHlwZW9mIGluZGV4ICE9PSAnbnVtYmVyJykge1xuICAgIHZhciB1aW50MzJJbmRleCA9IGluZGV4ID4+PiAwOyAvLyBOID4+PiAwIGlzIHNob3J0aGFuZCBmb3IgVG9VaW50MzJcbiAgICBpZiAoJycgKyB1aW50MzJJbmRleCAhPT0gaW5kZXggfHwgdWludDMySW5kZXggPT09IDQyOTQ5NjcyOTUpIHtcbiAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICAgIGluZGV4ID0gdWludDMySW5kZXg7XG4gIH1cbiAgcmV0dXJuIGluZGV4IDwgMCA/IGVuc3VyZVNpemUoaXRlcikgKyBpbmRleCA6IGluZGV4O1xufVxuXG5mdW5jdGlvbiByZXR1cm5UcnVlKCkge1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gd2hvbGVTbGljZShiZWdpbiwgZW5kLCBzaXplKSB7XG4gIHJldHVybiAoXG4gICAgKChiZWdpbiA9PT0gMCAmJiAhaXNOZWcoYmVnaW4pKSB8fFxuICAgICAgKHNpemUgIT09IHVuZGVmaW5lZCAmJiBiZWdpbiA8PSAtc2l6ZSkpICYmXG4gICAgKGVuZCA9PT0gdW5kZWZpbmVkIHx8IChzaXplICE9PSB1bmRlZmluZWQgJiYgZW5kID49IHNpemUpKVxuICApO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlQmVnaW4oYmVnaW4sIHNpemUpIHtcbiAgcmV0dXJuIHJlc29sdmVJbmRleChiZWdpbiwgc2l6ZSwgMCk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVFbmQoZW5kLCBzaXplKSB7XG4gIHJldHVybiByZXNvbHZlSW5kZXgoZW5kLCBzaXplLCBzaXplKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUluZGV4KGluZGV4LCBzaXplLCBkZWZhdWx0SW5kZXgpIHtcbiAgLy8gU2FuaXRpemUgaW5kaWNlcyB1c2luZyB0aGlzIHNob3J0aGFuZCBmb3IgVG9JbnQzMihhcmd1bWVudClcbiAgLy8gaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXRvaW50MzJcbiAgcmV0dXJuIGluZGV4ID09PSB1bmRlZmluZWRcbiAgICA/IGRlZmF1bHRJbmRleFxuICAgIDogaXNOZWcoaW5kZXgpXG4gICAgICA/IHNpemUgPT09IEluZmluaXR5XG4gICAgICAgID8gc2l6ZVxuICAgICAgICA6IE1hdGgubWF4KDAsIHNpemUgKyBpbmRleCkgfCAwXG4gICAgICA6IHNpemUgPT09IHVuZGVmaW5lZCB8fCBzaXplID09PSBpbmRleFxuICAgICAgICA/IGluZGV4XG4gICAgICAgIDogTWF0aC5taW4oc2l6ZSwgaW5kZXgpIHwgMDtcbn1cblxuZnVuY3Rpb24gaXNOZWcodmFsdWUpIHtcbiAgLy8gQWNjb3VudCBmb3IgLTAgd2hpY2ggaXMgbmVnYXRpdmUsIGJ1dCBub3QgbGVzcyB0aGFuIDAuXG4gIHJldHVybiB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA9PT0gLUluZmluaXR5KTtcbn1cblxuLy8gTm90ZTogdmFsdWUgaXMgdW5jaGFuZ2VkIHRvIG5vdCBicmVhayBpbW11dGFibGUtZGV2dG9vbHMuXG52YXIgSVNfQ09MTEVDVElPTl9TWU1CT0wgPSAnQEBfX0lNTVVUQUJMRV9JVEVSQUJMRV9fQEAnO1xuXG5mdW5jdGlvbiBpc0NvbGxlY3Rpb24obWF5YmVDb2xsZWN0aW9uKSB7XG4gIHJldHVybiBCb29sZWFuKG1heWJlQ29sbGVjdGlvbiAmJiBtYXliZUNvbGxlY3Rpb25bSVNfQ09MTEVDVElPTl9TWU1CT0xdKTtcbn1cblxudmFyIElTX0tFWUVEX1NZTUJPTCA9ICdAQF9fSU1NVVRBQkxFX0tFWUVEX19AQCc7XG5cbmZ1bmN0aW9uIGlzS2V5ZWQobWF5YmVLZXllZCkge1xuICByZXR1cm4gQm9vbGVhbihtYXliZUtleWVkICYmIG1heWJlS2V5ZWRbSVNfS0VZRURfU1lNQk9MXSk7XG59XG5cbnZhciBJU19JTkRFWEVEX1NZTUJPTCA9ICdAQF9fSU1NVVRBQkxFX0lOREVYRURfX0BAJztcblxuZnVuY3Rpb24gaXNJbmRleGVkKG1heWJlSW5kZXhlZCkge1xuICByZXR1cm4gQm9vbGVhbihtYXliZUluZGV4ZWQgJiYgbWF5YmVJbmRleGVkW0lTX0lOREVYRURfU1lNQk9MXSk7XG59XG5cbmZ1bmN0aW9uIGlzQXNzb2NpYXRpdmUobWF5YmVBc3NvY2lhdGl2ZSkge1xuICByZXR1cm4gaXNLZXllZChtYXliZUFzc29jaWF0aXZlKSB8fCBpc0luZGV4ZWQobWF5YmVBc3NvY2lhdGl2ZSk7XG59XG5cbnZhciBDb2xsZWN0aW9uID0gZnVuY3Rpb24gQ29sbGVjdGlvbih2YWx1ZSkge1xuICByZXR1cm4gaXNDb2xsZWN0aW9uKHZhbHVlKSA/IHZhbHVlIDogU2VxKHZhbHVlKTtcbn07XG5cbnZhciBLZXllZENvbGxlY3Rpb24gPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChDb2xsZWN0aW9uKSB7XG4gIGZ1bmN0aW9uIEtleWVkQ29sbGVjdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBpc0tleWVkKHZhbHVlKSA/IHZhbHVlIDogS2V5ZWRTZXEodmFsdWUpO1xuICB9XG5cbiAgaWYgKCBDb2xsZWN0aW9uICkgS2V5ZWRDb2xsZWN0aW9uLl9fcHJvdG9fXyA9IENvbGxlY3Rpb247XG4gIEtleWVkQ29sbGVjdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlICk7XG4gIEtleWVkQ29sbGVjdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBLZXllZENvbGxlY3Rpb247XG5cbiAgcmV0dXJuIEtleWVkQ29sbGVjdGlvbjtcbn0oQ29sbGVjdGlvbikpO1xuXG52YXIgSW5kZXhlZENvbGxlY3Rpb24gPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChDb2xsZWN0aW9uKSB7XG4gIGZ1bmN0aW9uIEluZGV4ZWRDb2xsZWN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGlzSW5kZXhlZCh2YWx1ZSkgPyB2YWx1ZSA6IEluZGV4ZWRTZXEodmFsdWUpO1xuICB9XG5cbiAgaWYgKCBDb2xsZWN0aW9uICkgSW5kZXhlZENvbGxlY3Rpb24uX19wcm90b19fID0gQ29sbGVjdGlvbjtcbiAgSW5kZXhlZENvbGxlY3Rpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZSApO1xuICBJbmRleGVkQ29sbGVjdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbmRleGVkQ29sbGVjdGlvbjtcblxuICByZXR1cm4gSW5kZXhlZENvbGxlY3Rpb247XG59KENvbGxlY3Rpb24pKTtcblxudmFyIFNldENvbGxlY3Rpb24gPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChDb2xsZWN0aW9uKSB7XG4gIGZ1bmN0aW9uIFNldENvbGxlY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gaXNDb2xsZWN0aW9uKHZhbHVlKSAmJiAhaXNBc3NvY2lhdGl2ZSh2YWx1ZSkgPyB2YWx1ZSA6IFNldFNlcSh2YWx1ZSk7XG4gIH1cblxuICBpZiAoIENvbGxlY3Rpb24gKSBTZXRDb2xsZWN0aW9uLl9fcHJvdG9fXyA9IENvbGxlY3Rpb247XG4gIFNldENvbGxlY3Rpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZSApO1xuICBTZXRDb2xsZWN0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNldENvbGxlY3Rpb247XG5cbiAgcmV0dXJuIFNldENvbGxlY3Rpb247XG59KENvbGxlY3Rpb24pKTtcblxuQ29sbGVjdGlvbi5LZXllZCA9IEtleWVkQ29sbGVjdGlvbjtcbkNvbGxlY3Rpb24uSW5kZXhlZCA9IEluZGV4ZWRDb2xsZWN0aW9uO1xuQ29sbGVjdGlvbi5TZXQgPSBTZXRDb2xsZWN0aW9uO1xuXG52YXIgSVNfU0VRX1NZTUJPTCA9ICdAQF9fSU1NVVRBQkxFX1NFUV9fQEAnO1xuXG5mdW5jdGlvbiBpc1NlcShtYXliZVNlcSkge1xuICByZXR1cm4gQm9vbGVhbihtYXliZVNlcSAmJiBtYXliZVNlcVtJU19TRVFfU1lNQk9MXSk7XG59XG5cbnZhciBJU19SRUNPUkRfU1lNQk9MID0gJ0BAX19JTU1VVEFCTEVfUkVDT1JEX19AQCc7XG5cbmZ1bmN0aW9uIGlzUmVjb3JkKG1heWJlUmVjb3JkKSB7XG4gIHJldHVybiBCb29sZWFuKG1heWJlUmVjb3JkICYmIG1heWJlUmVjb3JkW0lTX1JFQ09SRF9TWU1CT0xdKTtcbn1cblxuZnVuY3Rpb24gaXNJbW11dGFibGUobWF5YmVJbW11dGFibGUpIHtcbiAgcmV0dXJuIGlzQ29sbGVjdGlvbihtYXliZUltbXV0YWJsZSkgfHwgaXNSZWNvcmQobWF5YmVJbW11dGFibGUpO1xufVxuXG52YXIgSVNfT1JERVJFRF9TWU1CT0wgPSAnQEBfX0lNTVVUQUJMRV9PUkRFUkVEX19AQCc7XG5cbmZ1bmN0aW9uIGlzT3JkZXJlZChtYXliZU9yZGVyZWQpIHtcbiAgcmV0dXJuIEJvb2xlYW4obWF5YmVPcmRlcmVkICYmIG1heWJlT3JkZXJlZFtJU19PUkRFUkVEX1NZTUJPTF0pO1xufVxuXG52YXIgSVRFUkFURV9LRVlTID0gMDtcbnZhciBJVEVSQVRFX1ZBTFVFUyA9IDE7XG52YXIgSVRFUkFURV9FTlRSSUVTID0gMjtcblxudmFyIFJFQUxfSVRFUkFUT1JfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaXRlcmF0b3I7XG52YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7XG5cbnZhciBJVEVSQVRPUl9TWU1CT0wgPSBSRUFMX0lURVJBVE9SX1NZTUJPTCB8fCBGQVVYX0lURVJBVE9SX1NZTUJPTDtcblxudmFyIEl0ZXJhdG9yID0gZnVuY3Rpb24gSXRlcmF0b3IobmV4dCkge1xuICB0aGlzLm5leHQgPSBuZXh0O1xufTtcblxuSXRlcmF0b3IucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICByZXR1cm4gJ1tJdGVyYXRvcl0nO1xufTtcblxuSXRlcmF0b3IuS0VZUyA9IElURVJBVEVfS0VZUztcbkl0ZXJhdG9yLlZBTFVFUyA9IElURVJBVEVfVkFMVUVTO1xuSXRlcmF0b3IuRU5UUklFUyA9IElURVJBVEVfRU5UUklFUztcblxuSXRlcmF0b3IucHJvdG90eXBlLmluc3BlY3QgPSBJdGVyYXRvci5wcm90b3R5cGUudG9Tb3VyY2UgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbn07XG5JdGVyYXRvci5wcm90b3R5cGVbSVRFUkFUT1JfU1lNQk9MXSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIGl0ZXJhdG9yVmFsdWUodHlwZSwgaywgdiwgaXRlcmF0b3JSZXN1bHQpIHtcbiAgdmFyIHZhbHVlID0gdHlwZSA9PT0gMCA/IGsgOiB0eXBlID09PSAxID8gdiA6IFtrLCB2XTtcbiAgaXRlcmF0b3JSZXN1bHRcbiAgICA/IChpdGVyYXRvclJlc3VsdC52YWx1ZSA9IHZhbHVlKVxuICAgIDogKGl0ZXJhdG9yUmVzdWx0ID0ge1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgfSk7XG4gIHJldHVybiBpdGVyYXRvclJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaXRlcmF0b3JEb25lKCkge1xuICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG59XG5cbmZ1bmN0aW9uIGhhc0l0ZXJhdG9yKG1heWJlSXRlcmFibGUpIHtcbiAgcmV0dXJuICEhZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKTtcbn1cblxuZnVuY3Rpb24gaXNJdGVyYXRvcihtYXliZUl0ZXJhdG9yKSB7XG4gIHJldHVybiBtYXliZUl0ZXJhdG9yICYmIHR5cGVvZiBtYXliZUl0ZXJhdG9yLm5leHQgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGdldEl0ZXJhdG9yKGl0ZXJhYmxlKSB7XG4gIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihpdGVyYWJsZSk7XG4gIHJldHVybiBpdGVyYXRvckZuICYmIGl0ZXJhdG9yRm4uY2FsbChpdGVyYWJsZSk7XG59XG5cbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4oaXRlcmFibGUpIHtcbiAgdmFyIGl0ZXJhdG9yRm4gPVxuICAgIGl0ZXJhYmxlICYmXG4gICAgKChSRUFMX0lURVJBVE9SX1NZTUJPTCAmJiBpdGVyYWJsZVtSRUFMX0lURVJBVE9SX1NZTUJPTF0pIHx8XG4gICAgICBpdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF0pO1xuICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gaXRlcmF0b3JGbjtcbiAgfVxufVxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlLmxlbmd0aCkgJiZcbiAgICB2YWx1ZS5sZW5ndGggPj0gMCAmJlxuICAgICh2YWx1ZS5sZW5ndGggPT09IDBcbiAgICAgID8gLy8gT25seSB7bGVuZ3RoOiAwfSBpcyBjb25zaWRlcmVkIEFycmF5LWxpa2UuXG4gICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDFcbiAgICAgIDogLy8gQW4gb2JqZWN0IGlzIG9ubHkgQXJyYXktbGlrZSBpZiBpdCBoYXMgYSBwcm9wZXJ0eSB3aGVyZSB0aGUgbGFzdCB2YWx1ZVxuICAgICAgICAvLyBpbiB0aGUgYXJyYXktbGlrZSBtYXkgYmUgZm91bmQgKHdoaWNoIGNvdWxkIGJlIHVuZGVmaW5lZCkuXG4gICAgICAgIHZhbHVlLmhhc093blByb3BlcnR5KHZhbHVlLmxlbmd0aCAtIDEpKVxuICApO1xufVxuXG52YXIgU2VxID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoQ29sbGVjdGlvbiQkMSkge1xuICBmdW5jdGlvbiBTZXEodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgPyBlbXB0eVNlcXVlbmNlKClcbiAgICAgIDogaXNJbW11dGFibGUodmFsdWUpXG4gICAgICAgID8gdmFsdWUudG9TZXEoKVxuICAgICAgICA6IHNlcUZyb21WYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICBpZiAoIENvbGxlY3Rpb24kJDEgKSBTZXEuX19wcm90b19fID0gQ29sbGVjdGlvbiQkMTtcbiAgU2VxLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIENvbGxlY3Rpb24kJDEgJiYgQ29sbGVjdGlvbiQkMS5wcm90b3R5cGUgKTtcbiAgU2VxLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNlcTtcblxuICBTZXEucHJvdG90eXBlLnRvU2VxID0gZnVuY3Rpb24gdG9TZXEgKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIFNlcS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX190b1N0cmluZygnU2VxIHsnLCAnfScpO1xuICB9O1xuXG4gIFNlcS5wcm90b3R5cGUuY2FjaGVSZXN1bHQgPSBmdW5jdGlvbiBjYWNoZVJlc3VsdCAoKSB7XG4gICAgaWYgKCF0aGlzLl9jYWNoZSAmJiB0aGlzLl9faXRlcmF0ZVVuY2FjaGVkKSB7XG4gICAgICB0aGlzLl9jYWNoZSA9IHRoaXMuZW50cnlTZXEoKS50b0FycmF5KCk7XG4gICAgICB0aGlzLnNpemUgPSB0aGlzLl9jYWNoZS5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIGFic3RyYWN0IF9faXRlcmF0ZVVuY2FjaGVkKGZuLCByZXZlcnNlKVxuXG4gIFNlcS5wcm90b3R5cGUuX19pdGVyYXRlID0gZnVuY3Rpb24gX19pdGVyYXRlIChmbiwgcmV2ZXJzZSkge1xuICAgIHZhciBjYWNoZSA9IHRoaXMuX2NhY2hlO1xuICAgIGlmIChjYWNoZSkge1xuICAgICAgdmFyIHNpemUgPSBjYWNoZS5sZW5ndGg7XG4gICAgICB2YXIgaSA9IDA7XG4gICAgICB3aGlsZSAoaSAhPT0gc2l6ZSkge1xuICAgICAgICB2YXIgZW50cnkgPSBjYWNoZVtyZXZlcnNlID8gc2l6ZSAtICsraSA6IGkrK107XG4gICAgICAgIGlmIChmbihlbnRyeVsxXSwgZW50cnlbMF0sIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX19pdGVyYXRlVW5jYWNoZWQoZm4sIHJldmVyc2UpO1xuICB9O1xuXG4gIC8vIGFic3RyYWN0IF9faXRlcmF0b3JVbmNhY2hlZCh0eXBlLCByZXZlcnNlKVxuXG4gIFNlcS5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uIF9faXRlcmF0b3IgKHR5cGUsIHJldmVyc2UpIHtcbiAgICB2YXIgY2FjaGUgPSB0aGlzLl9jYWNoZTtcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIHZhciBzaXplID0gY2FjaGUubGVuZ3RoO1xuICAgICAgdmFyIGkgPSAwO1xuICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpID09PSBzaXplKSB7XG4gICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yRG9uZSgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbnRyeSA9IGNhY2hlW3JldmVyc2UgPyBzaXplIC0gKytpIDogaSsrXTtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yVmFsdWUodHlwZSwgZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX2l0ZXJhdG9yVW5jYWNoZWQodHlwZSwgcmV2ZXJzZSk7XG4gIH07XG5cbiAgcmV0dXJuIFNlcTtcbn0oQ29sbGVjdGlvbikpO1xuXG52YXIgS2V5ZWRTZXEgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChTZXEpIHtcbiAgZnVuY3Rpb24gS2V5ZWRTZXEodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgPyBlbXB0eVNlcXVlbmNlKCkudG9LZXllZFNlcSgpXG4gICAgICA6IGlzQ29sbGVjdGlvbih2YWx1ZSlcbiAgICAgICAgPyBpc0tleWVkKHZhbHVlKVxuICAgICAgICAgID8gdmFsdWUudG9TZXEoKVxuICAgICAgICAgIDogdmFsdWUuZnJvbUVudHJ5U2VxKClcbiAgICAgICAgOiBpc1JlY29yZCh2YWx1ZSlcbiAgICAgICAgICA/IHZhbHVlLnRvU2VxKClcbiAgICAgICAgICA6IGtleWVkU2VxRnJvbVZhbHVlKHZhbHVlKTtcbiAgfVxuXG4gIGlmICggU2VxICkgS2V5ZWRTZXEuX19wcm90b19fID0gU2VxO1xuICBLZXllZFNlcS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTZXEgJiYgU2VxLnByb3RvdHlwZSApO1xuICBLZXllZFNlcS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBLZXllZFNlcTtcblxuICBLZXllZFNlcS5wcm90b3R5cGUudG9LZXllZFNlcSA9IGZ1bmN0aW9uIHRvS2V5ZWRTZXEgKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIHJldHVybiBLZXllZFNlcTtcbn0oU2VxKSk7XG5cbnZhciBJbmRleGVkU2VxID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoU2VxKSB7XG4gIGZ1bmN0aW9uIEluZGV4ZWRTZXEodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgPyBlbXB0eVNlcXVlbmNlKClcbiAgICAgIDogaXNDb2xsZWN0aW9uKHZhbHVlKVxuICAgICAgICA/IGlzS2V5ZWQodmFsdWUpXG4gICAgICAgICAgPyB2YWx1ZS5lbnRyeVNlcSgpXG4gICAgICAgICAgOiB2YWx1ZS50b0luZGV4ZWRTZXEoKVxuICAgICAgICA6IGlzUmVjb3JkKHZhbHVlKVxuICAgICAgICAgID8gdmFsdWUudG9TZXEoKS5lbnRyeVNlcSgpXG4gICAgICAgICAgOiBpbmRleGVkU2VxRnJvbVZhbHVlKHZhbHVlKTtcbiAgfVxuXG4gIGlmICggU2VxICkgSW5kZXhlZFNlcS5fX3Byb3RvX18gPSBTZXE7XG4gIEluZGV4ZWRTZXEucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggU2VxICYmIFNlcS5wcm90b3R5cGUgKTtcbiAgSW5kZXhlZFNlcS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbmRleGVkU2VxO1xuXG4gIEluZGV4ZWRTZXEub2YgPSBmdW5jdGlvbiBvZiAoLyouLi52YWx1ZXMqLykge1xuICAgIHJldHVybiBJbmRleGVkU2VxKGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgSW5kZXhlZFNlcS5wcm90b3R5cGUudG9JbmRleGVkU2VxID0gZnVuY3Rpb24gdG9JbmRleGVkU2VxICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBJbmRleGVkU2VxLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCdTZXEgWycsICddJyk7XG4gIH07XG5cbiAgcmV0dXJuIEluZGV4ZWRTZXE7XG59KFNlcSkpO1xuXG52YXIgU2V0U2VxID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoU2VxKSB7XG4gIGZ1bmN0aW9uIFNldFNlcSh2YWx1ZSkge1xuICAgIHJldHVybiAoaXNDb2xsZWN0aW9uKHZhbHVlKSAmJiAhaXNBc3NvY2lhdGl2ZSh2YWx1ZSlcbiAgICAgID8gdmFsdWVcbiAgICAgIDogSW5kZXhlZFNlcSh2YWx1ZSlcbiAgICApLnRvU2V0U2VxKCk7XG4gIH1cblxuICBpZiAoIFNlcSApIFNldFNlcS5fX3Byb3RvX18gPSBTZXE7XG4gIFNldFNlcS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTZXEgJiYgU2VxLnByb3RvdHlwZSApO1xuICBTZXRTZXEucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2V0U2VxO1xuXG4gIFNldFNlcS5vZiA9IGZ1bmN0aW9uIG9mICgvKi4uLnZhbHVlcyovKSB7XG4gICAgcmV0dXJuIFNldFNlcShhcmd1bWVudHMpO1xuICB9O1xuXG4gIFNldFNlcS5wcm90b3R5cGUudG9TZXRTZXEgPSBmdW5jdGlvbiB0b1NldFNlcSAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgcmV0dXJuIFNldFNlcTtcbn0oU2VxKSk7XG5cblNlcS5pc1NlcSA9IGlzU2VxO1xuU2VxLktleWVkID0gS2V5ZWRTZXE7XG5TZXEuU2V0ID0gU2V0U2VxO1xuU2VxLkluZGV4ZWQgPSBJbmRleGVkU2VxO1xuXG5TZXEucHJvdG90eXBlW0lTX1NFUV9TWU1CT0xdID0gdHJ1ZTtcblxuLy8gI3ByYWdtYSBSb290IFNlcXVlbmNlc1xuXG52YXIgQXJyYXlTZXEgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChJbmRleGVkU2VxKSB7XG4gIGZ1bmN0aW9uIEFycmF5U2VxKGFycmF5KSB7XG4gICAgdGhpcy5fYXJyYXkgPSBhcnJheTtcbiAgICB0aGlzLnNpemUgPSBhcnJheS5sZW5ndGg7XG4gIH1cblxuICBpZiAoIEluZGV4ZWRTZXEgKSBBcnJheVNlcS5fX3Byb3RvX18gPSBJbmRleGVkU2VxO1xuICBBcnJheVNlcS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBJbmRleGVkU2VxICYmIEluZGV4ZWRTZXEucHJvdG90eXBlICk7XG4gIEFycmF5U2VxLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFycmF5U2VxO1xuXG4gIEFycmF5U2VxLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKGluZGV4LCBub3RTZXRWYWx1ZSkge1xuICAgIHJldHVybiB0aGlzLmhhcyhpbmRleCkgPyB0aGlzLl9hcnJheVt3cmFwSW5kZXgodGhpcywgaW5kZXgpXSA6IG5vdFNldFZhbHVlO1xuICB9O1xuXG4gIEFycmF5U2VxLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbiBfX2l0ZXJhdGUgKGZuLCByZXZlcnNlKSB7XG4gICAgdmFyIGFycmF5ID0gdGhpcy5fYXJyYXk7XG4gICAgdmFyIHNpemUgPSBhcnJheS5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChpICE9PSBzaXplKSB7XG4gICAgICB2YXIgaWkgPSByZXZlcnNlID8gc2l6ZSAtICsraSA6IGkrKztcbiAgICAgIGlmIChmbihhcnJheVtpaV0sIGlpLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpO1xuICB9O1xuXG4gIEFycmF5U2VxLnByb3RvdHlwZS5fX2l0ZXJhdG9yID0gZnVuY3Rpb24gX19pdGVyYXRvciAodHlwZSwgcmV2ZXJzZSkge1xuICAgIHZhciBhcnJheSA9IHRoaXMuX2FycmF5O1xuICAgIHZhciBzaXplID0gYXJyYXkubGVuZ3RoO1xuICAgIHZhciBpID0gMDtcbiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChpID09PSBzaXplKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvckRvbmUoKTtcbiAgICAgIH1cbiAgICAgIHZhciBpaSA9IHJldmVyc2UgPyBzaXplIC0gKytpIDogaSsrO1xuICAgICAgcmV0dXJuIGl0ZXJhdG9yVmFsdWUodHlwZSwgaWksIGFycmF5W2lpXSk7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIEFycmF5U2VxO1xufShJbmRleGVkU2VxKSk7XG5cbnZhciBPYmplY3RTZXEgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChLZXllZFNlcSkge1xuICBmdW5jdGlvbiBPYmplY3RTZXEob2JqZWN0KSB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuICAgIHRoaXMuX29iamVjdCA9IG9iamVjdDtcbiAgICB0aGlzLl9rZXlzID0ga2V5cztcbiAgICB0aGlzLnNpemUgPSBrZXlzLmxlbmd0aDtcbiAgfVxuXG4gIGlmICggS2V5ZWRTZXEgKSBPYmplY3RTZXEuX19wcm90b19fID0gS2V5ZWRTZXE7XG4gIE9iamVjdFNlcS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBLZXllZFNlcSAmJiBLZXllZFNlcS5wcm90b3R5cGUgKTtcbiAgT2JqZWN0U2VxLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE9iamVjdFNlcTtcblxuICBPYmplY3RTZXEucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCAoa2V5LCBub3RTZXRWYWx1ZSkge1xuICAgIGlmIChub3RTZXRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICF0aGlzLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gbm90U2V0VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9vYmplY3Rba2V5XTtcbiAgfTtcblxuICBPYmplY3RTZXEucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIGhhcyAoa2V5KSB7XG4gICAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwodGhpcy5fb2JqZWN0LCBrZXkpO1xuICB9O1xuXG4gIE9iamVjdFNlcS5wcm90b3R5cGUuX19pdGVyYXRlID0gZnVuY3Rpb24gX19pdGVyYXRlIChmbiwgcmV2ZXJzZSkge1xuICAgIHZhciBvYmplY3QgPSB0aGlzLl9vYmplY3Q7XG4gICAgdmFyIGtleXMgPSB0aGlzLl9rZXlzO1xuICAgIHZhciBzaXplID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChpICE9PSBzaXplKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tyZXZlcnNlID8gc2l6ZSAtICsraSA6IGkrK107XG4gICAgICBpZiAoZm4ob2JqZWN0W2tleV0sIGtleSwgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaTtcbiAgfTtcblxuICBPYmplY3RTZXEucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbiBfX2l0ZXJhdG9yICh0eXBlLCByZXZlcnNlKSB7XG4gICAgdmFyIG9iamVjdCA9IHRoaXMuX29iamVjdDtcbiAgICB2YXIga2V5cyA9IHRoaXMuX2tleXM7XG4gICAgdmFyIHNpemUgPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgaSA9IDA7XG4gICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoaSA9PT0gc2l6ZSkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JEb25lKCk7XG4gICAgICB9XG4gICAgICB2YXIga2V5ID0ga2V5c1tyZXZlcnNlID8gc2l6ZSAtICsraSA6IGkrK107XG4gICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZSh0eXBlLCBrZXksIG9iamVjdFtrZXldKTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gT2JqZWN0U2VxO1xufShLZXllZFNlcSkpO1xuT2JqZWN0U2VxLnByb3RvdHlwZVtJU19PUkRFUkVEX1NZTUJPTF0gPSB0cnVlO1xuXG52YXIgQ29sbGVjdGlvblNlcSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEluZGV4ZWRTZXEpIHtcbiAgZnVuY3Rpb24gQ29sbGVjdGlvblNlcShjb2xsZWN0aW9uKSB7XG4gICAgdGhpcy5fY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247XG4gICAgdGhpcy5zaXplID0gY29sbGVjdGlvbi5sZW5ndGggfHwgY29sbGVjdGlvbi5zaXplO1xuICB9XG5cbiAgaWYgKCBJbmRleGVkU2VxICkgQ29sbGVjdGlvblNlcS5fX3Byb3RvX18gPSBJbmRleGVkU2VxO1xuICBDb2xsZWN0aW9uU2VxLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEluZGV4ZWRTZXEgJiYgSW5kZXhlZFNlcS5wcm90b3R5cGUgKTtcbiAgQ29sbGVjdGlvblNlcS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb2xsZWN0aW9uU2VxO1xuXG4gIENvbGxlY3Rpb25TZXEucHJvdG90eXBlLl9faXRlcmF0ZVVuY2FjaGVkID0gZnVuY3Rpb24gX19pdGVyYXRlVW5jYWNoZWQgKGZuLCByZXZlcnNlKSB7XG4gICAgaWYgKHJldmVyc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlUmVzdWx0KCkuX19pdGVyYXRlKGZuLCByZXZlcnNlKTtcbiAgICB9XG4gICAgdmFyIGNvbGxlY3Rpb24gPSB0aGlzLl9jb2xsZWN0aW9uO1xuICAgIHZhciBpdGVyYXRvciA9IGdldEl0ZXJhdG9yKGNvbGxlY3Rpb24pO1xuICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICBpZiAoaXNJdGVyYXRvcihpdGVyYXRvcikpIHtcbiAgICAgIHZhciBzdGVwO1xuICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICBpZiAoZm4oc3RlcC52YWx1ZSwgaXRlcmF0aW9ucysrLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXRlcmF0aW9ucztcbiAgfTtcblxuICBDb2xsZWN0aW9uU2VxLnByb3RvdHlwZS5fX2l0ZXJhdG9yVW5jYWNoZWQgPSBmdW5jdGlvbiBfX2l0ZXJhdG9yVW5jYWNoZWQgKHR5cGUsIHJldmVyc2UpIHtcbiAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVSZXN1bHQoKS5fX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpO1xuICAgIH1cbiAgICB2YXIgY29sbGVjdGlvbiA9IHRoaXMuX2NvbGxlY3Rpb247XG4gICAgdmFyIGl0ZXJhdG9yID0gZ2V0SXRlcmF0b3IoY29sbGVjdGlvbik7XG4gICAgaWYgKCFpc0l0ZXJhdG9yKGl0ZXJhdG9yKSkge1xuICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihpdGVyYXRvckRvbmUpO1xuICAgIH1cbiAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc3RlcCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgIHJldHVybiBzdGVwLmRvbmUgPyBzdGVwIDogaXRlcmF0b3JWYWx1ZSh0eXBlLCBpdGVyYXRpb25zKyssIHN0ZXAudmFsdWUpO1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBDb2xsZWN0aW9uU2VxO1xufShJbmRleGVkU2VxKSk7XG5cbi8vICMgcHJhZ21hIEhlbHBlciBmdW5jdGlvbnNcblxudmFyIEVNUFRZX1NFUTtcblxuZnVuY3Rpb24gZW1wdHlTZXF1ZW5jZSgpIHtcbiAgcmV0dXJuIEVNUFRZX1NFUSB8fCAoRU1QVFlfU0VRID0gbmV3IEFycmF5U2VxKFtdKSk7XG59XG5cbmZ1bmN0aW9uIGtleWVkU2VxRnJvbVZhbHVlKHZhbHVlKSB7XG4gIHZhciBzZXEgPSBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgID8gbmV3IEFycmF5U2VxKHZhbHVlKVxuICAgIDogaGFzSXRlcmF0b3IodmFsdWUpXG4gICAgICA/IG5ldyBDb2xsZWN0aW9uU2VxKHZhbHVlKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGlmIChzZXEpIHtcbiAgICByZXR1cm4gc2VxLmZyb21FbnRyeVNlcSgpO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG5ldyBPYmplY3RTZXEodmFsdWUpO1xuICB9XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgJ0V4cGVjdGVkIEFycmF5IG9yIGNvbGxlY3Rpb24gb2JqZWN0IG9mIFtrLCB2XSBlbnRyaWVzLCBvciBrZXllZCBvYmplY3Q6ICcgK1xuICAgICAgdmFsdWVcbiAgKTtcbn1cblxuZnVuY3Rpb24gaW5kZXhlZFNlcUZyb21WYWx1ZSh2YWx1ZSkge1xuICB2YXIgc2VxID0gbWF5YmVJbmRleGVkU2VxRnJvbVZhbHVlKHZhbHVlKTtcbiAgaWYgKHNlcSkge1xuICAgIHJldHVybiBzZXE7XG4gIH1cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAnRXhwZWN0ZWQgQXJyYXkgb3IgY29sbGVjdGlvbiBvYmplY3Qgb2YgdmFsdWVzOiAnICsgdmFsdWVcbiAgKTtcbn1cblxuZnVuY3Rpb24gc2VxRnJvbVZhbHVlKHZhbHVlKSB7XG4gIHZhciBzZXEgPSBtYXliZUluZGV4ZWRTZXFGcm9tVmFsdWUodmFsdWUpO1xuICBpZiAoc2VxKSB7XG4gICAgcmV0dXJuIHNlcTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBuZXcgT2JqZWN0U2VxKHZhbHVlKTtcbiAgfVxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICdFeHBlY3RlZCBBcnJheSBvciBjb2xsZWN0aW9uIG9iamVjdCBvZiB2YWx1ZXMsIG9yIGtleWVkIG9iamVjdDogJyArIHZhbHVlXG4gICk7XG59XG5cbmZ1bmN0aW9uIG1heWJlSW5kZXhlZFNlcUZyb21WYWx1ZSh2YWx1ZSkge1xuICByZXR1cm4gaXNBcnJheUxpa2UodmFsdWUpXG4gICAgPyBuZXcgQXJyYXlTZXEodmFsdWUpXG4gICAgOiBoYXNJdGVyYXRvcih2YWx1ZSlcbiAgICAgID8gbmV3IENvbGxlY3Rpb25TZXEodmFsdWUpXG4gICAgICA6IHVuZGVmaW5lZDtcbn1cblxudmFyIElTX01BUF9TWU1CT0wgPSAnQEBfX0lNTVVUQUJMRV9NQVBfX0BAJztcblxuZnVuY3Rpb24gaXNNYXAobWF5YmVNYXApIHtcbiAgcmV0dXJuIEJvb2xlYW4obWF5YmVNYXAgJiYgbWF5YmVNYXBbSVNfTUFQX1NZTUJPTF0pO1xufVxuXG5mdW5jdGlvbiBpc09yZGVyZWRNYXAobWF5YmVPcmRlcmVkTWFwKSB7XG4gIHJldHVybiBpc01hcChtYXliZU9yZGVyZWRNYXApICYmIGlzT3JkZXJlZChtYXliZU9yZGVyZWRNYXApO1xufVxuXG5mdW5jdGlvbiBpc1ZhbHVlT2JqZWN0KG1heWJlVmFsdWUpIHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgbWF5YmVWYWx1ZSAmJlxuICAgICAgdHlwZW9mIG1heWJlVmFsdWUuZXF1YWxzID09PSAnZnVuY3Rpb24nICYmXG4gICAgICB0eXBlb2YgbWF5YmVWYWx1ZS5oYXNoQ29kZSA9PT0gJ2Z1bmN0aW9uJ1xuICApO1xufVxuXG4vKipcbiAqIEFuIGV4dGVuc2lvbiBvZiB0aGUgXCJzYW1lLXZhbHVlXCIgYWxnb3JpdGhtIGFzIFtkZXNjcmliZWQgZm9yIHVzZSBieSBFUzYgTWFwXG4gKiBhbmQgU2V0XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9NYXAjS2V5X2VxdWFsaXR5KVxuICpcbiAqIE5hTiBpcyBjb25zaWRlcmVkIHRoZSBzYW1lIGFzIE5hTiwgaG93ZXZlciAtMCBhbmQgMCBhcmUgY29uc2lkZXJlZCB0aGUgc2FtZVxuICogdmFsdWUsIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBhbGdvcml0aG0gZGVzY3JpYmVkIGJ5XG4gKiBbYE9iamVjdC5pc2BdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pcykuXG4gKlxuICogVGhpcyBpcyBleHRlbmRlZCBmdXJ0aGVyIHRvIGFsbG93IE9iamVjdHMgdG8gZGVzY3JpYmUgdGhlIHZhbHVlcyB0aGV5XG4gKiByZXByZXNlbnQsIGJ5IHdheSBvZiBgdmFsdWVPZmAgb3IgYGVxdWFsc2AgKGFuZCBgaGFzaENvZGVgKS5cbiAqXG4gKiBOb3RlOiBiZWNhdXNlIG9mIHRoaXMgZXh0ZW5zaW9uLCB0aGUga2V5IGVxdWFsaXR5IG9mIEltbXV0YWJsZS5NYXAgYW5kIHRoZVxuICogdmFsdWUgZXF1YWxpdHkgb2YgSW1tdXRhYmxlLlNldCB3aWxsIGRpZmZlciBmcm9tIEVTNiBNYXAgYW5kIFNldC5cbiAqXG4gKiAjIyMgRGVmaW5pbmcgY3VzdG9tIHZhbHVlc1xuICpcbiAqIFRoZSBlYXNpZXN0IHdheSB0byBkZXNjcmliZSB0aGUgdmFsdWUgYW4gb2JqZWN0IHJlcHJlc2VudHMgaXMgYnkgaW1wbGVtZW50aW5nXG4gKiBgdmFsdWVPZmAuIEZvciBleGFtcGxlLCBgRGF0ZWAgcmVwcmVzZW50cyBhIHZhbHVlIGJ5IHJldHVybmluZyBhIHVuaXhcbiAqIHRpbWVzdGFtcCBmb3IgYHZhbHVlT2ZgOlxuICpcbiAqICAgICB2YXIgZGF0ZTEgPSBuZXcgRGF0ZSgxMjM0NTY3ODkwMDAwKTsgLy8gRnJpIEZlYiAxMyAyMDA5IC4uLlxuICogICAgIHZhciBkYXRlMiA9IG5ldyBEYXRlKDEyMzQ1Njc4OTAwMDApO1xuICogICAgIGRhdGUxLnZhbHVlT2YoKTsgLy8gMTIzNDU2Nzg5MDAwMFxuICogICAgIGFzc2VydCggZGF0ZTEgIT09IGRhdGUyICk7XG4gKiAgICAgYXNzZXJ0KCBJbW11dGFibGUuaXMoIGRhdGUxLCBkYXRlMiApICk7XG4gKlxuICogTm90ZTogb3ZlcnJpZGluZyBgdmFsdWVPZmAgbWF5IGhhdmUgb3RoZXIgaW1wbGljYXRpb25zIGlmIHlvdSB1c2UgdGhpcyBvYmplY3RcbiAqIHdoZXJlIEphdmFTY3JpcHQgZXhwZWN0cyBhIHByaW1pdGl2ZSwgc3VjaCBhcyBpbXBsaWNpdCBzdHJpbmcgY29lcmNpb24uXG4gKlxuICogRm9yIG1vcmUgY29tcGxleCB0eXBlcywgZXNwZWNpYWxseSBjb2xsZWN0aW9ucywgaW1wbGVtZW50aW5nIGB2YWx1ZU9mYCBtYXlcbiAqIG5vdCBiZSBwZXJmb3JtYW50LiBBbiBhbHRlcm5hdGl2ZSBpcyB0byBpbXBsZW1lbnQgYGVxdWFsc2AgYW5kIGBoYXNoQ29kZWAuXG4gKlxuICogYGVxdWFsc2AgdGFrZXMgYW5vdGhlciBvYmplY3QsIHByZXN1bWFibHkgb2Ygc2ltaWxhciB0eXBlLCBhbmQgcmV0dXJucyB0cnVlXG4gKiBpZiBpdCBpcyBlcXVhbC4gRXF1YWxpdHkgaXMgc3ltbWV0cmljYWwsIHNvIHRoZSBzYW1lIHJlc3VsdCBzaG91bGQgYmVcbiAqIHJldHVybmVkIGlmIHRoaXMgYW5kIHRoZSBhcmd1bWVudCBhcmUgZmxpcHBlZC5cbiAqXG4gKiAgICAgYXNzZXJ0KCBhLmVxdWFscyhiKSA9PT0gYi5lcXVhbHMoYSkgKTtcbiAqXG4gKiBgaGFzaENvZGVgIHJldHVybnMgYSAzMmJpdCBpbnRlZ2VyIG51bWJlciByZXByZXNlbnRpbmcgdGhlIG9iamVjdCB3aGljaCB3aWxsXG4gKiBiZSB1c2VkIHRvIGRldGVybWluZSBob3cgdG8gc3RvcmUgdGhlIHZhbHVlIG9iamVjdCBpbiBhIE1hcCBvciBTZXQuIFlvdSBtdXN0XG4gKiBwcm92aWRlIGJvdGggb3IgbmVpdGhlciBtZXRob2RzLCBvbmUgbXVzdCBub3QgZXhpc3Qgd2l0aG91dCB0aGUgb3RoZXIuXG4gKlxuICogQWxzbywgYW4gaW1wb3J0YW50IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZXNlIG1ldGhvZHMgbXVzdCBiZSB1cGhlbGQ6IGlmIHR3b1xuICogdmFsdWVzIGFyZSBlcXVhbCwgdGhleSAqbXVzdCogcmV0dXJuIHRoZSBzYW1lIGhhc2hDb2RlLiBJZiB0aGUgdmFsdWVzIGFyZSBub3RcbiAqIGVxdWFsLCB0aGV5IG1pZ2h0IGhhdmUgdGhlIHNhbWUgaGFzaENvZGU7IHRoaXMgaXMgY2FsbGVkIGEgaGFzaCBjb2xsaXNpb24sXG4gKiBhbmQgd2hpbGUgdW5kZXNpcmFibGUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGl0IGlzIGFjY2VwdGFibGUuXG4gKlxuICogICAgIGlmIChhLmVxdWFscyhiKSkge1xuICogICAgICAgYXNzZXJ0KCBhLmhhc2hDb2RlKCkgPT09IGIuaGFzaENvZGUoKSApO1xuICogICAgIH1cbiAqXG4gKiBBbGwgSW1tdXRhYmxlIGNvbGxlY3Rpb25zIGFyZSBWYWx1ZSBPYmplY3RzOiB0aGV5IGltcGxlbWVudCBgZXF1YWxzKClgXG4gKiBhbmQgYGhhc2hDb2RlKClgLlxuICovXG5mdW5jdGlvbiBpcyh2YWx1ZUEsIHZhbHVlQikge1xuICBpZiAodmFsdWVBID09PSB2YWx1ZUIgfHwgKHZhbHVlQSAhPT0gdmFsdWVBICYmIHZhbHVlQiAhPT0gdmFsdWVCKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICghdmFsdWVBIHx8ICF2YWx1ZUIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKFxuICAgIHR5cGVvZiB2YWx1ZUEudmFsdWVPZiA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiB2YWx1ZUIudmFsdWVPZiA9PT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICB2YWx1ZUEgPSB2YWx1ZUEudmFsdWVPZigpO1xuICAgIHZhbHVlQiA9IHZhbHVlQi52YWx1ZU9mKCk7XG4gICAgaWYgKHZhbHVlQSA9PT0gdmFsdWVCIHx8ICh2YWx1ZUEgIT09IHZhbHVlQSAmJiB2YWx1ZUIgIT09IHZhbHVlQikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIXZhbHVlQSB8fCAhdmFsdWVCKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiAhIShcbiAgICBpc1ZhbHVlT2JqZWN0KHZhbHVlQSkgJiZcbiAgICBpc1ZhbHVlT2JqZWN0KHZhbHVlQikgJiZcbiAgICB2YWx1ZUEuZXF1YWxzKHZhbHVlQilcbiAgKTtcbn1cblxudmFyIGltdWwgPVxuICB0eXBlb2YgTWF0aC5pbXVsID09PSAnZnVuY3Rpb24nICYmIE1hdGguaW11bCgweGZmZmZmZmZmLCAyKSA9PT0gLTJcbiAgICA/IE1hdGguaW11bFxuICAgIDogZnVuY3Rpb24gaW11bChhLCBiKSB7XG4gICAgICAgIGEgfD0gMDsgLy8gaW50XG4gICAgICAgIGIgfD0gMDsgLy8gaW50XG4gICAgICAgIHZhciBjID0gYSAmIDB4ZmZmZjtcbiAgICAgICAgdmFyIGQgPSBiICYgMHhmZmZmO1xuICAgICAgICAvLyBTaGlmdCBieSAwIGZpeGVzIHRoZSBzaWduIG9uIHRoZSBoaWdoIHBhcnQuXG4gICAgICAgIHJldHVybiAoYyAqIGQgKyAoKCgoYSA+Pj4gMTYpICogZCArIGMgKiAoYiA+Pj4gMTYpKSA8PCAxNikgPj4+IDApKSB8IDA7IC8vIGludFxuICAgICAgfTtcblxuLy8gdjggaGFzIGFuIG9wdGltaXphdGlvbiBmb3Igc3RvcmluZyAzMS1iaXQgc2lnbmVkIG51bWJlcnMuXG4vLyBWYWx1ZXMgd2hpY2ggaGF2ZSBlaXRoZXIgMDAgb3IgMTEgYXMgdGhlIGhpZ2ggb3JkZXIgYml0cyBxdWFsaWZ5LlxuLy8gVGhpcyBmdW5jdGlvbiBkcm9wcyB0aGUgaGlnaGVzdCBvcmRlciBiaXQgaW4gYSBzaWduZWQgbnVtYmVyLCBtYWludGFpbmluZ1xuLy8gdGhlIHNpZ24gYml0LlxuZnVuY3Rpb24gc21pKGkzMikge1xuICByZXR1cm4gKChpMzIgPj4+IDEpICYgMHg0MDAwMDAwMCkgfCAoaTMyICYgMHhiZmZmZmZmZik7XG59XG5cbnZhciBkZWZhdWx0VmFsdWVPZiA9IE9iamVjdC5wcm90b3R5cGUudmFsdWVPZjtcblxuZnVuY3Rpb24gaGFzaChvKSB7XG4gIHN3aXRjaCAodHlwZW9mIG8pIHtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIC8vIFRoZSBoYXNoIHZhbHVlcyBmb3IgYnVpbHQtaW4gY29uc3RhbnRzIGFyZSBhIDEgdmFsdWUgZm9yIGVhY2ggNS1ieXRlXG4gICAgICAvLyBzaGlmdCByZWdpb24gZXhwZWN0IGZvciB0aGUgZmlyc3QsIHdoaWNoIGVuY29kZXMgdGhlIHZhbHVlLiBUaGlzXG4gICAgICAvLyByZWR1Y2VzIHRoZSBvZGRzIG9mIGEgaGFzaCBjb2xsaXNpb24gZm9yIHRoZXNlIGNvbW1vbiB2YWx1ZXMuXG4gICAgICByZXR1cm4gbyA/IDB4NDIxMDg0MjEgOiAweDQyMTA4NDIwO1xuICAgIGNhc2UgJ251bWJlcic6XG4gICAgICByZXR1cm4gaGFzaE51bWJlcihvKTtcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgcmV0dXJuIG8ubGVuZ3RoID4gU1RSSU5HX0hBU0hfQ0FDSEVfTUlOX1NUUkxFTlxuICAgICAgICA/IGNhY2hlZEhhc2hTdHJpbmcobylcbiAgICAgICAgOiBoYXNoU3RyaW5nKG8pO1xuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgaWYgKG8gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDB4NDIxMDg0MjI7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG8uaGFzaENvZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gRHJvcCBhbnkgaGlnaCBiaXRzIGZyb20gYWNjaWRlbnRhbGx5IGxvbmcgaGFzaCBjb2Rlcy5cbiAgICAgICAgcmV0dXJuIHNtaShvLmhhc2hDb2RlKG8pKTtcbiAgICAgIH1cbiAgICAgIGlmIChvLnZhbHVlT2YgIT09IGRlZmF1bHRWYWx1ZU9mICYmIHR5cGVvZiBvLnZhbHVlT2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbyA9IG8udmFsdWVPZihvKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNoSlNPYmoobyk7XG4gICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgIHJldHVybiAweDQyMTA4NDIzO1xuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodHlwZW9mIG8udG9TdHJpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGhhc2hTdHJpbmcoby50b1N0cmluZygpKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgdHlwZSAnICsgdHlwZW9mIG8gKyAnIGNhbm5vdCBiZSBoYXNoZWQuJyk7XG4gIH1cbn1cblxuLy8gQ29tcHJlc3MgYXJiaXRyYXJpbHkgbGFyZ2UgbnVtYmVycyBpbnRvIHNtaSBoYXNoZXMuXG5mdW5jdGlvbiBoYXNoTnVtYmVyKG4pIHtcbiAgaWYgKG4gIT09IG4gfHwgbiA9PT0gSW5maW5pdHkpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICB2YXIgaGFzaCA9IG4gfCAwO1xuICBpZiAoaGFzaCAhPT0gbikge1xuICAgIGhhc2ggXj0gbiAqIDB4ZmZmZmZmZmY7XG4gIH1cbiAgd2hpbGUgKG4gPiAweGZmZmZmZmZmKSB7XG4gICAgbiAvPSAweGZmZmZmZmZmO1xuICAgIGhhc2ggXj0gbjtcbiAgfVxuICByZXR1cm4gc21pKGhhc2gpO1xufVxuXG5mdW5jdGlvbiBjYWNoZWRIYXNoU3RyaW5nKHN0cmluZykge1xuICB2YXIgaGFzaGVkID0gc3RyaW5nSGFzaENhY2hlW3N0cmluZ107XG4gIGlmIChoYXNoZWQgPT09IHVuZGVmaW5lZCkge1xuICAgIGhhc2hlZCA9IGhhc2hTdHJpbmcoc3RyaW5nKTtcbiAgICBpZiAoU1RSSU5HX0hBU0hfQ0FDSEVfU0laRSA9PT0gU1RSSU5HX0hBU0hfQ0FDSEVfTUFYX1NJWkUpIHtcbiAgICAgIFNUUklOR19IQVNIX0NBQ0hFX1NJWkUgPSAwO1xuICAgICAgc3RyaW5nSGFzaENhY2hlID0ge307XG4gICAgfVxuICAgIFNUUklOR19IQVNIX0NBQ0hFX1NJWkUrKztcbiAgICBzdHJpbmdIYXNoQ2FjaGVbc3RyaW5nXSA9IGhhc2hlZDtcbiAgfVxuICByZXR1cm4gaGFzaGVkO1xufVxuXG4vLyBodHRwOi8vanNwZXJmLmNvbS9oYXNoaW5nLXN0cmluZ3NcbmZ1bmN0aW9uIGhhc2hTdHJpbmcoc3RyaW5nKSB7XG4gIC8vIFRoaXMgaXMgdGhlIGhhc2ggZnJvbSBKVk1cbiAgLy8gVGhlIGhhc2ggY29kZSBmb3IgYSBzdHJpbmcgaXMgY29tcHV0ZWQgYXNcbiAgLy8gc1swXSAqIDMxIF4gKG4gLSAxKSArIHNbMV0gKiAzMSBeIChuIC0gMikgKyAuLi4gKyBzW24gLSAxXSxcbiAgLy8gd2hlcmUgc1tpXSBpcyB0aGUgaXRoIGNoYXJhY3RlciBvZiB0aGUgc3RyaW5nIGFuZCBuIGlzIHRoZSBsZW5ndGggb2ZcbiAgLy8gdGhlIHN0cmluZy4gV2UgXCJtb2RcIiB0aGUgcmVzdWx0IHRvIG1ha2UgaXQgYmV0d2VlbiAwIChpbmNsdXNpdmUpIGFuZCAyXjMxXG4gIC8vIChleGNsdXNpdmUpIGJ5IGRyb3BwaW5nIGhpZ2ggYml0cy5cbiAgdmFyIGhhc2hlZCA9IDA7XG4gIGZvciAodmFyIGlpID0gMDsgaWkgPCBzdHJpbmcubGVuZ3RoOyBpaSsrKSB7XG4gICAgaGFzaGVkID0gKDMxICogaGFzaGVkICsgc3RyaW5nLmNoYXJDb2RlQXQoaWkpKSB8IDA7XG4gIH1cbiAgcmV0dXJuIHNtaShoYXNoZWQpO1xufVxuXG5mdW5jdGlvbiBoYXNoSlNPYmoob2JqKSB7XG4gIHZhciBoYXNoZWQ7XG4gIGlmICh1c2luZ1dlYWtNYXApIHtcbiAgICBoYXNoZWQgPSB3ZWFrTWFwLmdldChvYmopO1xuICAgIGlmIChoYXNoZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGhhc2hlZDtcbiAgICB9XG4gIH1cblxuICBoYXNoZWQgPSBvYmpbVUlEX0hBU0hfS0VZXTtcbiAgaWYgKGhhc2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGhhc2hlZDtcbiAgfVxuXG4gIGlmICghY2FuRGVmaW5lUHJvcGVydHkpIHtcbiAgICBoYXNoZWQgPSBvYmoucHJvcGVydHlJc0VudW1lcmFibGUgJiYgb2JqLnByb3BlcnR5SXNFbnVtZXJhYmxlW1VJRF9IQVNIX0tFWV07XG4gICAgaWYgKGhhc2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gaGFzaGVkO1xuICAgIH1cblxuICAgIGhhc2hlZCA9IGdldElFTm9kZUhhc2gob2JqKTtcbiAgICBpZiAoaGFzaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBoYXNoZWQ7XG4gICAgfVxuICB9XG5cbiAgaGFzaGVkID0gKytvYmpIYXNoVUlEO1xuICBpZiAob2JqSGFzaFVJRCAmIDB4NDAwMDAwMDApIHtcbiAgICBvYmpIYXNoVUlEID0gMDtcbiAgfVxuXG4gIGlmICh1c2luZ1dlYWtNYXApIHtcbiAgICB3ZWFrTWFwLnNldChvYmosIGhhc2hlZCk7XG4gIH0gZWxzZSBpZiAoaXNFeHRlbnNpYmxlICE9PSB1bmRlZmluZWQgJiYgaXNFeHRlbnNpYmxlKG9iaikgPT09IGZhbHNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb24tZXh0ZW5zaWJsZSBvYmplY3RzIGFyZSBub3QgYWxsb3dlZCBhcyBrZXlzLicpO1xuICB9IGVsc2UgaWYgKGNhbkRlZmluZVByb3BlcnR5KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgVUlEX0hBU0hfS0VZLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogaGFzaGVkLFxuICAgIH0pO1xuICB9IGVsc2UgaWYgKFxuICAgIG9iai5wcm9wZXJ0eUlzRW51bWVyYWJsZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgb2JqLnByb3BlcnR5SXNFbnVtZXJhYmxlID09PSBvYmouY29uc3RydWN0b3IucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlXG4gICkge1xuICAgIC8vIFNpbmNlIHdlIGNhbid0IGRlZmluZSBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5IG9uIHRoZSBvYmplY3RcbiAgICAvLyB3ZSdsbCBoaWphY2sgb25lIG9mIHRoZSBsZXNzLXVzZWQgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcyB0b1xuICAgIC8vIHNhdmUgb3VyIGhhc2ggb24gaXQuIFNpbmNlIHRoaXMgaXMgYSBmdW5jdGlvbiBpdCB3aWxsIG5vdCBzaG93IHVwIGluXG4gICAgLy8gYEpTT04uc3RyaW5naWZ5YCB3aGljaCBpcyB3aGF0IHdlIHdhbnQuXG4gICAgb2JqLnByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuYXBwbHkoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGFyZ3VtZW50c1xuICAgICAgKTtcbiAgICB9O1xuICAgIG9iai5wcm9wZXJ0eUlzRW51bWVyYWJsZVtVSURfSEFTSF9LRVldID0gaGFzaGVkO1xuICB9IGVsc2UgaWYgKG9iai5ub2RlVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBjb3VsZG4ndCBnZXQgdGhlIElFIGB1bmlxdWVJRGAgdG8gdXNlIGFzIGEgaGFzaFxuICAgIC8vIGFuZCB3ZSBjb3VsZG4ndCB1c2UgYSBub24tZW51bWVyYWJsZSBwcm9wZXJ0eSB0byBleHBsb2l0IHRoZVxuICAgIC8vIGRvbnRFbnVtIGJ1ZyBzbyB3ZSBzaW1wbHkgYWRkIHRoZSBgVUlEX0hBU0hfS0VZYCBvbiB0aGUgbm9kZVxuICAgIC8vIGl0c2VsZi5cbiAgICBvYmpbVUlEX0hBU0hfS0VZXSA9IGhhc2hlZDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBzZXQgYSBub24tZW51bWVyYWJsZSBwcm9wZXJ0eSBvbiBvYmplY3QuJyk7XG4gIH1cblxuICByZXR1cm4gaGFzaGVkO1xufVxuXG4vLyBHZXQgcmVmZXJlbmNlcyB0byBFUzUgb2JqZWN0IG1ldGhvZHMuXG52YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZTtcblxuLy8gVHJ1ZSBpZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgd29ya3MgYXMgZXhwZWN0ZWQuIElFOCBmYWlscyB0aGlzIHRlc3QuXG52YXIgY2FuRGVmaW5lUHJvcGVydHkgPSAoZnVuY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnQCcsIHt9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufSkoKTtcblxuLy8gSUUgaGFzIGEgYHVuaXF1ZUlEYCBwcm9wZXJ0eSBvbiBET00gbm9kZXMuIFdlIGNhbiBjb25zdHJ1Y3QgdGhlIGhhc2ggZnJvbSBpdFxuLy8gYW5kIGF2b2lkIG1lbW9yeSBsZWFrcyBmcm9tIHRoZSBJRSBjbG9uZU5vZGUgYnVnLlxuZnVuY3Rpb24gZ2V0SUVOb2RlSGFzaChub2RlKSB7XG4gIGlmIChub2RlICYmIG5vZGUubm9kZVR5cGUgPiAwKSB7XG4gICAgc3dpdGNoIChub2RlLm5vZGVUeXBlKSB7XG4gICAgICBjYXNlIDE6IC8vIEVsZW1lbnRcbiAgICAgICAgcmV0dXJuIG5vZGUudW5pcXVlSUQ7XG4gICAgICBjYXNlIDk6IC8vIERvY3VtZW50XG4gICAgICAgIHJldHVybiBub2RlLmRvY3VtZW50RWxlbWVudCAmJiBub2RlLmRvY3VtZW50RWxlbWVudC51bmlxdWVJRDtcbiAgICB9XG4gIH1cbn1cblxuLy8gSWYgcG9zc2libGUsIHVzZSBhIFdlYWtNYXAuXG52YXIgdXNpbmdXZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbic7XG52YXIgd2Vha01hcDtcbmlmICh1c2luZ1dlYWtNYXApIHtcbiAgd2Vha01hcCA9IG5ldyBXZWFrTWFwKCk7XG59XG5cbnZhciBvYmpIYXNoVUlEID0gMDtcblxudmFyIFVJRF9IQVNIX0tFWSA9ICdfX2ltbXV0YWJsZWhhc2hfXyc7XG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJykge1xuICBVSURfSEFTSF9LRVkgPSBTeW1ib2woVUlEX0hBU0hfS0VZKTtcbn1cblxudmFyIFNUUklOR19IQVNIX0NBQ0hFX01JTl9TVFJMRU4gPSAxNjtcbnZhciBTVFJJTkdfSEFTSF9DQUNIRV9NQVhfU0laRSA9IDI1NTtcbnZhciBTVFJJTkdfSEFTSF9DQUNIRV9TSVpFID0gMDtcbnZhciBzdHJpbmdIYXNoQ2FjaGUgPSB7fTtcblxudmFyIFRvS2V5ZWRTZXF1ZW5jZSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEtleWVkU2VxJCQxKSB7XG4gIGZ1bmN0aW9uIFRvS2V5ZWRTZXF1ZW5jZShpbmRleGVkLCB1c2VLZXlzKSB7XG4gICAgdGhpcy5faXRlciA9IGluZGV4ZWQ7XG4gICAgdGhpcy5fdXNlS2V5cyA9IHVzZUtleXM7XG4gICAgdGhpcy5zaXplID0gaW5kZXhlZC5zaXplO1xuICB9XG5cbiAgaWYgKCBLZXllZFNlcSQkMSApIFRvS2V5ZWRTZXF1ZW5jZS5fX3Byb3RvX18gPSBLZXllZFNlcSQkMTtcbiAgVG9LZXllZFNlcXVlbmNlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEtleWVkU2VxJCQxICYmIEtleWVkU2VxJCQxLnByb3RvdHlwZSApO1xuICBUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVG9LZXllZFNlcXVlbmNlO1xuXG4gIFRvS2V5ZWRTZXF1ZW5jZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChrZXksIG5vdFNldFZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZXIuZ2V0KGtleSwgbm90U2V0VmFsdWUpO1xuICB9O1xuXG4gIFRvS2V5ZWRTZXF1ZW5jZS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gaGFzIChrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5faXRlci5oYXMoa2V5KTtcbiAgfTtcblxuICBUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlLnZhbHVlU2VxID0gZnVuY3Rpb24gdmFsdWVTZXEgKCkge1xuICAgIHJldHVybiB0aGlzLl9pdGVyLnZhbHVlU2VxKCk7XG4gIH07XG5cbiAgVG9LZXllZFNlcXVlbmNlLnByb3RvdHlwZS5yZXZlcnNlID0gZnVuY3Rpb24gcmV2ZXJzZSAoKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgcmV2ZXJzZWRTZXF1ZW5jZSA9IHJldmVyc2VGYWN0b3J5KHRoaXMsIHRydWUpO1xuICAgIGlmICghdGhpcy5fdXNlS2V5cykge1xuICAgICAgcmV2ZXJzZWRTZXF1ZW5jZS52YWx1ZVNlcSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMkMS5faXRlci50b1NlcSgpLnJldmVyc2UoKTsgfTtcbiAgICB9XG4gICAgcmV0dXJuIHJldmVyc2VkU2VxdWVuY2U7XG4gIH07XG5cbiAgVG9LZXllZFNlcXVlbmNlLnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbiBtYXAgKG1hcHBlciwgY29udGV4dCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdmFyIG1hcHBlZFNlcXVlbmNlID0gbWFwRmFjdG9yeSh0aGlzLCBtYXBwZXIsIGNvbnRleHQpO1xuICAgIGlmICghdGhpcy5fdXNlS2V5cykge1xuICAgICAgbWFwcGVkU2VxdWVuY2UudmFsdWVTZXEgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzJDEuX2l0ZXIudG9TZXEoKS5tYXAobWFwcGVyLCBjb250ZXh0KTsgfTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcHBlZFNlcXVlbmNlO1xuICB9O1xuXG4gIFRvS2V5ZWRTZXF1ZW5jZS5wcm90b3R5cGUuX19pdGVyYXRlID0gZnVuY3Rpb24gX19pdGVyYXRlIChmbiwgcmV2ZXJzZSkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgcmV0dXJuIHRoaXMuX2l0ZXIuX19pdGVyYXRlKGZ1bmN0aW9uICh2LCBrKSB7IHJldHVybiBmbih2LCBrLCB0aGlzJDEpOyB9LCByZXZlcnNlKTtcbiAgfTtcblxuICBUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbiBfX2l0ZXJhdG9yICh0eXBlLCByZXZlcnNlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZXIuX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbiAgfTtcblxuICByZXR1cm4gVG9LZXllZFNlcXVlbmNlO1xufShLZXllZFNlcSkpO1xuVG9LZXllZFNlcXVlbmNlLnByb3RvdHlwZVtJU19PUkRFUkVEX1NZTUJPTF0gPSB0cnVlO1xuXG52YXIgVG9JbmRleGVkU2VxdWVuY2UgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChJbmRleGVkU2VxJCQxKSB7XG4gIGZ1bmN0aW9uIFRvSW5kZXhlZFNlcXVlbmNlKGl0ZXIpIHtcbiAgICB0aGlzLl9pdGVyID0gaXRlcjtcbiAgICB0aGlzLnNpemUgPSBpdGVyLnNpemU7XG4gIH1cblxuICBpZiAoIEluZGV4ZWRTZXEkJDEgKSBUb0luZGV4ZWRTZXF1ZW5jZS5fX3Byb3RvX18gPSBJbmRleGVkU2VxJCQxO1xuICBUb0luZGV4ZWRTZXF1ZW5jZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBJbmRleGVkU2VxJCQxICYmIEluZGV4ZWRTZXEkJDEucHJvdG90eXBlICk7XG4gIFRvSW5kZXhlZFNlcXVlbmNlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRvSW5kZXhlZFNlcXVlbmNlO1xuXG4gIFRvSW5kZXhlZFNlcXVlbmNlLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzICh2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9pdGVyLmluY2x1ZGVzKHZhbHVlKTtcbiAgfTtcblxuICBUb0luZGV4ZWRTZXF1ZW5jZS5wcm90b3R5cGUuX19pdGVyYXRlID0gZnVuY3Rpb24gX19pdGVyYXRlIChmbiwgcmV2ZXJzZSkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdmFyIGkgPSAwO1xuICAgIHJldmVyc2UgJiYgZW5zdXJlU2l6ZSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5faXRlci5fX2l0ZXJhdGUoXG4gICAgICBmdW5jdGlvbiAodikgeyByZXR1cm4gZm4odiwgcmV2ZXJzZSA/IHRoaXMkMS5zaXplIC0gKytpIDogaSsrLCB0aGlzJDEpOyB9LFxuICAgICAgcmV2ZXJzZVxuICAgICk7XG4gIH07XG5cbiAgVG9JbmRleGVkU2VxdWVuY2UucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbiBfX2l0ZXJhdG9yICh0eXBlLCByZXZlcnNlKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgaXRlcmF0b3IgPSB0aGlzLl9pdGVyLl9faXRlcmF0b3IoSVRFUkFURV9WQUxVRVMsIHJldmVyc2UpO1xuICAgIHZhciBpID0gMDtcbiAgICByZXZlcnNlICYmIGVuc3VyZVNpemUodGhpcyk7XG4gICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc3RlcCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgIHJldHVybiBzdGVwLmRvbmVcbiAgICAgICAgPyBzdGVwXG4gICAgICAgIDogaXRlcmF0b3JWYWx1ZShcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICByZXZlcnNlID8gdGhpcyQxLnNpemUgLSArK2kgOiBpKyssXG4gICAgICAgICAgICBzdGVwLnZhbHVlLFxuICAgICAgICAgICAgc3RlcFxuICAgICAgICAgICk7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIFRvSW5kZXhlZFNlcXVlbmNlO1xufShJbmRleGVkU2VxKSk7XG5cbnZhciBUb1NldFNlcXVlbmNlID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoU2V0U2VxJCQxKSB7XG4gIGZ1bmN0aW9uIFRvU2V0U2VxdWVuY2UoaXRlcikge1xuICAgIHRoaXMuX2l0ZXIgPSBpdGVyO1xuICAgIHRoaXMuc2l6ZSA9IGl0ZXIuc2l6ZTtcbiAgfVxuXG4gIGlmICggU2V0U2VxJCQxICkgVG9TZXRTZXF1ZW5jZS5fX3Byb3RvX18gPSBTZXRTZXEkJDE7XG4gIFRvU2V0U2VxdWVuY2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggU2V0U2VxJCQxICYmIFNldFNlcSQkMS5wcm90b3R5cGUgKTtcbiAgVG9TZXRTZXF1ZW5jZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb1NldFNlcXVlbmNlO1xuXG4gIFRvU2V0U2VxdWVuY2UucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIGhhcyAoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZXIuaW5jbHVkZXMoa2V5KTtcbiAgfTtcblxuICBUb1NldFNlcXVlbmNlLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbiBfX2l0ZXJhdGUgKGZuLCByZXZlcnNlKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICByZXR1cm4gdGhpcy5faXRlci5fX2l0ZXJhdGUoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIGZuKHYsIHYsIHRoaXMkMSk7IH0sIHJldmVyc2UpO1xuICB9O1xuXG4gIFRvU2V0U2VxdWVuY2UucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbiBfX2l0ZXJhdG9yICh0eXBlLCByZXZlcnNlKSB7XG4gICAgdmFyIGl0ZXJhdG9yID0gdGhpcy5faXRlci5fX2l0ZXJhdG9yKElURVJBVEVfVkFMVUVTLCByZXZlcnNlKTtcbiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgcmV0dXJuIHN0ZXAuZG9uZVxuICAgICAgICA/IHN0ZXBcbiAgICAgICAgOiBpdGVyYXRvclZhbHVlKHR5cGUsIHN0ZXAudmFsdWUsIHN0ZXAudmFsdWUsIHN0ZXApO1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBUb1NldFNlcXVlbmNlO1xufShTZXRTZXEpKTtcblxudmFyIEZyb21FbnRyaWVzU2VxdWVuY2UgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChLZXllZFNlcSQkMSkge1xuICBmdW5jdGlvbiBGcm9tRW50cmllc1NlcXVlbmNlKGVudHJpZXMpIHtcbiAgICB0aGlzLl9pdGVyID0gZW50cmllcztcbiAgICB0aGlzLnNpemUgPSBlbnRyaWVzLnNpemU7XG4gIH1cblxuICBpZiAoIEtleWVkU2VxJCQxICkgRnJvbUVudHJpZXNTZXF1ZW5jZS5fX3Byb3RvX18gPSBLZXllZFNlcSQkMTtcbiAgRnJvbUVudHJpZXNTZXF1ZW5jZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBLZXllZFNlcSQkMSAmJiBLZXllZFNlcSQkMS5wcm90b3R5cGUgKTtcbiAgRnJvbUVudHJpZXNTZXF1ZW5jZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBGcm9tRW50cmllc1NlcXVlbmNlO1xuXG4gIEZyb21FbnRyaWVzU2VxdWVuY2UucHJvdG90eXBlLmVudHJ5U2VxID0gZnVuY3Rpb24gZW50cnlTZXEgKCkge1xuICAgIHJldHVybiB0aGlzLl9pdGVyLnRvU2VxKCk7XG4gIH07XG5cbiAgRnJvbUVudHJpZXNTZXF1ZW5jZS5wcm90b3R5cGUuX19pdGVyYXRlID0gZnVuY3Rpb24gX19pdGVyYXRlIChmbiwgcmV2ZXJzZSkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgcmV0dXJuIHRoaXMuX2l0ZXIuX19pdGVyYXRlKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgLy8gQ2hlY2sgaWYgZW50cnkgZXhpc3RzIGZpcnN0IHNvIGFycmF5IGFjY2VzcyBkb2Vzbid0IHRocm93IGZvciBob2xlc1xuICAgICAgLy8gaW4gdGhlIHBhcmVudCBpdGVyYXRpb24uXG4gICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgdmFsaWRhdGVFbnRyeShlbnRyeSk7XG4gICAgICAgIHZhciBpbmRleGVkQ29sbGVjdGlvbiA9IGlzQ29sbGVjdGlvbihlbnRyeSk7XG4gICAgICAgIHJldHVybiBmbihcbiAgICAgICAgICBpbmRleGVkQ29sbGVjdGlvbiA/IGVudHJ5LmdldCgxKSA6IGVudHJ5WzFdLFxuICAgICAgICAgIGluZGV4ZWRDb2xsZWN0aW9uID8gZW50cnkuZ2V0KDApIDogZW50cnlbMF0sXG4gICAgICAgICAgdGhpcyQxXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSwgcmV2ZXJzZSk7XG4gIH07XG5cbiAgRnJvbUVudHJpZXNTZXF1ZW5jZS5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uIF9faXRlcmF0b3IgKHR5cGUsIHJldmVyc2UpIHtcbiAgICB2YXIgaXRlcmF0b3IgPSB0aGlzLl9pdGVyLl9faXRlcmF0b3IoSVRFUkFURV9WQUxVRVMsIHJldmVyc2UpO1xuICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIGlmIChzdGVwLmRvbmUpIHtcbiAgICAgICAgICByZXR1cm4gc3RlcDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZW50cnkgPSBzdGVwLnZhbHVlO1xuICAgICAgICAvLyBDaGVjayBpZiBlbnRyeSBleGlzdHMgZmlyc3Qgc28gYXJyYXkgYWNjZXNzIGRvZXNuJ3QgdGhyb3cgZm9yIGhvbGVzXG4gICAgICAgIC8vIGluIHRoZSBwYXJlbnQgaXRlcmF0aW9uLlxuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICB2YWxpZGF0ZUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB2YXIgaW5kZXhlZENvbGxlY3Rpb24gPSBpc0NvbGxlY3Rpb24oZW50cnkpO1xuICAgICAgICAgIHJldHVybiBpdGVyYXRvclZhbHVlKFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIGluZGV4ZWRDb2xsZWN0aW9uID8gZW50cnkuZ2V0KDApIDogZW50cnlbMF0sXG4gICAgICAgICAgICBpbmRleGVkQ29sbGVjdGlvbiA/IGVudHJ5LmdldCgxKSA6IGVudHJ5WzFdLFxuICAgICAgICAgICAgc3RlcFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gRnJvbUVudHJpZXNTZXF1ZW5jZTtcbn0oS2V5ZWRTZXEpKTtcblxuVG9JbmRleGVkU2VxdWVuY2UucHJvdG90eXBlLmNhY2hlUmVzdWx0ID0gVG9LZXllZFNlcXVlbmNlLnByb3RvdHlwZS5jYWNoZVJlc3VsdCA9IFRvU2V0U2VxdWVuY2UucHJvdG90eXBlLmNhY2hlUmVzdWx0ID0gRnJvbUVudHJpZXNTZXF1ZW5jZS5wcm90b3R5cGUuY2FjaGVSZXN1bHQgPSBjYWNoZVJlc3VsdFRocm91Z2g7XG5cbmZ1bmN0aW9uIGZsaXBGYWN0b3J5KGNvbGxlY3Rpb24pIHtcbiAgdmFyIGZsaXBTZXF1ZW5jZSA9IG1ha2VTZXF1ZW5jZShjb2xsZWN0aW9uKTtcbiAgZmxpcFNlcXVlbmNlLl9pdGVyID0gY29sbGVjdGlvbjtcbiAgZmxpcFNlcXVlbmNlLnNpemUgPSBjb2xsZWN0aW9uLnNpemU7XG4gIGZsaXBTZXF1ZW5jZS5mbGlwID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gY29sbGVjdGlvbjsgfTtcbiAgZmxpcFNlcXVlbmNlLnJldmVyc2UgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmV2ZXJzZWRTZXF1ZW5jZSA9IGNvbGxlY3Rpb24ucmV2ZXJzZS5hcHBseSh0aGlzKTsgLy8gc3VwZXIucmV2ZXJzZSgpXG4gICAgcmV2ZXJzZWRTZXF1ZW5jZS5mbGlwID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gY29sbGVjdGlvbi5yZXZlcnNlKCk7IH07XG4gICAgcmV0dXJuIHJldmVyc2VkU2VxdWVuY2U7XG4gIH07XG4gIGZsaXBTZXF1ZW5jZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBjb2xsZWN0aW9uLmluY2x1ZGVzKGtleSk7IH07XG4gIGZsaXBTZXF1ZW5jZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGNvbGxlY3Rpb24uaGFzKGtleSk7IH07XG4gIGZsaXBTZXF1ZW5jZS5jYWNoZVJlc3VsdCA9IGNhY2hlUmVzdWx0VGhyb3VnaDtcbiAgZmxpcFNlcXVlbmNlLl9faXRlcmF0ZVVuY2FjaGVkID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHJldHVybiBjb2xsZWN0aW9uLl9faXRlcmF0ZShmdW5jdGlvbiAodiwgaykgeyByZXR1cm4gZm4oaywgdiwgdGhpcyQxKSAhPT0gZmFsc2U7IH0sIHJldmVyc2UpO1xuICB9O1xuICBmbGlwU2VxdWVuY2UuX19pdGVyYXRvclVuY2FjaGVkID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge1xuICAgIGlmICh0eXBlID09PSBJVEVSQVRFX0VOVFJJRVMpIHtcbiAgICAgIHZhciBpdGVyYXRvciA9IGNvbGxlY3Rpb24uX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbiAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3RlcCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgaWYgKCFzdGVwLmRvbmUpIHtcbiAgICAgICAgICB2YXIgayA9IHN0ZXAudmFsdWVbMF07XG4gICAgICAgICAgc3RlcC52YWx1ZVswXSA9IHN0ZXAudmFsdWVbMV07XG4gICAgICAgICAgc3RlcC52YWx1ZVsxXSA9IGs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbGxlY3Rpb24uX19pdGVyYXRvcihcbiAgICAgIHR5cGUgPT09IElURVJBVEVfVkFMVUVTID8gSVRFUkFURV9LRVlTIDogSVRFUkFURV9WQUxVRVMsXG4gICAgICByZXZlcnNlXG4gICAgKTtcbiAgfTtcbiAgcmV0dXJuIGZsaXBTZXF1ZW5jZTtcbn1cblxuZnVuY3Rpb24gbWFwRmFjdG9yeShjb2xsZWN0aW9uLCBtYXBwZXIsIGNvbnRleHQpIHtcbiAgdmFyIG1hcHBlZFNlcXVlbmNlID0gbWFrZVNlcXVlbmNlKGNvbGxlY3Rpb24pO1xuICBtYXBwZWRTZXF1ZW5jZS5zaXplID0gY29sbGVjdGlvbi5zaXplO1xuICBtYXBwZWRTZXF1ZW5jZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBjb2xsZWN0aW9uLmhhcyhrZXkpOyB9O1xuICBtYXBwZWRTZXF1ZW5jZS5nZXQgPSBmdW5jdGlvbiAoa2V5LCBub3RTZXRWYWx1ZSkge1xuICAgIHZhciB2ID0gY29sbGVjdGlvbi5nZXQoa2V5LCBOT1RfU0VUKTtcbiAgICByZXR1cm4gdiA9PT0gTk9UX1NFVFxuICAgICAgPyBub3RTZXRWYWx1ZVxuICAgICAgOiBtYXBwZXIuY2FsbChjb250ZXh0LCB2LCBrZXksIGNvbGxlY3Rpb24pO1xuICB9O1xuICBtYXBwZWRTZXF1ZW5jZS5fX2l0ZXJhdGVVbmNhY2hlZCA9IGZ1bmN0aW9uKGZuLCByZXZlcnNlKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICByZXR1cm4gY29sbGVjdGlvbi5fX2l0ZXJhdGUoXG4gICAgICBmdW5jdGlvbiAodiwgaywgYykgeyByZXR1cm4gZm4obWFwcGVyLmNhbGwoY29udGV4dCwgdiwgaywgYyksIGssIHRoaXMkMSkgIT09IGZhbHNlOyB9LFxuICAgICAgcmV2ZXJzZVxuICAgICk7XG4gIH07XG4gIG1hcHBlZFNlcXVlbmNlLl9faXRlcmF0b3JVbmNhY2hlZCA9IGZ1bmN0aW9uKHR5cGUsIHJldmVyc2UpIHtcbiAgICB2YXIgaXRlcmF0b3IgPSBjb2xsZWN0aW9uLl9faXRlcmF0b3IoSVRFUkFURV9FTlRSSUVTLCByZXZlcnNlKTtcbiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgICByZXR1cm4gc3RlcDtcbiAgICAgIH1cbiAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICB2YXIga2V5ID0gZW50cnlbMF07XG4gICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZShcbiAgICAgICAgdHlwZSxcbiAgICAgICAga2V5LFxuICAgICAgICBtYXBwZXIuY2FsbChjb250ZXh0LCBlbnRyeVsxXSwga2V5LCBjb2xsZWN0aW9uKSxcbiAgICAgICAgc3RlcFxuICAgICAgKTtcbiAgICB9KTtcbiAgfTtcbiAgcmV0dXJuIG1hcHBlZFNlcXVlbmNlO1xufVxuXG5mdW5jdGlvbiByZXZlcnNlRmFjdG9yeShjb2xsZWN0aW9uLCB1c2VLZXlzKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHZhciByZXZlcnNlZFNlcXVlbmNlID0gbWFrZVNlcXVlbmNlKGNvbGxlY3Rpb24pO1xuICByZXZlcnNlZFNlcXVlbmNlLl9pdGVyID0gY29sbGVjdGlvbjtcbiAgcmV2ZXJzZWRTZXF1ZW5jZS5zaXplID0gY29sbGVjdGlvbi5zaXplO1xuICByZXZlcnNlZFNlcXVlbmNlLnJldmVyc2UgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBjb2xsZWN0aW9uOyB9O1xuICBpZiAoY29sbGVjdGlvbi5mbGlwKSB7XG4gICAgcmV2ZXJzZWRTZXF1ZW5jZS5mbGlwID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZmxpcFNlcXVlbmNlID0gZmxpcEZhY3RvcnkoY29sbGVjdGlvbik7XG4gICAgICBmbGlwU2VxdWVuY2UucmV2ZXJzZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbGxlY3Rpb24uZmxpcCgpOyB9O1xuICAgICAgcmV0dXJuIGZsaXBTZXF1ZW5jZTtcbiAgICB9O1xuICB9XG4gIHJldmVyc2VkU2VxdWVuY2UuZ2V0ID0gZnVuY3Rpb24gKGtleSwgbm90U2V0VmFsdWUpIHsgcmV0dXJuIGNvbGxlY3Rpb24uZ2V0KHVzZUtleXMgPyBrZXkgOiAtMSAtIGtleSwgbm90U2V0VmFsdWUpOyB9O1xuICByZXZlcnNlZFNlcXVlbmNlLmhhcyA9IGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGNvbGxlY3Rpb24uaGFzKHVzZUtleXMgPyBrZXkgOiAtMSAtIGtleSk7IH07XG4gIHJldmVyc2VkU2VxdWVuY2UuaW5jbHVkZXMgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIGNvbGxlY3Rpb24uaW5jbHVkZXModmFsdWUpOyB9O1xuICByZXZlcnNlZFNlcXVlbmNlLmNhY2hlUmVzdWx0ID0gY2FjaGVSZXN1bHRUaHJvdWdoO1xuICByZXZlcnNlZFNlcXVlbmNlLl9faXRlcmF0ZSA9IGZ1bmN0aW9uKGZuLCByZXZlcnNlKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgaSA9IDA7XG4gICAgcmV2ZXJzZSAmJiBlbnN1cmVTaXplKGNvbGxlY3Rpb24pO1xuICAgIHJldHVybiBjb2xsZWN0aW9uLl9faXRlcmF0ZShcbiAgICAgIGZ1bmN0aW9uICh2LCBrKSB7IHJldHVybiBmbih2LCB1c2VLZXlzID8gayA6IHJldmVyc2UgPyB0aGlzJDEuc2l6ZSAtICsraSA6IGkrKywgdGhpcyQxKTsgfSxcbiAgICAgICFyZXZlcnNlXG4gICAgKTtcbiAgfTtcbiAgcmV2ZXJzZWRTZXF1ZW5jZS5fX2l0ZXJhdG9yID0gZnVuY3Rpb24gKHR5cGUsIHJldmVyc2UpIHtcbiAgICB2YXIgaSA9IDA7XG4gICAgcmV2ZXJzZSAmJiBlbnN1cmVTaXplKGNvbGxlY3Rpb24pO1xuICAgIHZhciBpdGVyYXRvciA9IGNvbGxlY3Rpb24uX19pdGVyYXRvcihJVEVSQVRFX0VOVFJJRVMsICFyZXZlcnNlKTtcbiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgICByZXR1cm4gc3RlcDtcbiAgICAgIH1cbiAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZShcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdXNlS2V5cyA/IGVudHJ5WzBdIDogcmV2ZXJzZSA/IHRoaXMkMS5zaXplIC0gKytpIDogaSsrLFxuICAgICAgICBlbnRyeVsxXSxcbiAgICAgICAgc3RlcFxuICAgICAgKTtcbiAgICB9KTtcbiAgfTtcbiAgcmV0dXJuIHJldmVyc2VkU2VxdWVuY2U7XG59XG5cbmZ1bmN0aW9uIGZpbHRlckZhY3RvcnkoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBjb250ZXh0LCB1c2VLZXlzKSB7XG4gIHZhciBmaWx0ZXJTZXF1ZW5jZSA9IG1ha2VTZXF1ZW5jZShjb2xsZWN0aW9uKTtcbiAgaWYgKHVzZUtleXMpIHtcbiAgICBmaWx0ZXJTZXF1ZW5jZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgdiA9IGNvbGxlY3Rpb24uZ2V0KGtleSwgTk9UX1NFVCk7XG4gICAgICByZXR1cm4gdiAhPT0gTk9UX1NFVCAmJiAhIXByZWRpY2F0ZS5jYWxsKGNvbnRleHQsIHYsIGtleSwgY29sbGVjdGlvbik7XG4gICAgfTtcbiAgICBmaWx0ZXJTZXF1ZW5jZS5nZXQgPSBmdW5jdGlvbiAoa2V5LCBub3RTZXRWYWx1ZSkge1xuICAgICAgdmFyIHYgPSBjb2xsZWN0aW9uLmdldChrZXksIE5PVF9TRVQpO1xuICAgICAgcmV0dXJuIHYgIT09IE5PVF9TRVQgJiYgcHJlZGljYXRlLmNhbGwoY29udGV4dCwgdiwga2V5LCBjb2xsZWN0aW9uKVxuICAgICAgICA/IHZcbiAgICAgICAgOiBub3RTZXRWYWx1ZTtcbiAgICB9O1xuICB9XG4gIGZpbHRlclNlcXVlbmNlLl9faXRlcmF0ZVVuY2FjaGVkID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICBjb2xsZWN0aW9uLl9faXRlcmF0ZShmdW5jdGlvbiAodiwgaywgYykge1xuICAgICAgaWYgKHByZWRpY2F0ZS5jYWxsKGNvbnRleHQsIHYsIGssIGMpKSB7XG4gICAgICAgIGl0ZXJhdGlvbnMrKztcbiAgICAgICAgcmV0dXJuIGZuKHYsIHVzZUtleXMgPyBrIDogaXRlcmF0aW9ucyAtIDEsIHRoaXMkMSk7XG4gICAgICB9XG4gICAgfSwgcmV2ZXJzZSk7XG4gICAgcmV0dXJuIGl0ZXJhdGlvbnM7XG4gIH07XG4gIGZpbHRlclNlcXVlbmNlLl9faXRlcmF0b3JVbmNhY2hlZCA9IGZ1bmN0aW9uKHR5cGUsIHJldmVyc2UpIHtcbiAgICB2YXIgaXRlcmF0b3IgPSBjb2xsZWN0aW9uLl9faXRlcmF0b3IoSVRFUkFURV9FTlRSSUVTLCByZXZlcnNlKTtcbiAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgc3RlcCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgICAgIHJldHVybiBzdGVwO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgIHZhciBrZXkgPSBlbnRyeVswXTtcbiAgICAgICAgdmFyIHZhbHVlID0gZW50cnlbMV07XG4gICAgICAgIGlmIChwcmVkaWNhdGUuY2FsbChjb250ZXh0LCB2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSkge1xuICAgICAgICAgIHJldHVybiBpdGVyYXRvclZhbHVlKHR5cGUsIHVzZUtleXMgPyBrZXkgOiBpdGVyYXRpb25zKyssIHZhbHVlLCBzdGVwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICByZXR1cm4gZmlsdGVyU2VxdWVuY2U7XG59XG5cbmZ1bmN0aW9uIGNvdW50QnlGYWN0b3J5KGNvbGxlY3Rpb24sIGdyb3VwZXIsIGNvbnRleHQpIHtcbiAgdmFyIGdyb3VwcyA9IE1hcCgpLmFzTXV0YWJsZSgpO1xuICBjb2xsZWN0aW9uLl9faXRlcmF0ZShmdW5jdGlvbiAodiwgaykge1xuICAgIGdyb3Vwcy51cGRhdGUoZ3JvdXBlci5jYWxsKGNvbnRleHQsIHYsIGssIGNvbGxlY3Rpb24pLCAwLCBmdW5jdGlvbiAoYSkgeyByZXR1cm4gYSArIDE7IH0pO1xuICB9KTtcbiAgcmV0dXJuIGdyb3Vwcy5hc0ltbXV0YWJsZSgpO1xufVxuXG5mdW5jdGlvbiBncm91cEJ5RmFjdG9yeShjb2xsZWN0aW9uLCBncm91cGVyLCBjb250ZXh0KSB7XG4gIHZhciBpc0tleWVkSXRlciA9IGlzS2V5ZWQoY29sbGVjdGlvbik7XG4gIHZhciBncm91cHMgPSAoaXNPcmRlcmVkKGNvbGxlY3Rpb24pID8gT3JkZXJlZE1hcCgpIDogTWFwKCkpLmFzTXV0YWJsZSgpO1xuICBjb2xsZWN0aW9uLl9faXRlcmF0ZShmdW5jdGlvbiAodiwgaykge1xuICAgIGdyb3Vwcy51cGRhdGUoXG4gICAgICBncm91cGVyLmNhbGwoY29udGV4dCwgdiwgaywgY29sbGVjdGlvbiksXG4gICAgICBmdW5jdGlvbiAoYSkgeyByZXR1cm4gKChhID0gYSB8fCBbXSksIGEucHVzaChpc0tleWVkSXRlciA/IFtrLCB2XSA6IHYpLCBhKTsgfVxuICAgICk7XG4gIH0pO1xuICB2YXIgY29lcmNlID0gY29sbGVjdGlvbkNsYXNzKGNvbGxlY3Rpb24pO1xuICByZXR1cm4gZ3JvdXBzLm1hcChmdW5jdGlvbiAoYXJyKSB7IHJldHVybiByZWlmeShjb2xsZWN0aW9uLCBjb2VyY2UoYXJyKSk7IH0pLmFzSW1tdXRhYmxlKCk7XG59XG5cbmZ1bmN0aW9uIHNsaWNlRmFjdG9yeShjb2xsZWN0aW9uLCBiZWdpbiwgZW5kLCB1c2VLZXlzKSB7XG4gIHZhciBvcmlnaW5hbFNpemUgPSBjb2xsZWN0aW9uLnNpemU7XG5cbiAgaWYgKHdob2xlU2xpY2UoYmVnaW4sIGVuZCwgb3JpZ2luYWxTaXplKSkge1xuICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICB9XG5cbiAgdmFyIHJlc29sdmVkQmVnaW4gPSByZXNvbHZlQmVnaW4oYmVnaW4sIG9yaWdpbmFsU2l6ZSk7XG4gIHZhciByZXNvbHZlZEVuZCA9IHJlc29sdmVFbmQoZW5kLCBvcmlnaW5hbFNpemUpO1xuXG4gIC8vIGJlZ2luIG9yIGVuZCB3aWxsIGJlIE5hTiBpZiB0aGV5IHdlcmUgcHJvdmlkZWQgYXMgbmVnYXRpdmUgbnVtYmVycyBhbmRcbiAgLy8gdGhpcyBjb2xsZWN0aW9uJ3Mgc2l6ZSBpcyB1bmtub3duLiBJbiB0aGF0IGNhc2UsIGNhY2hlIGZpcnN0IHNvIHRoZXJlIGlzXG4gIC8vIGEga25vd24gc2l6ZSBhbmQgdGhlc2UgZG8gbm90IHJlc29sdmUgdG8gTmFOLlxuICBpZiAocmVzb2x2ZWRCZWdpbiAhPT0gcmVzb2x2ZWRCZWdpbiB8fCByZXNvbHZlZEVuZCAhPT0gcmVzb2x2ZWRFbmQpIHtcbiAgICByZXR1cm4gc2xpY2VGYWN0b3J5KGNvbGxlY3Rpb24udG9TZXEoKS5jYWNoZVJlc3VsdCgpLCBiZWdpbiwgZW5kLCB1c2VLZXlzKTtcbiAgfVxuXG4gIC8vIE5vdGU6IHJlc29sdmVkRW5kIGlzIHVuZGVmaW5lZCB3aGVuIHRoZSBvcmlnaW5hbCBzZXF1ZW5jZSdzIGxlbmd0aCBpc1xuICAvLyB1bmtub3duIGFuZCB0aGlzIHNsaWNlIGRpZCBub3Qgc3VwcGx5IGFuIGVuZCBhbmQgc2hvdWxkIGNvbnRhaW4gYWxsXG4gIC8vIGVsZW1lbnRzIGFmdGVyIHJlc29sdmVkQmVnaW4uXG4gIC8vIEluIHRoYXQgY2FzZSwgcmVzb2x2ZWRTaXplIHdpbGwgYmUgTmFOIGFuZCBzbGljZVNpemUgd2lsbCByZW1haW4gdW5kZWZpbmVkLlxuICB2YXIgcmVzb2x2ZWRTaXplID0gcmVzb2x2ZWRFbmQgLSByZXNvbHZlZEJlZ2luO1xuICB2YXIgc2xpY2VTaXplO1xuICBpZiAocmVzb2x2ZWRTaXplID09PSByZXNvbHZlZFNpemUpIHtcbiAgICBzbGljZVNpemUgPSByZXNvbHZlZFNpemUgPCAwID8gMCA6IHJlc29sdmVkU2l6ZTtcbiAgfVxuXG4gIHZhciBzbGljZVNlcSA9IG1ha2VTZXF1ZW5jZShjb2xsZWN0aW9uKTtcblxuICAvLyBJZiBjb2xsZWN0aW9uLnNpemUgaXMgdW5kZWZpbmVkLCB0aGUgc2l6ZSBvZiB0aGUgcmVhbGl6ZWQgc2xpY2VTZXEgaXNcbiAgLy8gdW5rbm93biBhdCB0aGlzIHBvaW50IHVubGVzcyB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRvIHNsaWNlIGlzIDBcbiAgc2xpY2VTZXEuc2l6ZSA9XG4gICAgc2xpY2VTaXplID09PSAwID8gc2xpY2VTaXplIDogKGNvbGxlY3Rpb24uc2l6ZSAmJiBzbGljZVNpemUpIHx8IHVuZGVmaW5lZDtcblxuICBpZiAoIXVzZUtleXMgJiYgaXNTZXEoY29sbGVjdGlvbikgJiYgc2xpY2VTaXplID49IDApIHtcbiAgICBzbGljZVNlcS5nZXQgPSBmdW5jdGlvbihpbmRleCwgbm90U2V0VmFsdWUpIHtcbiAgICAgIGluZGV4ID0gd3JhcEluZGV4KHRoaXMsIGluZGV4KTtcbiAgICAgIHJldHVybiBpbmRleCA+PSAwICYmIGluZGV4IDwgc2xpY2VTaXplXG4gICAgICAgID8gY29sbGVjdGlvbi5nZXQoaW5kZXggKyByZXNvbHZlZEJlZ2luLCBub3RTZXRWYWx1ZSlcbiAgICAgICAgOiBub3RTZXRWYWx1ZTtcbiAgICB9O1xuICB9XG5cbiAgc2xpY2VTZXEuX19pdGVyYXRlVW5jYWNoZWQgPSBmdW5jdGlvbihmbiwgcmV2ZXJzZSkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgaWYgKHNsaWNlU2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZShmbiwgcmV2ZXJzZSk7XG4gICAgfVxuICAgIHZhciBza2lwcGVkID0gMDtcbiAgICB2YXIgaXNTa2lwcGluZyA9IHRydWU7XG4gICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgIGNvbGxlY3Rpb24uX19pdGVyYXRlKGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICBpZiAoIShpc1NraXBwaW5nICYmIChpc1NraXBwaW5nID0gc2tpcHBlZCsrIDwgcmVzb2x2ZWRCZWdpbikpKSB7XG4gICAgICAgIGl0ZXJhdGlvbnMrKztcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBmbih2LCB1c2VLZXlzID8gayA6IGl0ZXJhdGlvbnMgLSAxLCB0aGlzJDEpICE9PSBmYWxzZSAmJlxuICAgICAgICAgIGl0ZXJhdGlvbnMgIT09IHNsaWNlU2l6ZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBpdGVyYXRpb25zO1xuICB9O1xuXG4gIHNsaWNlU2VxLl9faXRlcmF0b3JVbmNhY2hlZCA9IGZ1bmN0aW9uKHR5cGUsIHJldmVyc2UpIHtcbiAgICBpZiAoc2xpY2VTaXplICE9PSAwICYmIHJldmVyc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlUmVzdWx0KCkuX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbiAgICB9XG4gICAgLy8gRG9uJ3QgYm90aGVyIGluc3RhbnRpYXRpbmcgcGFyZW50IGl0ZXJhdG9yIGlmIHRha2luZyAwLlxuICAgIGlmIChzbGljZVNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoaXRlcmF0b3JEb25lKTtcbiAgICB9XG4gICAgdmFyIGl0ZXJhdG9yID0gY29sbGVjdGlvbi5fX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpO1xuICAgIHZhciBza2lwcGVkID0gMDtcbiAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgICB3aGlsZSAoc2tpcHBlZCsrIDwgcmVzb2x2ZWRCZWdpbikge1xuICAgICAgICBpdGVyYXRvci5uZXh0KCk7XG4gICAgICB9XG4gICAgICBpZiAoKytpdGVyYXRpb25zID4gc2xpY2VTaXplKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvckRvbmUoKTtcbiAgICAgIH1cbiAgICAgIHZhciBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgaWYgKHVzZUtleXMgfHwgdHlwZSA9PT0gSVRFUkFURV9WQUxVRVMgfHwgc3RlcC5kb25lKSB7XG4gICAgICAgIHJldHVybiBzdGVwO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT09IElURVJBVEVfS0VZUykge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZSh0eXBlLCBpdGVyYXRpb25zIC0gMSwgdW5kZWZpbmVkLCBzdGVwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVyYXRvclZhbHVlKHR5cGUsIGl0ZXJhdGlvbnMgLSAxLCBzdGVwLnZhbHVlWzFdLCBzdGVwKTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gc2xpY2VTZXE7XG59XG5cbmZ1bmN0aW9uIHRha2VXaGlsZUZhY3RvcnkoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gIHZhciB0YWtlU2VxdWVuY2UgPSBtYWtlU2VxdWVuY2UoY29sbGVjdGlvbik7XG4gIHRha2VTZXF1ZW5jZS5fX2l0ZXJhdGVVbmNhY2hlZCA9IGZ1bmN0aW9uKGZuLCByZXZlcnNlKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVSZXN1bHQoKS5fX2l0ZXJhdGUoZm4sIHJldmVyc2UpO1xuICAgIH1cbiAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgY29sbGVjdGlvbi5fX2l0ZXJhdGUoXG4gICAgICBmdW5jdGlvbiAodiwgaywgYykgeyByZXR1cm4gcHJlZGljYXRlLmNhbGwoY29udGV4dCwgdiwgaywgYykgJiYgKytpdGVyYXRpb25zICYmIGZuKHYsIGssIHRoaXMkMSk7IH1cbiAgICApO1xuICAgIHJldHVybiBpdGVyYXRpb25zO1xuICB9O1xuICB0YWtlU2VxdWVuY2UuX19pdGVyYXRvclVuY2FjaGVkID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgaWYgKHJldmVyc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlUmVzdWx0KCkuX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbiAgICB9XG4gICAgdmFyIGl0ZXJhdG9yID0gY29sbGVjdGlvbi5fX2l0ZXJhdG9yKElURVJBVEVfRU5UUklFUywgcmV2ZXJzZSk7XG4gICAgdmFyIGl0ZXJhdGluZyA9IHRydWU7XG4gICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIWl0ZXJhdGluZykge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JEb25lKCk7XG4gICAgICB9XG4gICAgICB2YXIgc3RlcCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgIGlmIChzdGVwLmRvbmUpIHtcbiAgICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgICB9XG4gICAgICB2YXIgZW50cnkgPSBzdGVwLnZhbHVlO1xuICAgICAgdmFyIGsgPSBlbnRyeVswXTtcbiAgICAgIHZhciB2ID0gZW50cnlbMV07XG4gICAgICBpZiAoIXByZWRpY2F0ZS5jYWxsKGNvbnRleHQsIHYsIGssIHRoaXMkMSkpIHtcbiAgICAgICAgaXRlcmF0aW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBpdGVyYXRvckRvbmUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlID09PSBJVEVSQVRFX0VOVFJJRVMgPyBzdGVwIDogaXRlcmF0b3JWYWx1ZSh0eXBlLCBrLCB2LCBzdGVwKTtcbiAgICB9KTtcbiAgfTtcbiAgcmV0dXJuIHRha2VTZXF1ZW5jZTtcbn1cblxuZnVuY3Rpb24gc2tpcFdoaWxlRmFjdG9yeShjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGNvbnRleHQsIHVzZUtleXMpIHtcbiAgdmFyIHNraXBTZXF1ZW5jZSA9IG1ha2VTZXF1ZW5jZShjb2xsZWN0aW9uKTtcbiAgc2tpcFNlcXVlbmNlLl9faXRlcmF0ZVVuY2FjaGVkID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZShmbiwgcmV2ZXJzZSk7XG4gICAgfVxuICAgIHZhciBpc1NraXBwaW5nID0gdHJ1ZTtcbiAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgY29sbGVjdGlvbi5fX2l0ZXJhdGUoZnVuY3Rpb24gKHYsIGssIGMpIHtcbiAgICAgIGlmICghKGlzU2tpcHBpbmcgJiYgKGlzU2tpcHBpbmcgPSBwcmVkaWNhdGUuY2FsbChjb250ZXh0LCB2LCBrLCBjKSkpKSB7XG4gICAgICAgIGl0ZXJhdGlvbnMrKztcbiAgICAgICAgcmV0dXJuIGZuKHYsIHVzZUtleXMgPyBrIDogaXRlcmF0aW9ucyAtIDEsIHRoaXMkMSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGl0ZXJhdGlvbnM7XG4gIH07XG4gIHNraXBTZXF1ZW5jZS5fX2l0ZXJhdG9yVW5jYWNoZWQgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVSZXN1bHQoKS5fX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpO1xuICAgIH1cbiAgICB2YXIgaXRlcmF0b3IgPSBjb2xsZWN0aW9uLl9faXRlcmF0b3IoSVRFUkFURV9FTlRSSUVTLCByZXZlcnNlKTtcbiAgICB2YXIgc2tpcHBpbmcgPSB0cnVlO1xuICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdGVwO1xuICAgICAgdmFyIGs7XG4gICAgICB2YXIgdjtcbiAgICAgIGRvIHtcbiAgICAgICAgc3RlcCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgICAgIGlmICh1c2VLZXlzIHx8IHR5cGUgPT09IElURVJBVEVfVkFMVUVTKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RlcDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGUgPT09IElURVJBVEVfS0VZUykge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yVmFsdWUodHlwZSwgaXRlcmF0aW9ucysrLCB1bmRlZmluZWQsIHN0ZXApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZSh0eXBlLCBpdGVyYXRpb25zKyssIHN0ZXAudmFsdWVbMV0sIHN0ZXApO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgIGsgPSBlbnRyeVswXTtcbiAgICAgICAgdiA9IGVudHJ5WzFdO1xuICAgICAgICBza2lwcGluZyAmJiAoc2tpcHBpbmcgPSBwcmVkaWNhdGUuY2FsbChjb250ZXh0LCB2LCBrLCB0aGlzJDEpKTtcbiAgICAgIH0gd2hpbGUgKHNraXBwaW5nKTtcbiAgICAgIHJldHVybiB0eXBlID09PSBJVEVSQVRFX0VOVFJJRVMgPyBzdGVwIDogaXRlcmF0b3JWYWx1ZSh0eXBlLCBrLCB2LCBzdGVwKTtcbiAgICB9KTtcbiAgfTtcbiAgcmV0dXJuIHNraXBTZXF1ZW5jZTtcbn1cblxuZnVuY3Rpb24gY29uY2F0RmFjdG9yeShjb2xsZWN0aW9uLCB2YWx1ZXMpIHtcbiAgdmFyIGlzS2V5ZWRDb2xsZWN0aW9uID0gaXNLZXllZChjb2xsZWN0aW9uKTtcbiAgdmFyIGl0ZXJzID0gW2NvbGxlY3Rpb25dXG4gICAgLmNvbmNhdCh2YWx1ZXMpXG4gICAgLm1hcChmdW5jdGlvbiAodikge1xuICAgICAgaWYgKCFpc0NvbGxlY3Rpb24odikpIHtcbiAgICAgICAgdiA9IGlzS2V5ZWRDb2xsZWN0aW9uXG4gICAgICAgICAgPyBrZXllZFNlcUZyb21WYWx1ZSh2KVxuICAgICAgICAgIDogaW5kZXhlZFNlcUZyb21WYWx1ZShBcnJheS5pc0FycmF5KHYpID8gdiA6IFt2XSk7XG4gICAgICB9IGVsc2UgaWYgKGlzS2V5ZWRDb2xsZWN0aW9uKSB7XG4gICAgICAgIHYgPSBLZXllZENvbGxlY3Rpb24odik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdjtcbiAgICB9KVxuICAgIC5maWx0ZXIoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYuc2l6ZSAhPT0gMDsgfSk7XG5cbiAgaWYgKGl0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICB9XG5cbiAgaWYgKGl0ZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgIHZhciBzaW5nbGV0b24gPSBpdGVyc1swXTtcbiAgICBpZiAoXG4gICAgICBzaW5nbGV0b24gPT09IGNvbGxlY3Rpb24gfHxcbiAgICAgIChpc0tleWVkQ29sbGVjdGlvbiAmJiBpc0tleWVkKHNpbmdsZXRvbikpIHx8XG4gICAgICAoaXNJbmRleGVkKGNvbGxlY3Rpb24pICYmIGlzSW5kZXhlZChzaW5nbGV0b24pKVxuICAgICkge1xuICAgICAgcmV0dXJuIHNpbmdsZXRvbjtcbiAgICB9XG4gIH1cblxuICB2YXIgY29uY2F0U2VxID0gbmV3IEFycmF5U2VxKGl0ZXJzKTtcbiAgaWYgKGlzS2V5ZWRDb2xsZWN0aW9uKSB7XG4gICAgY29uY2F0U2VxID0gY29uY2F0U2VxLnRvS2V5ZWRTZXEoKTtcbiAgfSBlbHNlIGlmICghaXNJbmRleGVkKGNvbGxlY3Rpb24pKSB7XG4gICAgY29uY2F0U2VxID0gY29uY2F0U2VxLnRvU2V0U2VxKCk7XG4gIH1cbiAgY29uY2F0U2VxID0gY29uY2F0U2VxLmZsYXR0ZW4odHJ1ZSk7XG4gIGNvbmNhdFNlcS5zaXplID0gaXRlcnMucmVkdWNlKGZ1bmN0aW9uIChzdW0sIHNlcSkge1xuICAgIGlmIChzdW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHNpemUgPSBzZXEuc2l6ZTtcbiAgICAgIGlmIChzaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHN1bSArIHNpemU7XG4gICAgICB9XG4gICAgfVxuICB9LCAwKTtcbiAgcmV0dXJuIGNvbmNhdFNlcTtcbn1cblxuZnVuY3Rpb24gZmxhdHRlbkZhY3RvcnkoY29sbGVjdGlvbiwgZGVwdGgsIHVzZUtleXMpIHtcbiAgdmFyIGZsYXRTZXF1ZW5jZSA9IG1ha2VTZXF1ZW5jZShjb2xsZWN0aW9uKTtcbiAgZmxhdFNlcXVlbmNlLl9faXRlcmF0ZVVuY2FjaGVkID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHtcbiAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVSZXN1bHQoKS5fX2l0ZXJhdGUoZm4sIHJldmVyc2UpO1xuICAgIH1cbiAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgdmFyIHN0b3BwZWQgPSBmYWxzZTtcbiAgICBmdW5jdGlvbiBmbGF0RGVlcChpdGVyLCBjdXJyZW50RGVwdGgpIHtcbiAgICAgIGl0ZXIuX19pdGVyYXRlKGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICAgIGlmICgoIWRlcHRoIHx8IGN1cnJlbnREZXB0aCA8IGRlcHRoKSAmJiBpc0NvbGxlY3Rpb24odikpIHtcbiAgICAgICAgICBmbGF0RGVlcCh2LCBjdXJyZW50RGVwdGggKyAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVyYXRpb25zKys7XG4gICAgICAgICAgaWYgKGZuKHYsIHVzZUtleXMgPyBrIDogaXRlcmF0aW9ucyAtIDEsIGZsYXRTZXF1ZW5jZSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFzdG9wcGVkO1xuICAgICAgfSwgcmV2ZXJzZSk7XG4gICAgfVxuICAgIGZsYXREZWVwKGNvbGxlY3Rpb24sIDApO1xuICAgIHJldHVybiBpdGVyYXRpb25zO1xuICB9O1xuICBmbGF0U2VxdWVuY2UuX19pdGVyYXRvclVuY2FjaGVkID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge1xuICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0b3IodHlwZSwgcmV2ZXJzZSk7XG4gICAgfVxuICAgIHZhciBpdGVyYXRvciA9IGNvbGxlY3Rpb24uX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbiAgICB2YXIgc3RhY2sgPSBbXTtcbiAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgICB3aGlsZSAoaXRlcmF0b3IpIHtcbiAgICAgICAgdmFyIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIGlmIChzdGVwLmRvbmUgIT09IGZhbHNlKSB7XG4gICAgICAgICAgaXRlcmF0b3IgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdiA9IHN0ZXAudmFsdWU7XG4gICAgICAgIGlmICh0eXBlID09PSBJVEVSQVRFX0VOVFJJRVMpIHtcbiAgICAgICAgICB2ID0gdlsxXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKCFkZXB0aCB8fCBzdGFjay5sZW5ndGggPCBkZXB0aCkgJiYgaXNDb2xsZWN0aW9uKHYpKSB7XG4gICAgICAgICAgc3RhY2sucHVzaChpdGVyYXRvcik7XG4gICAgICAgICAgaXRlcmF0b3IgPSB2Ll9faXRlcmF0b3IodHlwZSwgcmV2ZXJzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHVzZUtleXMgPyBzdGVwIDogaXRlcmF0b3JWYWx1ZSh0eXBlLCBpdGVyYXRpb25zKyssIHYsIHN0ZXApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlcmF0b3JEb25lKCk7XG4gICAgfSk7XG4gIH07XG4gIHJldHVybiBmbGF0U2VxdWVuY2U7XG59XG5cbmZ1bmN0aW9uIGZsYXRNYXBGYWN0b3J5KGNvbGxlY3Rpb24sIG1hcHBlciwgY29udGV4dCkge1xuICB2YXIgY29lcmNlID0gY29sbGVjdGlvbkNsYXNzKGNvbGxlY3Rpb24pO1xuICByZXR1cm4gY29sbGVjdGlvblxuICAgIC50b1NlcSgpXG4gICAgLm1hcChmdW5jdGlvbiAodiwgaykgeyByZXR1cm4gY29lcmNlKG1hcHBlci5jYWxsKGNvbnRleHQsIHYsIGssIGNvbGxlY3Rpb24pKTsgfSlcbiAgICAuZmxhdHRlbih0cnVlKTtcbn1cblxuZnVuY3Rpb24gaW50ZXJwb3NlRmFjdG9yeShjb2xsZWN0aW9uLCBzZXBhcmF0b3IpIHtcbiAgdmFyIGludGVycG9zZWRTZXF1ZW5jZSA9IG1ha2VTZXF1ZW5jZShjb2xsZWN0aW9uKTtcbiAgaW50ZXJwb3NlZFNlcXVlbmNlLnNpemUgPSBjb2xsZWN0aW9uLnNpemUgJiYgY29sbGVjdGlvbi5zaXplICogMiAtIDE7XG4gIGludGVycG9zZWRTZXF1ZW5jZS5fX2l0ZXJhdGVVbmNhY2hlZCA9IGZ1bmN0aW9uKGZuLCByZXZlcnNlKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgY29sbGVjdGlvbi5fX2l0ZXJhdGUoXG4gICAgICBmdW5jdGlvbiAodikgeyByZXR1cm4gKCFpdGVyYXRpb25zIHx8IGZuKHNlcGFyYXRvciwgaXRlcmF0aW9ucysrLCB0aGlzJDEpICE9PSBmYWxzZSkgJiZcbiAgICAgICAgZm4odiwgaXRlcmF0aW9ucysrLCB0aGlzJDEpICE9PSBmYWxzZTsgfSxcbiAgICAgIHJldmVyc2VcbiAgICApO1xuICAgIHJldHVybiBpdGVyYXRpb25zO1xuICB9O1xuICBpbnRlcnBvc2VkU2VxdWVuY2UuX19pdGVyYXRvclVuY2FjaGVkID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge1xuICAgIHZhciBpdGVyYXRvciA9IGNvbGxlY3Rpb24uX19pdGVyYXRvcihJVEVSQVRFX1ZBTFVFUywgcmV2ZXJzZSk7XG4gICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgIHZhciBzdGVwO1xuICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFzdGVwIHx8IGl0ZXJhdGlvbnMgJSAyKSB7XG4gICAgICAgIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIGlmIChzdGVwLmRvbmUpIHtcbiAgICAgICAgICByZXR1cm4gc3RlcDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZXJhdGlvbnMgJSAyXG4gICAgICAgID8gaXRlcmF0b3JWYWx1ZSh0eXBlLCBpdGVyYXRpb25zKyssIHNlcGFyYXRvcilcbiAgICAgICAgOiBpdGVyYXRvclZhbHVlKHR5cGUsIGl0ZXJhdGlvbnMrKywgc3RlcC52YWx1ZSwgc3RlcCk7XG4gICAgfSk7XG4gIH07XG4gIHJldHVybiBpbnRlcnBvc2VkU2VxdWVuY2U7XG59XG5cbmZ1bmN0aW9uIHNvcnRGYWN0b3J5KGNvbGxlY3Rpb24sIGNvbXBhcmF0b3IsIG1hcHBlcikge1xuICBpZiAoIWNvbXBhcmF0b3IpIHtcbiAgICBjb21wYXJhdG9yID0gZGVmYXVsdENvbXBhcmF0b3I7XG4gIH1cbiAgdmFyIGlzS2V5ZWRDb2xsZWN0aW9uID0gaXNLZXllZChjb2xsZWN0aW9uKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGVudHJpZXMgPSBjb2xsZWN0aW9uXG4gICAgLnRvU2VxKClcbiAgICAubWFwKGZ1bmN0aW9uICh2LCBrKSB7IHJldHVybiBbaywgdiwgaW5kZXgrKywgbWFwcGVyID8gbWFwcGVyKHYsIGssIGNvbGxlY3Rpb24pIDogdl07IH0pXG4gICAgLnZhbHVlU2VxKClcbiAgICAudG9BcnJheSgpO1xuICBlbnRyaWVzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGNvbXBhcmF0b3IoYVszXSwgYlszXSkgfHwgYVsyXSAtIGJbMl07IH0pLmZvckVhY2goXG4gICAgaXNLZXllZENvbGxlY3Rpb25cbiAgICAgID8gZnVuY3Rpb24gKHYsIGkpIHtcbiAgICAgICAgICBlbnRyaWVzW2ldLmxlbmd0aCA9IDI7XG4gICAgICAgIH1cbiAgICAgIDogZnVuY3Rpb24gKHYsIGkpIHtcbiAgICAgICAgICBlbnRyaWVzW2ldID0gdlsxXTtcbiAgICAgICAgfVxuICApO1xuICByZXR1cm4gaXNLZXllZENvbGxlY3Rpb25cbiAgICA/IEtleWVkU2VxKGVudHJpZXMpXG4gICAgOiBpc0luZGV4ZWQoY29sbGVjdGlvbilcbiAgICAgID8gSW5kZXhlZFNlcShlbnRyaWVzKVxuICAgICAgOiBTZXRTZXEoZW50cmllcyk7XG59XG5cbmZ1bmN0aW9uIG1heEZhY3RvcnkoY29sbGVjdGlvbiwgY29tcGFyYXRvciwgbWFwcGVyKSB7XG4gIGlmICghY29tcGFyYXRvcikge1xuICAgIGNvbXBhcmF0b3IgPSBkZWZhdWx0Q29tcGFyYXRvcjtcbiAgfVxuICBpZiAobWFwcGVyKSB7XG4gICAgdmFyIGVudHJ5ID0gY29sbGVjdGlvblxuICAgICAgLnRvU2VxKClcbiAgICAgIC5tYXAoZnVuY3Rpb24gKHYsIGspIHsgcmV0dXJuIFt2LCBtYXBwZXIodiwgaywgY29sbGVjdGlvbildOyB9KVxuICAgICAgLnJlZHVjZShmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gKG1heENvbXBhcmUoY29tcGFyYXRvciwgYVsxXSwgYlsxXSkgPyBiIDogYSk7IH0pO1xuICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeVswXTtcbiAgfVxuICByZXR1cm4gY29sbGVjdGlvbi5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIChtYXhDb21wYXJlKGNvbXBhcmF0b3IsIGEsIGIpID8gYiA6IGEpOyB9KTtcbn1cblxuZnVuY3Rpb24gbWF4Q29tcGFyZShjb21wYXJhdG9yLCBhLCBiKSB7XG4gIHZhciBjb21wID0gY29tcGFyYXRvcihiLCBhKTtcbiAgLy8gYiBpcyBjb25zaWRlcmVkIHRoZSBuZXcgbWF4IGlmIHRoZSBjb21wYXJhdG9yIGRlY2xhcmVzIHRoZW0gZXF1YWwsIGJ1dFxuICAvLyB0aGV5IGFyZSBub3QgZXF1YWwgYW5kIGIgaXMgaW4gZmFjdCBhIG51bGxpc2ggdmFsdWUuXG4gIHJldHVybiAoXG4gICAgKGNvbXAgPT09IDAgJiYgYiAhPT0gYSAmJiAoYiA9PT0gdW5kZWZpbmVkIHx8IGIgPT09IG51bGwgfHwgYiAhPT0gYikpIHx8XG4gICAgY29tcCA+IDBcbiAgKTtcbn1cblxuZnVuY3Rpb24gemlwV2l0aEZhY3Rvcnkoa2V5SXRlciwgemlwcGVyLCBpdGVycywgemlwQWxsKSB7XG4gIHZhciB6aXBTZXF1ZW5jZSA9IG1ha2VTZXF1ZW5jZShrZXlJdGVyKTtcbiAgdmFyIHNpemVzID0gbmV3IEFycmF5U2VxKGl0ZXJzKS5tYXAoZnVuY3Rpb24gKGkpIHsgcmV0dXJuIGkuc2l6ZTsgfSk7XG4gIHppcFNlcXVlbmNlLnNpemUgPSB6aXBBbGwgPyBzaXplcy5tYXgoKSA6IHNpemVzLm1pbigpO1xuICAvLyBOb3RlOiB0aGlzIGEgZ2VuZXJpYyBiYXNlIGltcGxlbWVudGF0aW9uIG9mIF9faXRlcmF0ZSBpbiB0ZXJtcyBvZlxuICAvLyBfX2l0ZXJhdG9yIHdoaWNoIG1heSBiZSBtb3JlIGdlbmVyaWNhbGx5IHVzZWZ1bCBpbiB0aGUgZnV0dXJlLlxuICB6aXBTZXF1ZW5jZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbihmbiwgcmV2ZXJzZSkge1xuICAgIC8qIGdlbmVyaWM6XG4gICAgdmFyIGl0ZXJhdG9yID0gdGhpcy5fX2l0ZXJhdG9yKElURVJBVEVfRU5UUklFUywgcmV2ZXJzZSk7XG4gICAgdmFyIHN0ZXA7XG4gICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgIGl0ZXJhdGlvbnMrKztcbiAgICAgIGlmIChmbihzdGVwLnZhbHVlWzFdLCBzdGVwLnZhbHVlWzBdLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpdGVyYXRpb25zO1xuICAgICovXG4gICAgLy8gaW5kZXhlZDpcbiAgICB2YXIgaXRlcmF0b3IgPSB0aGlzLl9faXRlcmF0b3IoSVRFUkFURV9WQUxVRVMsIHJldmVyc2UpO1xuICAgIHZhciBzdGVwO1xuICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICBpZiAoZm4oc3RlcC52YWx1ZSwgaXRlcmF0aW9ucysrLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpdGVyYXRpb25zO1xuICB9O1xuICB6aXBTZXF1ZW5jZS5fX2l0ZXJhdG9yVW5jYWNoZWQgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7XG4gICAgdmFyIGl0ZXJhdG9ycyA9IGl0ZXJzLm1hcChcbiAgICAgIGZ1bmN0aW9uIChpKSB7IHJldHVybiAoKGkgPSBDb2xsZWN0aW9uKGkpKSwgZ2V0SXRlcmF0b3IocmV2ZXJzZSA/IGkucmV2ZXJzZSgpIDogaSkpOyB9XG4gICAgKTtcbiAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgdmFyIGlzRG9uZSA9IGZhbHNlO1xuICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0ZXBzO1xuICAgICAgaWYgKCFpc0RvbmUpIHtcbiAgICAgICAgc3RlcHMgPSBpdGVyYXRvcnMubWFwKGZ1bmN0aW9uIChpKSB7IHJldHVybiBpLm5leHQoKTsgfSk7XG4gICAgICAgIGlzRG9uZSA9IHppcEFsbCA/IHN0ZXBzLmV2ZXJ5KGZ1bmN0aW9uIChzKSB7IHJldHVybiBzLmRvbmU7IH0pIDogc3RlcHMuc29tZShmdW5jdGlvbiAocykgeyByZXR1cm4gcy5kb25lOyB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0RvbmUpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yRG9uZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZXJhdG9yVmFsdWUoXG4gICAgICAgIHR5cGUsXG4gICAgICAgIGl0ZXJhdGlvbnMrKyxcbiAgICAgICAgemlwcGVyLmFwcGx5KG51bGwsIHN0ZXBzLm1hcChmdW5jdGlvbiAocykgeyByZXR1cm4gcy52YWx1ZTsgfSkpXG4gICAgICApO1xuICAgIH0pO1xuICB9O1xuICByZXR1cm4gemlwU2VxdWVuY2U7XG59XG5cbi8vICNwcmFnbWEgSGVscGVyIEZ1bmN0aW9uc1xuXG5mdW5jdGlvbiByZWlmeShpdGVyLCBzZXEpIHtcbiAgcmV0dXJuIGl0ZXIgPT09IHNlcSA/IGl0ZXIgOiBpc1NlcShpdGVyKSA/IHNlcSA6IGl0ZXIuY29uc3RydWN0b3Ioc2VxKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVFbnRyeShlbnRyeSkge1xuICBpZiAoZW50cnkgIT09IE9iamVjdChlbnRyeSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBbSywgVl0gdHVwbGU6ICcgKyBlbnRyeSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdGlvbkNsYXNzKGNvbGxlY3Rpb24pIHtcbiAgcmV0dXJuIGlzS2V5ZWQoY29sbGVjdGlvbilcbiAgICA/IEtleWVkQ29sbGVjdGlvblxuICAgIDogaXNJbmRleGVkKGNvbGxlY3Rpb24pXG4gICAgICA/IEluZGV4ZWRDb2xsZWN0aW9uXG4gICAgICA6IFNldENvbGxlY3Rpb247XG59XG5cbmZ1bmN0aW9uIG1ha2VTZXF1ZW5jZShjb2xsZWN0aW9uKSB7XG4gIHJldHVybiBPYmplY3QuY3JlYXRlKFxuICAgIChpc0tleWVkKGNvbGxlY3Rpb24pXG4gICAgICA/IEtleWVkU2VxXG4gICAgICA6IGlzSW5kZXhlZChjb2xsZWN0aW9uKVxuICAgICAgICA/IEluZGV4ZWRTZXFcbiAgICAgICAgOiBTZXRTZXFcbiAgICApLnByb3RvdHlwZVxuICApO1xufVxuXG5mdW5jdGlvbiBjYWNoZVJlc3VsdFRocm91Z2goKSB7XG4gIGlmICh0aGlzLl9pdGVyLmNhY2hlUmVzdWx0KSB7XG4gICAgdGhpcy5faXRlci5jYWNoZVJlc3VsdCgpO1xuICAgIHRoaXMuc2l6ZSA9IHRoaXMuX2l0ZXIuc2l6ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICByZXR1cm4gU2VxLnByb3RvdHlwZS5jYWNoZVJlc3VsdC5jYWxsKHRoaXMpO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q29tcGFyYXRvcihhLCBiKSB7XG4gIGlmIChhID09PSB1bmRlZmluZWQgJiYgYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZiAoYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgcmV0dXJuIGEgPiBiID8gMSA6IGEgPCBiID8gLTEgOiAwO1xufVxuXG4vLyBodHRwOi8vanNwZXJmLmNvbS9jb3B5LWFycmF5LWlubGluZVxuZnVuY3Rpb24gYXJyQ29weShhcnIsIG9mZnNldCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcbiAgdmFyIGxlbiA9IE1hdGgubWF4KDAsIGFyci5sZW5ndGggLSBvZmZzZXQpO1xuICB2YXIgbmV3QXJyID0gbmV3IEFycmF5KGxlbik7XG4gIGZvciAodmFyIGlpID0gMDsgaWkgPCBsZW47IGlpKyspIHtcbiAgICBuZXdBcnJbaWldID0gYXJyW2lpICsgb2Zmc2V0XTtcbiAgfVxuICByZXR1cm4gbmV3QXJyO1xufVxuXG5mdW5jdGlvbiBpbnZhcmlhbnQoY29uZGl0aW9uLCBlcnJvcikge1xuICBpZiAoIWNvbmRpdGlvbikgeyB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpOyB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydE5vdEluZmluaXRlKHNpemUpIHtcbiAgaW52YXJpYW50KFxuICAgIHNpemUgIT09IEluZmluaXR5LFxuICAgICdDYW5ub3QgcGVyZm9ybSB0aGlzIGFjdGlvbiB3aXRoIGFuIGluZmluaXRlIHNpemUuJ1xuICApO1xufVxuXG5mdW5jdGlvbiBjb2VyY2VLZXlQYXRoKGtleVBhdGgpIHtcbiAgaWYgKGlzQXJyYXlMaWtlKGtleVBhdGgpICYmIHR5cGVvZiBrZXlQYXRoICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBrZXlQYXRoO1xuICB9XG4gIGlmIChpc09yZGVyZWQoa2V5UGF0aCkpIHtcbiAgICByZXR1cm4ga2V5UGF0aC50b0FycmF5KCk7XG4gIH1cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAnSW52YWxpZCBrZXlQYXRoOiBleHBlY3RlZCBPcmRlcmVkIENvbGxlY3Rpb24gb3IgQXJyYXk6ICcgKyBrZXlQYXRoXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmoodmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAmJlxuICAgICh0eXBlb2YgdmFsdWUuY29uc3RydWN0b3IgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgIHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdPYmplY3QnKVxuICApO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBwb3RlbnRpYWxseS1wZXJzaXN0ZW50IGRhdGEgc3RydWN0dXJlLCBlaXRoZXJcbiAqIHByb3ZpZGVkIGJ5IEltbXV0YWJsZS5qcyBvciBhIHBsYWluIEFycmF5IG9yIE9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNEYXRhU3RydWN0dXJlKHZhbHVlKSB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgIChpc0ltbXV0YWJsZSh2YWx1ZSkgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgaXNQbGFpbk9iaih2YWx1ZSkpXG4gICk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSB2YWx1ZSB0byBhIHN0cmluZywgYWRkaW5nIHF1b3RlcyBpZiBhIHN0cmluZyB3YXMgcHJvdmlkZWQuXG4gKi9cbmZ1bmN0aW9uIHF1b3RlU3RyaW5nKHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgOiBTdHJpbmcodmFsdWUpO1xuICB9IGNhdGNoIChfaWdub3JlRXJyb3IpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhcyhjb2xsZWN0aW9uLCBrZXkpIHtcbiAgcmV0dXJuIGlzSW1tdXRhYmxlKGNvbGxlY3Rpb24pXG4gICAgPyBjb2xsZWN0aW9uLmhhcyhrZXkpXG4gICAgOiBpc0RhdGFTdHJ1Y3R1cmUoY29sbGVjdGlvbikgJiYgaGFzT3duUHJvcGVydHkuY2FsbChjb2xsZWN0aW9uLCBrZXkpO1xufVxuXG5mdW5jdGlvbiBnZXQoY29sbGVjdGlvbiwga2V5LCBub3RTZXRWYWx1ZSkge1xuICByZXR1cm4gaXNJbW11dGFibGUoY29sbGVjdGlvbilcbiAgICA/IGNvbGxlY3Rpb24uZ2V0KGtleSwgbm90U2V0VmFsdWUpXG4gICAgOiAhaGFzKGNvbGxlY3Rpb24sIGtleSlcbiAgICAgID8gbm90U2V0VmFsdWVcbiAgICAgIDogdHlwZW9mIGNvbGxlY3Rpb24uZ2V0ID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gY29sbGVjdGlvbi5nZXQoa2V5KVxuICAgICAgICA6IGNvbGxlY3Rpb25ba2V5XTtcbn1cblxuZnVuY3Rpb24gc2hhbGxvd0NvcHkoZnJvbSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShmcm9tKSkge1xuICAgIHJldHVybiBhcnJDb3B5KGZyb20pO1xuICB9XG4gIHZhciB0byA9IHt9O1xuICBmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sIGtleSkpIHtcbiAgICAgIHRvW2tleV0gPSBmcm9tW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiB0bztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlKGNvbGxlY3Rpb24sIGtleSkge1xuICBpZiAoIWlzRGF0YVN0cnVjdHVyZShjb2xsZWN0aW9uKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnQ2Fubm90IHVwZGF0ZSBub24tZGF0YS1zdHJ1Y3R1cmUgdmFsdWU6ICcgKyBjb2xsZWN0aW9uXG4gICAgKTtcbiAgfVxuICBpZiAoaXNJbW11dGFibGUoY29sbGVjdGlvbikpIHtcbiAgICBpZiAoIWNvbGxlY3Rpb24ucmVtb3ZlKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnQ2Fubm90IHVwZGF0ZSBpbW11dGFibGUgdmFsdWUgd2l0aG91dCAucmVtb3ZlKCkgbWV0aG9kOiAnICsgY29sbGVjdGlvblxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbGxlY3Rpb24ucmVtb3ZlKGtleSk7XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbGxlY3Rpb24sIGtleSkpIHtcbiAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgfVxuICB2YXIgY29sbGVjdGlvbkNvcHkgPSBzaGFsbG93Q29weShjb2xsZWN0aW9uKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29sbGVjdGlvbkNvcHkpKSB7XG4gICAgY29sbGVjdGlvbkNvcHkuc3BsaWNlKGtleSwgMSk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGNvbGxlY3Rpb25Db3B5W2tleV07XG4gIH1cbiAgcmV0dXJuIGNvbGxlY3Rpb25Db3B5O1xufVxuXG5mdW5jdGlvbiBzZXQoY29sbGVjdGlvbiwga2V5LCB2YWx1ZSkge1xuICBpZiAoIWlzRGF0YVN0cnVjdHVyZShjb2xsZWN0aW9uKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnQ2Fubm90IHVwZGF0ZSBub24tZGF0YS1zdHJ1Y3R1cmUgdmFsdWU6ICcgKyBjb2xsZWN0aW9uXG4gICAgKTtcbiAgfVxuICBpZiAoaXNJbW11dGFibGUoY29sbGVjdGlvbikpIHtcbiAgICBpZiAoIWNvbGxlY3Rpb24uc2V0KSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnQ2Fubm90IHVwZGF0ZSBpbW11dGFibGUgdmFsdWUgd2l0aG91dCAuc2V0KCkgbWV0aG9kOiAnICsgY29sbGVjdGlvblxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbGxlY3Rpb24uc2V0KGtleSwgdmFsdWUpO1xuICB9XG4gIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbGxlY3Rpb24sIGtleSkgJiYgdmFsdWUgPT09IGNvbGxlY3Rpb25ba2V5XSkge1xuICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICB9XG4gIHZhciBjb2xsZWN0aW9uQ29weSA9IHNoYWxsb3dDb3B5KGNvbGxlY3Rpb24pO1xuICBjb2xsZWN0aW9uQ29weVtrZXldID0gdmFsdWU7XG4gIHJldHVybiBjb2xsZWN0aW9uQ29weTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSW4oY29sbGVjdGlvbiwga2V5UGF0aCwgbm90U2V0VmFsdWUsIHVwZGF0ZXIpIHtcbiAgaWYgKCF1cGRhdGVyKSB7XG4gICAgdXBkYXRlciA9IG5vdFNldFZhbHVlO1xuICAgIG5vdFNldFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIHZhciB1cGRhdGVkVmFsdWUgPSB1cGRhdGVJbkRlZXBseShcbiAgICBpc0ltbXV0YWJsZShjb2xsZWN0aW9uKSxcbiAgICBjb2xsZWN0aW9uLFxuICAgIGNvZXJjZUtleVBhdGgoa2V5UGF0aCksXG4gICAgMCxcbiAgICBub3RTZXRWYWx1ZSxcbiAgICB1cGRhdGVyXG4gICk7XG4gIHJldHVybiB1cGRhdGVkVmFsdWUgPT09IE5PVF9TRVQgPyBub3RTZXRWYWx1ZSA6IHVwZGF0ZWRWYWx1ZTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSW5EZWVwbHkoXG4gIGluSW1tdXRhYmxlLFxuICBleGlzdGluZyxcbiAga2V5UGF0aCxcbiAgaSxcbiAgbm90U2V0VmFsdWUsXG4gIHVwZGF0ZXJcbikge1xuICB2YXIgd2FzTm90U2V0ID0gZXhpc3RpbmcgPT09IE5PVF9TRVQ7XG4gIGlmIChpID09PSBrZXlQYXRoLmxlbmd0aCkge1xuICAgIHZhciBleGlzdGluZ1ZhbHVlID0gd2FzTm90U2V0ID8gbm90U2V0VmFsdWUgOiBleGlzdGluZztcbiAgICB2YXIgbmV3VmFsdWUgPSB1cGRhdGVyKGV4aXN0aW5nVmFsdWUpO1xuICAgIHJldHVybiBuZXdWYWx1ZSA9PT0gZXhpc3RpbmdWYWx1ZSA/IGV4aXN0aW5nIDogbmV3VmFsdWU7XG4gIH1cbiAgaWYgKCF3YXNOb3RTZXQgJiYgIWlzRGF0YVN0cnVjdHVyZShleGlzdGluZykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ0Nhbm5vdCB1cGRhdGUgd2l0aGluIG5vbi1kYXRhLXN0cnVjdHVyZSB2YWx1ZSBpbiBwYXRoIFsnICtcbiAgICAgICAga2V5UGF0aC5zbGljZSgwLCBpKS5tYXAocXVvdGVTdHJpbmcpICtcbiAgICAgICAgJ106ICcgK1xuICAgICAgICBleGlzdGluZ1xuICAgICk7XG4gIH1cbiAgdmFyIGtleSA9IGtleVBhdGhbaV07XG4gIHZhciBuZXh0RXhpc3RpbmcgPSB3YXNOb3RTZXQgPyBOT1RfU0VUIDogZ2V0KGV4aXN0aW5nLCBrZXksIE5PVF9TRVQpO1xuICB2YXIgbmV4dFVwZGF0ZWQgPSB1cGRhdGVJbkRlZXBseShcbiAgICBuZXh0RXhpc3RpbmcgPT09IE5PVF9TRVQgPyBpbkltbXV0YWJsZSA6IGlzSW1tdXRhYmxlKG5leHRFeGlzdGluZyksXG4gICAgbmV4dEV4aXN0aW5nLFxuICAgIGtleVBhdGgsXG4gICAgaSArIDEsXG4gICAgbm90U2V0VmFsdWUsXG4gICAgdXBkYXRlclxuICApO1xuICByZXR1cm4gbmV4dFVwZGF0ZWQgPT09IG5leHRFeGlzdGluZ1xuICAgID8gZXhpc3RpbmdcbiAgICA6IG5leHRVcGRhdGVkID09PSBOT1RfU0VUXG4gICAgICA/IHJlbW92ZShleGlzdGluZywga2V5KVxuICAgICAgOiBzZXQoXG4gICAgICAgICAgd2FzTm90U2V0ID8gKGluSW1tdXRhYmxlID8gZW1wdHlNYXAoKSA6IHt9KSA6IGV4aXN0aW5nLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICBuZXh0VXBkYXRlZFxuICAgICAgICApO1xufVxuXG5mdW5jdGlvbiBzZXRJbihjb2xsZWN0aW9uLCBrZXlQYXRoLCB2YWx1ZSkge1xuICByZXR1cm4gdXBkYXRlSW4oY29sbGVjdGlvbiwga2V5UGF0aCwgTk9UX1NFVCwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsdWU7IH0pO1xufVxuXG5mdW5jdGlvbiBzZXRJbiQxKGtleVBhdGgsIHYpIHtcbiAgcmV0dXJuIHNldEluKHRoaXMsIGtleVBhdGgsIHYpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVJbihjb2xsZWN0aW9uLCBrZXlQYXRoKSB7XG4gIHJldHVybiB1cGRhdGVJbihjb2xsZWN0aW9uLCBrZXlQYXRoLCBmdW5jdGlvbiAoKSB7IHJldHVybiBOT1RfU0VUOyB9KTtcbn1cblxuZnVuY3Rpb24gZGVsZXRlSW4oa2V5UGF0aCkge1xuICByZXR1cm4gcmVtb3ZlSW4odGhpcywga2V5UGF0aCk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZShjb2xsZWN0aW9uLCBrZXksIG5vdFNldFZhbHVlLCB1cGRhdGVyKSB7XG4gIHJldHVybiB1cGRhdGVJbihjb2xsZWN0aW9uLCBba2V5XSwgbm90U2V0VmFsdWUsIHVwZGF0ZXIpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGUkMShrZXksIG5vdFNldFZhbHVlLCB1cGRhdGVyKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxXG4gICAgPyBrZXkodGhpcylcbiAgICA6IHVwZGF0ZSh0aGlzLCBrZXksIG5vdFNldFZhbHVlLCB1cGRhdGVyKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSW4kMShrZXlQYXRoLCBub3RTZXRWYWx1ZSwgdXBkYXRlcikge1xuICByZXR1cm4gdXBkYXRlSW4odGhpcywga2V5UGF0aCwgbm90U2V0VmFsdWUsIHVwZGF0ZXIpO1xufVxuXG5mdW5jdGlvbiBtZXJnZSgpIHtcbiAgdmFyIGl0ZXJzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHdoaWxlICggbGVuLS0gKSBpdGVyc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gIHJldHVybiBtZXJnZUludG9LZXllZFdpdGgodGhpcywgaXRlcnMpO1xufVxuXG5mdW5jdGlvbiBtZXJnZVdpdGgobWVyZ2VyKSB7XG4gIHZhciBpdGVycyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgd2hpbGUgKCBsZW4tLSA+IDAgKSBpdGVyc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiArIDEgXTtcblxuICBpZiAodHlwZW9mIG1lcmdlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbWVyZ2VyIGZ1bmN0aW9uOiAnICsgbWVyZ2VyKTtcbiAgfVxuICByZXR1cm4gbWVyZ2VJbnRvS2V5ZWRXaXRoKHRoaXMsIGl0ZXJzLCBtZXJnZXIpO1xufVxuXG5mdW5jdGlvbiBtZXJnZUludG9LZXllZFdpdGgoY29sbGVjdGlvbiwgY29sbGVjdGlvbnMsIG1lcmdlcikge1xuICB2YXIgaXRlcnMgPSBbXTtcbiAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IGNvbGxlY3Rpb25zLmxlbmd0aDsgaWkrKykge1xuICAgIHZhciBjb2xsZWN0aW9uJDEgPSBLZXllZENvbGxlY3Rpb24oY29sbGVjdGlvbnNbaWldKTtcbiAgICBpZiAoY29sbGVjdGlvbiQxLnNpemUgIT09IDApIHtcbiAgICAgIGl0ZXJzLnB1c2goY29sbGVjdGlvbiQxKTtcbiAgICB9XG4gIH1cbiAgaWYgKGl0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICB9XG4gIGlmIChcbiAgICBjb2xsZWN0aW9uLnRvU2VxKCkuc2l6ZSA9PT0gMCAmJlxuICAgICFjb2xsZWN0aW9uLl9fb3duZXJJRCAmJlxuICAgIGl0ZXJzLmxlbmd0aCA9PT0gMVxuICApIHtcbiAgICByZXR1cm4gY29sbGVjdGlvbi5jb25zdHJ1Y3RvcihpdGVyc1swXSk7XG4gIH1cbiAgcmV0dXJuIGNvbGxlY3Rpb24ud2l0aE11dGF0aW9ucyhmdW5jdGlvbiAoY29sbGVjdGlvbikge1xuICAgIHZhciBtZXJnZUludG9Db2xsZWN0aW9uID0gbWVyZ2VyXG4gICAgICA/IGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgdXBkYXRlKFxuICAgICAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIE5PVF9TRVQsXG4gICAgICAgICAgICBmdW5jdGlvbiAob2xkVmFsKSB7IHJldHVybiAob2xkVmFsID09PSBOT1RfU0VUID8gdmFsdWUgOiBtZXJnZXIob2xkVmFsLCB2YWx1ZSwga2V5KSk7IH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICA6IGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgY29sbGVjdGlvbi5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IGl0ZXJzLmxlbmd0aDsgaWkrKykge1xuICAgICAgaXRlcnNbaWldLmZvckVhY2gobWVyZ2VJbnRvQ29sbGVjdGlvbik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gbWVyZ2UkMShjb2xsZWN0aW9uKSB7XG4gIHZhciBzb3VyY2VzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGggLSAxO1xuICB3aGlsZSAoIGxlbi0tID4gMCApIHNvdXJjZXNbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gKyAxIF07XG5cbiAgcmV0dXJuIG1lcmdlV2l0aFNvdXJjZXMoY29sbGVjdGlvbiwgc291cmNlcyk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlV2l0aCQxKG1lcmdlciwgY29sbGVjdGlvbikge1xuICB2YXIgc291cmNlcyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcbiAgd2hpbGUgKCBsZW4tLSA+IDAgKSBzb3VyY2VzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuICsgMiBdO1xuXG4gIHJldHVybiBtZXJnZVdpdGhTb3VyY2VzKGNvbGxlY3Rpb24sIHNvdXJjZXMsIG1lcmdlcik7XG59XG5cbmZ1bmN0aW9uIG1lcmdlRGVlcChjb2xsZWN0aW9uKSB7XG4gIHZhciBzb3VyY2VzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGggLSAxO1xuICB3aGlsZSAoIGxlbi0tID4gMCApIHNvdXJjZXNbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gKyAxIF07XG5cbiAgcmV0dXJuIG1lcmdlRGVlcFdpdGhTb3VyY2VzKGNvbGxlY3Rpb24sIHNvdXJjZXMpO1xufVxuXG5mdW5jdGlvbiBtZXJnZURlZXBXaXRoKG1lcmdlciwgY29sbGVjdGlvbikge1xuICB2YXIgc291cmNlcyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcbiAgd2hpbGUgKCBsZW4tLSA+IDAgKSBzb3VyY2VzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuICsgMiBdO1xuXG4gIHJldHVybiBtZXJnZURlZXBXaXRoU291cmNlcyhjb2xsZWN0aW9uLCBzb3VyY2VzLCBtZXJnZXIpO1xufVxuXG5mdW5jdGlvbiBtZXJnZURlZXBXaXRoU291cmNlcyhjb2xsZWN0aW9uLCBzb3VyY2VzLCBtZXJnZXIpIHtcbiAgcmV0dXJuIG1lcmdlV2l0aFNvdXJjZXMoY29sbGVjdGlvbiwgc291cmNlcywgZGVlcE1lcmdlcldpdGgobWVyZ2VyKSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlV2l0aFNvdXJjZXMoY29sbGVjdGlvbiwgc291cmNlcywgbWVyZ2VyKSB7XG4gIGlmICghaXNEYXRhU3RydWN0dXJlKGNvbGxlY3Rpb24pKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdDYW5ub3QgbWVyZ2UgaW50byBub24tZGF0YS1zdHJ1Y3R1cmUgdmFsdWU6ICcgKyBjb2xsZWN0aW9uXG4gICAgKTtcbiAgfVxuICBpZiAoaXNJbW11dGFibGUoY29sbGVjdGlvbikpIHtcbiAgICByZXR1cm4gdHlwZW9mIG1lcmdlciA9PT0gJ2Z1bmN0aW9uJyAmJiBjb2xsZWN0aW9uLm1lcmdlV2l0aFxuICAgICAgPyBjb2xsZWN0aW9uLm1lcmdlV2l0aC5hcHBseShjb2xsZWN0aW9uLCBbIG1lcmdlciBdLmNvbmNhdCggc291cmNlcyApKVxuICAgICAgOiBjb2xsZWN0aW9uLm1lcmdlXG4gICAgICAgID8gY29sbGVjdGlvbi5tZXJnZS5hcHBseShjb2xsZWN0aW9uLCBzb3VyY2VzKVxuICAgICAgICA6IGNvbGxlY3Rpb24uY29uY2F0LmFwcGx5KGNvbGxlY3Rpb24sIHNvdXJjZXMpO1xuICB9XG4gIHZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShjb2xsZWN0aW9uKTtcbiAgdmFyIG1lcmdlZCA9IGNvbGxlY3Rpb247XG4gIHZhciBDb2xsZWN0aW9uJCQxID0gaXNBcnJheSA/IEluZGV4ZWRDb2xsZWN0aW9uIDogS2V5ZWRDb2xsZWN0aW9uO1xuICB2YXIgbWVyZ2VJdGVtID0gaXNBcnJheVxuICAgID8gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIC8vIENvcHkgb24gd3JpdGVcbiAgICAgICAgaWYgKG1lcmdlZCA9PT0gY29sbGVjdGlvbikge1xuICAgICAgICAgIG1lcmdlZCA9IHNoYWxsb3dDb3B5KG1lcmdlZCk7XG4gICAgICAgIH1cbiAgICAgICAgbWVyZ2VkLnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgIDogZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgdmFyIGhhc1ZhbCA9IGhhc093blByb3BlcnR5LmNhbGwobWVyZ2VkLCBrZXkpO1xuICAgICAgICB2YXIgbmV4dFZhbCA9XG4gICAgICAgICAgaGFzVmFsICYmIG1lcmdlciA/IG1lcmdlcihtZXJnZWRba2V5XSwgdmFsdWUsIGtleSkgOiB2YWx1ZTtcbiAgICAgICAgaWYgKCFoYXNWYWwgfHwgbmV4dFZhbCAhPT0gbWVyZ2VkW2tleV0pIHtcbiAgICAgICAgICAvLyBDb3B5IG9uIHdyaXRlXG4gICAgICAgICAgaWYgKG1lcmdlZCA9PT0gY29sbGVjdGlvbikge1xuICAgICAgICAgICAgbWVyZ2VkID0gc2hhbGxvd0NvcHkobWVyZ2VkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWVyZ2VkW2tleV0gPSBuZXh0VmFsO1xuICAgICAgICB9XG4gICAgICB9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICBDb2xsZWN0aW9uJCQxKHNvdXJjZXNbaV0pLmZvckVhY2gobWVyZ2VJdGVtKTtcbiAgfVxuICByZXR1cm4gbWVyZ2VkO1xufVxuXG5mdW5jdGlvbiBkZWVwTWVyZ2VyV2l0aChtZXJnZXIpIHtcbiAgZnVuY3Rpb24gZGVlcE1lcmdlcihvbGRWYWx1ZSwgbmV3VmFsdWUsIGtleSkge1xuICAgIHJldHVybiBpc0RhdGFTdHJ1Y3R1cmUob2xkVmFsdWUpICYmIGlzRGF0YVN0cnVjdHVyZShuZXdWYWx1ZSlcbiAgICAgID8gbWVyZ2VXaXRoU291cmNlcyhvbGRWYWx1ZSwgW25ld1ZhbHVlXSwgZGVlcE1lcmdlcilcbiAgICAgIDogbWVyZ2VyXG4gICAgICAgID8gbWVyZ2VyKG9sZFZhbHVlLCBuZXdWYWx1ZSwga2V5KVxuICAgICAgICA6IG5ld1ZhbHVlO1xuICB9XG4gIHJldHVybiBkZWVwTWVyZ2VyO1xufVxuXG5mdW5jdGlvbiBtZXJnZURlZXAkMSgpIHtcbiAgdmFyIGl0ZXJzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHdoaWxlICggbGVuLS0gKSBpdGVyc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gIHJldHVybiBtZXJnZURlZXBXaXRoU291cmNlcyh0aGlzLCBpdGVycyk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlRGVlcFdpdGgkMShtZXJnZXIpIHtcbiAgdmFyIGl0ZXJzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGggLSAxO1xuICB3aGlsZSAoIGxlbi0tID4gMCApIGl0ZXJzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuICsgMSBdO1xuXG4gIHJldHVybiBtZXJnZURlZXBXaXRoU291cmNlcyh0aGlzLCBpdGVycywgbWVyZ2VyKTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VJbihrZXlQYXRoKSB7XG4gIHZhciBpdGVycyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgd2hpbGUgKCBsZW4tLSA+IDAgKSBpdGVyc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiArIDEgXTtcblxuICByZXR1cm4gdXBkYXRlSW4odGhpcywga2V5UGF0aCwgZW1wdHlNYXAoKSwgZnVuY3Rpb24gKG0pIHsgcmV0dXJuIG1lcmdlV2l0aFNvdXJjZXMobSwgaXRlcnMpOyB9KTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VEZWVwSW4oa2V5UGF0aCkge1xuICB2YXIgaXRlcnMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gIHdoaWxlICggbGVuLS0gPiAwICkgaXRlcnNbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gKyAxIF07XG5cbiAgcmV0dXJuIHVwZGF0ZUluKHRoaXMsIGtleVBhdGgsIGVtcHR5TWFwKCksIGZ1bmN0aW9uIChtKSB7IHJldHVybiBtZXJnZURlZXBXaXRoU291cmNlcyhtLCBpdGVycyk7IH1cbiAgKTtcbn1cblxuZnVuY3Rpb24gd2l0aE11dGF0aW9ucyhmbikge1xuICB2YXIgbXV0YWJsZSA9IHRoaXMuYXNNdXRhYmxlKCk7XG4gIGZuKG11dGFibGUpO1xuICByZXR1cm4gbXV0YWJsZS53YXNBbHRlcmVkKCkgPyBtdXRhYmxlLl9fZW5zdXJlT3duZXIodGhpcy5fX293bmVySUQpIDogdGhpcztcbn1cblxuZnVuY3Rpb24gYXNNdXRhYmxlKCkge1xuICByZXR1cm4gdGhpcy5fX293bmVySUQgPyB0aGlzIDogdGhpcy5fX2Vuc3VyZU93bmVyKG5ldyBPd25lcklEKCkpO1xufVxuXG5mdW5jdGlvbiBhc0ltbXV0YWJsZSgpIHtcbiAgcmV0dXJuIHRoaXMuX19lbnN1cmVPd25lcigpO1xufVxuXG5mdW5jdGlvbiB3YXNBbHRlcmVkKCkge1xuICByZXR1cm4gdGhpcy5fX2FsdGVyZWQ7XG59XG5cbnZhciBNYXAgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChLZXllZENvbGxlY3Rpb24kJDEpIHtcbiAgZnVuY3Rpb24gTWFwKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgID8gZW1wdHlNYXAoKVxuICAgICAgOiBpc01hcCh2YWx1ZSkgJiYgIWlzT3JkZXJlZCh2YWx1ZSlcbiAgICAgICAgPyB2YWx1ZVxuICAgICAgICA6IGVtcHR5TWFwKCkud2l0aE11dGF0aW9ucyhmdW5jdGlvbiAobWFwKSB7XG4gICAgICAgICAgICB2YXIgaXRlciA9IEtleWVkQ29sbGVjdGlvbiQkMSh2YWx1ZSk7XG4gICAgICAgICAgICBhc3NlcnROb3RJbmZpbml0ZShpdGVyLnNpemUpO1xuICAgICAgICAgICAgaXRlci5mb3JFYWNoKGZ1bmN0aW9uICh2LCBrKSB7IHJldHVybiBtYXAuc2V0KGssIHYpOyB9KTtcbiAgICAgICAgICB9KTtcbiAgfVxuXG4gIGlmICggS2V5ZWRDb2xsZWN0aW9uJCQxICkgTWFwLl9fcHJvdG9fXyA9IEtleWVkQ29sbGVjdGlvbiQkMTtcbiAgTWFwLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEtleWVkQ29sbGVjdGlvbiQkMSAmJiBLZXllZENvbGxlY3Rpb24kJDEucHJvdG90eXBlICk7XG4gIE1hcC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNYXA7XG5cbiAgTWFwLm9mID0gZnVuY3Rpb24gb2YgKCkge1xuICAgIHZhciBrZXlWYWx1ZXMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB3aGlsZSAoIGxlbi0tICkga2V5VmFsdWVzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgICByZXR1cm4gZW1wdHlNYXAoKS53aXRoTXV0YXRpb25zKGZ1bmN0aW9uIChtYXApIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5VmFsdWVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIGlmIChpICsgMSA+PSBrZXlWYWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHZhbHVlIGZvciBrZXk6ICcgKyBrZXlWYWx1ZXNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIG1hcC5zZXQoa2V5VmFsdWVzW2ldLCBrZXlWYWx1ZXNbaSArIDFdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBNYXAucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiB0aGlzLl9fdG9TdHJpbmcoJ01hcCB7JywgJ30nKTtcbiAgfTtcblxuICAvLyBAcHJhZ21hIEFjY2Vzc1xuXG4gIE1hcC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChrLCBub3RTZXRWYWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9yb290XG4gICAgICA/IHRoaXMuX3Jvb3QuZ2V0KDAsIHVuZGVmaW5lZCwgaywgbm90U2V0VmFsdWUpXG4gICAgICA6IG5vdFNldFZhbHVlO1xuICB9O1xuXG4gIC8vIEBwcmFnbWEgTW9kaWZpY2F0aW9uXG5cbiAgTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiBzZXQgKGssIHYpIHtcbiAgICByZXR1cm4gdXBkYXRlTWFwKHRoaXMsIGssIHYpO1xuICB9O1xuXG4gIE1hcC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlIChrKSB7XG4gICAgcmV0dXJuIHVwZGF0ZU1hcCh0aGlzLCBrLCBOT1RfU0VUKTtcbiAgfTtcblxuICBNYXAucHJvdG90eXBlLmRlbGV0ZUFsbCA9IGZ1bmN0aW9uIGRlbGV0ZUFsbCAoa2V5cykge1xuICAgIHZhciBjb2xsZWN0aW9uID0gQ29sbGVjdGlvbihrZXlzKTtcblxuICAgIGlmIChjb2xsZWN0aW9uLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLndpdGhNdXRhdGlvbnMoZnVuY3Rpb24gKG1hcCkge1xuICAgICAgY29sbGVjdGlvbi5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIG1hcC5yZW1vdmUoa2V5KTsgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgTWFwLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyICgpIHtcbiAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX19vd25lcklEKSB7XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgICAgdGhpcy5fcm9vdCA9IG51bGw7XG4gICAgICB0aGlzLl9faGFzaCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX19hbHRlcmVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gZW1wdHlNYXAoKTtcbiAgfTtcblxuICAvLyBAcHJhZ21hIENvbXBvc2l0aW9uXG5cbiAgTWFwLnByb3RvdHlwZS5zb3J0ID0gZnVuY3Rpb24gc29ydCAoY29tcGFyYXRvcikge1xuICAgIC8vIExhdGUgYmluZGluZ1xuICAgIHJldHVybiBPcmRlcmVkTWFwKHNvcnRGYWN0b3J5KHRoaXMsIGNvbXBhcmF0b3IpKTtcbiAgfTtcblxuICBNYXAucHJvdG90eXBlLnNvcnRCeSA9IGZ1bmN0aW9uIHNvcnRCeSAobWFwcGVyLCBjb21wYXJhdG9yKSB7XG4gICAgLy8gTGF0ZSBiaW5kaW5nXG4gICAgcmV0dXJuIE9yZGVyZWRNYXAoc29ydEZhY3RvcnkodGhpcywgY29tcGFyYXRvciwgbWFwcGVyKSk7XG4gIH07XG5cbiAgTWFwLnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbiBtYXAgKG1hcHBlciwgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLndpdGhNdXRhdGlvbnMoZnVuY3Rpb24gKG1hcCkge1xuICAgICAgbWFwLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgbWFwLnNldChrZXksIG1hcHBlci5jYWxsKGNvbnRleHQsIHZhbHVlLCBrZXksIG1hcCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gQHByYWdtYSBNdXRhYmlsaXR5XG5cbiAgTWFwLnByb3RvdHlwZS5fX2l0ZXJhdG9yID0gZnVuY3Rpb24gX19pdGVyYXRvciAodHlwZSwgcmV2ZXJzZSkge1xuICAgIHJldHVybiBuZXcgTWFwSXRlcmF0b3IodGhpcywgdHlwZSwgcmV2ZXJzZSk7XG4gIH07XG5cbiAgTWFwLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbiBfX2l0ZXJhdGUgKGZuLCByZXZlcnNlKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgdGhpcy5fcm9vdCAmJlxuICAgICAgdGhpcy5fcm9vdC5pdGVyYXRlKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICBpdGVyYXRpb25zKys7XG4gICAgICAgIHJldHVybiBmbihlbnRyeVsxXSwgZW50cnlbMF0sIHRoaXMkMSk7XG4gICAgICB9LCByZXZlcnNlKTtcbiAgICByZXR1cm4gaXRlcmF0aW9ucztcbiAgfTtcblxuICBNYXAucHJvdG90eXBlLl9fZW5zdXJlT3duZXIgPSBmdW5jdGlvbiBfX2Vuc3VyZU93bmVyIChvd25lcklEKSB7XG4gICAgaWYgKG93bmVySUQgPT09IHRoaXMuX19vd25lcklEKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKCFvd25lcklEKSB7XG4gICAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybiBlbXB0eU1hcCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fX293bmVySUQgPSBvd25lcklEO1xuICAgICAgdGhpcy5fX2FsdGVyZWQgPSBmYWxzZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gbWFrZU1hcCh0aGlzLnNpemUsIHRoaXMuX3Jvb3QsIG93bmVySUQsIHRoaXMuX19oYXNoKTtcbiAgfTtcblxuICByZXR1cm4gTWFwO1xufShLZXllZENvbGxlY3Rpb24pKTtcblxuTWFwLmlzTWFwID0gaXNNYXA7XG5cbnZhciBNYXBQcm90b3R5cGUgPSBNYXAucHJvdG90eXBlO1xuTWFwUHJvdG90eXBlW0lTX01BUF9TWU1CT0xdID0gdHJ1ZTtcbk1hcFByb3RvdHlwZVtERUxFVEVdID0gTWFwUHJvdG90eXBlLnJlbW92ZTtcbk1hcFByb3RvdHlwZS5yZW1vdmVBbGwgPSBNYXBQcm90b3R5cGUuZGVsZXRlQWxsO1xuTWFwUHJvdG90eXBlLnNldEluID0gc2V0SW4kMTtcbk1hcFByb3RvdHlwZS5yZW1vdmVJbiA9IE1hcFByb3RvdHlwZS5kZWxldGVJbiA9IGRlbGV0ZUluO1xuTWFwUHJvdG90eXBlLnVwZGF0ZSA9IHVwZGF0ZSQxO1xuTWFwUHJvdG90eXBlLnVwZGF0ZUluID0gdXBkYXRlSW4kMTtcbk1hcFByb3RvdHlwZS5tZXJnZSA9IE1hcFByb3RvdHlwZS5jb25jYXQgPSBtZXJnZTtcbk1hcFByb3RvdHlwZS5tZXJnZVdpdGggPSBtZXJnZVdpdGg7XG5NYXBQcm90b3R5cGUubWVyZ2VEZWVwID0gbWVyZ2VEZWVwJDE7XG5NYXBQcm90b3R5cGUubWVyZ2VEZWVwV2l0aCA9IG1lcmdlRGVlcFdpdGgkMTtcbk1hcFByb3RvdHlwZS5tZXJnZUluID0gbWVyZ2VJbjtcbk1hcFByb3RvdHlwZS5tZXJnZURlZXBJbiA9IG1lcmdlRGVlcEluO1xuTWFwUHJvdG90eXBlLndpdGhNdXRhdGlvbnMgPSB3aXRoTXV0YXRpb25zO1xuTWFwUHJvdG90eXBlLndhc0FsdGVyZWQgPSB3YXNBbHRlcmVkO1xuTWFwUHJvdG90eXBlLmFzSW1tdXRhYmxlID0gYXNJbW11dGFibGU7XG5NYXBQcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBNYXBQcm90b3R5cGUuYXNNdXRhYmxlID0gYXNNdXRhYmxlO1xuTWFwUHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24ocmVzdWx0LCBhcnIpIHtcbiAgcmV0dXJuIHJlc3VsdC5zZXQoYXJyWzBdLCBhcnJbMV0pO1xufTtcbk1hcFByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24ob2JqKSB7XG4gIHJldHVybiBvYmouYXNJbW11dGFibGUoKTtcbn07XG5cbi8vICNwcmFnbWEgVHJpZSBOb2Rlc1xuXG52YXIgQXJyYXlNYXBOb2RlID0gZnVuY3Rpb24gQXJyYXlNYXBOb2RlKG93bmVySUQsIGVudHJpZXMpIHtcbiAgdGhpcy5vd25lcklEID0gb3duZXJJRDtcbiAgdGhpcy5lbnRyaWVzID0gZW50cmllcztcbn07XG5cbkFycmF5TWFwTm9kZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChzaGlmdCwga2V5SGFzaCwga2V5LCBub3RTZXRWYWx1ZSkge1xuICB2YXIgZW50cmllcyA9IHRoaXMuZW50cmllcztcbiAgZm9yICh2YXIgaWkgPSAwLCBsZW4gPSBlbnRyaWVzLmxlbmd0aDsgaWkgPCBsZW47IGlpKyspIHtcbiAgICBpZiAoaXMoa2V5LCBlbnRyaWVzW2lpXVswXSkpIHtcbiAgICAgIHJldHVybiBlbnRyaWVzW2lpXVsxXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5vdFNldFZhbHVlO1xufTtcblxuQXJyYXlNYXBOb2RlLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUgKG93bmVySUQsIHNoaWZ0LCBrZXlIYXNoLCBrZXksIHZhbHVlLCBkaWRDaGFuZ2VTaXplLCBkaWRBbHRlcikge1xuICB2YXIgcmVtb3ZlZCA9IHZhbHVlID09PSBOT1RfU0VUO1xuXG4gIHZhciBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGVudHJpZXMubGVuZ3RoO1xuICBmb3IgKDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgIGlmIChpcyhrZXksIGVudHJpZXNbaWR4XVswXSkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICB2YXIgZXhpc3RzID0gaWR4IDwgbGVuO1xuXG4gIGlmIChleGlzdHMgPyBlbnRyaWVzW2lkeF1bMV0gPT09IHZhbHVlIDogcmVtb3ZlZCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgU2V0UmVmKGRpZEFsdGVyKTtcbiAgKHJlbW92ZWQgfHwgIWV4aXN0cykgJiYgU2V0UmVmKGRpZENoYW5nZVNpemUpO1xuXG4gIGlmIChyZW1vdmVkICYmIGVudHJpZXMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuOyAvLyB1bmRlZmluZWRcbiAgfVxuXG4gIGlmICghZXhpc3RzICYmICFyZW1vdmVkICYmIGVudHJpZXMubGVuZ3RoID49IE1BWF9BUlJBWV9NQVBfU0laRSkge1xuICAgIHJldHVybiBjcmVhdGVOb2Rlcyhvd25lcklELCBlbnRyaWVzLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIHZhciBpc0VkaXRhYmxlID0gb3duZXJJRCAmJiBvd25lcklEID09PSB0aGlzLm93bmVySUQ7XG4gIHZhciBuZXdFbnRyaWVzID0gaXNFZGl0YWJsZSA/IGVudHJpZXMgOiBhcnJDb3B5KGVudHJpZXMpO1xuXG4gIGlmIChleGlzdHMpIHtcbiAgICBpZiAocmVtb3ZlZCkge1xuICAgICAgaWR4ID09PSBsZW4gLSAxXG4gICAgICAgID8gbmV3RW50cmllcy5wb3AoKVxuICAgICAgICA6IChuZXdFbnRyaWVzW2lkeF0gPSBuZXdFbnRyaWVzLnBvcCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3RW50cmllc1tpZHhdID0gW2tleSwgdmFsdWVdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXdFbnRyaWVzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfVxuXG4gIGlmIChpc0VkaXRhYmxlKSB7XG4gICAgdGhpcy5lbnRyaWVzID0gbmV3RW50cmllcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHJldHVybiBuZXcgQXJyYXlNYXBOb2RlKG93bmVySUQsIG5ld0VudHJpZXMpO1xufTtcblxudmFyIEJpdG1hcEluZGV4ZWROb2RlID0gZnVuY3Rpb24gQml0bWFwSW5kZXhlZE5vZGUob3duZXJJRCwgYml0bWFwLCBub2Rlcykge1xuICB0aGlzLm93bmVySUQgPSBvd25lcklEO1xuICB0aGlzLmJpdG1hcCA9IGJpdG1hcDtcbiAgdGhpcy5ub2RlcyA9IG5vZGVzO1xufTtcblxuQml0bWFwSW5kZXhlZE5vZGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCAoc2hpZnQsIGtleUhhc2gsIGtleSwgbm90U2V0VmFsdWUpIHtcbiAgaWYgKGtleUhhc2ggPT09IHVuZGVmaW5lZCkge1xuICAgIGtleUhhc2ggPSBoYXNoKGtleSk7XG4gIH1cbiAgdmFyIGJpdCA9IDEgPDwgKChzaGlmdCA9PT0gMCA/IGtleUhhc2ggOiBrZXlIYXNoID4+PiBzaGlmdCkgJiBNQVNLKTtcbiAgdmFyIGJpdG1hcCA9IHRoaXMuYml0bWFwO1xuICByZXR1cm4gKGJpdG1hcCAmIGJpdCkgPT09IDBcbiAgICA/IG5vdFNldFZhbHVlXG4gICAgOiB0aGlzLm5vZGVzW3BvcENvdW50KGJpdG1hcCAmIChiaXQgLSAxKSldLmdldChcbiAgICAgICAgc2hpZnQgKyBTSElGVCxcbiAgICAgICAga2V5SGFzaCxcbiAgICAgICAga2V5LFxuICAgICAgICBub3RTZXRWYWx1ZVxuICAgICAgKTtcbn07XG5cbkJpdG1hcEluZGV4ZWROb2RlLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUgKG93bmVySUQsIHNoaWZ0LCBrZXlIYXNoLCBrZXksIHZhbHVlLCBkaWRDaGFuZ2VTaXplLCBkaWRBbHRlcikge1xuICBpZiAoa2V5SGFzaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAga2V5SGFzaCA9IGhhc2goa2V5KTtcbiAgfVxuICB2YXIga2V5SGFzaEZyYWcgPSAoc2hpZnQgPT09IDAgPyBrZXlIYXNoIDoga2V5SGFzaCA+Pj4gc2hpZnQpICYgTUFTSztcbiAgdmFyIGJpdCA9IDEgPDwga2V5SGFzaEZyYWc7XG4gIHZhciBiaXRtYXAgPSB0aGlzLmJpdG1hcDtcbiAgdmFyIGV4aXN0cyA9IChiaXRtYXAgJiBiaXQpICE9PSAwO1xuXG4gIGlmICghZXhpc3RzICYmIHZhbHVlID09PSBOT1RfU0VUKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB2YXIgaWR4ID0gcG9wQ291bnQoYml0bWFwICYgKGJpdCAtIDEpKTtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcztcbiAgdmFyIG5vZGUgPSBleGlzdHMgPyBub2Rlc1tpZHhdIDogdW5kZWZpbmVkO1xuICB2YXIgbmV3Tm9kZSA9IHVwZGF0ZU5vZGUoXG4gICAgbm9kZSxcbiAgICBvd25lcklELFxuICAgIHNoaWZ0ICsgU0hJRlQsXG4gICAga2V5SGFzaCxcbiAgICBrZXksXG4gICAgdmFsdWUsXG4gICAgZGlkQ2hhbmdlU2l6ZSxcbiAgICBkaWRBbHRlclxuICApO1xuXG4gIGlmIChuZXdOb2RlID09PSBub2RlKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBpZiAoIWV4aXN0cyAmJiBuZXdOb2RlICYmIG5vZGVzLmxlbmd0aCA+PSBNQVhfQklUTUFQX0lOREVYRURfU0laRSkge1xuICAgIHJldHVybiBleHBhbmROb2Rlcyhvd25lcklELCBub2RlcywgYml0bWFwLCBrZXlIYXNoRnJhZywgbmV3Tm9kZSk7XG4gIH1cblxuICBpZiAoXG4gICAgZXhpc3RzICYmXG4gICAgIW5ld05vZGUgJiZcbiAgICBub2Rlcy5sZW5ndGggPT09IDIgJiZcbiAgICBpc0xlYWZOb2RlKG5vZGVzW2lkeCBeIDFdKVxuICApIHtcbiAgICByZXR1cm4gbm9kZXNbaWR4IF4gMV07XG4gIH1cblxuICBpZiAoZXhpc3RzICYmIG5ld05vZGUgJiYgbm9kZXMubGVuZ3RoID09PSAxICYmIGlzTGVhZk5vZGUobmV3Tm9kZSkpIHtcbiAgICByZXR1cm4gbmV3Tm9kZTtcbiAgfVxuXG4gIHZhciBpc0VkaXRhYmxlID0gb3duZXJJRCAmJiBvd25lcklEID09PSB0aGlzLm93bmVySUQ7XG4gIHZhciBuZXdCaXRtYXAgPSBleGlzdHMgPyAobmV3Tm9kZSA/IGJpdG1hcCA6IGJpdG1hcCBeIGJpdCkgOiBiaXRtYXAgfCBiaXQ7XG4gIHZhciBuZXdOb2RlcyA9IGV4aXN0c1xuICAgID8gbmV3Tm9kZVxuICAgICAgPyBzZXRBdChub2RlcywgaWR4LCBuZXdOb2RlLCBpc0VkaXRhYmxlKVxuICAgICAgOiBzcGxpY2VPdXQobm9kZXMsIGlkeCwgaXNFZGl0YWJsZSlcbiAgICA6IHNwbGljZUluKG5vZGVzLCBpZHgsIG5ld05vZGUsIGlzRWRpdGFibGUpO1xuXG4gIGlmIChpc0VkaXRhYmxlKSB7XG4gICAgdGhpcy5iaXRtYXAgPSBuZXdCaXRtYXA7XG4gICAgdGhpcy5ub2RlcyA9IG5ld05vZGVzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBCaXRtYXBJbmRleGVkTm9kZShvd25lcklELCBuZXdCaXRtYXAsIG5ld05vZGVzKTtcbn07XG5cbnZhciBIYXNoQXJyYXlNYXBOb2RlID0gZnVuY3Rpb24gSGFzaEFycmF5TWFwTm9kZShvd25lcklELCBjb3VudCwgbm9kZXMpIHtcbiAgdGhpcy5vd25lcklEID0gb3duZXJJRDtcbiAgdGhpcy5jb3VudCA9IGNvdW50O1xuICB0aGlzLm5vZGVzID0gbm9kZXM7XG59O1xuXG5IYXNoQXJyYXlNYXBOb2RlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKHNoaWZ0LCBrZXlIYXNoLCBrZXksIG5vdFNldFZhbHVlKSB7XG4gIGlmIChrZXlIYXNoID09PSB1bmRlZmluZWQpIHtcbiAgICBrZXlIYXNoID0gaGFzaChrZXkpO1xuICB9XG4gIHZhciBpZHggPSAoc2hpZnQgPT09IDAgPyBrZXlIYXNoIDoga2V5SGFzaCA+Pj4gc2hpZnQpICYgTUFTSztcbiAgdmFyIG5vZGUgPSB0aGlzLm5vZGVzW2lkeF07XG4gIHJldHVybiBub2RlXG4gICAgPyBub2RlLmdldChzaGlmdCArIFNISUZULCBrZXlIYXNoLCBrZXksIG5vdFNldFZhbHVlKVxuICAgIDogbm90U2V0VmFsdWU7XG59O1xuXG5IYXNoQXJyYXlNYXBOb2RlLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUgKG93bmVySUQsIHNoaWZ0LCBrZXlIYXNoLCBrZXksIHZhbHVlLCBkaWRDaGFuZ2VTaXplLCBkaWRBbHRlcikge1xuICBpZiAoa2V5SGFzaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAga2V5SGFzaCA9IGhhc2goa2V5KTtcbiAgfVxuICB2YXIgaWR4ID0gKHNoaWZ0ID09PSAwID8ga2V5SGFzaCA6IGtleUhhc2ggPj4+IHNoaWZ0KSAmIE1BU0s7XG4gIHZhciByZW1vdmVkID0gdmFsdWUgPT09IE5PVF9TRVQ7XG4gIHZhciBub2RlcyA9IHRoaXMubm9kZXM7XG4gIHZhciBub2RlID0gbm9kZXNbaWR4XTtcblxuICBpZiAocmVtb3ZlZCAmJiAhbm9kZSkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdmFyIG5ld05vZGUgPSB1cGRhdGVOb2RlKFxuICAgIG5vZGUsXG4gICAgb3duZXJJRCxcbiAgICBzaGlmdCArIFNISUZULFxuICAgIGtleUhhc2gsXG4gICAga2V5LFxuICAgIHZhbHVlLFxuICAgIGRpZENoYW5nZVNpemUsXG4gICAgZGlkQWx0ZXJcbiAgKTtcbiAgaWYgKG5ld05vZGUgPT09IG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHZhciBuZXdDb3VudCA9IHRoaXMuY291bnQ7XG4gIGlmICghbm9kZSkge1xuICAgIG5ld0NvdW50Kys7XG4gIH0gZWxzZSBpZiAoIW5ld05vZGUpIHtcbiAgICBuZXdDb3VudC0tO1xuICAgIGlmIChuZXdDb3VudCA8IE1JTl9IQVNIX0FSUkFZX01BUF9TSVpFKSB7XG4gICAgICByZXR1cm4gcGFja05vZGVzKG93bmVySUQsIG5vZGVzLCBuZXdDb3VudCwgaWR4KTtcbiAgICB9XG4gIH1cblxuICB2YXIgaXNFZGl0YWJsZSA9IG93bmVySUQgJiYgb3duZXJJRCA9PT0gdGhpcy5vd25lcklEO1xuICB2YXIgbmV3Tm9kZXMgPSBzZXRBdChub2RlcywgaWR4LCBuZXdOb2RlLCBpc0VkaXRhYmxlKTtcblxuICBpZiAoaXNFZGl0YWJsZSkge1xuICAgIHRoaXMuY291bnQgPSBuZXdDb3VudDtcbiAgICB0aGlzLm5vZGVzID0gbmV3Tm9kZXM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICByZXR1cm4gbmV3IEhhc2hBcnJheU1hcE5vZGUob3duZXJJRCwgbmV3Q291bnQsIG5ld05vZGVzKTtcbn07XG5cbnZhciBIYXNoQ29sbGlzaW9uTm9kZSA9IGZ1bmN0aW9uIEhhc2hDb2xsaXNpb25Ob2RlKG93bmVySUQsIGtleUhhc2gsIGVudHJpZXMpIHtcbiAgdGhpcy5vd25lcklEID0gb3duZXJJRDtcbiAgdGhpcy5rZXlIYXNoID0ga2V5SGFzaDtcbiAgdGhpcy5lbnRyaWVzID0gZW50cmllcztcbn07XG5cbkhhc2hDb2xsaXNpb25Ob2RlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKHNoaWZ0LCBrZXlIYXNoLCBrZXksIG5vdFNldFZhbHVlKSB7XG4gIHZhciBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuICBmb3IgKHZhciBpaSA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpaSA8IGxlbjsgaWkrKykge1xuICAgIGlmIChpcyhrZXksIGVudHJpZXNbaWldWzBdKSkge1xuICAgICAgcmV0dXJuIGVudHJpZXNbaWldWzFdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbm90U2V0VmFsdWU7XG59O1xuXG5IYXNoQ29sbGlzaW9uTm9kZS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlIChvd25lcklELCBzaGlmdCwga2V5SGFzaCwga2V5LCB2YWx1ZSwgZGlkQ2hhbmdlU2l6ZSwgZGlkQWx0ZXIpIHtcbiAgaWYgKGtleUhhc2ggPT09IHVuZGVmaW5lZCkge1xuICAgIGtleUhhc2ggPSBoYXNoKGtleSk7XG4gIH1cblxuICB2YXIgcmVtb3ZlZCA9IHZhbHVlID09PSBOT1RfU0VUO1xuXG4gIGlmIChrZXlIYXNoICE9PSB0aGlzLmtleUhhc2gpIHtcbiAgICBpZiAocmVtb3ZlZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIFNldFJlZihkaWRBbHRlcik7XG4gICAgU2V0UmVmKGRpZENoYW5nZVNpemUpO1xuICAgIHJldHVybiBtZXJnZUludG9Ob2RlKHRoaXMsIG93bmVySUQsIHNoaWZ0LCBrZXlIYXNoLCBba2V5LCB2YWx1ZV0pO1xuICB9XG5cbiAgdmFyIGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gZW50cmllcy5sZW5ndGg7XG4gIGZvciAoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgaWYgKGlzKGtleSwgZW50cmllc1tpZHhdWzBdKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHZhciBleGlzdHMgPSBpZHggPCBsZW47XG5cbiAgaWYgKGV4aXN0cyA/IGVudHJpZXNbaWR4XVsxXSA9PT0gdmFsdWUgOiByZW1vdmVkKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBTZXRSZWYoZGlkQWx0ZXIpO1xuICAocmVtb3ZlZCB8fCAhZXhpc3RzKSAmJiBTZXRSZWYoZGlkQ2hhbmdlU2l6ZSk7XG5cbiAgaWYgKHJlbW92ZWQgJiYgbGVuID09PSAyKSB7XG4gICAgcmV0dXJuIG5ldyBWYWx1ZU5vZGUob3duZXJJRCwgdGhpcy5rZXlIYXNoLCBlbnRyaWVzW2lkeCBeIDFdKTtcbiAgfVxuXG4gIHZhciBpc0VkaXRhYmxlID0gb3duZXJJRCAmJiBvd25lcklEID09PSB0aGlzLm93bmVySUQ7XG4gIHZhciBuZXdFbnRyaWVzID0gaXNFZGl0YWJsZSA/IGVudHJpZXMgOiBhcnJDb3B5KGVudHJpZXMpO1xuXG4gIGlmIChleGlzdHMpIHtcbiAgICBpZiAocmVtb3ZlZCkge1xuICAgICAgaWR4ID09PSBsZW4gLSAxXG4gICAgICAgID8gbmV3RW50cmllcy5wb3AoKVxuICAgICAgICA6IChuZXdFbnRyaWVzW2lkeF0gPSBuZXdFbnRyaWVzLnBvcCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3RW50cmllc1tpZHhdID0gW2tleSwgdmFsdWVdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXdFbnRyaWVzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfVxuXG4gIGlmIChpc0VkaXRhYmxlKSB7XG4gICAgdGhpcy5lbnRyaWVzID0gbmV3RW50cmllcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHJldHVybiBuZXcgSGFzaENvbGxpc2lvbk5vZGUob3duZXJJRCwgdGhpcy5rZXlIYXNoLCBuZXdFbnRyaWVzKTtcbn07XG5cbnZhciBWYWx1ZU5vZGUgPSBmdW5jdGlvbiBWYWx1ZU5vZGUob3duZXJJRCwga2V5SGFzaCwgZW50cnkpIHtcbiAgdGhpcy5vd25lcklEID0gb3duZXJJRDtcbiAgdGhpcy5rZXlIYXNoID0ga2V5SGFzaDtcbiAgdGhpcy5lbnRyeSA9IGVudHJ5O1xufTtcblxuVmFsdWVOb2RlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKHNoaWZ0LCBrZXlIYXNoLCBrZXksIG5vdFNldFZhbHVlKSB7XG4gIHJldHVybiBpcyhrZXksIHRoaXMuZW50cnlbMF0pID8gdGhpcy5lbnRyeVsxXSA6IG5vdFNldFZhbHVlO1xufTtcblxuVmFsdWVOb2RlLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUgKG93bmVySUQsIHNoaWZ0LCBrZXlIYXNoLCBrZXksIHZhbHVlLCBkaWRDaGFuZ2VTaXplLCBkaWRBbHRlcikge1xuICB2YXIgcmVtb3ZlZCA9IHZhbHVlID09PSBOT1RfU0VUO1xuICB2YXIga2V5TWF0Y2ggPSBpcyhrZXksIHRoaXMuZW50cnlbMF0pO1xuICBpZiAoa2V5TWF0Y2ggPyB2YWx1ZSA9PT0gdGhpcy5lbnRyeVsxXSA6IHJlbW92ZWQpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIFNldFJlZihkaWRBbHRlcik7XG5cbiAgaWYgKHJlbW92ZWQpIHtcbiAgICBTZXRSZWYoZGlkQ2hhbmdlU2l6ZSk7XG4gICAgcmV0dXJuOyAvLyB1bmRlZmluZWRcbiAgfVxuXG4gIGlmIChrZXlNYXRjaCkge1xuICAgIGlmIChvd25lcklEICYmIG93bmVySUQgPT09IHRoaXMub3duZXJJRCkge1xuICAgICAgdGhpcy5lbnRyeVsxXSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVmFsdWVOb2RlKG93bmVySUQsIHRoaXMua2V5SGFzaCwgW2tleSwgdmFsdWVdKTtcbiAgfVxuXG4gIFNldFJlZihkaWRDaGFuZ2VTaXplKTtcbiAgcmV0dXJuIG1lcmdlSW50b05vZGUodGhpcywgb3duZXJJRCwgc2hpZnQsIGhhc2goa2V5KSwgW2tleSwgdmFsdWVdKTtcbn07XG5cbi8vICNwcmFnbWEgSXRlcmF0b3JzXG5cbkFycmF5TWFwTm9kZS5wcm90b3R5cGUuaXRlcmF0ZSA9IEhhc2hDb2xsaXNpb25Ob2RlLnByb3RvdHlwZS5pdGVyYXRlID0gZnVuY3Rpb24oXG4gIGZuLFxuICByZXZlcnNlXG4pIHtcbiAgdmFyIGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG4gIGZvciAodmFyIGlpID0gMCwgbWF4SW5kZXggPSBlbnRyaWVzLmxlbmd0aCAtIDE7IGlpIDw9IG1heEluZGV4OyBpaSsrKSB7XG4gICAgaWYgKGZuKGVudHJpZXNbcmV2ZXJzZSA/IG1heEluZGV4IC0gaWkgOiBpaV0pID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufTtcblxuQml0bWFwSW5kZXhlZE5vZGUucHJvdG90eXBlLml0ZXJhdGUgPSBIYXNoQXJyYXlNYXBOb2RlLnByb3RvdHlwZS5pdGVyYXRlID0gZnVuY3Rpb24oXG4gIGZuLFxuICByZXZlcnNlXG4pIHtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcztcbiAgZm9yICh2YXIgaWkgPSAwLCBtYXhJbmRleCA9IG5vZGVzLmxlbmd0aCAtIDE7IGlpIDw9IG1heEluZGV4OyBpaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBub2Rlc1tyZXZlcnNlID8gbWF4SW5kZXggLSBpaSA6IGlpXTtcbiAgICBpZiAobm9kZSAmJiBub2RlLml0ZXJhdGUoZm4sIHJldmVyc2UpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5WYWx1ZU5vZGUucHJvdG90eXBlLml0ZXJhdGUgPSBmdW5jdGlvbihmbiwgcmV2ZXJzZSkge1xuICByZXR1cm4gZm4odGhpcy5lbnRyeSk7XG59O1xuXG52YXIgTWFwSXRlcmF0b3IgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChJdGVyYXRvciQkMSkge1xuICBmdW5jdGlvbiBNYXBJdGVyYXRvcihtYXAsIHR5cGUsIHJldmVyc2UpIHtcbiAgICB0aGlzLl90eXBlID0gdHlwZTtcbiAgICB0aGlzLl9yZXZlcnNlID0gcmV2ZXJzZTtcbiAgICB0aGlzLl9zdGFjayA9IG1hcC5fcm9vdCAmJiBtYXBJdGVyYXRvckZyYW1lKG1hcC5fcm9vdCk7XG4gIH1cblxuICBpZiAoIEl0ZXJhdG9yJCQxICkgTWFwSXRlcmF0b3IuX19wcm90b19fID0gSXRlcmF0b3IkJDE7XG4gIE1hcEl0ZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEl0ZXJhdG9yJCQxICYmIEl0ZXJhdG9yJCQxLnByb3RvdHlwZSApO1xuICBNYXBJdGVyYXRvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNYXBJdGVyYXRvcjtcblxuICBNYXBJdGVyYXRvci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uIG5leHQgKCkge1xuICAgIHZhciB0eXBlID0gdGhpcy5fdHlwZTtcbiAgICB2YXIgc3RhY2sgPSB0aGlzLl9zdGFjaztcbiAgICB3aGlsZSAoc3RhY2spIHtcbiAgICAgIHZhciBub2RlID0gc3RhY2subm9kZTtcbiAgICAgIHZhciBpbmRleCA9IHN0YWNrLmluZGV4Kys7XG4gICAgICB2YXIgbWF4SW5kZXggPSAodm9pZCAwKTtcbiAgICAgIGlmIChub2RlLmVudHJ5KSB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBtYXBJdGVyYXRvclZhbHVlKHR5cGUsIG5vZGUuZW50cnkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuZW50cmllcykge1xuICAgICAgICBtYXhJbmRleCA9IG5vZGUuZW50cmllcy5sZW5ndGggLSAxO1xuICAgICAgICBpZiAoaW5kZXggPD0gbWF4SW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gbWFwSXRlcmF0b3JWYWx1ZShcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBub2RlLmVudHJpZXNbdGhpcy5fcmV2ZXJzZSA/IG1heEluZGV4IC0gaW5kZXggOiBpbmRleF1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXhJbmRleCA9IG5vZGUubm9kZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKGluZGV4IDw9IG1heEluZGV4KSB7XG4gICAgICAgICAgdmFyIHN1Yk5vZGUgPSBub2RlLm5vZGVzW3RoaXMuX3JldmVyc2UgPyBtYXhJbmRleCAtIGluZGV4IDogaW5kZXhdO1xuICAgICAgICAgIGlmIChzdWJOb2RlKSB7XG4gICAgICAgICAgICBpZiAoc3ViTm9kZS5lbnRyeSkge1xuICAgICAgICAgICAgICByZXR1cm4gbWFwSXRlcmF0b3JWYWx1ZSh0eXBlLCBzdWJOb2RlLmVudHJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YWNrID0gdGhpcy5fc3RhY2sgPSBtYXBJdGVyYXRvckZyYW1lKHN1Yk5vZGUsIHN0YWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0YWNrID0gdGhpcy5fc3RhY2sgPSB0aGlzLl9zdGFjay5fX3ByZXY7XG4gICAgfVxuICAgIHJldHVybiBpdGVyYXRvckRvbmUoKTtcbiAgfTtcblxuICByZXR1cm4gTWFwSXRlcmF0b3I7XG59KEl0ZXJhdG9yKSk7XG5cbmZ1bmN0aW9uIG1hcEl0ZXJhdG9yVmFsdWUodHlwZSwgZW50cnkpIHtcbiAgcmV0dXJuIGl0ZXJhdG9yVmFsdWUodHlwZSwgZW50cnlbMF0sIGVudHJ5WzFdKTtcbn1cblxuZnVuY3Rpb24gbWFwSXRlcmF0b3JGcmFtZShub2RlLCBwcmV2KSB7XG4gIHJldHVybiB7XG4gICAgbm9kZTogbm9kZSxcbiAgICBpbmRleDogMCxcbiAgICBfX3ByZXY6IHByZXYsXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1ha2VNYXAoc2l6ZSwgcm9vdCwgb3duZXJJRCwgaGFzaCQkMSkge1xuICB2YXIgbWFwID0gT2JqZWN0LmNyZWF0ZShNYXBQcm90b3R5cGUpO1xuICBtYXAuc2l6ZSA9IHNpemU7XG4gIG1hcC5fcm9vdCA9IHJvb3Q7XG4gIG1hcC5fX293bmVySUQgPSBvd25lcklEO1xuICBtYXAuX19oYXNoID0gaGFzaCQkMTtcbiAgbWFwLl9fYWx0ZXJlZCA9IGZhbHNlO1xuICByZXR1cm4gbWFwO1xufVxuXG52YXIgRU1QVFlfTUFQO1xuZnVuY3Rpb24gZW1wdHlNYXAoKSB7XG4gIHJldHVybiBFTVBUWV9NQVAgfHwgKEVNUFRZX01BUCA9IG1ha2VNYXAoMCkpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNYXAobWFwLCBrLCB2KSB7XG4gIHZhciBuZXdSb290O1xuICB2YXIgbmV3U2l6ZTtcbiAgaWYgKCFtYXAuX3Jvb3QpIHtcbiAgICBpZiAodiA9PT0gTk9UX1NFVCkge1xuICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG4gICAgbmV3U2l6ZSA9IDE7XG4gICAgbmV3Um9vdCA9IG5ldyBBcnJheU1hcE5vZGUobWFwLl9fb3duZXJJRCwgW1trLCB2XV0pO1xuICB9IGVsc2Uge1xuICAgIHZhciBkaWRDaGFuZ2VTaXplID0gTWFrZVJlZigpO1xuICAgIHZhciBkaWRBbHRlciA9IE1ha2VSZWYoKTtcbiAgICBuZXdSb290ID0gdXBkYXRlTm9kZShcbiAgICAgIG1hcC5fcm9vdCxcbiAgICAgIG1hcC5fX293bmVySUQsXG4gICAgICAwLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgayxcbiAgICAgIHYsXG4gICAgICBkaWRDaGFuZ2VTaXplLFxuICAgICAgZGlkQWx0ZXJcbiAgICApO1xuICAgIGlmICghZGlkQWx0ZXIudmFsdWUpIHtcbiAgICAgIHJldHVybiBtYXA7XG4gICAgfVxuICAgIG5ld1NpemUgPSBtYXAuc2l6ZSArIChkaWRDaGFuZ2VTaXplLnZhbHVlID8gKHYgPT09IE5PVF9TRVQgPyAtMSA6IDEpIDogMCk7XG4gIH1cbiAgaWYgKG1hcC5fX293bmVySUQpIHtcbiAgICBtYXAuc2l6ZSA9IG5ld1NpemU7XG4gICAgbWFwLl9yb290ID0gbmV3Um9vdDtcbiAgICBtYXAuX19oYXNoID0gdW5kZWZpbmVkO1xuICAgIG1hcC5fX2FsdGVyZWQgPSB0cnVlO1xuICAgIHJldHVybiBtYXA7XG4gIH1cbiAgcmV0dXJuIG5ld1Jvb3QgPyBtYWtlTWFwKG5ld1NpemUsIG5ld1Jvb3QpIDogZW1wdHlNYXAoKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTm9kZShcbiAgbm9kZSxcbiAgb3duZXJJRCxcbiAgc2hpZnQsXG4gIGtleUhhc2gsXG4gIGtleSxcbiAgdmFsdWUsXG4gIGRpZENoYW5nZVNpemUsXG4gIGRpZEFsdGVyXG4pIHtcbiAgaWYgKCFub2RlKSB7XG4gICAgaWYgKHZhbHVlID09PSBOT1RfU0VUKSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgU2V0UmVmKGRpZEFsdGVyKTtcbiAgICBTZXRSZWYoZGlkQ2hhbmdlU2l6ZSk7XG4gICAgcmV0dXJuIG5ldyBWYWx1ZU5vZGUob3duZXJJRCwga2V5SGFzaCwgW2tleSwgdmFsdWVdKTtcbiAgfVxuICByZXR1cm4gbm9kZS51cGRhdGUoXG4gICAgb3duZXJJRCxcbiAgICBzaGlmdCxcbiAgICBrZXlIYXNoLFxuICAgIGtleSxcbiAgICB2YWx1ZSxcbiAgICBkaWRDaGFuZ2VTaXplLFxuICAgIGRpZEFsdGVyXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzTGVhZk5vZGUobm9kZSkge1xuICByZXR1cm4gKFxuICAgIG5vZGUuY29uc3RydWN0b3IgPT09IFZhbHVlTm9kZSB8fCBub2RlLmNvbnN0cnVjdG9yID09PSBIYXNoQ29sbGlzaW9uTm9kZVxuICApO1xufVxuXG5mdW5jdGlvbiBtZXJnZUludG9Ob2RlKG5vZGUsIG93bmVySUQsIHNoaWZ0LCBrZXlIYXNoLCBlbnRyeSkge1xuICBpZiAobm9kZS5rZXlIYXNoID09PSBrZXlIYXNoKSB7XG4gICAgcmV0dXJuIG5ldyBIYXNoQ29sbGlzaW9uTm9kZShvd25lcklELCBrZXlIYXNoLCBbbm9kZS5lbnRyeSwgZW50cnldKTtcbiAgfVxuXG4gIHZhciBpZHgxID0gKHNoaWZ0ID09PSAwID8gbm9kZS5rZXlIYXNoIDogbm9kZS5rZXlIYXNoID4+PiBzaGlmdCkgJiBNQVNLO1xuICB2YXIgaWR4MiA9IChzaGlmdCA9PT0gMCA/IGtleUhhc2ggOiBrZXlIYXNoID4+PiBzaGlmdCkgJiBNQVNLO1xuXG4gIHZhciBuZXdOb2RlO1xuICB2YXIgbm9kZXMgPVxuICAgIGlkeDEgPT09IGlkeDJcbiAgICAgID8gW21lcmdlSW50b05vZGUobm9kZSwgb3duZXJJRCwgc2hpZnQgKyBTSElGVCwga2V5SGFzaCwgZW50cnkpXVxuICAgICAgOiAoKG5ld05vZGUgPSBuZXcgVmFsdWVOb2RlKG93bmVySUQsIGtleUhhc2gsIGVudHJ5KSksXG4gICAgICAgIGlkeDEgPCBpZHgyID8gW25vZGUsIG5ld05vZGVdIDogW25ld05vZGUsIG5vZGVdKTtcblxuICByZXR1cm4gbmV3IEJpdG1hcEluZGV4ZWROb2RlKG93bmVySUQsICgxIDw8IGlkeDEpIHwgKDEgPDwgaWR4MiksIG5vZGVzKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTm9kZXMob3duZXJJRCwgZW50cmllcywga2V5LCB2YWx1ZSkge1xuICBpZiAoIW93bmVySUQpIHtcbiAgICBvd25lcklEID0gbmV3IE93bmVySUQoKTtcbiAgfVxuICB2YXIgbm9kZSA9IG5ldyBWYWx1ZU5vZGUob3duZXJJRCwgaGFzaChrZXkpLCBba2V5LCB2YWx1ZV0pO1xuICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgZW50cmllcy5sZW5ndGg7IGlpKyspIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2lpXTtcbiAgICBub2RlID0gbm9kZS51cGRhdGUob3duZXJJRCwgMCwgdW5kZWZpbmVkLCBlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG4gIHJldHVybiBub2RlO1xufVxuXG5mdW5jdGlvbiBwYWNrTm9kZXMob3duZXJJRCwgbm9kZXMsIGNvdW50LCBleGNsdWRpbmcpIHtcbiAgdmFyIGJpdG1hcCA9IDA7XG4gIHZhciBwYWNrZWRJSSA9IDA7XG4gIHZhciBwYWNrZWROb2RlcyA9IG5ldyBBcnJheShjb3VudCk7XG4gIGZvciAodmFyIGlpID0gMCwgYml0ID0gMSwgbGVuID0gbm9kZXMubGVuZ3RoOyBpaSA8IGxlbjsgaWkrKywgYml0IDw8PSAxKSB7XG4gICAgdmFyIG5vZGUgPSBub2Rlc1tpaV07XG4gICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCAmJiBpaSAhPT0gZXhjbHVkaW5nKSB7XG4gICAgICBiaXRtYXAgfD0gYml0O1xuICAgICAgcGFja2VkTm9kZXNbcGFja2VkSUkrK10gPSBub2RlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3IEJpdG1hcEluZGV4ZWROb2RlKG93bmVySUQsIGJpdG1hcCwgcGFja2VkTm9kZXMpO1xufVxuXG5mdW5jdGlvbiBleHBhbmROb2Rlcyhvd25lcklELCBub2RlcywgYml0bWFwLCBpbmNsdWRpbmcsIG5vZGUpIHtcbiAgdmFyIGNvdW50ID0gMDtcbiAgdmFyIGV4cGFuZGVkTm9kZXMgPSBuZXcgQXJyYXkoU0laRSk7XG4gIGZvciAodmFyIGlpID0gMDsgYml0bWFwICE9PSAwOyBpaSsrLCBiaXRtYXAgPj4+PSAxKSB7XG4gICAgZXhwYW5kZWROb2Rlc1tpaV0gPSBiaXRtYXAgJiAxID8gbm9kZXNbY291bnQrK10gOiB1bmRlZmluZWQ7XG4gIH1cbiAgZXhwYW5kZWROb2Rlc1tpbmNsdWRpbmddID0gbm9kZTtcbiAgcmV0dXJuIG5ldyBIYXNoQXJyYXlNYXBOb2RlKG93bmVySUQsIGNvdW50ICsgMSwgZXhwYW5kZWROb2Rlcyk7XG59XG5cbmZ1bmN0aW9uIHBvcENvdW50KHgpIHtcbiAgeCAtPSAoeCA+PiAxKSAmIDB4NTU1NTU1NTU7XG4gIHggPSAoeCAmIDB4MzMzMzMzMzMpICsgKCh4ID4+IDIpICYgMHgzMzMzMzMzMyk7XG4gIHggPSAoeCArICh4ID4+IDQpKSAmIDB4MGYwZjBmMGY7XG4gIHggKz0geCA+PiA4O1xuICB4ICs9IHggPj4gMTY7XG4gIHJldHVybiB4ICYgMHg3Zjtcbn1cblxuZnVuY3Rpb24gc2V0QXQoYXJyYXksIGlkeCwgdmFsLCBjYW5FZGl0KSB7XG4gIHZhciBuZXdBcnJheSA9IGNhbkVkaXQgPyBhcnJheSA6IGFyckNvcHkoYXJyYXkpO1xuICBuZXdBcnJheVtpZHhdID0gdmFsO1xuICByZXR1cm4gbmV3QXJyYXk7XG59XG5cbmZ1bmN0aW9uIHNwbGljZUluKGFycmF5LCBpZHgsIHZhbCwgY2FuRWRpdCkge1xuICB2YXIgbmV3TGVuID0gYXJyYXkubGVuZ3RoICsgMTtcbiAgaWYgKGNhbkVkaXQgJiYgaWR4ICsgMSA9PT0gbmV3TGVuKSB7XG4gICAgYXJyYXlbaWR4XSA9IHZhbDtcbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cbiAgdmFyIG5ld0FycmF5ID0gbmV3IEFycmF5KG5ld0xlbik7XG4gIHZhciBhZnRlciA9IDA7XG4gIGZvciAodmFyIGlpID0gMDsgaWkgPCBuZXdMZW47IGlpKyspIHtcbiAgICBpZiAoaWkgPT09IGlkeCkge1xuICAgICAgbmV3QXJyYXlbaWldID0gdmFsO1xuICAgICAgYWZ0ZXIgPSAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3QXJyYXlbaWldID0gYXJyYXlbaWkgKyBhZnRlcl07XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXdBcnJheTtcbn1cblxuZnVuY3Rpb24gc3BsaWNlT3V0KGFycmF5LCBpZHgsIGNhbkVkaXQpIHtcbiAgdmFyIG5ld0xlbiA9IGFycmF5Lmxlbmd0aCAtIDE7XG4gIGlmIChjYW5FZGl0ICYmIGlkeCA9PT0gbmV3TGVuKSB7XG4gICAgYXJyYXkucG9wKCk7XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG4gIHZhciBuZXdBcnJheSA9IG5ldyBBcnJheShuZXdMZW4pO1xuICB2YXIgYWZ0ZXIgPSAwO1xuICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgbmV3TGVuOyBpaSsrKSB7XG4gICAgaWYgKGlpID09PSBpZHgpIHtcbiAgICAgIGFmdGVyID0gMTtcbiAgICB9XG4gICAgbmV3QXJyYXlbaWldID0gYXJyYXlbaWkgKyBhZnRlcl07XG4gIH1cbiAgcmV0dXJuIG5ld0FycmF5O1xufVxuXG52YXIgTUFYX0FSUkFZX01BUF9TSVpFID0gU0laRSAvIDQ7XG52YXIgTUFYX0JJVE1BUF9JTkRFWEVEX1NJWkUgPSBTSVpFIC8gMjtcbnZhciBNSU5fSEFTSF9BUlJBWV9NQVBfU0laRSA9IFNJWkUgLyA0O1xuXG52YXIgSVNfTElTVF9TWU1CT0wgPSAnQEBfX0lNTVVUQUJMRV9MSVNUX19AQCc7XG5cbmZ1bmN0aW9uIGlzTGlzdChtYXliZUxpc3QpIHtcbiAgcmV0dXJuIEJvb2xlYW4obWF5YmVMaXN0ICYmIG1heWJlTGlzdFtJU19MSVNUX1NZTUJPTF0pO1xufVxuXG52YXIgTGlzdCA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEluZGV4ZWRDb2xsZWN0aW9uJCQxKSB7XG4gIGZ1bmN0aW9uIExpc3QodmFsdWUpIHtcbiAgICB2YXIgZW1wdHkgPSBlbXB0eUxpc3QoKTtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGVtcHR5O1xuICAgIH1cbiAgICBpZiAoaXNMaXN0KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICB2YXIgaXRlciA9IEluZGV4ZWRDb2xsZWN0aW9uJCQxKHZhbHVlKTtcbiAgICB2YXIgc2l6ZSA9IGl0ZXIuc2l6ZTtcbiAgICBpZiAoc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIGVtcHR5O1xuICAgIH1cbiAgICBhc3NlcnROb3RJbmZpbml0ZShzaXplKTtcbiAgICBpZiAoc2l6ZSA+IDAgJiYgc2l6ZSA8IFNJWkUpIHtcbiAgICAgIHJldHVybiBtYWtlTGlzdCgwLCBzaXplLCBTSElGVCwgbnVsbCwgbmV3IFZOb2RlKGl0ZXIudG9BcnJheSgpKSk7XG4gICAgfVxuICAgIHJldHVybiBlbXB0eS53aXRoTXV0YXRpb25zKGZ1bmN0aW9uIChsaXN0KSB7XG4gICAgICBsaXN0LnNldFNpemUoc2l6ZSk7XG4gICAgICBpdGVyLmZvckVhY2goZnVuY3Rpb24gKHYsIGkpIHsgcmV0dXJuIGxpc3Quc2V0KGksIHYpOyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmICggSW5kZXhlZENvbGxlY3Rpb24kJDEgKSBMaXN0Ll9fcHJvdG9fXyA9IEluZGV4ZWRDb2xsZWN0aW9uJCQxO1xuICBMaXN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEluZGV4ZWRDb2xsZWN0aW9uJCQxICYmIEluZGV4ZWRDb2xsZWN0aW9uJCQxLnByb3RvdHlwZSApO1xuICBMaXN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpc3Q7XG5cbiAgTGlzdC5vZiA9IGZ1bmN0aW9uIG9mICgvKi4uLnZhbHVlcyovKSB7XG4gICAgcmV0dXJuIHRoaXMoYXJndW1lbnRzKTtcbiAgfTtcblxuICBMaXN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCdMaXN0IFsnLCAnXScpO1xuICB9O1xuXG4gIC8vIEBwcmFnbWEgQWNjZXNzXG5cbiAgTGlzdC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChpbmRleCwgbm90U2V0VmFsdWUpIHtcbiAgICBpbmRleCA9IHdyYXBJbmRleCh0aGlzLCBpbmRleCk7XG4gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLnNpemUpIHtcbiAgICAgIGluZGV4ICs9IHRoaXMuX29yaWdpbjtcbiAgICAgIHZhciBub2RlID0gbGlzdE5vZGVGb3IodGhpcywgaW5kZXgpO1xuICAgICAgcmV0dXJuIG5vZGUgJiYgbm9kZS5hcnJheVtpbmRleCAmIE1BU0tdO1xuICAgIH1cbiAgICByZXR1cm4gbm90U2V0VmFsdWU7XG4gIH07XG5cbiAgLy8gQHByYWdtYSBNb2RpZmljYXRpb25cblxuICBMaXN0LnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiBzZXQgKGluZGV4LCB2YWx1ZSkge1xuICAgIHJldHVybiB1cGRhdGVMaXN0KHRoaXMsIGluZGV4LCB2YWx1ZSk7XG4gIH07XG5cbiAgTGlzdC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlIChpbmRleCkge1xuICAgIHJldHVybiAhdGhpcy5oYXMoaW5kZXgpXG4gICAgICA/IHRoaXNcbiAgICAgIDogaW5kZXggPT09IDBcbiAgICAgICAgPyB0aGlzLnNoaWZ0KClcbiAgICAgICAgOiBpbmRleCA9PT0gdGhpcy5zaXplIC0gMVxuICAgICAgICAgID8gdGhpcy5wb3AoKVxuICAgICAgICAgIDogdGhpcy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9O1xuXG4gIExpc3QucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIGluc2VydCAoaW5kZXgsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuc3BsaWNlKGluZGV4LCAwLCB2YWx1ZSk7XG4gIH07XG5cbiAgTGlzdC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiBjbGVhciAoKSB7XG4gICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmICh0aGlzLl9fb3duZXJJRCkge1xuICAgICAgdGhpcy5zaXplID0gdGhpcy5fb3JpZ2luID0gdGhpcy5fY2FwYWNpdHkgPSAwO1xuICAgICAgdGhpcy5fbGV2ZWwgPSBTSElGVDtcbiAgICAgIHRoaXMuX3Jvb3QgPSB0aGlzLl90YWlsID0gbnVsbDtcbiAgICAgIHRoaXMuX19oYXNoID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fX2FsdGVyZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBlbXB0eUxpc3QoKTtcbiAgfTtcblxuICBMaXN0LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gcHVzaCAoLyouLi52YWx1ZXMqLykge1xuICAgIHZhciB2YWx1ZXMgPSBhcmd1bWVudHM7XG4gICAgdmFyIG9sZFNpemUgPSB0aGlzLnNpemU7XG4gICAgcmV0dXJuIHRoaXMud2l0aE11dGF0aW9ucyhmdW5jdGlvbiAobGlzdCkge1xuICAgICAgc2V0TGlzdEJvdW5kcyhsaXN0LCAwLCBvbGRTaXplICsgdmFsdWVzLmxlbmd0aCk7XG4gICAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgdmFsdWVzLmxlbmd0aDsgaWkrKykge1xuICAgICAgICBsaXN0LnNldChvbGRTaXplICsgaWksIHZhbHVlc1tpaV0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIExpc3QucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uIHBvcCAoKSB7XG4gICAgcmV0dXJuIHNldExpc3RCb3VuZHModGhpcywgMCwgLTEpO1xuICB9O1xuXG4gIExpc3QucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiB1bnNoaWZ0ICgvKi4uLnZhbHVlcyovKSB7XG4gICAgdmFyIHZhbHVlcyA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKGZ1bmN0aW9uIChsaXN0KSB7XG4gICAgICBzZXRMaXN0Qm91bmRzKGxpc3QsIC12YWx1ZXMubGVuZ3RoKTtcbiAgICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCB2YWx1ZXMubGVuZ3RoOyBpaSsrKSB7XG4gICAgICAgIGxpc3Quc2V0KGlpLCB2YWx1ZXNbaWldKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBMaXN0LnByb3RvdHlwZS5zaGlmdCA9IGZ1bmN0aW9uIHNoaWZ0ICgpIHtcbiAgICByZXR1cm4gc2V0TGlzdEJvdW5kcyh0aGlzLCAxKTtcbiAgfTtcblxuICAvLyBAcHJhZ21hIENvbXBvc2l0aW9uXG5cbiAgTGlzdC5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0ICgvKi4uLmNvbGxlY3Rpb25zKi8pIHtcbiAgICB2YXIgYXJndW1lbnRzJDEgPSBhcmd1bWVudHM7XG5cbiAgICB2YXIgc2VxcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYXJndW1lbnQgPSBhcmd1bWVudHMkMVtpXTtcbiAgICAgIHZhciBzZXEgPSBJbmRleGVkQ29sbGVjdGlvbiQkMShcbiAgICAgICAgdHlwZW9mIGFyZ3VtZW50ICE9PSAnc3RyaW5nJyAmJiBoYXNJdGVyYXRvcihhcmd1bWVudClcbiAgICAgICAgICA/IGFyZ3VtZW50XG4gICAgICAgICAgOiBbYXJndW1lbnRdXG4gICAgICApO1xuICAgICAgaWYgKHNlcS5zaXplICE9PSAwKSB7XG4gICAgICAgIHNlcXMucHVzaChzZXEpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2Vxcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaXplID09PSAwICYmICF0aGlzLl9fb3duZXJJRCAmJiBzZXFzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3Ioc2Vxc1swXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLndpdGhNdXRhdGlvbnMoZnVuY3Rpb24gKGxpc3QpIHtcbiAgICAgIHNlcXMuZm9yRWFjaChmdW5jdGlvbiAoc2VxKSB7IHJldHVybiBzZXEuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIGxpc3QucHVzaCh2YWx1ZSk7IH0pOyB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBMaXN0LnByb3RvdHlwZS5zZXRTaXplID0gZnVuY3Rpb24gc2V0U2l6ZSAoc2l6ZSkge1xuICAgIHJldHVybiBzZXRMaXN0Qm91bmRzKHRoaXMsIDAsIHNpemUpO1xuICB9O1xuXG4gIExpc3QucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIG1hcCAobWFwcGVyLCBjb250ZXh0KSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICByZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKGZ1bmN0aW9uIChsaXN0KSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMkMS5zaXplOyBpKyspIHtcbiAgICAgICAgbGlzdC5zZXQoaSwgbWFwcGVyLmNhbGwoY29udGV4dCwgbGlzdC5nZXQoaSksIGksIGxpc3QpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICAvLyBAcHJhZ21hIEl0ZXJhdGlvblxuXG4gIExpc3QucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKGJlZ2luLCBlbmQpIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICBpZiAod2hvbGVTbGljZShiZWdpbiwgZW5kLCBzaXplKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBzZXRMaXN0Qm91bmRzKFxuICAgICAgdGhpcyxcbiAgICAgIHJlc29sdmVCZWdpbihiZWdpbiwgc2l6ZSksXG4gICAgICByZXNvbHZlRW5kKGVuZCwgc2l6ZSlcbiAgICApO1xuICB9O1xuXG4gIExpc3QucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbiBfX2l0ZXJhdG9yICh0eXBlLCByZXZlcnNlKSB7XG4gICAgdmFyIGluZGV4ID0gcmV2ZXJzZSA/IHRoaXMuc2l6ZSA6IDA7XG4gICAgdmFyIHZhbHVlcyA9IGl0ZXJhdGVMaXN0KHRoaXMsIHJldmVyc2UpO1xuICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHZhbHVlID0gdmFsdWVzKCk7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IERPTkVcbiAgICAgICAgPyBpdGVyYXRvckRvbmUoKVxuICAgICAgICA6IGl0ZXJhdG9yVmFsdWUodHlwZSwgcmV2ZXJzZSA/IC0taW5kZXggOiBpbmRleCsrLCB2YWx1ZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgTGlzdC5wcm90b3R5cGUuX19pdGVyYXRlID0gZnVuY3Rpb24gX19pdGVyYXRlIChmbiwgcmV2ZXJzZSkge1xuICAgIHZhciBpbmRleCA9IHJldmVyc2UgPyB0aGlzLnNpemUgOiAwO1xuICAgIHZhciB2YWx1ZXMgPSBpdGVyYXRlTGlzdCh0aGlzLCByZXZlcnNlKTtcbiAgICB2YXIgdmFsdWU7XG4gICAgd2hpbGUgKCh2YWx1ZSA9IHZhbHVlcygpKSAhPT0gRE9ORSkge1xuICAgICAgaWYgKGZuKHZhbHVlLCByZXZlcnNlID8gLS1pbmRleCA6IGluZGV4KyssIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9O1xuXG4gIExpc3QucHJvdG90eXBlLl9fZW5zdXJlT3duZXIgPSBmdW5jdGlvbiBfX2Vuc3VyZU93bmVyIChvd25lcklEKSB7XG4gICAgaWYgKG93bmVySUQgPT09IHRoaXMuX19vd25lcklEKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKCFvd25lcklEKSB7XG4gICAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybiBlbXB0eUxpc3QoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX19vd25lcklEID0gb3duZXJJRDtcbiAgICAgIHRoaXMuX19hbHRlcmVkID0gZmFsc2U7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIG1ha2VMaXN0KFxuICAgICAgdGhpcy5fb3JpZ2luLFxuICAgICAgdGhpcy5fY2FwYWNpdHksXG4gICAgICB0aGlzLl9sZXZlbCxcbiAgICAgIHRoaXMuX3Jvb3QsXG4gICAgICB0aGlzLl90YWlsLFxuICAgICAgb3duZXJJRCxcbiAgICAgIHRoaXMuX19oYXNoXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gTGlzdDtcbn0oSW5kZXhlZENvbGxlY3Rpb24pKTtcblxuTGlzdC5pc0xpc3QgPSBpc0xpc3Q7XG5cbnZhciBMaXN0UHJvdG90eXBlID0gTGlzdC5wcm90b3R5cGU7XG5MaXN0UHJvdG90eXBlW0lTX0xJU1RfU1lNQk9MXSA9IHRydWU7XG5MaXN0UHJvdG90eXBlW0RFTEVURV0gPSBMaXN0UHJvdG90eXBlLnJlbW92ZTtcbkxpc3RQcm90b3R5cGUubWVyZ2UgPSBMaXN0UHJvdG90eXBlLmNvbmNhdDtcbkxpc3RQcm90b3R5cGUuc2V0SW4gPSBzZXRJbiQxO1xuTGlzdFByb3RvdHlwZS5kZWxldGVJbiA9IExpc3RQcm90b3R5cGUucmVtb3ZlSW4gPSBkZWxldGVJbjtcbkxpc3RQcm90b3R5cGUudXBkYXRlID0gdXBkYXRlJDE7XG5MaXN0UHJvdG90eXBlLnVwZGF0ZUluID0gdXBkYXRlSW4kMTtcbkxpc3RQcm90b3R5cGUubWVyZ2VJbiA9IG1lcmdlSW47XG5MaXN0UHJvdG90eXBlLm1lcmdlRGVlcEluID0gbWVyZ2VEZWVwSW47XG5MaXN0UHJvdG90eXBlLndpdGhNdXRhdGlvbnMgPSB3aXRoTXV0YXRpb25zO1xuTGlzdFByb3RvdHlwZS53YXNBbHRlcmVkID0gd2FzQWx0ZXJlZDtcbkxpc3RQcm90b3R5cGUuYXNJbW11dGFibGUgPSBhc0ltbXV0YWJsZTtcbkxpc3RQcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBMaXN0UHJvdG90eXBlLmFzTXV0YWJsZSA9IGFzTXV0YWJsZTtcbkxpc3RQcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbihyZXN1bHQsIGFycikge1xuICByZXR1cm4gcmVzdWx0LnB1c2goYXJyKTtcbn07XG5MaXN0UHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbihvYmopIHtcbiAgcmV0dXJuIG9iai5hc0ltbXV0YWJsZSgpO1xufTtcblxudmFyIFZOb2RlID0gZnVuY3Rpb24gVk5vZGUoYXJyYXksIG93bmVySUQpIHtcbiAgdGhpcy5hcnJheSA9IGFycmF5O1xuICB0aGlzLm93bmVySUQgPSBvd25lcklEO1xufTtcblxuLy8gVE9ETzogc2VlbXMgbGlrZSB0aGVzZSBtZXRob2RzIGFyZSB2ZXJ5IHNpbWlsYXJcblxuVk5vZGUucHJvdG90eXBlLnJlbW92ZUJlZm9yZSA9IGZ1bmN0aW9uIHJlbW92ZUJlZm9yZSAob3duZXJJRCwgbGV2ZWwsIGluZGV4KSB7XG4gIGlmIChpbmRleCA9PT0gbGV2ZWwgPyAxIDw8IGxldmVsIDogdGhpcy5hcnJheS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICB2YXIgb3JpZ2luSW5kZXggPSAoaW5kZXggPj4+IGxldmVsKSAmIE1BU0s7XG4gIGlmIChvcmlnaW5JbmRleCA+PSB0aGlzLmFycmF5Lmxlbmd0aCkge1xuICAgIHJldHVybiBuZXcgVk5vZGUoW10sIG93bmVySUQpO1xuICB9XG4gIHZhciByZW1vdmluZ0ZpcnN0ID0gb3JpZ2luSW5kZXggPT09IDA7XG4gIHZhciBuZXdDaGlsZDtcbiAgaWYgKGxldmVsID4gMCkge1xuICAgIHZhciBvbGRDaGlsZCA9IHRoaXMuYXJyYXlbb3JpZ2luSW5kZXhdO1xuICAgIG5ld0NoaWxkID1cbiAgICAgIG9sZENoaWxkICYmIG9sZENoaWxkLnJlbW92ZUJlZm9yZShvd25lcklELCBsZXZlbCAtIFNISUZULCBpbmRleCk7XG4gICAgaWYgKG5ld0NoaWxkID09PSBvbGRDaGlsZCAmJiByZW1vdmluZ0ZpcnN0KSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1cbiAgaWYgKHJlbW92aW5nRmlyc3QgJiYgIW5ld0NoaWxkKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdmFyIGVkaXRhYmxlID0gZWRpdGFibGVWTm9kZSh0aGlzLCBvd25lcklEKTtcbiAgaWYgKCFyZW1vdmluZ0ZpcnN0KSB7XG4gICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IG9yaWdpbkluZGV4OyBpaSsrKSB7XG4gICAgICBlZGl0YWJsZS5hcnJheVtpaV0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIGlmIChuZXdDaGlsZCkge1xuICAgIGVkaXRhYmxlLmFycmF5W29yaWdpbkluZGV4XSA9IG5ld0NoaWxkO1xuICB9XG4gIHJldHVybiBlZGl0YWJsZTtcbn07XG5cblZOb2RlLnByb3RvdHlwZS5yZW1vdmVBZnRlciA9IGZ1bmN0aW9uIHJlbW92ZUFmdGVyIChvd25lcklELCBsZXZlbCwgaW5kZXgpIHtcbiAgaWYgKGluZGV4ID09PSAobGV2ZWwgPyAxIDw8IGxldmVsIDogMCkgfHwgdGhpcy5hcnJheS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICB2YXIgc2l6ZUluZGV4ID0gKChpbmRleCAtIDEpID4+PiBsZXZlbCkgJiBNQVNLO1xuICBpZiAoc2l6ZUluZGV4ID49IHRoaXMuYXJyYXkubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB2YXIgbmV3Q2hpbGQ7XG4gIGlmIChsZXZlbCA+IDApIHtcbiAgICB2YXIgb2xkQ2hpbGQgPSB0aGlzLmFycmF5W3NpemVJbmRleF07XG4gICAgbmV3Q2hpbGQgPVxuICAgICAgb2xkQ2hpbGQgJiYgb2xkQ2hpbGQucmVtb3ZlQWZ0ZXIob3duZXJJRCwgbGV2ZWwgLSBTSElGVCwgaW5kZXgpO1xuICAgIGlmIChuZXdDaGlsZCA9PT0gb2xkQ2hpbGQgJiYgc2l6ZUluZGV4ID09PSB0aGlzLmFycmF5Lmxlbmd0aCAtIDEpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfVxuXG4gIHZhciBlZGl0YWJsZSA9IGVkaXRhYmxlVk5vZGUodGhpcywgb3duZXJJRCk7XG4gIGVkaXRhYmxlLmFycmF5LnNwbGljZShzaXplSW5kZXggKyAxKTtcbiAgaWYgKG5ld0NoaWxkKSB7XG4gICAgZWRpdGFibGUuYXJyYXlbc2l6ZUluZGV4XSA9IG5ld0NoaWxkO1xuICB9XG4gIHJldHVybiBlZGl0YWJsZTtcbn07XG5cbnZhciBET05FID0ge307XG5cbmZ1bmN0aW9uIGl0ZXJhdGVMaXN0KGxpc3QsIHJldmVyc2UpIHtcbiAgdmFyIGxlZnQgPSBsaXN0Ll9vcmlnaW47XG4gIHZhciByaWdodCA9IGxpc3QuX2NhcGFjaXR5O1xuICB2YXIgdGFpbFBvcyA9IGdldFRhaWxPZmZzZXQocmlnaHQpO1xuICB2YXIgdGFpbCA9IGxpc3QuX3RhaWw7XG5cbiAgcmV0dXJuIGl0ZXJhdGVOb2RlT3JMZWFmKGxpc3QuX3Jvb3QsIGxpc3QuX2xldmVsLCAwKTtcblxuICBmdW5jdGlvbiBpdGVyYXRlTm9kZU9yTGVhZihub2RlLCBsZXZlbCwgb2Zmc2V0KSB7XG4gICAgcmV0dXJuIGxldmVsID09PSAwXG4gICAgICA/IGl0ZXJhdGVMZWFmKG5vZGUsIG9mZnNldClcbiAgICAgIDogaXRlcmF0ZU5vZGUobm9kZSwgbGV2ZWwsIG9mZnNldCk7XG4gIH1cblxuICBmdW5jdGlvbiBpdGVyYXRlTGVhZihub2RlLCBvZmZzZXQpIHtcbiAgICB2YXIgYXJyYXkgPSBvZmZzZXQgPT09IHRhaWxQb3MgPyB0YWlsICYmIHRhaWwuYXJyYXkgOiBub2RlICYmIG5vZGUuYXJyYXk7XG4gICAgdmFyIGZyb20gPSBvZmZzZXQgPiBsZWZ0ID8gMCA6IGxlZnQgLSBvZmZzZXQ7XG4gICAgdmFyIHRvID0gcmlnaHQgLSBvZmZzZXQ7XG4gICAgaWYgKHRvID4gU0laRSkge1xuICAgICAgdG8gPSBTSVpFO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGZyb20gPT09IHRvKSB7XG4gICAgICAgIHJldHVybiBET05FO1xuICAgICAgfVxuICAgICAgdmFyIGlkeCA9IHJldmVyc2UgPyAtLXRvIDogZnJvbSsrO1xuICAgICAgcmV0dXJuIGFycmF5ICYmIGFycmF5W2lkeF07XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGl0ZXJhdGVOb2RlKG5vZGUsIGxldmVsLCBvZmZzZXQpIHtcbiAgICB2YXIgdmFsdWVzO1xuICAgIHZhciBhcnJheSA9IG5vZGUgJiYgbm9kZS5hcnJheTtcbiAgICB2YXIgZnJvbSA9IG9mZnNldCA+IGxlZnQgPyAwIDogKGxlZnQgLSBvZmZzZXQpID4+IGxldmVsO1xuICAgIHZhciB0byA9ICgocmlnaHQgLSBvZmZzZXQpID4+IGxldmVsKSArIDE7XG4gICAgaWYgKHRvID4gU0laRSkge1xuICAgICAgdG8gPSBTSVpFO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgaWYgKHZhbHVlcykge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IHZhbHVlcygpO1xuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gRE9ORSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YWx1ZXMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmcm9tID09PSB0bykge1xuICAgICAgICAgIHJldHVybiBET05FO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpZHggPSByZXZlcnNlID8gLS10byA6IGZyb20rKztcbiAgICAgICAgdmFsdWVzID0gaXRlcmF0ZU5vZGVPckxlYWYoXG4gICAgICAgICAgYXJyYXkgJiYgYXJyYXlbaWR4XSxcbiAgICAgICAgICBsZXZlbCAtIFNISUZULFxuICAgICAgICAgIG9mZnNldCArIChpZHggPDwgbGV2ZWwpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYWtlTGlzdChvcmlnaW4sIGNhcGFjaXR5LCBsZXZlbCwgcm9vdCwgdGFpbCwgb3duZXJJRCwgaGFzaCkge1xuICB2YXIgbGlzdCA9IE9iamVjdC5jcmVhdGUoTGlzdFByb3RvdHlwZSk7XG4gIGxpc3Quc2l6ZSA9IGNhcGFjaXR5IC0gb3JpZ2luO1xuICBsaXN0Ll9vcmlnaW4gPSBvcmlnaW47XG4gIGxpc3QuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG4gIGxpc3QuX2xldmVsID0gbGV2ZWw7XG4gIGxpc3QuX3Jvb3QgPSByb290O1xuICBsaXN0Ll90YWlsID0gdGFpbDtcbiAgbGlzdC5fX293bmVySUQgPSBvd25lcklEO1xuICBsaXN0Ll9faGFzaCA9IGhhc2g7XG4gIGxpc3QuX19hbHRlcmVkID0gZmFsc2U7XG4gIHJldHVybiBsaXN0O1xufVxuXG52YXIgRU1QVFlfTElTVDtcbmZ1bmN0aW9uIGVtcHR5TGlzdCgpIHtcbiAgcmV0dXJuIEVNUFRZX0xJU1QgfHwgKEVNUFRZX0xJU1QgPSBtYWtlTGlzdCgwLCAwLCBTSElGVCkpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVMaXN0KGxpc3QsIGluZGV4LCB2YWx1ZSkge1xuICBpbmRleCA9IHdyYXBJbmRleChsaXN0LCBpbmRleCk7XG5cbiAgaWYgKGluZGV4ICE9PSBpbmRleCkge1xuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgaWYgKGluZGV4ID49IGxpc3Quc2l6ZSB8fCBpbmRleCA8IDApIHtcbiAgICByZXR1cm4gbGlzdC53aXRoTXV0YXRpb25zKGZ1bmN0aW9uIChsaXN0KSB7XG4gICAgICBpbmRleCA8IDBcbiAgICAgICAgPyBzZXRMaXN0Qm91bmRzKGxpc3QsIGluZGV4KS5zZXQoMCwgdmFsdWUpXG4gICAgICAgIDogc2V0TGlzdEJvdW5kcyhsaXN0LCAwLCBpbmRleCArIDEpLnNldChpbmRleCwgdmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgaW5kZXggKz0gbGlzdC5fb3JpZ2luO1xuXG4gIHZhciBuZXdUYWlsID0gbGlzdC5fdGFpbDtcbiAgdmFyIG5ld1Jvb3QgPSBsaXN0Ll9yb290O1xuICB2YXIgZGlkQWx0ZXIgPSBNYWtlUmVmKCk7XG4gIGlmIChpbmRleCA+PSBnZXRUYWlsT2Zmc2V0KGxpc3QuX2NhcGFjaXR5KSkge1xuICAgIG5ld1RhaWwgPSB1cGRhdGVWTm9kZShuZXdUYWlsLCBsaXN0Ll9fb3duZXJJRCwgMCwgaW5kZXgsIHZhbHVlLCBkaWRBbHRlcik7XG4gIH0gZWxzZSB7XG4gICAgbmV3Um9vdCA9IHVwZGF0ZVZOb2RlKFxuICAgICAgbmV3Um9vdCxcbiAgICAgIGxpc3QuX19vd25lcklELFxuICAgICAgbGlzdC5fbGV2ZWwsXG4gICAgICBpbmRleCxcbiAgICAgIHZhbHVlLFxuICAgICAgZGlkQWx0ZXJcbiAgICApO1xuICB9XG5cbiAgaWYgKCFkaWRBbHRlci52YWx1ZSkge1xuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgaWYgKGxpc3QuX19vd25lcklEKSB7XG4gICAgbGlzdC5fcm9vdCA9IG5ld1Jvb3Q7XG4gICAgbGlzdC5fdGFpbCA9IG5ld1RhaWw7XG4gICAgbGlzdC5fX2hhc2ggPSB1bmRlZmluZWQ7XG4gICAgbGlzdC5fX2FsdGVyZWQgPSB0cnVlO1xuICAgIHJldHVybiBsaXN0O1xuICB9XG4gIHJldHVybiBtYWtlTGlzdChsaXN0Ll9vcmlnaW4sIGxpc3QuX2NhcGFjaXR5LCBsaXN0Ll9sZXZlbCwgbmV3Um9vdCwgbmV3VGFpbCk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVZOb2RlKG5vZGUsIG93bmVySUQsIGxldmVsLCBpbmRleCwgdmFsdWUsIGRpZEFsdGVyKSB7XG4gIHZhciBpZHggPSAoaW5kZXggPj4+IGxldmVsKSAmIE1BU0s7XG4gIHZhciBub2RlSGFzID0gbm9kZSAmJiBpZHggPCBub2RlLmFycmF5Lmxlbmd0aDtcbiAgaWYgKCFub2RlSGFzICYmIHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHZhciBuZXdOb2RlO1xuXG4gIGlmIChsZXZlbCA+IDApIHtcbiAgICB2YXIgbG93ZXJOb2RlID0gbm9kZSAmJiBub2RlLmFycmF5W2lkeF07XG4gICAgdmFyIG5ld0xvd2VyTm9kZSA9IHVwZGF0ZVZOb2RlKFxuICAgICAgbG93ZXJOb2RlLFxuICAgICAgb3duZXJJRCxcbiAgICAgIGxldmVsIC0gU0hJRlQsXG4gICAgICBpbmRleCxcbiAgICAgIHZhbHVlLFxuICAgICAgZGlkQWx0ZXJcbiAgICApO1xuICAgIGlmIChuZXdMb3dlck5vZGUgPT09IGxvd2VyTm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIG5ld05vZGUgPSBlZGl0YWJsZVZOb2RlKG5vZGUsIG93bmVySUQpO1xuICAgIG5ld05vZGUuYXJyYXlbaWR4XSA9IG5ld0xvd2VyTm9kZTtcbiAgICByZXR1cm4gbmV3Tm9kZTtcbiAgfVxuXG4gIGlmIChub2RlSGFzICYmIG5vZGUuYXJyYXlbaWR4XSA9PT0gdmFsdWUpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIGlmIChkaWRBbHRlcikge1xuICAgIFNldFJlZihkaWRBbHRlcik7XG4gIH1cblxuICBuZXdOb2RlID0gZWRpdGFibGVWTm9kZShub2RlLCBvd25lcklEKTtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgaWR4ID09PSBuZXdOb2RlLmFycmF5Lmxlbmd0aCAtIDEpIHtcbiAgICBuZXdOb2RlLmFycmF5LnBvcCgpO1xuICB9IGVsc2Uge1xuICAgIG5ld05vZGUuYXJyYXlbaWR4XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBuZXdOb2RlO1xufVxuXG5mdW5jdGlvbiBlZGl0YWJsZVZOb2RlKG5vZGUsIG93bmVySUQpIHtcbiAgaWYgKG93bmVySUQgJiYgbm9kZSAmJiBvd25lcklEID09PSBub2RlLm93bmVySUQpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuICByZXR1cm4gbmV3IFZOb2RlKG5vZGUgPyBub2RlLmFycmF5LnNsaWNlKCkgOiBbXSwgb3duZXJJRCk7XG59XG5cbmZ1bmN0aW9uIGxpc3ROb2RlRm9yKGxpc3QsIHJhd0luZGV4KSB7XG4gIGlmIChyYXdJbmRleCA+PSBnZXRUYWlsT2Zmc2V0KGxpc3QuX2NhcGFjaXR5KSkge1xuICAgIHJldHVybiBsaXN0Ll90YWlsO1xuICB9XG4gIGlmIChyYXdJbmRleCA8IDEgPDwgKGxpc3QuX2xldmVsICsgU0hJRlQpKSB7XG4gICAgdmFyIG5vZGUgPSBsaXN0Ll9yb290O1xuICAgIHZhciBsZXZlbCA9IGxpc3QuX2xldmVsO1xuICAgIHdoaWxlIChub2RlICYmIGxldmVsID4gMCkge1xuICAgICAgbm9kZSA9IG5vZGUuYXJyYXlbKHJhd0luZGV4ID4+PiBsZXZlbCkgJiBNQVNLXTtcbiAgICAgIGxldmVsIC09IFNISUZUO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRMaXN0Qm91bmRzKGxpc3QsIGJlZ2luLCBlbmQpIHtcbiAgLy8gU2FuaXRpemUgYmVnaW4gJiBlbmQgdXNpbmcgdGhpcyBzaG9ydGhhbmQgZm9yIFRvSW50MzIoYXJndW1lbnQpXG4gIC8vIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy10b2ludDMyXG4gIGlmIChiZWdpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYmVnaW4gfD0gMDtcbiAgfVxuICBpZiAoZW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgfD0gMDtcbiAgfVxuICB2YXIgb3duZXIgPSBsaXN0Ll9fb3duZXJJRCB8fCBuZXcgT3duZXJJRCgpO1xuICB2YXIgb2xkT3JpZ2luID0gbGlzdC5fb3JpZ2luO1xuICB2YXIgb2xkQ2FwYWNpdHkgPSBsaXN0Ll9jYXBhY2l0eTtcbiAgdmFyIG5ld09yaWdpbiA9IG9sZE9yaWdpbiArIGJlZ2luO1xuICB2YXIgbmV3Q2FwYWNpdHkgPVxuICAgIGVuZCA9PT0gdW5kZWZpbmVkXG4gICAgICA/IG9sZENhcGFjaXR5XG4gICAgICA6IGVuZCA8IDBcbiAgICAgICAgPyBvbGRDYXBhY2l0eSArIGVuZFxuICAgICAgICA6IG9sZE9yaWdpbiArIGVuZDtcbiAgaWYgKG5ld09yaWdpbiA9PT0gb2xkT3JpZ2luICYmIG5ld0NhcGFjaXR5ID09PSBvbGRDYXBhY2l0eSkge1xuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgLy8gSWYgaXQncyBnb2luZyB0byBlbmQgYWZ0ZXIgaXQgc3RhcnRzLCBpdCdzIGVtcHR5LlxuICBpZiAobmV3T3JpZ2luID49IG5ld0NhcGFjaXR5KSB7XG4gICAgcmV0dXJuIGxpc3QuY2xlYXIoKTtcbiAgfVxuXG4gIHZhciBuZXdMZXZlbCA9IGxpc3QuX2xldmVsO1xuICB2YXIgbmV3Um9vdCA9IGxpc3QuX3Jvb3Q7XG5cbiAgLy8gTmV3IG9yaWdpbiBtaWdodCBuZWVkIGNyZWF0aW5nIGEgaGlnaGVyIHJvb3QuXG4gIHZhciBvZmZzZXRTaGlmdCA9IDA7XG4gIHdoaWxlIChuZXdPcmlnaW4gKyBvZmZzZXRTaGlmdCA8IDApIHtcbiAgICBuZXdSb290ID0gbmV3IFZOb2RlKFxuICAgICAgbmV3Um9vdCAmJiBuZXdSb290LmFycmF5Lmxlbmd0aCA/IFt1bmRlZmluZWQsIG5ld1Jvb3RdIDogW10sXG4gICAgICBvd25lclxuICAgICk7XG4gICAgbmV3TGV2ZWwgKz0gU0hJRlQ7XG4gICAgb2Zmc2V0U2hpZnQgKz0gMSA8PCBuZXdMZXZlbDtcbiAgfVxuICBpZiAob2Zmc2V0U2hpZnQpIHtcbiAgICBuZXdPcmlnaW4gKz0gb2Zmc2V0U2hpZnQ7XG4gICAgb2xkT3JpZ2luICs9IG9mZnNldFNoaWZ0O1xuICAgIG5ld0NhcGFjaXR5ICs9IG9mZnNldFNoaWZ0O1xuICAgIG9sZENhcGFjaXR5ICs9IG9mZnNldFNoaWZ0O1xuICB9XG5cbiAgdmFyIG9sZFRhaWxPZmZzZXQgPSBnZXRUYWlsT2Zmc2V0KG9sZENhcGFjaXR5KTtcbiAgdmFyIG5ld1RhaWxPZmZzZXQgPSBnZXRUYWlsT2Zmc2V0KG5ld0NhcGFjaXR5KTtcblxuICAvLyBOZXcgc2l6ZSBtaWdodCBuZWVkIGNyZWF0aW5nIGEgaGlnaGVyIHJvb3QuXG4gIHdoaWxlIChuZXdUYWlsT2Zmc2V0ID49IDEgPDwgKG5ld0xldmVsICsgU0hJRlQpKSB7XG4gICAgbmV3Um9vdCA9IG5ldyBWTm9kZShcbiAgICAgIG5ld1Jvb3QgJiYgbmV3Um9vdC5hcnJheS5sZW5ndGggPyBbbmV3Um9vdF0gOiBbXSxcbiAgICAgIG93bmVyXG4gICAgKTtcbiAgICBuZXdMZXZlbCArPSBTSElGVDtcbiAgfVxuXG4gIC8vIExvY2F0ZSBvciBjcmVhdGUgdGhlIG5ldyB0YWlsLlxuICB2YXIgb2xkVGFpbCA9IGxpc3QuX3RhaWw7XG4gIHZhciBuZXdUYWlsID1cbiAgICBuZXdUYWlsT2Zmc2V0IDwgb2xkVGFpbE9mZnNldFxuICAgICAgPyBsaXN0Tm9kZUZvcihsaXN0LCBuZXdDYXBhY2l0eSAtIDEpXG4gICAgICA6IG5ld1RhaWxPZmZzZXQgPiBvbGRUYWlsT2Zmc2V0XG4gICAgICAgID8gbmV3IFZOb2RlKFtdLCBvd25lcilcbiAgICAgICAgOiBvbGRUYWlsO1xuXG4gIC8vIE1lcmdlIFRhaWwgaW50byB0cmVlLlxuICBpZiAoXG4gICAgb2xkVGFpbCAmJlxuICAgIG5ld1RhaWxPZmZzZXQgPiBvbGRUYWlsT2Zmc2V0ICYmXG4gICAgbmV3T3JpZ2luIDwgb2xkQ2FwYWNpdHkgJiZcbiAgICBvbGRUYWlsLmFycmF5Lmxlbmd0aFxuICApIHtcbiAgICBuZXdSb290ID0gZWRpdGFibGVWTm9kZShuZXdSb290LCBvd25lcik7XG4gICAgdmFyIG5vZGUgPSBuZXdSb290O1xuICAgIGZvciAodmFyIGxldmVsID0gbmV3TGV2ZWw7IGxldmVsID4gU0hJRlQ7IGxldmVsIC09IFNISUZUKSB7XG4gICAgICB2YXIgaWR4ID0gKG9sZFRhaWxPZmZzZXQgPj4+IGxldmVsKSAmIE1BU0s7XG4gICAgICBub2RlID0gbm9kZS5hcnJheVtpZHhdID0gZWRpdGFibGVWTm9kZShub2RlLmFycmF5W2lkeF0sIG93bmVyKTtcbiAgICB9XG4gICAgbm9kZS5hcnJheVsob2xkVGFpbE9mZnNldCA+Pj4gU0hJRlQpICYgTUFTS10gPSBvbGRUYWlsO1xuICB9XG5cbiAgLy8gSWYgdGhlIHNpemUgaGFzIGJlZW4gcmVkdWNlZCwgdGhlcmUncyBhIGNoYW5jZSB0aGUgdGFpbCBuZWVkcyB0byBiZSB0cmltbWVkLlxuICBpZiAobmV3Q2FwYWNpdHkgPCBvbGRDYXBhY2l0eSkge1xuICAgIG5ld1RhaWwgPSBuZXdUYWlsICYmIG5ld1RhaWwucmVtb3ZlQWZ0ZXIob3duZXIsIDAsIG5ld0NhcGFjaXR5KTtcbiAgfVxuXG4gIC8vIElmIHRoZSBuZXcgb3JpZ2luIGlzIHdpdGhpbiB0aGUgdGFpbCwgdGhlbiB3ZSBkbyBub3QgbmVlZCBhIHJvb3QuXG4gIGlmIChuZXdPcmlnaW4gPj0gbmV3VGFpbE9mZnNldCkge1xuICAgIG5ld09yaWdpbiAtPSBuZXdUYWlsT2Zmc2V0O1xuICAgIG5ld0NhcGFjaXR5IC09IG5ld1RhaWxPZmZzZXQ7XG4gICAgbmV3TGV2ZWwgPSBTSElGVDtcbiAgICBuZXdSb290ID0gbnVsbDtcbiAgICBuZXdUYWlsID0gbmV3VGFpbCAmJiBuZXdUYWlsLnJlbW92ZUJlZm9yZShvd25lciwgMCwgbmV3T3JpZ2luKTtcblxuICAgIC8vIE90aGVyd2lzZSwgaWYgdGhlIHJvb3QgaGFzIGJlZW4gdHJpbW1lZCwgZ2FyYmFnZSBjb2xsZWN0LlxuICB9IGVsc2UgaWYgKG5ld09yaWdpbiA+IG9sZE9yaWdpbiB8fCBuZXdUYWlsT2Zmc2V0IDwgb2xkVGFpbE9mZnNldCkge1xuICAgIG9mZnNldFNoaWZ0ID0gMDtcblxuICAgIC8vIElkZW50aWZ5IHRoZSBuZXcgdG9wIHJvb3Qgbm9kZSBvZiB0aGUgc3VidHJlZSBvZiB0aGUgb2xkIHJvb3QuXG4gICAgd2hpbGUgKG5ld1Jvb3QpIHtcbiAgICAgIHZhciBiZWdpbkluZGV4ID0gKG5ld09yaWdpbiA+Pj4gbmV3TGV2ZWwpICYgTUFTSztcbiAgICAgIGlmICgoYmVnaW5JbmRleCAhPT0gbmV3VGFpbE9mZnNldCA+Pj4gbmV3TGV2ZWwpICYgTUFTSykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChiZWdpbkluZGV4KSB7XG4gICAgICAgIG9mZnNldFNoaWZ0ICs9ICgxIDw8IG5ld0xldmVsKSAqIGJlZ2luSW5kZXg7XG4gICAgICB9XG4gICAgICBuZXdMZXZlbCAtPSBTSElGVDtcbiAgICAgIG5ld1Jvb3QgPSBuZXdSb290LmFycmF5W2JlZ2luSW5kZXhdO1xuICAgIH1cblxuICAgIC8vIFRyaW0gdGhlIG5ldyBzaWRlcyBvZiB0aGUgbmV3IHJvb3QuXG4gICAgaWYgKG5ld1Jvb3QgJiYgbmV3T3JpZ2luID4gb2xkT3JpZ2luKSB7XG4gICAgICBuZXdSb290ID0gbmV3Um9vdC5yZW1vdmVCZWZvcmUob3duZXIsIG5ld0xldmVsLCBuZXdPcmlnaW4gLSBvZmZzZXRTaGlmdCk7XG4gICAgfVxuICAgIGlmIChuZXdSb290ICYmIG5ld1RhaWxPZmZzZXQgPCBvbGRUYWlsT2Zmc2V0KSB7XG4gICAgICBuZXdSb290ID0gbmV3Um9vdC5yZW1vdmVBZnRlcihcbiAgICAgICAgb3duZXIsXG4gICAgICAgIG5ld0xldmVsLFxuICAgICAgICBuZXdUYWlsT2Zmc2V0IC0gb2Zmc2V0U2hpZnRcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChvZmZzZXRTaGlmdCkge1xuICAgICAgbmV3T3JpZ2luIC09IG9mZnNldFNoaWZ0O1xuICAgICAgbmV3Q2FwYWNpdHkgLT0gb2Zmc2V0U2hpZnQ7XG4gICAgfVxuICB9XG5cbiAgaWYgKGxpc3QuX19vd25lcklEKSB7XG4gICAgbGlzdC5zaXplID0gbmV3Q2FwYWNpdHkgLSBuZXdPcmlnaW47XG4gICAgbGlzdC5fb3JpZ2luID0gbmV3T3JpZ2luO1xuICAgIGxpc3QuX2NhcGFjaXR5ID0gbmV3Q2FwYWNpdHk7XG4gICAgbGlzdC5fbGV2ZWwgPSBuZXdMZXZlbDtcbiAgICBsaXN0Ll9yb290ID0gbmV3Um9vdDtcbiAgICBsaXN0Ll90YWlsID0gbmV3VGFpbDtcbiAgICBsaXN0Ll9faGFzaCA9IHVuZGVmaW5lZDtcbiAgICBsaXN0Ll9fYWx0ZXJlZCA9IHRydWU7XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cbiAgcmV0dXJuIG1ha2VMaXN0KG5ld09yaWdpbiwgbmV3Q2FwYWNpdHksIG5ld0xldmVsLCBuZXdSb290LCBuZXdUYWlsKTtcbn1cblxuZnVuY3Rpb24gZ2V0VGFpbE9mZnNldChzaXplKSB7XG4gIHJldHVybiBzaXplIDwgU0laRSA/IDAgOiAoKHNpemUgLSAxKSA+Pj4gU0hJRlQpIDw8IFNISUZUO1xufVxuXG52YXIgT3JkZXJlZE1hcCA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKE1hcCQkMSkge1xuICBmdW5jdGlvbiBPcmRlcmVkTWFwKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgID8gZW1wdHlPcmRlcmVkTWFwKClcbiAgICAgIDogaXNPcmRlcmVkTWFwKHZhbHVlKVxuICAgICAgICA/IHZhbHVlXG4gICAgICAgIDogZW1wdHlPcmRlcmVkTWFwKCkud2l0aE11dGF0aW9ucyhmdW5jdGlvbiAobWFwKSB7XG4gICAgICAgICAgICB2YXIgaXRlciA9IEtleWVkQ29sbGVjdGlvbih2YWx1ZSk7XG4gICAgICAgICAgICBhc3NlcnROb3RJbmZpbml0ZShpdGVyLnNpemUpO1xuICAgICAgICAgICAgaXRlci5mb3JFYWNoKGZ1bmN0aW9uICh2LCBrKSB7IHJldHVybiBtYXAuc2V0KGssIHYpOyB9KTtcbiAgICAgICAgICB9KTtcbiAgfVxuXG4gIGlmICggTWFwJCQxICkgT3JkZXJlZE1hcC5fX3Byb3RvX18gPSBNYXAkJDE7XG4gIE9yZGVyZWRNYXAucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWFwJCQxICYmIE1hcCQkMS5wcm90b3R5cGUgKTtcbiAgT3JkZXJlZE1hcC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBPcmRlcmVkTWFwO1xuXG4gIE9yZGVyZWRNYXAub2YgPSBmdW5jdGlvbiBvZiAoLyouLi52YWx1ZXMqLykge1xuICAgIHJldHVybiB0aGlzKGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgT3JkZXJlZE1hcC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX190b1N0cmluZygnT3JkZXJlZE1hcCB7JywgJ30nKTtcbiAgfTtcblxuICAvLyBAcHJhZ21hIEFjY2Vzc1xuXG4gIE9yZGVyZWRNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCAoaywgbm90U2V0VmFsdWUpIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLl9tYXAuZ2V0KGspO1xuICAgIHJldHVybiBpbmRleCAhPT0gdW5kZWZpbmVkID8gdGhpcy5fbGlzdC5nZXQoaW5kZXgpWzFdIDogbm90U2V0VmFsdWU7XG4gIH07XG5cbiAgLy8gQHByYWdtYSBNb2RpZmljYXRpb25cblxuICBPcmRlcmVkTWFwLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyICgpIHtcbiAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX19vd25lcklEKSB7XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgICAgdGhpcy5fbWFwLmNsZWFyKCk7XG4gICAgICB0aGlzLl9saXN0LmNsZWFyKCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIGVtcHR5T3JkZXJlZE1hcCgpO1xuICB9O1xuXG4gIE9yZGVyZWRNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIHNldCAoaywgdikge1xuICAgIHJldHVybiB1cGRhdGVPcmRlcmVkTWFwKHRoaXMsIGssIHYpO1xuICB9O1xuXG4gIE9yZGVyZWRNYXAucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIHJlbW92ZSAoaykge1xuICAgIHJldHVybiB1cGRhdGVPcmRlcmVkTWFwKHRoaXMsIGssIE5PVF9TRVQpO1xuICB9O1xuXG4gIE9yZGVyZWRNYXAucHJvdG90eXBlLndhc0FsdGVyZWQgPSBmdW5jdGlvbiB3YXNBbHRlcmVkICgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWFwLndhc0FsdGVyZWQoKSB8fCB0aGlzLl9saXN0Lndhc0FsdGVyZWQoKTtcbiAgfTtcblxuICBPcmRlcmVkTWFwLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbiBfX2l0ZXJhdGUgKGZuLCByZXZlcnNlKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICByZXR1cm4gdGhpcy5fbGlzdC5fX2l0ZXJhdGUoXG4gICAgICBmdW5jdGlvbiAoZW50cnkpIHsgcmV0dXJuIGVudHJ5ICYmIGZuKGVudHJ5WzFdLCBlbnRyeVswXSwgdGhpcyQxKTsgfSxcbiAgICAgIHJldmVyc2VcbiAgICApO1xuICB9O1xuXG4gIE9yZGVyZWRNYXAucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbiBfX2l0ZXJhdG9yICh0eXBlLCByZXZlcnNlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3QuZnJvbUVudHJ5U2VxKCkuX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbiAgfTtcblxuICBPcmRlcmVkTWFwLnByb3RvdHlwZS5fX2Vuc3VyZU93bmVyID0gZnVuY3Rpb24gX19lbnN1cmVPd25lciAob3duZXJJRCkge1xuICAgIGlmIChvd25lcklEID09PSB0aGlzLl9fb3duZXJJRCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHZhciBuZXdNYXAgPSB0aGlzLl9tYXAuX19lbnN1cmVPd25lcihvd25lcklEKTtcbiAgICB2YXIgbmV3TGlzdCA9IHRoaXMuX2xpc3QuX19lbnN1cmVPd25lcihvd25lcklEKTtcbiAgICBpZiAoIW93bmVySUQpIHtcbiAgICAgIGlmICh0aGlzLnNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGVtcHR5T3JkZXJlZE1hcCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fX293bmVySUQgPSBvd25lcklEO1xuICAgICAgdGhpcy5fbWFwID0gbmV3TWFwO1xuICAgICAgdGhpcy5fbGlzdCA9IG5ld0xpc3Q7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIG1ha2VPcmRlcmVkTWFwKG5ld01hcCwgbmV3TGlzdCwgb3duZXJJRCwgdGhpcy5fX2hhc2gpO1xuICB9O1xuXG4gIHJldHVybiBPcmRlcmVkTWFwO1xufShNYXApKTtcblxuT3JkZXJlZE1hcC5pc09yZGVyZWRNYXAgPSBpc09yZGVyZWRNYXA7XG5cbk9yZGVyZWRNYXAucHJvdG90eXBlW0lTX09SREVSRURfU1lNQk9MXSA9IHRydWU7XG5PcmRlcmVkTWFwLnByb3RvdHlwZVtERUxFVEVdID0gT3JkZXJlZE1hcC5wcm90b3R5cGUucmVtb3ZlO1xuXG5mdW5jdGlvbiBtYWtlT3JkZXJlZE1hcChtYXAsIGxpc3QsIG93bmVySUQsIGhhc2gpIHtcbiAgdmFyIG9tYXAgPSBPYmplY3QuY3JlYXRlKE9yZGVyZWRNYXAucHJvdG90eXBlKTtcbiAgb21hcC5zaXplID0gbWFwID8gbWFwLnNpemUgOiAwO1xuICBvbWFwLl9tYXAgPSBtYXA7XG4gIG9tYXAuX2xpc3QgPSBsaXN0O1xuICBvbWFwLl9fb3duZXJJRCA9IG93bmVySUQ7XG4gIG9tYXAuX19oYXNoID0gaGFzaDtcbiAgcmV0dXJuIG9tYXA7XG59XG5cbnZhciBFTVBUWV9PUkRFUkVEX01BUDtcbmZ1bmN0aW9uIGVtcHR5T3JkZXJlZE1hcCgpIHtcbiAgcmV0dXJuIChcbiAgICBFTVBUWV9PUkRFUkVEX01BUCB8fFxuICAgIChFTVBUWV9PUkRFUkVEX01BUCA9IG1ha2VPcmRlcmVkTWFwKGVtcHR5TWFwKCksIGVtcHR5TGlzdCgpKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlT3JkZXJlZE1hcChvbWFwLCBrLCB2KSB7XG4gIHZhciBtYXAgPSBvbWFwLl9tYXA7XG4gIHZhciBsaXN0ID0gb21hcC5fbGlzdDtcbiAgdmFyIGkgPSBtYXAuZ2V0KGspO1xuICB2YXIgaGFzID0gaSAhPT0gdW5kZWZpbmVkO1xuICB2YXIgbmV3TWFwO1xuICB2YXIgbmV3TGlzdDtcbiAgaWYgKHYgPT09IE5PVF9TRVQpIHtcbiAgICAvLyByZW1vdmVkXG4gICAgaWYgKCFoYXMpIHtcbiAgICAgIHJldHVybiBvbWFwO1xuICAgIH1cbiAgICBpZiAobGlzdC5zaXplID49IFNJWkUgJiYgbGlzdC5zaXplID49IG1hcC5zaXplICogMikge1xuICAgICAgbmV3TGlzdCA9IGxpc3QuZmlsdGVyKGZ1bmN0aW9uIChlbnRyeSwgaWR4KSB7IHJldHVybiBlbnRyeSAhPT0gdW5kZWZpbmVkICYmIGkgIT09IGlkeDsgfSk7XG4gICAgICBuZXdNYXAgPSBuZXdMaXN0XG4gICAgICAgIC50b0tleWVkU2VxKClcbiAgICAgICAgLm1hcChmdW5jdGlvbiAoZW50cnkpIHsgcmV0dXJuIGVudHJ5WzBdOyB9KVxuICAgICAgICAuZmxpcCgpXG4gICAgICAgIC50b01hcCgpO1xuICAgICAgaWYgKG9tYXAuX19vd25lcklEKSB7XG4gICAgICAgIG5ld01hcC5fX293bmVySUQgPSBuZXdMaXN0Ll9fb3duZXJJRCA9IG9tYXAuX19vd25lcklEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdNYXAgPSBtYXAucmVtb3ZlKGspO1xuICAgICAgbmV3TGlzdCA9IGkgPT09IGxpc3Quc2l6ZSAtIDEgPyBsaXN0LnBvcCgpIDogbGlzdC5zZXQoaSwgdW5kZWZpbmVkKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaGFzKSB7XG4gICAgaWYgKHYgPT09IGxpc3QuZ2V0KGkpWzFdKSB7XG4gICAgICByZXR1cm4gb21hcDtcbiAgICB9XG4gICAgbmV3TWFwID0gbWFwO1xuICAgIG5ld0xpc3QgPSBsaXN0LnNldChpLCBbaywgdl0pO1xuICB9IGVsc2Uge1xuICAgIG5ld01hcCA9IG1hcC5zZXQoaywgbGlzdC5zaXplKTtcbiAgICBuZXdMaXN0ID0gbGlzdC5zZXQobGlzdC5zaXplLCBbaywgdl0pO1xuICB9XG4gIGlmIChvbWFwLl9fb3duZXJJRCkge1xuICAgIG9tYXAuc2l6ZSA9IG5ld01hcC5zaXplO1xuICAgIG9tYXAuX21hcCA9IG5ld01hcDtcbiAgICBvbWFwLl9saXN0ID0gbmV3TGlzdDtcbiAgICBvbWFwLl9faGFzaCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gb21hcDtcbiAgfVxuICByZXR1cm4gbWFrZU9yZGVyZWRNYXAobmV3TWFwLCBuZXdMaXN0KTtcbn1cblxudmFyIElTX1NUQUNLX1NZTUJPTCA9ICdAQF9fSU1NVVRBQkxFX1NUQUNLX19AQCc7XG5cbmZ1bmN0aW9uIGlzU3RhY2sobWF5YmVTdGFjaykge1xuICByZXR1cm4gQm9vbGVhbihtYXliZVN0YWNrICYmIG1heWJlU3RhY2tbSVNfU1RBQ0tfU1lNQk9MXSk7XG59XG5cbnZhciBTdGFjayA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEluZGV4ZWRDb2xsZWN0aW9uJCQxKSB7XG4gIGZ1bmN0aW9uIFN0YWNrKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgID8gZW1wdHlTdGFjaygpXG4gICAgICA6IGlzU3RhY2sodmFsdWUpXG4gICAgICAgID8gdmFsdWVcbiAgICAgICAgOiBlbXB0eVN0YWNrKCkucHVzaEFsbCh2YWx1ZSk7XG4gIH1cblxuICBpZiAoIEluZGV4ZWRDb2xsZWN0aW9uJCQxICkgU3RhY2suX19wcm90b19fID0gSW5kZXhlZENvbGxlY3Rpb24kJDE7XG4gIFN0YWNrLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEluZGV4ZWRDb2xsZWN0aW9uJCQxICYmIEluZGV4ZWRDb2xsZWN0aW9uJCQxLnByb3RvdHlwZSApO1xuICBTdGFjay5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTdGFjaztcblxuICBTdGFjay5vZiA9IGZ1bmN0aW9uIG9mICgvKi4uLnZhbHVlcyovKSB7XG4gICAgcmV0dXJuIHRoaXMoYXJndW1lbnRzKTtcbiAgfTtcblxuICBTdGFjay5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX190b1N0cmluZygnU3RhY2sgWycsICddJyk7XG4gIH07XG5cbiAgLy8gQHByYWdtYSBBY2Nlc3NcblxuICBTdGFjay5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChpbmRleCwgbm90U2V0VmFsdWUpIHtcbiAgICB2YXIgaGVhZCA9IHRoaXMuX2hlYWQ7XG4gICAgaW5kZXggPSB3cmFwSW5kZXgodGhpcywgaW5kZXgpO1xuICAgIHdoaWxlIChoZWFkICYmIGluZGV4LS0pIHtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgfVxuICAgIHJldHVybiBoZWFkID8gaGVhZC52YWx1ZSA6IG5vdFNldFZhbHVlO1xuICB9O1xuXG4gIFN0YWNrLnByb3RvdHlwZS5wZWVrID0gZnVuY3Rpb24gcGVlayAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWQgJiYgdGhpcy5faGVhZC52YWx1ZTtcbiAgfTtcblxuICAvLyBAcHJhZ21hIE1vZGlmaWNhdGlvblxuXG4gIFN0YWNrLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gcHVzaCAoLyouLi52YWx1ZXMqLykge1xuICAgIHZhciBhcmd1bWVudHMkMSA9IGFyZ3VtZW50cztcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdmFyIG5ld1NpemUgPSB0aGlzLnNpemUgKyBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBoZWFkID0gdGhpcy5faGVhZDtcbiAgICBmb3IgKHZhciBpaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpaSA+PSAwOyBpaS0tKSB7XG4gICAgICBoZWFkID0ge1xuICAgICAgICB2YWx1ZTogYXJndW1lbnRzJDFbaWldLFxuICAgICAgICBuZXh0OiBoZWFkLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX19vd25lcklEKSB7XG4gICAgICB0aGlzLnNpemUgPSBuZXdTaXplO1xuICAgICAgdGhpcy5faGVhZCA9IGhlYWQ7XG4gICAgICB0aGlzLl9faGFzaCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX19hbHRlcmVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gbWFrZVN0YWNrKG5ld1NpemUsIGhlYWQpO1xuICB9O1xuXG4gIFN0YWNrLnByb3RvdHlwZS5wdXNoQWxsID0gZnVuY3Rpb24gcHVzaEFsbCAoaXRlcikge1xuICAgIGl0ZXIgPSBJbmRleGVkQ29sbGVjdGlvbiQkMShpdGVyKTtcbiAgICBpZiAoaXRlci5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCAmJiBpc1N0YWNrKGl0ZXIpKSB7XG4gICAgICByZXR1cm4gaXRlcjtcbiAgICB9XG4gICAgYXNzZXJ0Tm90SW5maW5pdGUoaXRlci5zaXplKTtcbiAgICB2YXIgbmV3U2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICB2YXIgaGVhZCA9IHRoaXMuX2hlYWQ7XG4gICAgaXRlci5fX2l0ZXJhdGUoZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBuZXdTaXplKys7XG4gICAgICBoZWFkID0ge1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIG5leHQ6IGhlYWQsXG4gICAgICB9O1xuICAgIH0sIC8qIHJldmVyc2UgKi8gdHJ1ZSk7XG4gICAgaWYgKHRoaXMuX19vd25lcklEKSB7XG4gICAgICB0aGlzLnNpemUgPSBuZXdTaXplO1xuICAgICAgdGhpcy5faGVhZCA9IGhlYWQ7XG4gICAgICB0aGlzLl9faGFzaCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX19hbHRlcmVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gbWFrZVN0YWNrKG5ld1NpemUsIGhlYWQpO1xuICB9O1xuXG4gIFN0YWNrLnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbiBwb3AgKCkge1xuICAgIHJldHVybiB0aGlzLnNsaWNlKDEpO1xuICB9O1xuXG4gIFN0YWNrLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyICgpIHtcbiAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX19vd25lcklEKSB7XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgICAgdGhpcy5faGVhZCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX19oYXNoID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fX2FsdGVyZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBlbXB0eVN0YWNrKCk7XG4gIH07XG5cbiAgU3RhY2sucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKGJlZ2luLCBlbmQpIHtcbiAgICBpZiAod2hvbGVTbGljZShiZWdpbiwgZW5kLCB0aGlzLnNpemUpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdmFyIHJlc29sdmVkQmVnaW4gPSByZXNvbHZlQmVnaW4oYmVnaW4sIHRoaXMuc2l6ZSk7XG4gICAgdmFyIHJlc29sdmVkRW5kID0gcmVzb2x2ZUVuZChlbmQsIHRoaXMuc2l6ZSk7XG4gICAgaWYgKHJlc29sdmVkRW5kICE9PSB0aGlzLnNpemUpIHtcbiAgICAgIC8vIHN1cGVyLnNsaWNlKGJlZ2luLCBlbmQpO1xuICAgICAgcmV0dXJuIEluZGV4ZWRDb2xsZWN0aW9uJCQxLnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMsIGJlZ2luLCBlbmQpO1xuICAgIH1cbiAgICB2YXIgbmV3U2l6ZSA9IHRoaXMuc2l6ZSAtIHJlc29sdmVkQmVnaW47XG4gICAgdmFyIGhlYWQgPSB0aGlzLl9oZWFkO1xuICAgIHdoaWxlIChyZXNvbHZlZEJlZ2luLS0pIHtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9fb3duZXJJRCkge1xuICAgICAgdGhpcy5zaXplID0gbmV3U2l6ZTtcbiAgICAgIHRoaXMuX2hlYWQgPSBoZWFkO1xuICAgICAgdGhpcy5fX2hhc2ggPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9fYWx0ZXJlZCA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIG1ha2VTdGFjayhuZXdTaXplLCBoZWFkKTtcbiAgfTtcblxuICAvLyBAcHJhZ21hIE11dGFiaWxpdHlcblxuICBTdGFjay5wcm90b3R5cGUuX19lbnN1cmVPd25lciA9IGZ1bmN0aW9uIF9fZW5zdXJlT3duZXIgKG93bmVySUQpIHtcbiAgICBpZiAob3duZXJJRCA9PT0gdGhpcy5fX293bmVySUQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAoIW93bmVySUQpIHtcbiAgICAgIGlmICh0aGlzLnNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGVtcHR5U3RhY2soKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX19vd25lcklEID0gb3duZXJJRDtcbiAgICAgIHRoaXMuX19hbHRlcmVkID0gZmFsc2U7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIG1ha2VTdGFjayh0aGlzLnNpemUsIHRoaXMuX2hlYWQsIG93bmVySUQsIHRoaXMuX19oYXNoKTtcbiAgfTtcblxuICAvLyBAcHJhZ21hIEl0ZXJhdGlvblxuXG4gIFN0YWNrLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbiBfX2l0ZXJhdGUgKGZuLCByZXZlcnNlKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgcmV0dXJuIG5ldyBBcnJheVNlcSh0aGlzLnRvQXJyYXkoKSkuX19pdGVyYXRlKFxuICAgICAgICBmdW5jdGlvbiAodiwgaykgeyByZXR1cm4gZm4odiwgaywgdGhpcyQxKTsgfSxcbiAgICAgICAgcmV2ZXJzZVxuICAgICAgKTtcbiAgICB9XG4gICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgIHZhciBub2RlID0gdGhpcy5faGVhZDtcbiAgICB3aGlsZSAobm9kZSkge1xuICAgICAgaWYgKGZuKG5vZGUudmFsdWUsIGl0ZXJhdGlvbnMrKywgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZXJhdGlvbnM7XG4gIH07XG5cbiAgU3RhY2sucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbiBfX2l0ZXJhdG9yICh0eXBlLCByZXZlcnNlKSB7XG4gICAgaWYgKHJldmVyc2UpIHtcbiAgICAgIHJldHVybiBuZXcgQXJyYXlTZXEodGhpcy50b0FycmF5KCkpLl9faXRlcmF0b3IodHlwZSwgcmV2ZXJzZSk7XG4gICAgfVxuICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICB2YXIgbm9kZSA9IHRoaXMuX2hlYWQ7XG4gICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAobm9kZSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBub2RlLnZhbHVlO1xuICAgICAgICBub2RlID0gbm9kZS5uZXh0O1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZSh0eXBlLCBpdGVyYXRpb25zKyssIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVyYXRvckRvbmUoKTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gU3RhY2s7XG59KEluZGV4ZWRDb2xsZWN0aW9uKSk7XG5cblN0YWNrLmlzU3RhY2sgPSBpc1N0YWNrO1xuXG52YXIgU3RhY2tQcm90b3R5cGUgPSBTdGFjay5wcm90b3R5cGU7XG5TdGFja1Byb3RvdHlwZVtJU19TVEFDS19TWU1CT0xdID0gdHJ1ZTtcblN0YWNrUHJvdG90eXBlLnNoaWZ0ID0gU3RhY2tQcm90b3R5cGUucG9wO1xuU3RhY2tQcm90b3R5cGUudW5zaGlmdCA9IFN0YWNrUHJvdG90eXBlLnB1c2g7XG5TdGFja1Byb3RvdHlwZS51bnNoaWZ0QWxsID0gU3RhY2tQcm90b3R5cGUucHVzaEFsbDtcblN0YWNrUHJvdG90eXBlLndpdGhNdXRhdGlvbnMgPSB3aXRoTXV0YXRpb25zO1xuU3RhY2tQcm90b3R5cGUud2FzQWx0ZXJlZCA9IHdhc0FsdGVyZWQ7XG5TdGFja1Byb3RvdHlwZS5hc0ltbXV0YWJsZSA9IGFzSW1tdXRhYmxlO1xuU3RhY2tQcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBTdGFja1Byb3RvdHlwZS5hc011dGFibGUgPSBhc011dGFibGU7XG5TdGFja1Byb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uKHJlc3VsdCwgYXJyKSB7XG4gIHJldHVybiByZXN1bHQudW5zaGlmdChhcnIpO1xufTtcblN0YWNrUHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbihvYmopIHtcbiAgcmV0dXJuIG9iai5hc0ltbXV0YWJsZSgpO1xufTtcblxuZnVuY3Rpb24gbWFrZVN0YWNrKHNpemUsIGhlYWQsIG93bmVySUQsIGhhc2gpIHtcbiAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUoU3RhY2tQcm90b3R5cGUpO1xuICBtYXAuc2l6ZSA9IHNpemU7XG4gIG1hcC5faGVhZCA9IGhlYWQ7XG4gIG1hcC5fX293bmVySUQgPSBvd25lcklEO1xuICBtYXAuX19oYXNoID0gaGFzaDtcbiAgbWFwLl9fYWx0ZXJlZCA9IGZhbHNlO1xuICByZXR1cm4gbWFwO1xufVxuXG52YXIgRU1QVFlfU1RBQ0s7XG5mdW5jdGlvbiBlbXB0eVN0YWNrKCkge1xuICByZXR1cm4gRU1QVFlfU1RBQ0sgfHwgKEVNUFRZX1NUQUNLID0gbWFrZVN0YWNrKDApKTtcbn1cblxudmFyIElTX1NFVF9TWU1CT0wgPSAnQEBfX0lNTVVUQUJMRV9TRVRfX0BAJztcblxuZnVuY3Rpb24gaXNTZXQobWF5YmVTZXQpIHtcbiAgcmV0dXJuIEJvb2xlYW4obWF5YmVTZXQgJiYgbWF5YmVTZXRbSVNfU0VUX1NZTUJPTF0pO1xufVxuXG5mdW5jdGlvbiBpc09yZGVyZWRTZXQobWF5YmVPcmRlcmVkU2V0KSB7XG4gIHJldHVybiBpc1NldChtYXliZU9yZGVyZWRTZXQpICYmIGlzT3JkZXJlZChtYXliZU9yZGVyZWRTZXQpO1xufVxuXG5mdW5jdGlvbiBkZWVwRXF1YWwoYSwgYikge1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKFxuICAgICFpc0NvbGxlY3Rpb24oYikgfHxcbiAgICAoYS5zaXplICE9PSB1bmRlZmluZWQgJiYgYi5zaXplICE9PSB1bmRlZmluZWQgJiYgYS5zaXplICE9PSBiLnNpemUpIHx8XG4gICAgKGEuX19oYXNoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGIuX19oYXNoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGEuX19oYXNoICE9PSBiLl9faGFzaCkgfHxcbiAgICBpc0tleWVkKGEpICE9PSBpc0tleWVkKGIpIHx8XG4gICAgaXNJbmRleGVkKGEpICE9PSBpc0luZGV4ZWQoYikgfHxcbiAgICBpc09yZGVyZWQoYSkgIT09IGlzT3JkZXJlZChiKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoYS5zaXplID09PSAwICYmIGIuc2l6ZSA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIG5vdEFzc29jaWF0aXZlID0gIWlzQXNzb2NpYXRpdmUoYSk7XG5cbiAgaWYgKGlzT3JkZXJlZChhKSkge1xuICAgIHZhciBlbnRyaWVzID0gYS5lbnRyaWVzKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIGIuZXZlcnkoZnVuY3Rpb24gKHYsIGspIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllcy5uZXh0KCkudmFsdWU7XG4gICAgICAgIHJldHVybiBlbnRyeSAmJiBpcyhlbnRyeVsxXSwgdikgJiYgKG5vdEFzc29jaWF0aXZlIHx8IGlzKGVudHJ5WzBdLCBrKSk7XG4gICAgICB9KSAmJiBlbnRyaWVzLm5leHQoKS5kb25lXG4gICAgKTtcbiAgfVxuXG4gIHZhciBmbGlwcGVkID0gZmFsc2U7XG5cbiAgaWYgKGEuc2l6ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGIuc2l6ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIGEuY2FjaGVSZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgYS5jYWNoZVJlc3VsdCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmbGlwcGVkID0gdHJ1ZTtcbiAgICAgIHZhciBfID0gYTtcbiAgICAgIGEgPSBiO1xuICAgICAgYiA9IF87XG4gICAgfVxuICB9XG5cbiAgdmFyIGFsbEVxdWFsID0gdHJ1ZTtcbiAgdmFyIGJTaXplID0gYi5fX2l0ZXJhdGUoZnVuY3Rpb24gKHYsIGspIHtcbiAgICBpZiAoXG4gICAgICBub3RBc3NvY2lhdGl2ZVxuICAgICAgICA/ICFhLmhhcyh2KVxuICAgICAgICA6IGZsaXBwZWRcbiAgICAgICAgICA/ICFpcyh2LCBhLmdldChrLCBOT1RfU0VUKSlcbiAgICAgICAgICA6ICFpcyhhLmdldChrLCBOT1RfU0VUKSwgdilcbiAgICApIHtcbiAgICAgIGFsbEVxdWFsID0gZmFsc2U7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gYWxsRXF1YWwgJiYgYS5zaXplID09PSBiU2l6ZTtcbn1cblxuLyoqXG4gKiBDb250cmlidXRlcyBhZGRpdGlvbmFsIG1ldGhvZHMgdG8gYSBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBtaXhpbihjdG9yLCBtZXRob2RzKSB7XG4gIHZhciBrZXlDb3BpZXIgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgY3Rvci5wcm90b3R5cGVba2V5XSA9IG1ldGhvZHNba2V5XTtcbiAgfTtcbiAgT2JqZWN0LmtleXMobWV0aG9kcykuZm9yRWFjaChrZXlDb3BpZXIpO1xuICBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICYmXG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhtZXRob2RzKS5mb3JFYWNoKGtleUNvcGllcik7XG4gIHJldHVybiBjdG9yO1xufVxuXG5mdW5jdGlvbiB0b0pTKHZhbHVlKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoIWlzQ29sbGVjdGlvbih2YWx1ZSkpIHtcbiAgICBpZiAoIWlzRGF0YVN0cnVjdHVyZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgdmFsdWUgPSBTZXEodmFsdWUpO1xuICB9XG4gIGlmIChpc0tleWVkKHZhbHVlKSkge1xuICAgIHZhciByZXN1bHQkMSA9IHt9O1xuICAgIHZhbHVlLl9faXRlcmF0ZShmdW5jdGlvbiAodiwgaykge1xuICAgICAgcmVzdWx0JDFba10gPSB0b0pTKHYpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQkMTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhbHVlLl9faXRlcmF0ZShmdW5jdGlvbiAodikge1xuICAgIHJlc3VsdC5wdXNoKHRvSlModikpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxudmFyIFNldCA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKFNldENvbGxlY3Rpb24kJDEpIHtcbiAgZnVuY3Rpb24gU2V0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgID8gZW1wdHlTZXQoKVxuICAgICAgOiBpc1NldCh2YWx1ZSkgJiYgIWlzT3JkZXJlZCh2YWx1ZSlcbiAgICAgICAgPyB2YWx1ZVxuICAgICAgICA6IGVtcHR5U2V0KCkud2l0aE11dGF0aW9ucyhmdW5jdGlvbiAoc2V0KSB7XG4gICAgICAgICAgICB2YXIgaXRlciA9IFNldENvbGxlY3Rpb24kJDEodmFsdWUpO1xuICAgICAgICAgICAgYXNzZXJ0Tm90SW5maW5pdGUoaXRlci5zaXplKTtcbiAgICAgICAgICAgIGl0ZXIuZm9yRWFjaChmdW5jdGlvbiAodikgeyByZXR1cm4gc2V0LmFkZCh2KTsgfSk7XG4gICAgICAgICAgfSk7XG4gIH1cblxuICBpZiAoIFNldENvbGxlY3Rpb24kJDEgKSBTZXQuX19wcm90b19fID0gU2V0Q29sbGVjdGlvbiQkMTtcbiAgU2V0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFNldENvbGxlY3Rpb24kJDEgJiYgU2V0Q29sbGVjdGlvbiQkMS5wcm90b3R5cGUgKTtcbiAgU2V0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNldDtcblxuICBTZXQub2YgPSBmdW5jdGlvbiBvZiAoLyouLi52YWx1ZXMqLykge1xuICAgIHJldHVybiB0aGlzKGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgU2V0LmZyb21LZXlzID0gZnVuY3Rpb24gZnJvbUtleXMgKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMoS2V5ZWRDb2xsZWN0aW9uKHZhbHVlKS5rZXlTZXEoKSk7XG4gIH07XG5cbiAgU2V0LmludGVyc2VjdCA9IGZ1bmN0aW9uIGludGVyc2VjdCAoc2V0cykge1xuICAgIHNldHMgPSBDb2xsZWN0aW9uKHNldHMpLnRvQXJyYXkoKTtcbiAgICByZXR1cm4gc2V0cy5sZW5ndGhcbiAgICAgID8gU2V0UHJvdG90eXBlLmludGVyc2VjdC5hcHBseShTZXQoc2V0cy5wb3AoKSksIHNldHMpXG4gICAgICA6IGVtcHR5U2V0KCk7XG4gIH07XG5cbiAgU2V0LnVuaW9uID0gZnVuY3Rpb24gdW5pb24gKHNldHMpIHtcbiAgICBzZXRzID0gQ29sbGVjdGlvbihzZXRzKS50b0FycmF5KCk7XG4gICAgcmV0dXJuIHNldHMubGVuZ3RoXG4gICAgICA/IFNldFByb3RvdHlwZS51bmlvbi5hcHBseShTZXQoc2V0cy5wb3AoKSksIHNldHMpXG4gICAgICA6IGVtcHR5U2V0KCk7XG4gIH07XG5cbiAgU2V0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCdTZXQgeycsICd9Jyk7XG4gIH07XG5cbiAgLy8gQHByYWdtYSBBY2Nlc3NcblxuICBTZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIGhhcyAodmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fbWFwLmhhcyh2YWx1ZSk7XG4gIH07XG5cbiAgLy8gQHByYWdtYSBNb2RpZmljYXRpb25cblxuICBTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAodmFsdWUpIHtcbiAgICByZXR1cm4gdXBkYXRlU2V0KHRoaXMsIHRoaXMuX21hcC5zZXQodmFsdWUsIHZhbHVlKSk7XG4gIH07XG5cbiAgU2V0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUgKHZhbHVlKSB7XG4gICAgcmV0dXJuIHVwZGF0ZVNldCh0aGlzLCB0aGlzLl9tYXAucmVtb3ZlKHZhbHVlKSk7XG4gIH07XG5cbiAgU2V0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyICgpIHtcbiAgICByZXR1cm4gdXBkYXRlU2V0KHRoaXMsIHRoaXMuX21hcC5jbGVhcigpKTtcbiAgfTtcblxuICAvLyBAcHJhZ21hIENvbXBvc2l0aW9uXG5cbiAgU2V0LnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbiBtYXAgKG1hcHBlciwgY29udGV4dCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdmFyIHJlbW92ZXMgPSBbXTtcbiAgICB2YXIgYWRkcyA9IFtdO1xuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHZhciBtYXBwZWQgPSBtYXBwZXIuY2FsbChjb250ZXh0LCB2YWx1ZSwgdmFsdWUsIHRoaXMkMSk7XG4gICAgICBpZiAobWFwcGVkICE9PSB2YWx1ZSkge1xuICAgICAgICByZW1vdmVzLnB1c2godmFsdWUpO1xuICAgICAgICBhZGRzLnB1c2gobWFwcGVkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKGZ1bmN0aW9uIChzZXQpIHtcbiAgICAgIHJlbW92ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHNldC5yZW1vdmUodmFsdWUpOyB9KTtcbiAgICAgIGFkZHMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHNldC5hZGQodmFsdWUpOyB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBTZXQucHJvdG90eXBlLnVuaW9uID0gZnVuY3Rpb24gdW5pb24gKCkge1xuICAgIHZhciBpdGVycyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHdoaWxlICggbGVuLS0gKSBpdGVyc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gICAgaXRlcnMgPSBpdGVycy5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHguc2l6ZSAhPT0gMDsgfSk7XG4gICAgaWYgKGl0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmICh0aGlzLnNpemUgPT09IDAgJiYgIXRoaXMuX19vd25lcklEICYmIGl0ZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IoaXRlcnNbMF0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKGZ1bmN0aW9uIChzZXQpIHtcbiAgICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCBpdGVycy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgU2V0Q29sbGVjdGlvbiQkMShpdGVyc1tpaV0pLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBzZXQuYWRkKHZhbHVlKTsgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgU2V0LnByb3RvdHlwZS5pbnRlcnNlY3QgPSBmdW5jdGlvbiBpbnRlcnNlY3QgKCkge1xuICAgIHZhciBpdGVycyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHdoaWxlICggbGVuLS0gKSBpdGVyc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gICAgaWYgKGl0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGl0ZXJzID0gaXRlcnMubWFwKGZ1bmN0aW9uIChpdGVyKSB7IHJldHVybiBTZXRDb2xsZWN0aW9uJCQxKGl0ZXIpOyB9KTtcbiAgICB2YXIgdG9SZW1vdmUgPSBbXTtcbiAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAoIWl0ZXJzLmV2ZXJ5KGZ1bmN0aW9uIChpdGVyKSB7IHJldHVybiBpdGVyLmluY2x1ZGVzKHZhbHVlKTsgfSkpIHtcbiAgICAgICAgdG9SZW1vdmUucHVzaCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMud2l0aE11dGF0aW9ucyhmdW5jdGlvbiAoc2V0KSB7XG4gICAgICB0b1JlbW92ZS5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBzZXQucmVtb3ZlKHZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIFNldC5wcm90b3R5cGUuc3VidHJhY3QgPSBmdW5jdGlvbiBzdWJ0cmFjdCAoKSB7XG4gICAgdmFyIGl0ZXJzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgd2hpbGUgKCBsZW4tLSApIGl0ZXJzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgICBpZiAoaXRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaXRlcnMgPSBpdGVycy5tYXAoZnVuY3Rpb24gKGl0ZXIpIHsgcmV0dXJuIFNldENvbGxlY3Rpb24kJDEoaXRlcik7IH0pO1xuICAgIHZhciB0b1JlbW92ZSA9IFtdO1xuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmIChpdGVycy5zb21lKGZ1bmN0aW9uIChpdGVyKSB7IHJldHVybiBpdGVyLmluY2x1ZGVzKHZhbHVlKTsgfSkpIHtcbiAgICAgICAgdG9SZW1vdmUucHVzaCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMud2l0aE11dGF0aW9ucyhmdW5jdGlvbiAoc2V0KSB7XG4gICAgICB0b1JlbW92ZS5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBzZXQucmVtb3ZlKHZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIFNldC5wcm90b3R5cGUuc29ydCA9IGZ1bmN0aW9uIHNvcnQgKGNvbXBhcmF0b3IpIHtcbiAgICAvLyBMYXRlIGJpbmRpbmdcbiAgICByZXR1cm4gT3JkZXJlZFNldChzb3J0RmFjdG9yeSh0aGlzLCBjb21wYXJhdG9yKSk7XG4gIH07XG5cbiAgU2V0LnByb3RvdHlwZS5zb3J0QnkgPSBmdW5jdGlvbiBzb3J0QnkgKG1hcHBlciwgY29tcGFyYXRvcikge1xuICAgIC8vIExhdGUgYmluZGluZ1xuICAgIHJldHVybiBPcmRlcmVkU2V0KHNvcnRGYWN0b3J5KHRoaXMsIGNvbXBhcmF0b3IsIG1hcHBlcikpO1xuICB9O1xuXG4gIFNldC5wcm90b3R5cGUud2FzQWx0ZXJlZCA9IGZ1bmN0aW9uIHdhc0FsdGVyZWQgKCkge1xuICAgIHJldHVybiB0aGlzLl9tYXAud2FzQWx0ZXJlZCgpO1xuICB9O1xuXG4gIFNldC5wcm90b3R5cGUuX19pdGVyYXRlID0gZnVuY3Rpb24gX19pdGVyYXRlIChmbiwgcmV2ZXJzZSkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgcmV0dXJuIHRoaXMuX21hcC5fX2l0ZXJhdGUoZnVuY3Rpb24gKGspIHsgcmV0dXJuIGZuKGssIGssIHRoaXMkMSk7IH0sIHJldmVyc2UpO1xuICB9O1xuXG4gIFNldC5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uIF9faXRlcmF0b3IgKHR5cGUsIHJldmVyc2UpIHtcbiAgICByZXR1cm4gdGhpcy5fbWFwLl9faXRlcmF0b3IodHlwZSwgcmV2ZXJzZSk7XG4gIH07XG5cbiAgU2V0LnByb3RvdHlwZS5fX2Vuc3VyZU93bmVyID0gZnVuY3Rpb24gX19lbnN1cmVPd25lciAob3duZXJJRCkge1xuICAgIGlmIChvd25lcklEID09PSB0aGlzLl9fb3duZXJJRCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHZhciBuZXdNYXAgPSB0aGlzLl9tYXAuX19lbnN1cmVPd25lcihvd25lcklEKTtcbiAgICBpZiAoIW93bmVySUQpIHtcbiAgICAgIGlmICh0aGlzLnNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19lbXB0eSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fX293bmVySUQgPSBvd25lcklEO1xuICAgICAgdGhpcy5fbWFwID0gbmV3TWFwO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9fbWFrZShuZXdNYXAsIG93bmVySUQpO1xuICB9O1xuXG4gIHJldHVybiBTZXQ7XG59KFNldENvbGxlY3Rpb24pKTtcblxuU2V0LmlzU2V0ID0gaXNTZXQ7XG5cbnZhciBTZXRQcm90b3R5cGUgPSBTZXQucHJvdG90eXBlO1xuU2V0UHJvdG90eXBlW0lTX1NFVF9TWU1CT0xdID0gdHJ1ZTtcblNldFByb3RvdHlwZVtERUxFVEVdID0gU2V0UHJvdG90eXBlLnJlbW92ZTtcblNldFByb3RvdHlwZS5tZXJnZSA9IFNldFByb3RvdHlwZS5jb25jYXQgPSBTZXRQcm90b3R5cGUudW5pb247XG5TZXRQcm90b3R5cGUud2l0aE11dGF0aW9ucyA9IHdpdGhNdXRhdGlvbnM7XG5TZXRQcm90b3R5cGUuYXNJbW11dGFibGUgPSBhc0ltbXV0YWJsZTtcblNldFByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IFNldFByb3RvdHlwZS5hc011dGFibGUgPSBhc011dGFibGU7XG5TZXRQcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbihyZXN1bHQsIGFycikge1xuICByZXR1cm4gcmVzdWx0LmFkZChhcnIpO1xufTtcblNldFByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24ob2JqKSB7XG4gIHJldHVybiBvYmouYXNJbW11dGFibGUoKTtcbn07XG5cblNldFByb3RvdHlwZS5fX2VtcHR5ID0gZW1wdHlTZXQ7XG5TZXRQcm90b3R5cGUuX19tYWtlID0gbWFrZVNldDtcblxuZnVuY3Rpb24gdXBkYXRlU2V0KHNldCwgbmV3TWFwKSB7XG4gIGlmIChzZXQuX19vd25lcklEKSB7XG4gICAgc2V0LnNpemUgPSBuZXdNYXAuc2l6ZTtcbiAgICBzZXQuX21hcCA9IG5ld01hcDtcbiAgICByZXR1cm4gc2V0O1xuICB9XG4gIHJldHVybiBuZXdNYXAgPT09IHNldC5fbWFwXG4gICAgPyBzZXRcbiAgICA6IG5ld01hcC5zaXplID09PSAwXG4gICAgICA/IHNldC5fX2VtcHR5KClcbiAgICAgIDogc2V0Ll9fbWFrZShuZXdNYXApO1xufVxuXG5mdW5jdGlvbiBtYWtlU2V0KG1hcCwgb3duZXJJRCkge1xuICB2YXIgc2V0ID0gT2JqZWN0LmNyZWF0ZShTZXRQcm90b3R5cGUpO1xuICBzZXQuc2l6ZSA9IG1hcCA/IG1hcC5zaXplIDogMDtcbiAgc2V0Ll9tYXAgPSBtYXA7XG4gIHNldC5fX293bmVySUQgPSBvd25lcklEO1xuICByZXR1cm4gc2V0O1xufVxuXG52YXIgRU1QVFlfU0VUO1xuZnVuY3Rpb24gZW1wdHlTZXQoKSB7XG4gIHJldHVybiBFTVBUWV9TRVQgfHwgKEVNUFRZX1NFVCA9IG1ha2VTZXQoZW1wdHlNYXAoKSkpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBsYXp5IHNlcSBvZiBudW1zIGZyb20gc3RhcnQgKGluY2x1c2l2ZSkgdG8gZW5kXG4gKiAoZXhjbHVzaXZlKSwgYnkgc3RlcCwgd2hlcmUgc3RhcnQgZGVmYXVsdHMgdG8gMCwgc3RlcCB0byAxLCBhbmQgZW5kIHRvXG4gKiBpbmZpbml0eS4gV2hlbiBzdGFydCBpcyBlcXVhbCB0byBlbmQsIHJldHVybnMgZW1wdHkgbGlzdC5cbiAqL1xudmFyIFJhbmdlID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoSW5kZXhlZFNlcSQkMSkge1xuICBmdW5jdGlvbiBSYW5nZShzdGFydCwgZW5kLCBzdGVwKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJhbmdlKSkge1xuICAgICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydCwgZW5kLCBzdGVwKTtcbiAgICB9XG4gICAgaW52YXJpYW50KHN0ZXAgIT09IDAsICdDYW5ub3Qgc3RlcCBhIFJhbmdlIGJ5IDAnKTtcbiAgICBzdGFydCA9IHN0YXJ0IHx8IDA7XG4gICAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmQgPSBJbmZpbml0eTtcbiAgICB9XG4gICAgc3RlcCA9IHN0ZXAgPT09IHVuZGVmaW5lZCA/IDEgOiBNYXRoLmFicyhzdGVwKTtcbiAgICBpZiAoZW5kIDwgc3RhcnQpIHtcbiAgICAgIHN0ZXAgPSAtc3RlcDtcbiAgICB9XG4gICAgdGhpcy5fc3RhcnQgPSBzdGFydDtcbiAgICB0aGlzLl9lbmQgPSBlbmQ7XG4gICAgdGhpcy5fc3RlcCA9IHN0ZXA7XG4gICAgdGhpcy5zaXplID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKChlbmQgLSBzdGFydCkgLyBzdGVwIC0gMSkgKyAxKTtcbiAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICBpZiAoRU1QVFlfUkFOR0UpIHtcbiAgICAgICAgcmV0dXJuIEVNUFRZX1JBTkdFO1xuICAgICAgfVxuICAgICAgRU1QVFlfUkFOR0UgPSB0aGlzO1xuICAgIH1cbiAgfVxuXG4gIGlmICggSW5kZXhlZFNlcSQkMSApIFJhbmdlLl9fcHJvdG9fXyA9IEluZGV4ZWRTZXEkJDE7XG4gIFJhbmdlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEluZGV4ZWRTZXEkJDEgJiYgSW5kZXhlZFNlcSQkMS5wcm90b3R5cGUgKTtcbiAgUmFuZ2UucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmFuZ2U7XG5cbiAgUmFuZ2UucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICAgIGlmICh0aGlzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiAnUmFuZ2UgW10nO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgJ1JhbmdlIFsgJyArXG4gICAgICB0aGlzLl9zdGFydCArXG4gICAgICAnLi4uJyArXG4gICAgICB0aGlzLl9lbmQgK1xuICAgICAgKHRoaXMuX3N0ZXAgIT09IDEgPyAnIGJ5ICcgKyB0aGlzLl9zdGVwIDogJycpICtcbiAgICAgICcgXSdcbiAgICApO1xuICB9O1xuXG4gIFJhbmdlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKGluZGV4LCBub3RTZXRWYWx1ZSkge1xuICAgIHJldHVybiB0aGlzLmhhcyhpbmRleClcbiAgICAgID8gdGhpcy5fc3RhcnQgKyB3cmFwSW5kZXgodGhpcywgaW5kZXgpICogdGhpcy5fc3RlcFxuICAgICAgOiBub3RTZXRWYWx1ZTtcbiAgfTtcblxuICBSYW5nZS5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAoc2VhcmNoVmFsdWUpIHtcbiAgICB2YXIgcG9zc2libGVJbmRleCA9IChzZWFyY2hWYWx1ZSAtIHRoaXMuX3N0YXJ0KSAvIHRoaXMuX3N0ZXA7XG4gICAgcmV0dXJuIChcbiAgICAgIHBvc3NpYmxlSW5kZXggPj0gMCAmJlxuICAgICAgcG9zc2libGVJbmRleCA8IHRoaXMuc2l6ZSAmJlxuICAgICAgcG9zc2libGVJbmRleCA9PT0gTWF0aC5mbG9vcihwb3NzaWJsZUluZGV4KVxuICAgICk7XG4gIH07XG5cbiAgUmFuZ2UucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKGJlZ2luLCBlbmQpIHtcbiAgICBpZiAod2hvbGVTbGljZShiZWdpbiwgZW5kLCB0aGlzLnNpemUpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgYmVnaW4gPSByZXNvbHZlQmVnaW4oYmVnaW4sIHRoaXMuc2l6ZSk7XG4gICAgZW5kID0gcmVzb2x2ZUVuZChlbmQsIHRoaXMuc2l6ZSk7XG4gICAgaWYgKGVuZCA8PSBiZWdpbikge1xuICAgICAgcmV0dXJuIG5ldyBSYW5nZSgwLCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBSYW5nZShcbiAgICAgIHRoaXMuZ2V0KGJlZ2luLCB0aGlzLl9lbmQpLFxuICAgICAgdGhpcy5nZXQoZW5kLCB0aGlzLl9lbmQpLFxuICAgICAgdGhpcy5fc3RlcFxuICAgICk7XG4gIH07XG5cbiAgUmFuZ2UucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mIChzZWFyY2hWYWx1ZSkge1xuICAgIHZhciBvZmZzZXRWYWx1ZSA9IHNlYXJjaFZhbHVlIC0gdGhpcy5fc3RhcnQ7XG4gICAgaWYgKG9mZnNldFZhbHVlICUgdGhpcy5fc3RlcCA9PT0gMCkge1xuICAgICAgdmFyIGluZGV4ID0gb2Zmc2V0VmFsdWUgLyB0aGlzLl9zdGVwO1xuICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLnNpemUpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH07XG5cbiAgUmFuZ2UucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHNlYXJjaFZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXhPZihzZWFyY2hWYWx1ZSk7XG4gIH07XG5cbiAgUmFuZ2UucHJvdG90eXBlLl9faXRlcmF0ZSA9IGZ1bmN0aW9uIF9faXRlcmF0ZSAoZm4sIHJldmVyc2UpIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICB2YXIgc3RlcCA9IHRoaXMuX3N0ZXA7XG4gICAgdmFyIHZhbHVlID0gcmV2ZXJzZSA/IHRoaXMuX3N0YXJ0ICsgKHNpemUgLSAxKSAqIHN0ZXAgOiB0aGlzLl9zdGFydDtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGkgIT09IHNpemUpIHtcbiAgICAgIGlmIChmbih2YWx1ZSwgcmV2ZXJzZSA/IHNpemUgLSArK2kgOiBpKyssIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHZhbHVlICs9IHJldmVyc2UgPyAtc3RlcCA6IHN0ZXA7XG4gICAgfVxuICAgIHJldHVybiBpO1xuICB9O1xuXG4gIFJhbmdlLnByb3RvdHlwZS5fX2l0ZXJhdG9yID0gZnVuY3Rpb24gX19pdGVyYXRvciAodHlwZSwgcmV2ZXJzZSkge1xuICAgIHZhciBzaXplID0gdGhpcy5zaXplO1xuICAgIHZhciBzdGVwID0gdGhpcy5fc3RlcDtcbiAgICB2YXIgdmFsdWUgPSByZXZlcnNlID8gdGhpcy5fc3RhcnQgKyAoc2l6ZSAtIDEpICogc3RlcCA6IHRoaXMuX3N0YXJ0O1xuICAgIHZhciBpID0gMDtcbiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChpID09PSBzaXplKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvckRvbmUoKTtcbiAgICAgIH1cbiAgICAgIHZhciB2ID0gdmFsdWU7XG4gICAgICB2YWx1ZSArPSByZXZlcnNlID8gLXN0ZXAgOiBzdGVwO1xuICAgICAgcmV0dXJuIGl0ZXJhdG9yVmFsdWUodHlwZSwgcmV2ZXJzZSA/IHNpemUgLSArK2kgOiBpKyssIHYpO1xuICAgIH0pO1xuICB9O1xuXG4gIFJhbmdlLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMgKG90aGVyKSB7XG4gICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgUmFuZ2VcbiAgICAgID8gdGhpcy5fc3RhcnQgPT09IG90aGVyLl9zdGFydCAmJlxuICAgICAgICAgIHRoaXMuX2VuZCA9PT0gb3RoZXIuX2VuZCAmJlxuICAgICAgICAgIHRoaXMuX3N0ZXAgPT09IG90aGVyLl9zdGVwXG4gICAgICA6IGRlZXBFcXVhbCh0aGlzLCBvdGhlcik7XG4gIH07XG5cbiAgcmV0dXJuIFJhbmdlO1xufShJbmRleGVkU2VxKSk7XG5cbnZhciBFTVBUWV9SQU5HRTtcblxuZnVuY3Rpb24gZ2V0SW4oY29sbGVjdGlvbiwgc2VhcmNoS2V5UGF0aCwgbm90U2V0VmFsdWUpIHtcbiAgdmFyIGtleVBhdGggPSBjb2VyY2VLZXlQYXRoKHNlYXJjaEtleVBhdGgpO1xuICB2YXIgaSA9IDA7XG4gIHdoaWxlIChpICE9PSBrZXlQYXRoLmxlbmd0aCkge1xuICAgIGNvbGxlY3Rpb24gPSBnZXQoY29sbGVjdGlvbiwga2V5UGF0aFtpKytdLCBOT1RfU0VUKTtcbiAgICBpZiAoY29sbGVjdGlvbiA9PT0gTk9UX1NFVCkge1xuICAgICAgcmV0dXJuIG5vdFNldFZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29sbGVjdGlvbjtcbn1cblxuZnVuY3Rpb24gZ2V0SW4kMShzZWFyY2hLZXlQYXRoLCBub3RTZXRWYWx1ZSkge1xuICByZXR1cm4gZ2V0SW4odGhpcywgc2VhcmNoS2V5UGF0aCwgbm90U2V0VmFsdWUpO1xufVxuXG5mdW5jdGlvbiBoYXNJbihjb2xsZWN0aW9uLCBrZXlQYXRoKSB7XG4gIHJldHVybiBnZXRJbihjb2xsZWN0aW9uLCBrZXlQYXRoLCBOT1RfU0VUKSAhPT0gTk9UX1NFVDtcbn1cblxuZnVuY3Rpb24gaGFzSW4kMShzZWFyY2hLZXlQYXRoKSB7XG4gIHJldHVybiBoYXNJbih0aGlzLCBzZWFyY2hLZXlQYXRoKTtcbn1cblxuZnVuY3Rpb24gdG9PYmplY3QoKSB7XG4gIGFzc2VydE5vdEluZmluaXRlKHRoaXMuc2l6ZSk7XG4gIHZhciBvYmplY3QgPSB7fTtcbiAgdGhpcy5fX2l0ZXJhdGUoZnVuY3Rpb24gKHYsIGspIHtcbiAgICBvYmplY3Rba10gPSB2O1xuICB9KTtcbiAgcmV0dXJuIG9iamVjdDtcbn1cblxuLy8gTm90ZTogYWxsIG9mIHRoZXNlIG1ldGhvZHMgYXJlIGRlcHJlY2F0ZWQuXG5Db2xsZWN0aW9uLmlzSXRlcmFibGUgPSBpc0NvbGxlY3Rpb247XG5Db2xsZWN0aW9uLmlzS2V5ZWQgPSBpc0tleWVkO1xuQ29sbGVjdGlvbi5pc0luZGV4ZWQgPSBpc0luZGV4ZWQ7XG5Db2xsZWN0aW9uLmlzQXNzb2NpYXRpdmUgPSBpc0Fzc29jaWF0aXZlO1xuQ29sbGVjdGlvbi5pc09yZGVyZWQgPSBpc09yZGVyZWQ7XG5cbkNvbGxlY3Rpb24uSXRlcmF0b3IgPSBJdGVyYXRvcjtcblxubWl4aW4oQ29sbGVjdGlvbiwge1xuICAvLyAjIyMgQ29udmVyc2lvbiB0byBvdGhlciB0eXBlc1xuXG4gIHRvQXJyYXk6IGZ1bmN0aW9uIHRvQXJyYXkoKSB7XG4gICAgYXNzZXJ0Tm90SW5maW5pdGUodGhpcy5zaXplKTtcbiAgICB2YXIgYXJyYXkgPSBuZXcgQXJyYXkodGhpcy5zaXplIHx8IDApO1xuICAgIHZhciB1c2VUdXBsZXMgPSBpc0tleWVkKHRoaXMpO1xuICAgIHZhciBpID0gMDtcbiAgICB0aGlzLl9faXRlcmF0ZShmdW5jdGlvbiAodiwgaykge1xuICAgICAgLy8gS2V5ZWQgY29sbGVjdGlvbnMgcHJvZHVjZSBhbiBhcnJheSBvZiB0dXBsZXMuXG4gICAgICBhcnJheVtpKytdID0gdXNlVHVwbGVzID8gW2ssIHZdIDogdjtcbiAgICB9KTtcbiAgICByZXR1cm4gYXJyYXk7XG4gIH0sXG5cbiAgdG9JbmRleGVkU2VxOiBmdW5jdGlvbiB0b0luZGV4ZWRTZXEoKSB7XG4gICAgcmV0dXJuIG5ldyBUb0luZGV4ZWRTZXF1ZW5jZSh0aGlzKTtcbiAgfSxcblxuICB0b0pTOiBmdW5jdGlvbiB0b0pTJDEoKSB7XG4gICAgcmV0dXJuIHRvSlModGhpcyk7XG4gIH0sXG5cbiAgdG9LZXllZFNlcTogZnVuY3Rpb24gdG9LZXllZFNlcSgpIHtcbiAgICByZXR1cm4gbmV3IFRvS2V5ZWRTZXF1ZW5jZSh0aGlzLCB0cnVlKTtcbiAgfSxcblxuICB0b01hcDogZnVuY3Rpb24gdG9NYXAoKSB7XG4gICAgLy8gVXNlIExhdGUgQmluZGluZyBoZXJlIHRvIHNvbHZlIHRoZSBjaXJjdWxhciBkZXBlbmRlbmN5LlxuICAgIHJldHVybiBNYXAodGhpcy50b0tleWVkU2VxKCkpO1xuICB9LFxuXG4gIHRvT2JqZWN0OiB0b09iamVjdCxcblxuICB0b09yZGVyZWRNYXA6IGZ1bmN0aW9uIHRvT3JkZXJlZE1hcCgpIHtcbiAgICAvLyBVc2UgTGF0ZSBCaW5kaW5nIGhlcmUgdG8gc29sdmUgdGhlIGNpcmN1bGFyIGRlcGVuZGVuY3kuXG4gICAgcmV0dXJuIE9yZGVyZWRNYXAodGhpcy50b0tleWVkU2VxKCkpO1xuICB9LFxuXG4gIHRvT3JkZXJlZFNldDogZnVuY3Rpb24gdG9PcmRlcmVkU2V0KCkge1xuICAgIC8vIFVzZSBMYXRlIEJpbmRpbmcgaGVyZSB0byBzb2x2ZSB0aGUgY2lyY3VsYXIgZGVwZW5kZW5jeS5cbiAgICByZXR1cm4gT3JkZXJlZFNldChpc0tleWVkKHRoaXMpID8gdGhpcy52YWx1ZVNlcSgpIDogdGhpcyk7XG4gIH0sXG5cbiAgdG9TZXQ6IGZ1bmN0aW9uIHRvU2V0KCkge1xuICAgIC8vIFVzZSBMYXRlIEJpbmRpbmcgaGVyZSB0byBzb2x2ZSB0aGUgY2lyY3VsYXIgZGVwZW5kZW5jeS5cbiAgICByZXR1cm4gU2V0KGlzS2V5ZWQodGhpcykgPyB0aGlzLnZhbHVlU2VxKCkgOiB0aGlzKTtcbiAgfSxcblxuICB0b1NldFNlcTogZnVuY3Rpb24gdG9TZXRTZXEoKSB7XG4gICAgcmV0dXJuIG5ldyBUb1NldFNlcXVlbmNlKHRoaXMpO1xuICB9LFxuXG4gIHRvU2VxOiBmdW5jdGlvbiB0b1NlcSgpIHtcbiAgICByZXR1cm4gaXNJbmRleGVkKHRoaXMpXG4gICAgICA/IHRoaXMudG9JbmRleGVkU2VxKClcbiAgICAgIDogaXNLZXllZCh0aGlzKVxuICAgICAgICA/IHRoaXMudG9LZXllZFNlcSgpXG4gICAgICAgIDogdGhpcy50b1NldFNlcSgpO1xuICB9LFxuXG4gIHRvU3RhY2s6IGZ1bmN0aW9uIHRvU3RhY2soKSB7XG4gICAgLy8gVXNlIExhdGUgQmluZGluZyBoZXJlIHRvIHNvbHZlIHRoZSBjaXJjdWxhciBkZXBlbmRlbmN5LlxuICAgIHJldHVybiBTdGFjayhpc0tleWVkKHRoaXMpID8gdGhpcy52YWx1ZVNlcSgpIDogdGhpcyk7XG4gIH0sXG5cbiAgdG9MaXN0OiBmdW5jdGlvbiB0b0xpc3QoKSB7XG4gICAgLy8gVXNlIExhdGUgQmluZGluZyBoZXJlIHRvIHNvbHZlIHRoZSBjaXJjdWxhciBkZXBlbmRlbmN5LlxuICAgIHJldHVybiBMaXN0KGlzS2V5ZWQodGhpcykgPyB0aGlzLnZhbHVlU2VxKCkgOiB0aGlzKTtcbiAgfSxcblxuICAvLyAjIyMgQ29tbW9uIEphdmFTY3JpcHQgbWV0aG9kcyBhbmQgcHJvcGVydGllc1xuXG4gIHRvU3RyaW5nOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gJ1tDb2xsZWN0aW9uXSc7XG4gIH0sXG5cbiAgX190b1N0cmluZzogZnVuY3Rpb24gX190b1N0cmluZyhoZWFkLCB0YWlsKSB7XG4gICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIGhlYWQgKyB0YWlsO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgaGVhZCArXG4gICAgICAnICcgK1xuICAgICAgdGhpcy50b1NlcSgpXG4gICAgICAgIC5tYXAodGhpcy5fX3RvU3RyaW5nTWFwcGVyKVxuICAgICAgICAuam9pbignLCAnKSArXG4gICAgICAnICcgK1xuICAgICAgdGFpbFxuICAgICk7XG4gIH0sXG5cbiAgLy8gIyMjIEVTNiBDb2xsZWN0aW9uIG1ldGhvZHMgKEVTNiBBcnJheSBhbmQgTWFwKVxuXG4gIGNvbmNhdDogZnVuY3Rpb24gY29uY2F0KCkge1xuICAgIHZhciB2YWx1ZXMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB3aGlsZSAoIGxlbi0tICkgdmFsdWVzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgICByZXR1cm4gcmVpZnkodGhpcywgY29uY2F0RmFjdG9yeSh0aGlzLCB2YWx1ZXMpKTtcbiAgfSxcblxuICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoVmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5zb21lKGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gaXModmFsdWUsIHNlYXJjaFZhbHVlKTsgfSk7XG4gIH0sXG5cbiAgZW50cmllczogZnVuY3Rpb24gZW50cmllcygpIHtcbiAgICByZXR1cm4gdGhpcy5fX2l0ZXJhdG9yKElURVJBVEVfRU5UUklFUyk7XG4gIH0sXG5cbiAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIGFzc2VydE5vdEluZmluaXRlKHRoaXMuc2l6ZSk7XG4gICAgdmFyIHJldHVyblZhbHVlID0gdHJ1ZTtcbiAgICB0aGlzLl9faXRlcmF0ZShmdW5jdGlvbiAodiwgaywgYykge1xuICAgICAgaWYgKCFwcmVkaWNhdGUuY2FsbChjb250ZXh0LCB2LCBrLCBjKSkge1xuICAgICAgICByZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9LFxuXG4gIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHJldHVybiByZWlmeSh0aGlzLCBmaWx0ZXJGYWN0b3J5KHRoaXMsIHByZWRpY2F0ZSwgY29udGV4dCwgdHJ1ZSkpO1xuICB9LFxuXG4gIGZpbmQ6IGZ1bmN0aW9uIGZpbmQocHJlZGljYXRlLCBjb250ZXh0LCBub3RTZXRWYWx1ZSkge1xuICAgIHZhciBlbnRyeSA9IHRoaXMuZmluZEVudHJ5KHByZWRpY2F0ZSwgY29udGV4dCk7XG4gICAgcmV0dXJuIGVudHJ5ID8gZW50cnlbMV0gOiBub3RTZXRWYWx1ZTtcbiAgfSxcblxuICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKHNpZGVFZmZlY3QsIGNvbnRleHQpIHtcbiAgICBhc3NlcnROb3RJbmZpbml0ZSh0aGlzLnNpemUpO1xuICAgIHJldHVybiB0aGlzLl9faXRlcmF0ZShjb250ZXh0ID8gc2lkZUVmZmVjdC5iaW5kKGNvbnRleHQpIDogc2lkZUVmZmVjdCk7XG4gIH0sXG5cbiAgam9pbjogZnVuY3Rpb24gam9pbihzZXBhcmF0b3IpIHtcbiAgICBhc3NlcnROb3RJbmZpbml0ZSh0aGlzLnNpemUpO1xuICAgIHNlcGFyYXRvciA9IHNlcGFyYXRvciAhPT0gdW5kZWZpbmVkID8gJycgKyBzZXBhcmF0b3IgOiAnLCc7XG4gICAgdmFyIGpvaW5lZCA9ICcnO1xuICAgIHZhciBpc0ZpcnN0ID0gdHJ1ZTtcbiAgICB0aGlzLl9faXRlcmF0ZShmdW5jdGlvbiAodikge1xuICAgICAgaXNGaXJzdCA/IChpc0ZpcnN0ID0gZmFsc2UpIDogKGpvaW5lZCArPSBzZXBhcmF0b3IpO1xuICAgICAgam9pbmVkICs9IHYgIT09IG51bGwgJiYgdiAhPT0gdW5kZWZpbmVkID8gdi50b1N0cmluZygpIDogJyc7XG4gICAgfSk7XG4gICAgcmV0dXJuIGpvaW5lZDtcbiAgfSxcblxuICBrZXlzOiBmdW5jdGlvbiBrZXlzKCkge1xuICAgIHJldHVybiB0aGlzLl9faXRlcmF0b3IoSVRFUkFURV9LRVlTKTtcbiAgfSxcblxuICBtYXA6IGZ1bmN0aW9uIG1hcChtYXBwZXIsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gcmVpZnkodGhpcywgbWFwRmFjdG9yeSh0aGlzLCBtYXBwZXIsIGNvbnRleHQpKTtcbiAgfSxcblxuICByZWR1Y2U6IGZ1bmN0aW9uIHJlZHVjZSQxKHJlZHVjZXIsIGluaXRpYWxSZWR1Y3Rpb24sIGNvbnRleHQpIHtcbiAgICByZXR1cm4gcmVkdWNlKFxuICAgICAgdGhpcyxcbiAgICAgIHJlZHVjZXIsXG4gICAgICBpbml0aWFsUmVkdWN0aW9uLFxuICAgICAgY29udGV4dCxcbiAgICAgIGFyZ3VtZW50cy5sZW5ndGggPCAyLFxuICAgICAgZmFsc2VcbiAgICApO1xuICB9LFxuXG4gIHJlZHVjZVJpZ2h0OiBmdW5jdGlvbiByZWR1Y2VSaWdodChyZWR1Y2VyLCBpbml0aWFsUmVkdWN0aW9uLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHJlZHVjZShcbiAgICAgIHRoaXMsXG4gICAgICByZWR1Y2VyLFxuICAgICAgaW5pdGlhbFJlZHVjdGlvbixcbiAgICAgIGNvbnRleHQsXG4gICAgICBhcmd1bWVudHMubGVuZ3RoIDwgMixcbiAgICAgIHRydWVcbiAgICApO1xuICB9LFxuXG4gIHJldmVyc2U6IGZ1bmN0aW9uIHJldmVyc2UoKSB7XG4gICAgcmV0dXJuIHJlaWZ5KHRoaXMsIHJldmVyc2VGYWN0b3J5KHRoaXMsIHRydWUpKTtcbiAgfSxcblxuICBzbGljZTogZnVuY3Rpb24gc2xpY2UoYmVnaW4sIGVuZCkge1xuICAgIHJldHVybiByZWlmeSh0aGlzLCBzbGljZUZhY3RvcnkodGhpcywgYmVnaW4sIGVuZCwgdHJ1ZSkpO1xuICB9LFxuXG4gIHNvbWU6IGZ1bmN0aW9uIHNvbWUocHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuICF0aGlzLmV2ZXJ5KG5vdChwcmVkaWNhdGUpLCBjb250ZXh0KTtcbiAgfSxcblxuICBzb3J0OiBmdW5jdGlvbiBzb3J0KGNvbXBhcmF0b3IpIHtcbiAgICByZXR1cm4gcmVpZnkodGhpcywgc29ydEZhY3RvcnkodGhpcywgY29tcGFyYXRvcikpO1xuICB9LFxuXG4gIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLl9faXRlcmF0b3IoSVRFUkFURV9WQUxVRVMpO1xuICB9LFxuXG4gIC8vICMjIyBNb3JlIHNlcXVlbnRpYWwgbWV0aG9kc1xuXG4gIGJ1dExhc3Q6IGZ1bmN0aW9uIGJ1dExhc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2xpY2UoMCwgLTEpO1xuICB9LFxuXG4gIGlzRW1wdHk6IGZ1bmN0aW9uIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5zaXplID09PSAwIDogIXRoaXMuc29tZShmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9KTtcbiAgfSxcblxuICBjb3VudDogZnVuY3Rpb24gY291bnQocHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGVuc3VyZVNpemUoXG4gICAgICBwcmVkaWNhdGUgPyB0aGlzLnRvU2VxKCkuZmlsdGVyKHByZWRpY2F0ZSwgY29udGV4dCkgOiB0aGlzXG4gICAgKTtcbiAgfSxcblxuICBjb3VudEJ5OiBmdW5jdGlvbiBjb3VudEJ5KGdyb3VwZXIsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gY291bnRCeUZhY3RvcnkodGhpcywgZ3JvdXBlciwgY29udGV4dCk7XG4gIH0sXG5cbiAgZXF1YWxzOiBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICByZXR1cm4gZGVlcEVxdWFsKHRoaXMsIG90aGVyKTtcbiAgfSxcblxuICBlbnRyeVNlcTogZnVuY3Rpb24gZW50cnlTZXEoKSB7XG4gICAgdmFyIGNvbGxlY3Rpb24gPSB0aGlzO1xuICAgIGlmIChjb2xsZWN0aW9uLl9jYWNoZSkge1xuICAgICAgLy8gV2UgY2FjaGUgYXMgYW4gZW50cmllcyBhcnJheSwgc28gd2UgY2FuIGp1c3QgcmV0dXJuIHRoZSBjYWNoZSFcbiAgICAgIHJldHVybiBuZXcgQXJyYXlTZXEoY29sbGVjdGlvbi5fY2FjaGUpO1xuICAgIH1cbiAgICB2YXIgZW50cmllc1NlcXVlbmNlID0gY29sbGVjdGlvblxuICAgICAgLnRvU2VxKClcbiAgICAgIC5tYXAoZW50cnlNYXBwZXIpXG4gICAgICAudG9JbmRleGVkU2VxKCk7XG4gICAgZW50cmllc1NlcXVlbmNlLmZyb21FbnRyeVNlcSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbGxlY3Rpb24udG9TZXEoKTsgfTtcbiAgICByZXR1cm4gZW50cmllc1NlcXVlbmNlO1xuICB9LFxuXG4gIGZpbHRlck5vdDogZnVuY3Rpb24gZmlsdGVyTm90KHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcihub3QocHJlZGljYXRlKSwgY29udGV4dCk7XG4gIH0sXG5cbiAgZmluZEVudHJ5OiBmdW5jdGlvbiBmaW5kRW50cnkocHJlZGljYXRlLCBjb250ZXh0LCBub3RTZXRWYWx1ZSkge1xuICAgIHZhciBmb3VuZCA9IG5vdFNldFZhbHVlO1xuICAgIHRoaXMuX19pdGVyYXRlKGZ1bmN0aW9uICh2LCBrLCBjKSB7XG4gICAgICBpZiAocHJlZGljYXRlLmNhbGwoY29udGV4dCwgdiwgaywgYykpIHtcbiAgICAgICAgZm91bmQgPSBbaywgdl07XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZm91bmQ7XG4gIH0sXG5cbiAgZmluZEtleTogZnVuY3Rpb24gZmluZEtleShwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgZW50cnkgPSB0aGlzLmZpbmRFbnRyeShwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeVswXTtcbiAgfSxcblxuICBmaW5kTGFzdDogZnVuY3Rpb24gZmluZExhc3QocHJlZGljYXRlLCBjb250ZXh0LCBub3RTZXRWYWx1ZSkge1xuICAgIHJldHVybiB0aGlzLnRvS2V5ZWRTZXEoKVxuICAgICAgLnJldmVyc2UoKVxuICAgICAgLmZpbmQocHJlZGljYXRlLCBjb250ZXh0LCBub3RTZXRWYWx1ZSk7XG4gIH0sXG5cbiAgZmluZExhc3RFbnRyeTogZnVuY3Rpb24gZmluZExhc3RFbnRyeShwcmVkaWNhdGUsIGNvbnRleHQsIG5vdFNldFZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMudG9LZXllZFNlcSgpXG4gICAgICAucmV2ZXJzZSgpXG4gICAgICAuZmluZEVudHJ5KHByZWRpY2F0ZSwgY29udGV4dCwgbm90U2V0VmFsdWUpO1xuICB9LFxuXG4gIGZpbmRMYXN0S2V5OiBmdW5jdGlvbiBmaW5kTGFzdEtleShwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy50b0tleWVkU2VxKClcbiAgICAgIC5yZXZlcnNlKClcbiAgICAgIC5maW5kS2V5KHByZWRpY2F0ZSwgY29udGV4dCk7XG4gIH0sXG5cbiAgZmlyc3Q6IGZ1bmN0aW9uIGZpcnN0KG5vdFNldFZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluZChyZXR1cm5UcnVlLCBudWxsLCBub3RTZXRWYWx1ZSk7XG4gIH0sXG5cbiAgZmxhdE1hcDogZnVuY3Rpb24gZmxhdE1hcChtYXBwZXIsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gcmVpZnkodGhpcywgZmxhdE1hcEZhY3RvcnkodGhpcywgbWFwcGVyLCBjb250ZXh0KSk7XG4gIH0sXG5cbiAgZmxhdHRlbjogZnVuY3Rpb24gZmxhdHRlbihkZXB0aCkge1xuICAgIHJldHVybiByZWlmeSh0aGlzLCBmbGF0dGVuRmFjdG9yeSh0aGlzLCBkZXB0aCwgdHJ1ZSkpO1xuICB9LFxuXG4gIGZyb21FbnRyeVNlcTogZnVuY3Rpb24gZnJvbUVudHJ5U2VxKCkge1xuICAgIHJldHVybiBuZXcgRnJvbUVudHJpZXNTZXF1ZW5jZSh0aGlzKTtcbiAgfSxcblxuICBnZXQ6IGZ1bmN0aW9uIGdldChzZWFyY2hLZXksIG5vdFNldFZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluZChmdW5jdGlvbiAoXywga2V5KSB7IHJldHVybiBpcyhrZXksIHNlYXJjaEtleSk7IH0sIHVuZGVmaW5lZCwgbm90U2V0VmFsdWUpO1xuICB9LFxuXG4gIGdldEluOiBnZXRJbiQxLFxuXG4gIGdyb3VwQnk6IGZ1bmN0aW9uIGdyb3VwQnkoZ3JvdXBlciwgY29udGV4dCkge1xuICAgIHJldHVybiBncm91cEJ5RmFjdG9yeSh0aGlzLCBncm91cGVyLCBjb250ZXh0KTtcbiAgfSxcblxuICBoYXM6IGZ1bmN0aW9uIGhhcyhzZWFyY2hLZXkpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoc2VhcmNoS2V5LCBOT1RfU0VUKSAhPT0gTk9UX1NFVDtcbiAgfSxcblxuICBoYXNJbjogaGFzSW4kMSxcblxuICBpc1N1YnNldDogZnVuY3Rpb24gaXNTdWJzZXQoaXRlcikge1xuICAgIGl0ZXIgPSB0eXBlb2YgaXRlci5pbmNsdWRlcyA9PT0gJ2Z1bmN0aW9uJyA/IGl0ZXIgOiBDb2xsZWN0aW9uKGl0ZXIpO1xuICAgIHJldHVybiB0aGlzLmV2ZXJ5KGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gaXRlci5pbmNsdWRlcyh2YWx1ZSk7IH0pO1xuICB9LFxuXG4gIGlzU3VwZXJzZXQ6IGZ1bmN0aW9uIGlzU3VwZXJzZXQoaXRlcikge1xuICAgIGl0ZXIgPSB0eXBlb2YgaXRlci5pc1N1YnNldCA9PT0gJ2Z1bmN0aW9uJyA/IGl0ZXIgOiBDb2xsZWN0aW9uKGl0ZXIpO1xuICAgIHJldHVybiBpdGVyLmlzU3Vic2V0KHRoaXMpO1xuICB9LFxuXG4gIGtleU9mOiBmdW5jdGlvbiBrZXlPZihzZWFyY2hWYWx1ZSkge1xuICAgIHJldHVybiB0aGlzLmZpbmRLZXkoZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBpcyh2YWx1ZSwgc2VhcmNoVmFsdWUpOyB9KTtcbiAgfSxcblxuICBrZXlTZXE6IGZ1bmN0aW9uIGtleVNlcSgpIHtcbiAgICByZXR1cm4gdGhpcy50b1NlcSgpXG4gICAgICAubWFwKGtleU1hcHBlcilcbiAgICAgIC50b0luZGV4ZWRTZXEoKTtcbiAgfSxcblxuICBsYXN0OiBmdW5jdGlvbiBsYXN0KG5vdFNldFZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMudG9TZXEoKVxuICAgICAgLnJldmVyc2UoKVxuICAgICAgLmZpcnN0KG5vdFNldFZhbHVlKTtcbiAgfSxcblxuICBsYXN0S2V5T2Y6IGZ1bmN0aW9uIGxhc3RLZXlPZihzZWFyY2hWYWx1ZSkge1xuICAgIHJldHVybiB0aGlzLnRvS2V5ZWRTZXEoKVxuICAgICAgLnJldmVyc2UoKVxuICAgICAgLmtleU9mKHNlYXJjaFZhbHVlKTtcbiAgfSxcblxuICBtYXg6IGZ1bmN0aW9uIG1heChjb21wYXJhdG9yKSB7XG4gICAgcmV0dXJuIG1heEZhY3RvcnkodGhpcywgY29tcGFyYXRvcik7XG4gIH0sXG5cbiAgbWF4Qnk6IGZ1bmN0aW9uIG1heEJ5KG1hcHBlciwgY29tcGFyYXRvcikge1xuICAgIHJldHVybiBtYXhGYWN0b3J5KHRoaXMsIGNvbXBhcmF0b3IsIG1hcHBlcik7XG4gIH0sXG5cbiAgbWluOiBmdW5jdGlvbiBtaW4oY29tcGFyYXRvcikge1xuICAgIHJldHVybiBtYXhGYWN0b3J5KFxuICAgICAgdGhpcyxcbiAgICAgIGNvbXBhcmF0b3IgPyBuZWcoY29tcGFyYXRvcikgOiBkZWZhdWx0TmVnQ29tcGFyYXRvclxuICAgICk7XG4gIH0sXG5cbiAgbWluQnk6IGZ1bmN0aW9uIG1pbkJ5KG1hcHBlciwgY29tcGFyYXRvcikge1xuICAgIHJldHVybiBtYXhGYWN0b3J5KFxuICAgICAgdGhpcyxcbiAgICAgIGNvbXBhcmF0b3IgPyBuZWcoY29tcGFyYXRvcikgOiBkZWZhdWx0TmVnQ29tcGFyYXRvcixcbiAgICAgIG1hcHBlclxuICAgICk7XG4gIH0sXG5cbiAgcmVzdDogZnVuY3Rpb24gcmVzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5zbGljZSgxKTtcbiAgfSxcblxuICBza2lwOiBmdW5jdGlvbiBza2lwKGFtb3VudCkge1xuICAgIHJldHVybiBhbW91bnQgPT09IDAgPyB0aGlzIDogdGhpcy5zbGljZShNYXRoLm1heCgwLCBhbW91bnQpKTtcbiAgfSxcblxuICBza2lwTGFzdDogZnVuY3Rpb24gc2tpcExhc3QoYW1vdW50KSB7XG4gICAgcmV0dXJuIGFtb3VudCA9PT0gMCA/IHRoaXMgOiB0aGlzLnNsaWNlKDAsIC1NYXRoLm1heCgwLCBhbW91bnQpKTtcbiAgfSxcblxuICBza2lwV2hpbGU6IGZ1bmN0aW9uIHNraXBXaGlsZShwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gcmVpZnkodGhpcywgc2tpcFdoaWxlRmFjdG9yeSh0aGlzLCBwcmVkaWNhdGUsIGNvbnRleHQsIHRydWUpKTtcbiAgfSxcblxuICBza2lwVW50aWw6IGZ1bmN0aW9uIHNraXBVbnRpbChwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5za2lwV2hpbGUobm90KHByZWRpY2F0ZSksIGNvbnRleHQpO1xuICB9LFxuXG4gIHNvcnRCeTogZnVuY3Rpb24gc29ydEJ5KG1hcHBlciwgY29tcGFyYXRvcikge1xuICAgIHJldHVybiByZWlmeSh0aGlzLCBzb3J0RmFjdG9yeSh0aGlzLCBjb21wYXJhdG9yLCBtYXBwZXIpKTtcbiAgfSxcblxuICB0YWtlOiBmdW5jdGlvbiB0YWtlKGFtb3VudCkge1xuICAgIHJldHVybiB0aGlzLnNsaWNlKDAsIE1hdGgubWF4KDAsIGFtb3VudCkpO1xuICB9LFxuXG4gIHRha2VMYXN0OiBmdW5jdGlvbiB0YWtlTGFzdChhbW91bnQpIHtcbiAgICByZXR1cm4gdGhpcy5zbGljZSgtTWF0aC5tYXgoMCwgYW1vdW50KSk7XG4gIH0sXG5cbiAgdGFrZVdoaWxlOiBmdW5jdGlvbiB0YWtlV2hpbGUocHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHJlaWZ5KHRoaXMsIHRha2VXaGlsZUZhY3RvcnkodGhpcywgcHJlZGljYXRlLCBjb250ZXh0KSk7XG4gIH0sXG5cbiAgdGFrZVVudGlsOiBmdW5jdGlvbiB0YWtlVW50aWwocHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMudGFrZVdoaWxlKG5vdChwcmVkaWNhdGUpLCBjb250ZXh0KTtcbiAgfSxcblxuICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShmbikge1xuICAgIHJldHVybiBmbih0aGlzKTtcbiAgfSxcblxuICB2YWx1ZVNlcTogZnVuY3Rpb24gdmFsdWVTZXEoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9JbmRleGVkU2VxKCk7XG4gIH0sXG5cbiAgLy8gIyMjIEhhc2hhYmxlIE9iamVjdFxuXG4gIGhhc2hDb2RlOiBmdW5jdGlvbiBoYXNoQ29kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fX2hhc2ggfHwgKHRoaXMuX19oYXNoID0gaGFzaENvbGxlY3Rpb24odGhpcykpO1xuICB9LFxuXG4gIC8vICMjIyBJbnRlcm5hbFxuXG4gIC8vIGFic3RyYWN0IF9faXRlcmF0ZShmbiwgcmV2ZXJzZSlcblxuICAvLyBhYnN0cmFjdCBfX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpXG59KTtcblxudmFyIENvbGxlY3Rpb25Qcm90b3R5cGUgPSBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbkNvbGxlY3Rpb25Qcm90b3R5cGVbSVNfQ09MTEVDVElPTl9TWU1CT0xdID0gdHJ1ZTtcbkNvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JfU1lNQk9MXSA9IENvbGxlY3Rpb25Qcm90b3R5cGUudmFsdWVzO1xuQ29sbGVjdGlvblByb3RvdHlwZS50b0pTT04gPSBDb2xsZWN0aW9uUHJvdG90eXBlLnRvQXJyYXk7XG5Db2xsZWN0aW9uUHJvdG90eXBlLl9fdG9TdHJpbmdNYXBwZXIgPSBxdW90ZVN0cmluZztcbkNvbGxlY3Rpb25Qcm90b3R5cGUuaW5zcGVjdCA9IENvbGxlY3Rpb25Qcm90b3R5cGUudG9Tb3VyY2UgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbn07XG5Db2xsZWN0aW9uUHJvdG90eXBlLmNoYWluID0gQ29sbGVjdGlvblByb3RvdHlwZS5mbGF0TWFwO1xuQ29sbGVjdGlvblByb3RvdHlwZS5jb250YWlucyA9IENvbGxlY3Rpb25Qcm90b3R5cGUuaW5jbHVkZXM7XG5cbm1peGluKEtleWVkQ29sbGVjdGlvbiwge1xuICAvLyAjIyMgTW9yZSBzZXF1ZW50aWFsIG1ldGhvZHNcblxuICBmbGlwOiBmdW5jdGlvbiBmbGlwKCkge1xuICAgIHJldHVybiByZWlmeSh0aGlzLCBmbGlwRmFjdG9yeSh0aGlzKSk7XG4gIH0sXG5cbiAgbWFwRW50cmllczogZnVuY3Rpb24gbWFwRW50cmllcyhtYXBwZXIsIGNvbnRleHQpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICByZXR1cm4gcmVpZnkoXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy50b1NlcSgpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKHYsIGspIHsgcmV0dXJuIG1hcHBlci5jYWxsKGNvbnRleHQsIFtrLCB2XSwgaXRlcmF0aW9ucysrLCB0aGlzJDEpOyB9KVxuICAgICAgICAuZnJvbUVudHJ5U2VxKClcbiAgICApO1xuICB9LFxuXG4gIG1hcEtleXM6IGZ1bmN0aW9uIG1hcEtleXMobWFwcGVyLCBjb250ZXh0KSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICByZXR1cm4gcmVpZnkoXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy50b1NlcSgpXG4gICAgICAgIC5mbGlwKClcbiAgICAgICAgLm1hcChmdW5jdGlvbiAoaywgdikgeyByZXR1cm4gbWFwcGVyLmNhbGwoY29udGV4dCwgaywgdiwgdGhpcyQxKTsgfSlcbiAgICAgICAgLmZsaXAoKVxuICAgICk7XG4gIH0sXG59KTtcblxudmFyIEtleWVkQ29sbGVjdGlvblByb3RvdHlwZSA9IEtleWVkQ29sbGVjdGlvbi5wcm90b3R5cGU7XG5LZXllZENvbGxlY3Rpb25Qcm90b3R5cGVbSVNfS0VZRURfU1lNQk9MXSA9IHRydWU7XG5LZXllZENvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JfU1lNQk9MXSA9IENvbGxlY3Rpb25Qcm90b3R5cGUuZW50cmllcztcbktleWVkQ29sbGVjdGlvblByb3RvdHlwZS50b0pTT04gPSB0b09iamVjdDtcbktleWVkQ29sbGVjdGlvblByb3RvdHlwZS5fX3RvU3RyaW5nTWFwcGVyID0gZnVuY3Rpb24gKHYsIGspIHsgcmV0dXJuIHF1b3RlU3RyaW5nKGspICsgJzogJyArIHF1b3RlU3RyaW5nKHYpOyB9O1xuXG5taXhpbihJbmRleGVkQ29sbGVjdGlvbiwge1xuICAvLyAjIyMgQ29udmVyc2lvbiB0byBvdGhlciB0eXBlc1xuXG4gIHRvS2V5ZWRTZXE6IGZ1bmN0aW9uIHRvS2V5ZWRTZXEoKSB7XG4gICAgcmV0dXJuIG5ldyBUb0tleWVkU2VxdWVuY2UodGhpcywgZmFsc2UpO1xuICB9LFxuXG4gIC8vICMjIyBFUzYgQ29sbGVjdGlvbiBtZXRob2RzIChFUzYgQXJyYXkgYW5kIE1hcClcblxuICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcihwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gcmVpZnkodGhpcywgZmlsdGVyRmFjdG9yeSh0aGlzLCBwcmVkaWNhdGUsIGNvbnRleHQsIGZhbHNlKSk7XG4gIH0sXG5cbiAgZmluZEluZGV4OiBmdW5jdGlvbiBmaW5kSW5kZXgocHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIGVudHJ5ID0gdGhpcy5maW5kRW50cnkocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICByZXR1cm4gZW50cnkgPyBlbnRyeVswXSA6IC0xO1xuICB9LFxuXG4gIGluZGV4T2Y6IGZ1bmN0aW9uIGluZGV4T2Yoc2VhcmNoVmFsdWUpIHtcbiAgICB2YXIga2V5ID0gdGhpcy5rZXlPZihzZWFyY2hWYWx1ZSk7XG4gICAgcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8gLTEgOiBrZXk7XG4gIH0sXG5cbiAgbGFzdEluZGV4T2Y6IGZ1bmN0aW9uIGxhc3RJbmRleE9mKHNlYXJjaFZhbHVlKSB7XG4gICAgdmFyIGtleSA9IHRoaXMubGFzdEtleU9mKHNlYXJjaFZhbHVlKTtcbiAgICByZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgPyAtMSA6IGtleTtcbiAgfSxcblxuICByZXZlcnNlOiBmdW5jdGlvbiByZXZlcnNlKCkge1xuICAgIHJldHVybiByZWlmeSh0aGlzLCByZXZlcnNlRmFjdG9yeSh0aGlzLCBmYWxzZSkpO1xuICB9LFxuXG4gIHNsaWNlOiBmdW5jdGlvbiBzbGljZShiZWdpbiwgZW5kKSB7XG4gICAgcmV0dXJuIHJlaWZ5KHRoaXMsIHNsaWNlRmFjdG9yeSh0aGlzLCBiZWdpbiwgZW5kLCBmYWxzZSkpO1xuICB9LFxuXG4gIHNwbGljZTogZnVuY3Rpb24gc3BsaWNlKGluZGV4LCByZW1vdmVOdW0gLyosIC4uLnZhbHVlcyovKSB7XG4gICAgdmFyIG51bUFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHJlbW92ZU51bSA9IE1hdGgubWF4KHJlbW92ZU51bSB8fCAwLCAwKTtcbiAgICBpZiAobnVtQXJncyA9PT0gMCB8fCAobnVtQXJncyA9PT0gMiAmJiAhcmVtb3ZlTnVtKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8vIElmIGluZGV4IGlzIG5lZ2F0aXZlLCBpdCBzaG91bGQgcmVzb2x2ZSByZWxhdGl2ZSB0byB0aGUgc2l6ZSBvZiB0aGVcbiAgICAvLyBjb2xsZWN0aW9uLiBIb3dldmVyIHNpemUgbWF5IGJlIGV4cGVuc2l2ZSB0byBjb21wdXRlIGlmIG5vdCBjYWNoZWQsIHNvXG4gICAgLy8gb25seSBjYWxsIGNvdW50KCkgaWYgdGhlIG51bWJlciBpcyBpbiBmYWN0IG5lZ2F0aXZlLlxuICAgIGluZGV4ID0gcmVzb2x2ZUJlZ2luKGluZGV4LCBpbmRleCA8IDAgPyB0aGlzLmNvdW50KCkgOiB0aGlzLnNpemUpO1xuICAgIHZhciBzcGxpY2VkID0gdGhpcy5zbGljZSgwLCBpbmRleCk7XG4gICAgcmV0dXJuIHJlaWZ5KFxuICAgICAgdGhpcyxcbiAgICAgIG51bUFyZ3MgPT09IDFcbiAgICAgICAgPyBzcGxpY2VkXG4gICAgICAgIDogc3BsaWNlZC5jb25jYXQoYXJyQ29weShhcmd1bWVudHMsIDIpLCB0aGlzLnNsaWNlKGluZGV4ICsgcmVtb3ZlTnVtKSlcbiAgICApO1xuICB9LFxuXG4gIC8vICMjIyBNb3JlIGNvbGxlY3Rpb24gbWV0aG9kc1xuXG4gIGZpbmRMYXN0SW5kZXg6IGZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgocHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIGVudHJ5ID0gdGhpcy5maW5kTGFzdEVudHJ5KHByZWRpY2F0ZSwgY29udGV4dCk7XG4gICAgcmV0dXJuIGVudHJ5ID8gZW50cnlbMF0gOiAtMTtcbiAgfSxcblxuICBmaXJzdDogZnVuY3Rpb24gZmlyc3Qobm90U2V0VmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoMCwgbm90U2V0VmFsdWUpO1xuICB9LFxuXG4gIGZsYXR0ZW46IGZ1bmN0aW9uIGZsYXR0ZW4oZGVwdGgpIHtcbiAgICByZXR1cm4gcmVpZnkodGhpcywgZmxhdHRlbkZhY3RvcnkodGhpcywgZGVwdGgsIGZhbHNlKSk7XG4gIH0sXG5cbiAgZ2V0OiBmdW5jdGlvbiBnZXQoaW5kZXgsIG5vdFNldFZhbHVlKSB7XG4gICAgaW5kZXggPSB3cmFwSW5kZXgodGhpcywgaW5kZXgpO1xuICAgIHJldHVybiBpbmRleCA8IDAgfHxcbiAgICAgICh0aGlzLnNpemUgPT09IEluZmluaXR5IHx8ICh0aGlzLnNpemUgIT09IHVuZGVmaW5lZCAmJiBpbmRleCA+IHRoaXMuc2l6ZSkpXG4gICAgICA/IG5vdFNldFZhbHVlXG4gICAgICA6IHRoaXMuZmluZChmdW5jdGlvbiAoXywga2V5KSB7IHJldHVybiBrZXkgPT09IGluZGV4OyB9LCB1bmRlZmluZWQsIG5vdFNldFZhbHVlKTtcbiAgfSxcblxuICBoYXM6IGZ1bmN0aW9uIGhhcyhpbmRleCkge1xuICAgIGluZGV4ID0gd3JhcEluZGV4KHRoaXMsIGluZGV4KTtcbiAgICByZXR1cm4gKFxuICAgICAgaW5kZXggPj0gMCAmJlxuICAgICAgKHRoaXMuc2l6ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gdGhpcy5zaXplID09PSBJbmZpbml0eSB8fCBpbmRleCA8IHRoaXMuc2l6ZVxuICAgICAgICA6IHRoaXMuaW5kZXhPZihpbmRleCkgIT09IC0xKVxuICAgICk7XG4gIH0sXG5cbiAgaW50ZXJwb3NlOiBmdW5jdGlvbiBpbnRlcnBvc2Uoc2VwYXJhdG9yKSB7XG4gICAgcmV0dXJuIHJlaWZ5KHRoaXMsIGludGVycG9zZUZhY3RvcnkodGhpcywgc2VwYXJhdG9yKSk7XG4gIH0sXG5cbiAgaW50ZXJsZWF2ZTogZnVuY3Rpb24gaW50ZXJsZWF2ZSgvKi4uLmNvbGxlY3Rpb25zKi8pIHtcbiAgICB2YXIgY29sbGVjdGlvbnMgPSBbdGhpc10uY29uY2F0KGFyckNvcHkoYXJndW1lbnRzKSk7XG4gICAgdmFyIHppcHBlZCA9IHppcFdpdGhGYWN0b3J5KHRoaXMudG9TZXEoKSwgSW5kZXhlZFNlcS5vZiwgY29sbGVjdGlvbnMpO1xuICAgIHZhciBpbnRlcmxlYXZlZCA9IHppcHBlZC5mbGF0dGVuKHRydWUpO1xuICAgIGlmICh6aXBwZWQuc2l6ZSkge1xuICAgICAgaW50ZXJsZWF2ZWQuc2l6ZSA9IHppcHBlZC5zaXplICogY29sbGVjdGlvbnMubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gcmVpZnkodGhpcywgaW50ZXJsZWF2ZWQpO1xuICB9LFxuXG4gIGtleVNlcTogZnVuY3Rpb24ga2V5U2VxKCkge1xuICAgIHJldHVybiBSYW5nZSgwLCB0aGlzLnNpemUpO1xuICB9LFxuXG4gIGxhc3Q6IGZ1bmN0aW9uIGxhc3Qobm90U2V0VmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoLTEsIG5vdFNldFZhbHVlKTtcbiAgfSxcblxuICBza2lwV2hpbGU6IGZ1bmN0aW9uIHNraXBXaGlsZShwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gcmVpZnkodGhpcywgc2tpcFdoaWxlRmFjdG9yeSh0aGlzLCBwcmVkaWNhdGUsIGNvbnRleHQsIGZhbHNlKSk7XG4gIH0sXG5cbiAgemlwOiBmdW5jdGlvbiB6aXAoLyosIC4uLmNvbGxlY3Rpb25zICovKSB7XG4gICAgdmFyIGNvbGxlY3Rpb25zID0gW3RoaXNdLmNvbmNhdChhcnJDb3B5KGFyZ3VtZW50cykpO1xuICAgIHJldHVybiByZWlmeSh0aGlzLCB6aXBXaXRoRmFjdG9yeSh0aGlzLCBkZWZhdWx0WmlwcGVyLCBjb2xsZWN0aW9ucykpO1xuICB9LFxuXG4gIHppcEFsbDogZnVuY3Rpb24gemlwQWxsKC8qLCAuLi5jb2xsZWN0aW9ucyAqLykge1xuICAgIHZhciBjb2xsZWN0aW9ucyA9IFt0aGlzXS5jb25jYXQoYXJyQ29weShhcmd1bWVudHMpKTtcbiAgICByZXR1cm4gcmVpZnkodGhpcywgemlwV2l0aEZhY3RvcnkodGhpcywgZGVmYXVsdFppcHBlciwgY29sbGVjdGlvbnMsIHRydWUpKTtcbiAgfSxcblxuICB6aXBXaXRoOiBmdW5jdGlvbiB6aXBXaXRoKHppcHBlciAvKiwgLi4uY29sbGVjdGlvbnMgKi8pIHtcbiAgICB2YXIgY29sbGVjdGlvbnMgPSBhcnJDb3B5KGFyZ3VtZW50cyk7XG4gICAgY29sbGVjdGlvbnNbMF0gPSB0aGlzO1xuICAgIHJldHVybiByZWlmeSh0aGlzLCB6aXBXaXRoRmFjdG9yeSh0aGlzLCB6aXBwZXIsIGNvbGxlY3Rpb25zKSk7XG4gIH0sXG59KTtcblxudmFyIEluZGV4ZWRDb2xsZWN0aW9uUHJvdG90eXBlID0gSW5kZXhlZENvbGxlY3Rpb24ucHJvdG90eXBlO1xuSW5kZXhlZENvbGxlY3Rpb25Qcm90b3R5cGVbSVNfSU5ERVhFRF9TWU1CT0xdID0gdHJ1ZTtcbkluZGV4ZWRDb2xsZWN0aW9uUHJvdG90eXBlW0lTX09SREVSRURfU1lNQk9MXSA9IHRydWU7XG5cbm1peGluKFNldENvbGxlY3Rpb24sIHtcbiAgLy8gIyMjIEVTNiBDb2xsZWN0aW9uIG1ldGhvZHMgKEVTNiBBcnJheSBhbmQgTWFwKVxuXG4gIGdldDogZnVuY3Rpb24gZ2V0KHZhbHVlLCBub3RTZXRWYWx1ZSkge1xuICAgIHJldHVybiB0aGlzLmhhcyh2YWx1ZSkgPyB2YWx1ZSA6IG5vdFNldFZhbHVlO1xuICB9LFxuXG4gIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyh2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLmhhcyh2YWx1ZSk7XG4gIH0sXG5cbiAgLy8gIyMjIE1vcmUgc2VxdWVudGlhbCBtZXRob2RzXG5cbiAga2V5U2VxOiBmdW5jdGlvbiBrZXlTZXEoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVTZXEoKTtcbiAgfSxcbn0pO1xuXG5TZXRDb2xsZWN0aW9uLnByb3RvdHlwZS5oYXMgPSBDb2xsZWN0aW9uUHJvdG90eXBlLmluY2x1ZGVzO1xuU2V0Q29sbGVjdGlvbi5wcm90b3R5cGUuY29udGFpbnMgPSBTZXRDb2xsZWN0aW9uLnByb3RvdHlwZS5pbmNsdWRlcztcblxuLy8gTWl4aW4gc3ViY2xhc3Nlc1xuXG5taXhpbihLZXllZFNlcSwgS2V5ZWRDb2xsZWN0aW9uLnByb3RvdHlwZSk7XG5taXhpbihJbmRleGVkU2VxLCBJbmRleGVkQ29sbGVjdGlvbi5wcm90b3R5cGUpO1xubWl4aW4oU2V0U2VxLCBTZXRDb2xsZWN0aW9uLnByb3RvdHlwZSk7XG5cbi8vICNwcmFnbWEgSGVscGVyIGZ1bmN0aW9uc1xuXG5mdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbiwgcmVkdWNlciwgcmVkdWN0aW9uLCBjb250ZXh0LCB1c2VGaXJzdCwgcmV2ZXJzZSkge1xuICBhc3NlcnROb3RJbmZpbml0ZShjb2xsZWN0aW9uLnNpemUpO1xuICBjb2xsZWN0aW9uLl9faXRlcmF0ZShmdW5jdGlvbiAodiwgaywgYykge1xuICAgIGlmICh1c2VGaXJzdCkge1xuICAgICAgdXNlRmlyc3QgPSBmYWxzZTtcbiAgICAgIHJlZHVjdGlvbiA9IHY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZHVjdGlvbiA9IHJlZHVjZXIuY2FsbChjb250ZXh0LCByZWR1Y3Rpb24sIHYsIGssIGMpO1xuICAgIH1cbiAgfSwgcmV2ZXJzZSk7XG4gIHJldHVybiByZWR1Y3Rpb247XG59XG5cbmZ1bmN0aW9uIGtleU1hcHBlcih2LCBrKSB7XG4gIHJldHVybiBrO1xufVxuXG5mdW5jdGlvbiBlbnRyeU1hcHBlcih2LCBrKSB7XG4gIHJldHVybiBbaywgdl07XG59XG5cbmZ1bmN0aW9uIG5vdChwcmVkaWNhdGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAhcHJlZGljYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIG5lZyhwcmVkaWNhdGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAtcHJlZGljYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRaaXBwZXIoKSB7XG4gIHJldHVybiBhcnJDb3B5KGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHROZWdDb21wYXJhdG9yKGEsIGIpIHtcbiAgcmV0dXJuIGEgPCBiID8gMSA6IGEgPiBiID8gLTEgOiAwO1xufVxuXG5mdW5jdGlvbiBoYXNoQ29sbGVjdGlvbihjb2xsZWN0aW9uKSB7XG4gIGlmIChjb2xsZWN0aW9uLnNpemUgPT09IEluZmluaXR5KSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgdmFyIG9yZGVyZWQgPSBpc09yZGVyZWQoY29sbGVjdGlvbik7XG4gIHZhciBrZXllZCA9IGlzS2V5ZWQoY29sbGVjdGlvbik7XG4gIHZhciBoID0gb3JkZXJlZCA/IDEgOiAwO1xuICB2YXIgc2l6ZSA9IGNvbGxlY3Rpb24uX19pdGVyYXRlKFxuICAgIGtleWVkXG4gICAgICA/IG9yZGVyZWRcbiAgICAgICAgPyBmdW5jdGlvbiAodiwgaykge1xuICAgICAgICAgICAgaCA9ICgzMSAqIGggKyBoYXNoTWVyZ2UoaGFzaCh2KSwgaGFzaChrKSkpIHwgMDtcbiAgICAgICAgICB9XG4gICAgICAgIDogZnVuY3Rpb24gKHYsIGspIHtcbiAgICAgICAgICAgIGggPSAoaCArIGhhc2hNZXJnZShoYXNoKHYpLCBoYXNoKGspKSkgfCAwO1xuICAgICAgICAgIH1cbiAgICAgIDogb3JkZXJlZFxuICAgICAgICA/IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICBoID0gKDMxICogaCArIGhhc2godikpIHwgMDtcbiAgICAgICAgICB9XG4gICAgICAgIDogZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgIGggPSAoaCArIGhhc2godikpIHwgMDtcbiAgICAgICAgICB9XG4gICk7XG4gIHJldHVybiBtdXJtdXJIYXNoT2ZTaXplKHNpemUsIGgpO1xufVxuXG5mdW5jdGlvbiBtdXJtdXJIYXNoT2ZTaXplKHNpemUsIGgpIHtcbiAgaCA9IGltdWwoaCwgMHhjYzllMmQ1MSk7XG4gIGggPSBpbXVsKChoIDw8IDE1KSB8IChoID4+PiAtMTUpLCAweDFiODczNTkzKTtcbiAgaCA9IGltdWwoKGggPDwgMTMpIHwgKGggPj4+IC0xMyksIDUpO1xuICBoID0gKChoICsgMHhlNjU0NmI2NCkgfCAwKSBeIHNpemU7XG4gIGggPSBpbXVsKGggXiAoaCA+Pj4gMTYpLCAweDg1ZWJjYTZiKTtcbiAgaCA9IGltdWwoaCBeIChoID4+PiAxMyksIDB4YzJiMmFlMzUpO1xuICBoID0gc21pKGggXiAoaCA+Pj4gMTYpKTtcbiAgcmV0dXJuIGg7XG59XG5cbmZ1bmN0aW9uIGhhc2hNZXJnZShhLCBiKSB7XG4gIHJldHVybiAoYSBeIChiICsgMHg5ZTM3NzliOSArIChhIDw8IDYpICsgKGEgPj4gMikpKSB8IDA7IC8vIGludFxufVxuXG52YXIgT3JkZXJlZFNldCA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKFNldCQkMSkge1xuICBmdW5jdGlvbiBPcmRlcmVkU2V0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgID8gZW1wdHlPcmRlcmVkU2V0KClcbiAgICAgIDogaXNPcmRlcmVkU2V0KHZhbHVlKVxuICAgICAgICA/IHZhbHVlXG4gICAgICAgIDogZW1wdHlPcmRlcmVkU2V0KCkud2l0aE11dGF0aW9ucyhmdW5jdGlvbiAoc2V0KSB7XG4gICAgICAgICAgICB2YXIgaXRlciA9IFNldENvbGxlY3Rpb24odmFsdWUpO1xuICAgICAgICAgICAgYXNzZXJ0Tm90SW5maW5pdGUoaXRlci5zaXplKTtcbiAgICAgICAgICAgIGl0ZXIuZm9yRWFjaChmdW5jdGlvbiAodikgeyByZXR1cm4gc2V0LmFkZCh2KTsgfSk7XG4gICAgICAgICAgfSk7XG4gIH1cblxuICBpZiAoIFNldCQkMSApIE9yZGVyZWRTZXQuX19wcm90b19fID0gU2V0JCQxO1xuICBPcmRlcmVkU2V0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFNldCQkMSAmJiBTZXQkJDEucHJvdG90eXBlICk7XG4gIE9yZGVyZWRTZXQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gT3JkZXJlZFNldDtcblxuICBPcmRlcmVkU2V0Lm9mID0gZnVuY3Rpb24gb2YgKC8qLi4udmFsdWVzKi8pIHtcbiAgICByZXR1cm4gdGhpcyhhcmd1bWVudHMpO1xuICB9O1xuXG4gIE9yZGVyZWRTZXQuZnJvbUtleXMgPSBmdW5jdGlvbiBmcm9tS2V5cyAodmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcyhLZXllZENvbGxlY3Rpb24odmFsdWUpLmtleVNlcSgpKTtcbiAgfTtcblxuICBPcmRlcmVkU2V0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCdPcmRlcmVkU2V0IHsnLCAnfScpO1xuICB9O1xuXG4gIHJldHVybiBPcmRlcmVkU2V0O1xufShTZXQpKTtcblxuT3JkZXJlZFNldC5pc09yZGVyZWRTZXQgPSBpc09yZGVyZWRTZXQ7XG5cbnZhciBPcmRlcmVkU2V0UHJvdG90eXBlID0gT3JkZXJlZFNldC5wcm90b3R5cGU7XG5PcmRlcmVkU2V0UHJvdG90eXBlW0lTX09SREVSRURfU1lNQk9MXSA9IHRydWU7XG5PcmRlcmVkU2V0UHJvdG90eXBlLnppcCA9IEluZGV4ZWRDb2xsZWN0aW9uUHJvdG90eXBlLnppcDtcbk9yZGVyZWRTZXRQcm90b3R5cGUuemlwV2l0aCA9IEluZGV4ZWRDb2xsZWN0aW9uUHJvdG90eXBlLnppcFdpdGg7XG5cbk9yZGVyZWRTZXRQcm90b3R5cGUuX19lbXB0eSA9IGVtcHR5T3JkZXJlZFNldDtcbk9yZGVyZWRTZXRQcm90b3R5cGUuX19tYWtlID0gbWFrZU9yZGVyZWRTZXQ7XG5cbmZ1bmN0aW9uIG1ha2VPcmRlcmVkU2V0KG1hcCwgb3duZXJJRCkge1xuICB2YXIgc2V0ID0gT2JqZWN0LmNyZWF0ZShPcmRlcmVkU2V0UHJvdG90eXBlKTtcbiAgc2V0LnNpemUgPSBtYXAgPyBtYXAuc2l6ZSA6IDA7XG4gIHNldC5fbWFwID0gbWFwO1xuICBzZXQuX19vd25lcklEID0gb3duZXJJRDtcbiAgcmV0dXJuIHNldDtcbn1cblxudmFyIEVNUFRZX09SREVSRURfU0VUO1xuZnVuY3Rpb24gZW1wdHlPcmRlcmVkU2V0KCkge1xuICByZXR1cm4gKFxuICAgIEVNUFRZX09SREVSRURfU0VUIHx8IChFTVBUWV9PUkRFUkVEX1NFVCA9IG1ha2VPcmRlcmVkU2V0KGVtcHR5T3JkZXJlZE1hcCgpKSlcbiAgKTtcbn1cblxudmFyIFJlY29yZCA9IGZ1bmN0aW9uIFJlY29yZChkZWZhdWx0VmFsdWVzLCBuYW1lKSB7XG4gIHZhciBoYXNJbml0aWFsaXplZDtcblxuICB2YXIgUmVjb3JkVHlwZSA9IGZ1bmN0aW9uIFJlY29yZCh2YWx1ZXMpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIGlmICh2YWx1ZXMgaW5zdGFuY2VvZiBSZWNvcmRUeXBlKSB7XG4gICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVjb3JkVHlwZSkpIHtcbiAgICAgIHJldHVybiBuZXcgUmVjb3JkVHlwZSh2YWx1ZXMpO1xuICAgIH1cbiAgICBpZiAoIWhhc0luaXRpYWxpemVkKSB7XG4gICAgICBoYXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGRlZmF1bHRWYWx1ZXMpO1xuICAgICAgdmFyIGluZGljZXMgPSAoUmVjb3JkVHlwZVByb3RvdHlwZS5faW5kaWNlcyA9IHt9KTtcbiAgICAgIC8vIERlcHJlY2F0ZWQ6IGxlZnQgdG8gYXR0ZW1wdCBub3QgdG8gYnJlYWsgYW55IGV4dGVybmFsIGNvZGUgd2hpY2hcbiAgICAgIC8vIHJlbGllcyBvbiBhIC5fbmFtZSBwcm9wZXJ0eSBleGlzdGluZyBvbiByZWNvcmQgaW5zdGFuY2VzLlxuICAgICAgLy8gVXNlIFJlY29yZC5nZXREZXNjcmlwdGl2ZU5hbWUoKSBpbnN0ZWFkXG4gICAgICBSZWNvcmRUeXBlUHJvdG90eXBlLl9uYW1lID0gbmFtZTtcbiAgICAgIFJlY29yZFR5cGVQcm90b3R5cGUuX2tleXMgPSBrZXlzO1xuICAgICAgUmVjb3JkVHlwZVByb3RvdHlwZS5fZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRWYWx1ZXM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHByb3BOYW1lID0ga2V5c1tpXTtcbiAgICAgICAgaW5kaWNlc1twcm9wTmFtZV0gPSBpO1xuICAgICAgICBpZiAoUmVjb3JkVHlwZVByb3RvdHlwZVtwcm9wTmFtZV0pIHtcbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gICAgICAgICAgdHlwZW9mIGNvbnNvbGUgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICBjb25zb2xlLndhcm4gJiZcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgJ0Nhbm5vdCBkZWZpbmUgJyArXG4gICAgICAgICAgICAgICAgcmVjb3JkTmFtZSh0aGlzKSArXG4gICAgICAgICAgICAgICAgJyB3aXRoIHByb3BlcnR5IFwiJyArXG4gICAgICAgICAgICAgICAgcHJvcE5hbWUgK1xuICAgICAgICAgICAgICAgICdcIiBzaW5jZSB0aGF0IHByb3BlcnR5IG5hbWUgaXMgcGFydCBvZiB0aGUgUmVjb3JkIEFQSS4nXG4gICAgICAgICAgICApO1xuICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldFByb3AoUmVjb3JkVHlwZVByb3RvdHlwZSwgcHJvcE5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX19vd25lcklEID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3ZhbHVlcyA9IExpc3QoKS53aXRoTXV0YXRpb25zKGZ1bmN0aW9uIChsKSB7XG4gICAgICBsLnNldFNpemUodGhpcyQxLl9rZXlzLmxlbmd0aCk7XG4gICAgICBLZXllZENvbGxlY3Rpb24odmFsdWVzKS5mb3JFYWNoKGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICAgIGwuc2V0KHRoaXMkMS5faW5kaWNlc1trXSwgdiA9PT0gdGhpcyQxLl9kZWZhdWx0VmFsdWVzW2tdID8gdW5kZWZpbmVkIDogdik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgUmVjb3JkVHlwZVByb3RvdHlwZSA9IChSZWNvcmRUeXBlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoXG4gICAgUmVjb3JkUHJvdG90eXBlXG4gICkpO1xuICBSZWNvcmRUeXBlUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmVjb3JkVHlwZTtcblxuICBpZiAobmFtZSkge1xuICAgIFJlY29yZFR5cGUuZGlzcGxheU5hbWUgPSBuYW1lO1xuICB9XG5cbiAgcmV0dXJuIFJlY29yZFR5cGU7XG59O1xuXG5SZWNvcmQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgc3RyID0gcmVjb3JkTmFtZSh0aGlzKSArICcgeyAnO1xuICB2YXIga2V5cyA9IHRoaXMuX2tleXM7XG4gIHZhciBrO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpICE9PSBsOyBpKyspIHtcbiAgICBrID0ga2V5c1tpXTtcbiAgICBzdHIgKz0gKGkgPyAnLCAnIDogJycpICsgayArICc6ICcgKyBxdW90ZVN0cmluZyh0aGlzLmdldChrKSk7XG4gIH1cbiAgcmV0dXJuIHN0ciArICcgfSc7XG59O1xuXG5SZWNvcmQucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAob3RoZXIpIHtcbiAgcmV0dXJuIChcbiAgICB0aGlzID09PSBvdGhlciB8fFxuICAgIChvdGhlciAmJlxuICAgICAgdGhpcy5fa2V5cyA9PT0gb3RoZXIuX2tleXMgJiZcbiAgICAgIHJlY29yZFNlcSh0aGlzKS5lcXVhbHMocmVjb3JkU2VxKG90aGVyKSkpXG4gICk7XG59O1xuXG5SZWNvcmQucHJvdG90eXBlLmhhc2hDb2RlID0gZnVuY3Rpb24gaGFzaENvZGUgKCkge1xuICByZXR1cm4gcmVjb3JkU2VxKHRoaXMpLmhhc2hDb2RlKCk7XG59O1xuXG4vLyBAcHJhZ21hIEFjY2Vzc1xuXG5SZWNvcmQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIGhhcyAoaykge1xuICByZXR1cm4gdGhpcy5faW5kaWNlcy5oYXNPd25Qcm9wZXJ0eShrKTtcbn07XG5cblJlY29yZC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChrLCBub3RTZXRWYWx1ZSkge1xuICBpZiAoIXRoaXMuaGFzKGspKSB7XG4gICAgcmV0dXJuIG5vdFNldFZhbHVlO1xuICB9XG4gIHZhciBpbmRleCA9IHRoaXMuX2luZGljZXNba107XG4gIHZhciB2YWx1ZSA9IHRoaXMuX3ZhbHVlcy5nZXQoaW5kZXgpO1xuICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHRoaXMuX2RlZmF1bHRWYWx1ZXNba10gOiB2YWx1ZTtcbn07XG5cbi8vIEBwcmFnbWEgTW9kaWZpY2F0aW9uXG5cblJlY29yZC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gc2V0IChrLCB2KSB7XG4gIGlmICh0aGlzLmhhcyhrKSkge1xuICAgIHZhciBuZXdWYWx1ZXMgPSB0aGlzLl92YWx1ZXMuc2V0KFxuICAgICAgdGhpcy5faW5kaWNlc1trXSxcbiAgICAgIHYgPT09IHRoaXMuX2RlZmF1bHRWYWx1ZXNba10gPyB1bmRlZmluZWQgOiB2XG4gICAgKTtcbiAgICBpZiAobmV3VmFsdWVzICE9PSB0aGlzLl92YWx1ZXMgJiYgIXRoaXMuX19vd25lcklEKSB7XG4gICAgICByZXR1cm4gbWFrZVJlY29yZCh0aGlzLCBuZXdWYWx1ZXMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cblJlY29yZC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlIChrKSB7XG4gIHJldHVybiB0aGlzLnNldChrKTtcbn07XG5cblJlY29yZC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiBjbGVhciAoKSB7XG4gIHZhciBuZXdWYWx1ZXMgPSB0aGlzLl92YWx1ZXMuY2xlYXIoKS5zZXRTaXplKHRoaXMuX2tleXMubGVuZ3RoKTtcbiAgcmV0dXJuIHRoaXMuX19vd25lcklEID8gdGhpcyA6IG1ha2VSZWNvcmQodGhpcywgbmV3VmFsdWVzKTtcbn07XG5cblJlY29yZC5wcm90b3R5cGUud2FzQWx0ZXJlZCA9IGZ1bmN0aW9uIHdhc0FsdGVyZWQgKCkge1xuICByZXR1cm4gdGhpcy5fdmFsdWVzLndhc0FsdGVyZWQoKTtcbn07XG5cblJlY29yZC5wcm90b3R5cGUudG9TZXEgPSBmdW5jdGlvbiB0b1NlcSAoKSB7XG4gIHJldHVybiByZWNvcmRTZXEodGhpcyk7XG59O1xuXG5SZWNvcmQucHJvdG90eXBlLnRvSlMgPSBmdW5jdGlvbiB0b0pTJDEgKCkge1xuICByZXR1cm4gdG9KUyh0aGlzKTtcbn07XG5cblJlY29yZC5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uIGVudHJpZXMgKCkge1xuICByZXR1cm4gdGhpcy5fX2l0ZXJhdG9yKElURVJBVEVfRU5UUklFUyk7XG59O1xuXG5SZWNvcmQucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbiBfX2l0ZXJhdG9yICh0eXBlLCByZXZlcnNlKSB7XG4gIHJldHVybiByZWNvcmRTZXEodGhpcykuX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbn07XG5cblJlY29yZC5wcm90b3R5cGUuX19pdGVyYXRlID0gZnVuY3Rpb24gX19pdGVyYXRlIChmbiwgcmV2ZXJzZSkge1xuICByZXR1cm4gcmVjb3JkU2VxKHRoaXMpLl9faXRlcmF0ZShmbiwgcmV2ZXJzZSk7XG59O1xuXG5SZWNvcmQucHJvdG90eXBlLl9fZW5zdXJlT3duZXIgPSBmdW5jdGlvbiBfX2Vuc3VyZU93bmVyIChvd25lcklEKSB7XG4gIGlmIChvd25lcklEID09PSB0aGlzLl9fb3duZXJJRCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHZhciBuZXdWYWx1ZXMgPSB0aGlzLl92YWx1ZXMuX19lbnN1cmVPd25lcihvd25lcklEKTtcbiAgaWYgKCFvd25lcklEKSB7XG4gICAgdGhpcy5fX293bmVySUQgPSBvd25lcklEO1xuICAgIHRoaXMuX3ZhbHVlcyA9IG5ld1ZhbHVlcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICByZXR1cm4gbWFrZVJlY29yZCh0aGlzLCBuZXdWYWx1ZXMsIG93bmVySUQpO1xufTtcblxuUmVjb3JkLmlzUmVjb3JkID0gaXNSZWNvcmQ7XG5SZWNvcmQuZ2V0RGVzY3JpcHRpdmVOYW1lID0gcmVjb3JkTmFtZTtcbnZhciBSZWNvcmRQcm90b3R5cGUgPSBSZWNvcmQucHJvdG90eXBlO1xuUmVjb3JkUHJvdG90eXBlW0lTX1JFQ09SRF9TWU1CT0xdID0gdHJ1ZTtcblJlY29yZFByb3RvdHlwZVtERUxFVEVdID0gUmVjb3JkUHJvdG90eXBlLnJlbW92ZTtcblJlY29yZFByb3RvdHlwZS5kZWxldGVJbiA9IFJlY29yZFByb3RvdHlwZS5yZW1vdmVJbiA9IGRlbGV0ZUluO1xuUmVjb3JkUHJvdG90eXBlLmdldEluID0gZ2V0SW4kMTtcblJlY29yZFByb3RvdHlwZS5oYXNJbiA9IENvbGxlY3Rpb25Qcm90b3R5cGUuaGFzSW47XG5SZWNvcmRQcm90b3R5cGUubWVyZ2UgPSBtZXJnZTtcblJlY29yZFByb3RvdHlwZS5tZXJnZVdpdGggPSBtZXJnZVdpdGg7XG5SZWNvcmRQcm90b3R5cGUubWVyZ2VJbiA9IG1lcmdlSW47XG5SZWNvcmRQcm90b3R5cGUubWVyZ2VEZWVwID0gbWVyZ2VEZWVwJDE7XG5SZWNvcmRQcm90b3R5cGUubWVyZ2VEZWVwV2l0aCA9IG1lcmdlRGVlcFdpdGgkMTtcblJlY29yZFByb3RvdHlwZS5tZXJnZURlZXBJbiA9IG1lcmdlRGVlcEluO1xuUmVjb3JkUHJvdG90eXBlLnNldEluID0gc2V0SW4kMTtcblJlY29yZFByb3RvdHlwZS51cGRhdGUgPSB1cGRhdGUkMTtcblJlY29yZFByb3RvdHlwZS51cGRhdGVJbiA9IHVwZGF0ZUluJDE7XG5SZWNvcmRQcm90b3R5cGUud2l0aE11dGF0aW9ucyA9IHdpdGhNdXRhdGlvbnM7XG5SZWNvcmRQcm90b3R5cGUuYXNNdXRhYmxlID0gYXNNdXRhYmxlO1xuUmVjb3JkUHJvdG90eXBlLmFzSW1tdXRhYmxlID0gYXNJbW11dGFibGU7XG5SZWNvcmRQcm90b3R5cGVbSVRFUkFUT1JfU1lNQk9MXSA9IFJlY29yZFByb3RvdHlwZS5lbnRyaWVzO1xuUmVjb3JkUHJvdG90eXBlLnRvSlNPTiA9IFJlY29yZFByb3RvdHlwZS50b09iamVjdCA9XG4gIENvbGxlY3Rpb25Qcm90b3R5cGUudG9PYmplY3Q7XG5SZWNvcmRQcm90b3R5cGUuaW5zcGVjdCA9IFJlY29yZFByb3RvdHlwZS50b1NvdXJjZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy50b1N0cmluZygpO1xufTtcblxuZnVuY3Rpb24gbWFrZVJlY29yZChsaWtlUmVjb3JkLCB2YWx1ZXMsIG93bmVySUQpIHtcbiAgdmFyIHJlY29yZCA9IE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKGxpa2VSZWNvcmQpKTtcbiAgcmVjb3JkLl92YWx1ZXMgPSB2YWx1ZXM7XG4gIHJlY29yZC5fX293bmVySUQgPSBvd25lcklEO1xuICByZXR1cm4gcmVjb3JkO1xufVxuXG5mdW5jdGlvbiByZWNvcmROYW1lKHJlY29yZCkge1xuICByZXR1cm4gcmVjb3JkLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IHJlY29yZC5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdSZWNvcmQnO1xufVxuXG5mdW5jdGlvbiByZWNvcmRTZXEocmVjb3JkKSB7XG4gIHJldHVybiBrZXllZFNlcUZyb21WYWx1ZShyZWNvcmQuX2tleXMubWFwKGZ1bmN0aW9uIChrKSB7IHJldHVybiBbaywgcmVjb3JkLmdldChrKV07IH0pKTtcbn1cblxuZnVuY3Rpb24gc2V0UHJvcChwcm90b3R5cGUsIG5hbWUpIHtcbiAgdHJ5IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCBuYW1lLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXQobmFtZSk7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5fX293bmVySUQsICdDYW5ub3Qgc2V0IG9uIGFuIGltbXV0YWJsZSByZWNvcmQuJyk7XG4gICAgICAgIHRoaXMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gT2JqZWN0LmRlZmluZVByb3BlcnR5IGZhaWxlZC4gUHJvYmFibHkgSUU4LlxuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGxhenkgU2VxIG9mIGB2YWx1ZWAgcmVwZWF0ZWQgYHRpbWVzYCB0aW1lcy4gV2hlbiBgdGltZXNgIGlzXG4gKiB1bmRlZmluZWQsIHJldHVybnMgYW4gaW5maW5pdGUgc2VxdWVuY2Ugb2YgYHZhbHVlYC5cbiAqL1xudmFyIFJlcGVhdCA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEluZGV4ZWRTZXEkJDEpIHtcbiAgZnVuY3Rpb24gUmVwZWF0KHZhbHVlLCB0aW1lcykge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZXBlYXQpKSB7XG4gICAgICByZXR1cm4gbmV3IFJlcGVhdCh2YWx1ZSwgdGltZXMpO1xuICAgIH1cbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuc2l6ZSA9IHRpbWVzID09PSB1bmRlZmluZWQgPyBJbmZpbml0eSA6IE1hdGgubWF4KDAsIHRpbWVzKTtcbiAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICBpZiAoRU1QVFlfUkVQRUFUKSB7XG4gICAgICAgIHJldHVybiBFTVBUWV9SRVBFQVQ7XG4gICAgICB9XG4gICAgICBFTVBUWV9SRVBFQVQgPSB0aGlzO1xuICAgIH1cbiAgfVxuXG4gIGlmICggSW5kZXhlZFNlcSQkMSApIFJlcGVhdC5fX3Byb3RvX18gPSBJbmRleGVkU2VxJCQxO1xuICBSZXBlYXQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggSW5kZXhlZFNlcSQkMSAmJiBJbmRleGVkU2VxJCQxLnByb3RvdHlwZSApO1xuICBSZXBlYXQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmVwZWF0O1xuXG4gIFJlcGVhdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuICdSZXBlYXQgW10nO1xuICAgIH1cbiAgICByZXR1cm4gJ1JlcGVhdCBbICcgKyB0aGlzLl92YWx1ZSArICcgJyArIHRoaXMuc2l6ZSArICcgdGltZXMgXSc7XG4gIH07XG5cbiAgUmVwZWF0LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKGluZGV4LCBub3RTZXRWYWx1ZSkge1xuICAgIHJldHVybiB0aGlzLmhhcyhpbmRleCkgPyB0aGlzLl92YWx1ZSA6IG5vdFNldFZhbHVlO1xuICB9O1xuXG4gIFJlcGVhdC5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAoc2VhcmNoVmFsdWUpIHtcbiAgICByZXR1cm4gaXModGhpcy5fdmFsdWUsIHNlYXJjaFZhbHVlKTtcbiAgfTtcblxuICBSZXBlYXQucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKGJlZ2luLCBlbmQpIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICByZXR1cm4gd2hvbGVTbGljZShiZWdpbiwgZW5kLCBzaXplKVxuICAgICAgPyB0aGlzXG4gICAgICA6IG5ldyBSZXBlYXQoXG4gICAgICAgICAgdGhpcy5fdmFsdWUsXG4gICAgICAgICAgcmVzb2x2ZUVuZChlbmQsIHNpemUpIC0gcmVzb2x2ZUJlZ2luKGJlZ2luLCBzaXplKVxuICAgICAgICApO1xuICB9O1xuXG4gIFJlcGVhdC5wcm90b3R5cGUucmV2ZXJzZSA9IGZ1bmN0aW9uIHJldmVyc2UgKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIFJlcGVhdC5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHNlYXJjaFZhbHVlKSB7XG4gICAgaWYgKGlzKHRoaXMuX3ZhbHVlLCBzZWFyY2hWYWx1ZSkpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH07XG5cbiAgUmVwZWF0LnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mIChzZWFyY2hWYWx1ZSkge1xuICAgIGlmIChpcyh0aGlzLl92YWx1ZSwgc2VhcmNoVmFsdWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaXplO1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH07XG5cbiAgUmVwZWF0LnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbiBfX2l0ZXJhdGUgKGZuLCByZXZlcnNlKSB7XG4gICAgdmFyIHNpemUgPSB0aGlzLnNpemU7XG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChpICE9PSBzaXplKSB7XG4gICAgICBpZiAoZm4odGhpcy5fdmFsdWUsIHJldmVyc2UgPyBzaXplIC0gKytpIDogaSsrLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpO1xuICB9O1xuXG4gIFJlcGVhdC5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uIF9faXRlcmF0b3IgKHR5cGUsIHJldmVyc2UpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciBzaXplID0gdGhpcy5zaXplO1xuICAgIHZhciBpID0gMDtcbiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKFxuICAgICAgZnVuY3Rpb24gKCkgeyByZXR1cm4gaSA9PT0gc2l6ZVxuICAgICAgICAgID8gaXRlcmF0b3JEb25lKClcbiAgICAgICAgICA6IGl0ZXJhdG9yVmFsdWUodHlwZSwgcmV2ZXJzZSA/IHNpemUgLSArK2kgOiBpKyssIHRoaXMkMS5fdmFsdWUpOyB9XG4gICAgKTtcbiAgfTtcblxuICBSZXBlYXQucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAob3RoZXIpIHtcbiAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBSZXBlYXRcbiAgICAgID8gaXModGhpcy5fdmFsdWUsIG90aGVyLl92YWx1ZSlcbiAgICAgIDogZGVlcEVxdWFsKG90aGVyKTtcbiAgfTtcblxuICByZXR1cm4gUmVwZWF0O1xufShJbmRleGVkU2VxKSk7XG5cbnZhciBFTVBUWV9SRVBFQVQ7XG5cbmZ1bmN0aW9uIGZyb21KUyh2YWx1ZSwgY29udmVydGVyKSB7XG4gIHJldHVybiBmcm9tSlNXaXRoKFxuICAgIFtdLFxuICAgIGNvbnZlcnRlciB8fCBkZWZhdWx0Q29udmVydGVyLFxuICAgIHZhbHVlLFxuICAgICcnLFxuICAgIGNvbnZlcnRlciAmJiBjb252ZXJ0ZXIubGVuZ3RoID4gMiA/IFtdIDogdW5kZWZpbmVkLFxuICAgIHsgJyc6IHZhbHVlIH1cbiAgKTtcbn1cblxuZnVuY3Rpb24gZnJvbUpTV2l0aChzdGFjaywgY29udmVydGVyLCB2YWx1ZSwga2V5LCBrZXlQYXRoLCBwYXJlbnRWYWx1ZSkge1xuICB2YXIgdG9TZXEgPSBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgID8gSW5kZXhlZFNlcVxuICAgIDogaXNQbGFpbk9iaih2YWx1ZSlcbiAgICAgID8gS2V5ZWRTZXFcbiAgICAgIDogbnVsbDtcbiAgaWYgKHRvU2VxKSB7XG4gICAgaWYgKH5zdGFjay5pbmRleE9mKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEltbXV0YWJsZScpO1xuICAgIH1cbiAgICBzdGFjay5wdXNoKHZhbHVlKTtcbiAgICBrZXlQYXRoICYmIGtleSAhPT0gJycgJiYga2V5UGF0aC5wdXNoKGtleSk7XG4gICAgdmFyIGNvbnZlcnRlZCA9IGNvbnZlcnRlci5jYWxsKFxuICAgICAgcGFyZW50VmFsdWUsXG4gICAgICBrZXksXG4gICAgICB0b1NlcSh2YWx1ZSkubWFwKGZ1bmN0aW9uICh2LCBrKSB7IHJldHVybiBmcm9tSlNXaXRoKHN0YWNrLCBjb252ZXJ0ZXIsIHYsIGssIGtleVBhdGgsIHZhbHVlKTsgfVxuICAgICAgKSxcbiAgICAgIGtleVBhdGggJiYga2V5UGF0aC5zbGljZSgpXG4gICAgKTtcbiAgICBzdGFjay5wb3AoKTtcbiAgICBrZXlQYXRoICYmIGtleVBhdGgucG9wKCk7XG4gICAgcmV0dXJuIGNvbnZlcnRlZDtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRDb252ZXJ0ZXIoaywgdikge1xuICByZXR1cm4gaXNLZXllZCh2KSA/IHYudG9NYXAoKSA6IHYudG9MaXN0KCk7XG59XG5cbnZhciB2ZXJzaW9uID0gXCI0LjAuMC1yYy4xMVwiO1xuXG52YXIgSW1tdXRhYmxlID0ge1xuICB2ZXJzaW9uOiB2ZXJzaW9uLFxuXG4gIENvbGxlY3Rpb246IENvbGxlY3Rpb24sXG4gIC8vIE5vdGU6IEl0ZXJhYmxlIGlzIGRlcHJlY2F0ZWRcbiAgSXRlcmFibGU6IENvbGxlY3Rpb24sXG5cbiAgU2VxOiBTZXEsXG4gIE1hcDogTWFwLFxuICBPcmRlcmVkTWFwOiBPcmRlcmVkTWFwLFxuICBMaXN0OiBMaXN0LFxuICBTdGFjazogU3RhY2ssXG4gIFNldDogU2V0LFxuICBPcmRlcmVkU2V0OiBPcmRlcmVkU2V0LFxuXG4gIFJlY29yZDogUmVjb3JkLFxuICBSYW5nZTogUmFuZ2UsXG4gIFJlcGVhdDogUmVwZWF0LFxuXG4gIGlzOiBpcyxcbiAgZnJvbUpTOiBmcm9tSlMsXG4gIGhhc2g6IGhhc2gsXG5cbiAgaXNJbW11dGFibGU6IGlzSW1tdXRhYmxlLFxuICBpc0NvbGxlY3Rpb246IGlzQ29sbGVjdGlvbixcbiAgaXNLZXllZDogaXNLZXllZCxcbiAgaXNJbmRleGVkOiBpc0luZGV4ZWQsXG4gIGlzQXNzb2NpYXRpdmU6IGlzQXNzb2NpYXRpdmUsXG4gIGlzT3JkZXJlZDogaXNPcmRlcmVkLFxuICBpc1ZhbHVlT2JqZWN0OiBpc1ZhbHVlT2JqZWN0LFxuICBpc1NlcTogaXNTZXEsXG4gIGlzTGlzdDogaXNMaXN0LFxuICBpc01hcDogaXNNYXAsXG4gIGlzT3JkZXJlZE1hcDogaXNPcmRlcmVkTWFwLFxuICBpc1N0YWNrOiBpc1N0YWNrLFxuICBpc1NldDogaXNTZXQsXG4gIGlzT3JkZXJlZFNldDogaXNPcmRlcmVkU2V0LFxuICBpc1JlY29yZDogaXNSZWNvcmQsXG5cbiAgZ2V0OiBnZXQsXG4gIGdldEluOiBnZXRJbixcbiAgaGFzOiBoYXMsXG4gIGhhc0luOiBoYXNJbixcbiAgbWVyZ2U6IG1lcmdlJDEsXG4gIG1lcmdlRGVlcDogbWVyZ2VEZWVwLFxuICBtZXJnZVdpdGg6IG1lcmdlV2l0aCQxLFxuICBtZXJnZURlZXBXaXRoOiBtZXJnZURlZXBXaXRoLFxuICByZW1vdmU6IHJlbW92ZSxcbiAgcmVtb3ZlSW46IHJlbW92ZUluLFxuICBzZXQ6IHNldCxcbiAgc2V0SW46IHNldEluLFxuICB1cGRhdGU6IHVwZGF0ZSxcbiAgdXBkYXRlSW46IHVwZGF0ZUluLFxufTtcblxuLy8gTm90ZTogSXRlcmFibGUgaXMgZGVwcmVjYXRlZFxudmFyIEl0ZXJhYmxlID0gQ29sbGVjdGlvbjtcblxuZXhwb3J0IGRlZmF1bHQgSW1tdXRhYmxlO1xuZXhwb3J0IHsgdmVyc2lvbiwgQ29sbGVjdGlvbiwgSXRlcmFibGUsIFNlcSwgTWFwLCBPcmRlcmVkTWFwLCBMaXN0LCBTdGFjaywgU2V0LCBPcmRlcmVkU2V0LCBSZWNvcmQsIFJhbmdlLCBSZXBlYXQsIGlzLCBmcm9tSlMsIGhhc2gsIGlzSW1tdXRhYmxlLCBpc0NvbGxlY3Rpb24sIGlzS2V5ZWQsIGlzSW5kZXhlZCwgaXNBc3NvY2lhdGl2ZSwgaXNPcmRlcmVkLCBpc1ZhbHVlT2JqZWN0LCBnZXQsIGdldEluLCBoYXMsIGhhc0luLCBtZXJnZSQxIGFzIG1lcmdlLCBtZXJnZURlZXAsIG1lcmdlV2l0aCQxIGFzIG1lcmdlV2l0aCwgbWVyZ2VEZWVwV2l0aCwgcmVtb3ZlLCByZW1vdmVJbiwgc2V0LCBzZXRJbiwgdXBkYXRlLCB1cGRhdGVJbiB9O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBtZW1pemUoIGZuLCBvcHRpb25zICkge1xuXHR2YXIgc2l6ZSA9IDAsXG5cdFx0bWF4U2l6ZSwgaGVhZCwgdGFpbDtcblxuXHRpZiAoIG9wdGlvbnMgJiYgb3B0aW9ucy5tYXhTaXplICkge1xuXHRcdG1heFNpemUgPSBvcHRpb25zLm1heFNpemU7XG5cdH1cblxuXHRmdW5jdGlvbiBtZW1vaXplZCggLyogLi4uYXJncyAqLyApIHtcblx0XHR2YXIgbm9kZSA9IGhlYWQsXG5cdFx0XHRsZW4gPSBhcmd1bWVudHMubGVuZ3RoLFxuXHRcdFx0YXJncywgaTtcblxuXHRcdHNlYXJjaENhY2hlOiB3aGlsZSAoIG5vZGUgKSB7XG5cdFx0XHQvLyBQZXJmb3JtIGEgc2hhbGxvdyBlcXVhbGl0eSB0ZXN0IHRvIGNvbmZpcm0gdGhhdCB3aGV0aGVyIHRoZSBub2RlXG5cdFx0XHQvLyB1bmRlciB0ZXN0IGlzIGEgY2FuZGlkYXRlIGZvciB0aGUgYXJndW1lbnRzIHBhc3NlZC4gVHdvIGFycmF5c1xuXHRcdFx0Ly8gYXJlIHNoYWxsb3dseSBlcXVhbCBpZiB0aGVpciBsZW5ndGggbWF0Y2hlcyBhbmQgZWFjaCBlbnRyeSBpc1xuXHRcdFx0Ly8gc3RyaWN0bHkgZXF1YWwgYmV0d2VlbiB0aGUgdHdvIHNldHMuIEF2b2lkIGFic3RyYWN0aW5nIHRvIGFcblx0XHRcdC8vIGZ1bmN0aW9uIHdoaWNoIGNvdWxkIGluY3VyIGFuIGFyZ3VtZW50cyBsZWFraW5nIGRlb3B0aW1pemF0aW9uLlxuXG5cdFx0XHQvLyBDaGVjayB3aGV0aGVyIG5vZGUgYXJndW1lbnRzIG1hdGNoIGFyZ3VtZW50cyBsZW5ndGhcblx0XHRcdGlmICggbm9kZS5hcmdzLmxlbmd0aCAhPT0gYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdFx0bm9kZSA9IG5vZGUubmV4dDtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENoZWNrIHdoZXRoZXIgbm9kZSBhcmd1bWVudHMgbWF0Y2ggYXJndW1lbnRzIHZhbHVlc1xuXHRcdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0aWYgKCBub2RlLmFyZ3NbIGkgXSAhPT0gYXJndW1lbnRzWyBpIF0gKSB7XG5cdFx0XHRcdFx0bm9kZSA9IG5vZGUubmV4dDtcblx0XHRcdFx0XHRjb250aW51ZSBzZWFyY2hDYWNoZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBBdCB0aGlzIHBvaW50IHdlIGNhbiBhc3N1bWUgd2UndmUgZm91bmQgYSBtYXRjaFxuXG5cdFx0XHQvLyBTdXJmYWNlIG1hdGNoZWQgbm9kZSB0byBoZWFkIGlmIG5vdCBhbHJlYWR5XG5cdFx0XHRpZiAoIG5vZGUgIT09IGhlYWQgKSB7XG5cdFx0XHRcdC8vIEFzIHRhaWwsIHNoaWZ0IHRvIHByZXZpb3VzLiBNdXN0IG9ubHkgc2hpZnQgaWYgbm90IGFsc29cblx0XHRcdFx0Ly8gaGVhZCwgc2luY2UgaWYgYm90aCBoZWFkIGFuZCB0YWlsLCB0aGVyZSBpcyBubyBwcmV2aW91cy5cblx0XHRcdFx0aWYgKCBub2RlID09PSB0YWlsICkge1xuXHRcdFx0XHRcdHRhaWwgPSBub2RlLnByZXY7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBZGp1c3Qgc2libGluZ3MgdG8gcG9pbnQgdG8gZWFjaCBvdGhlci4gSWYgbm9kZSB3YXMgdGFpbCxcblx0XHRcdFx0Ly8gdGhpcyBhbHNvIGhhbmRsZXMgbmV3IHRhaWwncyBlbXB0eSBgbmV4dGAgYXNzaWdubWVudC5cblx0XHRcdFx0bm9kZS5wcmV2Lm5leHQgPSBub2RlLm5leHQ7XG5cdFx0XHRcdGlmICggbm9kZS5uZXh0ICkge1xuXHRcdFx0XHRcdG5vZGUubmV4dC5wcmV2ID0gbm9kZS5wcmV2O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bm9kZS5uZXh0ID0gaGVhZDtcblx0XHRcdFx0bm9kZS5wcmV2ID0gbnVsbDtcblx0XHRcdFx0aGVhZC5wcmV2ID0gbm9kZTtcblx0XHRcdFx0aGVhZCA9IG5vZGU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJldHVybiBpbW1lZGlhdGVseVxuXHRcdFx0cmV0dXJuIG5vZGUudmFsO1xuXHRcdH1cblxuXHRcdC8vIE5vIGNhY2hlZCB2YWx1ZSBmb3VuZC4gQ29udGludWUgdG8gaW5zZXJ0aW9uIHBoYXNlOlxuXG5cdFx0Ly8gQ3JlYXRlIGEgY29weSBvZiBhcmd1bWVudHMgKGF2b2lkIGxlYWtpbmcgZGVvcHRpbWl6YXRpb24pXG5cdFx0YXJncyA9IG5ldyBBcnJheSggbGVuICk7XG5cdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGFyZ3NbIGkgXSA9IGFyZ3VtZW50c1sgaSBdO1xuXHRcdH1cblxuXHRcdG5vZGUgPSB7XG5cdFx0XHRhcmdzOiBhcmdzLFxuXG5cdFx0XHQvLyBHZW5lcmF0ZSB0aGUgcmVzdWx0IGZyb20gb3JpZ2luYWwgZnVuY3Rpb25cblx0XHRcdHZhbDogZm4uYXBwbHkoIG51bGwsIGFyZ3MgKVxuXHRcdH07XG5cblx0XHQvLyBEb24ndCBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgbm9kZSBpcyBhbHJlYWR5IGhlYWQsIHNpbmNlIGl0IHdvdWxkXG5cdFx0Ly8gaGF2ZSBiZWVuIHJldHVybmVkIGFib3ZlIGFscmVhZHkgaWYgaXQgd2FzXG5cblx0XHQvLyBTaGlmdCBleGlzdGluZyBoZWFkIGRvd24gbGlzdFxuXHRcdGlmICggaGVhZCApIHtcblx0XHRcdGhlYWQucHJldiA9IG5vZGU7XG5cdFx0XHRub2RlLm5leHQgPSBoZWFkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJZiBubyBoZWFkLCBmb2xsb3dzIHRoYXQgdGhlcmUncyBubyB0YWlsIChhdCBpbml0aWFsIG9yIHJlc2V0KVxuXHRcdFx0dGFpbCA9IG5vZGU7XG5cdFx0fVxuXG5cdFx0Ly8gVHJpbSB0YWlsIGlmIHdlJ3JlIHJlYWNoZWQgbWF4IHNpemUgYW5kIGFyZSBwZW5kaW5nIGNhY2hlIGluc2VydGlvblxuXHRcdGlmICggc2l6ZSA9PT0gbWF4U2l6ZSApIHtcblx0XHRcdHRhaWwgPSB0YWlsLnByZXY7XG5cdFx0XHR0YWlsLm5leHQgPSBudWxsO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzaXplKys7XG5cdFx0fVxuXG5cdFx0aGVhZCA9IG5vZGU7XG5cblx0XHRyZXR1cm4gbm9kZS52YWw7XG5cdH1cblxuXHRtZW1vaXplZC5jbGVhciA9IGZ1bmN0aW9uKCkge1xuXHRcdGhlYWQgPSBudWxsO1xuXHRcdHRhaWwgPSBudWxsO1xuXHRcdHNpemUgPSAwO1xuXHR9O1xuXG5cdGlmICggcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0JyApIHtcblx0XHQvLyBDYWNoZSBpcyBub3QgZXhwb3NlZCBpbiB0aGUgcHVibGljIEFQSSwgYnV0IHVzZWQgaW4gdGVzdHMgdG8gZW5zdXJlXG5cdFx0Ly8gZXhwZWN0ZWQgbGlzdCBwcm9ncmVzc2lvblxuXHRcdG1lbW9pemVkLmdldENhY2hlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gWyBoZWFkLCB0YWlsLCBzaXplIF07XG5cdFx0fTtcblx0fVxuXG5cdHJldHVybiBtZW1vaXplZDtcbn07XG4iLCIvKlxub2JqZWN0LWFzc2lnblxuKGMpIFNpbmRyZSBTb3JodXNcbkBsaWNlbnNlIE1JVFxuKi9cblxuJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBwcm9wSXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuZnVuY3Rpb24gdG9PYmplY3QodmFsKSB7XG5cdGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCcpO1xuXHR9XG5cblx0cmV0dXJuIE9iamVjdCh2YWwpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVc2VOYXRpdmUoKSB7XG5cdHRyeSB7XG5cdFx0aWYgKCFPYmplY3QuYXNzaWduKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZWN0IGJ1Z2d5IHByb3BlcnR5IGVudW1lcmF0aW9uIG9yZGVyIGluIG9sZGVyIFY4IHZlcnNpb25zLlxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9NDExOFxuXHRcdHZhciB0ZXN0MSA9IG5ldyBTdHJpbmcoJ2FiYycpOyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXctd3JhcHBlcnNcblx0XHR0ZXN0MVs1XSA9ICdkZSc7XG5cdFx0aWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QxKVswXSA9PT0gJzUnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MiA9IHt9O1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykge1xuXHRcdFx0dGVzdDJbJ18nICsgU3RyaW5nLmZyb21DaGFyQ29kZShpKV0gPSBpO1xuXHRcdH1cblx0XHR2YXIgb3JkZXIyID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDIpLm1hcChmdW5jdGlvbiAobikge1xuXHRcdFx0cmV0dXJuIHRlc3QyW25dO1xuXHRcdH0pO1xuXHRcdGlmIChvcmRlcjIuam9pbignJykgIT09ICcwMTIzNDU2Nzg5Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDMgPSB7fTtcblx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChsZXR0ZXIpIHtcblx0XHRcdHRlc3QzW2xldHRlcl0gPSBsZXR0ZXI7XG5cdFx0fSk7XG5cdFx0aWYgKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sIHRlc3QzKSkuam9pbignJykgIT09XG5cdFx0XHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Ly8gV2UgZG9uJ3QgZXhwZWN0IGFueSBvZiB0aGUgYWJvdmUgdG8gdGhyb3csIGJ1dCBiZXR0ZXIgdG8gYmUgc2FmZS5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG91bGRVc2VOYXRpdmUoKSA/IE9iamVjdC5hc3NpZ24gOiBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcblx0dmFyIGZyb207XG5cdHZhciB0byA9IHRvT2JqZWN0KHRhcmdldCk7XG5cdHZhciBzeW1ib2xzO1xuXG5cdGZvciAodmFyIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgcysrKSB7XG5cdFx0ZnJvbSA9IE9iamVjdChhcmd1bWVudHNbc10pO1xuXG5cdFx0Zm9yICh2YXIga2V5IGluIGZyb20pIHtcblx0XHRcdGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sIGtleSkpIHtcblx0XHRcdFx0dG9ba2V5XSA9IGZyb21ba2V5XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG5cdFx0XHRzeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGZyb20pO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzeW1ib2xzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChwcm9wSXNFbnVtZXJhYmxlLmNhbGwoZnJvbSwgc3ltYm9sc1tpXSkpIHtcblx0XHRcdFx0XHR0b1tzeW1ib2xzW2ldXSA9IGZyb21bc3ltYm9sc1tpXV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdG87XG59O1xuIiwiLyogZ2xvYmFsIGRlZmluZSAqL1xuXG4oZnVuY3Rpb24gKHJvb3QsIHBsdXJhbGl6ZSkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAodHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gTm9kZS5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IHBsdXJhbGl6ZSgpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIC8vIEFNRCwgcmVnaXN0ZXJzIGFzIGFuIGFub255bW91cyBtb2R1bGUuXG4gICAgZGVmaW5lKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBwbHVyYWxpemUoKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBCcm93c2VyIGdsb2JhbC5cbiAgICByb290LnBsdXJhbGl6ZSA9IHBsdXJhbGl6ZSgpO1xuICB9XG59KSh0aGlzLCBmdW5jdGlvbiAoKSB7XG4gIC8vIFJ1bGUgc3RvcmFnZSAtIHBsdXJhbGl6ZSBhbmQgc2luZ3VsYXJpemUgbmVlZCB0byBiZSBydW4gc2VxdWVudGlhbGx5LFxuICAvLyB3aGlsZSBvdGhlciBydWxlcyBjYW4gYmUgb3B0aW1pemVkIHVzaW5nIGFuIG9iamVjdCBmb3IgaW5zdGFudCBsb29rdXBzLlxuICB2YXIgcGx1cmFsUnVsZXMgPSBbXTtcbiAgdmFyIHNpbmd1bGFyUnVsZXMgPSBbXTtcbiAgdmFyIHVuY291bnRhYmxlcyA9IHt9O1xuICB2YXIgaXJyZWd1bGFyUGx1cmFscyA9IHt9O1xuICB2YXIgaXJyZWd1bGFyU2luZ2xlcyA9IHt9O1xuXG4gIC8qKlxuICAgKiBTYW5pdGl6ZSBhIHBsdXJhbGl6YXRpb24gcnVsZSB0byBhIHVzYWJsZSByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAqXG4gICAqIEBwYXJhbSAgeyhSZWdFeHB8c3RyaW5nKX0gcnVsZVxuICAgKiBAcmV0dXJuIHtSZWdFeHB9XG4gICAqL1xuICBmdW5jdGlvbiBzYW5pdGl6ZVJ1bGUgKHJ1bGUpIHtcbiAgICBpZiAodHlwZW9mIHJ1bGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbmV3IFJlZ0V4cCgnXicgKyBydWxlICsgJyQnLCAnaScpO1xuICAgIH1cblxuICAgIHJldHVybiBydWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhc3MgaW4gYSB3b3JkIHRva2VuIHRvIHByb2R1Y2UgYSBmdW5jdGlvbiB0aGF0IGNhbiByZXBsaWNhdGUgdGhlIGNhc2Ugb25cbiAgICogYW5vdGhlciB3b3JkLlxuICAgKlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICAgd29yZFxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICAgdG9rZW5cbiAgICogQHJldHVybiB7RnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiByZXN0b3JlQ2FzZSAod29yZCwgdG9rZW4pIHtcbiAgICAvLyBUb2tlbnMgYXJlIGFuIGV4YWN0IG1hdGNoLlxuICAgIGlmICh3b3JkID09PSB0b2tlbikgcmV0dXJuIHRva2VuO1xuXG4gICAgLy8gVXBwZXIgY2FzZWQgd29yZHMuIEUuZy4gXCJIRUxMT1wiLlxuICAgIGlmICh3b3JkID09PSB3b3JkLnRvVXBwZXJDYXNlKCkpIHJldHVybiB0b2tlbi50b1VwcGVyQ2FzZSgpO1xuXG4gICAgLy8gVGl0bGUgY2FzZWQgd29yZHMuIEUuZy4gXCJUaXRsZVwiLlxuICAgIGlmICh3b3JkWzBdID09PSB3b3JkWzBdLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgIHJldHVybiB0b2tlbi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRva2VuLnN1YnN0cigxKS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIC8vIExvd2VyIGNhc2VkIHdvcmRzLiBFLmcuIFwidGVzdFwiLlxuICAgIHJldHVybiB0b2tlbi50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVycG9sYXRlIGEgcmVnZXhwIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtICB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtICB7QXJyYXl9ICBhcmdzXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGludGVycG9sYXRlIChzdHIsIGFyZ3MpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1xcJChcXGR7MSwyfSkvZywgZnVuY3Rpb24gKG1hdGNoLCBpbmRleCkge1xuICAgICAgcmV0dXJuIGFyZ3NbaW5kZXhdIHx8ICcnO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgYSB3b3JkIHVzaW5nIGEgcnVsZS5cbiAgICpcbiAgICogQHBhcmFtICB7c3RyaW5nfSB3b3JkXG4gICAqIEBwYXJhbSAge0FycmF5fSAgcnVsZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiByZXBsYWNlICh3b3JkLCBydWxlKSB7XG4gICAgcmV0dXJuIHdvcmQucmVwbGFjZShydWxlWzBdLCBmdW5jdGlvbiAobWF0Y2gsIGluZGV4KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gaW50ZXJwb2xhdGUocnVsZVsxXSwgYXJndW1lbnRzKTtcblxuICAgICAgaWYgKG1hdGNoID09PSAnJykge1xuICAgICAgICByZXR1cm4gcmVzdG9yZUNhc2Uod29yZFtpbmRleCAtIDFdLCByZXN1bHQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdG9yZUNhc2UobWF0Y2gsIHJlc3VsdCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2FuaXRpemUgYSB3b3JkIGJ5IHBhc3NpbmcgaW4gdGhlIHdvcmQgYW5kIHNhbml0aXphdGlvbiBydWxlcy5cbiAgICpcbiAgICogQHBhcmFtICB7c3RyaW5nfSAgIHRva2VuXG4gICAqIEBwYXJhbSAge3N0cmluZ30gICB3b3JkXG4gICAqIEBwYXJhbSAge0FycmF5fSAgICBydWxlc1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBzYW5pdGl6ZVdvcmQgKHRva2VuLCB3b3JkLCBydWxlcykge1xuICAgIC8vIEVtcHR5IHN0cmluZyBvciBkb2Vzbid0IG5lZWQgZml4aW5nLlxuICAgIGlmICghdG9rZW4ubGVuZ3RoIHx8IHVuY291bnRhYmxlcy5oYXNPd25Qcm9wZXJ0eSh0b2tlbikpIHtcbiAgICAgIHJldHVybiB3b3JkO1xuICAgIH1cblxuICAgIHZhciBsZW4gPSBydWxlcy5sZW5ndGg7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIHNhbml0aXphdGlvbiBydWxlcyBhbmQgdXNlIHRoZSBmaXJzdCBvbmUgdG8gbWF0Y2guXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICB2YXIgcnVsZSA9IHJ1bGVzW2xlbl07XG5cbiAgICAgIGlmIChydWxlWzBdLnRlc3Qod29yZCkpIHJldHVybiByZXBsYWNlKHdvcmQsIHJ1bGUpO1xuICAgIH1cblxuICAgIHJldHVybiB3b3JkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgYSB3b3JkIHdpdGggdGhlIHVwZGF0ZWQgd29yZC5cbiAgICpcbiAgICogQHBhcmFtICB7T2JqZWN0fSAgIHJlcGxhY2VNYXBcbiAgICogQHBhcmFtICB7T2JqZWN0fSAgIGtlZXBNYXBcbiAgICogQHBhcmFtICB7QXJyYXl9ICAgIHJ1bGVzXG4gICAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVdvcmQgKHJlcGxhY2VNYXAsIGtlZXBNYXAsIHJ1bGVzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh3b3JkKSB7XG4gICAgICAvLyBHZXQgdGhlIGNvcnJlY3QgdG9rZW4gYW5kIGNhc2UgcmVzdG9yYXRpb24gZnVuY3Rpb25zLlxuICAgICAgdmFyIHRva2VuID0gd29yZC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAvLyBDaGVjayBhZ2FpbnN0IHRoZSBrZWVwIG9iamVjdCBtYXAuXG4gICAgICBpZiAoa2VlcE1hcC5oYXNPd25Qcm9wZXJ0eSh0b2tlbikpIHtcbiAgICAgICAgcmV0dXJuIHJlc3RvcmVDYXNlKHdvcmQsIHRva2VuKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgYWdhaW5zdCB0aGUgcmVwbGFjZW1lbnQgbWFwIGZvciBhIGRpcmVjdCB3b3JkIHJlcGxhY2VtZW50LlxuICAgICAgaWYgKHJlcGxhY2VNYXAuaGFzT3duUHJvcGVydHkodG9rZW4pKSB7XG4gICAgICAgIHJldHVybiByZXN0b3JlQ2FzZSh3b3JkLCByZXBsYWNlTWFwW3Rva2VuXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJ1biBhbGwgdGhlIHJ1bGVzIGFnYWluc3QgdGhlIHdvcmQuXG4gICAgICByZXR1cm4gc2FuaXRpemVXb3JkKHRva2VuLCB3b3JkLCBydWxlcyk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHdvcmQgaXMgcGFydCBvZiB0aGUgbWFwLlxuICAgKi9cbiAgZnVuY3Rpb24gY2hlY2tXb3JkIChyZXBsYWNlTWFwLCBrZWVwTWFwLCBydWxlcywgYm9vbCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAod29yZCkge1xuICAgICAgdmFyIHRva2VuID0gd29yZC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBpZiAoa2VlcE1hcC5oYXNPd25Qcm9wZXJ0eSh0b2tlbikpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHJlcGxhY2VNYXAuaGFzT3duUHJvcGVydHkodG9rZW4pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJldHVybiBzYW5pdGl6ZVdvcmQodG9rZW4sIHRva2VuLCBydWxlcykgPT09IHRva2VuO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUGx1cmFsaXplIG9yIHNpbmd1bGFyaXplIGEgd29yZCBiYXNlZCBvbiB0aGUgcGFzc2VkIGluIGNvdW50LlxuICAgKlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICB3b3JkXG4gICAqIEBwYXJhbSAge251bWJlcn0gIGNvdW50XG4gICAqIEBwYXJhbSAge2Jvb2xlYW59IGluY2x1c2l2ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBwbHVyYWxpemUgKHdvcmQsIGNvdW50LCBpbmNsdXNpdmUpIHtcbiAgICB2YXIgcGx1cmFsaXplZCA9IGNvdW50ID09PSAxXG4gICAgICA/IHBsdXJhbGl6ZS5zaW5ndWxhcih3b3JkKSA6IHBsdXJhbGl6ZS5wbHVyYWwod29yZCk7XG5cbiAgICByZXR1cm4gKGluY2x1c2l2ZSA/IGNvdW50ICsgJyAnIDogJycpICsgcGx1cmFsaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbHVyYWxpemUgYSB3b3JkLlxuICAgKlxuICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAqL1xuICBwbHVyYWxpemUucGx1cmFsID0gcmVwbGFjZVdvcmQoXG4gICAgaXJyZWd1bGFyU2luZ2xlcywgaXJyZWd1bGFyUGx1cmFscywgcGx1cmFsUnVsZXNcbiAgKTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSB3b3JkIGlzIHBsdXJhbC5cbiAgICpcbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKi9cbiAgcGx1cmFsaXplLmlzUGx1cmFsID0gY2hlY2tXb3JkKFxuICAgIGlycmVndWxhclNpbmdsZXMsIGlycmVndWxhclBsdXJhbHMsIHBsdXJhbFJ1bGVzXG4gICk7XG5cbiAgLyoqXG4gICAqIFNpbmd1bGFyaXplIGEgd29yZC5cbiAgICpcbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKi9cbiAgcGx1cmFsaXplLnNpbmd1bGFyID0gcmVwbGFjZVdvcmQoXG4gICAgaXJyZWd1bGFyUGx1cmFscywgaXJyZWd1bGFyU2luZ2xlcywgc2luZ3VsYXJSdWxlc1xuICApO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHdvcmQgaXMgc2luZ3VsYXIuXG4gICAqXG4gICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICovXG4gIHBsdXJhbGl6ZS5pc1Npbmd1bGFyID0gY2hlY2tXb3JkKFxuICAgIGlycmVndWxhclBsdXJhbHMsIGlycmVndWxhclNpbmdsZXMsIHNpbmd1bGFyUnVsZXNcbiAgKTtcblxuICAvKipcbiAgICogQWRkIGEgcGx1cmFsaXphdGlvbiBydWxlIHRvIHRoZSBjb2xsZWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmd8UmVnRXhwKX0gcnVsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgcmVwbGFjZW1lbnRcbiAgICovXG4gIHBsdXJhbGl6ZS5hZGRQbHVyYWxSdWxlID0gZnVuY3Rpb24gKHJ1bGUsIHJlcGxhY2VtZW50KSB7XG4gICAgcGx1cmFsUnVsZXMucHVzaChbc2FuaXRpemVSdWxlKHJ1bGUpLCByZXBsYWNlbWVudF0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBzaW5ndWxhcml6YXRpb24gcnVsZSB0byB0aGUgY29sbGVjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nfFJlZ0V4cCl9IHJ1bGVcbiAgICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgIHJlcGxhY2VtZW50XG4gICAqL1xuICBwbHVyYWxpemUuYWRkU2luZ3VsYXJSdWxlID0gZnVuY3Rpb24gKHJ1bGUsIHJlcGxhY2VtZW50KSB7XG4gICAgc2luZ3VsYXJSdWxlcy5wdXNoKFtzYW5pdGl6ZVJ1bGUocnVsZSksIHJlcGxhY2VtZW50XSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZCBhbiB1bmNvdW50YWJsZSB3b3JkIHJ1bGUuXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xSZWdFeHApfSB3b3JkXG4gICAqL1xuICBwbHVyYWxpemUuYWRkVW5jb3VudGFibGVSdWxlID0gZnVuY3Rpb24gKHdvcmQpIHtcbiAgICBpZiAodHlwZW9mIHdvcmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB1bmNvdW50YWJsZXNbd29yZC50b0xvd2VyQ2FzZSgpXSA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2V0IHNpbmd1bGFyIGFuZCBwbHVyYWwgcmVmZXJlbmNlcyBmb3IgdGhlIHdvcmQuXG4gICAgcGx1cmFsaXplLmFkZFBsdXJhbFJ1bGUod29yZCwgJyQwJyk7XG4gICAgcGx1cmFsaXplLmFkZFNpbmd1bGFyUnVsZSh3b3JkLCAnJDAnKTtcbiAgfTtcblxuICAvKipcbiAgICogQWRkIGFuIGlycmVndWxhciB3b3JkIGRlZmluaXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzaW5nbGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBsdXJhbFxuICAgKi9cbiAgcGx1cmFsaXplLmFkZElycmVndWxhclJ1bGUgPSBmdW5jdGlvbiAoc2luZ2xlLCBwbHVyYWwpIHtcbiAgICBwbHVyYWwgPSBwbHVyYWwudG9Mb3dlckNhc2UoKTtcbiAgICBzaW5nbGUgPSBzaW5nbGUudG9Mb3dlckNhc2UoKTtcblxuICAgIGlycmVndWxhclNpbmdsZXNbc2luZ2xlXSA9IHBsdXJhbDtcbiAgICBpcnJlZ3VsYXJQbHVyYWxzW3BsdXJhbF0gPSBzaW5nbGU7XG4gIH07XG5cbiAgLyoqXG4gICAqIElycmVndWxhciBydWxlcy5cbiAgICovXG4gIFtcbiAgICAvLyBQcm9ub3Vucy5cbiAgICBbJ0knLCAnd2UnXSxcbiAgICBbJ21lJywgJ3VzJ10sXG4gICAgWydoZScsICd0aGV5J10sXG4gICAgWydzaGUnLCAndGhleSddLFxuICAgIFsndGhlbScsICd0aGVtJ10sXG4gICAgWydteXNlbGYnLCAnb3Vyc2VsdmVzJ10sXG4gICAgWyd5b3Vyc2VsZicsICd5b3Vyc2VsdmVzJ10sXG4gICAgWydpdHNlbGYnLCAndGhlbXNlbHZlcyddLFxuICAgIFsnaGVyc2VsZicsICd0aGVtc2VsdmVzJ10sXG4gICAgWydoaW1zZWxmJywgJ3RoZW1zZWx2ZXMnXSxcbiAgICBbJ3RoZW1zZWxmJywgJ3RoZW1zZWx2ZXMnXSxcbiAgICBbJ2lzJywgJ2FyZSddLFxuICAgIFsnd2FzJywgJ3dlcmUnXSxcbiAgICBbJ2hhcycsICdoYXZlJ10sXG4gICAgWyd0aGlzJywgJ3RoZXNlJ10sXG4gICAgWyd0aGF0JywgJ3Rob3NlJ10sXG4gICAgLy8gV29yZHMgZW5kaW5nIGluIHdpdGggYSBjb25zb25hbnQgYW5kIGBvYC5cbiAgICBbJ2VjaG8nLCAnZWNob2VzJ10sXG4gICAgWydkaW5nbycsICdkaW5nb2VzJ10sXG4gICAgWyd2b2xjYW5vJywgJ3ZvbGNhbm9lcyddLFxuICAgIFsndG9ybmFkbycsICd0b3JuYWRvZXMnXSxcbiAgICBbJ3RvcnBlZG8nLCAndG9ycGVkb2VzJ10sXG4gICAgLy8gRW5kcyB3aXRoIGB1c2AuXG4gICAgWydnZW51cycsICdnZW5lcmEnXSxcbiAgICBbJ3Zpc2N1cycsICd2aXNjZXJhJ10sXG4gICAgLy8gRW5kcyB3aXRoIGBtYWAuXG4gICAgWydzdGlnbWEnLCAnc3RpZ21hdGEnXSxcbiAgICBbJ3N0b21hJywgJ3N0b21hdGEnXSxcbiAgICBbJ2RvZ21hJywgJ2RvZ21hdGEnXSxcbiAgICBbJ2xlbW1hJywgJ2xlbW1hdGEnXSxcbiAgICBbJ3NjaGVtYScsICdzY2hlbWF0YSddLFxuICAgIFsnYW5hdGhlbWEnLCAnYW5hdGhlbWF0YSddLFxuICAgIC8vIE90aGVyIGlycmVndWxhciBydWxlcy5cbiAgICBbJ294JywgJ294ZW4nXSxcbiAgICBbJ2F4ZScsICdheGVzJ10sXG4gICAgWydkaWUnLCAnZGljZSddLFxuICAgIFsneWVzJywgJ3llc2VzJ10sXG4gICAgWydmb290JywgJ2ZlZXQnXSxcbiAgICBbJ2VhdmUnLCAnZWF2ZXMnXSxcbiAgICBbJ2dvb3NlJywgJ2dlZXNlJ10sXG4gICAgWyd0b290aCcsICd0ZWV0aCddLFxuICAgIFsncXVpeicsICdxdWl6emVzJ10sXG4gICAgWydodW1hbicsICdodW1hbnMnXSxcbiAgICBbJ3Byb29mJywgJ3Byb29mcyddLFxuICAgIFsnY2FydmUnLCAnY2FydmVzJ10sXG4gICAgWyd2YWx2ZScsICd2YWx2ZXMnXSxcbiAgICBbJ2xvb2V5JywgJ2xvb2llcyddLFxuICAgIFsndGhpZWYnLCAndGhpZXZlcyddLFxuICAgIFsnZ3Jvb3ZlJywgJ2dyb292ZXMnXSxcbiAgICBbJ3BpY2theGUnLCAncGlja2F4ZXMnXSxcbiAgICBbJ3doaXNrZXknLCAnd2hpc2tpZXMnXVxuICBdLmZvckVhY2goZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICByZXR1cm4gcGx1cmFsaXplLmFkZElycmVndWxhclJ1bGUocnVsZVswXSwgcnVsZVsxXSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBQbHVyYWxpemF0aW9uIHJ1bGVzLlxuICAgKi9cbiAgW1xuICAgIFsvcz8kL2ksICdzJ10sXG4gICAgWy9bXlxcdTAwMDAtXFx1MDA3Rl0kL2ksICckMCddLFxuICAgIFsvKFteYWVpb3VdZXNlKSQvaSwgJyQxJ10sXG4gICAgWy8oYXh8dGVzdClpcyQvaSwgJyQxZXMnXSxcbiAgICBbLyhhbGlhc3xbXmFvdV11c3x0bGFzfGdhc3xyaXMpJC9pLCAnJDFlcyddLFxuICAgIFsvKGVbbW5ddSlzPyQvaSwgJyQxcyddLFxuICAgIFsvKFtebF1pYXN8W2FlaW91XWxhc3xbZW1qenJdYXN8W2l1XWFtKSQvaSwgJyQxJ10sXG4gICAgWy8oYWx1bW58c3lsbGFifG9jdG9wfHZpcnxyYWRpfG51Y2xlfGZ1bmd8Y2FjdHxzdGltdWx8dGVybWlufGJhY2lsbHxmb2N8dXRlcnxsb2N8c3RyYXQpKD86dXN8aSkkL2ksICckMWknXSxcbiAgICBbLyhhbHVtbnxhbGd8dmVydGVicikoPzphfGFlKSQvaSwgJyQxYWUnXSxcbiAgICBbLyhzZXJhcGh8Y2hlcnViKSg/OmltKT8kL2ksICckMWltJ10sXG4gICAgWy8oaGVyfGF0fGdyKW8kL2ksICckMW9lcyddLFxuICAgIFsvKGFnZW5kfGFkZGVuZHxtaWxsZW5uaXxkYXR8ZXh0cmVtfGJhY3Rlcml8ZGVzaWRlcmF0fHN0cmF0fGNhbmRlbGFicnxlcnJhdHxvdnxzeW1wb3NpfGN1cnJpY3VsfGF1dG9tYXR8cXVvcikoPzphfHVtKSQvaSwgJyQxYSddLFxuICAgIFsvKGFwaGVsaXxoeXBlcmJhdHxwZXJpaGVsaXxhc3luZGV0fG5vdW1lbnxwaGVub21lbnxjcml0ZXJpfG9yZ2FufHByb2xlZ29tZW58aGVkcnxhdXRvbWF0KSg/OmF8b24pJC9pLCAnJDFhJ10sXG4gICAgWy9zaXMkL2ksICdzZXMnXSxcbiAgICBbLyg/Oihrbml8d2l8bGkpZmV8KGFyfGx8ZWF8ZW98b2F8aG9vKWYpJC9pLCAnJDEkMnZlcyddLFxuICAgIFsvKFteYWVpb3V5XXxxdSl5JC9pLCAnJDFpZXMnXSxcbiAgICBbLyhbXmNoXVtpZW9dW2xuXSlleSQvaSwgJyQxaWVzJ10sXG4gICAgWy8oeHxjaHxzc3xzaHx6eikkL2ksICckMWVzJ10sXG4gICAgWy8obWF0cnxjb2R8bXVyfHNpbHx2ZXJ0fGluZHxhcHBlbmQpKD86aXh8ZXgpJC9pLCAnJDFpY2VzJ10sXG4gICAgWy8obXxsKSg/OmljZXxvdXNlKSQvaSwgJyQxaWNlJ10sXG4gICAgWy8ocGUpKD86cnNvbnxvcGxlKSQvaSwgJyQxb3BsZSddLFxuICAgIFsvKGNoaWxkKSg/OnJlbik/JC9pLCAnJDFyZW4nXSxcbiAgICBbL2VhdXgkL2ksICckMCddLFxuICAgIFsvbVthZV1uJC9pLCAnbWVuJ10sXG4gICAgWyd0aG91JywgJ3lvdSddXG4gIF0uZm9yRWFjaChmdW5jdGlvbiAocnVsZSkge1xuICAgIHJldHVybiBwbHVyYWxpemUuYWRkUGx1cmFsUnVsZShydWxlWzBdLCBydWxlWzFdKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFNpbmd1bGFyaXphdGlvbiBydWxlcy5cbiAgICovXG4gIFtcbiAgICBbL3MkL2ksICcnXSxcbiAgICBbLyhzcykkL2ksICckMSddLFxuICAgIFsvKHdpfGtuaXwoPzphZnRlcnxoYWxmfGhpZ2h8bG93fG1pZHxub258bmlnaHR8W15cXHddfF4pbGkpdmVzJC9pLCAnJDFmZSddLFxuICAgIFsvKGFyfCg/OndvfFthZV0pbHxbZW9dW2FvXSl2ZXMkL2ksICckMWYnXSxcbiAgICBbL2llcyQvaSwgJ3knXSxcbiAgICBbL1xcYihbcGxdfHpvbWJ8KD86bmVja3xjcm9zcyk/dHxjb2xsfGZhZXJ8Zm9vZHxnZW58Z29vbnxncm91cHxsYXNzfHRhbGt8Z29hbHxjdXQpaWVzJC9pLCAnJDFpZSddLFxuICAgIFsvXFxiKG1vbnxzbWlsKWllcyQvaSwgJyQxZXknXSxcbiAgICBbLyhtfGwpaWNlJC9pLCAnJDFvdXNlJ10sXG4gICAgWy8oc2VyYXBofGNoZXJ1YilpbSQvaSwgJyQxJ10sXG4gICAgWy8oeHxjaHxzc3xzaHx6enx0dG98Z298Y2hvfGFsaWFzfFteYW91XXVzfHRsYXN8Z2FzfCg/OmhlcnxhdHxncilvfHJpcykoPzplcyk/JC9pLCAnJDEnXSxcbiAgICBbLyhhbmFseXxiYXxkaWFnbm98cGFyZW50aGV8cHJvZ25vfHN5bm9wfHRoZXxlbXBoYXxjcmkpKD86c2lzfHNlcykkL2ksICckMXNpcyddLFxuICAgIFsvKG1vdmllfHR3ZWx2ZXxhYnVzZXxlW21uXXUpcyQvaSwgJyQxJ10sXG4gICAgWy8odGVzdCkoPzppc3xlcykkL2ksICckMWlzJ10sXG4gICAgWy8oYWx1bW58c3lsbGFifG9jdG9wfHZpcnxyYWRpfG51Y2xlfGZ1bmd8Y2FjdHxzdGltdWx8dGVybWlufGJhY2lsbHxmb2N8dXRlcnxsb2N8c3RyYXQpKD86dXN8aSkkL2ksICckMXVzJ10sXG4gICAgWy8oYWdlbmR8YWRkZW5kfG1pbGxlbm5pfGRhdHxleHRyZW18YmFjdGVyaXxkZXNpZGVyYXR8c3RyYXR8Y2FuZGVsYWJyfGVycmF0fG92fHN5bXBvc2l8Y3VycmljdWx8cXVvcilhJC9pLCAnJDF1bSddLFxuICAgIFsvKGFwaGVsaXxoeXBlcmJhdHxwZXJpaGVsaXxhc3luZGV0fG5vdW1lbnxwaGVub21lbnxjcml0ZXJpfG9yZ2FufHByb2xlZ29tZW58aGVkcnxhdXRvbWF0KWEkL2ksICckMW9uJ10sXG4gICAgWy8oYWx1bW58YWxnfHZlcnRlYnIpYWUkL2ksICckMWEnXSxcbiAgICBbLyhjb2R8bXVyfHNpbHx2ZXJ0fGluZClpY2VzJC9pLCAnJDFleCddLFxuICAgIFsvKG1hdHJ8YXBwZW5kKWljZXMkL2ksICckMWl4J10sXG4gICAgWy8ocGUpKHJzb258b3BsZSkkL2ksICckMXJzb24nXSxcbiAgICBbLyhjaGlsZClyZW4kL2ksICckMSddLFxuICAgIFsvKGVhdSl4PyQvaSwgJyQxJ10sXG4gICAgWy9tZW4kL2ksICdtYW4nXVxuICBdLmZvckVhY2goZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICByZXR1cm4gcGx1cmFsaXplLmFkZFNpbmd1bGFyUnVsZShydWxlWzBdLCBydWxlWzFdKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFVuY291bnRhYmxlIHJ1bGVzLlxuICAgKi9cbiAgW1xuICAgIC8vIFNpbmd1bGFyIHdvcmRzIHdpdGggbm8gcGx1cmFscy5cbiAgICAnYWR1bHRob29kJyxcbiAgICAnYWR2aWNlJyxcbiAgICAnYWdlbmRhJyxcbiAgICAnYWlkJyxcbiAgICAnYWxjb2hvbCcsXG4gICAgJ2FtbW8nLFxuICAgICdhbmltZScsXG4gICAgJ2F0aGxldGljcycsXG4gICAgJ2F1ZGlvJyxcbiAgICAnYmlzb24nLFxuICAgICdibG9vZCcsXG4gICAgJ2JyZWFtJyxcbiAgICAnYnVmZmFsbycsXG4gICAgJ2J1dHRlcicsXG4gICAgJ2NhcnAnLFxuICAgICdjYXNoJyxcbiAgICAnY2hhc3NpcycsXG4gICAgJ2NoZXNzJyxcbiAgICAnY2xvdGhpbmcnLFxuICAgICdjb2QnLFxuICAgICdjb21tZXJjZScsXG4gICAgJ2Nvb3BlcmF0aW9uJyxcbiAgICAnY29ycHMnLFxuICAgICdkZWJyaXMnLFxuICAgICdkaWFiZXRlcycsXG4gICAgJ2RpZ2VzdGlvbicsXG4gICAgJ2VsaycsXG4gICAgJ2VuZXJneScsXG4gICAgJ2VxdWlwbWVudCcsXG4gICAgJ2V4Y3JldGlvbicsXG4gICAgJ2V4cGVydGlzZScsXG4gICAgJ2Zsb3VuZGVyJyxcbiAgICAnZnVuJyxcbiAgICAnZ2FsbG93cycsXG4gICAgJ2dhcmJhZ2UnLFxuICAgICdncmFmZml0aScsXG4gICAgJ2hlYWRxdWFydGVycycsXG4gICAgJ2hlYWx0aCcsXG4gICAgJ2hlcnBlcycsXG4gICAgJ2hpZ2hqaW5rcycsXG4gICAgJ2hvbWV3b3JrJyxcbiAgICAnaG91c2V3b3JrJyxcbiAgICAnaW5mb3JtYXRpb24nLFxuICAgICdqZWFucycsXG4gICAgJ2p1c3RpY2UnLFxuICAgICdrdWRvcycsXG4gICAgJ2xhYm91cicsXG4gICAgJ2xpdGVyYXR1cmUnLFxuICAgICdtYWNoaW5lcnknLFxuICAgICdtYWNrZXJlbCcsXG4gICAgJ21haWwnLFxuICAgICdtZWRpYScsXG4gICAgJ21ld3MnLFxuICAgICdtb29zZScsXG4gICAgJ211c2ljJyxcbiAgICAnbWFuZ2EnLFxuICAgICduZXdzJyxcbiAgICAncGlrZScsXG4gICAgJ3BsYW5rdG9uJyxcbiAgICAncGxpZXJzJyxcbiAgICAncG9sbHV0aW9uJyxcbiAgICAncHJlbWlzZXMnLFxuICAgICdyYWluJyxcbiAgICAncmVzZWFyY2gnLFxuICAgICdyaWNlJyxcbiAgICAnc2FsbW9uJyxcbiAgICAnc2Npc3NvcnMnLFxuICAgICdzZXJpZXMnLFxuICAgICdzZXdhZ2UnLFxuICAgICdzaGFtYmxlcycsXG4gICAgJ3NocmltcCcsXG4gICAgJ3NwZWNpZXMnLFxuICAgICdzdGFmZicsXG4gICAgJ3N3aW5lJyxcbiAgICAndGVubmlzJyxcbiAgICAndHJhZmZpYycsXG4gICAgJ3RyYW5zcG9yYXRpb24nLFxuICAgICd0cm91dCcsXG4gICAgJ3R1bmEnLFxuICAgICd3ZWFsdGgnLFxuICAgICd3ZWxmYXJlJyxcbiAgICAnd2hpdGluZycsXG4gICAgJ3dpbGRlYmVlc3QnLFxuICAgICd3aWxkbGlmZScsXG4gICAgJ3lvdScsXG4gICAgLy8gUmVnZXhlcy5cbiAgICAvW15hZWlvdV1lc2UkL2ksIC8vIFwiY2hpbmVzZVwiLCBcImphcGFuZXNlXCJcbiAgICAvZGVlciQvaSwgLy8gXCJkZWVyXCIsIFwicmVpbmRlZXJcIlxuICAgIC9maXNoJC9pLCAvLyBcImZpc2hcIiwgXCJibG93ZmlzaFwiLCBcImFuZ2VsZmlzaFwiXG4gICAgL21lYXNsZXMkL2ksXG4gICAgL29baXVdcyQvaSwgLy8gXCJjYXJuaXZvcm91c1wiXG4gICAgL3BveCQvaSwgLy8gXCJjaGlja3BveFwiLCBcInNtYWxscG94XCJcbiAgICAvc2hlZXAkL2lcbiAgXS5mb3JFYWNoKHBsdXJhbGl6ZS5hZGRVbmNvdW50YWJsZVJ1bGUpO1xuXG4gIHJldHVybiBwbHVyYWxpemU7XG59KTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcbiAgdmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xuXG4gIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICsgdGV4dDtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gLS0tIFdlbGNvbWUgdG8gZGVidWdnaW5nIFJlYWN0IC0tLVxuICAgICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzIHN0YWNrXG4gICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9IGNhdGNoICh4KSB7fVxuICB9O1xufVxuXG4vKipcbiAqIEFzc2VydCB0aGF0IHRoZSB2YWx1ZXMgbWF0Y2ggd2l0aCB0aGUgdHlwZSBzcGVjcy5cbiAqIEVycm9yIG1lc3NhZ2VzIGFyZSBtZW1vcml6ZWQgYW5kIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSB0eXBlU3BlY3MgTWFwIG9mIG5hbWUgdG8gYSBSZWFjdFByb3BUeXBlXG4gKiBAcGFyYW0ge29iamVjdH0gdmFsdWVzIFJ1bnRpbWUgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSB0eXBlLWNoZWNrZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiBlLmcuIFwicHJvcFwiLCBcImNvbnRleHRcIiwgXCJjaGlsZCBjb250ZXh0XCJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21wb25lbnROYW1lIE5hbWUgb2YgdGhlIGNvbXBvbmVudCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcGFyYW0gez9GdW5jdGlvbn0gZ2V0U3RhY2sgUmV0dXJucyB0aGUgY29tcG9uZW50IHN0YWNrLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBnZXRTdGFjaykge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmICh0eXBlU3BlY3MuaGFzT3duUHJvcGVydHkodHlwZVNwZWNOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3I7XG4gICAgICAgIC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoXG4gICAgICAgICAgICAgIChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArXG4gICAgICAgICAgICAgICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXJyb3IgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciA9IGV4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvciAmJiAhKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJyArXG4gICAgICAgICAgICBsb2NhdGlvbiArICcgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgK1xuICAgICAgICAgICAgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICcgKyB0eXBlb2YgZXJyb3IgKyAnLiAnICtcbiAgICAgICAgICAgICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICtcbiAgICAgICAgICAgICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgK1xuICAgICAgICAgICAgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nXG4gICAgICAgICAgKVxuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvci5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvci5tZXNzYWdlXSA9IHRydWU7XG5cbiAgICAgICAgICB2YXIgc3RhY2sgPSBnZXRTdGFjayA/IGdldFN0YWNrKCkgOiAnJztcblxuICAgICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAgICdGYWlsZWQgJyArIGxvY2F0aW9uICsgJyB0eXBlOiAnICsgZXJyb3IubWVzc2FnZSArIChzdGFjayAhPSBudWxsID8gc3RhY2sgOiAnJylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2hlY2tQcm9wVHlwZXM7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGFzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcbnZhciBjaGVja1Byb3BUeXBlcyA9IHJlcXVpcmUoJy4vY2hlY2tQcm9wVHlwZXMnKTtcblxudmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKCkge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICsgdGV4dDtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gLS0tIFdlbGNvbWUgdG8gZGVidWdnaW5nIFJlYWN0IC0tLVxuICAgICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzIHN0YWNrXG4gICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9IGNhdGNoICh4KSB7fVxuICB9O1xufVxuXG5mdW5jdGlvbiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpc1ZhbGlkRWxlbWVudCwgdGhyb3dPbkRpcmVjdEFjY2Vzcykge1xuICAvKiBnbG9iYWwgU3ltYm9sICovXG4gIHZhciBJVEVSQVRPUl9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcjtcbiAgdmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InOyAvLyBCZWZvcmUgU3ltYm9sIHNwZWMuXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGl0ZXJhdG9yIG1ldGhvZCBmdW5jdGlvbiBjb250YWluZWQgb24gdGhlIGl0ZXJhYmxlIG9iamVjdC5cbiAgICpcbiAgICogQmUgc3VyZSB0byBpbnZva2UgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGl0ZXJhYmxlIGFzIGNvbnRleHQ6XG4gICAqXG4gICAqICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obXlJdGVyYWJsZSk7XG4gICAqICAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgKiAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobXlJdGVyYWJsZSk7XG4gICAqICAgICAgIC4uLlxuICAgKiAgICAgfVxuICAgKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IG1heWJlSXRlcmFibGVcbiAgICogQHJldHVybiB7P2Z1bmN0aW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBtYXliZUl0ZXJhYmxlICYmIChJVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtJVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdKTtcbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBpdGVyYXRvckZuO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0aW9uIG9mIG1ldGhvZHMgdGhhdCBhbGxvdyBkZWNsYXJhdGlvbiBhbmQgdmFsaWRhdGlvbiBvZiBwcm9wcyB0aGF0IGFyZVxuICAgKiBzdXBwbGllZCB0byBSZWFjdCBjb21wb25lbnRzLiBFeGFtcGxlIHVzYWdlOlxuICAgKlxuICAgKiAgIHZhciBQcm9wcyA9IHJlcXVpcmUoJ1JlYWN0UHJvcFR5cGVzJyk7XG4gICAqICAgdmFyIE15QXJ0aWNsZSA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgIHByb3BUeXBlczoge1xuICAgKiAgICAgICAvLyBBbiBvcHRpb25hbCBzdHJpbmcgcHJvcCBuYW1lZCBcImRlc2NyaXB0aW9uXCIuXG4gICAqICAgICAgIGRlc2NyaXB0aW9uOiBQcm9wcy5zdHJpbmcsXG4gICAqXG4gICAqICAgICAgIC8vIEEgcmVxdWlyZWQgZW51bSBwcm9wIG5hbWVkIFwiY2F0ZWdvcnlcIi5cbiAgICogICAgICAgY2F0ZWdvcnk6IFByb3BzLm9uZU9mKFsnTmV3cycsJ1Bob3RvcyddKS5pc1JlcXVpcmVkLFxuICAgKlxuICAgKiAgICAgICAvLyBBIHByb3AgbmFtZWQgXCJkaWFsb2dcIiB0aGF0IHJlcXVpcmVzIGFuIGluc3RhbmNlIG9mIERpYWxvZy5cbiAgICogICAgICAgZGlhbG9nOiBQcm9wcy5pbnN0YW5jZU9mKERpYWxvZykuaXNSZXF1aXJlZFxuICAgKiAgICAgfSxcbiAgICogICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7IC4uLiB9XG4gICAqICAgfSk7XG4gICAqXG4gICAqIEEgbW9yZSBmb3JtYWwgc3BlY2lmaWNhdGlvbiBvZiBob3cgdGhlc2UgbWV0aG9kcyBhcmUgdXNlZDpcbiAgICpcbiAgICogICB0eXBlIDo9IGFycmF5fGJvb2x8ZnVuY3xvYmplY3R8bnVtYmVyfHN0cmluZ3xvbmVPZihbLi4uXSl8aW5zdGFuY2VPZiguLi4pXG4gICAqICAgZGVjbCA6PSBSZWFjdFByb3BUeXBlcy57dHlwZX0oLmlzUmVxdWlyZWQpP1xuICAgKlxuICAgKiBFYWNoIGFuZCBldmVyeSBkZWNsYXJhdGlvbiBwcm9kdWNlcyBhIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlLiBUaGlzXG4gICAqIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25zLiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogIHZhciBNeUxpbmsgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAqICAgIHByb3BUeXBlczoge1xuICAgKiAgICAgIC8vIEFuIG9wdGlvbmFsIHN0cmluZyBvciBVUkkgcHJvcCBuYW1lZCBcImhyZWZcIi5cbiAgICogICAgICBocmVmOiBmdW5jdGlvbihwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUpIHtcbiAgICogICAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAqICAgICAgICBpZiAocHJvcFZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHByb3BWYWx1ZSAhPT0gJ3N0cmluZycgJiZcbiAgICogICAgICAgICAgICAhKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFVSSSkpIHtcbiAgICogICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICogICAgICAgICAgICAnRXhwZWN0ZWQgYSBzdHJpbmcgb3IgYW4gVVJJIGZvciAnICsgcHJvcE5hbWUgKyAnIGluICcgK1xuICAgKiAgICAgICAgICAgIGNvbXBvbmVudE5hbWVcbiAgICogICAgICAgICAgKTtcbiAgICogICAgICAgIH1cbiAgICogICAgICB9XG4gICAqICAgIH0sXG4gICAqICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7Li4ufVxuICAgKiAgfSk7XG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cblxuICB2YXIgQU5PTllNT1VTID0gJzw8YW5vbnltb3VzPj4nO1xuXG4gIC8vIEltcG9ydGFudCFcbiAgLy8gS2VlcCB0aGlzIGxpc3QgaW4gc3luYyB3aXRoIHByb2R1Y3Rpb24gdmVyc2lvbiBpbiBgLi9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMuanNgLlxuICB2YXIgUmVhY3RQcm9wVHlwZXMgPSB7XG4gICAgYXJyYXk6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdhcnJheScpLFxuICAgIGJvb2w6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdib29sZWFuJyksXG4gICAgZnVuYzogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Z1bmN0aW9uJyksXG4gICAgbnVtYmVyOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignbnVtYmVyJyksXG4gICAgb2JqZWN0OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignb2JqZWN0JyksXG4gICAgc3RyaW5nOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignc3RyaW5nJyksXG4gICAgc3ltYm9sOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignc3ltYm9sJyksXG5cbiAgICBhbnk6IGNyZWF0ZUFueVR5cGVDaGVja2VyKCksXG4gICAgYXJyYXlPZjogY3JlYXRlQXJyYXlPZlR5cGVDaGVja2VyLFxuICAgIGVsZW1lbnQ6IGNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpLFxuICAgIGluc3RhbmNlT2Y6IGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIsXG4gICAgbm9kZTogY3JlYXRlTm9kZUNoZWNrZXIoKSxcbiAgICBvYmplY3RPZjogY3JlYXRlT2JqZWN0T2ZUeXBlQ2hlY2tlcixcbiAgICBvbmVPZjogY3JlYXRlRW51bVR5cGVDaGVja2VyLFxuICAgIG9uZU9mVHlwZTogY3JlYXRlVW5pb25UeXBlQ2hlY2tlcixcbiAgICBzaGFwZTogY3JlYXRlU2hhcGVUeXBlQ2hlY2tlcixcbiAgICBleGFjdDogY3JlYXRlU3RyaWN0U2hhcGVUeXBlQ2hlY2tlcixcbiAgfTtcblxuICAvKipcbiAgICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93blxuICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAgICovXG4gIC8qZXNsaW50LWRpc2FibGUgbm8tc2VsZi1jb21wYXJlKi9cbiAgZnVuY3Rpb24gaXMoeCwgeSkge1xuICAgIC8vIFNhbWVWYWx1ZSBhbGdvcml0aG1cbiAgICBpZiAoeCA9PT0geSkge1xuICAgICAgLy8gU3RlcHMgMS01LCA3LTEwXG4gICAgICAvLyBTdGVwcyA2LmItNi5lOiArMCAhPSAtMFxuICAgICAgcmV0dXJuIHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdGVwIDYuYTogTmFOID09IE5hTlxuICAgICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgICB9XG4gIH1cbiAgLyplc2xpbnQtZW5hYmxlIG5vLXNlbGYtY29tcGFyZSovXG5cbiAgLyoqXG4gICAqIFdlIHVzZSBhbiBFcnJvci1saWtlIG9iamVjdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhcyBwZW9wbGUgbWF5IGNhbGxcbiAgICogUHJvcFR5cGVzIGRpcmVjdGx5IGFuZCBpbnNwZWN0IHRoZWlyIG91dHB1dC4gSG93ZXZlciwgd2UgZG9uJ3QgdXNlIHJlYWxcbiAgICogRXJyb3JzIGFueW1vcmUuIFdlIGRvbid0IGluc3BlY3QgdGhlaXIgc3RhY2sgYW55d2F5LCBhbmQgY3JlYXRpbmcgdGhlbVxuICAgKiBpcyBwcm9oaWJpdGl2ZWx5IGV4cGVuc2l2ZSBpZiB0aGV5IGFyZSBjcmVhdGVkIHRvbyBvZnRlbiwgc3VjaCBhcyB3aGF0XG4gICAqIGhhcHBlbnMgaW4gb25lT2ZUeXBlKCkgZm9yIGFueSB0eXBlIGJlZm9yZSB0aGUgb25lIHRoYXQgbWF0Y2hlZC5cbiAgICovXG4gIGZ1bmN0aW9uIFByb3BUeXBlRXJyb3IobWVzc2FnZSkge1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5zdGFjayA9ICcnO1xuICB9XG4gIC8vIE1ha2UgYGluc3RhbmNlb2YgRXJyb3JgIHN0aWxsIHdvcmsgZm9yIHJldHVybmVkIGVycm9ycy5cbiAgUHJvcFR5cGVFcnJvci5wcm90b3R5cGUgPSBFcnJvci5wcm90b3R5cGU7XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIG1hbnVhbFByb3BUeXBlQ2FsbENhY2hlID0ge307XG4gICAgICB2YXIgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQgPSAwO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja1R5cGUoaXNSZXF1aXJlZCwgcHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHtcbiAgICAgIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lIHx8IEFOT05ZTU9VUztcbiAgICAgIHByb3BGdWxsTmFtZSA9IHByb3BGdWxsTmFtZSB8fCBwcm9wTmFtZTtcblxuICAgICAgaWYgKHNlY3JldCAhPT0gUmVhY3RQcm9wVHlwZXNTZWNyZXQpIHtcbiAgICAgICAgaWYgKHRocm93T25EaXJlY3RBY2Nlc3MpIHtcbiAgICAgICAgICAvLyBOZXcgYmVoYXZpb3Igb25seSBmb3IgdXNlcnMgb2YgYHByb3AtdHlwZXNgIHBhY2thZ2VcbiAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0NhbGxpbmcgUHJvcFR5cGVzIHZhbGlkYXRvcnMgZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UuICcgK1xuICAgICAgICAgICAgJ1VzZSBgUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzKClgIHRvIGNhbGwgdGhlbS4gJyArXG4gICAgICAgICAgICAnUmVhZCBtb3JlIGF0IGh0dHA6Ly9mYi5tZS91c2UtY2hlY2stcHJvcC10eXBlcydcbiAgICAgICAgICApO1xuICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIE9sZCBiZWhhdmlvciBmb3IgcGVvcGxlIHVzaW5nIFJlYWN0LlByb3BUeXBlc1xuICAgICAgICAgIHZhciBjYWNoZUtleSA9IGNvbXBvbmVudE5hbWUgKyAnOicgKyBwcm9wTmFtZTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGVbY2FjaGVLZXldICYmXG4gICAgICAgICAgICAvLyBBdm9pZCBzcGFtbWluZyB0aGUgY29uc29sZSBiZWNhdXNlIHRoZXkgYXJlIG9mdGVuIG5vdCBhY3Rpb25hYmxlIGV4Y2VwdCBmb3IgbGliIGF1dGhvcnNcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50IDwgM1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgICAnWW91IGFyZSBtYW51YWxseSBjYWxsaW5nIGEgUmVhY3QuUHJvcFR5cGVzIHZhbGlkYXRpb24gJyArXG4gICAgICAgICAgICAgICdmdW5jdGlvbiBmb3IgdGhlIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgcHJvcCBvbiBgJyArIGNvbXBvbmVudE5hbWUgICsgJ2AuIFRoaXMgaXMgZGVwcmVjYXRlZCAnICtcbiAgICAgICAgICAgICAgJ2FuZCB3aWxsIHRocm93IGluIHRoZSBzdGFuZGFsb25lIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAnICtcbiAgICAgICAgICAgICAgJ1lvdSBtYXkgYmUgc2VlaW5nIHRoaXMgd2FybmluZyBkdWUgdG8gYSB0aGlyZC1wYXJ0eSBQcm9wVHlwZXMgJyArXG4gICAgICAgICAgICAgICdsaWJyYXJ5LiBTZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC13YXJuaW5nLWRvbnQtY2FsbC1wcm9wdHlwZXMgJyArICdmb3IgZGV0YWlscy4nXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGVbY2FjaGVLZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgICAgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICAgICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1RoZSAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgaXMgbWFya2VkIGFzIHJlcXVpcmVkICcgKyAoJ2luIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBidXQgaXRzIHZhbHVlIGlzIGBudWxsYC4nKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignVGhlICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgaW4gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGJ1dCBpdHMgdmFsdWUgaXMgYHVuZGVmaW5lZGAuJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNoYWluZWRDaGVja1R5cGUgPSBjaGVja1R5cGUuYmluZChudWxsLCBmYWxzZSk7XG4gICAgY2hhaW5lZENoZWNrVHlwZS5pc1JlcXVpcmVkID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gY2hhaW5lZENoZWNrVHlwZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKGV4cGVjdGVkVHlwZSkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gZXhwZWN0ZWRUeXBlKSB7XG4gICAgICAgIC8vIGBwcm9wVmFsdWVgIGJlaW5nIGluc3RhbmNlIG9mLCBzYXksIGRhdGUvcmVnZXhwLCBwYXNzIHRoZSAnb2JqZWN0J1xuICAgICAgICAvLyBjaGVjaywgYnV0IHdlIGNhbiBvZmZlciBhIG1vcmUgcHJlY2lzZSBlcnJvciBtZXNzYWdlIGhlcmUgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gJ29mIHR5cGUgYG9iamVjdGAnLlxuICAgICAgICB2YXIgcHJlY2lzZVR5cGUgPSBnZXRQcmVjaXNlVHlwZShwcm9wVmFsdWUpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByZWNpc2VUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkICcpICsgKCdgJyArIGV4cGVjdGVkVHlwZSArICdgLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQW55VHlwZUNoZWNrZXIoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGwpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQXJyYXlPZlR5cGVDaGVja2VyKHR5cGVDaGVja2VyKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAodHlwZW9mIHR5cGVDaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignUHJvcGVydHkgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiBjb21wb25lbnQgYCcgKyBjb21wb25lbnROYW1lICsgJ2AgaGFzIGludmFsaWQgUHJvcFR5cGUgbm90YXRpb24gaW5zaWRlIGFycmF5T2YuJyk7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYW4gYXJyYXkuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVycm9yID0gdHlwZUNoZWNrZXIocHJvcFZhbHVlLCBpLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJ1snICsgaSArICddJywgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50VHlwZUNoZWNrZXIoKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgaWYgKCFpc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKSB7XG4gICAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGEgc2luZ2xlIFJlYWN0RWxlbWVudC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIoZXhwZWN0ZWRDbGFzcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKCEocHJvcHNbcHJvcE5hbWVdIGluc3RhbmNlb2YgZXhwZWN0ZWRDbGFzcykpIHtcbiAgICAgICAgdmFyIGV4cGVjdGVkQ2xhc3NOYW1lID0gZXhwZWN0ZWRDbGFzcy5uYW1lIHx8IEFOT05ZTU9VUztcbiAgICAgICAgdmFyIGFjdHVhbENsYXNzTmFtZSA9IGdldENsYXNzTmFtZShwcm9wc1twcm9wTmFtZV0pO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBhY3R1YWxDbGFzc05hbWUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2luc3RhbmNlIG9mIGAnICsgZXhwZWN0ZWRDbGFzc05hbWUgKyAnYC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVudW1UeXBlQ2hlY2tlcihleHBlY3RlZFZhbHVlcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShleHBlY3RlZFZhbHVlcykpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBwcmludFdhcm5pbmcoJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2YsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LicpIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHBlY3RlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaXMocHJvcFZhbHVlLCBleHBlY3RlZFZhbHVlc1tpXSkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgdmFsdWVzU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZXhwZWN0ZWRWYWx1ZXMpO1xuICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB2YWx1ZSBgJyArIHByb3BWYWx1ZSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBvbmUgb2YgJyArIHZhbHVlc1N0cmluZyArICcuJykpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlT2JqZWN0T2ZUeXBlQ2hlY2tlcih0eXBlQ2hlY2tlcikge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiB0eXBlQ2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1Byb3BlcnR5IGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgY29tcG9uZW50IGAnICsgY29tcG9uZW50TmFtZSArICdgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBvYmplY3RPZi4nKTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBvYmplY3QuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHByb3BWYWx1ZSkge1xuICAgICAgICBpZiAocHJvcFZhbHVlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIoYXJyYXlPZlR5cGVDaGVja2Vycykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhcnJheU9mVHlwZUNoZWNrZXJzKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHByaW50V2FybmluZygnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LicpIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGw7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheU9mVHlwZUNoZWNrZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hlY2tlciA9IGFycmF5T2ZUeXBlQ2hlY2tlcnNbaV07XG4gICAgICBpZiAodHlwZW9mIGNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mVHlwZS4gRXhwZWN0ZWQgYW4gYXJyYXkgb2YgY2hlY2sgZnVuY3Rpb25zLCBidXQgJyArXG4gICAgICAgICAgJ3JlY2VpdmVkICcgKyBnZXRQb3N0Zml4Rm9yVHlwZVdhcm5pbmcoY2hlY2tlcikgKyAnIGF0IGluZGV4ICcgKyBpICsgJy4nXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheU9mVHlwZUNoZWNrZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gYXJyYXlPZlR5cGVDaGVja2Vyc1tpXTtcbiAgICAgICAgaWYgKGNoZWNrZXIocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBSZWFjdFByb3BUeXBlc1NlY3JldCkgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agc3VwcGxpZWQgdG8gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AuJykpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlTm9kZUNoZWNrZXIoKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAoIWlzTm9kZShwcm9wc1twcm9wTmFtZV0pKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agc3VwcGxpZWQgdG8gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGEgUmVhY3ROb2RlLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU2hhcGVUeXBlQ2hlY2tlcihzaGFwZVR5cGVzKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlIGAnICsgcHJvcFR5cGUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYG9iamVjdGAuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHNoYXBlVHlwZXMpIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBzaGFwZVR5cGVzW2tleV07XG4gICAgICAgIGlmICghY2hlY2tlcikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvciA9IGNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVN0cmljdFNoYXBlVHlwZUNoZWNrZXIoc2hhcGVUeXBlcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSBgJyArIHByb3BUeXBlICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGBvYmplY3RgLicpKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgYWxsIGtleXMgaW4gY2FzZSBzb21lIGFyZSByZXF1aXJlZCBidXQgbWlzc2luZyBmcm9tXG4gICAgICAvLyBwcm9wcy5cbiAgICAgIHZhciBhbGxLZXlzID0gYXNzaWduKHt9LCBwcm9wc1twcm9wTmFtZV0sIHNoYXBlVHlwZXMpO1xuICAgICAgZm9yICh2YXIga2V5IGluIGFsbEtleXMpIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBzaGFwZVR5cGVzW2tleV07XG4gICAgICAgIGlmICghY2hlY2tlcikge1xuICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcihcbiAgICAgICAgICAgICdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBrZXkgYCcgKyBrZXkgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYC4nICtcbiAgICAgICAgICAgICdcXG5CYWQgb2JqZWN0OiAnICsgSlNPTi5zdHJpbmdpZnkocHJvcHNbcHJvcE5hbWVdLCBudWxsLCAnICAnKSArXG4gICAgICAgICAgICAnXFxuVmFsaWQga2V5czogJyArICBKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyhzaGFwZVR5cGVzKSwgbnVsbCwgJyAgJylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvciA9IGNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNOb2RlKHByb3BWYWx1ZSkge1xuICAgIHN3aXRjaCAodHlwZW9mIHByb3BWYWx1ZSkge1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICByZXR1cm4gIXByb3BWYWx1ZTtcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcFZhbHVlLmV2ZXJ5KGlzTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BWYWx1ZSA9PT0gbnVsbCB8fCBpc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4ocHJvcFZhbHVlKTtcbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwocHJvcFZhbHVlKTtcbiAgICAgICAgICB2YXIgc3RlcDtcbiAgICAgICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gcHJvcFZhbHVlLmVudHJpZXMpIHtcbiAgICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgaWYgKCFpc05vZGUoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSXRlcmF0b3Igd2lsbCBwcm92aWRlIGVudHJ5IFtrLHZdIHR1cGxlcyByYXRoZXIgdGhhbiB2YWx1ZXMuXG4gICAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNOb2RlKGVudHJ5WzFdKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc1N5bWJvbChwcm9wVHlwZSwgcHJvcFZhbHVlKSB7XG4gICAgLy8gTmF0aXZlIFN5bWJvbC5cbiAgICBpZiAocHJvcFR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddID09PSAnU3ltYm9sJ1xuICAgIGlmIChwcm9wVmFsdWVbJ0BAdG9TdHJpbmdUYWcnXSA9PT0gJ1N5bWJvbCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciBub24tc3BlYyBjb21wbGlhbnQgU3ltYm9scyB3aGljaCBhcmUgcG9seWZpbGxlZC5cbiAgICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBwcm9wVmFsdWUgaW5zdGFuY2VvZiBTeW1ib2wpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIEVxdWl2YWxlbnQgb2YgYHR5cGVvZmAgYnV0IHdpdGggc3BlY2lhbCBoYW5kbGluZyBmb3IgYXJyYXkgYW5kIHJlZ2V4cC5cbiAgZnVuY3Rpb24gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKSB7XG4gICAgdmFyIHByb3BUeXBlID0gdHlwZW9mIHByb3BWYWx1ZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ2FycmF5JztcbiAgICB9XG4gICAgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgLy8gT2xkIHdlYmtpdHMgKGF0IGxlYXN0IHVudGlsIEFuZHJvaWQgNC4wKSByZXR1cm4gJ2Z1bmN0aW9uJyByYXRoZXIgdGhhblxuICAgICAgLy8gJ29iamVjdCcgZm9yIHR5cGVvZiBhIFJlZ0V4cC4gV2UnbGwgbm9ybWFsaXplIHRoaXMgaGVyZSBzbyB0aGF0IC9ibGEvXG4gICAgICAvLyBwYXNzZXMgUHJvcFR5cGVzLm9iamVjdC5cbiAgICAgIHJldHVybiAnb2JqZWN0JztcbiAgICB9XG4gICAgaWYgKGlzU3ltYm9sKHByb3BUeXBlLCBwcm9wVmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ3N5bWJvbCc7XG4gICAgfVxuICAgIHJldHVybiBwcm9wVHlwZTtcbiAgfVxuXG4gIC8vIFRoaXMgaGFuZGxlcyBtb3JlIHR5cGVzIHRoYW4gYGdldFByb3BUeXBlYC4gT25seSB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy5cbiAgLy8gU2VlIGBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcmAuXG4gIGZ1bmN0aW9uIGdldFByZWNpc2VUeXBlKHByb3BWYWx1ZSkge1xuICAgIGlmICh0eXBlb2YgcHJvcFZhbHVlID09PSAndW5kZWZpbmVkJyB8fCBwcm9wVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJyArIHByb3BWYWx1ZTtcbiAgICB9XG4gICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICBpZiAocHJvcFR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICByZXR1cm4gJ2RhdGUnO1xuICAgICAgfSBlbHNlIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgcmV0dXJuICdyZWdleHAnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcFR5cGU7XG4gIH1cblxuICAvLyBSZXR1cm5zIGEgc3RyaW5nIHRoYXQgaXMgcG9zdGZpeGVkIHRvIGEgd2FybmluZyBhYm91dCBhbiBpbnZhbGlkIHR5cGUuXG4gIC8vIEZvciBleGFtcGxlLCBcInVuZGVmaW5lZFwiIG9yIFwib2YgdHlwZSBhcnJheVwiXG4gIGZ1bmN0aW9uIGdldFBvc3RmaXhGb3JUeXBlV2FybmluZyh2YWx1ZSkge1xuICAgIHZhciB0eXBlID0gZ2V0UHJlY2lzZVR5cGUodmFsdWUpO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnYXJyYXknOlxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgcmV0dXJuICdhbiAnICsgdHlwZTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICBjYXNlICdyZWdleHAnOlxuICAgICAgICByZXR1cm4gJ2EgJyArIHR5cGU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm5zIGNsYXNzIG5hbWUgb2YgdGhlIG9iamVjdCwgaWYgYW55LlxuICBmdW5jdGlvbiBnZXRDbGFzc05hbWUocHJvcFZhbHVlKSB7XG4gICAgaWYgKCFwcm9wVmFsdWUuY29uc3RydWN0b3IgfHwgIXByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lKSB7XG4gICAgICByZXR1cm4gQU5PTllNT1VTO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcFZhbHVlLmNvbnN0cnVjdG9yLm5hbWU7XG4gIH1cblxuICBSZWFjdFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcyA9IGNoZWNrUHJvcFR5cGVzO1xuICBSZWFjdFByb3BUeXBlcy5Qcm9wVHlwZXMgPSBSZWFjdFByb3BUeXBlcztcblxuICByZXR1cm4gUmVhY3RQcm9wVHlwZXM7XG59O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiZcbiAgICBTeW1ib2wuZm9yICYmXG4gICAgU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpKSB8fFxuICAgIDB4ZWFjNztcblxuICB2YXIgaXNWYWxpZEVsZW1lbnQgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiZcbiAgICAgIG9iamVjdCAhPT0gbnVsbCAmJlxuICAgICAgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG4gIH07XG5cbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgZGV2ZWxvcG1lbnQgYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgdmFyIHRocm93T25EaXJlY3RBY2Nlc3MgPSB0cnVlO1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMnKShpc1ZhbGlkRWxlbWVudCwgdGhyb3dPbkRpcmVjdEFjY2Vzcyk7XG59IGVsc2Uge1xuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBwcm9kdWN0aW9uIGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMnKSgpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9ICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RQcm9wVHlwZXNTZWNyZXQ7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbiEoZnVuY3Rpb24oZ2xvYmFsKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBPcCA9IE9iamVjdC5wcm90b3R5cGU7XG4gIHZhciBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIHVuZGVmaW5lZDsgLy8gTW9yZSBjb21wcmVzc2libGUgdGhhbiB2b2lkIDAuXG4gIHZhciAkU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiID8gU3ltYm9sIDoge307XG4gIHZhciBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgXCJAQGl0ZXJhdG9yXCI7XG4gIHZhciBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCI7XG4gIHZhciB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgXCJAQHRvU3RyaW5nVGFnXCI7XG5cbiAgdmFyIGluTW9kdWxlID0gdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIjtcbiAgdmFyIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lO1xuICBpZiAocnVudGltZSkge1xuICAgIGlmIChpbk1vZHVsZSkge1xuICAgICAgLy8gSWYgcmVnZW5lcmF0b3JSdW50aW1lIGlzIGRlZmluZWQgZ2xvYmFsbHkgYW5kIHdlJ3JlIGluIGEgbW9kdWxlLFxuICAgICAgLy8gbWFrZSB0aGUgZXhwb3J0cyBvYmplY3QgaWRlbnRpY2FsIHRvIHJlZ2VuZXJhdG9yUnVudGltZS5cbiAgICAgIG1vZHVsZS5leHBvcnRzID0gcnVudGltZTtcbiAgICB9XG4gICAgLy8gRG9uJ3QgYm90aGVyIGV2YWx1YXRpbmcgdGhlIHJlc3Qgb2YgdGhpcyBmaWxlIGlmIHRoZSBydW50aW1lIHdhc1xuICAgIC8vIGFscmVhZHkgZGVmaW5lZCBnbG9iYWxseS5cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBEZWZpbmUgdGhlIHJ1bnRpbWUgZ2xvYmFsbHkgKGFzIGV4cGVjdGVkIGJ5IGdlbmVyYXRlZCBjb2RlKSBhcyBlaXRoZXJcbiAgLy8gbW9kdWxlLmV4cG9ydHMgKGlmIHdlJ3JlIGluIGEgbW9kdWxlKSBvciBhIG5ldywgZW1wdHkgb2JqZWN0LlxuICBydW50aW1lID0gZ2xvYmFsLnJlZ2VuZXJhdG9yUnVudGltZSA9IGluTW9kdWxlID8gbW9kdWxlLmV4cG9ydHMgOiB7fTtcblxuICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gSWYgb3V0ZXJGbiBwcm92aWRlZCBhbmQgb3V0ZXJGbi5wcm90b3R5cGUgaXMgYSBHZW5lcmF0b3IsIHRoZW4gb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IuXG4gICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3I7XG4gICAgdmFyIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUocHJvdG9HZW5lcmF0b3IucHJvdG90eXBlKTtcbiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTtcblxuICAgIC8vIFRoZSAuX2ludm9rZSBtZXRob2QgdW5pZmllcyB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuXG4gICAgZ2VuZXJhdG9yLl9pbnZva2UgPSBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBydW50aW1lLndyYXAgPSB3cmFwO1xuXG4gIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAvLyByZWNvcmQgbGlrZSBjb250ZXh0LnRyeUVudHJpZXNbaV0uY29tcGxldGlvbi4gVGhpcyBpbnRlcmZhY2UgY291bGRcbiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlXG4gIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1ldGhvZCB3ZSB3YW50IHRvIGNhbGwsIHNvIHRoZXJlJ3Mgbm8gbmVlZFxuICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nXG4gIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gIC8vIGluIGV2ZXJ5IGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gdG91Y2ggdGhlIGFyZ3VtZW50cyBvYmplY3QuIFRoZVxuICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoXG4gIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkWWllbGQgPSBcInN1c3BlbmRlZFlpZWxkXCI7XG4gIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG5cbiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAvLyBicmVha2luZyBvdXQgb2YgdGhlIGRpc3BhdGNoIHN3aXRjaCBzdGF0ZW1lbnQuXG4gIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307XG5cbiAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kXG4gIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91clxuICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLlxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICAvLyBUaGlzIGlzIGEgcG9seWZpbGwgZm9yICVJdGVyYXRvclByb3RvdHlwZSUgZm9yIGVudmlyb25tZW50cyB0aGF0XG4gIC8vIGRvbid0IG5hdGl2ZWx5IHN1cHBvcnQgaXQuXG4gIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuICBJdGVyYXRvclByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuICB2YXIgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7XG4gIGlmIChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJlxuICAgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmXG4gICAgICBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpKSB7XG4gICAgLy8gVGhpcyBlbnZpcm9ubWVudCBoYXMgYSBuYXRpdmUgJUl0ZXJhdG9yUHJvdG90eXBlJTsgdXNlIGl0IGluc3RlYWRcbiAgICAvLyBvZiB0aGUgcG9seWZpbGwuXG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxuXG4gIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9XG4gICAgR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHcC5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZVt0b1N0cmluZ1RhZ1N5bWJvbF0gPVxuICAgIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIHByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIHZhciBjdG9yID0gdHlwZW9mIGdlbkZ1biA9PT0gXCJmdW5jdGlvblwiICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gY3RvclxuICAgICAgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fFxuICAgICAgICAvLyBGb3IgdGhlIG5hdGl2ZSBHZW5lcmF0b3JGdW5jdGlvbiBjb25zdHJ1Y3RvciwgdGhlIGJlc3Qgd2UgY2FuXG4gICAgICAgIC8vIGRvIGlzIHRvIGNoZWNrIGl0cyAubmFtZSBwcm9wZXJ0eS5cbiAgICAgICAgKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSA9PT0gXCJHZW5lcmF0b3JGdW5jdGlvblwiXG4gICAgICA6IGZhbHNlO1xuICB9O1xuXG4gIHJ1bnRpbWUubWFyayA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICAgICAgaWYgKCEodG9TdHJpbmdUYWdTeW1ib2wgaW4gZ2VuRnVuKSkge1xuICAgICAgICBnZW5GdW5bdG9TdHJpbmdUYWdTeW1ib2xdID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLlxuICBydW50aW1lLmF3cmFwID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZztcbiAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgaW52b2tlKFwibmV4dFwiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi4gSWYgdGhlIFByb21pc2UgaXMgcmVqZWN0ZWQsIGhvd2V2ZXIsIHRoZVxuICAgICAgICAgIC8vIHJlc3VsdCBmb3IgdGhpcyBpdGVyYXRpb24gd2lsbCBiZSByZWplY3RlZCB3aXRoIHRoZSBzYW1lXG4gICAgICAgICAgLy8gcmVhc29uLiBOb3RlIHRoYXQgcmVqZWN0aW9ucyBvZiB5aWVsZGVkIFByb21pc2VzIGFyZSBub3RcbiAgICAgICAgICAvLyB0aHJvd24gYmFjayBpbnRvIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24sIGFzIGlzIHRoZSBjYXNlXG4gICAgICAgICAgLy8gd2hlbiBhbiBhd2FpdGVkIFByb21pc2UgaXMgcmVqZWN0ZWQuIFRoaXMgZGlmZmVyZW5jZSBpblxuICAgICAgICAgIC8vIGJlaGF2aW9yIGJldHdlZW4geWllbGQgYW5kIGF3YWl0IGlzIGltcG9ydGFudCwgYmVjYXVzZSBpdFxuICAgICAgICAgIC8vIGFsbG93cyB0aGUgY29uc3VtZXIgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB0aGUgeWllbGRlZFxuICAgICAgICAgIC8vIHJlamVjdGlvbiAoc3dhbGxvdyBpdCBhbmQgY29udGludWUsIG1hbnVhbGx5IC50aHJvdyBpdCBiYWNrXG4gICAgICAgICAgLy8gaW50byB0aGUgZ2VuZXJhdG9yLCBhYmFuZG9uIGl0ZXJhdGlvbiwgd2hhdGV2ZXIpLiBXaXRoXG4gICAgICAgICAgLy8gYXdhaXQsIGJ5IGNvbnRyYXN0LCB0aGVyZSBpcyBubyBvcHBvcnR1bml0eSB0byBleGFtaW5lIHRoZVxuICAgICAgICAgIC8vIHJlamVjdGlvbiByZWFzb24gb3V0c2lkZSB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBzbyB0aGVcbiAgICAgICAgICAvLyBvbmx5IG9wdGlvbiBpcyB0byB0aHJvdyBpdCBmcm9tIHRoZSBhd2FpdCBleHByZXNzaW9uLCBhbmRcbiAgICAgICAgICAvLyBsZXQgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiBoYW5kbGUgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcmV2aW91c1Byb21pc2U7XG5cbiAgICBmdW5jdGlvbiBlbnF1ZXVlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPVxuICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsXG4gICAgICAgIC8vIGFsbCBwcmV2aW91cyBQcm9taXNlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgaW52b2tlLFxuICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmXG4gICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvXG4gICAgICAgIC8vIGNhbGwgaW52b2tlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgb24gYSBjYWxsYmFjayB0byBmaXJlLFxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkb1xuICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5XG4gICAgICAgIC8vIGlzIHdoeSB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGludm9rZXMgaXRzXG4gICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlXG4gICAgICAgIC8vIGFzeW5jIGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiBhc3luYyBnZW5lcmF0b3JzLCBpdCBpcyBlc3BlY2lhbGx5XG4gICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS5cbiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsXG4gICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXJcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmdcbiAgICAgICAgKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIHRoZSB1bmlmaWVkIGhlbHBlciBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cbiAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcbiAgQXN5bmNJdGVyYXRvci5wcm90b3R5cGVbYXN5bmNJdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIHJ1bnRpbWUuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIHJ1bnRpbWUuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3IoXG4gICAgICB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KVxuICAgICk7XG5cbiAgICByZXR1cm4gcnVudGltZS5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pXG4gICAgICA/IGl0ZXIgLy8gSWYgb3V0ZXJGbiBpcyBhIGdlbmVyYXRvciwgcmV0dXJuIHRoZSBmdWxsIGl0ZXJhdG9yLlxuICAgICAgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpO1xuICAgICAgICB9KTtcbiAgfTtcblxuICBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHtcbiAgICB2YXIgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZykge1xuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUV4ZWN1dGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlQ29tcGxldGVkKSB7XG4gICAgICAgIGlmIChtZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHRocm93IGFyZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJlIGZvcmdpdmluZywgcGVyIDI1LjMuMy4zLjMgb2YgdGhlIHNwZWM6XG4gICAgICAgIC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1nZW5lcmF0b3JyZXN1bWVcbiAgICAgICAgcmV0dXJuIGRvbmVSZXN1bHQoKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5tZXRob2QgPSBtZXRob2Q7XG4gICAgICBjb250ZXh0LmFyZyA9IGFyZztcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGRlbGVnYXRlID0gY29udGV4dC5kZWxlZ2F0ZTtcbiAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG4gICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgICAgIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZztcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmFyZztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInJldHVyblwiKSB7XG4gICAgICAgICAgY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgY29udGV4dC5hcmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUV4ZWN1dGluZztcblxuICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG4gICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICAgIC8vIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSBpbm5lckZuLCB3ZSBsZWF2ZSBzdGF0ZSA9PT1cbiAgICAgICAgICAvLyBHZW5TdGF0ZUV4ZWN1dGluZyBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVyIGludm9jYXRpb24uXG4gICAgICAgICAgc3RhdGUgPSBjb250ZXh0LmRvbmVcbiAgICAgICAgICAgID8gR2VuU3RhdGVDb21wbGV0ZWRcbiAgICAgICAgICAgIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDtcblxuICAgICAgICAgIGlmIChyZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsXG4gICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmVcbiAgICAgICAgICB9O1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV4Y2VwdGlvbiBieSBsb29waW5nIGJhY2sgYXJvdW5kIHRvIHRoZVxuICAgICAgICAgIC8vIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpIGNhbGwgYWJvdmUuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIENhbGwgZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdKGNvbnRleHQuYXJnKSBhbmQgaGFuZGxlIHRoZVxuICAvLyByZXN1bHQsIGVpdGhlciBieSByZXR1cm5pbmcgYSB7IHZhbHVlLCBkb25lIH0gcmVzdWx0IGZyb20gdGhlXG4gIC8vIGRlbGVnYXRlIGl0ZXJhdG9yLCBvciBieSBtb2RpZnlpbmcgY29udGV4dC5tZXRob2QgYW5kIGNvbnRleHQuYXJnLFxuICAvLyBzZXR0aW5nIGNvbnRleHQuZGVsZWdhdGUgdG8gbnVsbCwgYW5kIHJldHVybmluZyB0aGUgQ29udGludWVTZW50aW5lbC5cbiAgZnVuY3Rpb24gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCkge1xuICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF07XG4gICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBBIC50aHJvdyBvciAucmV0dXJuIHdoZW4gdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBubyAudGhyb3dcbiAgICAgIC8vIG1ldGhvZCBhbHdheXMgdGVybWluYXRlcyB0aGUgeWllbGQqIGxvb3AuXG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgaWYgKGRlbGVnYXRlLml0ZXJhdG9yLnJldHVybikge1xuICAgICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIC8vIElmIG1heWJlSW52b2tlRGVsZWdhdGUoY29udGV4dCkgY2hhbmdlZCBjb250ZXh0Lm1ldGhvZCBmcm9tXG4gICAgICAgICAgICAvLyBcInJldHVyblwiIHRvIFwidGhyb3dcIiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy5cbiAgICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuXG4gICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG5cbiAgICBpZiAoISBpbmZvKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAvLyBBc3NpZ24gdGhlIHJlc3VsdCBvZiB0aGUgZmluaXNoZWQgZGVsZWdhdGUgdG8gdGhlIHRlbXBvcmFyeVxuICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuXG4gICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jO1xuXG4gICAgICAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgXCJ0aHJvd1wiIGJ1dCB0aGUgZGVsZWdhdGUgaGFuZGxlZCB0aGVcbiAgICAgIC8vIGV4Y2VwdGlvbiwgbGV0IHRoZSBvdXRlciBnZW5lcmF0b3IgcHJvY2VlZCBub3JtYWxseS4gSWZcbiAgICAgIC8vIGNvbnRleHQubWV0aG9kIHdhcyBcIm5leHRcIiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuXG4gICAgICAvLyBcImNvbnN1bWVkXCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXNcbiAgICAgIC8vIFwicmV0dXJuXCIsIGFsbG93IHRoZSBvcmlnaW5hbCAucmV0dXJuIGNhbGwgdG8gY29udGludWUgaW4gdGhlXG4gICAgICAvLyBvdXRlciBnZW5lcmF0b3IuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgIT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLlxuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgLy8gVGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGlzIGZpbmlzaGVkLCBzbyBmb3JnZXQgaXQgYW5kIGNvbnRpbnVlIHdpdGhcbiAgICAvLyB0aGUgb3V0ZXIgZ2VuZXJhdG9yLlxuICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICB9XG5cbiAgLy8gRGVmaW5lIEdlbmVyYXRvci5wcm90b3R5cGUue25leHQsdGhyb3cscmV0dXJufSBpbiB0ZXJtcyBvZiB0aGVcbiAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLlxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuXG4gIEdwW3RvU3RyaW5nVGFnU3ltYm9sXSA9IFwiR2VuZXJhdG9yXCI7XG5cbiAgLy8gQSBHZW5lcmF0b3Igc2hvdWxkIGFsd2F5cyByZXR1cm4gaXRzZWxmIGFzIHRoZSBpdGVyYXRvciBvYmplY3Qgd2hlbiB0aGVcbiAgLy8gQEBpdGVyYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgb24gaXQuIFNvbWUgYnJvd3NlcnMnIGltcGxlbWVudGF0aW9ucyBvZiB0aGVcbiAgLy8gaXRlcmF0b3IgcHJvdG90eXBlIGNoYWluIGluY29ycmVjdGx5IGltcGxlbWVudCB0aGlzLCBjYXVzaW5nIHRoZSBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0IHRvIG5vdCBiZSByZXR1cm5lZCBmcm9tIHRoaXMgY2FsbC4gVGhpcyBlbnN1cmVzIHRoYXQgZG9lc24ndCBoYXBwZW4uXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvaXNzdWVzLzI3NCBmb3IgbW9yZSBkZXRhaWxzLlxuICBHcFtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBHcC50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcIltvYmplY3QgR2VuZXJhdG9yXVwiO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgdmFyIGVudHJ5ID0geyB0cnlMb2M6IGxvY3NbMF0gfTtcblxuICAgIGlmICgxIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXTtcbiAgICB9XG5cbiAgICBpZiAoMiBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXTtcbiAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTtcbiAgICB9XG5cbiAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7XG4gICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307XG4gICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiO1xuICAgIGRlbGV0ZSByZWNvcmQuYXJnO1xuICAgIGVudHJ5LmNvbXBsZXRpb24gPSByZWNvcmQ7XG4gIH1cblxuICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gVGhlIHJvb3QgZW50cnkgb2JqZWN0IChlZmZlY3RpdmVseSBhIHRyeSBzdGF0ZW1lbnQgd2l0aG91dCBhIGNhdGNoXG4gICAgLy8gb3IgYSBmaW5hbGx5IGJsb2NrKSBnaXZlcyB1cyBhIHBsYWNlIHRvIHN0b3JlIHZhbHVlcyB0aHJvd24gZnJvbVxuICAgIC8vIGxvY2F0aW9ucyB3aGVyZSB0aGVyZSBpcyBubyBlbmNsb3NpbmcgdHJ5IHN0YXRlbWVudC5cbiAgICB0aGlzLnRyeUVudHJpZXMgPSBbeyB0cnlMb2M6IFwicm9vdFwiIH1dO1xuICAgIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKTtcbiAgICB0aGlzLnJlc2V0KHRydWUpO1xuICB9XG5cbiAgcnVudGltZS5rZXlzID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gICAga2V5cy5yZXZlcnNlKCk7XG5cbiAgICAvLyBSYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdpdGggYSBuZXh0IG1ldGhvZCwgd2Uga2VlcFxuICAgIC8vIHRoaW5ncyBzaW1wbGUgYW5kIHJldHVybiB0aGUgbmV4dCBmdW5jdGlvbiBpdHNlbGYuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB3aGlsZSAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgbmV4dC52YWx1ZSA9IGtleTtcbiAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUbyBhdm9pZCBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIG9iamVjdCwgd2UganVzdCBoYW5nIHRoZSAudmFsdWVcbiAgICAgIC8vIGFuZCAuZG9uZSBwcm9wZXJ0aWVzIG9mZiB0aGUgbmV4dCBmdW5jdGlvbiBvYmplY3QgaXRzZWxmLiBUaGlzXG4gICAgICAvLyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgbWluaWZpZXIgd2lsbCBub3QgYW5vbnltaXplIHRoZSBmdW5jdGlvbi5cbiAgICAgIG5leHQuZG9uZSA9IHRydWU7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkge1xuICAgIGlmIChpdGVyYWJsZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gaXRlcmFibGVbaXRlcmF0b3JTeW1ib2xdO1xuICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYWJsZS5uZXh0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIGkgPSAtMSwgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGl0ZXJhYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkge1xuICAgICAgICAgICAgICBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXh0LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG5leHQuZG9uZSA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV4dC5uZXh0ID0gbmV4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYW4gaXRlcmF0b3Igd2l0aCBubyB2YWx1ZXMuXG4gICAgcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9O1xuICB9XG4gIHJ1bnRpbWUudmFsdWVzID0gdmFsdWVzO1xuXG4gIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG5cbiAgQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6IENvbnRleHQsXG5cbiAgICByZXNldDogZnVuY3Rpb24oc2tpcFRlbXBSZXNldCkge1xuICAgICAgdGhpcy5wcmV2ID0gMDtcbiAgICAgIHRoaXMubmV4dCA9IDA7XG4gICAgICAvLyBSZXNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpO1xuXG4gICAgICBpZiAoIXNraXBUZW1wUmVzZXQpIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSB7XG4gICAgICAgICAgLy8gTm90IHN1cmUgYWJvdXQgdGhlIG9wdGltYWwgb3JkZXIgb2YgdGhlc2UgY29uZGl0aW9uczpcbiAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT09IFwidFwiICYmXG4gICAgICAgICAgICAgIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmXG4gICAgICAgICAgICAgICFpc05hTigrbmFtZS5zbGljZSgxKSkpIHtcbiAgICAgICAgICAgIHRoaXNbbmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcblxuICAgICAgdmFyIHJvb3RFbnRyeSA9IHRoaXMudHJ5RW50cmllc1swXTtcbiAgICAgIHZhciByb290UmVjb3JkID0gcm9vdEVudHJ5LmNvbXBsZXRpb247XG4gICAgICBpZiAocm9vdFJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcm9vdFJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJ2YWw7XG4gICAgfSxcblxuICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbihleGNlcHRpb24pIHtcbiAgICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgICBmdW5jdGlvbiBoYW5kbGUobG9jLCBjYXVnaHQpIHtcbiAgICAgICAgcmVjb3JkLnR5cGUgPSBcInRocm93XCI7XG4gICAgICAgIHJlY29yZC5hcmcgPSBleGNlcHRpb247XG4gICAgICAgIGNvbnRleHQubmV4dCA9IGxvYztcblxuICAgICAgICBpZiAoY2F1Z2h0KSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRpc3BhdGNoZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgYnkgYSBjYXRjaCBibG9jayxcbiAgICAgICAgICAvLyB0aGVuIGxldCB0aGF0IGNhdGNoIGJsb2NrIGhhbmRsZSB0aGUgZXhjZXB0aW9uIG5vcm1hbGx5LlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gISEgY2F1Z2h0O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gXCJyb290XCIpIHtcbiAgICAgICAgICAvLyBFeGNlcHRpb24gdGhyb3duIG91dHNpZGUgb2YgYW55IHRyeSBibG9jayB0aGF0IGNvdWxkIGhhbmRsZVxuICAgICAgICAgIC8vIGl0LCBzbyBzZXQgdGhlIGNvbXBsZXRpb24gdmFsdWUgb2YgdGhlIGVudGlyZSBmdW5jdGlvbiB0b1xuICAgICAgICAgIC8vIHRocm93IHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmV0dXJuIGhhbmRsZShcImVuZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7XG4gICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksIFwiY2F0Y2hMb2NcIik7XG4gICAgICAgICAgdmFyIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpO1xuXG4gICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhYnJ1cHQ6IGZ1bmN0aW9uKHR5cGUsIGFyZykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2ICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmXG4gICAgICAgICAgICB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkgJiZcbiAgICAgICAgICAodHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgIHR5cGUgPT09IFwiY29udGludWVcIikgJiZcbiAgICAgICAgICBmaW5hbGx5RW50cnkudHJ5TG9jIDw9IGFyZyAmJlxuICAgICAgICAgIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAvLyBJZ25vcmUgdGhlIGZpbmFsbHkgZW50cnkgaWYgY29udHJvbCBpcyBub3QganVtcGluZyB0byBhXG4gICAgICAgIC8vIGxvY2F0aW9uIG91dHNpZGUgdGhlIHRyeS9jYXRjaCBibG9jay5cbiAgICAgICAgZmluYWxseUVudHJ5ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307XG4gICAgICByZWNvcmQudHlwZSA9IHR5cGU7XG4gICAgICByZWNvcmQuYXJnID0gYXJnO1xuXG4gICAgICBpZiAoZmluYWxseUVudHJ5KSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jO1xuICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY29tcGxldGUocmVjb3JkKTtcbiAgICB9LFxuXG4gICAgY29tcGxldGU6IGZ1bmN0aW9uKHJlY29yZCwgYWZ0ZXJMb2MpIHtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgcmVjb3JkLnR5cGUgPT09IFwiY29udGludWVcIikge1xuICAgICAgICB0aGlzLm5leHQgPSByZWNvcmQuYXJnO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICB0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gXCJlbmRcIjtcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgYWZ0ZXJMb2MpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gYWZ0ZXJMb2M7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH0sXG5cbiAgICBmaW5pc2g6IGZ1bmN0aW9uKGZpbmFsbHlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykge1xuICAgICAgICAgIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpO1xuICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIFwiY2F0Y2hcIjogZnVuY3Rpb24odHJ5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG4gICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnO1xuICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aHJvd247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNvbnRleHQuY2F0Y2ggbWV0aG9kIG11c3Qgb25seSBiZSBjYWxsZWQgd2l0aCBhIGxvY2F0aW9uXG4gICAgICAvLyBhcmd1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEga25vd24gY2F0Y2ggYmxvY2suXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHRcIik7XG4gICAgfSxcblxuICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uKGl0ZXJhYmxlLCByZXN1bHROYW1lLCBuZXh0TG9jKSB7XG4gICAgICB0aGlzLmRlbGVnYXRlID0ge1xuICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSxcbiAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSxcbiAgICAgICAgbmV4dExvYzogbmV4dExvY1xuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZm9yZ2V0IHRoZSBsYXN0IHNlbnQgdmFsdWUgc28gdGhhdCB3ZSBkb24ndFxuICAgICAgICAvLyBhY2NpZGVudGFsbHkgcGFzcyBpdCBvbiB0byB0aGUgZGVsZWdhdGUuXG4gICAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG4gIH07XG59KShcbiAgLy8gSW4gc2xvcHB5IG1vZGUsIHVuYm91bmQgYHRoaXNgIHJlZmVycyB0byB0aGUgZ2xvYmFsIG9iamVjdCwgZmFsbGJhY2sgdG9cbiAgLy8gRnVuY3Rpb24gY29uc3RydWN0b3IgaWYgd2UncmUgaW4gZ2xvYmFsIHN0cmljdCBtb2RlLiBUaGF0IGlzIHNhZGx5IGEgZm9ybVxuICAvLyBvZiBpbmRpcmVjdCBldmFsIHdoaWNoIHZpb2xhdGVzIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5LlxuICAoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzIH0pKCkgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpXG4pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTEVBRl9LRVksIGhhc1dlYWtNYXA7XG5cbi8qKlxuICogQXJiaXRyYXJ5IHZhbHVlIHVzZWQgYXMga2V5IGZvciByZWZlcmVuY2luZyBjYWNoZSBvYmplY3QgaW4gV2Vha01hcCB0cmVlLlxuICpcbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cbkxFQUZfS0VZID0ge307XG5cbi8qKlxuICogV2hldGhlciBlbnZpcm9ubWVudCBzdXBwb3J0cyBXZWFrTWFwLlxuICpcbiAqIEB0eXBlIHtib29sZWFufVxuICovXG5oYXNXZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgIT09ICd1bmRlZmluZWQnO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IGFzIHRoZSBzb2xlIGVudHJ5IGluIGFuIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gcmV0dXJuLlxuICpcbiAqIEByZXR1cm4ge0FycmF5fSBWYWx1ZSByZXR1cm5lZCBhcyBlbnRyeSBpbiBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlPZiggdmFsdWUgKSB7XG5cdHJldHVybiBbIHZhbHVlIF07XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgb2JqZWN0LWxpa2UsIG9yIGZhbHNlIG90aGVyd2lzZS4gQSB2YWx1ZVxuICogaXMgb2JqZWN0LWxpa2UgaWYgaXQgY2FuIHN1cHBvcnQgcHJvcGVydHkgYXNzaWdubWVudCwgZS5nLiBvYmplY3Qgb3IgYXJyYXkuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdmFsdWUgaXMgb2JqZWN0LWxpa2UuXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSggdmFsdWUgKSB7XG5cdHJldHVybiAhISB2YWx1ZSAmJiAnb2JqZWN0JyA9PT0gdHlwZW9mIHZhbHVlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgY2FjaGUgb2JqZWN0LlxuICpcbiAqIEByZXR1cm4ge09iamVjdH0gQ2FjaGUgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBjcmVhdGVDYWNoZSgpIHtcblx0dmFyIGNhY2hlID0ge1xuXHRcdGNsZWFyOiBmdW5jdGlvbigpIHtcblx0XHRcdGNhY2hlLmhlYWQgPSBudWxsO1xuXHRcdH0sXG5cdH07XG5cblx0cmV0dXJuIGNhY2hlO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBlbnRyaWVzIHdpdGhpbiB0aGUgdHdvIGFycmF5cyBhcmUgc3RyaWN0bHkgZXF1YWwgYnlcbiAqIHJlZmVyZW5jZSBmcm9tIGEgc3RhcnRpbmcgaW5kZXguXG4gKlxuICogQHBhcmFtIHtBcnJheX0gIGEgICAgICAgICBGaXJzdCBhcnJheS5cbiAqIEBwYXJhbSB7QXJyYXl9ICBiICAgICAgICAgU2Vjb25kIGFycmF5LlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBJbmRleCBmcm9tIHdoaWNoIHRvIHN0YXJ0IGNvbXBhcmlzb24uXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciBhcnJheXMgYXJlIHNoYWxsb3dseSBlcXVhbC5cbiAqL1xuZnVuY3Rpb24gaXNTaGFsbG93RXF1YWwoIGEsIGIsIGZyb21JbmRleCApIHtcblx0dmFyIGk7XG5cblx0aWYgKCBhLmxlbmd0aCAhPT0gYi5sZW5ndGggKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Zm9yICggaSA9IGZyb21JbmRleDsgaSA8IGEubGVuZ3RoOyBpKysgKSB7XG5cdFx0aWYgKCBhWyBpIF0gIT09IGJbIGkgXSApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgbWVtb2l6ZWQgc2VsZWN0b3IgZnVuY3Rpb24uIFRoZSBnZXREZXBlbmRhbnRzIGZ1bmN0aW9uIGFyZ3VtZW50IGlzXG4gKiBjYWxsZWQgYmVmb3JlIHRoZSBtZW1vaXplZCBzZWxlY3RvciBhbmQgaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIGFuIGltbXV0YWJsZVxuICogcmVmZXJlbmNlIG9yIGFycmF5IG9mIHJlZmVyZW5jZXMgb24gd2hpY2ggdGhlIHNlbGVjdG9yIGRlcGVuZHMgZm9yIGNvbXB1dGluZ1xuICogaXRzIG93biByZXR1cm4gdmFsdWUuIFRoZSBtZW1vaXplIGNhY2hlIGlzIHByZXNlcnZlZCBvbmx5IGFzIGxvbmcgYXMgdGhvc2VcbiAqIGRlcGVuZGFudCByZWZlcmVuY2VzIHJlbWFpbiB0aGUgc2FtZS4gSWYgZ2V0RGVwZW5kYW50cyByZXR1cm5zIGEgZGlmZmVyZW50XG4gKiByZWZlcmVuY2UocyksIHRoZSBjYWNoZSBpcyBjbGVhcmVkIGFuZCB0aGUgc2VsZWN0b3IgdmFsdWUgcmVnZW5lcmF0ZWQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZWN0b3IgICAgICBTZWxlY3RvciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGdldERlcGVuZGFudHMgRGVwZW5kYW50IGdldHRlciByZXR1cm5pbmcgYW4gaW1tdXRhYmxlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSBvciBhcnJheSBvZiByZWZlcmVuY2UgdXNlZCBpblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZSBidXN0IGNvbnNpZGVyYXRpb24uXG4gKlxuICogQHJldHVybiB7RnVuY3Rpb259IE1lbW9pemVkIHNlbGVjdG9yLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiggc2VsZWN0b3IsIGdldERlcGVuZGFudHMgKSB7XG5cdHZhciByb290Q2FjaGUsIGdldENhY2hlO1xuXG5cdC8vIFVzZSBvYmplY3Qgc291cmNlIGFzIGRlcGVuZGFudCBpZiBnZXR0ZXIgbm90IHByb3ZpZGVkXG5cdGlmICggISBnZXREZXBlbmRhbnRzICkge1xuXHRcdGdldERlcGVuZGFudHMgPSBhcnJheU9mO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHJvb3QgY2FjaGUuIElmIFdlYWtNYXAgaXMgc3VwcG9ydGVkLCB0aGlzIGlzIGFzc2lnbmVkIHRvIHRoZVxuXHQgKiByb290IFdlYWtNYXAgY2FjaGUgc2V0LCBvdGhlcndpc2UgaXQgaXMgYSBzaGFyZWQgaW5zdGFuY2Ugb2YgdGhlIGRlZmF1bHRcblx0ICogY2FjaGUgb2JqZWN0LlxuXHQgKlxuXHQgKiBAcmV0dXJuIHsoV2Vha01hcHxPYmplY3QpfSBSb290IGNhY2hlIG9iamVjdC5cblx0ICovXG5cdGZ1bmN0aW9uIGdldFJvb3RDYWNoZSgpIHtcblx0XHRyZXR1cm4gcm9vdENhY2hlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGNhY2hlIGZvciBhIGdpdmVuIGRlcGVuZGFudHMgYXJyYXkuIFdoZW4gcG9zc2libGUsIGEgV2Vha01hcFxuXHQgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgdW5pcXVlIGNhY2hlIGZvciBlYWNoIHNldCBvZiBkZXBlbmRhbnRzLiBUaGlzXG5cdCAqIGlzIGZlYXNpYmxlIGR1ZSB0byB0aGUgbmF0dXJlIG9mIFdlYWtNYXAgaW4gYWxsb3dpbmcgZ2FyYmFnZSBjb2xsZWN0aW9uXG5cdCAqIHRvIG9jY3VyIG9uIGVudHJpZXMgd2hlcmUgdGhlIGtleSBvYmplY3QgaXMgbm8gbG9uZ2VyIHJlZmVyZW5jZWQuIFNpbmNlXG5cdCAqIFdlYWtNYXAgcmVxdWlyZXMgdGhlIGtleSB0byBiZSBhbiBvYmplY3QsIHRoaXMgaXMgb25seSBwb3NzaWJsZSB3aGVuIHRoZVxuXHQgKiBkZXBlbmRhbnQgaXMgb2JqZWN0LWxpa2UuIFRoZSByb290IGNhY2hlIGlzIGNyZWF0ZWQgYXMgYSBoaWVyYXJjaHkgd2hlcmVcblx0ICogZWFjaCB0b3AtbGV2ZWwga2V5IGlzIHRoZSBmaXJzdCBlbnRyeSBpbiBhIGRlcGVuZGFudHMgc2V0LCB0aGUgdmFsdWUgYVxuXHQgKiBXZWFrTWFwIHdoZXJlIGVhY2gga2V5IGlzIHRoZSBuZXh0IGRlcGVuZGFudCwgYW5kIHNvIG9uLiBUaGlzIGNvbnRpbnVlc1xuXHQgKiBzbyBsb25nIGFzIHRoZSBkZXBlbmRhbnRzIGFyZSBvYmplY3QtbGlrZS4gSWYgbm8gZGVwZW5kYW50cyBhcmUgb2JqZWN0LVxuXHQgKiBsaWtlLCB0aGVuIHRoZSBjYWNoZSBpcyBzaGFyZWQgYWNyb3NzIGFsbCBpbnZvY2F0aW9ucy5cblx0ICpcblx0ICogQHNlZSBpc09iamVjdExpa2Vcblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gZGVwZW5kYW50cyBTZWxlY3RvciBkZXBlbmRhbnRzLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IENhY2hlIG9iamVjdC5cblx0ICovXG5cdGZ1bmN0aW9uIGdldFdlYWtNYXBDYWNoZSggZGVwZW5kYW50cyApIHtcblx0XHR2YXIgY2FjaGVzID0gcm9vdENhY2hlLFxuXHRcdFx0aXNVbmlxdWVCeURlcGVuZGFudHMgPSB0cnVlLFxuXHRcdFx0aSwgZGVwZW5kYW50LCBtYXAsIGNhY2hlO1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCBkZXBlbmRhbnRzLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0ZGVwZW5kYW50ID0gZGVwZW5kYW50c1sgaSBdO1xuXG5cdFx0XHQvLyBDYW4gb25seSBjb21wb3NlIFdlYWtNYXAgZnJvbSBvYmplY3QtbGlrZSBrZXkuXG5cdFx0XHRpZiAoICEgaXNPYmplY3RMaWtlKCBkZXBlbmRhbnQgKSApIHtcblx0XHRcdFx0aXNVbmlxdWVCeURlcGVuZGFudHMgPSBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdC8vIERvZXMgY3VycmVudCBzZWdtZW50IG9mIGNhY2hlIGFscmVhZHkgaGF2ZSBhIFdlYWtNYXA/XG5cdFx0XHRpZiAoIGNhY2hlcy5oYXMoIGRlcGVuZGFudCApICkge1xuXHRcdFx0XHQvLyBUcmF2ZXJzZSBpbnRvIG5lc3RlZCBXZWFrTWFwLlxuXHRcdFx0XHRjYWNoZXMgPSBjYWNoZXMuZ2V0KCBkZXBlbmRhbnQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIENyZWF0ZSwgc2V0LCBhbmQgdHJhdmVyc2UgaW50byBhIG5ldyBvbmUuXG5cdFx0XHRcdG1hcCA9IG5ldyBXZWFrTWFwKCk7XG5cdFx0XHRcdGNhY2hlcy5zZXQoIGRlcGVuZGFudCwgbWFwICk7XG5cdFx0XHRcdGNhY2hlcyA9IG1hcDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBXZSB1c2UgYW4gYXJiaXRyYXJ5IChidXQgY29uc2lzdGVudCkgb2JqZWN0IGFzIGtleSBmb3IgdGhlIGxhc3QgaXRlbVxuXHRcdC8vIGluIHRoZSBXZWFrTWFwIHRvIHNlcnZlIGFzIG91ciBydW5uaW5nIGNhY2hlLlxuXHRcdGlmICggISBjYWNoZXMuaGFzKCBMRUFGX0tFWSApICkge1xuXHRcdFx0Y2FjaGUgPSBjcmVhdGVDYWNoZSgpO1xuXHRcdFx0Y2FjaGUuaXNVbmlxdWVCeURlcGVuZGFudHMgPSBpc1VuaXF1ZUJ5RGVwZW5kYW50cztcblx0XHRcdGNhY2hlcy5zZXQoIExFQUZfS0VZLCBjYWNoZSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBjYWNoZXMuZ2V0KCBMRUFGX0tFWSApO1xuXHR9XG5cblx0Ly8gQXNzaWduIGNhY2hlIGhhbmRsZXIgYnkgYXZhaWxhYmlsaXR5IG9mIFdlYWtNYXBcblx0Z2V0Q2FjaGUgPSBoYXNXZWFrTWFwID8gZ2V0V2Vha01hcENhY2hlIDogZ2V0Um9vdENhY2hlO1xuXG5cdC8qKlxuXHQgKiBSZXNldHMgcm9vdCBtZW1vaXphdGlvbiBjYWNoZS5cblx0ICovXG5cdGZ1bmN0aW9uIGNsZWFyKCkge1xuXHRcdHJvb3RDYWNoZSA9IGhhc1dlYWtNYXAgPyBuZXcgV2Vha01hcCgpIDogY3JlYXRlQ2FjaGUoKTtcblx0fVxuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9jaGVjay1wYXJhbS1uYW1lc1xuXHQvKipcblx0ICogVGhlIGF1Z21lbnRlZCBzZWxlY3RvciBjYWxsLCBjb25zaWRlcmluZyBmaXJzdCB3aGV0aGVyIGRlcGVuZGFudHMgaGF2ZVxuXHQgKiBjaGFuZ2VkIGJlZm9yZSBwYXNzaW5nIGl0IHRvIHVuZGVybHlpbmcgbWVtb2l6ZSBmdW5jdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSAgICBTb3VyY2Ugb2JqZWN0IGZvciBkZXJpdmF0aW9uLlxuXHQgKiBAcGFyYW0gey4uLip9ICAgZXh0cmFBcmdzIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gc2VsZWN0b3IuXG5cdCAqXG5cdCAqIEByZXR1cm4geyp9IFNlbGVjdG9yIHJlc3VsdC5cblx0ICovXG5cdGZ1bmN0aW9uIGNhbGxTZWxlY3RvciggLyogc291cmNlLCAuLi5leHRyYUFyZ3MgKi8gKSB7XG5cdFx0dmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsXG5cdFx0XHRjYWNoZSwgbm9kZSwgaSwgYXJncywgZGVwZW5kYW50cztcblxuXHRcdC8vIENyZWF0ZSBjb3B5IG9mIGFyZ3VtZW50cyAoYXZvaWQgbGVha2luZyBkZW9wdGltaXphdGlvbikuXG5cdFx0YXJncyA9IG5ldyBBcnJheSggbGVuICk7XG5cdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGFyZ3NbIGkgXSA9IGFyZ3VtZW50c1sgaSBdO1xuXHRcdH1cblxuXHRcdGRlcGVuZGFudHMgPSBnZXREZXBlbmRhbnRzLmFwcGx5KCBudWxsLCBhcmdzICk7XG5cdFx0Y2FjaGUgPSBnZXRDYWNoZSggZGVwZW5kYW50cyApO1xuXG5cdFx0Ly8gSWYgbm90IGd1YXJhbnRlZWQgdW5pcXVlbmVzcyBieSBkZXBlbmRhbnRzIChwcmltaXRpdmUgdHlwZSBvciBsYWNrXG5cdFx0Ly8gb2YgV2Vha01hcCBzdXBwb3J0KSwgc2hhbGxvdyBjb21wYXJlIGFnYWluc3QgbGFzdCBkZXBlbmRhbnRzIGFuZCwgaWZcblx0XHQvLyByZWZlcmVuY2VzIGhhdmUgY2hhbmdlZCwgZGVzdHJveSBjYWNoZSB0byByZWNhbGN1bGF0ZSByZXN1bHQuXG5cdFx0aWYgKCAhIGNhY2hlLmlzVW5pcXVlQnlEZXBlbmRhbnRzICkge1xuXHRcdFx0aWYgKCBjYWNoZS5sYXN0RGVwZW5kYW50cyAmJiAhIGlzU2hhbGxvd0VxdWFsKCBkZXBlbmRhbnRzLCBjYWNoZS5sYXN0RGVwZW5kYW50cywgMCApICkge1xuXHRcdFx0XHRjYWNoZS5jbGVhcigpO1xuXHRcdFx0fVxuXG5cdFx0XHRjYWNoZS5sYXN0RGVwZW5kYW50cyA9IGRlcGVuZGFudHM7XG5cdFx0fVxuXG5cdFx0bm9kZSA9IGNhY2hlLmhlYWQ7XG5cdFx0d2hpbGUgKCBub2RlICkge1xuXHRcdFx0Ly8gQ2hlY2sgd2hldGhlciBub2RlIGFyZ3VtZW50cyBtYXRjaCBhcmd1bWVudHNcblx0XHRcdGlmICggISBpc1NoYWxsb3dFcXVhbCggbm9kZS5hcmdzLCBhcmdzLCAxICkgKSB7XG5cdFx0XHRcdG5vZGUgPSBub2RlLm5leHQ7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBdCB0aGlzIHBvaW50IHdlIGNhbiBhc3N1bWUgd2UndmUgZm91bmQgYSBtYXRjaFxuXG5cdFx0XHQvLyBTdXJmYWNlIG1hdGNoZWQgbm9kZSB0byBoZWFkIGlmIG5vdCBhbHJlYWR5XG5cdFx0XHRpZiAoIG5vZGUgIT09IGNhY2hlLmhlYWQgKSB7XG5cdFx0XHRcdC8vIEFkanVzdCBzaWJsaW5ncyB0byBwb2ludCB0byBlYWNoIG90aGVyLlxuXHRcdFx0XHRub2RlLnByZXYubmV4dCA9IG5vZGUubmV4dDtcblx0XHRcdFx0aWYgKCBub2RlLm5leHQgKSB7XG5cdFx0XHRcdFx0bm9kZS5uZXh0LnByZXYgPSBub2RlLnByZXY7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRub2RlLm5leHQgPSBjYWNoZS5oZWFkO1xuXHRcdFx0XHRub2RlLnByZXYgPSBudWxsO1xuXHRcdFx0XHRjYWNoZS5oZWFkLnByZXYgPSBub2RlO1xuXHRcdFx0XHRjYWNoZS5oZWFkID0gbm9kZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV0dXJuIGltbWVkaWF0ZWx5XG5cdFx0XHRyZXR1cm4gbm9kZS52YWw7XG5cdFx0fVxuXG5cdFx0Ly8gTm8gY2FjaGVkIHZhbHVlIGZvdW5kLiBDb250aW51ZSB0byBpbnNlcnRpb24gcGhhc2U6XG5cblx0XHRub2RlID0ge1xuXHRcdFx0Ly8gR2VuZXJhdGUgdGhlIHJlc3VsdCBmcm9tIG9yaWdpbmFsIGZ1bmN0aW9uXG5cdFx0XHR2YWw6IHNlbGVjdG9yLmFwcGx5KCBudWxsLCBhcmdzICksXG5cdFx0fTtcblxuXHRcdC8vIEF2b2lkIGluY2x1ZGluZyB0aGUgc291cmNlIG9iamVjdCBpbiB0aGUgY2FjaGUuXG5cdFx0YXJnc1sgMCBdID0gbnVsbDtcblx0XHRub2RlLmFyZ3MgPSBhcmdzO1xuXG5cdFx0Ly8gRG9uJ3QgbmVlZCB0byBjaGVjayB3aGV0aGVyIG5vZGUgaXMgYWxyZWFkeSBoZWFkLCBzaW5jZSBpdCB3b3VsZFxuXHRcdC8vIGhhdmUgYmVlbiByZXR1cm5lZCBhYm92ZSBhbHJlYWR5IGlmIGl0IHdhc1xuXG5cdFx0Ly8gU2hpZnQgZXhpc3RpbmcgaGVhZCBkb3duIGxpc3Rcblx0XHRpZiAoIGNhY2hlLmhlYWQgKSB7XG5cdFx0XHRjYWNoZS5oZWFkLnByZXYgPSBub2RlO1xuXHRcdFx0bm9kZS5uZXh0ID0gY2FjaGUuaGVhZDtcblx0XHR9XG5cblx0XHRjYWNoZS5oZWFkID0gbm9kZTtcblxuXHRcdHJldHVybiBub2RlLnZhbDtcblx0fVxuXG5cdGNhbGxTZWxlY3Rvci5nZXREZXBlbmRhbnRzID0gZ2V0RGVwZW5kYW50cztcblx0Y2FsbFNlbGVjdG9yLmNsZWFyID0gY2xlYXI7XG5cdGNsZWFyKCk7XG5cblx0cmV0dXJuIGNhbGxTZWxlY3Rvcjtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFNpbWlsYXIgdG8gaW52YXJpYW50IGJ1dCBvbmx5IGxvZ3MgYSB3YXJuaW5nIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IG1ldC5cbiAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gbG9nIGlzc3VlcyBpbiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMgaW4gY3JpdGljYWxcbiAqIHBhdGhzLiBSZW1vdmluZyB0aGUgbG9nZ2luZyBjb2RlIGZvciBwcm9kdWN0aW9uIGVudmlyb25tZW50cyB3aWxsIGtlZXAgdGhlXG4gKiBzYW1lIGxvZ2ljIGFuZCBmb2xsb3cgdGhlIHNhbWUgY29kZSBwYXRocy5cbiAqL1xuXG52YXIgX19ERVZfXyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbic7XG5cbnZhciB3YXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKF9fREVWX18pIHtcbiAgdmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uIHByaW50V2FybmluZyhmb3JtYXQsIGFyZ3MpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBhcmdzID0gbmV3IEFycmF5KGxlbiA+IDIgPyBsZW4gLSAyIDogMCk7XG4gICAgZm9yICh2YXIga2V5ID0gMjsga2V5IDwgbGVuOyBrZXkrKykge1xuICAgICAgYXJnc1trZXkgLSAyXSA9IGFyZ3VtZW50c1trZXldO1xuICAgIH1cbiAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgK1xuICAgICAgZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICAgIH0pO1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH1cblxuICB3YXJuaW5nID0gZnVuY3Rpb24oY29uZGl0aW9uLCBmb3JtYXQsIGFyZ3MpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBhcmdzID0gbmV3IEFycmF5KGxlbiA+IDIgPyBsZW4gLSAyIDogMCk7XG4gICAgZm9yICh2YXIga2V5ID0gMjsga2V5IDwgbGVuOyBrZXkrKykge1xuICAgICAgYXJnc1trZXkgLSAyXSA9IGFyZ3VtZW50c1trZXldO1xuICAgIH1cbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnYHdhcm5pbmcoY29uZGl0aW9uLCBmb3JtYXQsIC4uLmFyZ3MpYCByZXF1aXJlcyBhIHdhcm5pbmcgJyArXG4gICAgICAgICAgJ21lc3NhZ2UgYXJndW1lbnQnXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgcHJpbnRXYXJuaW5nLmFwcGx5KG51bGwsIFtmb3JtYXRdLmNvbmNhdChhcmdzKSk7XG4gICAgfVxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHdhcm5pbmc7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGVlanM7IiwibW9kdWxlLmV4cG9ydHMgPSBlZWpzLmhlbHBlcnM7IiwibW9kdWxlLmV4cG9ydHMgPSBlZWpzLmkxOG47IiwibW9kdWxlLmV4cG9ydHMgPSBlZWpzLm1vZGVsOyIsIm1vZHVsZS5leHBvcnRzID0gZWVqcy52YWxpZGF0b3JzOyIsIm1vZHVsZS5leHBvcnRzID0gZWVqcy52YWx1ZU9iamVjdHM7IiwibW9kdWxlLmV4cG9ydHMgPSB3cC5hcGlGZXRjaDsiLCJtb2R1bGUuZXhwb3J0cyA9IHdwLmRhdGE7IiwibW9kdWxlLmV4cG9ydHMgPSB3cC5ob29rczsiLCJtb2R1bGUuZXhwb3J0cyA9IGVlanMudmVuZG9yLmN1aWQ7IiwibW9kdWxlLmV4cG9ydHMgPSBsb2Rhc2g7IiwibW9kdWxlLmV4cG9ydHMgPSBlZWpzLnZlbmRvci5tb21lbnQ7Il0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file