-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy path3419.58f1e002.iframe.bundle.js
2 lines (2 loc) · 196 KB
/
3419.58f1e002.iframe.bundle.js
1
2
"use strict";(self.webpackChunkblockly_mooc=self.webpackChunkblockly_mooc||[]).push([[3419],{"./src/code-studio/browserNavigation.js":(__unused_webpack_module,exports,__webpack_require__)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.canChangeLevelInPage=function canChangeLevelInPage(currentLevel,newLevel){if(new URL(document.location).pathname.split("/").includes("summary"))return!1;return(null==currentLevel?void 0:currentLevel.usesLab2)&&(null==newLevel?void 0:newLevel.usesLab2)},exports.setWindowTitle=setWindowTitle,exports.setupNavigationHandler=function setupNavigationHandler(initialLevelId){window.history.replaceState({levelId:initialLevelId},""),window.addEventListener("popstate",(function(event){var _event$state,levelId=null===(_event$state=event.state)||void 0===_event$state?void 0:_event$state.levelId;levelId&&((0,_notifyLevelChange.default)(null,levelId),(0,_redux.getStore)().dispatch((0,_progressRedux.setCurrentLevelId)(levelId)))}))},exports.updateBrowserForLevelNavigation=function updateBrowserForLevelNavigation(progressStoreState,levelPath,levelId){window.history.pushState({levelId},"",levelPath+window.location.search),setWindowTitle(progressStoreState,levelId)};var _progressRedux=__webpack_require__("./src/code-studio/progressRedux.ts"),_notifyLevelChange=function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}(__webpack_require__("./src/lab2/utils/notifyLevelChange.ts")),_redux=__webpack_require__("./src/redux.js");function setWindowTitle(progressStoreState,newLevelId){var lesson=progressStoreState.lessons.find((function(lesson){return lesson.id===progressStoreState.currentLessonId})),numLessons=lesson.num_script_lessons,lessonName=lesson.name,lessonIndex=lesson.levels.findIndex((function(level){return level.activeId===newLevelId}))+1,scriptDisplayName=progressStoreState.scriptDisplayName;document.title=numLessons>1?"".concat(lessonName," #").concat(lessonIndex," | ").concat(scriptDisplayName," - Code.org"):"".concat(lessonName," #").concat(lessonIndex," - Code.org")}},"./src/code-studio/progressReduxSelectors.js":(__unused_webpack_module,exports,__webpack_require__)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.progressionsFromLevels=exports.nextLevelId=exports.levelsForLessonId=exports.levelsByLesson=exports.levelCount=exports.levelById=exports.lessons=exports.lessonExtrasUrl=exports.isPerfect=exports.hasLockableLessons=exports.hasGroups=exports.groupedLessons=exports.getUserAppOptionsPath=exports.getProgressLevelType=exports.getLevelPropertiesPath=exports.getCurrentScriptLevelId=exports.getCurrentLevels=exports.getCurrentLevel=exports.getCurrentLesson=exports.__testonly__=exports.ProgressLevelType=void 0;var _lodash=function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}(__webpack_require__("./node_modules/lodash/lodash.js")),_constants=__webpack_require__("./src/constants.js"),_progressHelpers=__webpack_require__("./src/templates/progress/progressHelpers.js"),_sharedConstants=__webpack_require__("./generated-scripts/sharedConstants.ts"),_activityUtils=__webpack_require__("./src/code-studio/activityUtils.js");function _typeof(o){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _toConsumableArray(r){return function _arrayWithoutHoles(r){if(Array.isArray(r))return _arrayLikeToArray(r)}(r)||function _iterableToArray(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}(r)||function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}(r)||function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach((function(r){_defineProperty(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function _defineProperty(e,r,t){return(r=function _toPropertyKey(t){var i=function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}(t,"string");return"symbol"==_typeof(i)?i:i+""}(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}exports.hasLockableLessons=function hasLockableLessons(state){return state.lessons.some((function(lesson){return lesson.lockable}))},exports.hasGroups=function hasGroups(state){return Object.keys(groupedLessons(state)).length>1},exports.getCurrentLesson=function getCurrentLesson(state){var _state$progress$lesso;return null===(_state$progress$lesso=state.progress.lessons)||void 0===_state$progress$lesso?void 0:_state$progress$lesso.find((function(l){return l.id===state.progress.currentLessonId}))};var lessonFromLessonAtIndex=function lessonFromLessonAtIndex(state,lessonIndex){return _objectSpread(_objectSpread({},lessonFromLesson(state.lessons[lessonIndex])),{},{isFocusArea:state.focusAreaLessonIds.includes(state.lessons[lessonIndex].id)})},lessonFromLesson=function lessonFromLesson(lesson){return _lodash.default.pick(lesson,["name","id","lockable","lessonNumber","lessonStartUrl","lesson_plan_html_url","lesson_feedback_url","student_lesson_plan_html_url","description_student","description_teacher"])},peerReviewLesson=(exports.lessons=function lessons(state){return state.lessons.map((function(_,index){return lessonFromLessonAtIndex(state,index)}))},function peerReviewLesson(state){return _objectSpread(_objectSpread({},lessonFromLesson(state.peerReviewLessonInfo)),{},{id:-1,lockable:!1,isFocusArea:!1})}),peerReviewLevels=function peerReviewLevels(state){return state.peerReviewLessonInfo.levels.map((function(level,index){return _objectSpread(_objectSpread({},level),{},{id:(-1).toString(),isLocked:level.locked,status:level.status||_sharedConstants.LevelStatus.not_tried,levelNumber:index+1})}))},ProgressLevelType=exports.ProgressLevelType={SCRIPT_LEVEL:"script_level",LEVEL:"level"},getProgressLevelType=exports.getProgressLevelType=function getProgressLevelType(state){return state.progress.lessons?ProgressLevelType.SCRIPT_LEVEL:state.progress.currentLevelId?ProgressLevelType.LEVEL:void 0},_levelWithProgress=(exports.getLevelPropertiesPath=function getLevelPropertiesPath(state){if(state.progress.lessons){var _state$progress$lesso2,levelPosition,sublevelPosition,scriptName=state.progress.scriptName,lessonPosition=null===(_state$progress$lesso2=state.progress.lessons)||void 0===_state$progress$lesso2?void 0:_state$progress$lesso2.find((function(lesson){return lesson.id===state.progress.currentLessonId})).relative_position,currentLevel=getCurrentLevel(state);if(levelPosition=currentLevel.levelNumber,currentLevel.parentLevelId)levelPosition=levelById(state.progress,state.progress.currentLessonId,currentLevel.parentLevelId).levelNumber,sublevelPosition=currentLevel.levelNumber;return"/s/".concat(scriptName,"/lessons/").concat(lessonPosition,"/levels/").concat(levelPosition,"/").concat(void 0===sublevelPosition?"":"sublevel/".concat(sublevelPosition,"/"),"level_properties")}if(null!==state.progress.currentLevelId){var levelId=state.progress.currentLevelId;return"/levels/".concat(levelId,"/level_properties")}},exports.getUserAppOptionsPath=function getUserAppOptionsPath(state){if(state.progress.lessons){var _state$progress$lesso3,scriptName=state.progress.scriptName,lessonPosition=null===(_state$progress$lesso3=state.progress.lessons)||void 0===_state$progress$lesso3?void 0:_state$progress$lesso3.find((function(lesson){return lesson.id===state.progress.currentLessonId})).relative_position,levelPosition=getCurrentLevel(state).levelNumber,levelId=state.progress.currentLevelId;return"/api/user_app_options/".concat(scriptName,"/").concat(lessonPosition,"/").concat(levelPosition,"/").concat(levelId)}},function levelWithProgress(_ref,level,isLockable,parentLevelId){var _levelProgress,_level$ids,_level$sublevels,levelResults=_ref.levelResults,unitProgress=_ref.unitProgress,_ref$levelPairing=_ref.levelPairing,levelPairing=void 0===_ref$levelPairing?{}:_ref$levelPairing,currentLevelId=_ref.currentLevelId,normalizedLevel=(0,_progressHelpers.processedLevel)(level,parentLevelId);level.ids&&(normalizedLevel.id=function bestResultLevelId(levelIds,progressData){if(1===levelIds.length)return levelIds[0];var attemptedIds=levelIds.filter((function(id){return progressData[id]}));if(0===attemptedIds.length)return levelIds[0];var bestId=attemptedIds[0],bestResult=progressData[bestId];return attemptedIds.forEach((function(id){var result=progressData[id];result>bestResult&&(bestId=id,bestResult=result)})),bestId}(level.ids,levelResults));var status=_sharedConstants.LevelStatus.not_tried,locked=isLockable,teacherFeedbackReviewState=null,levelProgress=unitProgress[normalizedLevel.id];null!==(_levelProgress=levelProgress)&&void 0!==_levelProgress&&_levelProgress.pages&&(levelProgress=levelProgress.pages[normalizedLevel.pageNumber-1]),levelProgress?(status=levelProgress.status,locked=levelProgress.locked,teacherFeedbackReviewState=levelProgress.teacherFeedbackReviewState):level.kind!==_sharedConstants.LevelKind.assessment&&(status=(0,_activityUtils.activityCssClass)(levelResults[normalizedLevel.id]));var isCurrent=normalizedLevel.id===currentLevelId||!(null===(_level$ids=level.ids)||void 0===_level$ids||!_level$ids.includes[currentLevelId]);return _objectSpread(_objectSpread({},normalizedLevel),{},{status,isCurrentLevel:isCurrent,paired:levelPairing[level.activeId],isLocked:locked,teacherFeedbackReviewState,sublevels:null===(_level$sublevels=level.sublevels)||void 0===_level$sublevels?void 0:_level$sublevels.map((function(sublevel){return _levelWithProgress({levelResults,unitProgress,levelPairing,currentLevelId},sublevel,isLockable,normalizedLevel.id)}))})}),levelsByLesson=exports.levelsByLesson=function levelsByLesson(_ref2){var lessons=_ref2.lessons,levelResults=_ref2.levelResults,unitProgress=_ref2.unitProgress,levelPairing=_ref2.levelPairing,currentLevelId=_ref2.currentLevelId;return lessons.map((function(lesson){return lesson.levels.map((function(level){return _levelWithProgress({levelResults,unitProgress,levelPairing,currentLevelId},level,lesson.lockable)}))}))},levelsForLessonId=exports.levelsForLessonId=function levelsForLessonId(state,lessonId){var _state$lessons,lesson=null===(_state$lessons=state.lessons)||void 0===_state$lessons?void 0:_state$lessons.find((function(lesson){return lesson.id===lessonId}));return null==lesson?void 0:lesson.levels.map((function(level){return _levelWithProgress(state,level,lesson.lockable)}))},levelById=exports.levelById=function levelById(state,lessonId,levelId){var _levelsForLessonId,_levelsForLessonId$fl;return null===(_levelsForLessonId=levelsForLessonId(state,lessonId))||void 0===_levelsForLessonId||null===(_levelsForLessonId$fl=_levelsForLessonId.flatMap((function(level){return[level].concat(_toConsumableArray((null==level?void 0:level.sublevels)||[]))})))||void 0===_levelsForLessonId$fl?void 0:_levelsForLessonId$fl.find((function(level){return level.id===levelId}))},getCurrentLevel=exports.getCurrentLevel=function getCurrentLevel(state){var _getCurrentLevels,_getCurrentLevels$fla;return null===(_getCurrentLevels=getCurrentLevels(state))||void 0===_getCurrentLevels||null===(_getCurrentLevels$fla=_getCurrentLevels.flatMap((function(level){return[level].concat(_toConsumableArray((null==level?void 0:level.sublevels)||[]))})))||void 0===_getCurrentLevels$fla?void 0:_getCurrentLevels$fla.find((function(level){return level.isCurrentLevel}))},getCurrentLevels=exports.getCurrentLevels=function getCurrentLevels(state){return levelsForLessonId(state.progress,state.progress.currentLessonId)},groupedLessons=(exports.getCurrentScriptLevelId=function getCurrentScriptLevelId(state){var _levelById,currentLevel=getCurrentLevel(state);if(currentLevel)return currentLevel.parentLevelId?null===(_levelById=levelById(state.progress,state.progress.currentLessonId,currentLevel.parentLevelId))||void 0===_levelById?void 0:_levelById.scriptLevelId:currentLevel.scriptLevelId},exports.nextLevelId=function nextLevelId(state){if(getProgressLevelType(state)===ProgressLevelType.SCRIPT_LEVEL){var levels=levelsForLessonId(state.progress,state.progress.currentLessonId),currentLevel=getCurrentLevel(state);if(currentLevel.parentLevelId)return currentLevel.parentLevelId;var currentLevelIndex=currentLevel.levelNumber-1;if(currentLevelIndex!==levels.length-1)return levels[currentLevelIndex+1].id}},exports.levelCount=function levelCount(state){return getProgressLevelType(state)===ProgressLevelType.LEVEL?1:getProgressLevelType(state)===ProgressLevelType.SCRIPT_LEVEL?getCurrentLevels(state).length:0},exports.lessonExtrasUrl=function lessonExtrasUrl(state,lessonId){return state.lessonExtrasEnabled?state.lessons.find((function(lesson){return lesson.id===lessonId})).lesson_extras_level_url:""},exports.isPerfect=function isPerfect(state,levelId){return!!state.levelResults&&state.levelResults[levelId]>=_constants.TestResults.MINIMUM_OPTIMAL_RESULT},exports.groupedLessons=function groupedLessons(state){var includeBonusLevels=arguments.length>1&&void 0!==arguments[1]&&arguments[1],byGroup={},allLevels=levelsByLesson(state);return state.lessonGroups.forEach((function(lessonGroup){byGroup[lessonGroup.display_name]={lessonGroup:{id:lessonGroup.id,userFacing:lessonGroup.user_facing,displayName:lessonGroup.display_name,description:lessonGroup.description,bigQuestions:lessonGroup.big_questions},lessons:[],levelsByLesson:[]}})),state.lessons.forEach((function(lesson,index){var group=lesson.lesson_group_display_name,lessonAtIndex=lessonFromLessonAtIndex(state,index),lessonLevels=allLevels[index];includeBonusLevels||(lessonLevels=lessonLevels.filter((function(level){return!level.bonus}))),byGroup[group]&&(byGroup[group].lessons.push(lessonAtIndex),byGroup[group].levelsByLesson.push(lessonLevels))})),state.peerReviewLessonInfo&&(byGroup[state.peerReviewLessonInfo.lesson_group_display_name]={group:state.peerReviewLessonInfo.lesson_group_display_name,lessonGroup:{id:null,displayName:state.peerReviewLessonInfo.lesson_group_display_name,description:null,bigQuestions:null},lessons:[peerReviewLesson(state)],levelsByLesson:[peerReviewLevels(state)]}),_lodash.default.values(byGroup)});exports.progressionsFromLevels=function progressionsFromLevels(levels){var progressions=[];if(0===levels.length)return progressions;var currentProgression={start:0,name:levels[0].progression||levels[0].name,displayName:levels[0].progressionDisplayName||levels[0].name,levels:[levels[0]]};return levels.slice(1).forEach((function(level,index){(level.progression||level.name)===currentProgression.name?currentProgression.levels.push(level):(progressions.push(currentProgression),currentProgression={start:index+1,name:level.progression||level.name,displayName:level.progressionDisplayName||level.name,levels:[level]})})),progressions.push(currentProgression),progressions};exports.__testonly__={}},"./src/code-studio/verifiedInstructorRedux.js":(__unused_webpack_module,exports)=>{function _typeof(o){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach((function(r){_defineProperty(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function _defineProperty(e,r,t){return(r=function _toPropertyKey(t){var i=function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}(t,"string");return"symbol"==_typeof(i)?i:i+""}(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=function verifiedInstructor(){var state=arguments.length>0&&void 0!==arguments[0]?arguments[0]:initialState,action=arguments.length>1?arguments[1]:void 0;if(action.type===SET_VERIFIED)return _objectSpread(_objectSpread({},state),{},{isVerified:!0});if(action.type===SET_VERIFIED_RESOURCES)return _objectSpread(_objectSpread({},state),{},{hasVerifiedResources:!0});return _objectSpread({},state)},exports.setVerifiedResources=exports.setVerified=void 0;var SET_VERIFIED="verifiedInstructor/SET_VERIFIED",SET_VERIFIED_RESOURCES="verifiedInstructor/SET_VERIFIED_RESOURCES",initialState=(exports.setVerified=function setVerified(){return{type:SET_VERIFIED}},exports.setVerifiedResources=function setVerifiedResources(hasVerifiedResources){return{type:SET_VERIFIED_RESOURCES}},{isVerified:!1,hasVerifiedResources:!1})},"./src/util/browser-detector.js":(__unused_webpack_module,exports)=>{function isIE(){return-1!==navigator.userAgent.indexOf("MSIE")||isIE11()}function IEVersion(){return isIE11()?"11":navigator.userAgent.substring(navigator.userAgent.lastIndexOf("MSIE")+5).split(".")[0]}function isChrome(){return-1!==navigator.userAgent.lastIndexOf("Chrome/")}function chromeVersion(){return navigator.userAgent.substring(navigator.userAgent.lastIndexOf("Chrome/")+7).split(".")[0]}function isSafari(){return-1!==navigator.userAgent.indexOf("Safari/")}function safariVersion(){return navigator.userAgent.substring(navigator.userAgent.lastIndexOf("Version/")+8).split(".")[0]}function isFirefox(){return-1!==navigator.userAgent.indexOf("Firefox")}function firefoxVersion(){return navigator.userAgent.substring(navigator.userAgent.lastIndexOf("Firefox/")+8).split(".")[0]}function isIE11(){return!!window.MSInputMethodContext&&!!document.documentMode}Object.defineProperty(exports,"__esModule",{value:!0}),exports.getBrowserName=function getBrowserName(){var includeVersion=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(isChrome())return"Chrome"+(includeVersion?" ".concat(chromeVersion()):"");if(isIE())return"Internet Explorer"+(includeVersion?" ".concat(IEVersion()):"");if(isFirefox())return"Firefox"+(includeVersion?" ".concat(firefoxVersion()):"");if(isSafari())return"Safari"+(includeVersion?" ".concat(safariVersion()):"");return navigator.userAgent},exports.isIE11=isIE11,exports.isMobileDevice=function isMobileDevice(){var check=!1;return function(a){(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino|android|ipad|playbook|silk/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))&&(check=!0)}(navigator.userAgent||navigator.vendor||window.opera),check},exports.isStorageAvailable=function isStorageAvailable(type){try{var storage=window[type],x="__storage_test__";return storage.setItem(x,x),storage.removeItem(x),!0}catch(e){return!1}},exports.isUnsupportedBrowser=function isUnsupportedBrowser(){return function isUnsupportedIE(){return isIE()&&IEVersion()<11}()||function isUnsupportedChrome(){return isChrome()&&chromeVersion()<33}()||function isUnsupportedSafari(){return isSafari()&&safariVersion()<7}()||function isUnsupportedFirefox(){return isFirefox()&&firefoxVersion()<25}()}},"./src/code-studio/progressRedux.ts":function(__unused_webpack_module,exports,__webpack_require__){var _a,_b,__assign=this&&this.__assign||function(){return __assign=Object.assign||function(t){for(var s,i=1,n=arguments.length;i<n;i++)for(var p in s=arguments[i])Object.prototype.hasOwnProperty.call(s,p)&&(t[p]=s[p]);return t},__assign.apply(this,arguments)},__awaiter=this&&this.__awaiter||function(thisArg,_arguments,P,generator){return new(P||(P=Promise))((function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){result.done?resolve(result.value):function adopt(value){return value instanceof P?value:new P((function(resolve){resolve(value)}))}(result.value).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())}))},__generator=this&&this.__generator||function(thisArg,body){var f,y,t,g,_={label:0,sent:function(){if(1&t[0])throw t[1];return t[1]},trys:[],ops:[]};return g={next:verb(0),throw:verb(1),return:verb(2)},"function"==typeof Symbol&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return function step(op){if(f)throw new TypeError("Generator is already executing.");for(;g&&(g=0,op[0]&&(_=0)),_;)try{if(f=1,y&&(t=2&op[0]?y.return:op[0]?y.throw||((t=y.return)&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;switch(y=0,t&&(op=[2&op[0],t.value]),op[0]){case 0:case 1:t=op;break;case 4:return _.label++,{value:op[1],done:!1};case 5:_.label++,y=op[1],op=[0];continue;case 7:op=_.ops.pop(),_.trys.pop();continue;default:if(!(t=_.trys,(t=t.length>0&&t[t.length-1])||6!==op[0]&&2!==op[0])){_=0;continue}if(3===op[0]&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(6===op[0]&&_.label<t[1]){_.label=t[1],t=op;break}if(t&&_.label<t[2]){_.label=t[2],_.ops.push(op);break}t[2]&&_.ops.pop(),_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e],y=0}finally{f=t=0}if(5&op[0])throw op[1];return{value:op[0]?op[1]:void 0,done:!0}}([n,v])}}},__importDefault=this&&this.__importDefault||function(mod){return mod&&mod.__esModule?mod:{default:mod}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.__testonly__=exports.setViewAsUserId=exports.setLessonExtrasEnabled=exports.setScriptCompleted=exports.setCurrentLessonId=exports.setStudentDefaultsSummaryView=exports.setIsMiniView=exports.setIsSummaryView=exports.setIsAge13Required=exports.disablePostMilestone=exports.updateFocusArea=exports.mergePeerReviewProgress=exports.overwriteResults=exports.mergeResults=exports.useDbProgress=exports.clearResults=exports.setScriptProgress=exports.setCurrentLevelId=exports.initProgress=exports.sendSubmitReport=exports.sendPredictLevelReport=exports.queryUserProgress=void 0,exports.navigateToLevelId=navigateToLevelId,exports.navigateToNextLevel=function navigateToNextLevel(){return function(dispatch,getState){var levelId=(0,progressReduxSelectors_1.nextLevelId)(getState());void 0!==levelId&&dispatch(navigateToLevelId(levelId))}},exports.sendSuccessReport=function sendSuccessReport(appType){return function(dispatch,getState){return sendReportHelper(appType,constants_1.TestResults.ALL_PASS,dispatch,getState)}},exports.sendProgressReport=function sendProgressReport(appType,result){return function(dispatch,getState){return sendReportHelper(appType,result,dispatch,getState)}},exports.processedLessons=processedLessons;var toolkit_1=__webpack_require__("./node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js"),jquery_1=__importDefault(__webpack_require__("./node_modules/jquery/dist/jquery.js")),lodash_1=__importDefault(__webpack_require__("./node_modules/lodash/lodash.js")),verifiedInstructorRedux_1=__webpack_require__("./src/code-studio/verifiedInstructorRedux.js"),constants_1=__webpack_require__("./src/constants.js"),Lab2Registry_1=__importDefault(__webpack_require__("./src/lab2/Lab2Registry.ts")),notifyLevelChange_1=__importDefault(__webpack_require__("./src/lab2/utils/notifyLevelChange.ts")),progressHelpers_1=__webpack_require__("./src/templates/progress/progressHelpers.js"),progressTypes_1=__webpack_require__("./src/types/progressTypes.ts"),BubbleFactory_1=__webpack_require__("./src/templates/progress/BubbleFactory.jsx"),utils_1=__webpack_require__("./src/utils.js"),activityUtils_1=__webpack_require__("./src/code-studio/activityUtils.js"),browserNavigation_1=__webpack_require__("./src/code-studio/browserNavigation.js"),lessonLockRedux_1=__webpack_require__("./src/code-studio/lessonLockRedux.js"),progressReduxSelectors_1=__webpack_require__("./src/code-studio/progressReduxSelectors.js"),viewAsRedux_1=__webpack_require__("./src/code-studio/viewAsRedux.js"),initialState={currentLevelId:null,currentLessonId:void 0,deeperLearningCourse:null,saveAnswersBeforeNavigation:null,lessons:null,lessonGroups:null,scriptId:null,viewAsUserId:null,scriptName:null,scriptDisplayName:void 0,unitTitle:null,courseId:null,isLessonExtras:!1,unitProgress:{},unitProgressHasLoaded:!1,levelResults:{},focusAreaLessonIds:[],peerReviewLessonInfo:null,peerReviewsPerformed:[],postMilestoneDisabled:!1,isAge13Required:!1,studentDefaultsSummaryView:!0,isSummaryView:!0,isMiniView:!1,hasFullProgress:!1,lessonExtrasEnabled:!1,usingDbProgress:!1,currentPageNumber:progressTypes_1.PUZZLE_PAGE_NONE,courseVersionId:void 0,unitDescription:void 0,unitStudentDescription:void 0,changeFocusAreaPath:void 0,unitCompleted:void 0},progressSlice=(0,toolkit_1.createSlice)({name:"progress",initialState,reducers:{initProgress:function(state,action){var lessons=action.payload.lessons,currentLessonId=state.currentLessonId||(1===lessons.length?lessons[0].id:void 0);state.currentLevelId||(state.currentLevelId=action.payload.currentLevelId),state.deeperLearningCourse=action.payload.deeperLearningCourse,state.saveAnswersBeforeNavigation=action.payload.saveAnswersBeforeNavigation,state.lessons=processedLessons(lessons,action.payload.deeperLearningCourse),state.lessonGroups=action.payload.lessonGroups,state.peerReviewLessonInfo=action.payload.peerReviewLessonInfo,state.scriptId=action.payload.scriptId,state.scriptName=action.payload.scriptName,state.scriptDisplayName=action.payload.scriptDisplayName,state.unitTitle=action.payload.unitTitle,state.unitDescription=action.payload.unitDescription,state.unitStudentDescription=action.payload.unitStudentDescription,state.courseId=action.payload.courseId,state.courseVersionId=action.payload.courseVersionId,state.currentLessonId=currentLessonId,state.hasFullProgress=action.payload.isFullProgress,state.isLessonExtras=action.payload.isLessonExtras,state.currentPageNumber=action.payload.currentPageNumber},setCurrentLevelId:function(state,action){state.currentLevelId=action.payload},setScriptProgress:function(state,action){state.unitProgress=(0,progressHelpers_1.processServerStudentProgress)(action.payload),state.unitProgressHasLoaded=!0},clearResults:function(state){state.levelResults=initialState.levelResults},useDbProgress:function(state){state.usingDbProgress=!0},mergeResults:function(state,action){var newLevelResults={};Object.keys(__assign(__assign({},state.levelResults),action.payload)).forEach((function(key){var levelId=parseInt(key);newLevelResults[levelId]=(0,activityUtils_1.mergeActivityResult)(state.levelResults[levelId],action.payload[levelId])})),state.levelResults=newLevelResults},overwriteResults:function(state,action){state.levelResults=action.payload},mergePeerReviewProgress:function(state,action){state.peerReviewLessonInfo&&(state.peerReviewLessonInfo=__assign(__assign({},state.peerReviewLessonInfo),{levels:state.peerReviewLessonInfo.levels.map((function(level,index){return __assign(__assign({},level),action.payload[index])}))}))},updateFocusArea:{reducer:function(state,action){state.changeFocusAreaPath=action.payload.changeFocusAreaPath,state.focusAreaLessonIds=action.payload.focusAreaLessonIds},prepare:function(changeFocusAreaPath,focusAreaLessonIds){return{payload:{changeFocusAreaPath,focusAreaLessonIds}}}},disablePostMilestone:function(state){state.postMilestoneDisabled=!0},setIsAge13Required:function(state,action){state.isAge13Required=action.payload},setIsSummaryView:function(state,action){state.isSummaryView=action.payload},setIsMiniView:function(state,action){state.isMiniView=action.payload},setStudentDefaultsSummaryView:function(state,action){state.studentDefaultsSummaryView=action.payload},setCurrentLessonId:function(state,action){state.currentLessonId||(state.currentLessonId=action.payload)},setScriptCompleted:function(state){state.unitCompleted=!0},setLessonExtrasEnabled:function(state,action){state.lessonExtrasEnabled=action.payload},setViewAsUserId:function(state,action){state.viewAsUserId=action.payload}},extraReducers:(_a={},_a[viewAsRedux_1.SET_VIEW_TYPE]=function(state,action){state.isSummaryView=action.viewType===progressTypes_1.ViewType.Participant&&state.studentDefaultsSummaryView},_a)});function navigateToLevelId(levelId){var _this=this;return function(dispatch,getState){return __awaiter(_this,void 0,void 0,(function(){var state,newLevel,currentLevel,url,_a;return __generator(this,(function(_b){switch(_b.label){case 0:return(state=getState().progress).currentLessonId&&state.currentLevelId&&(newLevel=(0,progressReduxSelectors_1.levelById)(state,state.currentLessonId,levelId))?(currentLevel=(0,progressReduxSelectors_1.getCurrentLevel)(getState()),(0,browserNavigation_1.canChangeLevelInPage)(currentLevel,newLevel)?state.currentLevelId===levelId?[2]:((0,browserNavigation_1.updateBrowserForLevelNavigation)(state,newLevel.path,levelId),(0,notifyLevelChange_1.default)(currentLevel.id,levelId),dispatch((0,exports.setCurrentLevelId)(levelId)),[3,4]):[3,1]):[2];case 1:return(null==currentLevel?void 0:currentLevel.usesLab2)?[4,null===(_a=Lab2Registry_1.default.getInstance().getProjectManager())||void 0===_a?void 0:_a.cleanUp()]:[3,3];case 2:_b.sent(),_b.label=3;case 3:url=(0,BubbleFactory_1.getBubbleUrl)(newLevel.path,void 0,void 0,!0),(0,utils_1.navigateToHref)(url),_b.label=4;case 4:return[2]}}))}))}}function sendReportHelper(appType,result,dispatch,getState,extraData){var state=getState().progress,levelId=state.currentLevelId;if(!state.currentLessonId||!levelId)return Promise.resolve();var scriptLevelId=(0,progressReduxSelectors_1.getCurrentScriptLevelId)(getState());if(!scriptLevelId)return Promise.resolve();var data=__assign({app:appType,result:!0,testResult:result},extraData=extraData||{});return fetch("/milestone/".concat(0,"/").concat(scriptLevelId,"/").concat(levelId),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(data)}).then((function(response){var _a,_b;if(response.ok&&null!==levelId){dispatch((0,exports.mergeResults)(((_a={})[levelId]=result,_a)));var currentLevel=(0,progressReduxSelectors_1.getCurrentLevel)(getState());currentLevel.parentLevelId&&dispatch((0,exports.mergeResults)(((_b={})[currentLevel.parentLevelId]=result,_b)))}}))}exports.queryUserProgress=function(userId,mergeProgress){return void 0===mergeProgress&&(mergeProgress=!0),function(dispatch,getState){var state=getState().progress;return userProgressFromServer(state,dispatch,userId,mergeProgress)}},exports.sendPredictLevelReport=(0,toolkit_1.createAsyncThunk)("progress/sendPredictLevelReport",(function(payload,thunkAPI){return __awaiter(void 0,void 0,void 0,(function(){var extraPayload;return __generator(this,(function(_a){return extraPayload={program:payload.predictResponse},sendReportHelper(payload.appType,constants_1.TestResults.CONTAINED_LEVEL_RESULT,thunkAPI.dispatch,thunkAPI.getState,extraPayload),[2]}))}))})),exports.sendSubmitReport=(0,toolkit_1.createAsyncThunk)("progress/sendSubmitReport",(function(payload,thunkAPI){return __awaiter(void 0,void 0,void 0,(function(){var extraPayload,result;return __generator(this,(function(_a){switch(_a.label){case 0:return extraPayload={submitted:payload.submitted.toString()},result=payload.submitted?constants_1.TestResults.SUBMITTED_RESULT:constants_1.TestResults.UNSUBMITTED_ATTEMPT,[4,sendReportHelper(payload.appType,result,thunkAPI.dispatch,thunkAPI.getState,extraPayload)];case 1:return _a.sent(),thunkAPI.dispatch((0,exports.queryUserProgress)(thunkAPI.getState().currentUser.userId.toString())),[2]}}))}))}));var userProgressFromServer=function(state,dispatch,userId,mergeProgress){if(void 0===userId&&(userId=null),!state.scriptName){var message="Could not request progress for user ID ".concat(userId," from server: scriptName must be present in progress redux.");throw new Error(message)}return userId&&dispatch((0,exports.clearResults)()),jquery_1.default.ajax({url:"/api/user_progress/".concat(state.scriptName),method:"GET",data:{user_id:userId}}).done((function(data){if(data&&!lodash_1.default.isEmpty(data)){data.isVerifiedInstructor&&dispatch((0,verifiedInstructorRedux_1.setVerified)());var onOverviewPage=!state.currentLevelId;if((data.isInstructor||data.teacherViewingStudent)&&!data.deeperLearningCourse&&onOverviewPage&&dispatch((0,exports.setIsSummaryView)(data.teacherViewingStudent)),data.focusAreaLessonIds&&dispatch((0,exports.updateFocusArea)(data.changeFocusAreaPath,data.focusAreaLessonIds)),dispatch((0,lessonLockRedux_1.authorizeLockable)(data.lockableAuthorized)),data.completed&&dispatch((0,exports.setScriptCompleted)()),data.progress){if(dispatch((0,exports.setScriptProgress)(data.progress)),mergeProgress){var levelResults=lodash_1.default.mapValues(data.progress,progressHelpers_1.getLevelResult);dispatch((0,exports.mergeResults)(levelResults))}data.peerReviewsPerformed&&dispatch((0,exports.mergePeerReviewProgress)(data.peerReviewsPerformed)),data.current_lesson&&dispatch((0,exports.setCurrentLessonId)(data.current_lesson))}}}))};function processedLessons(lessons,isPlc){var numLessonsWithLessonPlan=0;return lessons.map((function(lesson){var lessonNumber;return!isPlc&&lesson.numberedLesson&&(lessonNumber=++numLessonsWithLessonPlan),__assign(__assign({},lodash_1.default.omit(lesson,"hidden")),{lessonNumber})}))}exports.initProgress=(_b=progressSlice.actions).initProgress,exports.setCurrentLevelId=_b.setCurrentLevelId,exports.setScriptProgress=_b.setScriptProgress,exports.clearResults=_b.clearResults,exports.useDbProgress=_b.useDbProgress,exports.mergeResults=_b.mergeResults,exports.overwriteResults=_b.overwriteResults,exports.mergePeerReviewProgress=_b.mergePeerReviewProgress,exports.updateFocusArea=_b.updateFocusArea,exports.disablePostMilestone=_b.disablePostMilestone,exports.setIsAge13Required=_b.setIsAge13Required,exports.setIsSummaryView=_b.setIsSummaryView,exports.setIsMiniView=_b.setIsMiniView,exports.setStudentDefaultsSummaryView=_b.setStudentDefaultsSummaryView,exports.setCurrentLessonId=_b.setCurrentLessonId,exports.setScriptCompleted=_b.setScriptCompleted,exports.setLessonExtrasEnabled=_b.setLessonExtrasEnabled,exports.setViewAsUserId=_b.setViewAsUserId,exports.default=progressSlice.reducer,exports.__testonly__={}},"./src/lab2/Lab2MetricsReporter.ts":function(__unused_webpack_module,exports,__webpack_require__){var __assign=this&&this.__assign||function(){return __assign=Object.assign||function(t){for(var s,i=1,n=arguments.length;i<n;i++)for(var p in s=arguments[i])Object.prototype.hasOwnProperty.call(s,p)&&(t[p]=s[p]);return t},__assign.apply(this,arguments)},__read=this&&this.__read||function(o,n){var m="function"==typeof Symbol&&o[Symbol.iterator];if(!m)return o;var r,e,i=m.call(o),ar=[];try{for(;(void 0===n||n-- >0)&&!(r=i.next()).done;)ar.push(r.value)}catch(error){e={error}}finally{try{r&&!r.done&&(m=i.return)&&m.call(i)}finally{if(e)throw e.error}}return ar},__spreadArray=this&&this.__spreadArray||function(to,from,pack){if(pack||2===arguments.length)for(var ar,i=0,l=from.length;i<l;i++)!ar&&i in from||(ar||(ar=Array.prototype.slice.call(from,0,i)),ar[i]=from[i]);return to.concat(ar||Array.prototype.slice.call(from))},__importDefault=this&&this.__importDefault||function(mod){return mod&&mod.__esModule?mod:{default:mod}};Object.defineProperty(exports,"__esModule",{value:!0});var MetricsReporter_1=__importDefault(__webpack_require__("./src/metrics/MetricsReporter.ts")),LabMetricsReporter=function(){function LabMetricsReporter(initialProperties){this.commonProperties={},this.commonProperties=initialProperties||{}}return LabMetricsReporter.prototype.updateProperties=function(properties){this.commonProperties=__assign(__assign({},this.commonProperties),properties)},LabMetricsReporter.prototype.logInfo=function(message){MetricsReporter_1.default.logInfo(this.decorateMessage(message))},LabMetricsReporter.prototype.logWarning=function(message){MetricsReporter_1.default.logWarning(this.decorateMessage(message))},LabMetricsReporter.prototype.logError=function(errorMessage,error,details){var message={errorMessage,error:(null==error?void 0:error.stack)||(null==error?void 0:error.message),details};MetricsReporter_1.default.logError(this.decorateMessage(message))},LabMetricsReporter.prototype.reportLoadTime=function(metricName,loadTimeMs,dimensions){void 0===dimensions&&(dimensions=[]),MetricsReporter_1.default.publishMetric(metricName,loadTimeMs,"Milliseconds",__spreadArray(__spreadArray([],__read(dimensions),!1),__read(this.getCommonDimensions()),!1))},LabMetricsReporter.prototype.publishMetric=function(name,value,unit,dimensions){void 0===dimensions&&(dimensions=[]),MetricsReporter_1.default.publishMetric(name,value,unit,__spreadArray(__spreadArray([],__read(dimensions),!1),__read(this.getCommonDimensions()),!1))},LabMetricsReporter.prototype.incrementCounter=function(metricName,dimensions){void 0===dimensions&&(dimensions=[]),MetricsReporter_1.default.incrementCounter(metricName,__spreadArray(__spreadArray([],__read(dimensions),!1),__read(this.getCommonDimensions()),!1))},LabMetricsReporter.prototype.reportSevereError=function(dimensions){void 0===dimensions&&(dimensions=[]),MetricsReporter_1.default.incrementCounter("SevereError",__spreadArray(__spreadArray([],__read(dimensions),!1),__read(this.getCommonDimensions()),!1))},LabMetricsReporter.prototype.reset=function(){this.commonProperties={}},LabMetricsReporter.prototype.decorateMessage=function(message){return"string"==typeof message&&(message={message}),__assign(__assign({},message),this.commonProperties)},LabMetricsReporter.prototype.getCommonDimensions=function(){var dimensions=[];return this.commonProperties.appName&&dimensions.push({name:"AppName",value:this.commonProperties.appName}),dimensions},LabMetricsReporter}();exports.default=LabMetricsReporter},"./src/lab2/Lab2Registry.ts":function(__unused_webpack_module,exports,__webpack_require__){var __importDefault=this&&this.__importDefault||function(mod){return mod&&mod.__esModule?mod:{default:mod}};Object.defineProperty(exports,"__esModule",{value:!0});var Lab2MetricsReporter_1=__importDefault(__webpack_require__("./src/lab2/Lab2MetricsReporter.ts")),LifecycleNotifier_1=__importDefault(__webpack_require__("./src/lab2/utils/LifecycleNotifier.tsx")),Lab2Registry=function(){function Lab2Registry(){this.projectManager=null,this.metricsReporter=new Lab2MetricsReporter_1.default,this.lifecycleNotifier=new LifecycleNotifier_1.default,this.appName=null}return Lab2Registry.getInstance=function(){return void 0===Lab2Registry._instance&&Lab2Registry.create(),Lab2Registry._instance},Lab2Registry.hasEnabledProjects=function(){return void 0!==Lab2Registry._instance&&null!==Lab2Registry._instance.projectManager},Lab2Registry.create=function(){Lab2Registry._instance=new Lab2Registry},Lab2Registry.prototype.setProjectManager=function(projectManager){this.projectManager=projectManager},Lab2Registry.prototype.getProjectManager=function(){return this.projectManager},Lab2Registry.prototype.clearProjectManager=function(){this.projectManager=null},Lab2Registry.prototype.getMetricsReporter=function(){return this.metricsReporter},Lab2Registry.prototype.getLifecycleNotifier=function(){return this.lifecycleNotifier},Lab2Registry.prototype.setAppName=function(appName){this.appName=appName},Lab2Registry.prototype.getAppName=function(){return this.appName},Lab2Registry}();exports.default=Lab2Registry},"./src/lab2/utils/LifecycleNotifier.tsx":function(__unused_webpack_module,exports){var LifecycleEvent,__read=this&&this.__read||function(o,n){var m="function"==typeof Symbol&&o[Symbol.iterator];if(!m)return o;var r,e,i=m.call(o),ar=[];try{for(;(void 0===n||n-- >0)&&!(r=i.next()).done;)ar.push(r.value)}catch(error){e={error}}finally{try{r&&!r.done&&(m=i.return)&&m.call(i)}finally{if(e)throw e.error}}return ar},__spreadArray=this&&this.__spreadArray||function(to,from,pack){if(pack||2===arguments.length)for(var ar,i=0,l=from.length;i<l;i++)!ar&&i in from||(ar||(ar=Array.prototype.slice.call(from,0,i)),ar[i]=from[i]);return to.concat(ar||Array.prototype.slice.call(from))};Object.defineProperty(exports,"__esModule",{value:!0}),exports.LifecycleEvent=void 0,function(LifecycleEvent){LifecycleEvent[LifecycleEvent.LevelChangeRequested=0]="LevelChangeRequested",LifecycleEvent[LifecycleEvent.LevelLoadStarted=1]="LevelLoadStarted",LifecycleEvent[LifecycleEvent.LevelLoadCompleted=2]="LevelLoadCompleted"}(LifecycleEvent||(exports.LifecycleEvent=LifecycleEvent={}));var LifecycleNotifier=function(){function LifecycleNotifier(){this.listeners={}}return LifecycleNotifier.prototype.addListener=function(event,callback){var _a;return this.listeners[event]||(this.listeners[event]=[]),null===(_a=this.listeners[event])||void 0===_a||_a.push(callback),this},LifecycleNotifier.prototype.removeListener=function(event,callback){if(this.listeners[event]){var index=this.listeners[event].indexOf(callback);-1!==index&&this.listeners[event].splice(index,1)}return this},LifecycleNotifier.prototype.notify=function(event){for(var _a,args=[],_i=1;_i<arguments.length;_i++)args[_i-1]=arguments[_i];null===(_a=this.listeners[event])||void 0===_a||_a.forEach((function(callback){return callback.apply(void 0,__spreadArray([],__read(args),!1))}))},LifecycleNotifier}();exports.default=LifecycleNotifier;try{LifecycleNotifier.displayName="LifecycleNotifier",LifecycleNotifier.__docgenInfo={description:"Notifies listeners of lifecycle events in the Lab2 system, which doesn't reload the page between levels.",displayName:"LifecycleNotifier",props:{}},"undefined"!=typeof STORYBOOK_REACT_CLASSES&&(STORYBOOK_REACT_CLASSES["src/lab2/utils/LifecycleNotifier.tsx#LifecycleNotifier"]={docgenInfo:LifecycleNotifier.__docgenInfo,name:"LifecycleNotifier",path:"src/lab2/utils/LifecycleNotifier.tsx#LifecycleNotifier"})}catch(__react_docgen_typescript_loader_error){}},"./src/lab2/utils/notifyLevelChange.ts":function(__unused_webpack_module,exports,__webpack_require__){var __importDefault=this&&this.__importDefault||function(mod){return mod&&mod.__esModule?mod:{default:mod}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=function notifyLevelChange(previousLevelId,nextLevelId){Lab2Registry_1.default.getInstance().getLifecycleNotifier().notify(LifecycleNotifier_1.LifecycleEvent.LevelChangeRequested,previousLevelId,nextLevelId)};var Lab2Registry_1=__importDefault(__webpack_require__("./src/lab2/Lab2Registry.ts")),LifecycleNotifier_1=__webpack_require__("./src/lab2/utils/LifecycleNotifier.tsx")},"./src/metrics/DashboardMetricsApi.ts":function(__unused_webpack_module,exports,__webpack_require__){var __awaiter=this&&this.__awaiter||function(thisArg,_arguments,P,generator){return new(P||(P=Promise))((function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){result.done?resolve(result.value):function adopt(value){return value instanceof P?value:new P((function(resolve){resolve(value)}))}(result.value).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())}))},__generator=this&&this.__generator||function(thisArg,body){var f,y,t,g,_={label:0,sent:function(){if(1&t[0])throw t[1];return t[1]},trys:[],ops:[]};return g={next:verb(0),throw:verb(1),return:verb(2)},"function"==typeof Symbol&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return function step(op){if(f)throw new TypeError("Generator is already executing.");for(;g&&(g=0,op[0]&&(_=0)),_;)try{if(f=1,y&&(t=2&op[0]?y.return:op[0]?y.throw||((t=y.return)&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;switch(y=0,t&&(op=[2&op[0],t.value]),op[0]){case 0:case 1:t=op;break;case 4:return _.label++,{value:op[1],done:!1};case 5:_.label++,y=op[1],op=[0];continue;case 7:op=_.ops.pop(),_.trys.pop();continue;default:if(!(t=_.trys,(t=t.length>0&&t[t.length-1])||6!==op[0]&&2!==op[0])){_=0;continue}if(3===op[0]&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(6===op[0]&&_.label<t[1]){_.label=t[1],t=op;break}if(t&&_.label<t[2]){_.label=t[2],_.ops.push(op);break}t[2]&&_.ops.pop(),_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e],y=0}finally{f=t=0}if(5&op[0])throw op[1];return{value:op[0]?op[1]:void 0,done:!0}}([n,v])}}},__importDefault=this&&this.__importDefault||function(mod){return mod&&mod.__esModule?mod:{default:mod}};Object.defineProperty(exports,"__esModule",{value:!0});var HttpClient_1=__importDefault(__webpack_require__("./src/util/HttpClient.ts")),DashboardMetricsApi=function(){function DashboardMetricsApi(){}return DashboardMetricsApi.prototype.sendLogs=function(logs){return __awaiter(this,void 0,Promise,(function(){return __generator(this,(function(_a){return[2,HttpClient_1.default.post("/browser_events/put_logs",JSON.stringify({logs}),!0)]}))}))},DashboardMetricsApi.prototype.sendMetricData=function(metricData){return __awaiter(this,void 0,void 0,(function(){return __generator(this,(function(_a){return[2,HttpClient_1.default.post("/browser_events/put_metric_data",JSON.stringify({metricData}),!0)]}))}))},DashboardMetricsApi}();exports.default=DashboardMetricsApi},"./src/metrics/MetricsReporter.ts":function(__unused_webpack_module,exports,__webpack_require__){var __assign=this&&this.__assign||function(){return __assign=Object.assign||function(t){for(var s,i=1,n=arguments.length;i<n;i++)for(var p in s=arguments[i])Object.prototype.hasOwnProperty.call(s,p)&&(t[p]=s[p]);return t},__assign.apply(this,arguments)},__awaiter=this&&this.__awaiter||function(thisArg,_arguments,P,generator){return new(P||(P=Promise))((function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){result.done?resolve(result.value):function adopt(value){return value instanceof P?value:new P((function(resolve){resolve(value)}))}(result.value).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())}))},__generator=this&&this.__generator||function(thisArg,body){var f,y,t,g,_={label:0,sent:function(){if(1&t[0])throw t[1];return t[1]},trys:[],ops:[]};return g={next:verb(0),throw:verb(1),return:verb(2)},"function"==typeof Symbol&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return function step(op){if(f)throw new TypeError("Generator is already executing.");for(;g&&(g=0,op[0]&&(_=0)),_;)try{if(f=1,y&&(t=2&op[0]?y.return:op[0]?y.throw||((t=y.return)&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;switch(y=0,t&&(op=[2&op[0],t.value]),op[0]){case 0:case 1:t=op;break;case 4:return _.label++,{value:op[1],done:!1};case 5:_.label++,y=op[1],op=[0];continue;case 7:op=_.ops.pop(),_.trys.pop();continue;default:if(!(t=_.trys,(t=t.length>0&&t[t.length-1])||6!==op[0]&&2!==op[0])){_=0;continue}if(3===op[0]&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(6===op[0]&&_.label<t[1]){_.label=t[1],t=op;break}if(t&&_.label<t[2]){_.label=t[2],_.ops.push(op);break}t[2]&&_.ops.pop(),_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e],y=0}finally{f=t=0}if(5&op[0])throw op[1];return{value:op[0]?op[1]:void 0,done:!0}}([n,v])}}},__read=this&&this.__read||function(o,n){var m="function"==typeof Symbol&&o[Symbol.iterator];if(!m)return o;var r,e,i=m.call(o),ar=[];try{for(;(void 0===n||n-- >0)&&!(r=i.next()).done;)ar.push(r.value)}catch(error){e={error}}finally{try{r&&!r.done&&(m=i.return)&&m.call(i)}finally{if(e)throw e.error}}return ar},__spreadArray=this&&this.__spreadArray||function(to,from,pack){if(pack||2===arguments.length)for(var ar,i=0,l=from.length;i<l;i++)!ar&&i in from||(ar||(ar=Array.prototype.slice.call(from,0,i)),ar[i]=from[i]);return to.concat(ar||Array.prototype.slice.call(from))},__importDefault=this&&this.__importDefault||function(mod){return mod&&mod.__esModule?mod:{default:mod}};Object.defineProperty(exports,"__esModule",{value:!0});var browser_detector_1=__webpack_require__("./src/util/browser-detector.js"),utils_1=__webpack_require__("./src/utils.js"),DashboardMetricsApi_1=__importDefault(__webpack_require__("./src/metrics/DashboardMetricsApi.ts")),MetricsReporter=function(){function MetricsReporter(metricsApi){this.metricsApi=metricsApi,this.metricsApi=metricsApi,this.lastCheckCanReportTime=parseInt(localStorage.getItem("cdo-metrics-reporter-last-check-time")||"0")||0}return MetricsReporter.prototype.logInfo=function(message){this.shouldReport()?this.log("INFO",message):console.log(message)},MetricsReporter.prototype.logWarning=function(message){this.shouldReport()?this.log("WARNING",message):console.warn(message)},MetricsReporter.prototype.logError=function(message){this.shouldReport()?this.log("SEVERE",message):console.error(message)},MetricsReporter.prototype.incrementCounter=function(name,dimensions){void 0===dimensions&&(dimensions=[]),this.publishMetric(name,1,"Count",dimensions)},MetricsReporter.prototype.publishMetric=function(name,value,unit,dimensions){void 0===dimensions&&(dimensions=[]);var metric={name,value,unit,dimensions:dimensions.concat(this.getDeviceDimensions())};this.shouldReport()?this.sendMetrics([metric,__assign(__assign({},metric),{dimensions:__spreadArray(__spreadArray([],__read(metric.dimensions),!1),[this.getBrowserVersionDimension()],!1)})]):console.info("[MetricsReporter] "+JSON.stringify(metric))},MetricsReporter.prototype.log=function(level,message){return __awaiter(this,void 0,void 0,(function(){var payload,error_1;return __generator(this,(function(_a){switch(_a.label){case 0:if(payload={level,message,deviceInfo:this.getDeviceInfo()},!this.isReportingEnabled())return this.fallbackLog(payload),[2];_a.label=1;case 1:return _a.trys.push([1,3,,4]),[4,this.metricsApi.sendLogs([payload])];case 2:return _a.sent(),[3,4];case 3:return error_1=_a.sent(),this.fallbackLog(payload),this.handleError(error_1),[3,4];case 4:return[2]}}))}))},MetricsReporter.prototype.sendMetrics=function(metrics){return __awaiter(this,void 0,void 0,(function(){var error_2;return __generator(this,(function(_a){switch(_a.label){case 0:if(!this.isReportingEnabled())return this.fallbackLog(metrics),[2];_a.label=1;case 1:return _a.trys.push([1,3,,4]),[4,this.metricsApi.sendMetricData(metrics)];case 2:return _a.sent(),[3,4];case 3:return error_2=_a.sent(),this.fallbackLog(metrics),this.handleError(error_2),[3,4];case 4:return[2]}}))}))},MetricsReporter.prototype.handleError=function(error){error.message.includes("401")?this.setReportingDisabled():console.error(error)},MetricsReporter.prototype.getDeviceInfo=function(){return{user_agent:window.navigator.userAgent,window_width:window.innerWidth,window_height:window.innerHeight,hostname:window.location.hostname,full_path:window.location.href}},MetricsReporter.prototype.getDeviceDimensions=function(){return[{name:"Hostname",value:window.location.hostname},{name:"Browser",value:(0,browser_detector_1.getBrowserName)()}]},MetricsReporter.prototype.getBrowserVersionDimension=function(){return{name:"BrowserVersion",value:(0,browser_detector_1.getBrowserName)(!0)}},MetricsReporter.prototype.fallbackLog=function(payload){(0,utils_1.isDevelopmentEnvironment)()&&console.log("Client-side reporting disabled. Attempted to report: "+JSON.stringify(payload))},MetricsReporter.prototype.isReportingEnabled=function(){return Date.now()-this.lastCheckCanReportTime>18e5},MetricsReporter.prototype.setReportingDisabled=function(){this.lastCheckCanReportTime=Date.now(),localStorage.setItem("cdo-metrics-reporter-last-check-time",this.lastCheckCanReportTime.toString())},MetricsReporter.prototype.shouldReport=function(){return!(0,utils_1.isDevelopmentEnvironment)()},MetricsReporter}();exports.default=new MetricsReporter(new DashboardMetricsApi_1.default)},"./src/types/progressTypes.ts":(__unused_webpack_module,exports)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.ViewType=exports.ReviewStates=exports.PUZZLE_PAGE_NONE=void 0,exports.PUZZLE_PAGE_NONE=-1,exports.ReviewStates={completed:"completed",keepWorking:"keepWorking",awaitingReview:"awaitingReview"},exports.ViewType={Participant:"Participant",Instructor:"Instructor"}},"./src/util/AuthenticityTokenStore.ts":function(__unused_webpack_module,exports){var __awaiter=this&&this.__awaiter||function(thisArg,_arguments,P,generator){return new(P||(P=Promise))((function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){result.done?resolve(result.value):function adopt(value){return value instanceof P?value:new P((function(resolve){resolve(value)}))}(result.value).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())}))},__generator=this&&this.__generator||function(thisArg,body){var f,y,t,g,_={label:0,sent:function(){if(1&t[0])throw t[1];return t[1]},trys:[],ops:[]};return g={next:verb(0),throw:verb(1),return:verb(2)},"function"==typeof Symbol&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return function step(op){if(f)throw new TypeError("Generator is already executing.");for(;g&&(g=0,op[0]&&(_=0)),_;)try{if(f=1,y&&(t=2&op[0]?y.return:op[0]?y.throw||((t=y.return)&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;switch(y=0,t&&(op=[2&op[0],t.value]),op[0]){case 0:case 1:t=op;break;case 4:return _.label++,{value:op[1],done:!1};case 5:_.label++,y=op[1],op=[0];continue;case 7:op=_.ops.pop(),_.trys.pop();continue;default:if(!(t=_.trys,(t=t.length>0&&t[t.length-1])||6!==op[0]&&2!==op[0])){_=0;continue}if(3===op[0]&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(6===op[0]&&_.label<t[1]){_.label=t[1],t=op;break}if(t&&_.label<t[2]){_.label=t[2],_.ops.push(op);break}t[2]&&_.ops.pop(),_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e],y=0}finally{f=t=0}if(5&op[0])throw op[1];return{value:op[0]?op[1]:void 0,done:!0}}([n,v])}}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.AUTHENTICITY_TOKEN_HEADER=void 0,exports.getAuthenticityToken=function getAuthenticityToken(){return __awaiter(this,void 0,Promise,(function(){var token;return __generator(this,(function(_a){switch(_a.label){case 0:return null!==authenticityToken?[2,authenticityToken]:[4,refreshToken()];case 1:return token=_a.sent(),[2,authenticityToken=token]}}))}))};var authenticityToken=null;function refreshToken(){return __awaiter(this,void 0,Promise,(function(){var tokenContainer,response,token;return __generator(this,(function(_a){switch(_a.label){case 0:return(tokenContainer=document.querySelector('meta[name="csrf-token"]'))&&tokenContainer.content?[2,tokenContainer.content]:[4,fetch("/get_token")];case 1:if(response=_a.sent(),null===(token=response.headers.get("csrf-token")))throw new Error("Could not retrieve CSRF token");return[2,token]}}))}))}exports.AUTHENTICITY_TOKEN_HEADER="X-CSRF-TOKEN"},"./src/util/HttpClient.ts":function(__unused_webpack_module,exports,__webpack_require__){var extendStatics,__extends=this&&this.__extends||(extendStatics=function(d,b){return extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(d,b){d.__proto__=b}||function(d,b){for(var p in b)Object.prototype.hasOwnProperty.call(b,p)&&(d[p]=b[p])},extendStatics(d,b)},function(d,b){if("function"!=typeof b&&null!==b)throw new TypeError("Class extends value "+String(b)+" is not a constructor or null");function __(){this.constructor=d}extendStatics(d,b),d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)}),__awaiter=this&&this.__awaiter||function(thisArg,_arguments,P,generator){return new(P||(P=Promise))((function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){result.done?resolve(result.value):function adopt(value){return value instanceof P?value:new P((function(resolve){resolve(value)}))}(result.value).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())}))},__generator=this&&this.__generator||function(thisArg,body){var f,y,t,g,_={label:0,sent:function(){if(1&t[0])throw t[1];return t[1]},trys:[],ops:[]};return g={next:verb(0),throw:verb(1),return:verb(2)},"function"==typeof Symbol&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return function step(op){if(f)throw new TypeError("Generator is already executing.");for(;g&&(g=0,op[0]&&(_=0)),_;)try{if(f=1,y&&(t=2&op[0]?y.return:op[0]?y.throw||((t=y.return)&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;switch(y=0,t&&(op=[2&op[0],t.value]),op[0]){case 0:case 1:t=op;break;case 4:return _.label++,{value:op[1],done:!1};case 5:_.label++,y=op[1],op=[0];continue;case 7:op=_.ops.pop(),_.trys.pop();continue;default:if(!(t=_.trys,(t=t.length>0&&t[t.length-1])||6!==op[0]&&2!==op[0])){_=0;continue}if(3===op[0]&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(6===op[0]&&_.label<t[1]){_.label=t[1],t=op;break}if(t&&_.label<t[2]){_.label=t[2],_.ops.push(op);break}t[2]&&_.ops.pop(),_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e],y=0}finally{f=t=0}if(5&op[0])throw op[1];return{value:op[0]?op[1]:void 0,done:!0}}([n,v])}}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.NetworkError=void 0,exports.isNetworkError=function isNetworkError(error){return error instanceof NetworkError};var AuthenticityTokenStore_1=__webpack_require__("./src/util/AuthenticityTokenStore.ts");var NetworkError=function(_super){function NetworkError(message,response){var _this=_super.call(this,message)||this;return _this.response=response,_this.name="NetworkError",Object.setPrototypeOf(_this,NetworkError.prototype),_this}return __extends(NetworkError,_super),NetworkError.prototype.getDetails=function(){var headers={};return this.response.headers.forEach((function(value,key){headers[key]=value})),{status:this.response.status,statusText:this.response.statusText,url:this.response.url,type:this.response.type,headers}},NetworkError}(Error);function sendRequest(method_1,endpoint_1,body_1){return __awaiter(this,arguments,Promise,(function(method,endpoint,body,useAuthenticityToken,headers){var token,response;return void 0===useAuthenticityToken&&(useAuthenticityToken=!1),void 0===headers&&(headers={}),__generator(this,(function(_a){switch(_a.label){case 0:return useAuthenticityToken?[4,(0,AuthenticityTokenStore_1.getAuthenticityToken)()]:[3,2];case 1:token=_a.sent(),headers[AuthenticityTokenStore_1.AUTHENTICITY_TOKEN_HEADER]=token,_a.label=2;case 2:return[4,fetch(endpoint,{method,body,headers})];case 3:if(!(response=_a.sent()).ok)throw new NetworkError(response.status+" "+response.statusText,response);return[2,response]}}))}))}exports.NetworkError=NetworkError,exports.default={delete:function deleteRequest(endpoint_1){return __awaiter(this,arguments,Promise,(function(endpoint,useAuthenticityToken,headers){return void 0===useAuthenticityToken&&(useAuthenticityToken=!1),void 0===headers&&(headers={}),__generator(this,(function(_a){return[2,sendRequest("DELETE",endpoint,void 0,useAuthenticityToken,headers)]}))}))},fetchJson:function fetchJson(endpoint,init,validator){return __awaiter(this,void 0,Promise,(function(){var response,json,value;return __generator(this,(function(_a){switch(_a.label){case 0:return[4,fetch(endpoint,init)];case 1:if(!(response=_a.sent()).ok)throw new NetworkError(response.status+" "+response.statusText,response);return[4,response.json()];case 2:return json=_a.sent(),value=json,validator&&(value=validator(json)),[2,{value,response}]}}))}))},post:function post(endpoint_1,body_1){return __awaiter(this,arguments,Promise,(function(endpoint,body,useAuthenticityToken,headers){return void 0===useAuthenticityToken&&(useAuthenticityToken=!1),void 0===headers&&(headers={}),__generator(this,(function(_a){return[2,sendRequest("POST",endpoint,body,useAuthenticityToken,headers)]}))}))},put:function put(endpoint_1,body_1){return __awaiter(this,arguments,Promise,(function(endpoint,body,useAuthenticityToken,headers){return void 0===useAuthenticityToken&&(useAuthenticityToken=!1),void 0===headers&&(headers={}),__generator(this,(function(_a){return[2,sendRequest("PUT",endpoint,body,useAuthenticityToken,headers)]}))}))},get:function get(endpoint_1){return __awaiter(this,arguments,Promise,(function(endpoint,useAuthenticityToken,headers){return void 0===useAuthenticityToken&&(useAuthenticityToken=!1),void 0===headers&&(headers={}),__generator(this,(function(_a){return[2,sendRequest("GET",endpoint,void 0,useAuthenticityToken,headers)]}))}))}}}}]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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T0FHYixDQUFQLEVBQU8sQ0FDTDNaLE1BQ0FpUSxXLFFBaUZGMkYsS0ExQkYsU0FBZUEsS0FBSyxXQUFELFEsZ0NBS2hCdkcsU0FBTyxTQUpSK0osU0FDQXZKLEtBQ0F3SixxQkFDQXpKLFMsWUFEQSxJQUFBeUosdUJBQUFBLHNCQUFBLFFBQ0EsSUFBQXpKLFVBQUFBLFFBQUEsSSwrQkFFQSxNQUFPLENBQVAsRUFBT3VKLFlBQVksT0FBUUMsU0FBVXZKLEtBQU13SixxQkFBc0J6SixTLFFBcUJqRWdLLElBcENGLFNBQWVBLElBQUksV0FBRCxRLGdDQUtmdkssU0FBTyxTQUpSK0osU0FDQXZKLEtBQ0F3SixxQkFDQXpKLFMsWUFEQSxJQUFBeUosdUJBQUFBLHNCQUFBLFFBQ0EsSUFBQXpKLFVBQUFBLFFBQUEsSSwrQkFFQSxNQUFPLENBQVAsRUFBT3VKLFlBQVksTUFBT0MsU0FBVXZKLEtBQU13SixxQkFBc0J6SixTLFFBK0JoRWdKLElBN0NGLFNBQWVBLElBQUksWSxnQ0FJaEJ2SixTQUFPLFNBSFIrSixTQUNBQyxxQkFDQXpKLFMsWUFEQSxJQUFBeUosdUJBQUFBLHNCQUFBLFFBQ0EsSUFBQXpKLFVBQUFBLFFBQUEsSSwrQkFFQSxNQUFPLENBQVAsRUFBT3VKLFlBQVksTUFBT0MsY0FBVXRXLEVBQVd1VyxxQkFBc0J6SixTIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tseS1tb29jLy4vc3JjL2NvZGUtc3R1ZGlvL2Jyb3dzZXJOYXZpZ2F0aW9uLmpzIiwid2VicGFjazovL2Jsb2NrbHktbW9vYy8uL3NyYy9jb2RlLXN0dWRpby9wcm9ncmVzc1JlZHV4U2VsZWN0b3JzLmpzIiwid2VicGFjazovL2Jsb2NrbHktbW9vYy8uL3NyYy9jb2RlLXN0dWRpby92ZXJpZmllZEluc3RydWN0b3JSZWR1eC5qcyIsIndlYnBhY2s6Ly9ibG9ja2x5LW1vb2MvLi9zcmMvdXRpbC9icm93c2VyLWRldGVjdG9yLmpzIiwid2VicGFjazovL2Jsb2NrbHktbW9vYy8uL3NyYy9jb2RlLXN0dWRpby9wcm9ncmVzc1JlZHV4LnRzIiwid2VicGFjazovL2Jsb2NrbHktbW9vYy8uL3NyYy9sYWIyL0xhYjJNZXRyaWNzUmVwb3J0ZXIudHMiLCJ3ZWJwYWNrOi8vYmxvY2tseS1tb29jLy4vc3JjL2xhYjIvTGFiMlJlZ2lzdHJ5LnRzIiwid2VicGFjazovL2Jsb2NrbHktbW9vYy8uL3NyYy9sYWIyL3V0aWxzL0xpZmVjeWNsZU5vdGlmaWVyLnRzeCIsIndlYnBhY2s6Ly9ibG9ja2x5LW1vb2MvLi9zcmMvbGFiMi91dGlscy9ub3RpZnlMZXZlbENoYW5nZS50cyIsIndlYnBhY2s6Ly9ibG9ja2x5LW1vb2MvLi9zcmMvbWV0cmljcy9EYXNoYm9hcmRNZXRyaWNzQXBpLnRzIiwid2VicGFjazovL2Jsb2NrbHktbW9vYy8uL3NyYy9tZXRyaWNzL01ldHJpY3NSZXBvcnRlci50cyIsIndlYnBhY2s6Ly9ibG9ja2x5LW1vb2MvLi9zcmMvdHlwZXMvcHJvZ3Jlc3NUeXBlcy50cyIsIndlYnBhY2s6Ly9ibG9ja2x5LW1vb2MvLi9zcmMvdXRpbC9BdXRoZW50aWNpdHlUb2tlblN0b3JlLnRzIiwid2VicGFjazovL2Jsb2NrbHktbW9vYy8uL3NyYy91dGlsL0h0dHBDbGllbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gYnJvd3Nlck5hdmlnYXRpb25cbi8vXG4vLyBUaGlzIGZpbGUgY29udGFpbnMgc29tZSBmdW5jdGlvbmFsaXR5IHJlbGF0ZWQgdG8gbmF2aWdhdGluZyB0aHJvdWdoXG4vLyBsZXZlbHMgd2l0aG91dCBkb2luZyBwYWdlIHJlbG9hZHMuXG5cbmltcG9ydCB7c2V0Q3VycmVudExldmVsSWR9IGZyb20gJ0BjZG8vYXBwcy9jb2RlLXN0dWRpby9wcm9ncmVzc1JlZHV4JztcblxuaW1wb3J0IG5vdGlmeUxldmVsQ2hhbmdlIGZyb20gJy4uL2xhYjIvdXRpbHMvbm90aWZ5TGV2ZWxDaGFuZ2UnO1xuaW1wb3J0IHtnZXRTdG9yZX0gZnJvbSAnLi4vcmVkdXgnO1xuXG4vLyBSZXR1cm5zIHdoZXRoZXIgd2UgY2FuIHNhZmVseSBuYXZpZ2F0ZSBiZXR3ZWVuIHRoZSB0d28gZ2l2ZW4gbGV2ZWxzXG4vLyB3aXRob3V0IHJlbG9hZGluZyB0aGUgd2hvbGUgcGFnZS5cbmV4cG9ydCBmdW5jdGlvbiBjYW5DaGFuZ2VMZXZlbEluUGFnZShjdXJyZW50TGV2ZWwsIG5ld0xldmVsKSB7XG4gIC8vIElmIHdlIGFyZSBvbiB0aGUgc3VtbWFyeSBwYWdlLCB3ZSBjYW4ndCBuYXZpZ2F0ZSB0byBhIG5ldyBsZXZlbCB3aXRob3V0XG4gIC8vIHJlbG9hZGluZyB0aGUgcGFnZS4gU3VtbWFyeSBpcyB1c2VkIGZvciB2aWV3aW5nIHN0dWRlbnQgcmVzcG9uc2VzIHRvXG4gIC8vIHByZWRpY3QgbGV2ZWxzLlxuICBjb25zdCBwYXRoID0gbmV3IFVSTChkb2N1bWVudC5sb2NhdGlvbikucGF0aG5hbWU7XG4gIGNvbnN0IHBhdGhDb21wb25lbnRzID0gcGF0aC5zcGxpdCgnLycpO1xuICBpZiAocGF0aENvbXBvbmVudHMuaW5jbHVkZXMoJ3N1bW1hcnknKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBPdGhlcndpc2UsIHdlIGNhbiBuYXZpZ2F0ZSBiZXR3ZWVuIGFueSAyIGxhYjIgbGV2ZWxzLlxuICByZXR1cm4gY3VycmVudExldmVsPy51c2VzTGFiMiAmJiBuZXdMZXZlbD8udXNlc0xhYjI7XG59XG5cbi8vIENhbGxlZCBvbmNlIG9uIHBhZ2UgbG9hZCBmb3IgYSBzY3JpcHQtbGV2ZWwgb25seSwgdGhpcyBzZXRzIHVwIGFcbi8vIGhhbmRsZXIsIGZvciB1c2VyLWluaXRpYXRlZCBicm93c2VyIGJhY2sgJiBmb3J3YXJkIGJ1dHRvblxuLy8gcHJlc3Nlcywgd2hpY2ggaXMgZmlyZWQgd2hlbiBhcnJpdmluZyBvbiBhIHBhZ2UgdGhhdCB3ZSBwdXNoZWQgb250byB0aGVcbi8vIGJyb3dzZXIgc2Vzc2lvbiBoaXN0b3J5IHN0YWNrLlxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwTmF2aWdhdGlvbkhhbmRsZXIoaW5pdGlhbExldmVsSWQpIHtcbiAgLy8gU3RvcmUgdGhlIHN0YXJ0aW5nIGxldmVsIElEIGluIHRoZSBicm93c2VyIGhpc3Rvcnkgc3RhY2suXG4gIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7bGV2ZWxJZDogaW5pdGlhbExldmVsSWR9LCAnJyk7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGNvbnN0IGxldmVsSWQgPSBldmVudC5zdGF0ZT8ubGV2ZWxJZDtcbiAgICBpZiAoIWxldmVsSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gTm90aWZ5IHRoZSBMYWIyIHN5c3RlbSAodGhhdCBoYW5kbGVzIGNoYW5naW5nIGxldmVscyB3aXRob3V0IHJlbG9hZCkgYWJvdXQgdGhlIGxldmVsIGNoYW5nZS5cbiAgICAvLyBUaGUgYnJvd3NlciBoaXN0b3J5IEFQSSBkb2VzIG5vdCBwcm92aWRlIGFjY2VzcyB0byB0aGUgc3RhdGUgb2YgdGhlIHBhZ2Ugd2UganVzdCBjYW1lIGZyb20sXG4gICAgLy8gc28gd2UgZG9uJ3Qga25vdyB0aGUgcHJldmlvdXMgbGV2ZWwgSUQuXG4gICAgbm90aWZ5TGV2ZWxDaGFuZ2UobnVsbCwgbGV2ZWxJZCk7XG4gICAgZ2V0U3RvcmUoKS5kaXNwYXRjaChzZXRDdXJyZW50TGV2ZWxJZChsZXZlbElkKSk7XG4gIH0pO1xufVxuXG4vLyBIYW5kbGVzIGEgdXNlciBuYXZpZ2F0aW9uIHRvIGEgbmV3IGxldmVsLCBieSBwdXNoaW5nIHRoaXMgbmV3IGxldmVsJ3MgVVJMXG4vLyBvbnRvIHRoZSBicm93c2VyIHNlc3Npb24gaGlzdG9yeSBzdGFjaywgYW5kIHVwZGF0aW5nIHRoZSB3aW5kb3cgdGl0bGUuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQnJvd3NlckZvckxldmVsTmF2aWdhdGlvbihcbiAgcHJvZ3Jlc3NTdG9yZVN0YXRlLFxuICBsZXZlbFBhdGgsXG4gIGxldmVsSWRcbikge1xuICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoe2xldmVsSWR9LCAnJywgbGV2ZWxQYXRoICsgd2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gIHNldFdpbmRvd1RpdGxlKHByb2dyZXNzU3RvcmVTdGF0ZSwgbGV2ZWxJZCk7XG59XG5cbi8vIElmIHdlIGFyZSBvbiBhIG5ldyBsZXZlbCB3aXRob3V0IGRvaW5nIGEgcGFnZSByZWxvYWQsIHRoZW4gd2Ugc2hvdWxkIHNldCB0aGUgdGl0bGVcbi8vIHRvIG1hdGNoIHdoYXQgbGV2ZWxzX2hlbHBlci5yYidzIGxldmVsX3RpdGxlIGZ1bmN0aW9uIHdvdWxkIGhhdmUgZG9uZS5cbmV4cG9ydCBmdW5jdGlvbiBzZXRXaW5kb3dUaXRsZShwcm9ncmVzc1N0b3JlU3RhdGUsIG5ld0xldmVsSWQpIHtcbiAgY29uc3QgbGVzc29uID0gcHJvZ3Jlc3NTdG9yZVN0YXRlLmxlc3NvbnMuZmluZChcbiAgICBsZXNzb24gPT4gbGVzc29uLmlkID09PSBwcm9ncmVzc1N0b3JlU3RhdGUuY3VycmVudExlc3NvbklkXG4gICk7XG4gIGNvbnN0IG51bUxlc3NvbnMgPSBsZXNzb24ubnVtX3NjcmlwdF9sZXNzb25zO1xuICBjb25zdCBsZXNzb25OYW1lID0gbGVzc29uLm5hbWU7XG4gIGNvbnN0IGxlc3NvbkluZGV4ID1cbiAgICBsZXNzb24ubGV2ZWxzLmZpbmRJbmRleChsZXZlbCA9PiBsZXZlbC5hY3RpdmVJZCA9PT0gbmV3TGV2ZWxJZCkgKyAxO1xuICBjb25zdCBzY3JpcHREaXNwbGF5TmFtZSA9IHByb2dyZXNzU3RvcmVTdGF0ZS5zY3JpcHREaXNwbGF5TmFtZTtcblxuICBkb2N1bWVudC50aXRsZSA9XG4gICAgbnVtTGVzc29ucyA+IDFcbiAgICAgID8gYCR7bGVzc29uTmFtZX0gIyR7bGVzc29uSW5kZXh9IHwgJHtzY3JpcHREaXNwbGF5TmFtZX0gLSBDb2RlLm9yZ2BcbiAgICAgIDogYCR7bGVzc29uTmFtZX0gIyR7bGVzc29uSW5kZXh9IC0gQ29kZS5vcmdgO1xufVxuIiwiLy8gU2VsZWN0b3JzIGFuZCByZWxhdGVkIGhlbHBlcnMgZm9yIHByb2dyZXNzUmVkdXguIFRoZXNlIGFyZSBpbiB0aGVpciBvd24gZmlsZVxuLy8gYmVjYXVzZSB0aGV5IGFyZSBxdWl0ZSBjb21wbGV4IGFuZCBwcm9ncmVzc1JlZHV4LmpzIGlzIGFscmVhZHkgcXVpdGUgbGFyZ2UuXG5cbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7VGVzdFJlc3VsdHN9IGZyb20gJ0BjZG8vYXBwcy9jb25zdGFudHMnO1xuaW1wb3J0IHtwcm9jZXNzZWRMZXZlbH0gZnJvbSAnQGNkby9hcHBzL3RlbXBsYXRlcy9wcm9ncmVzcy9wcm9ncmVzc0hlbHBlcnMnO1xuaW1wb3J0IHtMZXZlbFN0YXR1cywgTGV2ZWxLaW5kfSBmcm9tICdAY2RvL2dlbmVyYXRlZC1zY3JpcHRzL3NoYXJlZENvbnN0YW50cyc7XG5cbmltcG9ydCB7YWN0aXZpdHlDc3NDbGFzc30gZnJvbSAnLi9hY3Rpdml0eVV0aWxzJztcblxuY29uc3QgUEVFUl9SRVZJRVdfSUQgPSAtMTtcblxuLy8gU2VsZWN0b3JzXG5cbi8vIERvIHdlIGhhdmUgb25lIG9yIG1vcmUgbG9ja2FibGUgbGVzc29uc1xuZXhwb3J0IGNvbnN0IGhhc0xvY2thYmxlTGVzc29ucyA9IHN0YXRlID0+XG4gIHN0YXRlLmxlc3NvbnMuc29tZShsZXNzb24gPT4gbGVzc29uLmxvY2thYmxlKTtcblxuZXhwb3J0IGNvbnN0IGhhc0dyb3VwcyA9IHN0YXRlID0+IE9iamVjdC5rZXlzKGdyb3VwZWRMZXNzb25zKHN0YXRlKSkubGVuZ3RoID4gMTtcblxuZXhwb3J0IGNvbnN0IGdldEN1cnJlbnRMZXNzb24gPSBzdGF0ZSA9PlxuICBzdGF0ZS5wcm9ncmVzcy5sZXNzb25zPy5maW5kKGwgPT4gbC5pZCA9PT0gc3RhdGUucHJvZ3Jlc3MuY3VycmVudExlc3NvbklkKTtcblxuLyoqXG4gKiBFeHRyYWN0IHRoZSByZWxldmFudCBwb3J0aW9ucyBvZiBhIHBhcnRpY3VsYXIgbGVzc29uIGZyb20gdGhlIHN0b3JlLlxuICogTm90ZSwgdGhhdCB0aGlzIGRvZXMgbm90IGluY2x1ZGUgbGV2ZWxzXG4gKiBAcGFyYW0ge29iamVjdH0gc3RhdGUgLSBUaGUgcHJvZ3Jlc3Mgc3RhdGUgaW4gb3VyIHJlZHV4IHN0b3JlXG4gKiBAcGFyYW0ge251bWJlcn0gbGVzc29uSW5kZXggLSBUaGUgaW5kZXggaW50byBvdXIgbGVzc29ucyB3ZSBjYXJlIGFib3V0XG4gKiBAcmV0dXJucyB7TGVzc29ufVxuICovXG5jb25zdCBsZXNzb25Gcm9tTGVzc29uQXRJbmRleCA9IChzdGF0ZSwgbGVzc29uSW5kZXgpID0+ICh7XG4gIC4uLmxlc3NvbkZyb21MZXNzb24oc3RhdGUubGVzc29uc1tsZXNzb25JbmRleF0pLFxuICBpc0ZvY3VzQXJlYTogc3RhdGUuZm9jdXNBcmVhTGVzc29uSWRzLmluY2x1ZGVzKHN0YXRlLmxlc3NvbnNbbGVzc29uSW5kZXhdLmlkKSxcbn0pO1xuXG5jb25zdCBsZXNzb25Gcm9tTGVzc29uID0gbGVzc29uID0+XG4gIF8ucGljayhsZXNzb24sIFtcbiAgICAnbmFtZScsXG4gICAgJ2lkJyxcbiAgICAnbG9ja2FibGUnLFxuICAgICdsZXNzb25OdW1iZXInLFxuICAgICdsZXNzb25TdGFydFVybCcsXG4gICAgJ2xlc3Nvbl9wbGFuX2h0bWxfdXJsJyxcbiAgICAnbGVzc29uX2ZlZWRiYWNrX3VybCcsXG4gICAgJ3N0dWRlbnRfbGVzc29uX3BsYW5faHRtbF91cmwnLFxuICAgICdkZXNjcmlwdGlvbl9zdHVkZW50JyxcbiAgICAnZGVzY3JpcHRpb25fdGVhY2hlcicsXG4gIF0pO1xuZXhwb3J0IGNvbnN0IGxlc3NvbnMgPSBzdGF0ZSA9PlxuICBzdGF0ZS5sZXNzb25zLm1hcCgoXywgaW5kZXgpID0+IGxlc3NvbkZyb21MZXNzb25BdEluZGV4KHN0YXRlLCBpbmRleCkpO1xuXG4vKipcbiAqIEV4dHJhY3QgbGVzc29uIGZyb20gb3VyIHBlZXJSZXZpZXdMZXNzb25JbmZvIGlmIHdlIGhhdmUgb25lLiBXZSB3YW50IHRoaXMgdG8gZW5kIHVwXG4gKiBoYXZpbmcgdGhlIHNhbWUgZmllbGRzIGFzIG91ciBub24tcGVlciByZXZpZXcgbGVzc29ucy5cbiAqL1xuY29uc3QgcGVlclJldmlld0xlc3NvbiA9IHN0YXRlID0+ICh7XG4gIC4uLmxlc3NvbkZyb21MZXNzb24oc3RhdGUucGVlclJldmlld0xlc3NvbkluZm8pLFxuICAvLyBhZGQgc29tZSBmaWVsZHMgdGhhdCBhcmUgbWlzc2luZyBmb3IgdGhpcyBsZXNzb24gYnV0IHJlcXVpcmVkIGZvciBsZXNzb25UeXBlXG4gIGlkOiBQRUVSX1JFVklFV19JRCxcbiAgbG9ja2FibGU6IGZhbHNlLFxuICBpc0ZvY3VzQXJlYTogZmFsc2UsXG59KTtcblxuLyoqXG4gKiBFeHRyYWN0IGxldmVscyBmcm9tIG91ciBwZWVyUmV2aWV3TGVzc29uSW5mbywgbWFraW5nIHN1cmUgdGhlIGxldmVscyBoYXZlIHRoZSBzYW1lXG4gKiBzZXQgb2YgZmllbGRzIGFzIG91ciBub24tcGVlciByZXZpZXcgbGV2ZWxzLlxuICovXG5jb25zdCBwZWVyUmV2aWV3TGV2ZWxzID0gc3RhdGUgPT5cbiAgc3RhdGUucGVlclJldmlld0xlc3NvbkluZm8ubGV2ZWxzLm1hcCgobGV2ZWwsIGluZGV4KSA9PiAoe1xuICAgIC8vIFRoZXNlIGFyZW4ndCB0cnVlIGxldmVscyAoaS5lLiB3ZSB3b24ndCBoYXZlIGFuIGVudHJ5IGluIGxldmVsUmVzdWx0cyksXG4gICAgLy8gc28gYWx3YXlzIHVzZSBhIHNwZWNpZmljIGlkIHRoYXQgd29uJ3QgY29sbGlkZSB3aXRoIHJlYWwgbGV2ZWxzXG4gICAgLi4ubGV2ZWwsXG4gICAgaWQ6IFBFRVJfUkVWSUVXX0lELnRvU3RyaW5nKCksXG4gICAgaXNMb2NrZWQ6IGxldmVsLmxvY2tlZCxcbiAgICBzdGF0dXM6IGxldmVsLnN0YXR1cyB8fCBMZXZlbFN0YXR1cy5ub3RfdHJpZWQsXG4gICAgbGV2ZWxOdW1iZXI6IGluZGV4ICsgMSxcbiAgfSkpO1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciB3ZSBhcHBlYXIgdG8gYmUgaW4gYSBzY3JpcHQgbGV2ZWwgb3IgYSBzdGFuZGFsb25lIGxldmVsLlxuICogQSBzY3JpcHQgbGV2ZWwgaXMgaWRlbnRpZmllZCBiZWNhdXNlIGl0IGhhcyBsZXNzb25zLlxuICogQSBzdGFuZGFsb25lIGxldmVsIGRvZXNuJ3QgaGF2ZSBsZXNzb25zLCBidXQgaXQgZG9lcyBoYXZlIGEgbGV2ZWwgSUQuXG4gKi9cbmV4cG9ydCBjb25zdCBQcm9ncmVzc0xldmVsVHlwZSA9IHtcbiAgU0NSSVBUX0xFVkVMOiAnc2NyaXB0X2xldmVsJyxcbiAgTEVWRUw6ICdsZXZlbCcsXG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UHJvZ3Jlc3NMZXZlbFR5cGUgPSBzdGF0ZSA9PiB7XG4gIGlmIChzdGF0ZS5wcm9ncmVzcy5sZXNzb25zKSB7XG4gICAgcmV0dXJuIFByb2dyZXNzTGV2ZWxUeXBlLlNDUklQVF9MRVZFTDtcbiAgfSBlbHNlIGlmIChzdGF0ZS5wcm9ncmVzcy5jdXJyZW50TGV2ZWxJZCkge1xuICAgIHJldHVybiBQcm9ncmVzc0xldmVsVHlwZS5MRVZFTDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGRhc2hib2FyZCBVUkwgcGF0aCB0byByZXRyaWV2ZSB0aGUgbGV2ZWwgcHJvcGVydGllcyBmb3IgYSBzY3JpcHRcbiAqIGxldmVsIChpZiB3ZSBoYXZlIGxlc3NvbnMpIG9yIGEgbGV2ZWwgKGlmIHdlIGRvbid0IGhhdmUgbGVzc29ucykuIElmIHdlIGRvbid0XG4gKiBoYXZlIGEgY3VycmVudCBsZXZlbCwgdGhpcyByZXR1cm5zIHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldExldmVsUHJvcGVydGllc1BhdGggPSBzdGF0ZSA9PiB7XG4gIGlmIChzdGF0ZS5wcm9ncmVzcy5sZXNzb25zKSB7XG4gICAgY29uc3Qgc2NyaXB0TmFtZSA9IHN0YXRlLnByb2dyZXNzLnNjcmlwdE5hbWU7XG4gICAgY29uc3QgbGVzc29uUG9zaXRpb24gPSBzdGF0ZS5wcm9ncmVzcy5sZXNzb25zPy5maW5kKFxuICAgICAgbGVzc29uID0+IGxlc3Nvbi5pZCA9PT0gc3RhdGUucHJvZ3Jlc3MuY3VycmVudExlc3NvbklkXG4gICAgKS5yZWxhdGl2ZV9wb3NpdGlvbjtcblxuICAgIGxldCBsZXZlbFBvc2l0aW9uLCBzdWJsZXZlbFBvc2l0aW9uO1xuICAgIGNvbnN0IGN1cnJlbnRMZXZlbCA9IGdldEN1cnJlbnRMZXZlbChzdGF0ZSk7XG4gICAgbGV2ZWxQb3NpdGlvbiA9IGN1cnJlbnRMZXZlbC5sZXZlbE51bWJlcjtcblxuICAgIC8vIFVzZSB0aGUgc3VibGV2ZWwgcG9zaXRpb24gaWYgd2UncmUgb24gYSBzdWJsZXZlbFxuICAgIGlmIChjdXJyZW50TGV2ZWwucGFyZW50TGV2ZWxJZCkge1xuICAgICAgY29uc3QgcGFyZW50TGV2ZWwgPSBsZXZlbEJ5SWQoXG4gICAgICAgIHN0YXRlLnByb2dyZXNzLFxuICAgICAgICBzdGF0ZS5wcm9ncmVzcy5jdXJyZW50TGVzc29uSWQsXG4gICAgICAgIGN1cnJlbnRMZXZlbC5wYXJlbnRMZXZlbElkXG4gICAgICApO1xuICAgICAgbGV2ZWxQb3NpdGlvbiA9IHBhcmVudExldmVsLmxldmVsTnVtYmVyO1xuICAgICAgc3VibGV2ZWxQb3NpdGlvbiA9IGN1cnJlbnRMZXZlbC5sZXZlbE51bWJlcjtcbiAgICB9XG5cbiAgICByZXR1cm4gYC9zLyR7c2NyaXB0TmFtZX0vbGVzc29ucy8ke2xlc3NvblBvc2l0aW9ufS9sZXZlbHMvJHtsZXZlbFBvc2l0aW9ufS8ke1xuICAgICAgc3VibGV2ZWxQb3NpdGlvbiA9PT0gdW5kZWZpbmVkID8gJycgOiBgc3VibGV2ZWwvJHtzdWJsZXZlbFBvc2l0aW9ufS9gXG4gICAgfWxldmVsX3Byb3BlcnRpZXNgO1xuICB9IGVsc2UgaWYgKHN0YXRlLnByb2dyZXNzLmN1cnJlbnRMZXZlbElkICE9PSBudWxsKSB7XG4gICAgY29uc3QgbGV2ZWxJZCA9IHN0YXRlLnByb2dyZXNzLmN1cnJlbnRMZXZlbElkO1xuICAgIHJldHVybiBgL2xldmVscy8ke2xldmVsSWR9L2xldmVsX3Byb3BlcnRpZXNgO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZGFzaGJvYXJkIFVSTCBwYXRoIHRvIHJldHJpZXZlIHRoZSB1c2VyIGFwcCBvcHRpb25zIGZvciBhIHNjcmlwdCBsZXZlbC5cbiAqIElmIHdlIGRvbid0IGhhdmUgYSBjdXJyZW50IGxldmVsLCB0aGlzIHJldHVybnMgdW5kZWZpbmVkLlxuICovXG5leHBvcnQgY29uc3QgZ2V0VXNlckFwcE9wdGlvbnNQYXRoID0gc3RhdGUgPT4ge1xuICBpZiAoc3RhdGUucHJvZ3Jlc3MubGVzc29ucykge1xuICAgIGNvbnN0IHNjcmlwdE5hbWUgPSBzdGF0ZS5wcm9ncmVzcy5zY3JpcHROYW1lO1xuXG4gICAgY29uc3QgbGVzc29uUG9zaXRpb24gPSBzdGF0ZS5wcm9ncmVzcy5sZXNzb25zPy5maW5kKFxuICAgICAgbGVzc29uID0+IGxlc3Nvbi5pZCA9PT0gc3RhdGUucHJvZ3Jlc3MuY3VycmVudExlc3NvbklkXG4gICAgKS5yZWxhdGl2ZV9wb3NpdGlvbjtcblxuICAgIGNvbnN0IGN1cnJlbnRMZXZlbCA9IGdldEN1cnJlbnRMZXZlbChzdGF0ZSk7XG4gICAgY29uc3QgbGV2ZWxQb3NpdGlvbiA9IGN1cnJlbnRMZXZlbC5sZXZlbE51bWJlcjtcblxuICAgIGNvbnN0IGxldmVsSWQgPSBzdGF0ZS5wcm9ncmVzcy5jdXJyZW50TGV2ZWxJZDtcblxuICAgIHJldHVybiBgL2FwaS91c2VyX2FwcF9vcHRpb25zLyR7c2NyaXB0TmFtZX0vJHtsZXNzb25Qb3NpdGlvbn0vJHtsZXZlbFBvc2l0aW9ufS8ke2xldmVsSWR9YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59O1xuXG4vKipcbiAqIFRoZSBsZXZlbCBvYmplY3QgcGFzc2VkIGRvd24gdG8gdXNlIHZpYSB0aGUgc2VydmVyIChhbmQgc3RvcmVkIGluIGxlc3Nvbi5sZXNzb25zLmxldmVscylcbiAqIGNvbnRhaW5zIG1vcmUgZGF0YSB0aGFuIHdlIG5lZWQuIFRoaXMgKGEpIGZpbHRlcnMgdG8gdGhlIHBhcnRzIG91ciB2aWV3cyBjYXJlXG4gKiBhYm91dCBhbmQgKGIpIGRldGVybWluZXMgY3VycmVudCBzdGF0dXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgc3RhdGUgb2ZcbiAqIHN0YXRlLmxldmVsUmVzdWx0c1xuICovXG5jb25zdCBsZXZlbFdpdGhQcm9ncmVzcyA9IChcbiAge2xldmVsUmVzdWx0cywgdW5pdFByb2dyZXNzLCBsZXZlbFBhaXJpbmcgPSB7fSwgY3VycmVudExldmVsSWR9LFxuICBsZXZlbCxcbiAgaXNMb2NrYWJsZSxcbiAgcGFyZW50TGV2ZWxJZFxuKSA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRMZXZlbCA9IHByb2Nlc3NlZExldmVsKGxldmVsLCBwYXJlbnRMZXZlbElkKTtcbiAgaWYgKGxldmVsLmlkcykge1xuICAgIC8vIG1ha2Ugc3VyZSB3ZSdyZSB1c2luZyB0aGUgaWQgd2l0aCBiZXN0IHByb2dyZXNzXG4gICAgbm9ybWFsaXplZExldmVsLmlkID0gYmVzdFJlc3VsdExldmVsSWQobGV2ZWwuaWRzLCBsZXZlbFJlc3VsdHMpO1xuICB9XG5cbiAgLy8gZGVmYXVsdCB2YWx1ZXNcbiAgbGV0IHN0YXR1cyA9IExldmVsU3RhdHVzLm5vdF90cmllZDtcbiAgbGV0IGxvY2tlZCA9IGlzTG9ja2FibGU7XG4gIGxldCB0ZWFjaGVyRmVlZGJhY2tSZXZpZXdTdGF0ZSA9IG51bGw7XG5cbiAgbGV0IGxldmVsUHJvZ3Jlc3MgPSB1bml0UHJvZ3Jlc3Nbbm9ybWFsaXplZExldmVsLmlkXTtcbiAgaWYgKGxldmVsUHJvZ3Jlc3M/LnBhZ2VzKSB7XG4gICAgbGV2ZWxQcm9ncmVzcyA9IGxldmVsUHJvZ3Jlc3MucGFnZXNbbm9ybWFsaXplZExldmVsLnBhZ2VOdW1iZXIgLSAxXTtcbiAgfVxuICBpZiAobGV2ZWxQcm9ncmVzcykge1xuICAgIC8vIGlmIHdlIGhhdmUgbGV2ZWxQcm9ncmVzcywgb3ZlcndyaXRlIGRlZmF1bHQgdmFsdWVzXG4gICAgc3RhdHVzID0gbGV2ZWxQcm9ncmVzcy5zdGF0dXM7XG4gICAgbG9ja2VkID0gbGV2ZWxQcm9ncmVzcy5sb2NrZWQ7XG4gICAgdGVhY2hlckZlZWRiYWNrUmV2aWV3U3RhdGUgPSBsZXZlbFByb2dyZXNzLnRlYWNoZXJGZWVkYmFja1Jldmlld1N0YXRlO1xuICB9IGVsc2UgaWYgKGxldmVsLmtpbmQgIT09IExldmVsS2luZC5hc3Nlc3NtZW50KSB7XG4gICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBsZXZlbFByb2dyZXNzLCBnZXQgdGhlIHN0YXR1cyBmcm9tIGBsZXZlbFJlc3VsdHNgLlxuICAgIC8vIGhvd2V2ZXIsIGBsZXZlbFJlc3VsdHNgIGRvZXNuJ3QgdHJhY2sgcGVyLXBhZ2UgcmVzdWx0cyBmb3IgbXVsdGktcGFnZVxuICAgIC8vIGFzc2Vzc21lbnRzLCBzbyBmb3IgYXNzZXNzbWVudHMgd2UgbGVhdmUgZGVmYXVsdCB2YWx1ZXMuXG4gICAgLy9cbiAgICAvLyBub3RlOiBpZiB3ZSdyZSBub3QgdXNpbmcgbGV2ZWxQcm9ncmVzcywgYGlzTG9ja2VkYCB3aWxsIGFsd2F5cyBiZSBmYWxzZS5cbiAgICBzdGF0dXMgPSBhY3Rpdml0eUNzc0NsYXNzKGxldmVsUmVzdWx0c1tub3JtYWxpemVkTGV2ZWwuaWRdKTtcbiAgfVxuICBjb25zdCBpc0N1cnJlbnQgPVxuICAgIG5vcm1hbGl6ZWRMZXZlbC5pZCA9PT0gY3VycmVudExldmVsSWQgfHxcbiAgICAhIWxldmVsLmlkcz8uaW5jbHVkZXNbY3VycmVudExldmVsSWRdO1xuXG4gIHJldHVybiB7XG4gICAgLi4ubm9ybWFsaXplZExldmVsLFxuICAgIHN0YXR1czogc3RhdHVzLFxuICAgIGlzQ3VycmVudExldmVsOiBpc0N1cnJlbnQsXG4gICAgcGFpcmVkOiBsZXZlbFBhaXJpbmdbbGV2ZWwuYWN0aXZlSWRdLFxuICAgIGlzTG9ja2VkOiBsb2NrZWQsXG4gICAgdGVhY2hlckZlZWRiYWNrUmV2aWV3U3RhdGU6IHRlYWNoZXJGZWVkYmFja1Jldmlld1N0YXRlLFxuICAgIHN1YmxldmVsczogbGV2ZWwuc3VibGV2ZWxzPy5tYXAoc3VibGV2ZWwgPT5cbiAgICAgIGxldmVsV2l0aFByb2dyZXNzKFxuICAgICAgICB7bGV2ZWxSZXN1bHRzLCB1bml0UHJvZ3Jlc3MsIGxldmVsUGFpcmluZywgY3VycmVudExldmVsSWR9LFxuICAgICAgICBzdWJsZXZlbCxcbiAgICAgICAgaXNMb2NrYWJsZSxcbiAgICAgICAgbm9ybWFsaXplZExldmVsLmlkXG4gICAgICApXG4gICAgKSxcbiAgfTtcbn07XG5cbi8qKlxuICogR2V0IGxldmVsIGRhdGEgZm9yIGFsbCBsZXNzb25zXG4gKi9cbmV4cG9ydCBjb25zdCBsZXZlbHNCeUxlc3NvbiA9ICh7XG4gIGxlc3NvbnMsXG4gIGxldmVsUmVzdWx0cyxcbiAgdW5pdFByb2dyZXNzLFxuICBsZXZlbFBhaXJpbmcsXG4gIGN1cnJlbnRMZXZlbElkLFxufSkgPT5cbiAgbGVzc29ucy5tYXAobGVzc29uID0+XG4gICAgbGVzc29uLmxldmVscy5tYXAobGV2ZWwgPT4ge1xuICAgICAgbGV0IHN0YXR1c0xldmVsID0gbGV2ZWxXaXRoUHJvZ3Jlc3MoXG4gICAgICAgIHtsZXZlbFJlc3VsdHMsIHVuaXRQcm9ncmVzcywgbGV2ZWxQYWlyaW5nLCBjdXJyZW50TGV2ZWxJZH0sXG4gICAgICAgIGxldmVsLFxuICAgICAgICBsZXNzb24ubG9ja2FibGVcbiAgICAgICk7XG4gICAgICByZXR1cm4gc3RhdHVzTGV2ZWw7XG4gICAgfSlcbiAgKTtcblxuLyoqXG4gKiBHZXQgZGF0YSBmb3IgYSBwYXJ0aWN1bGFyIGxlc3NvblxuICovXG5leHBvcnQgY29uc3QgbGV2ZWxzRm9yTGVzc29uSWQgPSAoc3RhdGUsIGxlc3NvbklkKSA9PiB7XG4gIGNvbnN0IGxlc3NvbiA9IHN0YXRlLmxlc3NvbnM/LmZpbmQobGVzc29uID0+IGxlc3Nvbi5pZCA9PT0gbGVzc29uSWQpO1xuICByZXR1cm4gbGVzc29uPy5sZXZlbHMubWFwKGxldmVsID0+XG4gICAgbGV2ZWxXaXRoUHJvZ3Jlc3Moc3RhdGUsIGxldmVsLCBsZXNzb24ubG9ja2FibGUpXG4gICk7XG59O1xuXG4vKipcbiAqIEdpdmVuIGEgbGVzc29uIElELCBhbmQgYSBsZXZlbCBJRCwgcmV0dXJucyB0aGUgcmVxdWVzdGVkIGxldmVsLlxuICovXG5leHBvcnQgY29uc3QgbGV2ZWxCeUlkID0gKHN0YXRlLCBsZXNzb25JZCwgbGV2ZWxJZCkgPT4ge1xuICByZXR1cm4gbGV2ZWxzRm9yTGVzc29uSWQoc3RhdGUsIGxlc3NvbklkKVxuICAgID8uZmxhdE1hcChsZXZlbCA9PiBbbGV2ZWwsIC4uLihsZXZlbD8uc3VibGV2ZWxzIHx8IFtdKV0pXG4gICAgPy5maW5kKGxldmVsID0+IGxldmVsLmlkID09PSBsZXZlbElkKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDdXJyZW50TGV2ZWwgPSBzdGF0ZSA9PiB7XG4gIHJldHVybiBnZXRDdXJyZW50TGV2ZWxzKHN0YXRlKVxuICAgID8uZmxhdE1hcChsZXZlbCA9PiBbbGV2ZWwsIC4uLihsZXZlbD8uc3VibGV2ZWxzIHx8IFtdKV0pXG4gICAgPy5maW5kKGxldmVsID0+IGxldmVsLmlzQ3VycmVudExldmVsKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDdXJyZW50TGV2ZWxzID0gc3RhdGUgPT4ge1xuICByZXR1cm4gbGV2ZWxzRm9yTGVzc29uSWQoc3RhdGUucHJvZ3Jlc3MsIHN0YXRlLnByb2dyZXNzLmN1cnJlbnRMZXNzb25JZCk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgc2NyaXB0IGxldmVsIElEIG9mIHRoZSBjdXJyZW50IGxldmVsLiBJZiB0aGUgY3VycmVudCBsZXZlbCBpcyBhIHN1YmxldmVsLFxuICogKGFuZCB0aGVyZWZvcmUgbm90IGEgc2NyaXB0IGxldmVsKSByZXR1cm4gdGhlIHBhcmVudCBzY3JpcHQgbGV2ZWwgSUQuXG4gKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGVyZSBpcyBubyBjdXJyZW50IGxldmVsLlxuICovXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudFNjcmlwdExldmVsSWQgPSBzdGF0ZSA9PiB7XG4gIGNvbnN0IGN1cnJlbnRMZXZlbCA9IGdldEN1cnJlbnRMZXZlbChzdGF0ZSk7XG4gIGlmICghY3VycmVudExldmVsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGN1cnJlbnRMZXZlbC5wYXJlbnRMZXZlbElkKSB7XG4gICAgcmV0dXJuIGxldmVsQnlJZChcbiAgICAgIHN0YXRlLnByb2dyZXNzLFxuICAgICAgc3RhdGUucHJvZ3Jlc3MuY3VycmVudExlc3NvbklkLFxuICAgICAgY3VycmVudExldmVsLnBhcmVudExldmVsSWRcbiAgICApPy5zY3JpcHRMZXZlbElkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjdXJyZW50TGV2ZWwuc2NyaXB0TGV2ZWxJZDtcbiAgfVxufTtcblxuLyoqXG4gKiBHZXQgdGhlIG5leHQgbGV2ZWwgSUQgaW4gdGhlIHByb2dyZXNzaW9uIGlmIGl0IGV4aXN0cy5cbiAqIFJldHVybnMgdW5kZWZpbmVkIGlmIG5vdCBjdXJyZW50bHkgaW4gYSBzY3JpcHQgbGV2ZWwgb3JcbiAqIGN1cnJlbnRseSBvbiB0aGUgbGFzdCBsZXZlbC5cbiAqL1xuZXhwb3J0IGNvbnN0IG5leHRMZXZlbElkID0gc3RhdGUgPT4ge1xuICBpZiAoZ2V0UHJvZ3Jlc3NMZXZlbFR5cGUoc3RhdGUpICE9PSBQcm9ncmVzc0xldmVsVHlwZS5TQ1JJUFRfTEVWRUwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgbGV2ZWxzID0gbGV2ZWxzRm9yTGVzc29uSWQoXG4gICAgc3RhdGUucHJvZ3Jlc3MsXG4gICAgc3RhdGUucHJvZ3Jlc3MuY3VycmVudExlc3NvbklkXG4gICk7XG4gIGNvbnN0IGN1cnJlbnRMZXZlbCA9IGdldEN1cnJlbnRMZXZlbChzdGF0ZSk7XG4gIC8vIElmIHdlIGFyZSBvbiBhIHN1YmxldmVsLCBuYXZpZ2F0ZSBiYWNrIHRvIHRoZSBwYXJlbnQgbGV2ZWwuXG4gIGlmIChjdXJyZW50TGV2ZWwucGFyZW50TGV2ZWxJZCkge1xuICAgIHJldHVybiBjdXJyZW50TGV2ZWwucGFyZW50TGV2ZWxJZDtcbiAgfVxuICBjb25zdCBjdXJyZW50TGV2ZWxJbmRleCA9IGN1cnJlbnRMZXZlbC5sZXZlbE51bWJlciAtIDE7XG4gIGlmIChjdXJyZW50TGV2ZWxJbmRleCA9PT0gbGV2ZWxzLmxlbmd0aCAtIDEpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgbmV4dExldmVsID0gbGV2ZWxzW2N1cnJlbnRMZXZlbEluZGV4ICsgMV07XG4gIHJldHVybiBuZXh0TGV2ZWwuaWQ7XG59O1xuXG5leHBvcnQgY29uc3QgbGV2ZWxDb3VudCA9IHN0YXRlID0+IHtcbiAgaWYgKGdldFByb2dyZXNzTGV2ZWxUeXBlKHN0YXRlKSA9PT0gUHJvZ3Jlc3NMZXZlbFR5cGUuTEVWRUwpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICBpZiAoZ2V0UHJvZ3Jlc3NMZXZlbFR5cGUoc3RhdGUpID09PSBQcm9ncmVzc0xldmVsVHlwZS5TQ1JJUFRfTEVWRUwpIHtcbiAgICByZXR1cm4gZ2V0Q3VycmVudExldmVscyhzdGF0ZSkubGVuZ3RoO1xuICB9XG4gIHJldHVybiAwO1xufTtcblxuZXhwb3J0IGNvbnN0IGxlc3NvbkV4dHJhc1VybCA9IChzdGF0ZSwgbGVzc29uSWQpID0+XG4gIHN0YXRlLmxlc3NvbkV4dHJhc0VuYWJsZWRcbiAgICA/IHN0YXRlLmxlc3NvbnMuZmluZChsZXNzb24gPT4gbGVzc29uLmlkID09PSBsZXNzb25JZClcbiAgICAgICAgLmxlc3Nvbl9leHRyYXNfbGV2ZWxfdXJsXG4gICAgOiAnJztcblxuZXhwb3J0IGNvbnN0IGlzUGVyZmVjdCA9IChzdGF0ZSwgbGV2ZWxJZCkgPT5cbiAgISFzdGF0ZS5sZXZlbFJlc3VsdHMgJiZcbiAgc3RhdGUubGV2ZWxSZXN1bHRzW2xldmVsSWRdID49IFRlc3RSZXN1bHRzLk1JTklNVU1fT1BUSU1BTF9SRVNVTFQ7XG5cbi8qKlxuICogR3JvdXBzIGxlc3NvbnMgYWNjb3JkaW5nIHRvIExlc3Nvbkdyb3VwLlxuICogQHJldHVybnMge09iamVjdFtdfVxuICoge3N0cmluZ30gT2JqZWN0Lm5hbWVcbiAqIHtzdHJpbmdbXX0gT2JqZWN0Lmxlc3Nvbk5hbWVzXG4gKiB7T2JqZWN0W119IE9iamVjdC5sZXNzb25MZXZlbHNcbiAqL1xuZXhwb3J0IGNvbnN0IGdyb3VwZWRMZXNzb25zID0gKHN0YXRlLCBpbmNsdWRlQm9udXNMZXZlbHMgPSBmYWxzZSkgPT4ge1xuICBsZXQgYnlHcm91cCA9IHt9O1xuXG4gIGNvbnN0IGFsbExldmVscyA9IGxldmVsc0J5TGVzc29uKHN0YXRlKTtcblxuICBzdGF0ZS5sZXNzb25Hcm91cHMuZm9yRWFjaChsZXNzb25Hcm91cCA9PiB7XG4gICAgYnlHcm91cFtsZXNzb25Hcm91cC5kaXNwbGF5X25hbWVdID0ge1xuICAgICAgbGVzc29uR3JvdXA6IHtcbiAgICAgICAgaWQ6IGxlc3Nvbkdyb3VwLmlkLFxuICAgICAgICB1c2VyRmFjaW5nOiBsZXNzb25Hcm91cC51c2VyX2ZhY2luZyxcbiAgICAgICAgZGlzcGxheU5hbWU6IGxlc3Nvbkdyb3VwLmRpc3BsYXlfbmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IGxlc3Nvbkdyb3VwLmRlc2NyaXB0aW9uLFxuICAgICAgICBiaWdRdWVzdGlvbnM6IGxlc3Nvbkdyb3VwLmJpZ19xdWVzdGlvbnMsXG4gICAgICB9LFxuICAgICAgbGVzc29uczogW10sXG4gICAgICBsZXZlbHNCeUxlc3NvbjogW10sXG4gICAgfTtcbiAgfSk7XG5cbiAgc3RhdGUubGVzc29ucy5mb3JFYWNoKChsZXNzb24sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZ3JvdXAgPSBsZXNzb24ubGVzc29uX2dyb3VwX2Rpc3BsYXlfbmFtZTtcbiAgICBjb25zdCBsZXNzb25BdEluZGV4ID0gbGVzc29uRnJvbUxlc3NvbkF0SW5kZXgoc3RhdGUsIGluZGV4KTtcbiAgICBsZXQgbGVzc29uTGV2ZWxzID0gYWxsTGV2ZWxzW2luZGV4XTtcbiAgICBpZiAoIWluY2x1ZGVCb251c0xldmVscykge1xuICAgICAgbGVzc29uTGV2ZWxzID0gbGVzc29uTGV2ZWxzLmZpbHRlcihsZXZlbCA9PiAhbGV2ZWwuYm9udXMpO1xuICAgIH1cblxuICAgIGlmIChieUdyb3VwW2dyb3VwXSkge1xuICAgICAgYnlHcm91cFtncm91cF0ubGVzc29ucy5wdXNoKGxlc3NvbkF0SW5kZXgpO1xuICAgICAgYnlHcm91cFtncm91cF0ubGV2ZWxzQnlMZXNzb24ucHVzaChsZXNzb25MZXZlbHMpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gUGVlciByZXZpZXdzIGdldCB0aGVpciBvd24gZ3JvdXAsIGJ1dCB0aGVzZSBsZXZlbHMvbGVzc29uIGFyZSBzdG9yZWRcbiAgLy8gc2VwYXJhdGVseSBmcm9tIG91ciBvdGhlciBsZXZlbHMvbGVzc29ucyBpbiByZWR1eCAoc2luY2UgdGhleSdyZSBzbGlnaHRseVxuICAvLyBkaWZmZXJlbnQpXG4gIGlmIChzdGF0ZS5wZWVyUmV2aWV3TGVzc29uSW5mbykge1xuICAgIGJ5R3JvdXBbc3RhdGUucGVlclJldmlld0xlc3NvbkluZm8ubGVzc29uX2dyb3VwX2Rpc3BsYXlfbmFtZV0gPSB7XG4gICAgICBncm91cDogc3RhdGUucGVlclJldmlld0xlc3NvbkluZm8ubGVzc29uX2dyb3VwX2Rpc3BsYXlfbmFtZSxcbiAgICAgIGxlc3Nvbkdyb3VwOiB7XG4gICAgICAgIGlkOiBudWxsLCAvL1BlZXIgcmV2aWV3cyBkbyBub3QgaGF2ZSBkZXNjcmlwdGlvbnMgb3IgYmlnIHF1ZXN0aW9ucyBzbyB0aGV5IHdvbid0IG5lZWQgYW4gaWQgdG8gdHJhY2sgY2xpY2tzXG4gICAgICAgIGRpc3BsYXlOYW1lOiBzdGF0ZS5wZWVyUmV2aWV3TGVzc29uSW5mby5sZXNzb25fZ3JvdXBfZGlzcGxheV9uYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogbnVsbCxcbiAgICAgICAgYmlnUXVlc3Rpb25zOiBudWxsLFxuICAgICAgfSxcbiAgICAgIGxlc3NvbnM6IFtwZWVyUmV2aWV3TGVzc29uKHN0YXRlKV0sXG4gICAgICBsZXZlbHNCeUxlc3NvbjogW3BlZXJSZXZpZXdMZXZlbHMoc3RhdGUpXSxcbiAgICB9O1xuICB9XG5cbiAgLy8gV2Ugd2FudCB0byByZXR1cm4gYW4gYXJyYXkgb2YgY2F0ZWdvcmllc1xuICByZXR1cm4gXy52YWx1ZXMoYnlHcm91cCk7XG59O1xuXG4vKipcbiAqIEdpdmVuIGEgc2V0IG9mIGxldmVscywgZ3JvdXBzIHRoZW0gaW4gc2V0cyBvZiBwcm9ncmVzc2lvbnMsIHdoZXJlIGVhY2hcbiAqIHByb2dyZXNzaW9uIGlzIGEgc2V0IG9mIGFkamFjZW50IGxldmVscyBzaGFyaW5nIHRoZSBzYW1lIHByb2dyZXNzaW9uIG5hbWVcbiAqIEFueSBnaXZlbiBsZXZlbCdzIHByb2dyZXNzaW9uIG5hbWUgaXMgZGV0ZXJtaW5lZCBieSBmaXJzdCBsb29raW5nIHRvIHNlZSBpZlxuICogdGhlIHNlcnZlciBwcm92aWRlZCB1cyBvbmUgYXMgbGV2ZWwucHJvZ3Jlc3Npb24sIG90aGVyd2lzZSB3ZSBmYWxsIGJhY2sgdG9cbiAqIGp1c3QgbGV2ZWwubmFtZVxuICogQHBhcmFtIHtMZXZlbFtdfSBsZXZlbHNcbiAqIEByZXR1cm5zIHtvYmplY3RbXX0gQW4gYXJyYXkgb2YgcHJvZ3Jlc3Npb25zLCB3aGVyZSBlYWNoIGNvbnNpc3RzIG9mIGEgbmFtZSxcbiAqICAgdGhlIHBvc2l0aW9uIG9mIHRoZSBwcm9ncmVzc2lvbiBpbiB0aGUgaW5wdXQgYXJyYXksIGFuZCB0aGUgc2V0IG9mIGxldmVsc1xuICogICBpbiB0aGUgcHJvZ3Jlc3Npb25cbiAqL1xuZXhwb3J0IGNvbnN0IHByb2dyZXNzaW9uc0Zyb21MZXZlbHMgPSBsZXZlbHMgPT4ge1xuICBjb25zdCBwcm9ncmVzc2lvbnMgPSBbXTtcbiAgaWYgKGxldmVscy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gcHJvZ3Jlc3Npb25zO1xuICB9XG4gIGxldCBjdXJyZW50UHJvZ3Jlc3Npb24gPSB7XG4gICAgc3RhcnQ6IDAsXG4gICAgbmFtZTogbGV2ZWxzWzBdLnByb2dyZXNzaW9uIHx8IGxldmVsc1swXS5uYW1lLFxuICAgIGRpc3BsYXlOYW1lOiBsZXZlbHNbMF0ucHJvZ3Jlc3Npb25EaXNwbGF5TmFtZSB8fCBsZXZlbHNbMF0ubmFtZSxcbiAgICBsZXZlbHM6IFtsZXZlbHNbMF1dLFxuICB9O1xuICBsZXZlbHMuc2xpY2UoMSkuZm9yRWFjaCgobGV2ZWwsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgcHJvZ3Jlc3Npb25OYW1lID0gbGV2ZWwucHJvZ3Jlc3Npb24gfHwgbGV2ZWwubmFtZTtcbiAgICBpZiAocHJvZ3Jlc3Npb25OYW1lID09PSBjdXJyZW50UHJvZ3Jlc3Npb24ubmFtZSkge1xuICAgICAgY3VycmVudFByb2dyZXNzaW9uLmxldmVscy5wdXNoKGxldmVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvZ3Jlc3Npb25zLnB1c2goY3VycmVudFByb2dyZXNzaW9uKTtcbiAgICAgIGN1cnJlbnRQcm9ncmVzc2lvbiA9IHtcbiAgICAgICAgLy8gKyAxIGJlY2F1c2Ugd2Ugc2xpY2VkIG9mZiB0aGUgZmlyc3QgZWxlbWVudFxuICAgICAgICBzdGFydDogaW5kZXggKyAxLFxuICAgICAgICBuYW1lOiBsZXZlbC5wcm9ncmVzc2lvbiB8fCBsZXZlbC5uYW1lLFxuICAgICAgICBkaXNwbGF5TmFtZTogbGV2ZWwucHJvZ3Jlc3Npb25EaXNwbGF5TmFtZSB8fCBsZXZlbC5uYW1lLFxuICAgICAgICBsZXZlbHM6IFtsZXZlbF0sXG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG4gIHByb2dyZXNzaW9ucy5wdXNoKGN1cnJlbnRQcm9ncmVzc2lvbik7XG4gIHJldHVybiBwcm9ncmVzc2lvbnM7XG59O1xuXG4vLyBIZWxwZXJzXG5cbi8qKlxuICogUmV0dXJuIHRoZSBsZXZlbCB3aXRoIHRoZSBoaWdoZXN0IHByb2dyZXNzLCBvciB0aGUgZmlyc3QgbGV2ZWwgaWYgbm9uZSBoYXZlXG4gKiBiZWVuIGF0dGVtcHRlZFxuICogQHBhcmFtIHtudW1iZXJbXX0gbGV2ZWxJZHNcbiAqIEBwYXJhbSB7T2JqZWN0LjxudW1iZXIsbnVtYmVyPn0gLSBNYXBwaW5nIGZyb20gbGV2ZWwgaWQgdG8gcHJvZ3Jlc3MgcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGJlc3RSZXN1bHRMZXZlbElkKGxldmVsSWRzLCBwcm9ncmVzc0RhdGEpIHtcbiAgLy8gVGhlIHVzdWFsIGNhc2VcbiAgaWYgKGxldmVsSWRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBsZXZlbElkc1swXTtcbiAgfVxuXG4gIC8vIFJldHVybiB0aGUgbGV2ZWwgd2l0aCB0aGUgaGlnaGVzdCByZXN1bHRcbiAgdmFyIGF0dGVtcHRlZElkcyA9IGxldmVsSWRzLmZpbHRlcihpZCA9PiBwcm9ncmVzc0RhdGFbaWRdKTtcbiAgaWYgKGF0dGVtcHRlZElkcy5sZW5ndGggPT09IDApIHtcbiAgICAvLyBOb25lIG9mIHRoZW0gaGF2ZSBiZWVuIGF0dGVtcHRlZCwganVzdCByZXR1cm4gdGhlIGZpcnN0XG4gICAgcmV0dXJuIGxldmVsSWRzWzBdO1xuICB9XG4gIHZhciBiZXN0SWQgPSBhdHRlbXB0ZWRJZHNbMF07XG4gIHZhciBiZXN0UmVzdWx0ID0gcHJvZ3Jlc3NEYXRhW2Jlc3RJZF07XG4gIGF0dGVtcHRlZElkcy5mb3JFYWNoKGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciByZXN1bHQgPSBwcm9ncmVzc0RhdGFbaWRdO1xuICAgIGlmIChyZXN1bHQgPiBiZXN0UmVzdWx0KSB7XG4gICAgICBiZXN0SWQgPSBpZDtcbiAgICAgIGJlc3RSZXN1bHQgPSByZXN1bHQ7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGJlc3RJZDtcbn1cblxuLy8gZXhwb3J0IHByaXZhdGUgZnVuY3Rpb24ocykgdG8gZXhwb3NlIHRvIHVuaXQgdGVzdGluZ1xuZXhwb3J0IGNvbnN0IF9fdGVzdG9ubHlfXyA9IElOX1VOSVRfVEVTVFxuICA/IHtcbiAgICAgIGJlc3RSZXN1bHRMZXZlbElkLFxuICAgICAgcGVlclJldmlld0xlc3NvbixcbiAgICAgIHBlZXJSZXZpZXdMZXZlbHMsXG4gICAgICBQRUVSX1JFVklFV19JRCxcbiAgICB9XG4gIDoge307XG4iLCJjb25zdCBTRVRfVkVSSUZJRUQgPSAndmVyaWZpZWRJbnN0cnVjdG9yL1NFVF9WRVJJRklFRCc7XG5jb25zdCBTRVRfVkVSSUZJRURfUkVTT1VSQ0VTID0gJ3ZlcmlmaWVkSW5zdHJ1Y3Rvci9TRVRfVkVSSUZJRURfUkVTT1VSQ0VTJztcblxuZXhwb3J0IGNvbnN0IHNldFZlcmlmaWVkID0gKCkgPT4gKHt0eXBlOiBTRVRfVkVSSUZJRUR9KTtcbmV4cG9ydCBjb25zdCBzZXRWZXJpZmllZFJlc291cmNlcyA9IGhhc1ZlcmlmaWVkUmVzb3VyY2VzID0+ICh7XG4gIHR5cGU6IFNFVF9WRVJJRklFRF9SRVNPVVJDRVMsXG59KTtcblxuY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICBpc1ZlcmlmaWVkOiBmYWxzZSxcbiAgLy8gVHJ1ZSBpZiBhIHBhZ2UgKGNvdXJzZS9zY3JpcHQpIGhhcyByZXNvdXJjZXMgdGhhdCBhcmUgb25seSBhdmFpbGFibGUgdG9cbiAgLy8gdmVyaWZpZWQgdGVhY2hlcnNcbiAgaGFzVmVyaWZpZWRSZXNvdXJjZXM6IGZhbHNlLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmVyaWZpZWRJbnN0cnVjdG9yKHN0YXRlID0gaW5pdGlhbFN0YXRlLCBhY3Rpb24pIHtcbiAgaWYgKGFjdGlvbi50eXBlID09PSBTRVRfVkVSSUZJRUQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBpc1ZlcmlmaWVkOiB0cnVlLFxuICAgIH07XG4gIH1cblxuICBpZiAoYWN0aW9uLnR5cGUgPT09IFNFVF9WRVJJRklFRF9SRVNPVVJDRVMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBoYXNWZXJpZmllZFJlc291cmNlczogdHJ1ZSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgfTtcbn1cbiIsIi8vIFdlIHN1cHBvcnQgSUUgMTErXG5mdW5jdGlvbiBpc0lFKCkge1xuICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdNU0lFJykgIT09IC0xIHx8IGlzSUUxMSgpO1xufVxuXG5mdW5jdGlvbiBJRVZlcnNpb24oKSB7XG4gIHJldHVybiBpc0lFMTEoKVxuICAgID8gJzExJ1xuICAgIDogbmF2aWdhdG9yLnVzZXJBZ2VudFxuICAgICAgICAuc3Vic3RyaW5nKG5hdmlnYXRvci51c2VyQWdlbnQubGFzdEluZGV4T2YoJ01TSUUnKSArIDUpXG4gICAgICAgIC5zcGxpdCgnLicpWzBdO1xufVxuXG5mdW5jdGlvbiBpc1Vuc3VwcG9ydGVkSUUoKSB7XG4gIHJldHVybiBpc0lFKCkgJiYgSUVWZXJzaW9uKCkgPCAxMTtcbn1cblxuLy8gV2Ugc3VwcG9ydCBDaHJvbWUgMzMueCArXG5mdW5jdGlvbiBpc0Nocm9tZSgpIHtcbiAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubGFzdEluZGV4T2YoJ0Nocm9tZS8nKSAhPT0gLTE7XG59XG5cbmZ1bmN0aW9uIGNocm9tZVZlcnNpb24oKSB7XG4gIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50XG4gICAgLnN1YnN0cmluZyhuYXZpZ2F0b3IudXNlckFnZW50Lmxhc3RJbmRleE9mKCdDaHJvbWUvJykgKyA3KVxuICAgIC5zcGxpdCgnLicpWzBdO1xufVxuXG5mdW5jdGlvbiBpc1Vuc3VwcG9ydGVkQ2hyb21lKCkge1xuICByZXR1cm4gaXNDaHJvbWUoKSAmJiBjaHJvbWVWZXJzaW9uKCkgPCAzMztcbn1cblxuLy8gV2Ugc3VwcG9ydCBTYWZhcmkgNy4wLnggK1xuZnVuY3Rpb24gaXNTYWZhcmkoKSB7XG4gIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ1NhZmFyaS8nKSAhPT0gLTE7XG59XG5cbmZ1bmN0aW9uIHNhZmFyaVZlcnNpb24oKSB7XG4gIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50XG4gICAgLnN1YnN0cmluZyhuYXZpZ2F0b3IudXNlckFnZW50Lmxhc3RJbmRleE9mKCdWZXJzaW9uLycpICsgOClcbiAgICAuc3BsaXQoJy4nKVswXTtcbn1cblxuZnVuY3Rpb24gaXNVbnN1cHBvcnRlZFNhZmFyaSgpIHtcbiAgcmV0dXJuIGlzU2FmYXJpKCkgJiYgc2FmYXJpVmVyc2lvbigpIDwgNztcbn1cblxuLy8gV2Ugc3VwcG9ydCBGaXJlZm94IDI1LnggK1xuZnVuY3Rpb24gaXNGaXJlZm94KCkge1xuICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94JykgIT09IC0xO1xufVxuXG5mdW5jdGlvbiBmaXJlZm94VmVyc2lvbigpIHtcbiAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnRcbiAgICAuc3Vic3RyaW5nKG5hdmlnYXRvci51c2VyQWdlbnQubGFzdEluZGV4T2YoJ0ZpcmVmb3gvJykgKyA4KVxuICAgIC5zcGxpdCgnLicpWzBdO1xufVxuXG5mdW5jdGlvbiBpc1Vuc3VwcG9ydGVkRmlyZWZveCgpIHtcbiAgcmV0dXJuIGlzRmlyZWZveCgpICYmIGZpcmVmb3hWZXJzaW9uKCkgPCAyNTtcbn1cblxuLy8gaHR0cHM6Ly9zdXBwb3J0LmNvZGUub3JnL2hjL2VuLXVzL2FydGljbGVzLzIwMjU5MTc0M1xuLy8gZm9yIHRoZSBmdWxsIGxpc3Qgb2Ygc3VwcG9ydGVkIGJyb3dzZXJzXG5leHBvcnQgZnVuY3Rpb24gaXNVbnN1cHBvcnRlZEJyb3dzZXIoKSB7XG4gIHJldHVybiAoXG4gICAgaXNVbnN1cHBvcnRlZElFKCkgfHxcbiAgICBpc1Vuc3VwcG9ydGVkQ2hyb21lKCkgfHxcbiAgICBpc1Vuc3VwcG9ydGVkU2FmYXJpKCkgfHxcbiAgICBpc1Vuc3VwcG9ydGVkRmlyZWZveCgpXG4gICk7XG59XG5cbi8vIERldGVjdCBhIG1vYmlsZSBkZXZpY2UuXG5leHBvcnQgZnVuY3Rpb24gaXNNb2JpbGVEZXZpY2UoKSB7XG4gIC8vIEFkYXB0ZWQgZnJvbSBodHRwOi8vZGV0ZWN0bW9iaWxlYnJvd3NlcnMuY29tLyB3aXRoIHRoZSBhZGRpdGlvbiBvZiB8YW5kcm9pZHxpcGFkfHBsYXlib29rfHNpbGsgYXNcbiAgLy8gaXQgc3VnZ2VzdHMgYXQgaHR0cDovL2RldGVjdG1vYmlsZWJyb3dzZXJzLmNvbS9hYm91dFxuICAvLyBOb3RlIHRoYXQgdGhlcmUgYXJlIHR3byByZWd1bGFyIGV4cHJlc3Npb25zIGluIHRoZSBibG9iLiAgVGhlIGZpcnN0IHRlc3RzIGFnYWluc3QgdmFyaWFibGUgYSAodGhlIGVudGlyZVxuICAvLyB1c2VyIGFnZW50KSB3aGlsZSB0aGUgc2Vjb25kIHRlc3RzIGFnYWluc3QganVzdCB0aGUgZmlyc3QgZm91ciBjaGFyYWN0ZXJzIGluIGl0LlxuXG4gIHZhciBjaGVjayA9IGZhbHNlO1xuICAoZnVuY3Rpb24gKGEpIHtcbiAgICBpZiAoXG4gICAgICAvKGFuZHJvaWR8YmJcXGQrfG1lZWdvKS4rbW9iaWxlfGF2YW50Z298YmFkYVxcL3xibGFja2JlcnJ5fGJsYXplcnxjb21wYWx8ZWxhaW5lfGZlbm5lY3xoaXB0b3B8aWVtb2JpbGV8aXAoaG9uZXxvZCl8aXJpc3xraW5kbGV8bGdlIHxtYWVtb3xtaWRwfG1tcHxtb2JpbGUuK2ZpcmVmb3h8bmV0ZnJvbnR8b3BlcmEgbShvYnxpbilpfHBhbG0oIG9zKT98cGhvbmV8cChpeGl8cmUpXFwvfHBsdWNrZXJ8cG9ja2V0fHBzcHxzZXJpZXMoNHw2KTB8c3ltYmlhbnx0cmVvfHVwXFwuKGJyb3dzZXJ8bGluayl8dm9kYWZvbmV8d2FwfHdpbmRvd3MgKGNlfHBob25lKXx4ZGF8eGlpbm98YW5kcm9pZHxpcGFkfHBsYXlib29rfHNpbGsvaS50ZXN0KFxuICAgICAgICBhXG4gICAgICApIHx8XG4gICAgICAvMTIwN3w2MzEwfDY1OTB8M2dzb3w0dGhwfDUwWzEtNl1pfDc3MHN8ODAyc3xhIHdhfGFiYWN8YWMoZXJ8b298c1xcLSl8YWkoa298cm4pfGFsKGF2fGNhfGNvKXxhbW9pfGFuKGV4fG55fHl3KXxhcHR1fGFyKGNofGdvKXxhcyh0ZXx1cyl8YXR0d3xhdShkaXxcXC1tfHIgfHMgKXxhdmFufGJlKGNrfGxsfG5xKXxiaShsYnxyZCl8YmwoYWN8YXopfGJyKGV8dil3fGJ1bWJ8YndcXC0obnx1KXxjNTVcXC98Y2FwaXxjY3dhfGNkbVxcLXxjZWxsfGNodG18Y2xkY3xjbWRcXC18Y28obXB8bmQpfGNyYXd8ZGEoaXR8bGx8bmcpfGRidGV8ZGNcXC1zfGRldml8ZGljYXxkbW9ifGRvKGN8cClvfGRzKDEyfFxcLWQpfGVsKDQ5fGFpKXxlbShsMnx1bCl8ZXIoaWN8azApfGVzbDh8ZXooWzQtN10wfG9zfHdhfHplKXxmZXRjfGZseShcXC18Xyl8ZzEgdXxnNTYwfGdlbmV8Z2ZcXC01fGdcXC1tb3xnbyhcXC53fG9kKXxncihhZHx1bil8aGFpZXxoY2l0fGhkXFwtKG18cHx0KXxoZWlcXC18aGkocHR8dGEpfGhwKCBpfGlwKXxoc1xcLWN8aHQoYyhcXC18IHxffGF8Z3xwfHN8dCl8dHApfGh1KGF3fHRjKXxpXFwtKDIwfGdvfG1hKXxpMjMwfGlhYyggfFxcLXxcXC8pfGlicm98aWRlYXxpZzAxfGlrb218aW0xa3xpbm5vfGlwYXF8aXJpc3xqYSh0fHYpYXxqYnJvfGplbXV8amlnc3xrZGRpfGtlaml8a2d0KCB8XFwvKXxrbG9ufGtwdCB8a3djXFwtfGt5byhjfGspfGxlKG5vfHhpKXxsZyggZ3xcXC8oa3xsfHUpfDUwfDU0fFxcLVthLXddKXxsaWJ3fGx5bnh8bTFcXC13fG0zZ2F8bTUwXFwvfG1hKHRlfHVpfHhvKXxtYygwMXwyMXxjYSl8bVxcLWNyfG1lKHJjfHJpKXxtaShvOHxvYXx0cyl8bW1lZnxtbygwMXwwMnxiaXxkZXxkb3x0KFxcLXwgfG98dil8enopfG10KDUwfHAxfHYgKXxtd2JwfG15d2F8bjEwWzAtMl18bjIwWzItM118bjMwKDB8Mil8bjUwKDB8Mnw1KXxuNygwKDB8MSl8MTApfG5lKChjfG0pXFwtfG9ufHRmfHdmfHdnfHd0KXxub2soNnxpKXxuenBofG8yaW18b3AodGl8d3YpfG9yYW58b3dnMXxwODAwfHBhbihhfGR8dCl8cGR4Z3xwZygxM3xcXC0oWzEtOF18YykpfHBoaWx8cGlyZXxwbChheXx1Yyl8cG5cXC0yfHBvKGNrfHJ0fHNlKXxwcm94fHBzaW98cHRcXC1nfHFhXFwtYXxxYygwN3wxMnwyMXwzMnw2MHxcXC1bMi03XXxpXFwtKXxxdGVrfHIzODB8cjYwMHxyYWtzfHJpbTl8cm8odmV8em8pfHM1NVxcL3xzYShnZXxtYXxtbXxtc3xueXx2YSl8c2MoMDF8aFxcLXxvb3xwXFwtKXxzZGtcXC98c2UoYyhcXC18MHwxKXw0N3xtY3xuZHxyaSl8c2doXFwtfHNoYXJ8c2llKFxcLXxtKXxza1xcLTB8c2woNDV8aWQpfHNtKGFsfGFyfGIzfGl0fHQ1KXxzbyhmdHxueSl8c3AoMDF8aFxcLXx2XFwtfHYgKXxzeSgwMXxtYil8dDIoMTh8NTApfHQ2KDAwfDEwfDE4KXx0YShndHxsayl8dGNsXFwtfHRkZ1xcLXx0ZWwoaXxtKXx0aW1cXC18dFxcLW1vfHRvKHBsfHNoKXx0cyg3MHxtXFwtfG0zfG01KXx0eFxcLTl8dXAoXFwuYnxnMXxzaSl8dXRzdHx2NDAwfHY3NTB8dmVyaXx2aShyZ3x0ZSl8dmsoNDB8NVswLTNdfFxcLXYpfHZtNDB8dm9kYXx2dWxjfHZ4KDUyfDUzfDYwfDYxfDcwfDgwfDgxfDgzfDg1fDk4KXx3M2MoXFwtfCApfHdlYmN8d2hpdHx3aShnIHxuY3xudyl8d21sYnx3b251fHg3MDB8eWFzXFwtfHlvdXJ8emV0b3x6dGVcXC0vaS50ZXN0KFxuICAgICAgICBhLnN1YnN0cigwLCA0KVxuICAgICAgKVxuICAgICkge1xuICAgICAgY2hlY2sgPSB0cnVlO1xuICAgIH1cbiAgfSkobmF2aWdhdG9yLnVzZXJBZ2VudCB8fCBuYXZpZ2F0b3IudmVuZG9yIHx8IHdpbmRvdy5vcGVyYSk7XG4gIHJldHVybiBjaGVjaztcbn1cblxuLy8gRGV0ZWN0IElFMTEuICBBZGFwdGVkIGZyb21cbi8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjE4MjUxNTcvaW50ZXJuZXQtZXhwbG9yZXItMTEtZGV0ZWN0aW9uLzIxODI1MjA3IzIxODI1MjA3XG5leHBvcnQgZnVuY3Rpb24gaXNJRTExKCkge1xuICB2YXIgaXNJRTExID0gISF3aW5kb3cuTVNJbnB1dE1ldGhvZENvbnRleHQgJiYgISFkb2N1bWVudC5kb2N1bWVudE1vZGU7XG4gIHJldHVybiBpc0lFMTE7XG59XG5cbi8vIERldGVybWluZSB3aGV0aGVyIGxvY2FsIHN0b3JhZ2UgaXMgYXZhaWxhYmxlLiAgT24gbWFjT1MgU2FmYXJpIFByaXZhdGUgTW9kZSBpdCB3b24ndCBiZS5cbi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9wYXVsaXJpc2gvNTU1ODU1NyNnaXN0Y29tbWVudC0xNzU1MDk5XG5leHBvcnQgZnVuY3Rpb24gaXNTdG9yYWdlQXZhaWxhYmxlKHR5cGUpIHtcbiAgdHJ5IHtcbiAgICB2YXIgc3RvcmFnZSA9IHdpbmRvd1t0eXBlXSxcbiAgICAgIHggPSAnX19zdG9yYWdlX3Rlc3RfXyc7XG4gICAgc3RvcmFnZS5zZXRJdGVtKHgsIHgpO1xuICAgIHN0b3JhZ2UucmVtb3ZlSXRlbSh4KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgY3VycmVudCBicm93c2VyIGFuZCwgaWYgc3BlY2lmaWVkLCB0aGUgY3VycmVudCBicm93c2VyIHZlcnNpb24uXG4gKiBSZXR1cm5zIHRoZSB1c2VyIGFnZW50IHN0cmluZyBpZiB0aGUgYnJvd3NlciBpcyB1bmtub3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnJvd3Nlck5hbWUoaW5jbHVkZVZlcnNpb24gPSBmYWxzZSkge1xuICBpZiAoaXNDaHJvbWUoKSkge1xuICAgIHJldHVybiAnQ2hyb21lJyArIChpbmNsdWRlVmVyc2lvbiA/IGAgJHtjaHJvbWVWZXJzaW9uKCl9YCA6ICcnKTtcbiAgfVxuXG4gIGlmIChpc0lFKCkpIHtcbiAgICByZXR1cm4gJ0ludGVybmV0IEV4cGxvcmVyJyArIChpbmNsdWRlVmVyc2lvbiA/IGAgJHtJRVZlcnNpb24oKX1gIDogJycpO1xuICB9XG5cbiAgaWYgKGlzRmlyZWZveCgpKSB7XG4gICAgcmV0dXJuICdGaXJlZm94JyArIChpbmNsdWRlVmVyc2lvbiA/IGAgJHtmaXJlZm94VmVyc2lvbigpfWAgOiAnJyk7XG4gIH1cblxuICBpZiAoaXNTYWZhcmkoKSkge1xuICAgIHJldHVybiAnU2FmYXJpJyArIChpbmNsdWRlVmVyc2lvbiA/IGAgJHtzYWZhcmlWZXJzaW9uKCl9YCA6ICcnKTtcbiAgfVxuXG4gIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50O1xufVxuIiwiaW1wb3J0IHtcbiAgQW55QWN0aW9uLFxuICBQYXlsb2FkQWN0aW9uLFxuICBUaHVua0FjdGlvbixcbiAgVGh1bmtEaXNwYXRjaCxcbiAgY3JlYXRlQXN5bmNUaHVuayxcbiAgY3JlYXRlU2xpY2UsXG59IGZyb20gJ0ByZWR1eGpzL3Rvb2xraXQnO1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7c2V0VmVyaWZpZWR9IGZyb20gJ0BjZG8vYXBwcy9jb2RlLXN0dWRpby92ZXJpZmllZEluc3RydWN0b3JSZWR1eCc7XG5pbXBvcnQge1Rlc3RSZXN1bHRzfSBmcm9tICdAY2RvL2FwcHMvY29uc3RhbnRzJztcbmltcG9ydCBMYWIyUmVnaXN0cnkgZnJvbSAnQGNkby9hcHBzL2xhYjIvTGFiMlJlZ2lzdHJ5JztcbmltcG9ydCBub3RpZnlMZXZlbENoYW5nZSBmcm9tICdAY2RvL2FwcHMvbGFiMi91dGlscy9ub3RpZnlMZXZlbENoYW5nZSc7XG5pbXBvcnQge1xuICBwcm9jZXNzU2VydmVyU3R1ZGVudFByb2dyZXNzLFxuICBnZXRMZXZlbFJlc3VsdCxcbn0gZnJvbSAnQGNkby9hcHBzL3RlbXBsYXRlcy9wcm9ncmVzcy9wcm9ncmVzc0hlbHBlcnMnO1xuaW1wb3J0IHtcbiAgTGVzc29uLFxuICBMZXNzb25Hcm91cCxcbiAgVW5pdFByb2dyZXNzLFxuICBQZWVyUmV2aWV3TGVzc29uSW5mbyxcbiAgUGVlclJldmlld1N1bW1hcnksXG4gIFBVWlpMRV9QQUdFX05PTkUsXG4gIEluaXRQcm9ncmVzc1BheWxvYWQsXG4gIExldmVsUmVzdWx0cyxcbiAgVmlld1R5cGUsXG4gIFBlZXJSZXZpZXdMZXZlbEluZm8sXG59IGZyb20gJ0BjZG8vYXBwcy90eXBlcy9wcm9ncmVzc1R5cGVzJztcbmltcG9ydCB7Um9vdFN0YXRlfSBmcm9tICdAY2RvL2FwcHMvdHlwZXMvcmVkdXgnO1xuXG5pbXBvcnQge2dldEJ1YmJsZVVybH0gZnJvbSAnLi4vdGVtcGxhdGVzL3Byb2dyZXNzL0J1YmJsZUZhY3RvcnknO1xuaW1wb3J0IHtBcHBEaXNwYXRjaH0gZnJvbSAnLi4vdXRpbC9yZWR1eEhvb2tzJztcbmltcG9ydCB7bmF2aWdhdGVUb0hyZWZ9IGZyb20gJy4uL3V0aWxzJztcblxuaW1wb3J0IHttZXJnZUFjdGl2aXR5UmVzdWx0fSBmcm9tICcuL2FjdGl2aXR5VXRpbHMnO1xuaW1wb3J0IHtcbiAgY2FuQ2hhbmdlTGV2ZWxJblBhZ2UsXG4gIHVwZGF0ZUJyb3dzZXJGb3JMZXZlbE5hdmlnYXRpb24sXG59IGZyb20gJy4vYnJvd3Nlck5hdmlnYXRpb24nO1xuaW1wb3J0IHthdXRob3JpemVMb2NrYWJsZX0gZnJvbSAnLi9sZXNzb25Mb2NrUmVkdXgnO1xuaW1wb3J0IHtcbiAgZ2V0Q3VycmVudExldmVsLFxuICBnZXRDdXJyZW50U2NyaXB0TGV2ZWxJZCxcbiAgbGV2ZWxCeUlkLFxuICBuZXh0TGV2ZWxJZCxcbn0gZnJvbSAnLi9wcm9ncmVzc1JlZHV4U2VsZWN0b3JzJztcbmltcG9ydCB7U0VUX1ZJRVdfVFlQRX0gZnJvbSAnLi92aWV3QXNSZWR1eCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZ3Jlc3NTdGF0ZSB7XG4gIGN1cnJlbnRMZXZlbElkOiBzdHJpbmcgfCBudWxsO1xuICBjdXJyZW50TGVzc29uSWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgZGVlcGVyTGVhcm5pbmdDb3Vyc2U6IGJvb2xlYW4gfCBudWxsO1xuICBzYXZlQW5zd2Vyc0JlZm9yZU5hdmlnYXRpb246IGJvb2xlYW4gfCBudWxsO1xuICBsZXNzb25zOiBMZXNzb25bXSB8IG51bGw7XG4gIGxlc3Nvbkdyb3VwczogTGVzc29uR3JvdXBbXSB8IG51bGw7XG4gIHNjcmlwdElkOiBudW1iZXIgfCBudWxsO1xuICB2aWV3QXNVc2VySWQ6IG51bWJlciB8IG51bGw7XG4gIHNjcmlwdE5hbWU6IHN0cmluZyB8IG51bGw7XG4gIHNjcmlwdERpc3BsYXlOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHVuaXRUaXRsZTogc3RyaW5nIHwgbnVsbDtcbiAgY291cnNlSWQ6IG51bWJlciB8IG51bGw7XG4gIGlzTGVzc29uRXh0cmFzOiBib29sZWFuO1xuICB1bml0UHJvZ3Jlc3M6IHtcbiAgICBba2V5OiBudW1iZXJdOiBVbml0UHJvZ3Jlc3M7XG4gIH07XG4gIHVuaXRQcm9ncmVzc0hhc0xvYWRlZDogYm9vbGVhbjtcbiAgbGV2ZWxSZXN1bHRzOiBMZXZlbFJlc3VsdHM7XG4gIGZvY3VzQXJlYUxlc3NvbklkczogbnVtYmVyW107XG4gIHBlZXJSZXZpZXdMZXNzb25JbmZvOiBQZWVyUmV2aWV3TGVzc29uSW5mbyB8IG51bGw7XG4gIHBlZXJSZXZpZXdzUGVyZm9ybWVkOiBQZWVyUmV2aWV3U3VtbWFyeVtdO1xuICBwb3N0TWlsZXN0b25lRGlzYWJsZWQ6IGJvb2xlYW47XG4gIGlzQWdlMTNSZXF1aXJlZDogYm9vbGVhbjtcbiAgc3R1ZGVudERlZmF1bHRzU3VtbWFyeVZpZXc6IGJvb2xlYW47XG4gIGlzU3VtbWFyeVZpZXc6IGJvb2xlYW47XG4gIGlzTWluaVZpZXc6IGJvb2xlYW47XG4gIGhhc0Z1bGxQcm9ncmVzczogYm9vbGVhbjtcbiAgbGVzc29uRXh0cmFzRW5hYmxlZDogYm9vbGVhbjtcbiAgdXNpbmdEYlByb2dyZXNzOiBib29sZWFuO1xuICBjdXJyZW50UGFnZU51bWJlcjogbnVtYmVyO1xuICBjb3Vyc2VWZXJzaW9uSWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgdW5pdERlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHVuaXRTdHVkZW50RGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY2hhbmdlRm9jdXNBcmVhUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB1bml0Q29tcGxldGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1pbGVzdG9uZVJlcG9ydCBleHRlbmRzIE9wdGlvbmFsTWlsZXN0b25lRGF0YSB7XG4gIGFwcDogc3RyaW5nO1xuICByZXN1bHQ6IGJvb2xlYW47XG4gIHRlc3RSZXN1bHQ6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIE9wdGlvbmFsTWlsZXN0b25lRGF0YSB7XG4gIHByb2dyYW0/OiBzdHJpbmc7XG4gIC8vIFN1Ym1pdHRlZCBpcyBhIGJvb2xlYW4sIHdoaWNoIHRoZSBzZXJ2ZXIgZXhwZWN0cyBhcyBhIHN0cmluZy5cbiAgc3VibWl0dGVkPzogc3RyaW5nO1xufVxuXG5jb25zdCBpbml0aWFsU3RhdGU6IFByb2dyZXNzU3RhdGUgPSB7XG4gIGN1cnJlbnRMZXZlbElkOiBudWxsLFxuXG4gIC8vIFRoZXNlIGZpcnN0IGZpZWxkcyBuZXZlciBjaGFuZ2UgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uXG5cbiAgY3VycmVudExlc3NvbklkOiB1bmRlZmluZWQsXG4gIGRlZXBlckxlYXJuaW5nQ291cnNlOiBudWxsLFxuICAvLyB1c2VkIG9uIG11bHRpLXBhZ2UgYXNzZXNzbWVudHNcbiAgc2F2ZUFuc3dlcnNCZWZvcmVOYXZpZ2F0aW9uOiBudWxsLFxuICBsZXNzb25zOiBudWxsLFxuICBsZXNzb25Hcm91cHM6IG51bGwsXG4gIHNjcmlwdElkOiBudWxsLFxuICB2aWV3QXNVc2VySWQ6IG51bGwsXG4gIHNjcmlwdE5hbWU6IG51bGwsXG4gIHNjcmlwdERpc3BsYXlOYW1lOiB1bmRlZmluZWQsXG4gIHVuaXRUaXRsZTogbnVsbCxcbiAgY291cnNlSWQ6IG51bGwsXG4gIGlzTGVzc29uRXh0cmFzOiBmYWxzZSxcblxuICAvLyBUaGUgcmVtYWluaW5nIGZpZWxkcyBkbyBjaGFuZ2UgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uXG5cbiAgLy8gdW5pdFByb2dyZXNzIGlzIG9mIHR5cGUgdW5pdFByb2dyZXNzVHlwZSAoYSBtYXAgb2YgbGV2ZWxJZCAtPlxuICAvLyBzdHVkZW50TGV2ZWxQcm9ncmVzc1R5cGUpXG4gIHVuaXRQcm9ncmVzczoge30sXG4gIHVuaXRQcm9ncmVzc0hhc0xvYWRlZDogZmFsc2UsXG4gIC8vIG5vdGU6IGV2ZW50dWFsbHksIHdlIGV4cGVjdCB1c2FnZSBvZiB0aGlzIGZpZWxkIHRvIGJlIHJlcGxhY2VkIHdpdGggdW5pdFByb2dyZXNzXG4gIGxldmVsUmVzdWx0czoge30sXG4gIGZvY3VzQXJlYUxlc3NvbklkczogW10sXG4gIHBlZXJSZXZpZXdMZXNzb25JbmZvOiBudWxsLFxuICBwZWVyUmV2aWV3c1BlcmZvcm1lZDogW10sXG4gIHBvc3RNaWxlc3RvbmVEaXNhYmxlZDogZmFsc2UsXG4gIGlzQWdlMTNSZXF1aXJlZDogZmFsc2UsXG4gIC8vIERvIHN0dWRlbnRzIHNlZSBzdW1tYXJ5IHZpZXcgYnkgZGVmYXVsdD9cbiAgc3R1ZGVudERlZmF1bHRzU3VtbWFyeVZpZXc6IHRydWUsXG4gIGlzU3VtbWFyeVZpZXc6IHRydWUsXG4gIGlzTWluaVZpZXc6IGZhbHNlLFxuICBoYXNGdWxsUHJvZ3Jlc3M6IGZhbHNlLFxuICBsZXNzb25FeHRyYXNFbmFibGVkOiBmYWxzZSxcbiAgLy8gTm90ZTogdXNpbmdEYlByb2dyZXNzID09PSBcInVzZXIgaXMgbG9nZ2VkIGluXCIuIEhvd2V2ZXIsIGl0IGlzXG4gIC8vIHBvc3NpYmxlIHRoYXQgd2UgY2FuIGdldCB0aGUgdXNlciBwcm9ncmVzcyBiYWNrIGZyb20gdGhlIERCXG4gIC8vIHByaW9yIHRvIGhhdmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlciBsb2dpbiBzdGF0ZS5cbiAgLy8gVE9ETzogVXNlIHNpZ24gaW4gc3RhdGUgdG8gZGV0ZXJtaW5lIHdoZXJlIHRvIHNvdXJjZSB1c2VyIHByb2dyZXNzIGZyb21cbiAgdXNpbmdEYlByb2dyZXNzOiBmYWxzZSxcbiAgY3VycmVudFBhZ2VOdW1iZXI6IFBVWlpMRV9QQUdFX05PTkUsXG4gIGNvdXJzZVZlcnNpb25JZDogdW5kZWZpbmVkLFxuICB1bml0RGVzY3JpcHRpb246IHVuZGVmaW5lZCxcbiAgdW5pdFN0dWRlbnREZXNjcmlwdGlvbjogdW5kZWZpbmVkLFxuICBjaGFuZ2VGb2N1c0FyZWFQYXRoOiB1bmRlZmluZWQsXG4gIHVuaXRDb21wbGV0ZWQ6IHVuZGVmaW5lZCxcbn07XG5cbmNvbnN0IHByb2dyZXNzU2xpY2UgPSBjcmVhdGVTbGljZSh7XG4gIG5hbWU6ICdwcm9ncmVzcycsXG4gIGluaXRpYWxTdGF0ZSxcbiAgcmVkdWNlcnM6IHtcbiAgICBpbml0UHJvZ3Jlc3Moc3RhdGUsIGFjdGlvbjogUGF5bG9hZEFjdGlvbjxJbml0UHJvZ3Jlc3NQYXlsb2FkPikge1xuICAgICAgY29uc3QgbGVzc29ucyA9IGFjdGlvbi5wYXlsb2FkLmxlc3NvbnM7XG4gICAgICAvLyBSZS1pbml0aWFsaXppbmcgd2l0aCBmdWxsIHNldCBvZiBsZXNzb25zIHNob3VsZG4ndCBibG93IGF3YXkgY3VycmVudExlc3NvbklkXG4gICAgICBjb25zdCBjdXJyZW50TGVzc29uSWQgPVxuICAgICAgICBzdGF0ZS5jdXJyZW50TGVzc29uSWQgfHxcbiAgICAgICAgKGxlc3NvbnMubGVuZ3RoID09PSAxID8gbGVzc29uc1swXS5pZCA6IHVuZGVmaW5lZCk7XG4gICAgICBzdGF0ZS5jdXJyZW50TGV2ZWxJZCB8fD0gYWN0aW9uLnBheWxvYWQuY3VycmVudExldmVsSWQ7XG4gICAgICBzdGF0ZS5kZWVwZXJMZWFybmluZ0NvdXJzZSA9IGFjdGlvbi5wYXlsb2FkLmRlZXBlckxlYXJuaW5nQ291cnNlO1xuICAgICAgc3RhdGUuc2F2ZUFuc3dlcnNCZWZvcmVOYXZpZ2F0aW9uID1cbiAgICAgICAgYWN0aW9uLnBheWxvYWQuc2F2ZUFuc3dlcnNCZWZvcmVOYXZpZ2F0aW9uO1xuICAgICAgc3RhdGUubGVzc29ucyA9IHByb2Nlc3NlZExlc3NvbnMoXG4gICAgICAgIGxlc3NvbnMsXG4gICAgICAgIGFjdGlvbi5wYXlsb2FkLmRlZXBlckxlYXJuaW5nQ291cnNlXG4gICAgICApO1xuICAgICAgc3RhdGUubGVzc29uR3JvdXBzID0gYWN0aW9uLnBheWxvYWQubGVzc29uR3JvdXBzO1xuICAgICAgc3RhdGUucGVlclJldmlld0xlc3NvbkluZm8gPSBhY3Rpb24ucGF5bG9hZC5wZWVyUmV2aWV3TGVzc29uSW5mbztcbiAgICAgIHN0YXRlLnNjcmlwdElkID0gYWN0aW9uLnBheWxvYWQuc2NyaXB0SWQ7XG4gICAgICBzdGF0ZS5zY3JpcHROYW1lID0gYWN0aW9uLnBheWxvYWQuc2NyaXB0TmFtZTtcbiAgICAgIHN0YXRlLnNjcmlwdERpc3BsYXlOYW1lID0gYWN0aW9uLnBheWxvYWQuc2NyaXB0RGlzcGxheU5hbWU7XG4gICAgICBzdGF0ZS51bml0VGl0bGUgPSBhY3Rpb24ucGF5bG9hZC51bml0VGl0bGU7XG4gICAgICBzdGF0ZS51bml0RGVzY3JpcHRpb24gPSBhY3Rpb24ucGF5bG9hZC51bml0RGVzY3JpcHRpb247XG4gICAgICBzdGF0ZS51bml0U3R1ZGVudERlc2NyaXB0aW9uID0gYWN0aW9uLnBheWxvYWQudW5pdFN0dWRlbnREZXNjcmlwdGlvbjtcbiAgICAgIHN0YXRlLmNvdXJzZUlkID0gYWN0aW9uLnBheWxvYWQuY291cnNlSWQ7XG4gICAgICBzdGF0ZS5jb3Vyc2VWZXJzaW9uSWQgPSBhY3Rpb24ucGF5bG9hZC5jb3Vyc2VWZXJzaW9uSWQ7XG4gICAgICBzdGF0ZS5jdXJyZW50TGVzc29uSWQgPSBjdXJyZW50TGVzc29uSWQ7XG4gICAgICBzdGF0ZS5oYXNGdWxsUHJvZ3Jlc3MgPSBhY3Rpb24ucGF5bG9hZC5pc0Z1bGxQcm9ncmVzcztcbiAgICAgIHN0YXRlLmlzTGVzc29uRXh0cmFzID0gYWN0aW9uLnBheWxvYWQuaXNMZXNzb25FeHRyYXM7XG4gICAgICBzdGF0ZS5jdXJyZW50UGFnZU51bWJlciA9IGFjdGlvbi5wYXlsb2FkLmN1cnJlbnRQYWdlTnVtYmVyO1xuICAgIH0sXG4gICAgc2V0Q3VycmVudExldmVsSWQoc3RhdGUsIGFjdGlvbjogUGF5bG9hZEFjdGlvbjxzdHJpbmc+KSB7XG4gICAgICBzdGF0ZS5jdXJyZW50TGV2ZWxJZCA9IGFjdGlvbi5wYXlsb2FkO1xuICAgIH0sXG4gICAgc2V0U2NyaXB0UHJvZ3Jlc3MoXG4gICAgICBzdGF0ZSxcbiAgICAgIGFjdGlvbjogUGF5bG9hZEFjdGlvbjx7XG4gICAgICAgIFtsZXZlbElkOiBudW1iZXJdOiBVbml0UHJvZ3Jlc3M7XG4gICAgICB9PlxuICAgICkge1xuICAgICAgc3RhdGUudW5pdFByb2dyZXNzID0gcHJvY2Vzc1NlcnZlclN0dWRlbnRQcm9ncmVzcyhhY3Rpb24ucGF5bG9hZCk7XG4gICAgICBzdGF0ZS51bml0UHJvZ3Jlc3NIYXNMb2FkZWQgPSB0cnVlO1xuICAgIH0sXG4gICAgY2xlYXJSZXN1bHRzKHN0YXRlKSB7XG4gICAgICBzdGF0ZS5sZXZlbFJlc3VsdHMgPSBpbml0aWFsU3RhdGUubGV2ZWxSZXN1bHRzO1xuICAgIH0sXG4gICAgdXNlRGJQcm9ncmVzcyhzdGF0ZSkge1xuICAgICAgc3RhdGUudXNpbmdEYlByb2dyZXNzID0gdHJ1ZTtcbiAgICB9LFxuICAgIG1lcmdlUmVzdWx0cyhzdGF0ZSwgYWN0aW9uOiBQYXlsb2FkQWN0aW9uPExldmVsUmVzdWx0cz4pIHtcbiAgICAgIGNvbnN0IG5ld0xldmVsUmVzdWx0czogTGV2ZWxSZXN1bHRzID0ge307XG4gICAgICBjb25zdCBjb21iaW5lZExldmVscyA9IE9iamVjdC5rZXlzKHtcbiAgICAgICAgLi4uc3RhdGUubGV2ZWxSZXN1bHRzLFxuICAgICAgICAuLi5hY3Rpb24ucGF5bG9hZCxcbiAgICAgIH0pO1xuICAgICAgY29tYmluZWRMZXZlbHMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBjb25zdCBsZXZlbElkID0gcGFyc2VJbnQoa2V5KTtcbiAgICAgICAgbmV3TGV2ZWxSZXN1bHRzW2xldmVsSWRdID0gbWVyZ2VBY3Rpdml0eVJlc3VsdChcbiAgICAgICAgICBzdGF0ZS5sZXZlbFJlc3VsdHNbbGV2ZWxJZF0sXG4gICAgICAgICAgYWN0aW9uLnBheWxvYWRbbGV2ZWxJZF1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgc3RhdGUubGV2ZWxSZXN1bHRzID0gbmV3TGV2ZWxSZXN1bHRzO1xuICAgIH0sXG4gICAgb3ZlcndyaXRlUmVzdWx0cyhzdGF0ZSwgYWN0aW9uOiBQYXlsb2FkQWN0aW9uPExldmVsUmVzdWx0cz4pIHtcbiAgICAgIHN0YXRlLmxldmVsUmVzdWx0cyA9IGFjdGlvbi5wYXlsb2FkO1xuICAgIH0sXG4gICAgbWVyZ2VQZWVyUmV2aWV3UHJvZ3Jlc3MoXG4gICAgICBzdGF0ZSxcbiAgICAgIGFjdGlvbjogUGF5bG9hZEFjdGlvbjxQZWVyUmV2aWV3TGV2ZWxJbmZvW10+XG4gICAgKSB7XG4gICAgICBpZiAoc3RhdGUucGVlclJldmlld0xlc3NvbkluZm8pIHtcbiAgICAgICAgc3RhdGUucGVlclJldmlld0xlc3NvbkluZm8gPSB7XG4gICAgICAgICAgLi4uc3RhdGUucGVlclJldmlld0xlc3NvbkluZm8sXG4gICAgICAgICAgbGV2ZWxzOiBzdGF0ZS5wZWVyUmV2aWV3TGVzc29uSW5mby5sZXZlbHMubWFwKChsZXZlbCwgaW5kZXgpID0+ICh7XG4gICAgICAgICAgICAuLi5sZXZlbCxcbiAgICAgICAgICAgIC4uLmFjdGlvbi5wYXlsb2FkW2luZGV4XSxcbiAgICAgICAgICB9KSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSxcbiAgICB1cGRhdGVGb2N1c0FyZWE6IHtcbiAgICAgIHJlZHVjZXIoXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBhY3Rpb246IFBheWxvYWRBY3Rpb248e1xuICAgICAgICAgIGNoYW5nZUZvY3VzQXJlYVBhdGg6IHN0cmluZztcbiAgICAgICAgICBmb2N1c0FyZWFMZXNzb25JZHM6IG51bWJlcltdO1xuICAgICAgICB9PlxuICAgICAgKSB7XG4gICAgICAgIHN0YXRlLmNoYW5nZUZvY3VzQXJlYVBhdGggPSBhY3Rpb24ucGF5bG9hZC5jaGFuZ2VGb2N1c0FyZWFQYXRoO1xuICAgICAgICBzdGF0ZS5mb2N1c0FyZWFMZXNzb25JZHMgPSBhY3Rpb24ucGF5bG9hZC5mb2N1c0FyZWFMZXNzb25JZHM7XG4gICAgICB9LFxuICAgICAgcHJlcGFyZShjaGFuZ2VGb2N1c0FyZWFQYXRoOiBzdHJpbmcsIGZvY3VzQXJlYUxlc3NvbklkczogbnVtYmVyW10pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBjaGFuZ2VGb2N1c0FyZWFQYXRoLFxuICAgICAgICAgICAgZm9jdXNBcmVhTGVzc29uSWRzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0sXG4gICAgZGlzYWJsZVBvc3RNaWxlc3RvbmUoc3RhdGUpIHtcbiAgICAgIHN0YXRlLnBvc3RNaWxlc3RvbmVEaXNhYmxlZCA9IHRydWU7XG4gICAgfSxcbiAgICBzZXRJc0FnZTEzUmVxdWlyZWQoc3RhdGUsIGFjdGlvbjogUGF5bG9hZEFjdGlvbjxib29sZWFuPikge1xuICAgICAgc3RhdGUuaXNBZ2UxM1JlcXVpcmVkID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgfSxcbiAgICBzZXRJc1N1bW1hcnlWaWV3KHN0YXRlLCBhY3Rpb246IFBheWxvYWRBY3Rpb248Ym9vbGVhbj4pIHtcbiAgICAgIHN0YXRlLmlzU3VtbWFyeVZpZXcgPSBhY3Rpb24ucGF5bG9hZDtcbiAgICB9LFxuICAgIHNldElzTWluaVZpZXcoc3RhdGUsIGFjdGlvbjogUGF5bG9hZEFjdGlvbjxib29sZWFuPikge1xuICAgICAgc3RhdGUuaXNNaW5pVmlldyA9IGFjdGlvbi5wYXlsb2FkO1xuICAgIH0sXG4gICAgc2V0U3R1ZGVudERlZmF1bHRzU3VtbWFyeVZpZXcoc3RhdGUsIGFjdGlvbjogUGF5bG9hZEFjdGlvbjxib29sZWFuPikge1xuICAgICAgc3RhdGUuc3R1ZGVudERlZmF1bHRzU3VtbWFyeVZpZXcgPSBhY3Rpb24ucGF5bG9hZDtcbiAgICB9LFxuICAgIHNldEN1cnJlbnRMZXNzb25JZChzdGF0ZSwgYWN0aW9uOiBQYXlsb2FkQWN0aW9uPG51bWJlcj4pIHtcbiAgICAgIC8vIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGN1cnJlbnRMZXNzb25JZCwgdGhhdCBtZWFucyB3ZSdyZSBvbiBhIHB1enpsZSBwYWdlLFxuICAgICAgLy8gYW5kIHdlIHdhbnQgY3VycmVudExlc3NvbklkIHRvIHJlbWFpbiB0aGUgc2FtZSAocmF0aGVyIHRoYW4gcmVmbGVjdGluZ1xuICAgICAgLy8gdGhlIGxhc3QgbGVzc29uIHRoZSB1c2VyIGhhcyBtYWRlIHByb2dyZXNzIG9uKS5cbiAgICAgIGlmICghc3RhdGUuY3VycmVudExlc3NvbklkKSB7XG4gICAgICAgIHN0YXRlLmN1cnJlbnRMZXNzb25JZCA9IGFjdGlvbi5wYXlsb2FkO1xuICAgICAgfVxuICAgIH0sXG4gICAgc2V0U2NyaXB0Q29tcGxldGVkKHN0YXRlKSB7XG4gICAgICBzdGF0ZS51bml0Q29tcGxldGVkID0gdHJ1ZTtcbiAgICB9LFxuICAgIHNldExlc3NvbkV4dHJhc0VuYWJsZWQoc3RhdGUsIGFjdGlvbjogUGF5bG9hZEFjdGlvbjxib29sZWFuPikge1xuICAgICAgc3RhdGUubGVzc29uRXh0cmFzRW5hYmxlZCA9IGFjdGlvbi5wYXlsb2FkO1xuICAgIH0sXG4gICAgc2V0Vmlld0FzVXNlcklkKHN0YXRlLCBhY3Rpb246IFBheWxvYWRBY3Rpb248bnVtYmVyIHwgbnVsbD4pIHtcbiAgICAgIHN0YXRlLnZpZXdBc1VzZXJJZCA9IGFjdGlvbi5wYXlsb2FkO1xuICAgIH0sXG4gIH0sXG4gIGV4dHJhUmVkdWNlcnM6IHtcbiAgICAvLyBUT0RPOiBXaGVuIHdlIGNvbnZlcnQgdmlld0FzUmVkdXggdG8gcmVkdXgtdG9vbGtpdCwgd2Ugd2lsbCBuZWVkIHRvIHVzZVxuICAgIC8vIGNyZWF0ZUFjdGlvbiB0aGVyZSBpbnN0ZWFkIG9mIHJlZmVyZW5jaW5nIHRoZSBzdHJpbmcgaGVyZS5cbiAgICBbU0VUX1ZJRVdfVFlQRV06IChzdGF0ZSwgYWN0aW9uOiB7dmlld1R5cGU6IGtleW9mIHR5cGVvZiBWaWV3VHlwZX0pID0+IHtcbiAgICAgIHN0YXRlLmlzU3VtbWFyeVZpZXcgPVxuICAgICAgICBhY3Rpb24udmlld1R5cGUgPT09IFZpZXdUeXBlLlBhcnRpY2lwYW50ICYmXG4gICAgICAgIHN0YXRlLnN0dWRlbnREZWZhdWx0c1N1bW1hcnlWaWV3O1xuICAgIH0sXG4gIH0sXG59KTtcblxuLy8gVGh1bmtzXG50eXBlIFByb2dyZXNzVGh1bmtBY3Rpb24gPSBUaHVua0FjdGlvbjx2b2lkLCBSb290U3RhdGUsIHVuZGVmaW5lZCwgQW55QWN0aW9uPjtcbnR5cGUgQXN5bmNQcm9ncmVzc1RodW5rQWN0aW9uID0gVGh1bmtBY3Rpb248XG4gIFByb21pc2U8dm9pZD4sXG4gIFJvb3RTdGF0ZSxcbiAgdW5kZWZpbmVkLFxuICBBbnlBY3Rpb25cbj47XG5cbmV4cG9ydCBjb25zdCBxdWVyeVVzZXJQcm9ncmVzcyA9XG4gICh1c2VySWQ6IHN0cmluZywgbWVyZ2VQcm9ncmVzczogYm9vbGVhbiA9IHRydWUpOiBQcm9ncmVzc1RodW5rQWN0aW9uID0+XG4gIChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IGdldFN0YXRlKCkucHJvZ3Jlc3M7XG4gICAgcmV0dXJuIHVzZXJQcm9ncmVzc0Zyb21TZXJ2ZXIoc3RhdGUsIGRpc3BhdGNoLCB1c2VySWQsIG1lcmdlUHJvZ3Jlc3MpO1xuICB9O1xuXG4vLyBUaGUgdXNlciBoYXMgbmF2aWdhdGVkIHRvIGEgbmV3IGxldmVsIGluIHRoZSBjdXJyZW50IGxlc3Nvbixcbi8vIHNvIHdlIHNob3VsZCB1cGRhdGUgdGhlIGJyb3dzZXIgYW5kIGFsc28gc2V0IHRoaXMgYXMgdGhlIG5ld1xuLy8gY3VycmVudCBsZXZlbC5cbmV4cG9ydCBmdW5jdGlvbiBuYXZpZ2F0ZVRvTGV2ZWxJZChsZXZlbElkOiBzdHJpbmcpOiBQcm9ncmVzc1RodW5rQWN0aW9uIHtcbiAgcmV0dXJuIGFzeW5jIChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IGdldFN0YXRlKCkucHJvZ3Jlc3M7XG4gICAgaWYgKCFzdGF0ZS5jdXJyZW50TGVzc29uSWQgfHwgIXN0YXRlLmN1cnJlbnRMZXZlbElkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5ld0xldmVsID0gbGV2ZWxCeUlkKHN0YXRlLCBzdGF0ZS5jdXJyZW50TGVzc29uSWQsIGxldmVsSWQpO1xuICAgIGlmICghbmV3TGV2ZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50TGV2ZWwgPSBnZXRDdXJyZW50TGV2ZWwoZ2V0U3RhdGUoKSk7XG5cbiAgICBpZiAoY2FuQ2hhbmdlTGV2ZWxJblBhZ2UoY3VycmVudExldmVsLCBuZXdMZXZlbCkpIHtcbiAgICAgIC8vIElmIHRoZSByZXF1ZXN0ZWQgbGV2ZWwgaXMgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgbGV2ZWwsIGRvbid0IGRvIGFueXRoaW5nLlxuICAgICAgaWYgKHN0YXRlLmN1cnJlbnRMZXZlbElkID09PSBsZXZlbElkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZUJyb3dzZXJGb3JMZXZlbE5hdmlnYXRpb24oc3RhdGUsIG5ld0xldmVsLnBhdGgsIGxldmVsSWQpO1xuICAgICAgLy8gTm90aWZ5IHRoZSBMYWIyIHN5c3RlbSB0aGF0IHRoZSBsZXZlbCBpcyBjaGFuZ2luZy5cbiAgICAgIG5vdGlmeUxldmVsQ2hhbmdlKGN1cnJlbnRMZXZlbC5pZCwgbGV2ZWxJZCk7XG4gICAgICBkaXNwYXRjaChzZXRDdXJyZW50TGV2ZWxJZChsZXZlbElkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjdXJyZW50TGV2ZWw/LnVzZXNMYWIyKSB7XG4gICAgICAgIC8vIElmIHdlIGFyZSBzd2l0Y2hpbmcgZnJvbSBhIGxhYjIgbGV2ZWwgYnV0IGNhbid0IGNoYW5nZSB0aGUgbGV2ZWwgd2l0aG91dCByZWxvYWRpbmcsXG4gICAgICAgIC8vIHdlIGNsZWFuIHVwIHRoZSBwcm9qZWN0IG1hbmFnZXIgKGlmIGl0IGV4aXN0cykgdG8gYXZvaWQgYSBjb25mdXNpbmcgcG9wLXVwIHRvIHVzZXJzXG4gICAgICAgIC8vIGlmIHRoZWlyIG1vc3QgcmVjZW50IGNvZGUgaGFzIG5vdCBzYXZlZC5cbiAgICAgICAgYXdhaXQgTGFiMlJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0UHJvamVjdE1hbmFnZXIoKT8uY2xlYW5VcCgpO1xuICAgICAgfVxuICAgICAgY29uc3QgdXJsID0gZ2V0QnViYmxlVXJsKG5ld0xldmVsLnBhdGgsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICAgIG5hdmlnYXRlVG9IcmVmKHVybCk7XG4gICAgfVxuICB9O1xufVxuXG4vLyBOYXZpZ2F0ZSB0byB0aGUgbmV4dCBsZXZlbCBpbiB0aGUgcHJvZ3Jlc3Npb24sIGlmIGl0IGV4aXN0cy5cbmV4cG9ydCBmdW5jdGlvbiBuYXZpZ2F0ZVRvTmV4dExldmVsKCk6IFByb2dyZXNzVGh1bmtBY3Rpb24ge1xuICByZXR1cm4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IGxldmVsSWQgPSBuZXh0TGV2ZWxJZChnZXRTdGF0ZSgpKTtcbiAgICBpZiAobGV2ZWxJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRpc3BhdGNoKG5hdmlnYXRlVG9MZXZlbElkKGxldmVsSWQpKTtcbiAgfTtcbn1cblxuLy8gVGhlIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgdGhlIGxldmVsIGFuZCB0aGUgcGFnZVxuLy8gd2lsbCBub3QgYmUgcmVsb2FkaW5nLiBDdXJyZW50bHkgb25seSB1c2VkIGJ5IExhYjIgbGFicy5cbmV4cG9ydCBmdW5jdGlvbiBzZW5kU3VjY2Vzc1JlcG9ydChhcHBUeXBlOiBzdHJpbmcpOiBBc3luY1Byb2dyZXNzVGh1bmtBY3Rpb24ge1xuICByZXR1cm4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgIHJldHVybiBzZW5kUmVwb3J0SGVscGVyKGFwcFR5cGUsIFRlc3RSZXN1bHRzLkFMTF9QQVNTLCBkaXNwYXRjaCwgZ2V0U3RhdGUpO1xuICB9O1xufVxuXG4vLyBTZW5kIGEgcmVwb3J0IG9mIHVzZXIgcHJvZ3Jlc3MgKGUuZy4sIFRlc3RSZXN1bHRzLkxFVkVMX0FUVEVNUFRFRCkgb24gYW4gYXBwVHlwZSBsZXZlbC5cbi8vIEN1cnJlbnRseSBvbmx5IHVzZWQgYnkgTGFiMiBsYWJzLlxuZXhwb3J0IGZ1bmN0aW9uIHNlbmRQcm9ncmVzc1JlcG9ydChcbiAgYXBwVHlwZTogc3RyaW5nLFxuICByZXN1bHQ6IFRlc3RSZXN1bHRzXG4pOiBBc3luY1Byb2dyZXNzVGh1bmtBY3Rpb24ge1xuICByZXR1cm4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgIHJldHVybiBzZW5kUmVwb3J0SGVscGVyKGFwcFR5cGUsIHJlc3VsdCwgZGlzcGF0Y2gsIGdldFN0YXRlKTtcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IHNlbmRQcmVkaWN0TGV2ZWxSZXBvcnQgPSBjcmVhdGVBc3luY1RodW5rPFxuICB2b2lkLFxuICB7YXBwVHlwZTogc3RyaW5nOyBwcmVkaWN0UmVzcG9uc2U6IHN0cmluZ30sXG4gIHtcbiAgICBkaXNwYXRjaDogQXBwRGlzcGF0Y2g7XG4gICAgc3RhdGU6IFJvb3RTdGF0ZTtcbiAgfVxuPigncHJvZ3Jlc3Mvc2VuZFByZWRpY3RMZXZlbFJlcG9ydCcsIGFzeW5jIChwYXlsb2FkLCB0aHVua0FQSSkgPT4ge1xuICBjb25zdCBleHRyYVBheWxvYWQgPSB7XG4gICAgcHJvZ3JhbTogcGF5bG9hZC5wcmVkaWN0UmVzcG9uc2UsXG4gIH07XG4gIHNlbmRSZXBvcnRIZWxwZXIoXG4gICAgcGF5bG9hZC5hcHBUeXBlLFxuICAgIFRlc3RSZXN1bHRzLkNPTlRBSU5FRF9MRVZFTF9SRVNVTFQsXG4gICAgdGh1bmtBUEkuZGlzcGF0Y2gsXG4gICAgdGh1bmtBUEkuZ2V0U3RhdGUsXG4gICAgZXh0cmFQYXlsb2FkXG4gICk7XG59KTtcblxuZXhwb3J0IGNvbnN0IHNlbmRTdWJtaXRSZXBvcnQgPSBjcmVhdGVBc3luY1RodW5rPFxuICB2b2lkLFxuICB7YXBwVHlwZTogc3RyaW5nOyBzdWJtaXR0ZWQ6IGJvb2xlYW59LFxuICB7XG4gICAgZGlzcGF0Y2g6IEFwcERpc3BhdGNoO1xuICAgIHN0YXRlOiBSb290U3RhdGU7XG4gIH1cbj4oJ3Byb2dyZXNzL3NlbmRTdWJtaXRSZXBvcnQnLCBhc3luYyAocGF5bG9hZCwgdGh1bmtBUEkpID0+IHtcbiAgY29uc3QgZXh0cmFQYXlsb2FkID0ge1xuICAgIHN1Ym1pdHRlZDogcGF5bG9hZC5zdWJtaXR0ZWQudG9TdHJpbmcoKSxcbiAgfTtcbiAgY29uc3QgcmVzdWx0ID0gcGF5bG9hZC5zdWJtaXR0ZWRcbiAgICA/IFRlc3RSZXN1bHRzLlNVQk1JVFRFRF9SRVNVTFRcbiAgICA6IFRlc3RSZXN1bHRzLlVOU1VCTUlUVEVEX0FUVEVNUFQ7XG4gIGF3YWl0IHNlbmRSZXBvcnRIZWxwZXIoXG4gICAgcGF5bG9hZC5hcHBUeXBlLFxuICAgIHJlc3VsdCxcbiAgICB0aHVua0FQSS5kaXNwYXRjaCxcbiAgICB0aHVua0FQSS5nZXRTdGF0ZSxcbiAgICBleHRyYVBheWxvYWRcbiAgKTtcbiAgLy8gU3VibWl0IHN0YXR1cyBpc24ndCBwcm9wZXJseSB1cGRhdGVkIGJ5IGp1c3Qgc2F2aW5nIHRoZSBzdGF0dXMgY29kZSwgc28gcmUtcXVlcnlcbiAgLy8gdXNlciBwcm9ncmVzcyB0byBmb3JjZSB0aGUgYnViYmxlIHRvIHVwZGF0ZS5cbiAgdGh1bmtBUEkuZGlzcGF0Y2goXG4gICAgcXVlcnlVc2VyUHJvZ3Jlc3ModGh1bmtBUEkuZ2V0U3RhdGUoKS5jdXJyZW50VXNlci51c2VySWQudG9TdHJpbmcoKSlcbiAgKTtcbn0pO1xuXG4vLyBIZWxwZXJzXG5cbmZ1bmN0aW9uIHNlbmRSZXBvcnRIZWxwZXIoXG4gIGFwcFR5cGU6IHN0cmluZyxcbiAgcmVzdWx0OiBudW1iZXIsXG4gIGRpc3BhdGNoOiBUaHVua0Rpc3BhdGNoPFJvb3RTdGF0ZSwgdW5kZWZpbmVkLCBBbnlBY3Rpb24+LFxuICBnZXRTdGF0ZTogKCkgPT4gUm9vdFN0YXRlLFxuICBleHRyYURhdGE/OiBPcHRpb25hbE1pbGVzdG9uZURhdGFcbikge1xuICBjb25zdCBzdGF0ZSA9IGdldFN0YXRlKCkucHJvZ3Jlc3M7XG4gIGNvbnN0IGxldmVsSWQgPSBzdGF0ZS5jdXJyZW50TGV2ZWxJZDtcbiAgaWYgKCFzdGF0ZS5jdXJyZW50TGVzc29uSWQgfHwgIWxldmVsSWQpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbiAgY29uc3Qgc2NyaXB0TGV2ZWxJZCA9IGdldEN1cnJlbnRTY3JpcHRMZXZlbElkKGdldFN0YXRlKCkpO1xuICBpZiAoIXNjcmlwdExldmVsSWQpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICAvLyBUaGUgc2VydmVyIGRvZXMgbm90IGFwcGVhciB0byB1c2UgdGhlIHVzZXIgSUQgcGFyYW1ldGVyLFxuICAvLyBzbyBqdXN0IHBhc3MgMCwgbGlrZSBzb21lIG90aGVyIG1pbGVzdG9uZSBwb3N0cyBkby5cbiAgY29uc3QgdXNlcklkID0gMDtcbiAgZXh0cmFEYXRhID0gZXh0cmFEYXRhIHx8IHt9O1xuXG4gIGNvbnN0IGRhdGE6IE1pbGVzdG9uZVJlcG9ydCA9IHtcbiAgICBhcHA6IGFwcFR5cGUsXG4gICAgcmVzdWx0OiB0cnVlLFxuICAgIHRlc3RSZXN1bHQ6IHJlc3VsdCxcbiAgICAuLi5leHRyYURhdGEsXG4gIH07XG5cbiAgcmV0dXJuIGZldGNoKGAvbWlsZXN0b25lLyR7dXNlcklkfS8ke3NjcmlwdExldmVsSWR9LyR7bGV2ZWxJZH1gLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczoge1xuICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICB9KS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICBpZiAocmVzcG9uc2Uub2sgJiYgbGV2ZWxJZCAhPT0gbnVsbCkge1xuICAgICAgLy8gVXBkYXRlIHRoZSBwcm9ncmVzcyBzdG9yZSBieSBtZXJnaW5nIGluIHRoaXNcbiAgICAgIC8vIHBhcnRpY3VsYXIgcmVzdWx0IGltbWVkaWF0ZWx5LlxuICAgICAgZGlzcGF0Y2gobWVyZ2VSZXN1bHRzKHtbbGV2ZWxJZF06IHJlc3VsdH0pKTtcbiAgICAgIC8vIElmIHRoZSBsZXZlbCBpcyB0aGUgc3VibGV2ZWwgb2YgYSBidWJibGUgbGV2ZWwsXG4gICAgICAvLyBhbHNvIHVwZGF0ZSB0aGUgc3RhdHVzIG9mIHRoZSBwYXJlbnQgbGV2ZWwuXG4gICAgICBjb25zdCBjdXJyZW50TGV2ZWwgPSBnZXRDdXJyZW50TGV2ZWwoZ2V0U3RhdGUoKSk7XG4gICAgICBpZiAoY3VycmVudExldmVsLnBhcmVudExldmVsSWQpIHtcbiAgICAgICAgZGlzcGF0Y2gobWVyZ2VSZXN1bHRzKHtbY3VycmVudExldmVsLnBhcmVudExldmVsSWRdOiByZXN1bHR9KSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBSZXF1ZXN0cyB1c2VyIHByb2dyZXNzIGZyb20gdGhlIHNlcnZlciBhbmQgZGlzcGF0Y2hlcyBvdGhlciByZWR1eCBhY3Rpb25zXG4gKiBiYXNlZCBvbiB0aGUgc2VydmVyJ3MgcmVzcG9uc2UgZGF0YS5cbiAqL1xuY29uc3QgdXNlclByb2dyZXNzRnJvbVNlcnZlciA9IChcbiAgc3RhdGU6IFByb2dyZXNzU3RhdGUsXG4gIGRpc3BhdGNoOiBUaHVua0Rpc3BhdGNoPHtwcm9ncmVzczogUHJvZ3Jlc3NTdGF0ZX0sIHVuZGVmaW5lZCwgQW55QWN0aW9uPixcbiAgdXNlcklkOiBzdHJpbmcgfCBudWxsID0gbnVsbCxcbiAgbWVyZ2VQcm9ncmVzczogYm9vbGVhblxuKSA9PiB7XG4gIGlmICghc3RhdGUuc2NyaXB0TmFtZSkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBgQ291bGQgbm90IHJlcXVlc3QgcHJvZ3Jlc3MgZm9yIHVzZXIgSUQgJHt1c2VySWR9IGZyb20gc2VydmVyOiBzY3JpcHROYW1lIG11c3QgYmUgcHJlc2VudCBpbiBwcm9ncmVzcyByZWR1eC5gO1xuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfVxuXG4gIC8vIElmIHdlIGhhdmUgYSB1c2VySWQsIHdlIGNhbiBjbGVhciBhbnkgcHJvZ3Jlc3MgaW4gcmVkdXggYW5kIHJlcXVlc3QgYWxsIHByb2dyZXNzXG4gIC8vIGZyb20gdGhlIHNlcnZlci5cbiAgaWYgKHVzZXJJZCkge1xuICAgIGRpc3BhdGNoKGNsZWFyUmVzdWx0cygpKTtcbiAgfVxuXG4gIHJldHVybiAkLmFqYXgoe1xuICAgIHVybDogYC9hcGkvdXNlcl9wcm9ncmVzcy8ke3N0YXRlLnNjcmlwdE5hbWV9YCxcbiAgICBtZXRob2Q6ICdHRVQnLFxuICAgIGRhdGE6IHt1c2VyX2lkOiB1c2VySWR9LFxuICB9KS5kb25lKGRhdGEgPT4ge1xuICAgIGlmICghZGF0YSB8fCBfLmlzRW1wdHkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5pc1ZlcmlmaWVkSW5zdHJ1Y3Rvcikge1xuICAgICAgZGlzcGF0Y2goc2V0VmVyaWZpZWQoKSk7XG4gICAgfVxuXG4gICAgLy8gV2UgYXJlIG9uIGFuIG92ZXJ2aWV3IHBhZ2UgaWYgY3VycmVudExldmVsSWQgaXMgdW5kZWZpbmVkLlxuICAgIGNvbnN0IG9uT3ZlcnZpZXdQYWdlID0gIXN0YXRlLmN1cnJlbnRMZXZlbElkO1xuICAgIC8vIFNob3cgbGVzc29uIHBsYW4gbGlua3MgYW5kIG90aGVyIHRlYWNoZXIgaW5mbyBpZiBpbnN0cnVjdG9yIGFuZCBvbiB1bml0IG92ZXJ2aWV3IHBhZ2UuXG4gICAgaWYgKFxuICAgICAgKGRhdGEuaXNJbnN0cnVjdG9yIHx8IGRhdGEudGVhY2hlclZpZXdpbmdTdHVkZW50KSAmJlxuICAgICAgIWRhdGEuZGVlcGVyTGVhcm5pbmdDb3Vyc2UgJiZcbiAgICAgIG9uT3ZlcnZpZXdQYWdlXG4gICAgKSB7XG4gICAgICAvLyBEZWZhdWx0IHRvIHN1bW1hcnkgdmlldyBpZiB0ZWFjaGVyIGlzIHZpZXdpbmcgdGhlaXIgc3R1ZGVudCwgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gZGV0YWlsIHZpZXcuXG4gICAgICBkaXNwYXRjaChzZXRJc1N1bW1hcnlWaWV3KGRhdGEudGVhY2hlclZpZXdpbmdTdHVkZW50KSk7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEuZm9jdXNBcmVhTGVzc29uSWRzKSB7XG4gICAgICBkaXNwYXRjaChcbiAgICAgICAgdXBkYXRlRm9jdXNBcmVhKGRhdGEuY2hhbmdlRm9jdXNBcmVhUGF0aCwgZGF0YS5mb2N1c0FyZWFMZXNzb25JZHMpXG4gICAgICApO1xuICAgIH1cblxuICAgIGRpc3BhdGNoKGF1dGhvcml6ZUxvY2thYmxlKGRhdGEubG9ja2FibGVBdXRob3JpemVkKSk7XG5cbiAgICBpZiAoZGF0YS5jb21wbGV0ZWQpIHtcbiAgICAgIGRpc3BhdGNoKHNldFNjcmlwdENvbXBsZXRlZCgpKTtcbiAgICB9XG5cbiAgICAvLyBNZXJnZSBwcm9ncmVzcyBmcm9tIHNlcnZlclxuICAgIGlmIChkYXRhLnByb2dyZXNzKSB7XG4gICAgICBkaXNwYXRjaChzZXRTY3JpcHRQcm9ncmVzcyhkYXRhLnByb2dyZXNzKSk7XG5cbiAgICAgIGlmIChtZXJnZVByb2dyZXNzKSB7XG4gICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBzZXQgdGhlIGZ1bGwgcHJvZ3Jlc3Mgb2JqZWN0IGFib3ZlIGluIHJlZHV4IGJ1dCBhbHNvIHNldFxuICAgICAgICAvLyBhIG1hcCBjb250YWluaW5nIGp1c3QgbGV2ZWwgcmVzdWx0cy4gVGhpcyBpcyB0aGUgbGVnYWN5IGNvZGUgcGF0aCBhbmRcbiAgICAgICAgLy8gdGhlIGdvYWwgaXMgdG8gZXZlbnR1YWxseSB1cGRhdGUgYWxsIGNvZGUgcGF0aHMgdG8gdXNlIHVuaXRQcm9ncmVzc1xuICAgICAgICAvLyBpbnN0ZWFkIG9mIGxldmVsUmVzdWx0cy5cbiAgICAgICAgY29uc3QgbGV2ZWxSZXN1bHRzID0gXy5tYXBWYWx1ZXMoZGF0YS5wcm9ncmVzcywgZ2V0TGV2ZWxSZXN1bHQpO1xuICAgICAgICBkaXNwYXRjaChtZXJnZVJlc3VsdHMobGV2ZWxSZXN1bHRzKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhLnBlZXJSZXZpZXdzUGVyZm9ybWVkKSB7XG4gICAgICAgIGRpc3BhdGNoKG1lcmdlUGVlclJldmlld1Byb2dyZXNzKGRhdGEucGVlclJldmlld3NQZXJmb3JtZWQpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEuY3VycmVudF9sZXNzb24pIHtcbiAgICAgICAgZGlzcGF0Y2goc2V0Q3VycmVudExlc3NvbklkKGRhdGEuY3VycmVudF9sZXNzb24pKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBEb2VzIHNvbWUgcHJvY2Vzc2luZyBvZiBvdXIgcGFzc2VkIGluIGxlc3NvbiwgbmFtZWx5XG4gKiAtIFJlbW92ZXMgJ2hpZGRlbicgZmllbGRcbiAqIC0gQWRkcyAnbGVzc29uTnVtYmVyJyBmaWVsZCBmb3Igbm9uLVBMQyBsZXNzb25zIHdoaWNoXG4gKiBhcmUgbm90IGxvY2thYmxlIG9yIGhhdmUgYSBsZXNzb24gcGxhblxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc2VkTGVzc29ucyhsZXNzb25zOiBMZXNzb25bXSwgaXNQbGM6IGJvb2xlYW4pIHtcbiAgbGV0IG51bUxlc3NvbnNXaXRoTGVzc29uUGxhbiA9IDA7XG5cbiAgcmV0dXJuIGxlc3NvbnMubWFwKGxlc3NvbiA9PiB7XG4gICAgbGV0IGxlc3Nvbk51bWJlcjtcbiAgICBpZiAoIWlzUGxjICYmIGxlc3Nvbi5udW1iZXJlZExlc3Nvbikge1xuICAgICAgbnVtTGVzc29uc1dpdGhMZXNzb25QbGFuKys7XG4gICAgICBsZXNzb25OdW1iZXIgPSBudW1MZXNzb25zV2l0aExlc3NvblBsYW47XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAuLi5fLm9taXQobGVzc29uLCAnaGlkZGVuJyksXG4gICAgICBsZXNzb25OdW1iZXIsXG4gICAgfTtcbiAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCB7XG4gIGluaXRQcm9ncmVzcyxcbiAgc2V0Q3VycmVudExldmVsSWQsXG4gIHNldFNjcmlwdFByb2dyZXNzLFxuICBjbGVhclJlc3VsdHMsXG4gIHVzZURiUHJvZ3Jlc3MsXG4gIG1lcmdlUmVzdWx0cyxcbiAgb3ZlcndyaXRlUmVzdWx0cyxcbiAgbWVyZ2VQZWVyUmV2aWV3UHJvZ3Jlc3MsXG4gIHVwZGF0ZUZvY3VzQXJlYSxcbiAgZGlzYWJsZVBvc3RNaWxlc3RvbmUsXG4gIHNldElzQWdlMTNSZXF1aXJlZCxcbiAgc2V0SXNTdW1tYXJ5VmlldyxcbiAgc2V0SXNNaW5pVmlldyxcbiAgc2V0U3R1ZGVudERlZmF1bHRzU3VtbWFyeVZpZXcsXG4gIHNldEN1cnJlbnRMZXNzb25JZCxcbiAgc2V0U2NyaXB0Q29tcGxldGVkLFxuICBzZXRMZXNzb25FeHRyYXNFbmFibGVkLFxuICBzZXRWaWV3QXNVc2VySWQsXG59ID0gcHJvZ3Jlc3NTbGljZS5hY3Rpb25zO1xuXG5leHBvcnQgZGVmYXVsdCBwcm9ncmVzc1NsaWNlLnJlZHVjZXI7XG5cbi8vIGV4cG9ydCBwcml2YXRlIGZ1bmN0aW9uKHMpIHRvIGV4cG9zZSB0byB1bml0IHRlc3RpbmdcbmV4cG9ydCBjb25zdCBfX3Rlc3Rvbmx5X18gPSBJTl9VTklUX1RFU1RcbiAgPyB7XG4gICAgICB1c2VyUHJvZ3Jlc3NGcm9tU2VydmVyLFxuICAgIH1cbiAgOiB7fTtcbiIsImltcG9ydCBNZXRyaWNzUmVwb3J0ZXIgZnJvbSAnQGNkby9hcHBzL21ldHJpY3MvTWV0cmljc1JlcG9ydGVyJztcbmltcG9ydCB7TWV0cmljRGltZW5zaW9uLCBNZXRyaWNVbml0fSBmcm9tICdAY2RvL2FwcHMvbWV0cmljcy90eXBlcyc7XG5cbi8qKlxuICogUHJvcGVydGllcyB0aGF0IHRoaXMgbWV0cmljIHJlcG9ydGVyIHdpbGwgYWRkIHRvIGxvZyBwYXlsb2Fkcy5cbiAqL1xuaW50ZXJmYWNlIFJlcG9ydGluZ1Byb3BlcnRpZXMge1xuICBjaGFubmVsSWQ/OiBzdHJpbmc7XG4gIGFwcE5hbWU/OiBzdHJpbmc7XG4gIGN1cnJlbnRMZXZlbElkPzogc3RyaW5nIHwgbnVtYmVyO1xuICBzY3JpcHRJZD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBNZXRyaWNzIHJlcG9ydGVyIGZvciBsYWJzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMYWJNZXRyaWNzUmVwb3J0ZXIge1xuICAvLyBDb21tb24gZmllbGRzIHRoYXQgYXJlIGFkZGVkIHRvIGV2ZXJ5IGxvZyBwYXlsb2FkLlxuICBwcml2YXRlIGNvbW1vblByb3BlcnRpZXM6IFJlcG9ydGluZ1Byb3BlcnRpZXMgPSB7fTtcblxuICBjb25zdHJ1Y3Rvcihpbml0aWFsUHJvcGVydGllcz86IFJlcG9ydGluZ1Byb3BlcnRpZXMpIHtcbiAgICB0aGlzLmNvbW1vblByb3BlcnRpZXMgPSBpbml0aWFsUHJvcGVydGllcyB8fCB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY29tbW9uIHByb3BlcnRpZXMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIGxvZyBwYXlsb2Fkcy5cbiAgICogUHJvdmlkZWQgcHJvcGVydGllcyB3aWxsIGJlIG1lcmdlZCB3aXRoIGV4aXN0aW5nIHByb3BlcnRpZXMsXG4gICAqIHNvIHNpbmdsZSBwcm9wZXJ0aWVzIGNhbiBiZSB1cGRhdGVkIHdpdGhvdXQgb3ZlcndyaXRpbmcgb3RoZXJzLlxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVByb3BlcnRpZXMocHJvcGVydGllczogUmVwb3J0aW5nUHJvcGVydGllcykge1xuICAgIHRoaXMuY29tbW9uUHJvcGVydGllcyA9IHsuLi50aGlzLmNvbW1vblByb3BlcnRpZXMsIC4uLnByb3BlcnRpZXN9O1xuICB9XG5cbiAgcHVibGljIGxvZ0luZm8obWVzc2FnZTogc3RyaW5nIHwgb2JqZWN0KSB7XG4gICAgTWV0cmljc1JlcG9ydGVyLmxvZ0luZm8odGhpcy5kZWNvcmF0ZU1lc3NhZ2UobWVzc2FnZSkpO1xuICB9XG5cbiAgcHVibGljIGxvZ1dhcm5pbmcobWVzc2FnZTogc3RyaW5nIHwgb2JqZWN0KSB7XG4gICAgTWV0cmljc1JlcG9ydGVyLmxvZ1dhcm5pbmcodGhpcy5kZWNvcmF0ZU1lc3NhZ2UobWVzc2FnZSkpO1xuICB9XG5cbiAgcHVibGljIGxvZ0Vycm9yKGVycm9yTWVzc2FnZTogc3RyaW5nLCBlcnJvcj86IEVycm9yLCBkZXRhaWxzPzogb2JqZWN0KSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgIGVycm9yTWVzc2FnZSxcbiAgICAgIGVycm9yOiBlcnJvcj8uc3RhY2sgfHwgZXJyb3I/Lm1lc3NhZ2UsXG4gICAgICBkZXRhaWxzLFxuICAgIH07XG4gICAgTWV0cmljc1JlcG9ydGVyLmxvZ0Vycm9yKHRoaXMuZGVjb3JhdGVNZXNzYWdlKG1lc3NhZ2UpKTtcbiAgfVxuXG4gIHB1YmxpYyByZXBvcnRMb2FkVGltZShcbiAgICBtZXRyaWNOYW1lOiBzdHJpbmcsXG4gICAgbG9hZFRpbWVNczogbnVtYmVyLFxuICAgIGRpbWVuc2lvbnM6IE1ldHJpY0RpbWVuc2lvbltdID0gW11cbiAgKSB7XG4gICAgTWV0cmljc1JlcG9ydGVyLnB1Ymxpc2hNZXRyaWMobWV0cmljTmFtZSwgbG9hZFRpbWVNcywgJ01pbGxpc2Vjb25kcycsIFtcbiAgICAgIC4uLmRpbWVuc2lvbnMsXG4gICAgICAuLi50aGlzLmdldENvbW1vbkRpbWVuc2lvbnMoKSxcbiAgICBdKTtcbiAgfVxuXG4gIHB1YmxpYyBwdWJsaXNoTWV0cmljKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIHVuaXQ6IE1ldHJpY1VuaXQsXG4gICAgZGltZW5zaW9uczogTWV0cmljRGltZW5zaW9uW10gPSBbXVxuICApIHtcbiAgICBNZXRyaWNzUmVwb3J0ZXIucHVibGlzaE1ldHJpYyhuYW1lLCB2YWx1ZSwgdW5pdCwgW1xuICAgICAgLi4uZGltZW5zaW9ucyxcbiAgICAgIC4uLnRoaXMuZ2V0Q29tbW9uRGltZW5zaW9ucygpLFxuICAgIF0pO1xuICB9XG5cbiAgcHVibGljIGluY3JlbWVudENvdW50ZXIoXG4gICAgbWV0cmljTmFtZTogc3RyaW5nLFxuICAgIGRpbWVuc2lvbnM6IE1ldHJpY0RpbWVuc2lvbltdID0gW11cbiAgKSB7XG4gICAgTWV0cmljc1JlcG9ydGVyLmluY3JlbWVudENvdW50ZXIobWV0cmljTmFtZSwgW1xuICAgICAgLi4uZGltZW5zaW9ucyxcbiAgICAgIC4uLnRoaXMuZ2V0Q29tbW9uRGltZW5zaW9ucygpLFxuICAgIF0pO1xuICB9XG5cbiAgcHVibGljIHJlcG9ydFNldmVyZUVycm9yKGRpbWVuc2lvbnM6IE1ldHJpY0RpbWVuc2lvbltdID0gW10pIHtcbiAgICBNZXRyaWNzUmVwb3J0ZXIuaW5jcmVtZW50Q291bnRlcignU2V2ZXJlRXJyb3InLCBbXG4gICAgICAuLi5kaW1lbnNpb25zLFxuICAgICAgLi4udGhpcy5nZXRDb21tb25EaW1lbnNpb25zKCksXG4gICAgXSk7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKSB7XG4gICAgdGhpcy5jb21tb25Qcm9wZXJ0aWVzID0ge307XG4gIH1cblxuICBwcml2YXRlIGRlY29yYXRlTWVzc2FnZShtZXNzYWdlOiBzdHJpbmcgfCBvYmplY3QpOiBvYmplY3Qge1xuICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG1lc3NhZ2UgPSB7XG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5tZXNzYWdlLFxuICAgICAgLi4udGhpcy5jb21tb25Qcm9wZXJ0aWVzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgbGlzdCBvZiBjb21tb24gZGltZW5zaW9ucyBmb3IgZXZlcnkgTGFiIG1ldHJpYyBldmVudC5cbiAgICovXG4gIHByaXZhdGUgZ2V0Q29tbW9uRGltZW5zaW9ucygpOiBNZXRyaWNEaW1lbnNpb25bXSB7XG4gICAgY29uc3QgZGltZW5zaW9ucyA9IFtdO1xuICAgIGlmICh0aGlzLmNvbW1vblByb3BlcnRpZXMuYXBwTmFtZSkge1xuICAgICAgZGltZW5zaW9ucy5wdXNoKHtcbiAgICAgICAgbmFtZTogJ0FwcE5hbWUnLFxuICAgICAgICB2YWx1ZTogdGhpcy5jb21tb25Qcm9wZXJ0aWVzLmFwcE5hbWUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGRpbWVuc2lvbnM7XG4gIH1cbn1cbiIsIi8vIFJlZ2lzdHJ5IGZvciBMYWIgc2luZ2xldG9uc1xuXG5pbXBvcnQgTGFiTWV0cmljc1JlcG9ydGVyIGZyb20gJy4vTGFiMk1ldHJpY3NSZXBvcnRlcic7XG5pbXBvcnQgUHJvamVjdE1hbmFnZXIgZnJvbSAnLi9wcm9qZWN0cy9Qcm9qZWN0TWFuYWdlcic7XG5pbXBvcnQge0FwcE5hbWV9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IExpZmVjeWNsZU5vdGlmaWVyIGZyb20gJy4vdXRpbHMvTGlmZWN5Y2xlTm90aWZpZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMYWIyUmVnaXN0cnkge1xuICBwcml2YXRlIHByb2plY3RNYW5hZ2VyOiBQcm9qZWN0TWFuYWdlciB8IG51bGw7XG4gIHByaXZhdGUgbWV0cmljc1JlcG9ydGVyOiBMYWJNZXRyaWNzUmVwb3J0ZXI7XG4gIHByaXZhdGUgbGlmZWN5Y2xlTm90aWZpZXI6IExpZmVjeWNsZU5vdGlmaWVyO1xuICBwcml2YXRlIGFwcE5hbWU6IEFwcE5hbWUgfCBudWxsO1xuXG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogTGFiMlJlZ2lzdHJ5O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucHJvamVjdE1hbmFnZXIgPSBudWxsO1xuICAgIHRoaXMubWV0cmljc1JlcG9ydGVyID0gbmV3IExhYk1ldHJpY3NSZXBvcnRlcigpO1xuICAgIHRoaXMubGlmZWN5Y2xlTm90aWZpZXIgPSBuZXcgTGlmZWN5Y2xlTm90aWZpZXIoKTtcbiAgICB0aGlzLmFwcE5hbWUgPSBudWxsO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBMYWIyUmVnaXN0cnkge1xuICAgIGlmIChMYWIyUmVnaXN0cnkuX2luc3RhbmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIExhYjJSZWdpc3RyeS5jcmVhdGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIExhYjJSZWdpc3RyeS5faW5zdGFuY2U7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGhhc0VuYWJsZWRQcm9qZWN0cygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgTGFiMlJlZ2lzdHJ5Ll9pbnN0YW5jZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBMYWIyUmVnaXN0cnkuX2luc3RhbmNlLnByb2plY3RNYW5hZ2VyICE9PSBudWxsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlKCkge1xuICAgIExhYjJSZWdpc3RyeS5faW5zdGFuY2UgPSBuZXcgTGFiMlJlZ2lzdHJ5KCk7XG4gIH1cblxuICBwdWJsaWMgc2V0UHJvamVjdE1hbmFnZXIocHJvamVjdE1hbmFnZXI6IFByb2plY3RNYW5hZ2VyKSB7XG4gICAgdGhpcy5wcm9qZWN0TWFuYWdlciA9IHByb2plY3RNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIGdldFByb2plY3RNYW5hZ2VyKCkge1xuICAgIHJldHVybiB0aGlzLnByb2plY3RNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIGNsZWFyUHJvamVjdE1hbmFnZXIoKSB7XG4gICAgdGhpcy5wcm9qZWN0TWFuYWdlciA9IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWV0cmljc1JlcG9ydGVyKCkge1xuICAgIHJldHVybiB0aGlzLm1ldHJpY3NSZXBvcnRlcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMaWZlY3ljbGVOb3RpZmllcigpIHtcbiAgICByZXR1cm4gdGhpcy5saWZlY3ljbGVOb3RpZmllcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBcHBOYW1lKGFwcE5hbWU6IEFwcE5hbWUpIHtcbiAgICB0aGlzLmFwcE5hbWUgPSBhcHBOYW1lO1xuICB9XG5cbiAgcHVibGljIGdldEFwcE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwTmFtZTtcbiAgfVxufVxuIiwiaW1wb3J0IHtDaGFubmVsLCBMZXZlbFByb3BlcnRpZXMsIFByb2plY3RTb3VyY2VzfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBlbnVtIExpZmVjeWNsZUV2ZW50IHtcbiAgTGV2ZWxDaGFuZ2VSZXF1ZXN0ZWQsXG4gIExldmVsTG9hZFN0YXJ0ZWQsXG4gIExldmVsTG9hZENvbXBsZXRlZCxcbn1cblxudHlwZSBDYWxsYmFja0FyZ3MgPSB7XG4gIFtMaWZlY3ljbGVFdmVudC5MZXZlbENoYW5nZVJlcXVlc3RlZF06IFtcbiAgICBwcmV2aW91c0xldmVsSWQ6IHN0cmluZyB8IG51bGwsXG4gICAgbmV4dExldmVsSWQ6IHN0cmluZ1xuICBdO1xuICBbTGlmZWN5Y2xlRXZlbnQuTGV2ZWxMb2FkU3RhcnRlZF06IFtsZXZlbElkOiBudW1iZXJdO1xuICBbTGlmZWN5Y2xlRXZlbnQuTGV2ZWxMb2FkQ29tcGxldGVkXTogW1xuICAgIGxldmVsUHJvcGVydGllczogTGV2ZWxQcm9wZXJ0aWVzLFxuICAgIGNoYW5uZWw6IENoYW5uZWwgfCB1bmRlZmluZWQsXG4gICAgaW5pdGlhbFNvdXJjZXM6IFByb2plY3RTb3VyY2VzIHwgdW5kZWZpbmVkLFxuICAgIGFidXNlU2NvcmU6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBpc1JlYWRPbmx5OiBib29sZWFuIHwgdW5kZWZpbmVkXG4gIF07XG59O1xuXG5leHBvcnQgdHlwZSBDYWxsYmFjazxUIGV4dGVuZHMgTGlmZWN5Y2xlRXZlbnQ+ID0gKFxuICAuLi5hcmdzOiBDYWxsYmFja0FyZ3NbVF1cbikgPT4gdm9pZDtcblxuLyoqXG4gKiBOb3RpZmllcyBsaXN0ZW5lcnMgb2YgbGlmZWN5Y2xlIGV2ZW50cyBpbiB0aGUgTGFiMiBzeXN0ZW0sIHdoaWNoIGRvZXNuJ3QgcmVsb2FkIHRoZSBwYWdlIGJldHdlZW4gbGV2ZWxzLlxuICovXG5jbGFzcyBMaWZlY3ljbGVOb3RpZmllciB7XG4gIHByaXZhdGUgbGlzdGVuZXJzOiB7W1QgaW4gTGlmZWN5Y2xlRXZlbnRdPzogQ2FsbGJhY2s8VD5bXX07XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMgPSB7fTtcbiAgfVxuXG4gIGFkZExpc3RlbmVyPFQgZXh0ZW5kcyBMaWZlY3ljbGVFdmVudD4oZXZlbnQ6IFQsIGNhbGxiYWNrOiBDYWxsYmFjazxUPikge1xuICAgIGlmICghdGhpcy5saXN0ZW5lcnNbZXZlbnRdKSB7XG4gICAgICB0aGlzLmxpc3RlbmVyc1tldmVudF0gPSBbXTtcbiAgICB9XG4gICAgdGhpcy5saXN0ZW5lcnNbZXZlbnRdPy5wdXNoKGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHJlbW92ZUxpc3RlbmVyPFQgZXh0ZW5kcyBMaWZlY3ljbGVFdmVudD4oZXZlbnQ6IFQsIGNhbGxiYWNrOiBDYWxsYmFjazxUPikge1xuICAgIGlmICh0aGlzLmxpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5saXN0ZW5lcnNbZXZlbnRdLmluZGV4T2YoY2FsbGJhY2spO1xuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICB0aGlzLmxpc3RlbmVyc1tldmVudF0uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBub3RpZnk8VCBleHRlbmRzIExpZmVjeWNsZUV2ZW50PihldmVudDogVCwgLi4uYXJnczogQ2FsbGJhY2tBcmdzW1RdKSB7XG4gICAgdGhpcy5saXN0ZW5lcnNbZXZlbnRdPy5mb3JFYWNoKGNhbGxiYWNrID0+IGNhbGxiYWNrKC4uLmFyZ3MpKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMaWZlY3ljbGVOb3RpZmllcjtcbiIsImltcG9ydCBMYWIyUmVnaXN0cnkgZnJvbSAnLi4vTGFiMlJlZ2lzdHJ5JztcblxuaW1wb3J0IHtMaWZlY3ljbGVFdmVudH0gZnJvbSAnLi9MaWZlY3ljbGVOb3RpZmllcic7XG5cbi8vIEZ1bmN0aW9uIGZvciBleHRlcm5hbCBjb21wb25lbnRzIHRvIG5vdGlmeSB0aGUgTGFiMiBsaWZlY3ljbGUgbm90aWZpZXIgdGhhdCB0aGUgbGV2ZWwgaXMgY2hhbmdpbmcuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBub3RpZnlMZXZlbENoYW5nZShcbiAgcHJldmlvdXNMZXZlbElkOiBzdHJpbmcgfCBudWxsLFxuICBuZXh0TGV2ZWxJZDogc3RyaW5nXG4pIHtcbiAgTGFiMlJlZ2lzdHJ5LmdldEluc3RhbmNlKClcbiAgICAuZ2V0TGlmZWN5Y2xlTm90aWZpZXIoKVxuICAgIC5ub3RpZnkoTGlmZWN5Y2xlRXZlbnQuTGV2ZWxDaGFuZ2VSZXF1ZXN0ZWQsIHByZXZpb3VzTGV2ZWxJZCwgbmV4dExldmVsSWQpO1xufVxuIiwiaW1wb3J0IEh0dHBDbGllbnQgZnJvbSAnQGNkby9hcHBzL3V0aWwvSHR0cENsaWVudCc7XG5cbmltcG9ydCB7TWV0cmljc0FwaX0gZnJvbSAnLi9NZXRyaWNzQXBpJztcbmltcG9ydCB7TWV0cmljRGF0dW19IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBCQVNFX1VSTCA9ICcvYnJvd3Nlcl9ldmVudHMvJztcblxuLyoqXG4gKiBBIHtAbGluayBNZXRyaWNzQXBpfSBpbXBsZW1lbnRhdGlvbiB0aGF0IGZvcndhcmRzIG1ldHJpY3MgdG8gRGFzaGJvYXJkLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXNoYm9hcmRNZXRyaWNzQXBpIGltcGxlbWVudHMgTWV0cmljc0FwaSB7XG4gIGFzeW5jIHNlbmRMb2dzKGxvZ3M6IG9iamVjdFtdKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiBIdHRwQ2xpZW50LnBvc3QoQkFTRV9VUkwgKyAncHV0X2xvZ3MnLCBKU09OLnN0cmluZ2lmeSh7bG9nc30pLCB0cnVlKTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRNZXRyaWNEYXRhKG1ldHJpY0RhdGE6IE1ldHJpY0RhdHVtW10pIHtcbiAgICByZXR1cm4gSHR0cENsaWVudC5wb3N0KFxuICAgICAgQkFTRV9VUkwgKyAncHV0X21ldHJpY19kYXRhJyxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHttZXRyaWNEYXRhfSksXG4gICAgICB0cnVlXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtnZXRCcm93c2VyTmFtZX0gZnJvbSAnQGNkby9hcHBzL3V0aWwvYnJvd3Nlci1kZXRlY3Rvcic7XG5pbXBvcnQge2lzRGV2ZWxvcG1lbnRFbnZpcm9ubWVudH0gZnJvbSAnQGNkby9hcHBzL3V0aWxzJztcblxuaW1wb3J0IERhc2hib2FyZE1ldHJpY3NBcGkgZnJvbSAnLi9EYXNoYm9hcmRNZXRyaWNzQXBpJztcbmltcG9ydCB7TWV0cmljc0FwaX0gZnJvbSAnLi9NZXRyaWNzQXBpJztcbmltcG9ydCB7TG9nTGV2ZWwsIE1ldHJpY0RhdHVtLCBNZXRyaWNEaW1lbnNpb24sIE1ldHJpY1VuaXR9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIElmIHdlIHJlY2VpdmUgYW4gdW5hdXRob3JpemVkIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciwgdGhpcyBtYXlcbiAqIGluZGljYXRlIHRoYXQgYnJvd3NlciBldmVudCByZXBvcnRpbmcgaGFzIGJlZW4gdGVtcG9yYXJpbHkgZGlzYWJsZWQuXG4gKiBXZSB3aWxsIHdhaXQgZm9yIGEgc3BlY2lmaWMgdGltZSBpbnRlcnZhbCAoZGVmaW5lZCBiZWxvdykgYmVmb3JlIG1ha2luZ1xuICogYSByZXF1ZXN0IGFnYWluLCBzbyBhcyB0byBub3QgZmxvb2QgdGhlIHNlcnZlciB3aXRoIHJlcXVlc3RzLlxuICovXG5jb25zdCBDSEVDS19DQU5fUkVQT1JUX0lOVEVSVkFMX01JTlVURVMgPSAzMDtcbmNvbnN0IENIRUNLX0NBTl9SRVBPUlRfSU5URVJWQUxfTVMgPVxuICBDSEVDS19DQU5fUkVQT1JUX0lOVEVSVkFMX01JTlVURVMgKiA2MCAqIDEwMDA7XG5jb25zdCBMT0NBTF9TVE9SQUdFX0tFWV9OQU1FID0gJ2Nkby1tZXRyaWNzLXJlcG9ydGVyLWxhc3QtY2hlY2stdGltZSc7XG4vLyBBIGZsYWcgdGhhdCBjYW4gYmUgdG9nZ2xlZCB0byBzZW5kIGV2ZW50cyByZWdhcmRsZXNzIG9mIGVudmlyb25tZW50XG5jb25zdCBBTFdBWVNfU0VORCA9IGZhbHNlO1xuXG4vKipcbiAqIFJlcG9ydHMgbG9ncyBhbmQgbWV0cmljcywgaW50ZW5kZWQgcHJpbWFyaWx5IGZvciBkZXZlbG9wZXItZmFjaW5nXG4gKiBlcnJvciByZXBvcnRpbmcsIG1ldHJpYyByZXBvcnRpbmcsIGFuZCBsb2dnaW5nLlxuICpcbiAqIEZvciB0cmFja2luZyB1c2VyIGludGVyYWN0aW9ucyBhbmQgYmVoYXZpb3JzIChwcm9kdWN0LWZhY2luZyksXG4gKiBzZWUge0BsaW5rIEFuYWx5dGljc1JlcG9ydGVyfSB3aGljaCByZXBvcnRzIHRvIEFtcGxpdHVkZS5cbiAqXG4gKiBGb3IgbGVnYWN5IGNsaWVudC1zaWRlIHJlcG9ydGluZyBzZWUge0BsaW5rIGZpcmVob3NlfSBmb3IgQVdTXG4gKiBGaXJlaG9zZSByZXBvcnRpbmcgYW5kIHtAbGluayBsb2dUb0Nsb3VkfSBmb3IgTmV3IFJlbGljIHJlcG9ydGluZy5cbiAqL1xuY2xhc3MgTWV0cmljc1JlcG9ydGVyIHtcbiAgcHJpdmF0ZSBsYXN0Q2hlY2tDYW5SZXBvcnRUaW1lOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBtZXRyaWNzQXBpOiBNZXRyaWNzQXBpKSB7XG4gICAgdGhpcy5tZXRyaWNzQXBpID0gbWV0cmljc0FwaTtcbiAgICB0aGlzLmxhc3RDaGVja0NhblJlcG9ydFRpbWUgPVxuICAgICAgcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oTE9DQUxfU1RPUkFHRV9LRVlfTkFNRSkgfHwgJzAnKSB8fCAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2ggYW4gaW5mb3JtYXRpb24gbG9nIG1lc3NhZ2UuIENhbiBiZSBhIHN0cmluZyBvciBhIHN0cnVjdHVyZWQgb2JqZWN0XG4gICAqL1xuICBsb2dJbmZvKG1lc3NhZ2U6IHN0cmluZyB8IG9iamVjdCkge1xuICAgIGlmICghdGhpcy5zaG91bGRSZXBvcnQoKSkge1xuICAgICAgY29uc29sZS5sb2cobWVzc2FnZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubG9nKCdJTkZPJywgbWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaCBhIHdhcm5pbmcgbG9nIG1lc3NhZ2UuIENhbiBiZSBhIHN0cmluZyBvciBhIHN0cnVjdHVyZWQgb2JqZWN0XG4gICAqL1xuICBsb2dXYXJuaW5nKG1lc3NhZ2U6IHN0cmluZyB8IG9iamVjdCkge1xuICAgIGlmICghdGhpcy5zaG91bGRSZXBvcnQoKSkge1xuICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmxvZygnV0FSTklORycsIG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2ggYW4gZXJyb3IgbG9nIG1lc3NhZ2UuIENhbiBiZSBhIHN0cmluZyBvciBhIHN0cnVjdHVyZWQgb2JqZWN0XG4gICAqL1xuICBsb2dFcnJvcihtZXNzYWdlOiBzdHJpbmcgfCBvYmplY3QpIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkUmVwb3J0KCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubG9nKCdTRVZFUkUnLCBtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmNyZW1lbnQgYSBjb3VudGVyIG1ldHJpYy5cbiAgICovXG4gIGluY3JlbWVudENvdW50ZXIobmFtZTogc3RyaW5nLCBkaW1lbnNpb25zOiBNZXRyaWNEaW1lbnNpb25bXSA9IFtdKSB7XG4gICAgdGhpcy5wdWJsaXNoTWV0cmljKG5hbWUsIDEsICdDb3VudCcsIGRpbWVuc2lvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2ggYSBtZXRyaWMuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGlzIHdpbGwgc2VuZCB0d28gbWV0cmljcywgd2l0aCBhbmQgd2l0aG91dCB0aGUgYnJvd3NlciB2ZXJzaW9uIGRpbWVuc2lvblxuICAgKiAodGhlIGJyb3dzZXIgbmFtZSBkaW1lbnNpb24gaXMgaW5jbHVkZWQgaW4gYm90aCkuXG4gICAqIFRoaXMgYWxsb3dzIHVzIHRvIG1vcmUgZWFzaWx5IGFnZ3JlZ2F0ZSBtZXRyaWNzIGJ5IGJyb3dzZXIuXG4gICAqL1xuICBwdWJsaXNoTWV0cmljKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIHVuaXQ6IE1ldHJpY1VuaXQsXG4gICAgZGltZW5zaW9uczogTWV0cmljRGltZW5zaW9uW10gPSBbXVxuICApIHtcbiAgICBjb25zdCBtZXRyaWMgPSB7XG4gICAgICBuYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICB1bml0LFxuICAgICAgZGltZW5zaW9uczogZGltZW5zaW9ucy5jb25jYXQodGhpcy5nZXREZXZpY2VEaW1lbnNpb25zKCkpLFxuICAgIH07XG4gICAgaWYgKCF0aGlzLnNob3VsZFJlcG9ydCgpKSB7XG4gICAgICBjb25zb2xlLmluZm8oJ1tNZXRyaWNzUmVwb3J0ZXJdICcgKyBKU09OLnN0cmluZ2lmeShtZXRyaWMpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gU2VuZCBhIHZlcnNpb24gb2YgdGhlIG1ldHJpYyB3aXRoIGFuZCB3aXRob3V0IHRoZSBicm93c2VyIHZlcnNpb24gZGltZW5zaW9uXG4gICAgdGhpcy5zZW5kTWV0cmljcyhbXG4gICAgICBtZXRyaWMsXG4gICAgICB7XG4gICAgICAgIC4uLm1ldHJpYyxcbiAgICAgICAgZGltZW5zaW9uczogWy4uLm1ldHJpYy5kaW1lbnNpb25zLCB0aGlzLmdldEJyb3dzZXJWZXJzaW9uRGltZW5zaW9uKCldLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9nKGxldmVsOiBMb2dMZXZlbCwgbWVzc2FnZTogc3RyaW5nIHwgb2JqZWN0KSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIGxldmVsLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIGRldmljZUluZm86IHRoaXMuZ2V0RGV2aWNlSW5mbygpLFxuICAgIH07XG5cbiAgICBpZiAoIXRoaXMuaXNSZXBvcnRpbmdFbmFibGVkKCkpIHtcbiAgICAgIHRoaXMuZmFsbGJhY2tMb2cocGF5bG9hZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMubWV0cmljc0FwaS5zZW5kTG9ncyhbcGF5bG9hZF0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmZhbGxiYWNrTG9nKHBheWxvYWQpO1xuICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnJvciBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZW5kTWV0cmljcyhtZXRyaWNzOiBNZXRyaWNEYXR1bVtdKSB7XG4gICAgaWYgKCF0aGlzLmlzUmVwb3J0aW5nRW5hYmxlZCgpKSB7XG4gICAgICB0aGlzLmZhbGxiYWNrTG9nKG1ldHJpY3MpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLm1ldHJpY3NBcGkuc2VuZE1ldHJpY0RhdGEobWV0cmljcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZmFsbGJhY2tMb2cobWV0cmljcyk7XG4gICAgICB0aGlzLmhhbmRsZUVycm9yKGVycm9yIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUVycm9yKGVycm9yOiBFcnJvcikge1xuICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCc0MDEnKSkge1xuICAgICAgLy8gVW5hdXRob3JpemVkIHJlc3BvbnNlIGZyb20gc2VydmVyOyBjbGllbnQgbG9nZ2luZyBpcyBsaWtlbHkgZGlzYWJsZWQuXG4gICAgICAvLyBXZSB3aWxsIGNoZWNrIGFnYWluIGFmdGVyIGEgdGltZSBwZXJpb2Qgb2YgQ0hFQ0tfQ0FOX1JFUE9SVF9JTlRFUlZBTFxuICAgICAgdGhpcy5zZXRSZXBvcnRpbmdEaXNhYmxlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldERldmljZUluZm8oKTogb2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgdXNlcl9hZ2VudDogd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQsXG4gICAgICB3aW5kb3dfd2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoLFxuICAgICAgd2luZG93X2hlaWdodDogd2luZG93LmlubmVySGVpZ2h0LFxuICAgICAgaG9zdG5hbWU6IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSxcbiAgICAgIGZ1bGxfcGF0aDogd2luZG93LmxvY2F0aW9uLmhyZWYsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGV2aWNlRGltZW5zaW9ucygpOiBNZXRyaWNEaW1lbnNpb25bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ0hvc3RuYW1lJyxcbiAgICAgICAgdmFsdWU6IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdCcm93c2VyJyxcbiAgICAgICAgdmFsdWU6IGdldEJyb3dzZXJOYW1lKCksXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIGdldEJyb3dzZXJWZXJzaW9uRGltZW5zaW9uKCk6IE1ldHJpY0RpbWVuc2lvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdCcm93c2VyVmVyc2lvbicsXG4gICAgICB2YWx1ZTogZ2V0QnJvd3Nlck5hbWUodHJ1ZSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZmFsbGJhY2tMb2cocGF5bG9hZDogb2JqZWN0KSB7XG4gICAgaWYgKGlzRGV2ZWxvcG1lbnRFbnZpcm9ubWVudCgpKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJ0NsaWVudC1zaWRlIHJlcG9ydGluZyBkaXNhYmxlZC4gQXR0ZW1wdGVkIHRvIHJlcG9ydDogJyArXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc1JlcG9ydGluZ0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIERhdGUubm93KCkgLSB0aGlzLmxhc3RDaGVja0NhblJlcG9ydFRpbWUgPiBDSEVDS19DQU5fUkVQT1JUX0lOVEVSVkFMX01TXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UmVwb3J0aW5nRGlzYWJsZWQoKSB7XG4gICAgdGhpcy5sYXN0Q2hlY2tDYW5SZXBvcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgIExPQ0FMX1NUT1JBR0VfS0VZX05BTUUsXG4gICAgICB0aGlzLmxhc3RDaGVja0NhblJlcG9ydFRpbWUudG9TdHJpbmcoKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB3ZSBzaG91bGQgdHJ5IHRvIHJlcG9ydCBtZXRyaWNzIHRvIHRoZSBzZXJ2ZXIuXG4gICAqIEFsd2F5cyB0cnVlIGlmIG5vdCBvbiBkZXZlbG9wbWVudC4gSWYgb24gZGV2ZWxvcG1lbnQsXG4gICAqIHRoaXMgaXMgY29udHJvbGxlZCBieSB0aGUgQUxXQVlTX1NFTkQgZmxhZy5cbiAgICovXG4gIHByaXZhdGUgc2hvdWxkUmVwb3J0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBBTFdBWVNfU0VORCB8fCAhaXNEZXZlbG9wbWVudEVudmlyb25tZW50KCk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IE1ldHJpY3NSZXBvcnRlcihuZXcgRGFzaGJvYXJkTWV0cmljc0FwaSgpKTtcbiIsIi8vIFR5cGVzY3JpcHQgZGVmaW5pdGlvbnMgZm9yIHR5cGVzIHJlbGF0aW5nIHRvIHByb2dyZXNzLiBOb3RlIHRoYXQgbWFueVxuLy8gb2YgdGhlc2UgYXJlIFwiZHVwbGljYXRlZFwiIGJ5IGAvdGVtcGxhdGVzL3Byb2dyZXNzL3Byb2dyZXNzVHlwZXMsIHdoaWNoIGRlZmluZWRcbi8vIHRoZXNlIHVzaW5nIFByb3BUeXBlcyBmb3IgdXNhZ2UgaW4gSmF2YXNjcmlwdCBSZWFjdCBjb21wb25lbnRzLiBBcyB3ZSBtb3ZlIHRvd2FyZHNcbi8vIHR5cGVzY3JpcHQgd2UgY2FuIGRlcHJlY2F0ZSB0aGUgUHJvcFR5cGVzIGRlZmluaXRpb25zIGFuZCB1c2UgdGhlc2UgaW5zdGVhZC5cblxuLyoqXG4gKiBTZWUgQXBwbGljYXRpb25IZWxwZXI6OlBVWlpMRV9QQUdFX05PTkUuXG4gKi9cbmV4cG9ydCBjb25zdCBQVVpaTEVfUEFHRV9OT05FID0gLTE7XG5cbmV4cG9ydCB0eXBlIExlc3NvbkJhY2tncm91bmQgPSAnbGlnaHQnIHwgJ2RhcmsnIHwgbnVsbDtcblxuZXhwb3J0IGludGVyZmFjZSBMZXNzb24ge1xuICBhc3Nlc3NtZW50OiBib29sZWFuO1xuICBkZXNjcmlwdGlvbl9zdHVkZW50OiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uX3RlYWNoZXI6IHN0cmluZztcbiAgaGFzTGVzc29uUGxhbjogYm9vbGVhbjtcbiAgaWQ6IG51bWJlcjtcbiAga2V5OiBzdHJpbmc7XG4gIGxlc3NvbkVkaXRQYXRoOiBzdHJpbmc7XG4gIGxlc3Nvbk51bWJlcjogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXNzb25TdGFydFVybDogc3RyaW5nO1xuICBsZXNzb25fZXh0cmFzX2xldmVsX3VybDogc3RyaW5nO1xuICBsZXNzb25fZ3JvdXBfZGlzcGxheV9uYW1lOiBzdHJpbmc7XG4gIGxldmVsczogTGV2ZWxbXTtcbiAgbG9ja2FibGU6IGJvb2xlYW47XG4gIG5hbWU6IHN0cmluZztcbiAgbnVtX3NjcmlwdF9sZXNzb25zOiBudW1iZXI7XG4gIG51bWJlcmVkTGVzc29uOiBib29sZWFuO1xuICBwb3NpdGlvbjogbnVtYmVyO1xuICByZWxhdGl2ZV9wb3NpdGlvbjogbnVtYmVyO1xuICBzY3JpcHRfaWQ6IG51bWJlcjtcbiAgc2NyaXB0X25hbWU6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgdW5wbHVnZ2VkOiBib29sZWFuIHwgbnVsbDtcbiAgYmFja2dyb3VuZDogTGVzc29uQmFja2dyb3VuZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMZXNzb25Hcm91cCB7XG4gIGJpZ19xdWVzdGlvbnM6IHN0cmluZyB8IG51bGw7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICBkaXNwbGF5X25hbWU6IHN0cmluZztcbiAgaWQ6IG51bWJlcjtcbiAga2V5OiBzdHJpbmc7XG4gIHBvc2l0aW9uOiBudW1iZXI7XG4gIHVzZXJfZmFjaW5nOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExldmVsIHtcbiAgYWN0aXZlSWQ6IHN0cmluZztcbiAgYXBwOiBzdHJpbmc7XG4gIGJvbnVzOiBib29sZWFuO1xuICBkaXNwbGF5X2FzX3VucGx1Z2dlZDogYm9vbGVhbjtcbiAgZnJlZVBsYXk6IGJvb2xlYW47XG4gIGljb246IHN0cmluZyB8IG51bGw7XG4gIGlkOiBzdHJpbmc7XG4gIGlkczogc3RyaW5nW107XG4gIGluYWN0aXZlSWRzOiBzdHJpbmdbXTtcbiAgaXNfY29uY2VwdF9sZXZlbDogYm9vbGVhbjtcbiAga2luZDogc3RyaW5nO1xuICBsZXZlbE51bWJlcjogbnVtYmVyO1xuICBwb3NpdGlvbjogbnVtYmVyO1xuICB0aXRsZTogbnVtYmVyO1xuICB1cmw6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBzY3JpcHRMZXZlbElkOiBzdHJpbmc7XG4gIHN0YXR1cz86IHN0cmluZztcbiAgc3VibGV2ZWxzPzogTGV2ZWxbXTtcbiAgdXNlc0xhYjI6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGV2ZWxXaXRoUHJvZ3Jlc3MgZXh0ZW5kcyBMZXZlbCB7XG4gIHN0YXR1czogc3RyaW5nO1xuICBwYWlyZWQ/OiBib29sZWFuO1xuICBpc0xvY2tlZD86IGJvb2xlYW47XG4gIGlzQ3VycmVudExldmVsPzogYm9vbGVhbjtcbiAgc3VibGV2ZWxzPzogTGV2ZWxXaXRoUHJvZ3Jlc3NbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVbml0UHJvZ3Jlc3Mge1xuICBsYXN0VGltZXN0YW1wOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxvY2tlZDogYm9vbGVhbjtcbiAgcGFnZXM6IFVuaXRQcm9ncmVzc1tdIHwgbnVsbDtcbiAgcGFpcmVkOiBib29sZWFuO1xuICByZXN1bHQ6IG51bWJlcjtcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIHRlYWNoZXJGZWVkYmFja1Jldmlld1N0YXRlOiBrZXlvZiB0eXBlb2YgUmV2aWV3U3RhdGVzIHwgdW5kZWZpbmVkO1xuICB0ZWFjaGVyRmVlZGJhY2tOZXc6IGJvb2xlYW47XG4gIHRpbWVTcGVudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBlZXJSZXZpZXdMZXNzb25JbmZvIHtcbiAgbmFtZTogc3RyaW5nO1xuICBsZXNzb25fZ3JvdXBfZGlzcGxheV9uYW1lOiBzdHJpbmc7XG4gIGxldmVsczogUGVlclJldmlld0xldmVsSW5mb1tdO1xuICBsb2NrYWJsZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQZWVyUmV2aWV3TGV2ZWxJbmZvIHtcbiAgaWQ6IG51bWJlcjtcbiAga2luZDogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBpY29uOiBzdHJpbmc7XG4gIGxvY2tlZDogYm9vbGVhbjtcbiAgc3RhdHVzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBlZXJSZXZpZXdTdW1tYXJ5IHtcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgcmVzdWx0OiBzdHJpbmc7XG4gIGljb246IHN0cmluZztcbiAgbG9ja2VkOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgUmV2aWV3U3RhdGVzID0ge1xuICBjb21wbGV0ZWQ6ICdjb21wbGV0ZWQnLFxuICBrZWVwV29ya2luZzogJ2tlZXBXb3JraW5nJyxcbiAgYXdhaXRpbmdSZXZpZXc6ICdhd2FpdGluZ1JldmlldycsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEluaXRQcm9ncmVzc1BheWxvYWQge1xuICBjdXJyZW50TGV2ZWxJZDogc3RyaW5nIHwgbnVsbDtcbiAgZGVlcGVyTGVhcm5pbmdDb3Vyc2U6IGJvb2xlYW47XG4gIHNhdmVBbnN3ZXJzQmVmb3JlTmF2aWdhdGlvbjogYm9vbGVhbiB8IG51bGw7XG4gIGxlc3NvbnM6IExlc3NvbltdO1xuICBsZXNzb25Hcm91cHM6IExlc3Nvbkdyb3VwW10gfCBudWxsO1xuICBzY3JpcHRJZDogbnVtYmVyIHwgbnVsbDtcbiAgc2NyaXB0TmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgc2NyaXB0RGlzcGxheU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgdW5pdFRpdGxlOiBzdHJpbmcgfCBudWxsO1xuICB1bml0RGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgdW5pdFN0dWRlbnREZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb3Vyc2VJZDogbnVtYmVyIHwgbnVsbDtcbiAgY291cnNlVmVyc2lvbklkOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGlzTGVzc29uRXh0cmFzOiBib29sZWFuO1xuICBwZWVyUmV2aWV3TGVzc29uSW5mbzogUGVlclJldmlld0xlc3NvbkluZm8gfCBudWxsO1xuICBpc0Z1bGxQcm9ncmVzczogYm9vbGVhbjtcbiAgY3VycmVudFBhZ2VOdW1iZXI6IG51bWJlcjtcbn1cblxuLy8gTGV2ZWxSZXN1bHRzIGlzIGEgbWFwIG9mIGxldmVsSWQgLT4gVGVzdFJlc3VsdC4gVGVzdFJlc3VsdCBpcyBhIG51bWJlci5cbmV4cG9ydCB0eXBlIExldmVsUmVzdWx0cyA9IHtba2V5OiBudW1iZXJdOiBudW1iZXJ9O1xuXG5leHBvcnQgY29uc3QgVmlld1R5cGUgPSB7XG4gIFBhcnRpY2lwYW50OiAnUGFydGljaXBhbnQnLFxuICBJbnN0cnVjdG9yOiAnSW5zdHJ1Y3RvcicsXG59O1xuIiwiLyoqXG4gKiBBIHV0aWxpdHkgZm9yIHJldHJpZXZpbmcgdGhlIFJhaWxzIGF1dGhlbnRpY2l0eSB0b2tlbiwgbmVlZGVkIGZvciBjZXJ0YWluXG4gKiByZXF1ZXN0cyBtYWRlIHRvIGRhc2hib2FyZC4gT24gc29tZSBwYWdlcywgdGhpcyBpcyBwYXNzZWQgZG93biBhcyBwYXJ0IG9mIHRoZVxuICogRE9NLCBidXQgaW4gb3RoZXJzLCBpdCBtYXkgbmVlZCB0byBiZSByZXRyaWV2ZWQgYnkgYSBzZXBhcmF0ZSBBSkFYIHJlcXVlc3QuXG4gKi9cblxubGV0IGF1dGhlbnRpY2l0eVRva2VuOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXV0aGVudGljaXR5VG9rZW4oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgaWYgKGF1dGhlbnRpY2l0eVRva2VuICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIGF1dGhlbnRpY2l0eVRva2VuO1xuICB9XG5cbiAgY29uc3QgdG9rZW4gPSBhd2FpdCByZWZyZXNoVG9rZW4oKTtcbiAgYXV0aGVudGljaXR5VG9rZW4gPSB0b2tlbjtcbiAgcmV0dXJuIGF1dGhlbnRpY2l0eVRva2VuO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWZyZXNoVG9rZW4oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgLy8gUmV0cmlldmUgdG9rZW4gZnJvbSBET00gaWYgcHJlc2VudFxuICBjb25zdCB0b2tlbkNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTE1ldGFFbGVtZW50PihcbiAgICAnbWV0YVtuYW1lPVwiY3NyZi10b2tlblwiXSdcbiAgKTtcblxuICBpZiAodG9rZW5Db250YWluZXIgJiYgdG9rZW5Db250YWluZXIuY29udGVudCkge1xuICAgIHJldHVybiB0b2tlbkNvbnRhaW5lci5jb250ZW50O1xuICB9XG5cbiAgLy8gUmVxdWVzdCBhIHRva2VuIGZyb20gZGFzaGJvYXJkXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9nZXRfdG9rZW4nKTtcbiAgY29uc3QgdG9rZW4gPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY3NyZi10b2tlbicpO1xuICBpZiAodG9rZW4gPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCByZXRyaWV2ZSBDU1JGIHRva2VuJyk7XG4gIH1cbiAgcmV0dXJuIHRva2VuO1xufVxuXG5leHBvcnQge2dldEF1dGhlbnRpY2l0eVRva2VufTtcbmV4cG9ydCBjb25zdCBBVVRIRU5USUNJVFlfVE9LRU5fSEVBREVSID0gJ1gtQ1NSRi1UT0tFTic7XG4iLCJpbXBvcnQge1xuICBBVVRIRU5USUNJVFlfVE9LRU5fSEVBREVSLFxuICBnZXRBdXRoZW50aWNpdHlUb2tlbixcbn0gZnJvbSAnLi9BdXRoZW50aWNpdHlUb2tlblN0b3JlJztcblxuZXhwb3J0IHR5cGUgUmVzcG9uc2VWYWxpZGF0b3I8UmVzcG9uc2VUeXBlPiA9IChcbiAgYm9keUpzb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pID0+IFJlc3BvbnNlVHlwZTtcblxuZXhwb3J0IHR5cGUgR2V0UmVzcG9uc2U8UmVzcG9uc2VUeXBlPiA9IHtcbiAgdmFsdWU6IFJlc3BvbnNlVHlwZTtcbiAgcmVzcG9uc2U6IFJlc3BvbnNlO1xufTtcblxuLy8gTmFycm93IHRoZSB0eXBlIG9mIGFuIGVycm9yIHRvIE5ldHdvcmtFcnJvclxuZXhwb3J0IGZ1bmN0aW9uIGlzTmV0d29ya0Vycm9yKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgTmV0d29ya0Vycm9yIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgTmV0d29ya0Vycm9yO1xufVxuXG4vKipcbiAqIEVycm9yIHRocm93biBieSB0aGVzZSBmdW5jdGlvbnMgd2hlbiB0aGUgcmVzcG9uc2UgaXMgbm90IG9rLCB3aGljaCBpbmNsdWRlcyBhXG4gKiByZWZlcmVuY2UgdG8gdGhlIHJlc3BvbnNlIG9iamVjdC5cbiAqL1xuZXhwb3J0IGNsYXNzIE5ldHdvcmtFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBwdWJsaWMgcmVzcG9uc2U6IFJlc3BvbnNlKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ05ldHdvcmtFcnJvcic7XG5cbiAgICAvLyBOZWVkZWQgZm9yIFR5cGVTY3JpcHQgdG8gcmVnaXN0ZXIgdGhpcyBjbGFzcyBjb3JyZWN0bHkgaW4gRVM1XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L3dpa2kvQnJlYWtpbmctQ2hhbmdlcyNleHRlbmRpbmctYnVpbHQtaW5zLWxpa2UtZXJyb3ItYXJyYXktYW5kLW1hcC1tYXktbm8tbG9uZ2VyLXdvcmtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTmV0d29ya0Vycm9yLnByb3RvdHlwZSk7XG4gIH1cblxuICBnZXREZXRhaWxzKCkge1xuICAgIGNvbnN0IGhlYWRlcnM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9ID0ge307XG4gICAgdGhpcy5yZXNwb25zZS5oZWFkZXJzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGhlYWRlcnNba2V5XSA9IHZhbHVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogdGhpcy5yZXNwb25zZS5zdGF0dXMsXG4gICAgICBzdGF0dXNUZXh0OiB0aGlzLnJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICB1cmw6IHRoaXMucmVzcG9uc2UudXJsLFxuICAgICAgdHlwZTogdGhpcy5yZXNwb25zZS50eXBlLFxuICAgICAgaGVhZGVycyxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogR2V0IGEgSlNPTiByZXNwb25zZSBmcm9tIHRoZSBnaXZlbiBlbmRwb2ludCBhbmRcbiAqIHJldHVybiBpdCBhcyB0aGUgc3BlY2lmaWVkIHR5cGUuIENhbiBhbHNvIHBlcmZvcm1cbiAqIHJlc3BvbnNlIHZhbGlkYXRpb24gaWYgcHJvdmlkZWQgYSB2YWxpZGF0b3IgZnVuY3Rpb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoSnNvbjxSZXNwb25zZVR5cGU+KFxuICBlbmRwb2ludDogc3RyaW5nLFxuICBpbml0PzogUmVxdWVzdEluaXQsXG4gIHZhbGlkYXRvcj86IFJlc3BvbnNlVmFsaWRhdG9yPFJlc3BvbnNlVHlwZT5cbik6IFByb21pc2U8R2V0UmVzcG9uc2U8UmVzcG9uc2VUeXBlPj4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGVuZHBvaW50LCBpbml0KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBOZXR3b3JrRXJyb3IoXG4gICAgICByZXNwb25zZS5zdGF0dXMgKyAnICcgKyByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgcmVzcG9uc2VcbiAgICApO1xuICB9XG5cbiAgY29uc3QganNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgbGV0IHZhbHVlOiBSZXNwb25zZVR5cGUgPSBqc29uO1xuXG4gIGlmICh2YWxpZGF0b3IpIHtcbiAgICB2YWx1ZSA9IHZhbGlkYXRvcihqc29uKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdmFsdWUsXG4gICAgcmVzcG9uc2UsXG4gIH07XG59XG5cbi8qKlxuICogU2VuZHMgYSByZXF1ZXN0IHRvIHRoZSBnaXZlbiBlbmRwb2ludC4gQWRkcyB0aGUgUmFpbHMgYXV0aGVudGljaXR5XG4gKiB0b2tlbiBpZiB1c2VBdXRoZW50aWNpdHlUb2tlbiBpcyB0cnVlLlxuICovXG5hc3luYyBmdW5jdGlvbiBzZW5kUmVxdWVzdChcbiAgbWV0aG9kOiBzdHJpbmcsXG4gIGVuZHBvaW50OiBzdHJpbmcsXG4gIGJvZHk/OiBzdHJpbmcsXG4gIHVzZUF1dGhlbnRpY2l0eVRva2VuID0gZmFsc2UsXG4gIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBpZiAodXNlQXV0aGVudGljaXR5VG9rZW4pIHtcbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IGdldEF1dGhlbnRpY2l0eVRva2VuKCk7XG4gICAgaGVhZGVyc1tBVVRIRU5USUNJVFlfVE9LRU5fSEVBREVSXSA9IHRva2VuO1xuICB9XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZW5kcG9pbnQsIHtcbiAgICBtZXRob2QsXG4gICAgYm9keSxcbiAgICBoZWFkZXJzLFxuICB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBOZXR3b3JrRXJyb3IoXG4gICAgICByZXNwb25zZS5zdGF0dXMgKyAnICcgKyByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgcmVzcG9uc2VcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG4vKipcbiAqIFBlcmZvcm1zIGEgR0VUIHJlcXVlc3QgdG8gdGhlIGdpdmVuIGVuZHBvaW50LiBVc2Uge0BsaW5rIGZldGNoSnNvbn1cbiAqIHRvIGF1dG9tYXRpY2FsbHkgdW53cmFwIHRoZSByZXNwb25zZSBKU09OIGFzIGEgdHlwZWQgb2JqZWN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXQoXG4gIGVuZHBvaW50OiBzdHJpbmcsXG4gIHVzZUF1dGhlbnRpY2l0eVRva2VuID0gZmFsc2UsXG4gIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICByZXR1cm4gc2VuZFJlcXVlc3QoJ0dFVCcsIGVuZHBvaW50LCB1bmRlZmluZWQsIHVzZUF1dGhlbnRpY2l0eVRva2VuLCBoZWFkZXJzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHV0KFxuICBlbmRwb2ludDogc3RyaW5nLFxuICBib2R5Pzogc3RyaW5nLFxuICB1c2VBdXRoZW50aWNpdHlUb2tlbiA9IGZhbHNlLFxuICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgcmV0dXJuIHNlbmRSZXF1ZXN0KCdQVVQnLCBlbmRwb2ludCwgYm9keSwgdXNlQXV0aGVudGljaXR5VG9rZW4sIGhlYWRlcnMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwb3N0KFxuICBlbmRwb2ludDogc3RyaW5nLFxuICBib2R5Pzogc3RyaW5nLFxuICB1c2VBdXRoZW50aWNpdHlUb2tlbiA9IGZhbHNlLFxuICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgcmV0dXJuIHNlbmRSZXF1ZXN0KCdQT1NUJywgZW5kcG9pbnQsIGJvZHksIHVzZUF1dGhlbnRpY2l0eVRva2VuLCBoZWFkZXJzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlUmVxdWVzdChcbiAgZW5kcG9pbnQ6IHN0cmluZyxcbiAgdXNlQXV0aGVudGljaXR5VG9rZW4gPSBmYWxzZSxcbiAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIHJldHVybiBzZW5kUmVxdWVzdChcbiAgICAnREVMRVRFJyxcbiAgICBlbmRwb2ludCxcbiAgICB1bmRlZmluZWQsXG4gICAgdXNlQXV0aGVudGljaXR5VG9rZW4sXG4gICAgaGVhZGVyc1xuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGRlbGV0ZTogZGVsZXRlUmVxdWVzdCxcbiAgZmV0Y2hKc29uLFxuICBwb3N0LFxuICBwdXQsXG4gIGdldCxcbn07XG4iXSwibmFtZXMiOlsiY2FuQ2hhbmdlTGV2ZWxJblBhZ2UiLCJjdXJyZW50TGV2ZWwiLCJuZXdMZXZlbCIsIlVSTCIsImRvY3VtZW50IiwibG9jYXRpb24iLCJwYXRobmFtZSIsInNwbGl0IiwiaW5jbHVkZXMiLCJ1c2VzTGFiMiIsInNldHVwTmF2aWdhdGlvbkhhbmRsZXIiLCJpbml0aWFsTGV2ZWxJZCIsIndpbmRvdyIsImhpc3RvcnkiLCJyZXBsYWNlU3RhdGUiLCJsZXZlbElkIiwiYWRkRXZlbnRMaXN0ZW5lciIsImV2ZW50IiwiX2V2ZW50JHN0YXRlIiwic3RhdGUiLCJub3RpZnlMZXZlbENoYW5nZSIsImdldFN0b3JlIiwiZGlzcGF0Y2giLCJzZXRDdXJyZW50TGV2ZWxJZCIsInVwZGF0ZUJyb3dzZXJGb3JMZXZlbE5hdmlnYXRpb24iLCJwcm9ncmVzc1N0b3JlU3RhdGUiLCJsZXZlbFBhdGgiLCJwdXNoU3RhdGUiLCJzZWFyY2giLCJzZXRXaW5kb3dUaXRsZSIsIl9wcm9ncmVzc1JlZHV4IiwicmVxdWlyZSIsIl9ub3RpZnlMZXZlbENoYW5nZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJlIiwiX19lc01vZHVsZSIsIl9yZWR1eCIsIm5ld0xldmVsSWQiLCJsZXNzb24iLCJsZXNzb25zIiwiZmluZCIsImlkIiwiY3VycmVudExlc3NvbklkIiwibnVtTGVzc29ucyIsIm51bV9zY3JpcHRfbGVzc29ucyIsImxlc3Nvbk5hbWUiLCJuYW1lIiwibGVzc29uSW5kZXgiLCJsZXZlbHMiLCJmaW5kSW5kZXgiLCJsZXZlbCIsImFjdGl2ZUlkIiwic2NyaXB0RGlzcGxheU5hbWUiLCJ0aXRsZSIsImNvbmNhdCIsIl9sb2Rhc2giLCJfY29uc3RhbnRzIiwiX3Byb2dyZXNzSGVscGVycyIsIl9zaGFyZWRDb25zdGFudHMiLCJfYWN0aXZpdHlVdGlscyIsIl90eXBlb2YiLCJvIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJjb25zdHJ1Y3RvciIsInByb3RvdHlwZSIsIl90b0NvbnN1bWFibGVBcnJheSIsInIiLCJfYXJyYXlXaXRob3V0SG9sZXMiLCJBcnJheSIsImlzQXJyYXkiLCJfYXJyYXlMaWtlVG9BcnJheSIsIl9pdGVyYWJsZVRvQXJyYXkiLCJmcm9tIiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwiYSIsInQiLCJ0b1N0cmluZyIsImNhbGwiLCJzbGljZSIsInRlc3QiLCJfbm9uSXRlcmFibGVTcHJlYWQiLCJUeXBlRXJyb3IiLCJsZW5ndGgiLCJuIiwib3duS2V5cyIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiX3RvUHJvcGVydHlLZXkiLCJpIiwiX3RvUHJpbWl0aXZlIiwidG9QcmltaXRpdmUiLCJTdHJpbmciLCJOdW1iZXIiLCJ2YWx1ZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiZXhwb3J0cyIsImhhc0xvY2thYmxlTGVzc29ucyIsInNvbWUiLCJsb2NrYWJsZSIsImhhc0dyb3VwcyIsImdyb3VwZWRMZXNzb25zIiwiZ2V0Q3VycmVudExlc3NvbiIsIl9zdGF0ZSRwcm9ncmVzcyRsZXNzbyIsInByb2dyZXNzIiwibCIsImxlc3NvbkZyb21MZXNzb25BdEluZGV4IiwibGVzc29uRnJvbUxlc3NvbiIsImlzRm9jdXNBcmVhIiwiZm9jdXNBcmVhTGVzc29uSWRzIiwiXyIsInBpY2siLCJwZWVyUmV2aWV3TGVzc29uIiwibWFwIiwiaW5kZXgiLCJwZWVyUmV2aWV3TGVzc29uSW5mbyIsInBlZXJSZXZpZXdMZXZlbHMiLCJpc0xvY2tlZCIsImxvY2tlZCIsInN0YXR1cyIsIkxldmVsU3RhdHVzIiwibm90X3RyaWVkIiwibGV2ZWxOdW1iZXIiLCJQcm9ncmVzc0xldmVsVHlwZSIsIlNDUklQVF9MRVZFTCIsIkxFVkVMIiwiZ2V0UHJvZ3Jlc3NMZXZlbFR5cGUiLCJjdXJyZW50TGV2ZWxJZCIsImxldmVsV2l0aFByb2dyZXNzIiwiZ2V0TGV2ZWxQcm9wZXJ0aWVzUGF0aCIsIl9zdGF0ZSRwcm9ncmVzcyRsZXNzbzIiLCJsZXZlbFBvc2l0aW9uIiwic3VibGV2ZWxQb3NpdGlvbiIsInNjcmlwdE5hbWUiLCJsZXNzb25Qb3NpdGlvbiIsInJlbGF0aXZlX3Bvc2l0aW9uIiwiZ2V0Q3VycmVudExldmVsIiwicGFyZW50TGV2ZWxJZCIsImxldmVsQnlJZCIsInVuZGVmaW5lZCIsImdldFVzZXJBcHBPcHRpb25zUGF0aCIsIl9zdGF0ZSRwcm9ncmVzcyRsZXNzbzMiLCJfcmVmIiwiaXNMb2NrYWJsZSIsIl9sZXZlbFByb2dyZXNzIiwiX2xldmVsJGlkcyIsIl9sZXZlbCRzdWJsZXZlbHMiLCJsZXZlbFJlc3VsdHMiLCJ1bml0UHJvZ3Jlc3MiLCJfcmVmJGxldmVsUGFpcmluZyIsImxldmVsUGFpcmluZyIsIm5vcm1hbGl6ZWRMZXZlbCIsInByb2Nlc3NlZExldmVsIiwiaWRzIiwiYmVzdFJlc3VsdExldmVsSWQiLCJsZXZlbElkcyIsInByb2dyZXNzRGF0YSIsImF0dGVtcHRlZElkcyIsImJlc3RJZCIsImJlc3RSZXN1bHQiLCJyZXN1bHQiLCJ0ZWFjaGVyRmVlZGJhY2tSZXZpZXdTdGF0ZSIsImxldmVsUHJvZ3Jlc3MiLCJwYWdlcyIsInBhZ2VOdW1iZXIiLCJraW5kIiwiTGV2ZWxLaW5kIiwiYXNzZXNzbWVudCIsImFjdGl2aXR5Q3NzQ2xhc3MiLCJpc0N1cnJlbnQiLCJpc0N1cnJlbnRMZXZlbCIsInBhaXJlZCIsInN1YmxldmVscyIsInN1YmxldmVsIiwibGV2ZWxzQnlMZXNzb24iLCJfcmVmMiIsImxldmVsc0Zvckxlc3NvbklkIiwibGVzc29uSWQiLCJfc3RhdGUkbGVzc29ucyIsIl9sZXZlbHNGb3JMZXNzb25JZCIsIl9sZXZlbHNGb3JMZXNzb25JZCRmbCIsImZsYXRNYXAiLCJfZ2V0Q3VycmVudExldmVscyIsIl9nZXRDdXJyZW50TGV2ZWxzJGZsYSIsImdldEN1cnJlbnRMZXZlbHMiLCJnZXRDdXJyZW50U2NyaXB0TGV2ZWxJZCIsIl9sZXZlbEJ5SWQiLCJzY3JpcHRMZXZlbElkIiwibmV4dExldmVsSWQiLCJjdXJyZW50TGV2ZWxJbmRleCIsImxldmVsQ291bnQiLCJsZXNzb25FeHRyYXNVcmwiLCJsZXNzb25FeHRyYXNFbmFibGVkIiwibGVzc29uX2V4dHJhc19sZXZlbF91cmwiLCJpc1BlcmZlY3QiLCJUZXN0UmVzdWx0cyIsIk1JTklNVU1fT1BUSU1BTF9SRVNVTFQiLCJpbmNsdWRlQm9udXNMZXZlbHMiLCJieUdyb3VwIiwiYWxsTGV2ZWxzIiwibGVzc29uR3JvdXBzIiwibGVzc29uR3JvdXAiLCJkaXNwbGF5X25hbWUiLCJ1c2VyRmFjaW5nIiwidXNlcl9mYWNpbmciLCJkaXNwbGF5TmFtZSIsImRlc2NyaXB0aW9uIiwiYmlnUXVlc3Rpb25zIiwiYmlnX3F1ZXN0aW9ucyIsImdyb3VwIiwibGVzc29uX2dyb3VwX2Rpc3BsYXlfbmFtZSIsImxlc3NvbkF0SW5kZXgiLCJsZXNzb25MZXZlbHMiLCJib251cyIsInZhbHVlcyIsInByb2dyZXNzaW9uc0Zyb21MZXZlbHMiLCJwcm9ncmVzc2lvbnMiLCJjdXJyZW50UHJvZ3Jlc3Npb24iLCJzdGFydCIsInByb2dyZXNzaW9uIiwicHJvZ3Jlc3Npb25EaXNwbGF5TmFtZSIsInZlcmlmaWVkSW5zdHJ1Y3RvciIsImluaXRpYWxTdGF0ZSIsImFjdGlvbiIsInR5cGUiLCJTRVRfVkVSSUZJRUQiLCJpc1ZlcmlmaWVkIiwiU0VUX1ZFUklGSUVEX1JFU09VUkNFUyIsImhhc1ZlcmlmaWVkUmVzb3VyY2VzIiwic2V0VmVyaWZpZWQiLCJzZXRWZXJpZmllZFJlc291cmNlcyIsImlzSUUiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJpbmRleE9mIiwiaXNJRTExIiwiSUVWZXJzaW9uIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJpc0Nocm9tZSIsImNocm9tZVZlcnNpb24iLCJpc1NhZmFyaSIsInNhZmFyaVZlcnNpb24iLCJpc0ZpcmVmb3giLCJmaXJlZm94VmVyc2lvbiIsIk1TSW5wdXRNZXRob2RDb250ZXh0IiwiZG9jdW1lbnRNb2RlIiwiZ2V0QnJvd3Nlck5hbWUiLCJpbmNsdWRlVmVyc2lvbiIsImlzTW9iaWxlRGV2aWNlIiwiY2hlY2siLCJzdWJzdHIiLCJ2ZW5kb3IiLCJvcGVyYSIsImlzU3RvcmFnZUF2YWlsYWJsZSIsInN0b3JhZ2UiLCJ4Iiwic2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJpc1Vuc3VwcG9ydGVkQnJvd3NlciIsImlzVW5zdXBwb3J0ZWRJRSIsImlzVW5zdXBwb3J0ZWRDaHJvbWUiLCJpc1Vuc3VwcG9ydGVkU2FmYXJpIiwiaXNVbnN1cHBvcnRlZEZpcmVmb3giLCJuYXZpZ2F0ZVRvTmV4dExldmVsIiwiZ2V0U3RhdGUiLCJuYXZpZ2F0ZVRvTGV2ZWxJZCIsInNlbmRTdWNjZXNzUmVwb3J0IiwiYXBwVHlwZSIsInNlbmRSZXBvcnRIZWxwZXIiLCJBTExfUEFTUyIsInNlbmRQcm9ncmVzc1JlcG9ydCIsImRlZXBlckxlYXJuaW5nQ291cnNlIiwic2F2ZUFuc3dlcnNCZWZvcmVOYXZpZ2F0aW9uIiwic2NyaXB0SWQiLCJ2aWV3QXNVc2VySWQiLCJ1bml0VGl0bGUiLCJjb3Vyc2VJZCIsImlzTGVzc29uRXh0cmFzIiwidW5pdFByb2dyZXNzSGFzTG9hZGVkIiwicGVlclJldmlld3NQZXJmb3JtZWQiLCJwb3N0TWlsZXN0b25lRGlzYWJsZWQiLCJpc0FnZTEzUmVxdWlyZWQiLCJzdHVkZW50RGVmYXVsdHNTdW1tYXJ5VmlldyIsImlzU3VtbWFyeVZpZXciLCJpc01pbmlWaWV3IiwiaGFzRnVsbFByb2dyZXNzIiwidXNpbmdEYlByb2dyZXNzIiwiY3VycmVudFBhZ2VOdW1iZXIiLCJQVVpaTEVfUEFHRV9OT05FIiwiY291cnNlVmVyc2lvbklkIiwidW5pdERlc2NyaXB0aW9uIiwidW5pdFN0dWRlbnREZXNjcmlwdGlvbiIsImNoYW5nZUZvY3VzQXJlYVBhdGgiLCJ1bml0Q29tcGxldGVkIiwicHJvZ3Jlc3NTbGljZSIsImNyZWF0ZVNsaWNlIiwicmVkdWNlcnMiLCJpbml0UHJvZ3Jlc3MiLCJwYXlsb2FkIiwicHJvY2Vzc2VkTGVzc29ucyIsImlzRnVsbFByb2dyZXNzIiwic2V0U2NyaXB0UHJvZ3Jlc3MiLCJwcm9jZXNzU2VydmVyU3R1ZGVudFByb2dyZXNzIiwiY2xlYXJSZXN1bHRzIiwidXNlRGJQcm9ncmVzcyIsIm1lcmdlUmVzdWx0cyIsIm5ld0xldmVsUmVzdWx0cyIsImtleSIsInBhcnNlSW50IiwibWVyZ2VBY3Rpdml0eVJlc3VsdCIsIm92ZXJ3cml0ZVJlc3VsdHMiLCJtZXJnZVBlZXJSZXZpZXdQcm9ncmVzcyIsInVwZGF0ZUZvY3VzQXJlYSIsInJlZHVjZXIiLCJwcmVwYXJlIiwiZGlzYWJsZVBvc3RNaWxlc3RvbmUiLCJzZXRJc0FnZTEzUmVxdWlyZWQiLCJzZXRJc1N1bW1hcnlWaWV3Iiwic2V0SXNNaW5pVmlldyIsInNldFN0dWRlbnREZWZhdWx0c1N1bW1hcnlWaWV3Iiwic2V0Q3VycmVudExlc3NvbklkIiwic2V0U2NyaXB0Q29tcGxldGVkIiwic2V0TGVzc29uRXh0cmFzRW5hYmxlZCIsInNldFZpZXdBc1VzZXJJZCIsImV4dHJhUmVkdWNlcnMiLCJTRVRfVklFV19UWVBFIiwidmlld1R5cGUiLCJWaWV3VHlwZSIsIlBhcnRpY2lwYW50IiwicGF0aCIsImdldEluc3RhbmNlIiwiZ2V0UHJvamVjdE1hbmFnZXIiLCJjbGVhblVwIiwidXJsIiwiZ2V0QnViYmxlVXJsIiwibmF2aWdhdGVUb0hyZWYiLCJleHRyYURhdGEiLCJQcm9taXNlIiwicmVzb2x2ZSIsImRhdGEiLCJhcHAiLCJ0ZXN0UmVzdWx0IiwiZmV0Y2giLCJtZXRob2QiLCJoZWFkZXJzIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0aGVuIiwicmVzcG9uc2UiLCJvayIsInF1ZXJ5VXNlclByb2dyZXNzIiwidXNlcklkIiwibWVyZ2VQcm9ncmVzcyIsInVzZXJQcm9ncmVzc0Zyb21TZXJ2ZXIiLCJzZW5kUHJlZGljdExldmVsUmVwb3J0IiwiY3JlYXRlQXN5bmNUaHVuayIsInRodW5rQVBJIiwiZXh0cmFQYXlsb2FkIiwicHJvZ3JhbSIsInByZWRpY3RSZXNwb25zZSIsIkNPTlRBSU5FRF9MRVZFTF9SRVNVTFQiLCJzZW5kU3VibWl0UmVwb3J0Iiwic3VibWl0dGVkIiwiU1VCTUlUVEVEX1JFU1VMVCIsIlVOU1VCTUlUVEVEX0FUVEVNUFQiLCJjdXJyZW50VXNlciIsIm1lc3NhZ2UiLCJFcnJvciIsImFqYXgiLCJ1c2VyX2lkIiwiZG9uZSIsImlzRW1wdHkiLCJpc1ZlcmlmaWVkSW5zdHJ1Y3RvciIsIm9uT3ZlcnZpZXdQYWdlIiwiaXNJbnN0cnVjdG9yIiwidGVhY2hlclZpZXdpbmdTdHVkZW50IiwiYXV0aG9yaXplTG9ja2FibGUiLCJsb2NrYWJsZUF1dGhvcml6ZWQiLCJjb21wbGV0ZWQiLCJtYXBWYWx1ZXMiLCJnZXRMZXZlbFJlc3VsdCIsImN1cnJlbnRfbGVzc29uIiwiaXNQbGMiLCJudW1MZXNzb25zV2l0aExlc3NvblBsYW4iLCJsZXNzb25OdW1iZXIiLCJudW1iZXJlZExlc3NvbiIsIm9taXQiLCJhY3Rpb25zIiwiX190ZXN0b25seV9fIiwiaW5pdGlhbFByb3BlcnRpZXMiLCJjb21tb25Qcm9wZXJ0aWVzIiwidGhpcyIsInVwZGF0ZVByb3BlcnRpZXMiLCJwcm9wZXJ0aWVzIiwibG9nSW5mbyIsImRlY29yYXRlTWVzc2FnZSIsImxvZ1dhcm5pbmciLCJsb2dFcnJvciIsImVycm9yTWVzc2FnZSIsImVycm9yIiwiZGV0YWlscyIsInN0YWNrIiwicmVwb3J0TG9hZFRpbWUiLCJtZXRyaWNOYW1lIiwibG9hZFRpbWVNcyIsImRpbWVuc2lvbnMiLCJwdWJsaXNoTWV0cmljIiwiZ2V0Q29tbW9uRGltZW5zaW9ucyIsInVuaXQiLCJpbmNyZW1lbnRDb3VudGVyIiwicmVwb3J0U2V2ZXJlRXJyb3IiLCJyZXNldCIsImFwcE5hbWUiLCJwcm9qZWN0TWFuYWdlciIsIm1ldHJpY3NSZXBvcnRlciIsImxpZmVjeWNsZU5vdGlmaWVyIiwiTGFiMlJlZ2lzdHJ5IiwiX2luc3RhbmNlIiwiY3JlYXRlIiwiaGFzRW5hYmxlZFByb2plY3RzIiwic2V0UHJvamVjdE1hbmFnZXIiLCJjbGVhclByb2plY3RNYW5hZ2VyIiwiZ2V0TWV0cmljc1JlcG9ydGVyIiwiZ2V0TGlmZWN5Y2xlTm90aWZpZXIiLCJzZXRBcHBOYW1lIiwiZ2V0QXBwTmFtZSIsIkxpZmVjeWNsZUV2ZW50IiwibGlzdGVuZXJzIiwiYWRkTGlzdGVuZXIiLCJjYWxsYmFjayIsInJlbW92ZUxpc3RlbmVyIiwic3BsaWNlIiwibm90aWZ5IiwiYXJncyIsIkxpZmVjeWNsZU5vdGlmaWVyIiwicHJldmlvdXNMZXZlbElkIiwiTGV2ZWxDaGFuZ2VSZXF1ZXN0ZWQiLCJzZW5kTG9ncyIsImxvZ3MiLCJwb3N0IiwiQkFTRV9VUkwiLCJzZW5kTWV0cmljRGF0YSIsIm1ldHJpY0RhdGEiLCJtZXRyaWNzQXBpIiwibGFzdENoZWNrQ2FuUmVwb3J0VGltZSIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJzaG91bGRSZXBvcnQiLCJsb2ciLCJjb25zb2xlIiwid2FybiIsIm1ldHJpYyIsImdldERldmljZURpbWVuc2lvbnMiLCJzZW5kTWV0cmljcyIsImdldEJyb3dzZXJWZXJzaW9uRGltZW5zaW9uIiwiaW5mbyIsImRldmljZUluZm8iLCJnZXREZXZpY2VJbmZvIiwiaXNSZXBvcnRpbmdFbmFibGVkIiwiZmFsbGJhY2tMb2ciLCJoYW5kbGVFcnJvciIsIm1ldHJpY3MiLCJzZXRSZXBvcnRpbmdEaXNhYmxlZCIsInVzZXJfYWdlbnQiLCJ3aW5kb3dfd2lkdGgiLCJpbm5lcldpZHRoIiwid2luZG93X2hlaWdodCIsImlubmVySGVpZ2h0IiwiaG9zdG5hbWUiLCJmdWxsX3BhdGgiLCJocmVmIiwiaXNEZXZlbG9wbWVudEVudmlyb25tZW50IiwiRGF0ZSIsIm5vdyIsIkNIRUNLX0NBTl9SRVBPUlRfSU5URVJWQUxfTUlOVVRFUyIsIk1ldHJpY3NSZXBvcnRlciIsIlJldmlld1N0YXRlcyIsImtlZXBXb3JraW5nIiwiYXdhaXRpbmdSZXZpZXciLCJJbnN0cnVjdG9yIiwiZ2V0QXV0aGVudGljaXR5VG9rZW4iLCJhdXRoZW50aWNpdHlUb2tlbiIsInJlZnJlc2hUb2tlbiIsInRva2VuIiwidG9rZW5Db250YWluZXIiLCJxdWVyeVNlbGVjdG9yIiwiY29udGVudCIsImdldCIsIkFVVEhFTlRJQ0lUWV9UT0tFTl9IRUFERVIiLCJpc05ldHdvcmtFcnJvciIsIk5ldHdvcmtFcnJvciIsInNldFByb3RvdHlwZU9mIiwiZ2V0RGV0YWlscyIsInN0YXR1c1RleHQiLCJzZW5kUmVxdWVzdCIsImVuZHBvaW50IiwidXNlQXV0aGVudGljaXR5VG9rZW4iLCJkZWxldGUiLCJkZWxldGVSZXF1ZXN0IiwiZmV0Y2hKc29uIiwiaW5pdCIsInZhbGlkYXRvciIsImpzb24iLCJwdXQiXSwic291cmNlUm9vdCI6IiJ9