-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy path3419.e1f20bb2.iframe.bundle.js
2 lines (2 loc) · 178 KB
/
3419.e1f20bb2.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","title","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,unitHasUnnumberedLessons:!1,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.unitHasUnnumberedLessons=action.payload.unitHasUnnumberedLessons,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"}}}]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QiwyQkFDekIsRUFDRixnQkEzTEEsR0E2TEEsZ0JBQWUsSUFBSUksZ0JBQWdCLElBQUksOEIsa01Dbk4xQixRQUFBN0wsa0JBQW9CLEVBNkdwQixRQUFBOEwsYUFBZSxDQUMxQmxHLFVBQVcsWUFDWG1HLFlBQWEsY0FDYkMsZUFBZ0Isa0JBMkJMLFFBQUF4SixTQUFXLENBQ3RCQyxZQUFhLGNBQ2J3SixXQUFZLGEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja2x5LW1vb2MvLi9zcmMvY29kZS1zdHVkaW8vYnJvd3Nlck5hdmlnYXRpb24uanMiLCJ3ZWJwYWNrOi8vYmxvY2tseS1tb29jLy4vc3JjL2NvZGUtc3R1ZGlvL3Byb2dyZXNzUmVkdXhTZWxlY3RvcnMuanMiLCJ3ZWJwYWNrOi8vYmxvY2tseS1tb29jLy4vc3JjL2NvZGUtc3R1ZGlvL3ZlcmlmaWVkSW5zdHJ1Y3RvclJlZHV4LmpzIiwid2VicGFjazovL2Jsb2NrbHktbW9vYy8uL3NyYy91dGlsL2Jyb3dzZXItZGV0ZWN0b3IuanMiLCJ3ZWJwYWNrOi8vYmxvY2tseS1tb29jLy4vc3JjL2NvZGUtc3R1ZGlvL3Byb2dyZXNzUmVkdXgudHMiLCJ3ZWJwYWNrOi8vYmxvY2tseS1tb29jLy4vc3JjL2xhYjIvTGFiMk1ldHJpY3NSZXBvcnRlci50cyIsIndlYnBhY2s6Ly9ibG9ja2x5LW1vb2MvLi9zcmMvbGFiMi9MYWIyUmVnaXN0cnkudHMiLCJ3ZWJwYWNrOi8vYmxvY2tseS1tb29jLy4vc3JjL2xhYjIvdXRpbHMvTGlmZWN5Y2xlTm90aWZpZXIudHN4Iiwid2VicGFjazovL2Jsb2NrbHktbW9vYy8uL3NyYy9sYWIyL3V0aWxzL25vdGlmeUxldmVsQ2hhbmdlLnRzIiwid2VicGFjazovL2Jsb2NrbHktbW9vYy8uL3NyYy9tZXRyaWNzL0Rhc2hib2FyZE1ldHJpY3NBcGkudHMiLCJ3ZWJwYWNrOi8vYmxvY2tseS1tb29jLy4vc3JjL21ldHJpY3MvTWV0cmljc1JlcG9ydGVyLnRzIiwid2VicGFjazovL2Jsb2NrbHktbW9vYy8uL3NyYy90eXBlcy9wcm9ncmVzc1R5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGJyb3dzZXJOYXZpZ2F0aW9uXG4vL1xuLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHNvbWUgZnVuY3Rpb25hbGl0eSByZWxhdGVkIHRvIG5hdmlnYXRpbmcgdGhyb3VnaFxuLy8gbGV2ZWxzIHdpdGhvdXQgZG9pbmcgcGFnZSByZWxvYWRzLlxuXG5pbXBvcnQge3NldEN1cnJlbnRMZXZlbElkfSBmcm9tICdAY2RvL2FwcHMvY29kZS1zdHVkaW8vcHJvZ3Jlc3NSZWR1eCc7XG5cbmltcG9ydCBub3RpZnlMZXZlbENoYW5nZSBmcm9tICcuLi9sYWIyL3V0aWxzL25vdGlmeUxldmVsQ2hhbmdlJztcbmltcG9ydCB7Z2V0U3RvcmV9IGZyb20gJy4uL3JlZHV4JztcblxuLy8gUmV0dXJucyB3aGV0aGVyIHdlIGNhbiBzYWZlbHkgbmF2aWdhdGUgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIGxldmVsc1xuLy8gd2l0aG91dCByZWxvYWRpbmcgdGhlIHdob2xlIHBhZ2UuXG5leHBvcnQgZnVuY3Rpb24gY2FuQ2hhbmdlTGV2ZWxJblBhZ2UoY3VycmVudExldmVsLCBuZXdMZXZlbCkge1xuICAvLyBJZiB3ZSBhcmUgb24gdGhlIHN1bW1hcnkgcGFnZSwgd2UgY2FuJ3QgbmF2aWdhdGUgdG8gYSBuZXcgbGV2ZWwgd2l0aG91dFxuICAvLyByZWxvYWRpbmcgdGhlIHBhZ2UuIFN1bW1hcnkgaXMgdXNlZCBmb3Igdmlld2luZyBzdHVkZW50IHJlc3BvbnNlcyB0b1xuICAvLyBwcmVkaWN0IGxldmVscy5cbiAgY29uc3QgcGF0aCA9IG5ldyBVUkwoZG9jdW1lbnQubG9jYXRpb24pLnBhdGhuYW1lO1xuICBjb25zdCBwYXRoQ29tcG9uZW50cyA9IHBhdGguc3BsaXQoJy8nKTtcbiAgaWYgKHBhdGhDb21wb25lbnRzLmluY2x1ZGVzKCdzdW1tYXJ5JykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gT3RoZXJ3aXNlLCB3ZSBjYW4gbmF2aWdhdGUgYmV0d2VlbiBhbnkgMiBsYWIyIGxldmVscy5cbiAgcmV0dXJuIGN1cnJlbnRMZXZlbD8udXNlc0xhYjIgJiYgbmV3TGV2ZWw/LnVzZXNMYWIyO1xufVxuXG4vLyBDYWxsZWQgb25jZSBvbiBwYWdlIGxvYWQgZm9yIGEgc2NyaXB0LWxldmVsIG9ubHksIHRoaXMgc2V0cyB1cCBhXG4vLyBoYW5kbGVyLCBmb3IgdXNlci1pbml0aWF0ZWQgYnJvd3NlciBiYWNrICYgZm9yd2FyZCBidXR0b25cbi8vIHByZXNzZXMsIHdoaWNoIGlzIGZpcmVkIHdoZW4gYXJyaXZpbmcgb24gYSBwYWdlIHRoYXQgd2UgcHVzaGVkIG9udG8gdGhlXG4vLyBicm93c2VyIHNlc3Npb24gaGlzdG9yeSBzdGFjay5cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cE5hdmlnYXRpb25IYW5kbGVyKGluaXRpYWxMZXZlbElkKSB7XG4gIC8vIFN0b3JlIHRoZSBzdGFydGluZyBsZXZlbCBJRCBpbiB0aGUgYnJvd3NlciBoaXN0b3J5IHN0YWNrLlxuICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe2xldmVsSWQ6IGluaXRpYWxMZXZlbElkfSwgJycpO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9wc3RhdGUnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBjb25zdCBsZXZlbElkID0gZXZlbnQuc3RhdGU/LmxldmVsSWQ7XG4gICAgaWYgKCFsZXZlbElkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIE5vdGlmeSB0aGUgTGFiMiBzeXN0ZW0gKHRoYXQgaGFuZGxlcyBjaGFuZ2luZyBsZXZlbHMgd2l0aG91dCByZWxvYWQpIGFib3V0IHRoZSBsZXZlbCBjaGFuZ2UuXG4gICAgLy8gVGhlIGJyb3dzZXIgaGlzdG9yeSBBUEkgZG9lcyBub3QgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHN0YXRlIG9mIHRoZSBwYWdlIHdlIGp1c3QgY2FtZSBmcm9tLFxuICAgIC8vIHNvIHdlIGRvbid0IGtub3cgdGhlIHByZXZpb3VzIGxldmVsIElELlxuICAgIG5vdGlmeUxldmVsQ2hhbmdlKG51bGwsIGxldmVsSWQpO1xuICAgIGdldFN0b3JlKCkuZGlzcGF0Y2goc2V0Q3VycmVudExldmVsSWQobGV2ZWxJZCkpO1xuICB9KTtcbn1cblxuLy8gSGFuZGxlcyBhIHVzZXIgbmF2aWdhdGlvbiB0byBhIG5ldyBsZXZlbCwgYnkgcHVzaGluZyB0aGlzIG5ldyBsZXZlbCdzIFVSTFxuLy8gb250byB0aGUgYnJvd3NlciBzZXNzaW9uIGhpc3Rvcnkgc3RhY2ssIGFuZCB1cGRhdGluZyB0aGUgd2luZG93IHRpdGxlLlxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUJyb3dzZXJGb3JMZXZlbE5hdmlnYXRpb24oXG4gIHByb2dyZXNzU3RvcmVTdGF0ZSxcbiAgbGV2ZWxQYXRoLFxuICBsZXZlbElkXG4pIHtcbiAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKHtsZXZlbElkfSwgJycsIGxldmVsUGF0aCArIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICBzZXRXaW5kb3dUaXRsZShwcm9ncmVzc1N0b3JlU3RhdGUsIGxldmVsSWQpO1xufVxuXG4vLyBJZiB3ZSBhcmUgb24gYSBuZXcgbGV2ZWwgd2l0aG91dCBkb2luZyBhIHBhZ2UgcmVsb2FkLCB0aGVuIHdlIHNob3VsZCBzZXQgdGhlIHRpdGxlXG4vLyB0byBtYXRjaCB3aGF0IGxldmVsc19oZWxwZXIucmIncyBsZXZlbF90aXRsZSBmdW5jdGlvbiB3b3VsZCBoYXZlIGRvbmUuXG5leHBvcnQgZnVuY3Rpb24gc2V0V2luZG93VGl0bGUocHJvZ3Jlc3NTdG9yZVN0YXRlLCBuZXdMZXZlbElkKSB7XG4gIGNvbnN0IGxlc3NvbiA9IHByb2dyZXNzU3RvcmVTdGF0ZS5sZXNzb25zLmZpbmQoXG4gICAgbGVzc29uID0+IGxlc3Nvbi5pZCA9PT0gcHJvZ3Jlc3NTdG9yZVN0YXRlLmN1cnJlbnRMZXNzb25JZFxuICApO1xuICBjb25zdCBudW1MZXNzb25zID0gbGVzc29uLm51bV9zY3JpcHRfbGVzc29ucztcbiAgY29uc3QgbGVzc29uTmFtZSA9IGxlc3Nvbi5uYW1lO1xuICBjb25zdCBsZXNzb25JbmRleCA9XG4gICAgbGVzc29uLmxldmVscy5maW5kSW5kZXgobGV2ZWwgPT4gbGV2ZWwuYWN0aXZlSWQgPT09IG5ld0xldmVsSWQpICsgMTtcbiAgY29uc3Qgc2NyaXB0RGlzcGxheU5hbWUgPSBwcm9ncmVzc1N0b3JlU3RhdGUuc2NyaXB0RGlzcGxheU5hbWU7XG5cbiAgZG9jdW1lbnQudGl0bGUgPVxuICAgIG51bUxlc3NvbnMgPiAxXG4gICAgICA/IGAke2xlc3Nvbk5hbWV9ICMke2xlc3NvbkluZGV4fSB8ICR7c2NyaXB0RGlzcGxheU5hbWV9IC0gQ29kZS5vcmdgXG4gICAgICA6IGAke2xlc3Nvbk5hbWV9ICMke2xlc3NvbkluZGV4fSAtIENvZGUub3JnYDtcbn1cbiIsIi8vIFNlbGVjdG9ycyBhbmQgcmVsYXRlZCBoZWxwZXJzIGZvciBwcm9ncmVzc1JlZHV4LiBUaGVzZSBhcmUgaW4gdGhlaXIgb3duIGZpbGVcbi8vIGJlY2F1c2UgdGhleSBhcmUgcXVpdGUgY29tcGxleCBhbmQgcHJvZ3Jlc3NSZWR1eC5qcyBpcyBhbHJlYWR5IHF1aXRlIGxhcmdlLlxuXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQge1Rlc3RSZXN1bHRzfSBmcm9tICdAY2RvL2FwcHMvY29uc3RhbnRzJztcbmltcG9ydCB7cHJvY2Vzc2VkTGV2ZWx9IGZyb20gJ0BjZG8vYXBwcy90ZW1wbGF0ZXMvcHJvZ3Jlc3MvcHJvZ3Jlc3NIZWxwZXJzJztcbmltcG9ydCB7TGV2ZWxTdGF0dXMsIExldmVsS2luZH0gZnJvbSAnQGNkby9nZW5lcmF0ZWQtc2NyaXB0cy9zaGFyZWRDb25zdGFudHMnO1xuXG5pbXBvcnQge2FjdGl2aXR5Q3NzQ2xhc3N9IGZyb20gJy4vYWN0aXZpdHlVdGlscyc7XG5cbmNvbnN0IFBFRVJfUkVWSUVXX0lEID0gLTE7XG5cbi8vIFNlbGVjdG9yc1xuXG4vLyBEbyB3ZSBoYXZlIG9uZSBvciBtb3JlIGxvY2thYmxlIGxlc3NvbnNcbmV4cG9ydCBjb25zdCBoYXNMb2NrYWJsZUxlc3NvbnMgPSBzdGF0ZSA9PlxuICBzdGF0ZS5sZXNzb25zLnNvbWUobGVzc29uID0+IGxlc3Nvbi5sb2NrYWJsZSk7XG5cbmV4cG9ydCBjb25zdCBoYXNHcm91cHMgPSBzdGF0ZSA9PiBPYmplY3Qua2V5cyhncm91cGVkTGVzc29ucyhzdGF0ZSkpLmxlbmd0aCA+IDE7XG5cbmV4cG9ydCBjb25zdCBnZXRDdXJyZW50TGVzc29uID0gc3RhdGUgPT5cbiAgc3RhdGUucHJvZ3Jlc3MubGVzc29ucz8uZmluZChsID0+IGwuaWQgPT09IHN0YXRlLnByb2dyZXNzLmN1cnJlbnRMZXNzb25JZCk7XG5cbi8qKlxuICogRXh0cmFjdCB0aGUgcmVsZXZhbnQgcG9ydGlvbnMgb2YgYSBwYXJ0aWN1bGFyIGxlc3NvbiBmcm9tIHRoZSBzdG9yZS5cbiAqIE5vdGUsIHRoYXQgdGhpcyBkb2VzIG5vdCBpbmNsdWRlIGxldmVsc1xuICogQHBhcmFtIHtvYmplY3R9IHN0YXRlIC0gVGhlIHByb2dyZXNzIHN0YXRlIGluIG91ciByZWR1eCBzdG9yZVxuICogQHBhcmFtIHtudW1iZXJ9IGxlc3NvbkluZGV4IC0gVGhlIGluZGV4IGludG8gb3VyIGxlc3NvbnMgd2UgY2FyZSBhYm91dFxuICogQHJldHVybnMge0xlc3Nvbn1cbiAqL1xuY29uc3QgbGVzc29uRnJvbUxlc3NvbkF0SW5kZXggPSAoc3RhdGUsIGxlc3NvbkluZGV4KSA9PiAoe1xuICAuLi5sZXNzb25Gcm9tTGVzc29uKHN0YXRlLmxlc3NvbnNbbGVzc29uSW5kZXhdKSxcbiAgaXNGb2N1c0FyZWE6IHN0YXRlLmZvY3VzQXJlYUxlc3Nvbklkcy5pbmNsdWRlcyhzdGF0ZS5sZXNzb25zW2xlc3NvbkluZGV4XS5pZCksXG59KTtcblxuY29uc3QgbGVzc29uRnJvbUxlc3NvbiA9IGxlc3NvbiA9PlxuICBfLnBpY2sobGVzc29uLCBbXG4gICAgJ25hbWUnLFxuICAgICdpZCcsXG4gICAgJ2xvY2thYmxlJyxcbiAgICAnbGVzc29uTnVtYmVyJyxcbiAgICAnbGVzc29uU3RhcnRVcmwnLFxuICAgICdsZXNzb25fcGxhbl9odG1sX3VybCcsXG4gICAgJ2xlc3Nvbl9mZWVkYmFja191cmwnLFxuICAgICdzdHVkZW50X2xlc3Nvbl9wbGFuX2h0bWxfdXJsJyxcbiAgICAndGl0bGUnLFxuICAgICdkZXNjcmlwdGlvbl9zdHVkZW50JyxcbiAgICAnZGVzY3JpcHRpb25fdGVhY2hlcicsXG4gIF0pO1xuZXhwb3J0IGNvbnN0IGxlc3NvbnMgPSBzdGF0ZSA9PlxuICBzdGF0ZS5sZXNzb25zLm1hcCgoXywgaW5kZXgpID0+IGxlc3NvbkZyb21MZXNzb25BdEluZGV4KHN0YXRlLCBpbmRleCkpO1xuXG4vKipcbiAqIEV4dHJhY3QgbGVzc29uIGZyb20gb3VyIHBlZXJSZXZpZXdMZXNzb25JbmZvIGlmIHdlIGhhdmUgb25lLiBXZSB3YW50IHRoaXMgdG8gZW5kIHVwXG4gKiBoYXZpbmcgdGhlIHNhbWUgZmllbGRzIGFzIG91ciBub24tcGVlciByZXZpZXcgbGVzc29ucy5cbiAqL1xuY29uc3QgcGVlclJldmlld0xlc3NvbiA9IHN0YXRlID0+ICh7XG4gIC4uLmxlc3NvbkZyb21MZXNzb24oc3RhdGUucGVlclJldmlld0xlc3NvbkluZm8pLFxuICAvLyBhZGQgc29tZSBmaWVsZHMgdGhhdCBhcmUgbWlzc2luZyBmb3IgdGhpcyBsZXNzb24gYnV0IHJlcXVpcmVkIGZvciBsZXNzb25UeXBlXG4gIGlkOiBQRUVSX1JFVklFV19JRCxcbiAgbG9ja2FibGU6IGZhbHNlLFxuICBpc0ZvY3VzQXJlYTogZmFsc2UsXG59KTtcblxuLyoqXG4gKiBFeHRyYWN0IGxldmVscyBmcm9tIG91ciBwZWVyUmV2aWV3TGVzc29uSW5mbywgbWFraW5nIHN1cmUgdGhlIGxldmVscyBoYXZlIHRoZSBzYW1lXG4gKiBzZXQgb2YgZmllbGRzIGFzIG91ciBub24tcGVlciByZXZpZXcgbGV2ZWxzLlxuICovXG5jb25zdCBwZWVyUmV2aWV3TGV2ZWxzID0gc3RhdGUgPT5cbiAgc3RhdGUucGVlclJldmlld0xlc3NvbkluZm8ubGV2ZWxzLm1hcCgobGV2ZWwsIGluZGV4KSA9PiAoe1xuICAgIC8vIFRoZXNlIGFyZW4ndCB0cnVlIGxldmVscyAoaS5lLiB3ZSB3b24ndCBoYXZlIGFuIGVudHJ5IGluIGxldmVsUmVzdWx0cyksXG4gICAgLy8gc28gYWx3YXlzIHVzZSBhIHNwZWNpZmljIGlkIHRoYXQgd29uJ3QgY29sbGlkZSB3aXRoIHJlYWwgbGV2ZWxzXG4gICAgLi4ubGV2ZWwsXG4gICAgaWQ6IFBFRVJfUkVWSUVXX0lELnRvU3RyaW5nKCksXG4gICAgaXNMb2NrZWQ6IGxldmVsLmxvY2tlZCxcbiAgICBzdGF0dXM6IGxldmVsLnN0YXR1cyB8fCBMZXZlbFN0YXR1cy5ub3RfdHJpZWQsXG4gICAgbGV2ZWxOdW1iZXI6IGluZGV4ICsgMSxcbiAgfSkpO1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciB3ZSBhcHBlYXIgdG8gYmUgaW4gYSBzY3JpcHQgbGV2ZWwgb3IgYSBzdGFuZGFsb25lIGxldmVsLlxuICogQSBzY3JpcHQgbGV2ZWwgaXMgaWRlbnRpZmllZCBiZWNhdXNlIGl0IGhhcyBsZXNzb25zLlxuICogQSBzdGFuZGFsb25lIGxldmVsIGRvZXNuJ3QgaGF2ZSBsZXNzb25zLCBidXQgaXQgZG9lcyBoYXZlIGEgbGV2ZWwgSUQuXG4gKi9cbmV4cG9ydCBjb25zdCBQcm9ncmVzc0xldmVsVHlwZSA9IHtcbiAgU0NSSVBUX0xFVkVMOiAnc2NyaXB0X2xldmVsJyxcbiAgTEVWRUw6ICdsZXZlbCcsXG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UHJvZ3Jlc3NMZXZlbFR5cGUgPSBzdGF0ZSA9PiB7XG4gIGlmIChzdGF0ZS5wcm9ncmVzcy5sZXNzb25zKSB7XG4gICAgcmV0dXJuIFByb2dyZXNzTGV2ZWxUeXBlLlNDUklQVF9MRVZFTDtcbiAgfSBlbHNlIGlmIChzdGF0ZS5wcm9ncmVzcy5jdXJyZW50TGV2ZWxJZCkge1xuICAgIHJldHVybiBQcm9ncmVzc0xldmVsVHlwZS5MRVZFTDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGRhc2hib2FyZCBVUkwgcGF0aCB0byByZXRyaWV2ZSB0aGUgbGV2ZWwgcHJvcGVydGllcyBmb3IgYSBzY3JpcHRcbiAqIGxldmVsIChpZiB3ZSBoYXZlIGxlc3NvbnMpIG9yIGEgbGV2ZWwgKGlmIHdlIGRvbid0IGhhdmUgbGVzc29ucykuIElmIHdlIGRvbid0XG4gKiBoYXZlIGEgY3VycmVudCBsZXZlbCwgdGhpcyByZXR1cm5zIHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldExldmVsUHJvcGVydGllc1BhdGggPSBzdGF0ZSA9PiB7XG4gIGlmIChzdGF0ZS5wcm9ncmVzcy5sZXNzb25zKSB7XG4gICAgY29uc3Qgc2NyaXB0TmFtZSA9IHN0YXRlLnByb2dyZXNzLnNjcmlwdE5hbWU7XG4gICAgY29uc3QgbGVzc29uUG9zaXRpb24gPSBzdGF0ZS5wcm9ncmVzcy5sZXNzb25zPy5maW5kKFxuICAgICAgbGVzc29uID0+IGxlc3Nvbi5pZCA9PT0gc3RhdGUucHJvZ3Jlc3MuY3VycmVudExlc3NvbklkXG4gICAgKS5yZWxhdGl2ZV9wb3NpdGlvbjtcblxuICAgIGxldCBsZXZlbFBvc2l0aW9uLCBzdWJsZXZlbFBvc2l0aW9uO1xuICAgIGNvbnN0IGN1cnJlbnRMZXZlbCA9IGdldEN1cnJlbnRMZXZlbChzdGF0ZSk7XG4gICAgbGV2ZWxQb3NpdGlvbiA9IGN1cnJlbnRMZXZlbC5sZXZlbE51bWJlcjtcblxuICAgIC8vIFVzZSB0aGUgc3VibGV2ZWwgcG9zaXRpb24gaWYgd2UncmUgb24gYSBzdWJsZXZlbFxuICAgIGlmIChjdXJyZW50TGV2ZWwucGFyZW50TGV2ZWxJZCkge1xuICAgICAgY29uc3QgcGFyZW50TGV2ZWwgPSBsZXZlbEJ5SWQoXG4gICAgICAgIHN0YXRlLnByb2dyZXNzLFxuICAgICAgICBzdGF0ZS5wcm9ncmVzcy5jdXJyZW50TGVzc29uSWQsXG4gICAgICAgIGN1cnJlbnRMZXZlbC5wYXJlbnRMZXZlbElkXG4gICAgICApO1xuICAgICAgbGV2ZWxQb3NpdGlvbiA9IHBhcmVudExldmVsLmxldmVsTnVtYmVyO1xuICAgICAgc3VibGV2ZWxQb3NpdGlvbiA9IGN1cnJlbnRMZXZlbC5sZXZlbE51bWJlcjtcbiAgICB9XG5cbiAgICByZXR1cm4gYC9zLyR7c2NyaXB0TmFtZX0vbGVzc29ucy8ke2xlc3NvblBvc2l0aW9ufS9sZXZlbHMvJHtsZXZlbFBvc2l0aW9ufS8ke1xuICAgICAgc3VibGV2ZWxQb3NpdGlvbiA9PT0gdW5kZWZpbmVkID8gJycgOiBgc3VibGV2ZWwvJHtzdWJsZXZlbFBvc2l0aW9ufS9gXG4gICAgfWxldmVsX3Byb3BlcnRpZXNgO1xuICB9IGVsc2UgaWYgKHN0YXRlLnByb2dyZXNzLmN1cnJlbnRMZXZlbElkICE9PSBudWxsKSB7XG4gICAgY29uc3QgbGV2ZWxJZCA9IHN0YXRlLnByb2dyZXNzLmN1cnJlbnRMZXZlbElkO1xuICAgIHJldHVybiBgL2xldmVscy8ke2xldmVsSWR9L2xldmVsX3Byb3BlcnRpZXNgO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZGFzaGJvYXJkIFVSTCBwYXRoIHRvIHJldHJpZXZlIHRoZSB1c2VyIGFwcCBvcHRpb25zIGZvciBhIHNjcmlwdCBsZXZlbC5cbiAqIElmIHdlIGRvbid0IGhhdmUgYSBjdXJyZW50IGxldmVsLCB0aGlzIHJldHVybnMgdW5kZWZpbmVkLlxuICovXG5leHBvcnQgY29uc3QgZ2V0VXNlckFwcE9wdGlvbnNQYXRoID0gc3RhdGUgPT4ge1xuICBpZiAoc3RhdGUucHJvZ3Jlc3MubGVzc29ucykge1xuICAgIGNvbnN0IHNjcmlwdE5hbWUgPSBzdGF0ZS5wcm9ncmVzcy5zY3JpcHROYW1lO1xuXG4gICAgY29uc3QgbGVzc29uUG9zaXRpb24gPSBzdGF0ZS5wcm9ncmVzcy5sZXNzb25zPy5maW5kKFxuICAgICAgbGVzc29uID0+IGxlc3Nvbi5pZCA9PT0gc3RhdGUucHJvZ3Jlc3MuY3VycmVudExlc3NvbklkXG4gICAgKS5yZWxhdGl2ZV9wb3NpdGlvbjtcblxuICAgIGNvbnN0IGN1cnJlbnRMZXZlbCA9IGdldEN1cnJlbnRMZXZlbChzdGF0ZSk7XG4gICAgY29uc3QgbGV2ZWxQb3NpdGlvbiA9IGN1cnJlbnRMZXZlbC5sZXZlbE51bWJlcjtcblxuICAgIGNvbnN0IGxldmVsSWQgPSBzdGF0ZS5wcm9ncmVzcy5jdXJyZW50TGV2ZWxJZDtcblxuICAgIHJldHVybiBgL2FwaS91c2VyX2FwcF9vcHRpb25zLyR7c2NyaXB0TmFtZX0vJHtsZXNzb25Qb3NpdGlvbn0vJHtsZXZlbFBvc2l0aW9ufS8ke2xldmVsSWR9YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59O1xuXG4vKipcbiAqIFRoZSBsZXZlbCBvYmplY3QgcGFzc2VkIGRvd24gdG8gdXNlIHZpYSB0aGUgc2VydmVyIChhbmQgc3RvcmVkIGluIGxlc3Nvbi5sZXNzb25zLmxldmVscylcbiAqIGNvbnRhaW5zIG1vcmUgZGF0YSB0aGFuIHdlIG5lZWQuIFRoaXMgKGEpIGZpbHRlcnMgdG8gdGhlIHBhcnRzIG91ciB2aWV3cyBjYXJlXG4gKiBhYm91dCBhbmQgKGIpIGRldGVybWluZXMgY3VycmVudCBzdGF0dXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgc3RhdGUgb2ZcbiAqIHN0YXRlLmxldmVsUmVzdWx0c1xuICovXG5jb25zdCBsZXZlbFdpdGhQcm9ncmVzcyA9IChcbiAge2xldmVsUmVzdWx0cywgdW5pdFByb2dyZXNzLCBsZXZlbFBhaXJpbmcgPSB7fSwgY3VycmVudExldmVsSWR9LFxuICBsZXZlbCxcbiAgaXNMb2NrYWJsZSxcbiAgcGFyZW50TGV2ZWxJZFxuKSA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRMZXZlbCA9IHByb2Nlc3NlZExldmVsKGxldmVsLCBwYXJlbnRMZXZlbElkKTtcbiAgaWYgKGxldmVsLmlkcykge1xuICAgIC8vIG1ha2Ugc3VyZSB3ZSdyZSB1c2luZyB0aGUgaWQgd2l0aCBiZXN0IHByb2dyZXNzXG4gICAgbm9ybWFsaXplZExldmVsLmlkID0gYmVzdFJlc3VsdExldmVsSWQobGV2ZWwuaWRzLCBsZXZlbFJlc3VsdHMpO1xuICB9XG5cbiAgLy8gZGVmYXVsdCB2YWx1ZXNcbiAgbGV0IHN0YXR1cyA9IExldmVsU3RhdHVzLm5vdF90cmllZDtcbiAgbGV0IGxvY2tlZCA9IGlzTG9ja2FibGU7XG4gIGxldCB0ZWFjaGVyRmVlZGJhY2tSZXZpZXdTdGF0ZSA9IG51bGw7XG5cbiAgbGV0IGxldmVsUHJvZ3Jlc3MgPSB1bml0UHJvZ3Jlc3Nbbm9ybWFsaXplZExldmVsLmlkXTtcbiAgaWYgKGxldmVsUHJvZ3Jlc3M/LnBhZ2VzKSB7XG4gICAgbGV2ZWxQcm9ncmVzcyA9IGxldmVsUHJvZ3Jlc3MucGFnZXNbbm9ybWFsaXplZExldmVsLnBhZ2VOdW1iZXIgLSAxXTtcbiAgfVxuICBpZiAobGV2ZWxQcm9ncmVzcykge1xuICAgIC8vIGlmIHdlIGhhdmUgbGV2ZWxQcm9ncmVzcywgb3ZlcndyaXRlIGRlZmF1bHQgdmFsdWVzXG4gICAgc3RhdHVzID0gbGV2ZWxQcm9ncmVzcy5zdGF0dXM7XG4gICAgbG9ja2VkID0gbGV2ZWxQcm9ncmVzcy5sb2NrZWQ7XG4gICAgdGVhY2hlckZlZWRiYWNrUmV2aWV3U3RhdGUgPSBsZXZlbFByb2dyZXNzLnRlYWNoZXJGZWVkYmFja1Jldmlld1N0YXRlO1xuICB9IGVsc2UgaWYgKGxldmVsLmtpbmQgIT09IExldmVsS2luZC5hc3Nlc3NtZW50KSB7XG4gICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBsZXZlbFByb2dyZXNzLCBnZXQgdGhlIHN0YXR1cyBmcm9tIGBsZXZlbFJlc3VsdHNgLlxuICAgIC8vIGhvd2V2ZXIsIGBsZXZlbFJlc3VsdHNgIGRvZXNuJ3QgdHJhY2sgcGVyLXBhZ2UgcmVzdWx0cyBmb3IgbXVsdGktcGFnZVxuICAgIC8vIGFzc2Vzc21lbnRzLCBzbyBmb3IgYXNzZXNzbWVudHMgd2UgbGVhdmUgZGVmYXVsdCB2YWx1ZXMuXG4gICAgLy9cbiAgICAvLyBub3RlOiBpZiB3ZSdyZSBub3QgdXNpbmcgbGV2ZWxQcm9ncmVzcywgYGlzTG9ja2VkYCB3aWxsIGFsd2F5cyBiZSBmYWxzZS5cbiAgICBzdGF0dXMgPSBhY3Rpdml0eUNzc0NsYXNzKGxldmVsUmVzdWx0c1tub3JtYWxpemVkTGV2ZWwuaWRdKTtcbiAgfVxuICBjb25zdCBpc0N1cnJlbnQgPVxuICAgIG5vcm1hbGl6ZWRMZXZlbC5pZCA9PT0gY3VycmVudExldmVsSWQgfHxcbiAgICAhIWxldmVsLmlkcz8uaW5jbHVkZXNbY3VycmVudExldmVsSWRdO1xuXG4gIHJldHVybiB7XG4gICAgLi4ubm9ybWFsaXplZExldmVsLFxuICAgIHN0YXR1czogc3RhdHVzLFxuICAgIGlzQ3VycmVudExldmVsOiBpc0N1cnJlbnQsXG4gICAgcGFpcmVkOiBsZXZlbFBhaXJpbmdbbGV2ZWwuYWN0aXZlSWRdLFxuICAgIGlzTG9ja2VkOiBsb2NrZWQsXG4gICAgdGVhY2hlckZlZWRiYWNrUmV2aWV3U3RhdGU6IHRlYWNoZXJGZWVkYmFja1Jldmlld1N0YXRlLFxuICAgIHN1YmxldmVsczogbGV2ZWwuc3VibGV2ZWxzPy5tYXAoc3VibGV2ZWwgPT5cbiAgICAgIGxldmVsV2l0aFByb2dyZXNzKFxuICAgICAgICB7bGV2ZWxSZXN1bHRzLCB1bml0UHJvZ3Jlc3MsIGxldmVsUGFpcmluZywgY3VycmVudExldmVsSWR9LFxuICAgICAgICBzdWJsZXZlbCxcbiAgICAgICAgaXNMb2NrYWJsZSxcbiAgICAgICAgbm9ybWFsaXplZExldmVsLmlkXG4gICAgICApXG4gICAgKSxcbiAgfTtcbn07XG5cbi8qKlxuICogR2V0IGxldmVsIGRhdGEgZm9yIGFsbCBsZXNzb25zXG4gKi9cbmV4cG9ydCBjb25zdCBsZXZlbHNCeUxlc3NvbiA9ICh7XG4gIGxlc3NvbnMsXG4gIGxldmVsUmVzdWx0cyxcbiAgdW5pdFByb2dyZXNzLFxuICBsZXZlbFBhaXJpbmcsXG4gIGN1cnJlbnRMZXZlbElkLFxufSkgPT5cbiAgbGVzc29ucy5tYXAobGVzc29uID0+XG4gICAgbGVzc29uLmxldmVscy5tYXAobGV2ZWwgPT4ge1xuICAgICAgbGV0IHN0YXR1c0xldmVsID0gbGV2ZWxXaXRoUHJvZ3Jlc3MoXG4gICAgICAgIHtsZXZlbFJlc3VsdHMsIHVuaXRQcm9ncmVzcywgbGV2ZWxQYWlyaW5nLCBjdXJyZW50TGV2ZWxJZH0sXG4gICAgICAgIGxldmVsLFxuICAgICAgICBsZXNzb24ubG9ja2FibGVcbiAgICAgICk7XG4gICAgICByZXR1cm4gc3RhdHVzTGV2ZWw7XG4gICAgfSlcbiAgKTtcblxuLyoqXG4gKiBHZXQgZGF0YSBmb3IgYSBwYXJ0aWN1bGFyIGxlc3NvblxuICovXG5leHBvcnQgY29uc3QgbGV2ZWxzRm9yTGVzc29uSWQgPSAoc3RhdGUsIGxlc3NvbklkKSA9PiB7XG4gIGNvbnN0IGxlc3NvbiA9IHN0YXRlLmxlc3NvbnM/LmZpbmQobGVzc29uID0+IGxlc3Nvbi5pZCA9PT0gbGVzc29uSWQpO1xuICByZXR1cm4gbGVzc29uPy5sZXZlbHMubWFwKGxldmVsID0+XG4gICAgbGV2ZWxXaXRoUHJvZ3Jlc3Moc3RhdGUsIGxldmVsLCBsZXNzb24ubG9ja2FibGUpXG4gICk7XG59O1xuXG4vKipcbiAqIEdpdmVuIGEgbGVzc29uIElELCBhbmQgYSBsZXZlbCBJRCwgcmV0dXJucyB0aGUgcmVxdWVzdGVkIGxldmVsLlxuICovXG5leHBvcnQgY29uc3QgbGV2ZWxCeUlkID0gKHN0YXRlLCBsZXNzb25JZCwgbGV2ZWxJZCkgPT4ge1xuICByZXR1cm4gbGV2ZWxzRm9yTGVzc29uSWQoc3RhdGUsIGxlc3NvbklkKVxuICAgID8uZmxhdE1hcChsZXZlbCA9PiBbbGV2ZWwsIC4uLihsZXZlbD8uc3VibGV2ZWxzIHx8IFtdKV0pXG4gICAgPy5maW5kKGxldmVsID0+IGxldmVsLmlkID09PSBsZXZlbElkKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDdXJyZW50TGV2ZWwgPSBzdGF0ZSA9PiB7XG4gIHJldHVybiBnZXRDdXJyZW50TGV2ZWxzKHN0YXRlKVxuICAgID8uZmxhdE1hcChsZXZlbCA9PiBbbGV2ZWwsIC4uLihsZXZlbD8uc3VibGV2ZWxzIHx8IFtdKV0pXG4gICAgPy5maW5kKGxldmVsID0+IGxldmVsLmlzQ3VycmVudExldmVsKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDdXJyZW50TGV2ZWxzID0gc3RhdGUgPT4ge1xuICByZXR1cm4gbGV2ZWxzRm9yTGVzc29uSWQoc3RhdGUucHJvZ3Jlc3MsIHN0YXRlLnByb2dyZXNzLmN1cnJlbnRMZXNzb25JZCk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgc2NyaXB0IGxldmVsIElEIG9mIHRoZSBjdXJyZW50IGxldmVsLiBJZiB0aGUgY3VycmVudCBsZXZlbCBpcyBhIHN1YmxldmVsLFxuICogKGFuZCB0aGVyZWZvcmUgbm90IGEgc2NyaXB0IGxldmVsKSByZXR1cm4gdGhlIHBhcmVudCBzY3JpcHQgbGV2ZWwgSUQuXG4gKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGVyZSBpcyBubyBjdXJyZW50IGxldmVsLlxuICovXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudFNjcmlwdExldmVsSWQgPSBzdGF0ZSA9PiB7XG4gIGNvbnN0IGN1cnJlbnRMZXZlbCA9IGdldEN1cnJlbnRMZXZlbChzdGF0ZSk7XG4gIGlmICghY3VycmVudExldmVsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGN1cnJlbnRMZXZlbC5wYXJlbnRMZXZlbElkKSB7XG4gICAgcmV0dXJuIGxldmVsQnlJZChcbiAgICAgIHN0YXRlLnByb2dyZXNzLFxuICAgICAgc3RhdGUucHJvZ3Jlc3MuY3VycmVudExlc3NvbklkLFxuICAgICAgY3VycmVudExldmVsLnBhcmVudExldmVsSWRcbiAgICApPy5zY3JpcHRMZXZlbElkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjdXJyZW50TGV2ZWwuc2NyaXB0TGV2ZWxJZDtcbiAgfVxufTtcblxuLyoqXG4gKiBHZXQgdGhlIG5leHQgbGV2ZWwgSUQgaW4gdGhlIHByb2dyZXNzaW9uIGlmIGl0IGV4aXN0cy5cbiAqIFJldHVybnMgdW5kZWZpbmVkIGlmIG5vdCBjdXJyZW50bHkgaW4gYSBzY3JpcHQgbGV2ZWwgb3JcbiAqIGN1cnJlbnRseSBvbiB0aGUgbGFzdCBsZXZlbC5cbiAqL1xuZXhwb3J0IGNvbnN0IG5leHRMZXZlbElkID0gc3RhdGUgPT4ge1xuICBpZiAoZ2V0UHJvZ3Jlc3NMZXZlbFR5cGUoc3RhdGUpICE9PSBQcm9ncmVzc0xldmVsVHlwZS5TQ1JJUFRfTEVWRUwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgbGV2ZWxzID0gbGV2ZWxzRm9yTGVzc29uSWQoXG4gICAgc3RhdGUucHJvZ3Jlc3MsXG4gICAgc3RhdGUucHJvZ3Jlc3MuY3VycmVudExlc3NvbklkXG4gICk7XG4gIGNvbnN0IGN1cnJlbnRMZXZlbCA9IGdldEN1cnJlbnRMZXZlbChzdGF0ZSk7XG4gIC8vIElmIHdlIGFyZSBvbiBhIHN1YmxldmVsLCBuYXZpZ2F0ZSBiYWNrIHRvIHRoZSBwYXJlbnQgbGV2ZWwuXG4gIGlmIChjdXJyZW50TGV2ZWwucGFyZW50TGV2ZWxJZCkge1xuICAgIHJldHVybiBjdXJyZW50TGV2ZWwucGFyZW50TGV2ZWxJZDtcbiAgfVxuICBjb25zdCBjdXJyZW50TGV2ZWxJbmRleCA9IGN1cnJlbnRMZXZlbC5sZXZlbE51bWJlciAtIDE7XG4gIGlmIChjdXJyZW50TGV2ZWxJbmRleCA9PT0gbGV2ZWxzLmxlbmd0aCAtIDEpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgbmV4dExldmVsID0gbGV2ZWxzW2N1cnJlbnRMZXZlbEluZGV4ICsgMV07XG4gIHJldHVybiBuZXh0TGV2ZWwuaWQ7XG59O1xuXG5leHBvcnQgY29uc3QgbGV2ZWxDb3VudCA9IHN0YXRlID0+IHtcbiAgaWYgKGdldFByb2dyZXNzTGV2ZWxUeXBlKHN0YXRlKSA9PT0gUHJvZ3Jlc3NMZXZlbFR5cGUuTEVWRUwpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICBpZiAoZ2V0UHJvZ3Jlc3NMZXZlbFR5cGUoc3RhdGUpID09PSBQcm9ncmVzc0xldmVsVHlwZS5TQ1JJUFRfTEVWRUwpIHtcbiAgICByZXR1cm4gZ2V0Q3VycmVudExldmVscyhzdGF0ZSkubGVuZ3RoO1xuICB9XG4gIHJldHVybiAwO1xufTtcblxuZXhwb3J0IGNvbnN0IGxlc3NvbkV4dHJhc1VybCA9IChzdGF0ZSwgbGVzc29uSWQpID0+XG4gIHN0YXRlLmxlc3NvbkV4dHJhc0VuYWJsZWRcbiAgICA/IHN0YXRlLmxlc3NvbnMuZmluZChsZXNzb24gPT4gbGVzc29uLmlkID09PSBsZXNzb25JZClcbiAgICAgICAgLmxlc3Nvbl9leHRyYXNfbGV2ZWxfdXJsXG4gICAgOiAnJztcblxuZXhwb3J0IGNvbnN0IGlzUGVyZmVjdCA9IChzdGF0ZSwgbGV2ZWxJZCkgPT5cbiAgISFzdGF0ZS5sZXZlbFJlc3VsdHMgJiZcbiAgc3RhdGUubGV2ZWxSZXN1bHRzW2xldmVsSWRdID49IFRlc3RSZXN1bHRzLk1JTklNVU1fT1BUSU1BTF9SRVNVTFQ7XG5cbi8qKlxuICogR3JvdXBzIGxlc3NvbnMgYWNjb3JkaW5nIHRvIExlc3Nvbkdyb3VwLlxuICogQHJldHVybnMge09iamVjdFtdfVxuICoge3N0cmluZ30gT2JqZWN0Lm5hbWVcbiAqIHtzdHJpbmdbXX0gT2JqZWN0Lmxlc3Nvbk5hbWVzXG4gKiB7T2JqZWN0W119IE9iamVjdC5sZXNzb25MZXZlbHNcbiAqL1xuZXhwb3J0IGNvbnN0IGdyb3VwZWRMZXNzb25zID0gKHN0YXRlLCBpbmNsdWRlQm9udXNMZXZlbHMgPSBmYWxzZSkgPT4ge1xuICBsZXQgYnlHcm91cCA9IHt9O1xuXG4gIGNvbnN0IGFsbExldmVscyA9IGxldmVsc0J5TGVzc29uKHN0YXRlKTtcblxuICBzdGF0ZS5sZXNzb25Hcm91cHMuZm9yRWFjaChsZXNzb25Hcm91cCA9PiB7XG4gICAgYnlHcm91cFtsZXNzb25Hcm91cC5kaXNwbGF5X25hbWVdID0ge1xuICAgICAgbGVzc29uR3JvdXA6IHtcbiAgICAgICAgaWQ6IGxlc3Nvbkdyb3VwLmlkLFxuICAgICAgICB1c2VyRmFjaW5nOiBsZXNzb25Hcm91cC51c2VyX2ZhY2luZyxcbiAgICAgICAgZGlzcGxheU5hbWU6IGxlc3Nvbkdyb3VwLmRpc3BsYXlfbmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IGxlc3Nvbkdyb3VwLmRlc2NyaXB0aW9uLFxuICAgICAgICBiaWdRdWVzdGlvbnM6IGxlc3Nvbkdyb3VwLmJpZ19xdWVzdGlvbnMsXG4gICAgICB9LFxuICAgICAgbGVzc29uczogW10sXG4gICAgICBsZXZlbHNCeUxlc3NvbjogW10sXG4gICAgfTtcbiAgfSk7XG5cbiAgc3RhdGUubGVzc29ucy5mb3JFYWNoKChsZXNzb24sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZ3JvdXAgPSBsZXNzb24ubGVzc29uX2dyb3VwX2Rpc3BsYXlfbmFtZTtcbiAgICBjb25zdCBsZXNzb25BdEluZGV4ID0gbGVzc29uRnJvbUxlc3NvbkF0SW5kZXgoc3RhdGUsIGluZGV4KTtcbiAgICBsZXQgbGVzc29uTGV2ZWxzID0gYWxsTGV2ZWxzW2luZGV4XTtcbiAgICBpZiAoIWluY2x1ZGVCb251c0xldmVscykge1xuICAgICAgbGVzc29uTGV2ZWxzID0gbGVzc29uTGV2ZWxzLmZpbHRlcihsZXZlbCA9PiAhbGV2ZWwuYm9udXMpO1xuICAgIH1cblxuICAgIGlmIChieUdyb3VwW2dyb3VwXSkge1xuICAgICAgYnlHcm91cFtncm91cF0ubGVzc29ucy5wdXNoKGxlc3NvbkF0SW5kZXgpO1xuICAgICAgYnlHcm91cFtncm91cF0ubGV2ZWxzQnlMZXNzb24ucHVzaChsZXNzb25MZXZlbHMpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gUGVlciByZXZpZXdzIGdldCB0aGVpciBvd24gZ3JvdXAsIGJ1dCB0aGVzZSBsZXZlbHMvbGVzc29uIGFyZSBzdG9yZWRcbiAgLy8gc2VwYXJhdGVseSBmcm9tIG91ciBvdGhlciBsZXZlbHMvbGVzc29ucyBpbiByZWR1eCAoc2luY2UgdGhleSdyZSBzbGlnaHRseVxuICAvLyBkaWZmZXJlbnQpXG4gIGlmIChzdGF0ZS5wZWVyUmV2aWV3TGVzc29uSW5mbykge1xuICAgIGJ5R3JvdXBbc3RhdGUucGVlclJldmlld0xlc3NvbkluZm8ubGVzc29uX2dyb3VwX2Rpc3BsYXlfbmFtZV0gPSB7XG4gICAgICBncm91cDogc3RhdGUucGVlclJldmlld0xlc3NvbkluZm8ubGVzc29uX2dyb3VwX2Rpc3BsYXlfbmFtZSxcbiAgICAgIGxlc3Nvbkdyb3VwOiB7XG4gICAgICAgIGlkOiBudWxsLCAvL1BlZXIgcmV2aWV3cyBkbyBub3QgaGF2ZSBkZXNjcmlwdGlvbnMgb3IgYmlnIHF1ZXN0aW9ucyBzbyB0aGV5IHdvbid0IG5lZWQgYW4gaWQgdG8gdHJhY2sgY2xpY2tzXG4gICAgICAgIGRpc3BsYXlOYW1lOiBzdGF0ZS5wZWVyUmV2aWV3TGVzc29uSW5mby5sZXNzb25fZ3JvdXBfZGlzcGxheV9uYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogbnVsbCxcbiAgICAgICAgYmlnUXVlc3Rpb25zOiBudWxsLFxuICAgICAgfSxcbiAgICAgIGxlc3NvbnM6IFtwZWVyUmV2aWV3TGVzc29uKHN0YXRlKV0sXG4gICAgICBsZXZlbHNCeUxlc3NvbjogW3BlZXJSZXZpZXdMZXZlbHMoc3RhdGUpXSxcbiAgICB9O1xuICB9XG5cbiAgLy8gV2Ugd2FudCB0byByZXR1cm4gYW4gYXJyYXkgb2YgY2F0ZWdvcmllc1xuICByZXR1cm4gXy52YWx1ZXMoYnlHcm91cCk7XG59O1xuXG4vKipcbiAqIEdpdmVuIGEgc2V0IG9mIGxldmVscywgZ3JvdXBzIHRoZW0gaW4gc2V0cyBvZiBwcm9ncmVzc2lvbnMsIHdoZXJlIGVhY2hcbiAqIHByb2dyZXNzaW9uIGlzIGEgc2V0IG9mIGFkamFjZW50IGxldmVscyBzaGFyaW5nIHRoZSBzYW1lIHByb2dyZXNzaW9uIG5hbWVcbiAqIEFueSBnaXZlbiBsZXZlbCdzIHByb2dyZXNzaW9uIG5hbWUgaXMgZGV0ZXJtaW5lZCBieSBmaXJzdCBsb29raW5nIHRvIHNlZSBpZlxuICogdGhlIHNlcnZlciBwcm92aWRlZCB1cyBvbmUgYXMgbGV2ZWwucHJvZ3Jlc3Npb24sIG90aGVyd2lzZSB3ZSBmYWxsIGJhY2sgdG9cbiAqIGp1c3QgbGV2ZWwubmFtZVxuICogQHBhcmFtIHtMZXZlbFtdfSBsZXZlbHNcbiAqIEByZXR1cm5zIHtvYmplY3RbXX0gQW4gYXJyYXkgb2YgcHJvZ3Jlc3Npb25zLCB3aGVyZSBlYWNoIGNvbnNpc3RzIG9mIGEgbmFtZSxcbiAqICAgdGhlIHBvc2l0aW9uIG9mIHRoZSBwcm9ncmVzc2lvbiBpbiB0aGUgaW5wdXQgYXJyYXksIGFuZCB0aGUgc2V0IG9mIGxldmVsc1xuICogICBpbiB0aGUgcHJvZ3Jlc3Npb25cbiAqL1xuZXhwb3J0IGNvbnN0IHByb2dyZXNzaW9uc0Zyb21MZXZlbHMgPSBsZXZlbHMgPT4ge1xuICBjb25zdCBwcm9ncmVzc2lvbnMgPSBbXTtcbiAgaWYgKGxldmVscy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gcHJvZ3Jlc3Npb25zO1xuICB9XG4gIGxldCBjdXJyZW50UHJvZ3Jlc3Npb24gPSB7XG4gICAgc3RhcnQ6IDAsXG4gICAgbmFtZTogbGV2ZWxzWzBdLnByb2dyZXNzaW9uIHx8IGxldmVsc1swXS5uYW1lLFxuICAgIGRpc3BsYXlOYW1lOiBsZXZlbHNbMF0ucHJvZ3Jlc3Npb25EaXNwbGF5TmFtZSB8fCBsZXZlbHNbMF0ubmFtZSxcbiAgICBsZXZlbHM6IFtsZXZlbHNbMF1dLFxuICB9O1xuICBsZXZlbHMuc2xpY2UoMSkuZm9yRWFjaCgobGV2ZWwsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgcHJvZ3Jlc3Npb25OYW1lID0gbGV2ZWwucHJvZ3Jlc3Npb24gfHwgbGV2ZWwubmFtZTtcbiAgICBpZiAocHJvZ3Jlc3Npb25OYW1lID09PSBjdXJyZW50UHJvZ3Jlc3Npb24ubmFtZSkge1xuICAgICAgY3VycmVudFByb2dyZXNzaW9uLmxldmVscy5wdXNoKGxldmVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvZ3Jlc3Npb25zLnB1c2goY3VycmVudFByb2dyZXNzaW9uKTtcbiAgICAgIGN1cnJlbnRQcm9ncmVzc2lvbiA9IHtcbiAgICAgICAgLy8gKyAxIGJlY2F1c2Ugd2Ugc2xpY2VkIG9mZiB0aGUgZmlyc3QgZWxlbWVudFxuICAgICAgICBzdGFydDogaW5kZXggKyAxLFxuICAgICAgICBuYW1lOiBsZXZlbC5wcm9ncmVzc2lvbiB8fCBsZXZlbC5uYW1lLFxuICAgICAgICBkaXNwbGF5TmFtZTogbGV2ZWwucHJvZ3Jlc3Npb25EaXNwbGF5TmFtZSB8fCBsZXZlbC5uYW1lLFxuICAgICAgICBsZXZlbHM6IFtsZXZlbF0sXG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG4gIHByb2dyZXNzaW9ucy5wdXNoKGN1cnJlbnRQcm9ncmVzc2lvbik7XG4gIHJldHVybiBwcm9ncmVzc2lvbnM7XG59O1xuXG4vLyBIZWxwZXJzXG5cbi8qKlxuICogUmV0dXJuIHRoZSBsZXZlbCB3aXRoIHRoZSBoaWdoZXN0IHByb2dyZXNzLCBvciB0aGUgZmlyc3QgbGV2ZWwgaWYgbm9uZSBoYXZlXG4gKiBiZWVuIGF0dGVtcHRlZFxuICogQHBhcmFtIHtudW1iZXJbXX0gbGV2ZWxJZHNcbiAqIEBwYXJhbSB7T2JqZWN0LjxudW1iZXIsbnVtYmVyPn0gLSBNYXBwaW5nIGZyb20gbGV2ZWwgaWQgdG8gcHJvZ3Jlc3MgcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGJlc3RSZXN1bHRMZXZlbElkKGxldmVsSWRzLCBwcm9ncmVzc0RhdGEpIHtcbiAgLy8gVGhlIHVzdWFsIGNhc2VcbiAgaWYgKGxldmVsSWRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBsZXZlbElkc1swXTtcbiAgfVxuXG4gIC8vIFJldHVybiB0aGUgbGV2ZWwgd2l0aCB0aGUgaGlnaGVzdCByZXN1bHRcbiAgdmFyIGF0dGVtcHRlZElkcyA9IGxldmVsSWRzLmZpbHRlcihpZCA9PiBwcm9ncmVzc0RhdGFbaWRdKTtcbiAgaWYgKGF0dGVtcHRlZElkcy5sZW5ndGggPT09IDApIHtcbiAgICAvLyBOb25lIG9mIHRoZW0gaGF2ZSBiZWVuIGF0dGVtcHRlZCwganVzdCByZXR1cm4gdGhlIGZpcnN0XG4gICAgcmV0dXJuIGxldmVsSWRzWzBdO1xuICB9XG4gIHZhciBiZXN0SWQgPSBhdHRlbXB0ZWRJZHNbMF07XG4gIHZhciBiZXN0UmVzdWx0ID0gcHJvZ3Jlc3NEYXRhW2Jlc3RJZF07XG4gIGF0dGVtcHRlZElkcy5mb3JFYWNoKGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciByZXN1bHQgPSBwcm9ncmVzc0RhdGFbaWRdO1xuICAgIGlmIChyZXN1bHQgPiBiZXN0UmVzdWx0KSB7XG4gICAgICBiZXN0SWQgPSBpZDtcbiAgICAgIGJlc3RSZXN1bHQgPSByZXN1bHQ7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGJlc3RJZDtcbn1cblxuLy8gZXhwb3J0IHByaXZhdGUgZnVuY3Rpb24ocykgdG8gZXhwb3NlIHRvIHVuaXQgdGVzdGluZ1xuZXhwb3J0IGNvbnN0IF9fdGVzdG9ubHlfXyA9IElOX1VOSVRfVEVTVFxuICA/IHtcbiAgICAgIGJlc3RSZXN1bHRMZXZlbElkLFxuICAgICAgcGVlclJldmlld0xlc3NvbixcbiAgICAgIHBlZXJSZXZpZXdMZXZlbHMsXG4gICAgICBQRUVSX1JFVklFV19JRCxcbiAgICB9XG4gIDoge307XG4iLCJjb25zdCBTRVRfVkVSSUZJRUQgPSAndmVyaWZpZWRJbnN0cnVjdG9yL1NFVF9WRVJJRklFRCc7XG5jb25zdCBTRVRfVkVSSUZJRURfUkVTT1VSQ0VTID0gJ3ZlcmlmaWVkSW5zdHJ1Y3Rvci9TRVRfVkVSSUZJRURfUkVTT1VSQ0VTJztcblxuZXhwb3J0IGNvbnN0IHNldFZlcmlmaWVkID0gKCkgPT4gKHt0eXBlOiBTRVRfVkVSSUZJRUR9KTtcbmV4cG9ydCBjb25zdCBzZXRWZXJpZmllZFJlc291cmNlcyA9IGhhc1ZlcmlmaWVkUmVzb3VyY2VzID0+ICh7XG4gIHR5cGU6IFNFVF9WRVJJRklFRF9SRVNPVVJDRVMsXG59KTtcblxuY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICBpc1ZlcmlmaWVkOiBmYWxzZSxcbiAgLy8gVHJ1ZSBpZiBhIHBhZ2UgKGNvdXJzZS9zY3JpcHQpIGhhcyByZXNvdXJjZXMgdGhhdCBhcmUgb25seSBhdmFpbGFibGUgdG9cbiAgLy8gdmVyaWZpZWQgdGVhY2hlcnNcbiAgaGFzVmVyaWZpZWRSZXNvdXJjZXM6IGZhbHNlLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmVyaWZpZWRJbnN0cnVjdG9yKHN0YXRlID0gaW5pdGlhbFN0YXRlLCBhY3Rpb24pIHtcbiAgaWYgKGFjdGlvbi50eXBlID09PSBTRVRfVkVSSUZJRUQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBpc1ZlcmlmaWVkOiB0cnVlLFxuICAgIH07XG4gIH1cblxuICBpZiAoYWN0aW9uLnR5cGUgPT09IFNFVF9WRVJJRklFRF9SRVNPVVJDRVMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBoYXNWZXJpZmllZFJlc291cmNlczogdHJ1ZSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgfTtcbn1cbiIsIi8vIFdlIHN1cHBvcnQgSUUgMTErXG5mdW5jdGlvbiBpc0lFKCkge1xuICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdNU0lFJykgIT09IC0xIHx8IGlzSUUxMSgpO1xufVxuXG5mdW5jdGlvbiBJRVZlcnNpb24oKSB7XG4gIHJldHVybiBpc0lFMTEoKVxuICAgID8gJzExJ1xuICAgIDogbmF2aWdhdG9yLnVzZXJBZ2VudFxuICAgICAgICAuc3Vic3RyaW5nKG5hdmlnYXRvci51c2VyQWdlbnQubGFzdEluZGV4T2YoJ01TSUUnKSArIDUpXG4gICAgICAgIC5zcGxpdCgnLicpWzBdO1xufVxuXG5mdW5jdGlvbiBpc1Vuc3VwcG9ydGVkSUUoKSB7XG4gIHJldHVybiBpc0lFKCkgJiYgSUVWZXJzaW9uKCkgPCAxMTtcbn1cblxuLy8gV2Ugc3VwcG9ydCBDaHJvbWUgMzMueCArXG5mdW5jdGlvbiBpc0Nocm9tZSgpIHtcbiAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubGFzdEluZGV4T2YoJ0Nocm9tZS8nKSAhPT0gLTE7XG59XG5cbmZ1bmN0aW9uIGNocm9tZVZlcnNpb24oKSB7XG4gIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50XG4gICAgLnN1YnN0cmluZyhuYXZpZ2F0b3IudXNlckFnZW50Lmxhc3RJbmRleE9mKCdDaHJvbWUvJykgKyA3KVxuICAgIC5zcGxpdCgnLicpWzBdO1xufVxuXG5mdW5jdGlvbiBpc1Vuc3VwcG9ydGVkQ2hyb21lKCkge1xuICByZXR1cm4gaXNDaHJvbWUoKSAmJiBjaHJvbWVWZXJzaW9uKCkgPCAzMztcbn1cblxuLy8gV2Ugc3VwcG9ydCBTYWZhcmkgNy4wLnggK1xuZnVuY3Rpb24gaXNTYWZhcmkoKSB7XG4gIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ1NhZmFyaS8nKSAhPT0gLTE7XG59XG5cbmZ1bmN0aW9uIHNhZmFyaVZlcnNpb24oKSB7XG4gIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50XG4gICAgLnN1YnN0cmluZyhuYXZpZ2F0b3IudXNlckFnZW50Lmxhc3RJbmRleE9mKCdWZXJzaW9uLycpICsgOClcbiAgICAuc3BsaXQoJy4nKVswXTtcbn1cblxuZnVuY3Rpb24gaXNVbnN1cHBvcnRlZFNhZmFyaSgpIHtcbiAgcmV0dXJuIGlzU2FmYXJpKCkgJiYgc2FmYXJpVmVyc2lvbigpIDwgNztcbn1cblxuLy8gV2Ugc3VwcG9ydCBGaXJlZm94IDI1LnggK1xuZnVuY3Rpb24gaXNGaXJlZm94KCkge1xuICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94JykgIT09IC0xO1xufVxuXG5mdW5jdGlvbiBmaXJlZm94VmVyc2lvbigpIHtcbiAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnRcbiAgICAuc3Vic3RyaW5nKG5hdmlnYXRvci51c2VyQWdlbnQubGFzdEluZGV4T2YoJ0ZpcmVmb3gvJykgKyA4KVxuICAgIC5zcGxpdCgnLicpWzBdO1xufVxuXG5mdW5jdGlvbiBpc1Vuc3VwcG9ydGVkRmlyZWZveCgpIHtcbiAgcmV0dXJuIGlzRmlyZWZveCgpICYmIGZpcmVmb3hWZXJzaW9uKCkgPCAyNTtcbn1cblxuLy8gaHR0cHM6Ly9zdXBwb3J0LmNvZGUub3JnL2hjL2VuLXVzL2FydGljbGVzLzIwMjU5MTc0M1xuLy8gZm9yIHRoZSBmdWxsIGxpc3Qgb2Ygc3VwcG9ydGVkIGJyb3dzZXJzXG5leHBvcnQgZnVuY3Rpb24gaXNVbnN1cHBvcnRlZEJyb3dzZXIoKSB7XG4gIHJldHVybiAoXG4gICAgaXNVbnN1cHBvcnRlZElFKCkgfHxcbiAgICBpc1Vuc3VwcG9ydGVkQ2hyb21lKCkgfHxcbiAgICBpc1Vuc3VwcG9ydGVkU2FmYXJpKCkgfHxcbiAgICBpc1Vuc3VwcG9ydGVkRmlyZWZveCgpXG4gICk7XG59XG5cbi8vIERldGVjdCBhIG1vYmlsZSBkZXZpY2UuXG5leHBvcnQgZnVuY3Rpb24gaXNNb2JpbGVEZXZpY2UoKSB7XG4gIC8vIEFkYXB0ZWQgZnJvbSBodHRwOi8vZGV0ZWN0bW9iaWxlYnJvd3NlcnMuY29tLyB3aXRoIHRoZSBhZGRpdGlvbiBvZiB8YW5kcm9pZHxpcGFkfHBsYXlib29rfHNpbGsgYXNcbiAgLy8gaXQgc3VnZ2VzdHMgYXQgaHR0cDovL2RldGVjdG1vYmlsZWJyb3dzZXJzLmNvbS9hYm91dFxuICAvLyBOb3RlIHRoYXQgdGhlcmUgYXJlIHR3byByZWd1bGFyIGV4cHJlc3Npb25zIGluIHRoZSBibG9iLiAgVGhlIGZpcnN0IHRlc3RzIGFnYWluc3QgdmFyaWFibGUgYSAodGhlIGVudGlyZVxuICAvLyB1c2VyIGFnZW50KSB3aGlsZSB0aGUgc2Vjb25kIHRlc3RzIGFnYWluc3QganVzdCB0aGUgZmlyc3QgZm91ciBjaGFyYWN0ZXJzIGluIGl0LlxuXG4gIHZhciBjaGVjayA9IGZhbHNlO1xuICAoZnVuY3Rpb24gKGEpIHtcbiAgICBpZiAoXG4gICAgICAvKGFuZHJvaWR8YmJcXGQrfG1lZWdvKS4rbW9iaWxlfGF2YW50Z298YmFkYVxcL3xibGFja2JlcnJ5fGJsYXplcnxjb21wYWx8ZWxhaW5lfGZlbm5lY3xoaXB0b3B8aWVtb2JpbGV8aXAoaG9uZXxvZCl8aXJpc3xraW5kbGV8bGdlIHxtYWVtb3xtaWRwfG1tcHxtb2JpbGUuK2ZpcmVmb3h8bmV0ZnJvbnR8b3BlcmEgbShvYnxpbilpfHBhbG0oIG9zKT98cGhvbmV8cChpeGl8cmUpXFwvfHBsdWNrZXJ8cG9ja2V0fHBzcHxzZXJpZXMoNHw2KTB8c3ltYmlhbnx0cmVvfHVwXFwuKGJyb3dzZXJ8bGluayl8dm9kYWZvbmV8d2FwfHdpbmRvd3MgKGNlfHBob25lKXx4ZGF8eGlpbm98YW5kcm9pZHxpcGFkfHBsYXlib29rfHNpbGsvaS50ZXN0KFxuICAgICAgICBhXG4gICAgICApIHx8XG4gICAgICAvMTIwN3w2MzEwfDY1OTB8M2dzb3w0dGhwfDUwWzEtNl1pfDc3MHN8ODAyc3xhIHdhfGFiYWN8YWMoZXJ8b298c1xcLSl8YWkoa298cm4pfGFsKGF2fGNhfGNvKXxhbW9pfGFuKGV4fG55fHl3KXxhcHR1fGFyKGNofGdvKXxhcyh0ZXx1cyl8YXR0d3xhdShkaXxcXC1tfHIgfHMgKXxhdmFufGJlKGNrfGxsfG5xKXxiaShsYnxyZCl8YmwoYWN8YXopfGJyKGV8dil3fGJ1bWJ8YndcXC0obnx1KXxjNTVcXC98Y2FwaXxjY3dhfGNkbVxcLXxjZWxsfGNodG18Y2xkY3xjbWRcXC18Y28obXB8bmQpfGNyYXd8ZGEoaXR8bGx8bmcpfGRidGV8ZGNcXC1zfGRldml8ZGljYXxkbW9ifGRvKGN8cClvfGRzKDEyfFxcLWQpfGVsKDQ5fGFpKXxlbShsMnx1bCl8ZXIoaWN8azApfGVzbDh8ZXooWzQtN10wfG9zfHdhfHplKXxmZXRjfGZseShcXC18Xyl8ZzEgdXxnNTYwfGdlbmV8Z2ZcXC01fGdcXC1tb3xnbyhcXC53fG9kKXxncihhZHx1bil8aGFpZXxoY2l0fGhkXFwtKG18cHx0KXxoZWlcXC18aGkocHR8dGEpfGhwKCBpfGlwKXxoc1xcLWN8aHQoYyhcXC18IHxffGF8Z3xwfHN8dCl8dHApfGh1KGF3fHRjKXxpXFwtKDIwfGdvfG1hKXxpMjMwfGlhYyggfFxcLXxcXC8pfGlicm98aWRlYXxpZzAxfGlrb218aW0xa3xpbm5vfGlwYXF8aXJpc3xqYSh0fHYpYXxqYnJvfGplbXV8amlnc3xrZGRpfGtlaml8a2d0KCB8XFwvKXxrbG9ufGtwdCB8a3djXFwtfGt5byhjfGspfGxlKG5vfHhpKXxsZyggZ3xcXC8oa3xsfHUpfDUwfDU0fFxcLVthLXddKXxsaWJ3fGx5bnh8bTFcXC13fG0zZ2F8bTUwXFwvfG1hKHRlfHVpfHhvKXxtYygwMXwyMXxjYSl8bVxcLWNyfG1lKHJjfHJpKXxtaShvOHxvYXx0cyl8bW1lZnxtbygwMXwwMnxiaXxkZXxkb3x0KFxcLXwgfG98dil8enopfG10KDUwfHAxfHYgKXxtd2JwfG15d2F8bjEwWzAtMl18bjIwWzItM118bjMwKDB8Mil8bjUwKDB8Mnw1KXxuNygwKDB8MSl8MTApfG5lKChjfG0pXFwtfG9ufHRmfHdmfHdnfHd0KXxub2soNnxpKXxuenBofG8yaW18b3AodGl8d3YpfG9yYW58b3dnMXxwODAwfHBhbihhfGR8dCl8cGR4Z3xwZygxM3xcXC0oWzEtOF18YykpfHBoaWx8cGlyZXxwbChheXx1Yyl8cG5cXC0yfHBvKGNrfHJ0fHNlKXxwcm94fHBzaW98cHRcXC1nfHFhXFwtYXxxYygwN3wxMnwyMXwzMnw2MHxcXC1bMi03XXxpXFwtKXxxdGVrfHIzODB8cjYwMHxyYWtzfHJpbTl8cm8odmV8em8pfHM1NVxcL3xzYShnZXxtYXxtbXxtc3xueXx2YSl8c2MoMDF8aFxcLXxvb3xwXFwtKXxzZGtcXC98c2UoYyhcXC18MHwxKXw0N3xtY3xuZHxyaSl8c2doXFwtfHNoYXJ8c2llKFxcLXxtKXxza1xcLTB8c2woNDV8aWQpfHNtKGFsfGFyfGIzfGl0fHQ1KXxzbyhmdHxueSl8c3AoMDF8aFxcLXx2XFwtfHYgKXxzeSgwMXxtYil8dDIoMTh8NTApfHQ2KDAwfDEwfDE4KXx0YShndHxsayl8dGNsXFwtfHRkZ1xcLXx0ZWwoaXxtKXx0aW1cXC18dFxcLW1vfHRvKHBsfHNoKXx0cyg3MHxtXFwtfG0zfG01KXx0eFxcLTl8dXAoXFwuYnxnMXxzaSl8dXRzdHx2NDAwfHY3NTB8dmVyaXx2aShyZ3x0ZSl8dmsoNDB8NVswLTNdfFxcLXYpfHZtNDB8dm9kYXx2dWxjfHZ4KDUyfDUzfDYwfDYxfDcwfDgwfDgxfDgzfDg1fDk4KXx3M2MoXFwtfCApfHdlYmN8d2hpdHx3aShnIHxuY3xudyl8d21sYnx3b251fHg3MDB8eWFzXFwtfHlvdXJ8emV0b3x6dGVcXC0vaS50ZXN0KFxuICAgICAgICBhLnN1YnN0cigwLCA0KVxuICAgICAgKVxuICAgICkge1xuICAgICAgY2hlY2sgPSB0cnVlO1xuICAgIH1cbiAgfSkobmF2aWdhdG9yLnVzZXJBZ2VudCB8fCBuYXZpZ2F0b3IudmVuZG9yIHx8IHdpbmRvdy5vcGVyYSk7XG4gIHJldHVybiBjaGVjaztcbn1cblxuLy8gRGV0ZWN0IElFMTEuICBBZGFwdGVkIGZyb21cbi8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjE4MjUxNTcvaW50ZXJuZXQtZXhwbG9yZXItMTEtZGV0ZWN0aW9uLzIxODI1MjA3IzIxODI1MjA3XG5leHBvcnQgZnVuY3Rpb24gaXNJRTExKCkge1xuICB2YXIgaXNJRTExID0gISF3aW5kb3cuTVNJbnB1dE1ldGhvZENvbnRleHQgJiYgISFkb2N1bWVudC5kb2N1bWVudE1vZGU7XG4gIHJldHVybiBpc0lFMTE7XG59XG5cbi8vIERldGVybWluZSB3aGV0aGVyIGxvY2FsIHN0b3JhZ2UgaXMgYXZhaWxhYmxlLiAgT24gbWFjT1MgU2FmYXJpIFByaXZhdGUgTW9kZSBpdCB3b24ndCBiZS5cbi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9wYXVsaXJpc2gvNTU1ODU1NyNnaXN0Y29tbWVudC0xNzU1MDk5XG5leHBvcnQgZnVuY3Rpb24gaXNTdG9yYWdlQXZhaWxhYmxlKHR5cGUpIHtcbiAgdHJ5IHtcbiAgICB2YXIgc3RvcmFnZSA9IHdpbmRvd1t0eXBlXSxcbiAgICAgIHggPSAnX19zdG9yYWdlX3Rlc3RfXyc7XG4gICAgc3RvcmFnZS5zZXRJdGVtKHgsIHgpO1xuICAgIHN0b3JhZ2UucmVtb3ZlSXRlbSh4KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgY3VycmVudCBicm93c2VyIGFuZCwgaWYgc3BlY2lmaWVkLCB0aGUgY3VycmVudCBicm93c2VyIHZlcnNpb24uXG4gKiBSZXR1cm5zIHRoZSB1c2VyIGFnZW50IHN0cmluZyBpZiB0aGUgYnJvd3NlciBpcyB1bmtub3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnJvd3Nlck5hbWUoaW5jbHVkZVZlcnNpb24gPSBmYWxzZSkge1xuICBpZiAoaXNDaHJvbWUoKSkge1xuICAgIHJldHVybiAnQ2hyb21lJyArIChpbmNsdWRlVmVyc2lvbiA/IGAgJHtjaHJvbWVWZXJzaW9uKCl9YCA6ICcnKTtcbiAgfVxuXG4gIGlmIChpc0lFKCkpIHtcbiAgICByZXR1cm4gJ0ludGVybmV0IEV4cGxvcmVyJyArIChpbmNsdWRlVmVyc2lvbiA/IGAgJHtJRVZlcnNpb24oKX1gIDogJycpO1xuICB9XG5cbiAgaWYgKGlzRmlyZWZveCgpKSB7XG4gICAgcmV0dXJuICdGaXJlZm94JyArIChpbmNsdWRlVmVyc2lvbiA/IGAgJHtmaXJlZm94VmVyc2lvbigpfWAgOiAnJyk7XG4gIH1cblxuICBpZiAoaXNTYWZhcmkoKSkge1xuICAgIHJldHVybiAnU2FmYXJpJyArIChpbmNsdWRlVmVyc2lvbiA/IGAgJHtzYWZhcmlWZXJzaW9uKCl9YCA6ICcnKTtcbiAgfVxuXG4gIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50O1xufVxuIiwiaW1wb3J0IHtcbiAgQW55QWN0aW9uLFxuICBQYXlsb2FkQWN0aW9uLFxuICBUaHVua0FjdGlvbixcbiAgVGh1bmtEaXNwYXRjaCxcbiAgY3JlYXRlQXN5bmNUaHVuayxcbiAgY3JlYXRlU2xpY2UsXG59IGZyb20gJ0ByZWR1eGpzL3Rvb2xraXQnO1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7c2V0VmVyaWZpZWR9IGZyb20gJ0BjZG8vYXBwcy9jb2RlLXN0dWRpby92ZXJpZmllZEluc3RydWN0b3JSZWR1eCc7XG5pbXBvcnQge1Rlc3RSZXN1bHRzfSBmcm9tICdAY2RvL2FwcHMvY29uc3RhbnRzJztcbmltcG9ydCBMYWIyUmVnaXN0cnkgZnJvbSAnQGNkby9hcHBzL2xhYjIvTGFiMlJlZ2lzdHJ5JztcbmltcG9ydCBub3RpZnlMZXZlbENoYW5nZSBmcm9tICdAY2RvL2FwcHMvbGFiMi91dGlscy9ub3RpZnlMZXZlbENoYW5nZSc7XG5pbXBvcnQge1xuICBwcm9jZXNzU2VydmVyU3R1ZGVudFByb2dyZXNzLFxuICBnZXRMZXZlbFJlc3VsdCxcbn0gZnJvbSAnQGNkby9hcHBzL3RlbXBsYXRlcy9wcm9ncmVzcy9wcm9ncmVzc0hlbHBlcnMnO1xuaW1wb3J0IHtcbiAgTGVzc29uLFxuICBMZXNzb25Hcm91cCxcbiAgVW5pdFByb2dyZXNzLFxuICBQZWVyUmV2aWV3TGVzc29uSW5mbyxcbiAgUGVlclJldmlld1N1bW1hcnksXG4gIFBVWlpMRV9QQUdFX05PTkUsXG4gIEluaXRQcm9ncmVzc1BheWxvYWQsXG4gIExldmVsUmVzdWx0cyxcbiAgVmlld1R5cGUsXG4gIFBlZXJSZXZpZXdMZXZlbEluZm8sXG59IGZyb20gJ0BjZG8vYXBwcy90eXBlcy9wcm9ncmVzc1R5cGVzJztcbmltcG9ydCB7Um9vdFN0YXRlfSBmcm9tICdAY2RvL2FwcHMvdHlwZXMvcmVkdXgnO1xuXG5pbXBvcnQge2dldEJ1YmJsZVVybH0gZnJvbSAnLi4vdGVtcGxhdGVzL3Byb2dyZXNzL0J1YmJsZUZhY3RvcnknO1xuaW1wb3J0IHtBcHBEaXNwYXRjaH0gZnJvbSAnLi4vdXRpbC9yZWR1eEhvb2tzJztcbmltcG9ydCB7bmF2aWdhdGVUb0hyZWZ9IGZyb20gJy4uL3V0aWxzJztcblxuaW1wb3J0IHttZXJnZUFjdGl2aXR5UmVzdWx0fSBmcm9tICcuL2FjdGl2aXR5VXRpbHMnO1xuaW1wb3J0IHtcbiAgY2FuQ2hhbmdlTGV2ZWxJblBhZ2UsXG4gIHVwZGF0ZUJyb3dzZXJGb3JMZXZlbE5hdmlnYXRpb24sXG59IGZyb20gJy4vYnJvd3Nlck5hdmlnYXRpb24nO1xuaW1wb3J0IHthdXRob3JpemVMb2NrYWJsZX0gZnJvbSAnLi9sZXNzb25Mb2NrUmVkdXgnO1xuaW1wb3J0IHtcbiAgZ2V0Q3VycmVudExldmVsLFxuICBnZXRDdXJyZW50U2NyaXB0TGV2ZWxJZCxcbiAgbGV2ZWxCeUlkLFxuICBuZXh0TGV2ZWxJZCxcbn0gZnJvbSAnLi9wcm9ncmVzc1JlZHV4U2VsZWN0b3JzJztcbmltcG9ydCB7U0VUX1ZJRVdfVFlQRX0gZnJvbSAnLi92aWV3QXNSZWR1eCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZ3Jlc3NTdGF0ZSB7XG4gIGN1cnJlbnRMZXZlbElkOiBzdHJpbmcgfCBudWxsO1xuICBjdXJyZW50TGVzc29uSWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgZGVlcGVyTGVhcm5pbmdDb3Vyc2U6IGJvb2xlYW4gfCBudWxsO1xuICBzYXZlQW5zd2Vyc0JlZm9yZU5hdmlnYXRpb246IGJvb2xlYW4gfCBudWxsO1xuICBsZXNzb25zOiBMZXNzb25bXSB8IG51bGw7XG4gIGxlc3Nvbkdyb3VwczogTGVzc29uR3JvdXBbXSB8IG51bGw7XG4gIHNjcmlwdElkOiBudW1iZXIgfCBudWxsO1xuICB2aWV3QXNVc2VySWQ6IG51bWJlciB8IG51bGw7XG4gIHNjcmlwdE5hbWU6IHN0cmluZyB8IG51bGw7XG4gIHNjcmlwdERpc3BsYXlOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHVuaXRUaXRsZTogc3RyaW5nIHwgbnVsbDtcbiAgY291cnNlSWQ6IG51bWJlciB8IG51bGw7XG4gIGlzTGVzc29uRXh0cmFzOiBib29sZWFuO1xuICB1bml0UHJvZ3Jlc3M6IHtcbiAgICBba2V5OiBudW1iZXJdOiBVbml0UHJvZ3Jlc3M7XG4gIH07XG4gIHVuaXRQcm9ncmVzc0hhc0xvYWRlZDogYm9vbGVhbjtcbiAgbGV2ZWxSZXN1bHRzOiBMZXZlbFJlc3VsdHM7XG4gIGZvY3VzQXJlYUxlc3NvbklkczogbnVtYmVyW107XG4gIHBlZXJSZXZpZXdMZXNzb25JbmZvOiBQZWVyUmV2aWV3TGVzc29uSW5mbyB8IG51bGw7XG4gIHBlZXJSZXZpZXdzUGVyZm9ybWVkOiBQZWVyUmV2aWV3U3VtbWFyeVtdO1xuICBwb3N0TWlsZXN0b25lRGlzYWJsZWQ6IGJvb2xlYW47XG4gIGlzQWdlMTNSZXF1aXJlZDogYm9vbGVhbjtcbiAgc3R1ZGVudERlZmF1bHRzU3VtbWFyeVZpZXc6IGJvb2xlYW47XG4gIGlzU3VtbWFyeVZpZXc6IGJvb2xlYW47XG4gIGlzTWluaVZpZXc6IGJvb2xlYW47XG4gIGhhc0Z1bGxQcm9ncmVzczogYm9vbGVhbjtcbiAgbGVzc29uRXh0cmFzRW5hYmxlZDogYm9vbGVhbjtcbiAgdXNpbmdEYlByb2dyZXNzOiBib29sZWFuO1xuICBjdXJyZW50UGFnZU51bWJlcjogbnVtYmVyO1xuICBjb3Vyc2VWZXJzaW9uSWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgdW5pdERlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHVuaXRTdHVkZW50RGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgdW5pdEhhc1VubnVtYmVyZWRMZXNzb25zOiBib29sZWFuO1xuICBjaGFuZ2VGb2N1c0FyZWFQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHVuaXRDb21wbGV0ZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWlsZXN0b25lUmVwb3J0IGV4dGVuZHMgT3B0aW9uYWxNaWxlc3RvbmVEYXRhIHtcbiAgYXBwOiBzdHJpbmc7XG4gIHJlc3VsdDogYm9vbGVhbjtcbiAgdGVzdFJlc3VsdDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgT3B0aW9uYWxNaWxlc3RvbmVEYXRhIHtcbiAgcHJvZ3JhbT86IHN0cmluZztcbiAgLy8gU3VibWl0dGVkIGlzIGEgYm9vbGVhbiwgd2hpY2ggdGhlIHNlcnZlciBleHBlY3RzIGFzIGEgc3RyaW5nLlxuICBzdWJtaXR0ZWQ/OiBzdHJpbmc7XG59XG5cbmNvbnN0IGluaXRpYWxTdGF0ZTogUHJvZ3Jlc3NTdGF0ZSA9IHtcbiAgY3VycmVudExldmVsSWQ6IG51bGwsXG5cbiAgLy8gVGhlc2UgZmlyc3QgZmllbGRzIG5ldmVyIGNoYW5nZSBhZnRlciBpbml0aWFsaXphdGlvbi5cblxuICBjdXJyZW50TGVzc29uSWQ6IHVuZGVmaW5lZCxcbiAgZGVlcGVyTGVhcm5pbmdDb3Vyc2U6IG51bGwsXG4gIC8vIHVzZWQgb24gbXVsdGktcGFnZSBhc3Nlc3NtZW50c1xuICBzYXZlQW5zd2Vyc0JlZm9yZU5hdmlnYXRpb246IG51bGwsXG4gIGxlc3NvbnM6IG51bGwsXG4gIGxlc3Nvbkdyb3VwczogbnVsbCxcbiAgc2NyaXB0SWQ6IG51bGwsXG4gIHZpZXdBc1VzZXJJZDogbnVsbCxcbiAgc2NyaXB0TmFtZTogbnVsbCxcbiAgc2NyaXB0RGlzcGxheU5hbWU6IHVuZGVmaW5lZCxcbiAgdW5pdFRpdGxlOiBudWxsLFxuICBjb3Vyc2VJZDogbnVsbCxcbiAgaXNMZXNzb25FeHRyYXM6IGZhbHNlLFxuXG4gIC8vIFRoZSByZW1haW5pbmcgZmllbGRzIGRvIGNoYW5nZSBhZnRlciBpbml0aWFsaXphdGlvbi5cblxuICAvLyB1bml0UHJvZ3Jlc3MgaXMgb2YgdHlwZSB1bml0UHJvZ3Jlc3NUeXBlIChhIG1hcCBvZiBsZXZlbElkIC0+XG4gIC8vIHN0dWRlbnRMZXZlbFByb2dyZXNzVHlwZSlcbiAgdW5pdFByb2dyZXNzOiB7fSxcbiAgdW5pdFByb2dyZXNzSGFzTG9hZGVkOiBmYWxzZSxcbiAgLy8gbm90ZTogZXZlbnR1YWxseSwgd2UgZXhwZWN0IHVzYWdlIG9mIHRoaXMgZmllbGQgdG8gYmUgcmVwbGFjZWQgd2l0aCB1bml0UHJvZ3Jlc3NcbiAgbGV2ZWxSZXN1bHRzOiB7fSxcbiAgZm9jdXNBcmVhTGVzc29uSWRzOiBbXSxcbiAgcGVlclJldmlld0xlc3NvbkluZm86IG51bGwsXG4gIHBlZXJSZXZpZXdzUGVyZm9ybWVkOiBbXSxcbiAgcG9zdE1pbGVzdG9uZURpc2FibGVkOiBmYWxzZSxcbiAgaXNBZ2UxM1JlcXVpcmVkOiBmYWxzZSxcbiAgLy8gRG8gc3R1ZGVudHMgc2VlIHN1bW1hcnkgdmlldyBieSBkZWZhdWx0P1xuICBzdHVkZW50RGVmYXVsdHNTdW1tYXJ5VmlldzogdHJ1ZSxcbiAgaXNTdW1tYXJ5VmlldzogdHJ1ZSxcbiAgaXNNaW5pVmlldzogZmFsc2UsXG4gIGhhc0Z1bGxQcm9ncmVzczogZmFsc2UsXG4gIGxlc3NvbkV4dHJhc0VuYWJsZWQ6IGZhbHNlLFxuICAvLyBOb3RlOiB1c2luZ0RiUHJvZ3Jlc3MgPT09IFwidXNlciBpcyBsb2dnZWQgaW5cIi4gSG93ZXZlciwgaXQgaXNcbiAgLy8gcG9zc2libGUgdGhhdCB3ZSBjYW4gZ2V0IHRoZSB1c2VyIHByb2dyZXNzIGJhY2sgZnJvbSB0aGUgREJcbiAgLy8gcHJpb3IgdG8gaGF2aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2VyIGxvZ2luIHN0YXRlLlxuICAvLyBUT0RPOiBVc2Ugc2lnbiBpbiBzdGF0ZSB0byBkZXRlcm1pbmUgd2hlcmUgdG8gc291cmNlIHVzZXIgcHJvZ3Jlc3MgZnJvbVxuICB1c2luZ0RiUHJvZ3Jlc3M6IGZhbHNlLFxuICBjdXJyZW50UGFnZU51bWJlcjogUFVaWkxFX1BBR0VfTk9ORSxcbiAgY291cnNlVmVyc2lvbklkOiB1bmRlZmluZWQsXG4gIHVuaXREZXNjcmlwdGlvbjogdW5kZWZpbmVkLFxuICB1bml0U3R1ZGVudERlc2NyaXB0aW9uOiB1bmRlZmluZWQsXG4gIHVuaXRIYXNVbm51bWJlcmVkTGVzc29uczogZmFsc2UsXG4gIGNoYW5nZUZvY3VzQXJlYVBhdGg6IHVuZGVmaW5lZCxcbiAgdW5pdENvbXBsZXRlZDogdW5kZWZpbmVkLFxufTtcblxuY29uc3QgcHJvZ3Jlc3NTbGljZSA9IGNyZWF0ZVNsaWNlKHtcbiAgbmFtZTogJ3Byb2dyZXNzJyxcbiAgaW5pdGlhbFN0YXRlLFxuICByZWR1Y2Vyczoge1xuICAgIGluaXRQcm9ncmVzcyhzdGF0ZSwgYWN0aW9uOiBQYXlsb2FkQWN0aW9uPEluaXRQcm9ncmVzc1BheWxvYWQ+KSB7XG4gICAgICBjb25zdCBsZXNzb25zID0gYWN0aW9uLnBheWxvYWQubGVzc29ucztcbiAgICAgIC8vIFJlLWluaXRpYWxpemluZyB3aXRoIGZ1bGwgc2V0IG9mIGxlc3NvbnMgc2hvdWxkbid0IGJsb3cgYXdheSBjdXJyZW50TGVzc29uSWRcbiAgICAgIGNvbnN0IGN1cnJlbnRMZXNzb25JZCA9XG4gICAgICAgIHN0YXRlLmN1cnJlbnRMZXNzb25JZCB8fFxuICAgICAgICAobGVzc29ucy5sZW5ndGggPT09IDEgPyBsZXNzb25zWzBdLmlkIDogdW5kZWZpbmVkKTtcbiAgICAgIHN0YXRlLmN1cnJlbnRMZXZlbElkIHx8PSBhY3Rpb24ucGF5bG9hZC5jdXJyZW50TGV2ZWxJZDtcbiAgICAgIHN0YXRlLmRlZXBlckxlYXJuaW5nQ291cnNlID0gYWN0aW9uLnBheWxvYWQuZGVlcGVyTGVhcm5pbmdDb3Vyc2U7XG4gICAgICBzdGF0ZS5zYXZlQW5zd2Vyc0JlZm9yZU5hdmlnYXRpb24gPVxuICAgICAgICBhY3Rpb24ucGF5bG9hZC5zYXZlQW5zd2Vyc0JlZm9yZU5hdmlnYXRpb247XG4gICAgICBzdGF0ZS5sZXNzb25zID0gcHJvY2Vzc2VkTGVzc29ucyhcbiAgICAgICAgbGVzc29ucyxcbiAgICAgICAgYWN0aW9uLnBheWxvYWQuZGVlcGVyTGVhcm5pbmdDb3Vyc2VcbiAgICAgICk7XG4gICAgICBzdGF0ZS5sZXNzb25Hcm91cHMgPSBhY3Rpb24ucGF5bG9hZC5sZXNzb25Hcm91cHM7XG4gICAgICBzdGF0ZS5wZWVyUmV2aWV3TGVzc29uSW5mbyA9IGFjdGlvbi5wYXlsb2FkLnBlZXJSZXZpZXdMZXNzb25JbmZvO1xuICAgICAgc3RhdGUuc2NyaXB0SWQgPSBhY3Rpb24ucGF5bG9hZC5zY3JpcHRJZDtcbiAgICAgIHN0YXRlLnNjcmlwdE5hbWUgPSBhY3Rpb24ucGF5bG9hZC5zY3JpcHROYW1lO1xuICAgICAgc3RhdGUuc2NyaXB0RGlzcGxheU5hbWUgPSBhY3Rpb24ucGF5bG9hZC5zY3JpcHREaXNwbGF5TmFtZTtcbiAgICAgIHN0YXRlLnVuaXRUaXRsZSA9IGFjdGlvbi5wYXlsb2FkLnVuaXRUaXRsZTtcbiAgICAgIHN0YXRlLnVuaXREZXNjcmlwdGlvbiA9IGFjdGlvbi5wYXlsb2FkLnVuaXREZXNjcmlwdGlvbjtcbiAgICAgIHN0YXRlLnVuaXRTdHVkZW50RGVzY3JpcHRpb24gPSBhY3Rpb24ucGF5bG9hZC51bml0U3R1ZGVudERlc2NyaXB0aW9uO1xuICAgICAgc3RhdGUudW5pdEhhc1VubnVtYmVyZWRMZXNzb25zID0gYWN0aW9uLnBheWxvYWQudW5pdEhhc1VubnVtYmVyZWRMZXNzb25zO1xuICAgICAgc3RhdGUuY291cnNlSWQgPSBhY3Rpb24ucGF5bG9hZC5jb3Vyc2VJZDtcbiAgICAgIHN0YXRlLmNvdXJzZVZlcnNpb25JZCA9IGFjdGlvbi5wYXlsb2FkLmNvdXJzZVZlcnNpb25JZDtcbiAgICAgIHN0YXRlLmN1cnJlbnRMZXNzb25JZCA9IGN1cnJlbnRMZXNzb25JZDtcbiAgICAgIHN0YXRlLmhhc0Z1bGxQcm9ncmVzcyA9IGFjdGlvbi5wYXlsb2FkLmlzRnVsbFByb2dyZXNzO1xuICAgICAgc3RhdGUuaXNMZXNzb25FeHRyYXMgPSBhY3Rpb24ucGF5bG9hZC5pc0xlc3NvbkV4dHJhcztcbiAgICAgIHN0YXRlLmN1cnJlbnRQYWdlTnVtYmVyID0gYWN0aW9uLnBheWxvYWQuY3VycmVudFBhZ2VOdW1iZXI7XG4gICAgfSxcbiAgICBzZXRDdXJyZW50TGV2ZWxJZChzdGF0ZSwgYWN0aW9uOiBQYXlsb2FkQWN0aW9uPHN0cmluZz4pIHtcbiAgICAgIHN0YXRlLmN1cnJlbnRMZXZlbElkID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgfSxcbiAgICBzZXRTY3JpcHRQcm9ncmVzcyhcbiAgICAgIHN0YXRlLFxuICAgICAgYWN0aW9uOiBQYXlsb2FkQWN0aW9uPHtcbiAgICAgICAgW2xldmVsSWQ6IG51bWJlcl06IFVuaXRQcm9ncmVzcztcbiAgICAgIH0+XG4gICAgKSB7XG4gICAgICBzdGF0ZS51bml0UHJvZ3Jlc3MgPSBwcm9jZXNzU2VydmVyU3R1ZGVudFByb2dyZXNzKGFjdGlvbi5wYXlsb2FkKTtcbiAgICAgIHN0YXRlLnVuaXRQcm9ncmVzc0hhc0xvYWRlZCA9IHRydWU7XG4gICAgfSxcbiAgICBjbGVhclJlc3VsdHMoc3RhdGUpIHtcbiAgICAgIHN0YXRlLmxldmVsUmVzdWx0cyA9IGluaXRpYWxTdGF0ZS5sZXZlbFJlc3VsdHM7XG4gICAgfSxcbiAgICB1c2VEYlByb2dyZXNzKHN0YXRlKSB7XG4gICAgICBzdGF0ZS51c2luZ0RiUHJvZ3Jlc3MgPSB0cnVlO1xuICAgIH0sXG4gICAgbWVyZ2VSZXN1bHRzKHN0YXRlLCBhY3Rpb246IFBheWxvYWRBY3Rpb248TGV2ZWxSZXN1bHRzPikge1xuICAgICAgY29uc3QgbmV3TGV2ZWxSZXN1bHRzOiBMZXZlbFJlc3VsdHMgPSB7fTtcbiAgICAgIGNvbnN0IGNvbWJpbmVkTGV2ZWxzID0gT2JqZWN0LmtleXMoe1xuICAgICAgICAuLi5zdGF0ZS5sZXZlbFJlc3VsdHMsXG4gICAgICAgIC4uLmFjdGlvbi5wYXlsb2FkLFxuICAgICAgfSk7XG4gICAgICBjb21iaW5lZExldmVscy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGNvbnN0IGxldmVsSWQgPSBwYXJzZUludChrZXkpO1xuICAgICAgICBuZXdMZXZlbFJlc3VsdHNbbGV2ZWxJZF0gPSBtZXJnZUFjdGl2aXR5UmVzdWx0KFxuICAgICAgICAgIHN0YXRlLmxldmVsUmVzdWx0c1tsZXZlbElkXSxcbiAgICAgICAgICBhY3Rpb24ucGF5bG9hZFtsZXZlbElkXVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICBzdGF0ZS5sZXZlbFJlc3VsdHMgPSBuZXdMZXZlbFJlc3VsdHM7XG4gICAgfSxcbiAgICBvdmVyd3JpdGVSZXN1bHRzKHN0YXRlLCBhY3Rpb246IFBheWxvYWRBY3Rpb248TGV2ZWxSZXN1bHRzPikge1xuICAgICAgc3RhdGUubGV2ZWxSZXN1bHRzID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgfSxcbiAgICBtZXJnZVBlZXJSZXZpZXdQcm9ncmVzcyhcbiAgICAgIHN0YXRlLFxuICAgICAgYWN0aW9uOiBQYXlsb2FkQWN0aW9uPFBlZXJSZXZpZXdMZXZlbEluZm9bXT5cbiAgICApIHtcbiAgICAgIGlmIChzdGF0ZS5wZWVyUmV2aWV3TGVzc29uSW5mbykge1xuICAgICAgICBzdGF0ZS5wZWVyUmV2aWV3TGVzc29uSW5mbyA9IHtcbiAgICAgICAgICAuLi5zdGF0ZS5wZWVyUmV2aWV3TGVzc29uSW5mbyxcbiAgICAgICAgICBsZXZlbHM6IHN0YXRlLnBlZXJSZXZpZXdMZXNzb25JbmZvLmxldmVscy5tYXAoKGxldmVsLCBpbmRleCkgPT4gKHtcbiAgICAgICAgICAgIC4uLmxldmVsLFxuICAgICAgICAgICAgLi4uYWN0aW9uLnBheWxvYWRbaW5kZXhdLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVwZGF0ZUZvY3VzQXJlYToge1xuICAgICAgcmVkdWNlcihcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIGFjdGlvbjogUGF5bG9hZEFjdGlvbjx7XG4gICAgICAgICAgY2hhbmdlRm9jdXNBcmVhUGF0aDogc3RyaW5nO1xuICAgICAgICAgIGZvY3VzQXJlYUxlc3NvbklkczogbnVtYmVyW107XG4gICAgICAgIH0+XG4gICAgICApIHtcbiAgICAgICAgc3RhdGUuY2hhbmdlRm9jdXNBcmVhUGF0aCA9IGFjdGlvbi5wYXlsb2FkLmNoYW5nZUZvY3VzQXJlYVBhdGg7XG4gICAgICAgIHN0YXRlLmZvY3VzQXJlYUxlc3NvbklkcyA9IGFjdGlvbi5wYXlsb2FkLmZvY3VzQXJlYUxlc3NvbklkcztcbiAgICAgIH0sXG4gICAgICBwcmVwYXJlKGNoYW5nZUZvY3VzQXJlYVBhdGg6IHN0cmluZywgZm9jdXNBcmVhTGVzc29uSWRzOiBudW1iZXJbXSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIGNoYW5nZUZvY3VzQXJlYVBhdGgsXG4gICAgICAgICAgICBmb2N1c0FyZWFMZXNzb25JZHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICBkaXNhYmxlUG9zdE1pbGVzdG9uZShzdGF0ZSkge1xuICAgICAgc3RhdGUucG9zdE1pbGVzdG9uZURpc2FibGVkID0gdHJ1ZTtcbiAgICB9LFxuICAgIHNldElzQWdlMTNSZXF1aXJlZChzdGF0ZSwgYWN0aW9uOiBQYXlsb2FkQWN0aW9uPGJvb2xlYW4+KSB7XG4gICAgICBzdGF0ZS5pc0FnZTEzUmVxdWlyZWQgPSBhY3Rpb24ucGF5bG9hZDtcbiAgICB9LFxuICAgIHNldElzU3VtbWFyeVZpZXcoc3RhdGUsIGFjdGlvbjogUGF5bG9hZEFjdGlvbjxib29sZWFuPikge1xuICAgICAgc3RhdGUuaXNTdW1tYXJ5VmlldyA9IGFjdGlvbi5wYXlsb2FkO1xuICAgIH0sXG4gICAgc2V0SXNNaW5pVmlldyhzdGF0ZSwgYWN0aW9uOiBQYXlsb2FkQWN0aW9uPGJvb2xlYW4+KSB7XG4gICAgICBzdGF0ZS5pc01pbmlWaWV3ID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgfSxcbiAgICBzZXRTdHVkZW50RGVmYXVsdHNTdW1tYXJ5VmlldyhzdGF0ZSwgYWN0aW9uOiBQYXlsb2FkQWN0aW9uPGJvb2xlYW4+KSB7XG4gICAgICBzdGF0ZS5zdHVkZW50RGVmYXVsdHNTdW1tYXJ5VmlldyA9IGFjdGlvbi5wYXlsb2FkO1xuICAgIH0sXG4gICAgc2V0Q3VycmVudExlc3NvbklkKHN0YXRlLCBhY3Rpb246IFBheWxvYWRBY3Rpb248bnVtYmVyPikge1xuICAgICAgLy8gaWYgd2UgYWxyZWFkeSBoYXZlIGEgY3VycmVudExlc3NvbklkLCB0aGF0IG1lYW5zIHdlJ3JlIG9uIGEgcHV6emxlIHBhZ2UsXG4gICAgICAvLyBhbmQgd2Ugd2FudCBjdXJyZW50TGVzc29uSWQgdG8gcmVtYWluIHRoZSBzYW1lIChyYXRoZXIgdGhhbiByZWZsZWN0aW5nXG4gICAgICAvLyB0aGUgbGFzdCBsZXNzb24gdGhlIHVzZXIgaGFzIG1hZGUgcHJvZ3Jlc3Mgb24pLlxuICAgICAgaWYgKCFzdGF0ZS5jdXJyZW50TGVzc29uSWQpIHtcbiAgICAgICAgc3RhdGUuY3VycmVudExlc3NvbklkID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgICB9XG4gICAgfSxcbiAgICBzZXRTY3JpcHRDb21wbGV0ZWQoc3RhdGUpIHtcbiAgICAgIHN0YXRlLnVuaXRDb21wbGV0ZWQgPSB0cnVlO1xuICAgIH0sXG4gICAgc2V0TGVzc29uRXh0cmFzRW5hYmxlZChzdGF0ZSwgYWN0aW9uOiBQYXlsb2FkQWN0aW9uPGJvb2xlYW4+KSB7XG4gICAgICBzdGF0ZS5sZXNzb25FeHRyYXNFbmFibGVkID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgfSxcbiAgICBzZXRWaWV3QXNVc2VySWQoc3RhdGUsIGFjdGlvbjogUGF5bG9hZEFjdGlvbjxudW1iZXIgfCBudWxsPikge1xuICAgICAgc3RhdGUudmlld0FzVXNlcklkID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgfSxcbiAgfSxcbiAgZXh0cmFSZWR1Y2Vyczoge1xuICAgIC8vIFRPRE86IFdoZW4gd2UgY29udmVydCB2aWV3QXNSZWR1eCB0byByZWR1eC10b29sa2l0LCB3ZSB3aWxsIG5lZWQgdG8gdXNlXG4gICAgLy8gY3JlYXRlQWN0aW9uIHRoZXJlIGluc3RlYWQgb2YgcmVmZXJlbmNpbmcgdGhlIHN0cmluZyBoZXJlLlxuICAgIFtTRVRfVklFV19UWVBFXTogKHN0YXRlLCBhY3Rpb246IHt2aWV3VHlwZToga2V5b2YgdHlwZW9mIFZpZXdUeXBlfSkgPT4ge1xuICAgICAgc3RhdGUuaXNTdW1tYXJ5VmlldyA9XG4gICAgICAgIGFjdGlvbi52aWV3VHlwZSA9PT0gVmlld1R5cGUuUGFydGljaXBhbnQgJiZcbiAgICAgICAgc3RhdGUuc3R1ZGVudERlZmF1bHRzU3VtbWFyeVZpZXc7XG4gICAgfSxcbiAgfSxcbn0pO1xuXG4vLyBUaHVua3NcbnR5cGUgUHJvZ3Jlc3NUaHVua0FjdGlvbiA9IFRodW5rQWN0aW9uPHZvaWQsIFJvb3RTdGF0ZSwgdW5kZWZpbmVkLCBBbnlBY3Rpb24+O1xudHlwZSBBc3luY1Byb2dyZXNzVGh1bmtBY3Rpb24gPSBUaHVua0FjdGlvbjxcbiAgUHJvbWlzZTx2b2lkPixcbiAgUm9vdFN0YXRlLFxuICB1bmRlZmluZWQsXG4gIEFueUFjdGlvblxuPjtcblxuZXhwb3J0IGNvbnN0IHF1ZXJ5VXNlclByb2dyZXNzID1cbiAgKHVzZXJJZDogc3RyaW5nLCBtZXJnZVByb2dyZXNzOiBib29sZWFuID0gdHJ1ZSk6IFByb2dyZXNzVGh1bmtBY3Rpb24gPT5cbiAgKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHN0YXRlID0gZ2V0U3RhdGUoKS5wcm9ncmVzcztcbiAgICByZXR1cm4gdXNlclByb2dyZXNzRnJvbVNlcnZlcihzdGF0ZSwgZGlzcGF0Y2gsIHVzZXJJZCwgbWVyZ2VQcm9ncmVzcyk7XG4gIH07XG5cbi8vIFRoZSB1c2VyIGhhcyBuYXZpZ2F0ZWQgdG8gYSBuZXcgbGV2ZWwgaW4gdGhlIGN1cnJlbnQgbGVzc29uLFxuLy8gc28gd2Ugc2hvdWxkIHVwZGF0ZSB0aGUgYnJvd3NlciBhbmQgYWxzbyBzZXQgdGhpcyBhcyB0aGUgbmV3XG4vLyBjdXJyZW50IGxldmVsLlxuZXhwb3J0IGZ1bmN0aW9uIG5hdmlnYXRlVG9MZXZlbElkKGxldmVsSWQ6IHN0cmluZyk6IFByb2dyZXNzVGh1bmtBY3Rpb24ge1xuICByZXR1cm4gYXN5bmMgKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHN0YXRlID0gZ2V0U3RhdGUoKS5wcm9ncmVzcztcbiAgICBpZiAoIXN0YXRlLmN1cnJlbnRMZXNzb25JZCB8fCAhc3RhdGUuY3VycmVudExldmVsSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV3TGV2ZWwgPSBsZXZlbEJ5SWQoc3RhdGUsIHN0YXRlLmN1cnJlbnRMZXNzb25JZCwgbGV2ZWxJZCk7XG4gICAgaWYgKCFuZXdMZXZlbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRMZXZlbCA9IGdldEN1cnJlbnRMZXZlbChnZXRTdGF0ZSgpKTtcblxuICAgIGlmIChjYW5DaGFuZ2VMZXZlbEluUGFnZShjdXJyZW50TGV2ZWwsIG5ld0xldmVsKSkge1xuICAgICAgLy8gSWYgdGhlIHJlcXVlc3RlZCBsZXZlbCBpcyB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBsZXZlbCwgZG9uJ3QgZG8gYW55dGhpbmcuXG4gICAgICBpZiAoc3RhdGUuY3VycmVudExldmVsSWQgPT09IGxldmVsSWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdXBkYXRlQnJvd3NlckZvckxldmVsTmF2aWdhdGlvbihzdGF0ZSwgbmV3TGV2ZWwucGF0aCwgbGV2ZWxJZCk7XG4gICAgICAvLyBOb3RpZnkgdGhlIExhYjIgc3lzdGVtIHRoYXQgdGhlIGxldmVsIGlzIGNoYW5naW5nLlxuICAgICAgbm90aWZ5TGV2ZWxDaGFuZ2UoY3VycmVudExldmVsLmlkLCBsZXZlbElkKTtcbiAgICAgIGRpc3BhdGNoKHNldEN1cnJlbnRMZXZlbElkKGxldmVsSWQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGN1cnJlbnRMZXZlbD8udXNlc0xhYjIpIHtcbiAgICAgICAgLy8gSWYgd2UgYXJlIHN3aXRjaGluZyBmcm9tIGEgbGFiMiBsZXZlbCBidXQgY2FuJ3QgY2hhbmdlIHRoZSBsZXZlbCB3aXRob3V0IHJlbG9hZGluZyxcbiAgICAgICAgLy8gd2UgY2xlYW4gdXAgdGhlIHByb2plY3QgbWFuYWdlciAoaWYgaXQgZXhpc3RzKSB0byBhdm9pZCBhIGNvbmZ1c2luZyBwb3AtdXAgdG8gdXNlcnNcbiAgICAgICAgLy8gaWYgdGhlaXIgbW9zdCByZWNlbnQgY29kZSBoYXMgbm90IHNhdmVkLlxuICAgICAgICBhd2FpdCBMYWIyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRQcm9qZWN0TWFuYWdlcigpPy5jbGVhblVwKCk7XG4gICAgICB9XG4gICAgICBjb25zdCB1cmwgPSBnZXRCdWJibGVVcmwobmV3TGV2ZWwucGF0aCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgbmF2aWdhdGVUb0hyZWYodXJsKTtcbiAgICB9XG4gIH07XG59XG5cbi8vIE5hdmlnYXRlIHRvIHRoZSBuZXh0IGxldmVsIGluIHRoZSBwcm9ncmVzc2lvbiwgaWYgaXQgZXhpc3RzLlxuZXhwb3J0IGZ1bmN0aW9uIG5hdmlnYXRlVG9OZXh0TGV2ZWwoKTogUHJvZ3Jlc3NUaHVua0FjdGlvbiB7XG4gIHJldHVybiAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gICAgY29uc3QgbGV2ZWxJZCA9IG5leHRMZXZlbElkKGdldFN0YXRlKCkpO1xuICAgIGlmIChsZXZlbElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZGlzcGF0Y2gobmF2aWdhdGVUb0xldmVsSWQobGV2ZWxJZCkpO1xuICB9O1xufVxuXG4vLyBUaGUgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCB0aGUgbGV2ZWwgYW5kIHRoZSBwYWdlXG4vLyB3aWxsIG5vdCBiZSByZWxvYWRpbmcuIEN1cnJlbnRseSBvbmx5IHVzZWQgYnkgTGFiMiBsYWJzLlxuZXhwb3J0IGZ1bmN0aW9uIHNlbmRTdWNjZXNzUmVwb3J0KGFwcFR5cGU6IHN0cmluZyk6IEFzeW5jUHJvZ3Jlc3NUaHVua0FjdGlvbiB7XG4gIHJldHVybiAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gICAgcmV0dXJuIHNlbmRSZXBvcnRIZWxwZXIoYXBwVHlwZSwgVGVzdFJlc3VsdHMuQUxMX1BBU1MsIGRpc3BhdGNoLCBnZXRTdGF0ZSk7XG4gIH07XG59XG5cbi8vIFNlbmQgYSByZXBvcnQgb2YgdXNlciBwcm9ncmVzcyAoZS5nLiwgVGVzdFJlc3VsdHMuTEVWRUxfQVRURU1QVEVEKSBvbiBhbiBhcHBUeXBlIGxldmVsLlxuLy8gQ3VycmVudGx5IG9ubHkgdXNlZCBieSBMYWIyIGxhYnMuXG5leHBvcnQgZnVuY3Rpb24gc2VuZFByb2dyZXNzUmVwb3J0KFxuICBhcHBUeXBlOiBzdHJpbmcsXG4gIHJlc3VsdDogVGVzdFJlc3VsdHNcbik6IEFzeW5jUHJvZ3Jlc3NUaHVua0FjdGlvbiB7XG4gIHJldHVybiAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gICAgcmV0dXJuIHNlbmRSZXBvcnRIZWxwZXIoYXBwVHlwZSwgcmVzdWx0LCBkaXNwYXRjaCwgZ2V0U3RhdGUpO1xuICB9O1xufVxuXG5leHBvcnQgY29uc3Qgc2VuZFByZWRpY3RMZXZlbFJlcG9ydCA9IGNyZWF0ZUFzeW5jVGh1bms8XG4gIHZvaWQsXG4gIHthcHBUeXBlOiBzdHJpbmc7IHByZWRpY3RSZXNwb25zZTogc3RyaW5nfSxcbiAge1xuICAgIGRpc3BhdGNoOiBBcHBEaXNwYXRjaDtcbiAgICBzdGF0ZTogUm9vdFN0YXRlO1xuICB9XG4+KCdwcm9ncmVzcy9zZW5kUHJlZGljdExldmVsUmVwb3J0JywgYXN5bmMgKHBheWxvYWQsIHRodW5rQVBJKSA9PiB7XG4gIGNvbnN0IGV4dHJhUGF5bG9hZCA9IHtcbiAgICBwcm9ncmFtOiBwYXlsb2FkLnByZWRpY3RSZXNwb25zZSxcbiAgfTtcbiAgc2VuZFJlcG9ydEhlbHBlcihcbiAgICBwYXlsb2FkLmFwcFR5cGUsXG4gICAgVGVzdFJlc3VsdHMuQ09OVEFJTkVEX0xFVkVMX1JFU1VMVCxcbiAgICB0aHVua0FQSS5kaXNwYXRjaCxcbiAgICB0aHVua0FQSS5nZXRTdGF0ZSxcbiAgICBleHRyYVBheWxvYWRcbiAgKTtcbn0pO1xuXG5leHBvcnQgY29uc3Qgc2VuZFN1Ym1pdFJlcG9ydCA9IGNyZWF0ZUFzeW5jVGh1bms8XG4gIHZvaWQsXG4gIHthcHBUeXBlOiBzdHJpbmc7IHN1Ym1pdHRlZDogYm9vbGVhbn0sXG4gIHtcbiAgICBkaXNwYXRjaDogQXBwRGlzcGF0Y2g7XG4gICAgc3RhdGU6IFJvb3RTdGF0ZTtcbiAgfVxuPigncHJvZ3Jlc3Mvc2VuZFN1Ym1pdFJlcG9ydCcsIGFzeW5jIChwYXlsb2FkLCB0aHVua0FQSSkgPT4ge1xuICBjb25zdCBleHRyYVBheWxvYWQgPSB7XG4gICAgc3VibWl0dGVkOiBwYXlsb2FkLnN1Ym1pdHRlZC50b1N0cmluZygpLFxuICB9O1xuICBjb25zdCByZXN1bHQgPSBwYXlsb2FkLnN1Ym1pdHRlZFxuICAgID8gVGVzdFJlc3VsdHMuU1VCTUlUVEVEX1JFU1VMVFxuICAgIDogVGVzdFJlc3VsdHMuVU5TVUJNSVRURURfQVRURU1QVDtcbiAgYXdhaXQgc2VuZFJlcG9ydEhlbHBlcihcbiAgICBwYXlsb2FkLmFwcFR5cGUsXG4gICAgcmVzdWx0LFxuICAgIHRodW5rQVBJLmRpc3BhdGNoLFxuICAgIHRodW5rQVBJLmdldFN0YXRlLFxuICAgIGV4dHJhUGF5bG9hZFxuICApO1xuICAvLyBTdWJtaXQgc3RhdHVzIGlzbid0IHByb3Blcmx5IHVwZGF0ZWQgYnkganVzdCBzYXZpbmcgdGhlIHN0YXR1cyBjb2RlLCBzbyByZS1xdWVyeVxuICAvLyB1c2VyIHByb2dyZXNzIHRvIGZvcmNlIHRoZSBidWJibGUgdG8gdXBkYXRlLlxuICB0aHVua0FQSS5kaXNwYXRjaChcbiAgICBxdWVyeVVzZXJQcm9ncmVzcyh0aHVua0FQSS5nZXRTdGF0ZSgpLmN1cnJlbnRVc2VyLnVzZXJJZC50b1N0cmluZygpKVxuICApO1xufSk7XG5cbi8vIEhlbHBlcnNcblxuZnVuY3Rpb24gc2VuZFJlcG9ydEhlbHBlcihcbiAgYXBwVHlwZTogc3RyaW5nLFxuICByZXN1bHQ6IG51bWJlcixcbiAgZGlzcGF0Y2g6IFRodW5rRGlzcGF0Y2g8Um9vdFN0YXRlLCB1bmRlZmluZWQsIEFueUFjdGlvbj4sXG4gIGdldFN0YXRlOiAoKSA9PiBSb290U3RhdGUsXG4gIGV4dHJhRGF0YT86IE9wdGlvbmFsTWlsZXN0b25lRGF0YVxuKSB7XG4gIGNvbnN0IHN0YXRlID0gZ2V0U3RhdGUoKS5wcm9ncmVzcztcbiAgY29uc3QgbGV2ZWxJZCA9IHN0YXRlLmN1cnJlbnRMZXZlbElkO1xuICBpZiAoIXN0YXRlLmN1cnJlbnRMZXNzb25JZCB8fCAhbGV2ZWxJZCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICBjb25zdCBzY3JpcHRMZXZlbElkID0gZ2V0Q3VycmVudFNjcmlwdExldmVsSWQoZ2V0U3RhdGUoKSk7XG4gIGlmICghc2NyaXB0TGV2ZWxJZCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIC8vIFRoZSBzZXJ2ZXIgZG9lcyBub3QgYXBwZWFyIHRvIHVzZSB0aGUgdXNlciBJRCBwYXJhbWV0ZXIsXG4gIC8vIHNvIGp1c3QgcGFzcyAwLCBsaWtlIHNvbWUgb3RoZXIgbWlsZXN0b25lIHBvc3RzIGRvLlxuICBjb25zdCB1c2VySWQgPSAwO1xuICBleHRyYURhdGEgPSBleHRyYURhdGEgfHwge307XG5cbiAgY29uc3QgZGF0YTogTWlsZXN0b25lUmVwb3J0ID0ge1xuICAgIGFwcDogYXBwVHlwZSxcbiAgICByZXN1bHQ6IHRydWUsXG4gICAgdGVzdFJlc3VsdDogcmVzdWx0LFxuICAgIC4uLmV4dHJhRGF0YSxcbiAgfTtcblxuICByZXR1cm4gZmV0Y2goYC9taWxlc3RvbmUvJHt1c2VySWR9LyR7c2NyaXB0TGV2ZWxJZH0vJHtsZXZlbElkfWAsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gIH0pLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgIGlmIChyZXNwb25zZS5vayAmJiBsZXZlbElkICE9PSBudWxsKSB7XG4gICAgICAvLyBVcGRhdGUgdGhlIHByb2dyZXNzIHN0b3JlIGJ5IG1lcmdpbmcgaW4gdGhpc1xuICAgICAgLy8gcGFydGljdWxhciByZXN1bHQgaW1tZWRpYXRlbHkuXG4gICAgICBkaXNwYXRjaChtZXJnZVJlc3VsdHMoe1tsZXZlbElkXTogcmVzdWx0fSkpO1xuICAgICAgLy8gSWYgdGhlIGxldmVsIGlzIHRoZSBzdWJsZXZlbCBvZiBhIGJ1YmJsZSBsZXZlbCxcbiAgICAgIC8vIGFsc28gdXBkYXRlIHRoZSBzdGF0dXMgb2YgdGhlIHBhcmVudCBsZXZlbC5cbiAgICAgIGNvbnN0IGN1cnJlbnRMZXZlbCA9IGdldEN1cnJlbnRMZXZlbChnZXRTdGF0ZSgpKTtcbiAgICAgIGlmIChjdXJyZW50TGV2ZWwucGFyZW50TGV2ZWxJZCkge1xuICAgICAgICBkaXNwYXRjaChtZXJnZVJlc3VsdHMoe1tjdXJyZW50TGV2ZWwucGFyZW50TGV2ZWxJZF06IHJlc3VsdH0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlcXVlc3RzIHVzZXIgcHJvZ3Jlc3MgZnJvbSB0aGUgc2VydmVyIGFuZCBkaXNwYXRjaGVzIG90aGVyIHJlZHV4IGFjdGlvbnNcbiAqIGJhc2VkIG9uIHRoZSBzZXJ2ZXIncyByZXNwb25zZSBkYXRhLlxuICovXG5jb25zdCB1c2VyUHJvZ3Jlc3NGcm9tU2VydmVyID0gKFxuICBzdGF0ZTogUHJvZ3Jlc3NTdGF0ZSxcbiAgZGlzcGF0Y2g6IFRodW5rRGlzcGF0Y2g8e3Byb2dyZXNzOiBQcm9ncmVzc1N0YXRlfSwgdW5kZWZpbmVkLCBBbnlBY3Rpb24+LFxuICB1c2VySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsLFxuICBtZXJnZVByb2dyZXNzOiBib29sZWFuXG4pID0+IHtcbiAgaWYgKCFzdGF0ZS5zY3JpcHROYW1lKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBDb3VsZCBub3QgcmVxdWVzdCBwcm9ncmVzcyBmb3IgdXNlciBJRCAke3VzZXJJZH0gZnJvbSBzZXJ2ZXI6IHNjcmlwdE5hbWUgbXVzdCBiZSBwcmVzZW50IGluIHByb2dyZXNzIHJlZHV4LmA7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICB9XG5cbiAgLy8gSWYgd2UgaGF2ZSBhIHVzZXJJZCwgd2UgY2FuIGNsZWFyIGFueSBwcm9ncmVzcyBpbiByZWR1eCBhbmQgcmVxdWVzdCBhbGwgcHJvZ3Jlc3NcbiAgLy8gZnJvbSB0aGUgc2VydmVyLlxuICBpZiAodXNlcklkKSB7XG4gICAgZGlzcGF0Y2goY2xlYXJSZXN1bHRzKCkpO1xuICB9XG5cbiAgcmV0dXJuICQuYWpheCh7XG4gICAgdXJsOiBgL2FwaS91c2VyX3Byb2dyZXNzLyR7c3RhdGUuc2NyaXB0TmFtZX1gLFxuICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgZGF0YToge3VzZXJfaWQ6IHVzZXJJZH0sXG4gIH0pLmRvbmUoZGF0YSA9PiB7XG4gICAgaWYgKCFkYXRhIHx8IF8uaXNFbXB0eShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkYXRhLmlzVmVyaWZpZWRJbnN0cnVjdG9yKSB7XG4gICAgICBkaXNwYXRjaChzZXRWZXJpZmllZCgpKTtcbiAgICB9XG5cbiAgICAvLyBXZSBhcmUgb24gYW4gb3ZlcnZpZXcgcGFnZSBpZiBjdXJyZW50TGV2ZWxJZCBpcyB1bmRlZmluZWQuXG4gICAgY29uc3Qgb25PdmVydmlld1BhZ2UgPSAhc3RhdGUuY3VycmVudExldmVsSWQ7XG4gICAgLy8gU2hvdyBsZXNzb24gcGxhbiBsaW5rcyBhbmQgb3RoZXIgdGVhY2hlciBpbmZvIGlmIGluc3RydWN0b3IgYW5kIG9uIHVuaXQgb3ZlcnZpZXcgcGFnZS5cbiAgICBpZiAoXG4gICAgICAoZGF0YS5pc0luc3RydWN0b3IgfHwgZGF0YS50ZWFjaGVyVmlld2luZ1N0dWRlbnQpICYmXG4gICAgICAhZGF0YS5kZWVwZXJMZWFybmluZ0NvdXJzZSAmJlxuICAgICAgb25PdmVydmlld1BhZ2VcbiAgICApIHtcbiAgICAgIC8vIERlZmF1bHQgdG8gc3VtbWFyeSB2aWV3IGlmIHRlYWNoZXIgaXMgdmlld2luZyB0aGVpciBzdHVkZW50LCBvdGhlcndpc2UgZGVmYXVsdCB0byBkZXRhaWwgdmlldy5cbiAgICAgIGRpc3BhdGNoKHNldElzU3VtbWFyeVZpZXcoZGF0YS50ZWFjaGVyVmlld2luZ1N0dWRlbnQpKTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5mb2N1c0FyZWFMZXNzb25JZHMpIHtcbiAgICAgIGRpc3BhdGNoKFxuICAgICAgICB1cGRhdGVGb2N1c0FyZWEoZGF0YS5jaGFuZ2VGb2N1c0FyZWFQYXRoLCBkYXRhLmZvY3VzQXJlYUxlc3NvbklkcylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZGlzcGF0Y2goYXV0aG9yaXplTG9ja2FibGUoZGF0YS5sb2NrYWJsZUF1dGhvcml6ZWQpKTtcblxuICAgIGlmIChkYXRhLmNvbXBsZXRlZCkge1xuICAgICAgZGlzcGF0Y2goc2V0U2NyaXB0Q29tcGxldGVkKCkpO1xuICAgIH1cblxuICAgIC8vIE1lcmdlIHByb2dyZXNzIGZyb20gc2VydmVyXG4gICAgaWYgKGRhdGEucHJvZ3Jlc3MpIHtcbiAgICAgIGRpc3BhdGNoKHNldFNjcmlwdFByb2dyZXNzKGRhdGEucHJvZ3Jlc3MpKTtcblxuICAgICAgaWYgKG1lcmdlUHJvZ3Jlc3MpIHtcbiAgICAgICAgLy8gTm90ZSB0aGF0IHdlIHNldCB0aGUgZnVsbCBwcm9ncmVzcyBvYmplY3QgYWJvdmUgaW4gcmVkdXggYnV0IGFsc28gc2V0XG4gICAgICAgIC8vIGEgbWFwIGNvbnRhaW5pbmcganVzdCBsZXZlbCByZXN1bHRzLiBUaGlzIGlzIHRoZSBsZWdhY3kgY29kZSBwYXRoIGFuZFxuICAgICAgICAvLyB0aGUgZ29hbCBpcyB0byBldmVudHVhbGx5IHVwZGF0ZSBhbGwgY29kZSBwYXRocyB0byB1c2UgdW5pdFByb2dyZXNzXG4gICAgICAgIC8vIGluc3RlYWQgb2YgbGV2ZWxSZXN1bHRzLlxuICAgICAgICBjb25zdCBsZXZlbFJlc3VsdHMgPSBfLm1hcFZhbHVlcyhkYXRhLnByb2dyZXNzLCBnZXRMZXZlbFJlc3VsdCk7XG4gICAgICAgIGRpc3BhdGNoKG1lcmdlUmVzdWx0cyhsZXZlbFJlc3VsdHMpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEucGVlclJldmlld3NQZXJmb3JtZWQpIHtcbiAgICAgICAgZGlzcGF0Y2gobWVyZ2VQZWVyUmV2aWV3UHJvZ3Jlc3MoZGF0YS5wZWVyUmV2aWV3c1BlcmZvcm1lZCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS5jdXJyZW50X2xlc3Nvbikge1xuICAgICAgICBkaXNwYXRjaChzZXRDdXJyZW50TGVzc29uSWQoZGF0YS5jdXJyZW50X2xlc3NvbikpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIERvZXMgc29tZSBwcm9jZXNzaW5nIG9mIG91ciBwYXNzZWQgaW4gbGVzc29uLCBuYW1lbHlcbiAqIC0gUmVtb3ZlcyAnaGlkZGVuJyBmaWVsZFxuICogLSBBZGRzICdsZXNzb25OdW1iZXInIGZpZWxkIGZvciBub24tUExDIGxlc3NvbnMgd2hpY2hcbiAqIGFyZSBub3QgbG9ja2FibGUgb3IgaGF2ZSBhIGxlc3NvbiBwbGFuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzZWRMZXNzb25zKGxlc3NvbnM6IExlc3NvbltdLCBpc1BsYzogYm9vbGVhbikge1xuICBsZXQgbnVtTGVzc29uc1dpdGhMZXNzb25QbGFuID0gMDtcblxuICByZXR1cm4gbGVzc29ucy5tYXAobGVzc29uID0+IHtcbiAgICBsZXQgbGVzc29uTnVtYmVyO1xuICAgIGlmICghaXNQbGMgJiYgbGVzc29uLm51bWJlcmVkTGVzc29uKSB7XG4gICAgICBudW1MZXNzb25zV2l0aExlc3NvblBsYW4rKztcbiAgICAgIGxlc3Nvbk51bWJlciA9IG51bUxlc3NvbnNXaXRoTGVzc29uUGxhbjtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLl8ub21pdChsZXNzb24sICdoaWRkZW4nKSxcbiAgICAgIGxlc3Nvbk51bWJlcixcbiAgICB9O1xuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IHtcbiAgaW5pdFByb2dyZXNzLFxuICBzZXRDdXJyZW50TGV2ZWxJZCxcbiAgc2V0U2NyaXB0UHJvZ3Jlc3MsXG4gIGNsZWFyUmVzdWx0cyxcbiAgdXNlRGJQcm9ncmVzcyxcbiAgbWVyZ2VSZXN1bHRzLFxuICBvdmVyd3JpdGVSZXN1bHRzLFxuICBtZXJnZVBlZXJSZXZpZXdQcm9ncmVzcyxcbiAgdXBkYXRlRm9jdXNBcmVhLFxuICBkaXNhYmxlUG9zdE1pbGVzdG9uZSxcbiAgc2V0SXNBZ2UxM1JlcXVpcmVkLFxuICBzZXRJc1N1bW1hcnlWaWV3LFxuICBzZXRJc01pbmlWaWV3LFxuICBzZXRTdHVkZW50RGVmYXVsdHNTdW1tYXJ5VmlldyxcbiAgc2V0Q3VycmVudExlc3NvbklkLFxuICBzZXRTY3JpcHRDb21wbGV0ZWQsXG4gIHNldExlc3NvbkV4dHJhc0VuYWJsZWQsXG4gIHNldFZpZXdBc1VzZXJJZCxcbn0gPSBwcm9ncmVzc1NsaWNlLmFjdGlvbnM7XG5cbmV4cG9ydCBkZWZhdWx0IHByb2dyZXNzU2xpY2UucmVkdWNlcjtcblxuLy8gZXhwb3J0IHByaXZhdGUgZnVuY3Rpb24ocykgdG8gZXhwb3NlIHRvIHVuaXQgdGVzdGluZ1xuZXhwb3J0IGNvbnN0IF9fdGVzdG9ubHlfXyA9IElOX1VOSVRfVEVTVFxuICA/IHtcbiAgICAgIHVzZXJQcm9ncmVzc0Zyb21TZXJ2ZXIsXG4gICAgfVxuICA6IHt9O1xuIiwiaW1wb3J0IE1ldHJpY3NSZXBvcnRlciBmcm9tICdAY2RvL2FwcHMvbWV0cmljcy9NZXRyaWNzUmVwb3J0ZXInO1xuaW1wb3J0IHtNZXRyaWNEaW1lbnNpb24sIE1ldHJpY1VuaXR9IGZyb20gJ0BjZG8vYXBwcy9tZXRyaWNzL3R5cGVzJztcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHRoYXQgdGhpcyBtZXRyaWMgcmVwb3J0ZXIgd2lsbCBhZGQgdG8gbG9nIHBheWxvYWRzLlxuICovXG5pbnRlcmZhY2UgUmVwb3J0aW5nUHJvcGVydGllcyB7XG4gIGNoYW5uZWxJZD86IHN0cmluZztcbiAgYXBwTmFtZT86IHN0cmluZztcbiAgY3VycmVudExldmVsSWQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gIHNjcmlwdElkPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIE1ldHJpY3MgcmVwb3J0ZXIgZm9yIGxhYnMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExhYk1ldHJpY3NSZXBvcnRlciB7XG4gIC8vIENvbW1vbiBmaWVsZHMgdGhhdCBhcmUgYWRkZWQgdG8gZXZlcnkgbG9nIHBheWxvYWQuXG4gIHByaXZhdGUgY29tbW9uUHJvcGVydGllczogUmVwb3J0aW5nUHJvcGVydGllcyA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKGluaXRpYWxQcm9wZXJ0aWVzPzogUmVwb3J0aW5nUHJvcGVydGllcykge1xuICAgIHRoaXMuY29tbW9uUHJvcGVydGllcyA9IGluaXRpYWxQcm9wZXJ0aWVzIHx8IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjb21tb24gcHJvcGVydGllcyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gbG9nIHBheWxvYWRzLlxuICAgKiBQcm92aWRlZCBwcm9wZXJ0aWVzIHdpbGwgYmUgbWVyZ2VkIHdpdGggZXhpc3RpbmcgcHJvcGVydGllcyxcbiAgICogc28gc2luZ2xlIHByb3BlcnRpZXMgY2FuIGJlIHVwZGF0ZWQgd2l0aG91dCBvdmVyd3JpdGluZyBvdGhlcnMuXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlUHJvcGVydGllcyhwcm9wZXJ0aWVzOiBSZXBvcnRpbmdQcm9wZXJ0aWVzKSB7XG4gICAgdGhpcy5jb21tb25Qcm9wZXJ0aWVzID0gey4uLnRoaXMuY29tbW9uUHJvcGVydGllcywgLi4ucHJvcGVydGllc307XG4gIH1cblxuICBwdWJsaWMgbG9nSW5mbyhtZXNzYWdlOiBzdHJpbmcgfCBvYmplY3QpIHtcbiAgICBNZXRyaWNzUmVwb3J0ZXIubG9nSW5mbyh0aGlzLmRlY29yYXRlTWVzc2FnZShtZXNzYWdlKSk7XG4gIH1cblxuICBwdWJsaWMgbG9nV2FybmluZyhtZXNzYWdlOiBzdHJpbmcgfCBvYmplY3QpIHtcbiAgICBNZXRyaWNzUmVwb3J0ZXIubG9nV2FybmluZyh0aGlzLmRlY29yYXRlTWVzc2FnZShtZXNzYWdlKSk7XG4gIH1cblxuICBwdWJsaWMgbG9nRXJyb3IoZXJyb3JNZXNzYWdlOiBzdHJpbmcsIGVycm9yPzogRXJyb3IsIGRldGFpbHM/OiBvYmplY3QpIHtcbiAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgZXJyb3JNZXNzYWdlLFxuICAgICAgZXJyb3I6IGVycm9yPy5zdGFjayB8fCBlcnJvcj8ubWVzc2FnZSxcbiAgICAgIGRldGFpbHMsXG4gICAgfTtcbiAgICBNZXRyaWNzUmVwb3J0ZXIubG9nRXJyb3IodGhpcy5kZWNvcmF0ZU1lc3NhZ2UobWVzc2FnZSkpO1xuICB9XG5cbiAgcHVibGljIHJlcG9ydExvYWRUaW1lKFxuICAgIG1ldHJpY05hbWU6IHN0cmluZyxcbiAgICBsb2FkVGltZU1zOiBudW1iZXIsXG4gICAgZGltZW5zaW9uczogTWV0cmljRGltZW5zaW9uW10gPSBbXVxuICApIHtcbiAgICBNZXRyaWNzUmVwb3J0ZXIucHVibGlzaE1ldHJpYyhtZXRyaWNOYW1lLCBsb2FkVGltZU1zLCAnTWlsbGlzZWNvbmRzJywgW1xuICAgICAgLi4uZGltZW5zaW9ucyxcbiAgICAgIC4uLnRoaXMuZ2V0Q29tbW9uRGltZW5zaW9ucygpLFxuICAgIF0pO1xuICB9XG5cbiAgcHVibGljIHB1Ymxpc2hNZXRyaWMoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICAgdW5pdDogTWV0cmljVW5pdCxcbiAgICBkaW1lbnNpb25zOiBNZXRyaWNEaW1lbnNpb25bXSA9IFtdXG4gICkge1xuICAgIE1ldHJpY3NSZXBvcnRlci5wdWJsaXNoTWV0cmljKG5hbWUsIHZhbHVlLCB1bml0LCBbXG4gICAgICAuLi5kaW1lbnNpb25zLFxuICAgICAgLi4udGhpcy5nZXRDb21tb25EaW1lbnNpb25zKCksXG4gICAgXSk7XG4gIH1cblxuICBwdWJsaWMgaW5jcmVtZW50Q291bnRlcihcbiAgICBtZXRyaWNOYW1lOiBzdHJpbmcsXG4gICAgZGltZW5zaW9uczogTWV0cmljRGltZW5zaW9uW10gPSBbXVxuICApIHtcbiAgICBNZXRyaWNzUmVwb3J0ZXIuaW5jcmVtZW50Q291bnRlcihtZXRyaWNOYW1lLCBbXG4gICAgICAuLi5kaW1lbnNpb25zLFxuICAgICAgLi4udGhpcy5nZXRDb21tb25EaW1lbnNpb25zKCksXG4gICAgXSk7XG4gIH1cblxuICBwdWJsaWMgcmVwb3J0U2V2ZXJlRXJyb3IoZGltZW5zaW9uczogTWV0cmljRGltZW5zaW9uW10gPSBbXSkge1xuICAgIE1ldHJpY3NSZXBvcnRlci5pbmNyZW1lbnRDb3VudGVyKCdTZXZlcmVFcnJvcicsIFtcbiAgICAgIC4uLmRpbWVuc2lvbnMsXG4gICAgICAuLi50aGlzLmdldENvbW1vbkRpbWVuc2lvbnMoKSxcbiAgICBdKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICB0aGlzLmNvbW1vblByb3BlcnRpZXMgPSB7fTtcbiAgfVxuXG4gIHByaXZhdGUgZGVjb3JhdGVNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZyB8IG9iamVjdCk6IG9iamVjdCB7XG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgbWVzc2FnZSA9IHtcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICAuLi50aGlzLmNvbW1vblByb3BlcnRpZXMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBsaXN0IG9mIGNvbW1vbiBkaW1lbnNpb25zIGZvciBldmVyeSBMYWIgbWV0cmljIGV2ZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb21tb25EaW1lbnNpb25zKCk6IE1ldHJpY0RpbWVuc2lvbltdIHtcbiAgICBjb25zdCBkaW1lbnNpb25zID0gW107XG4gICAgaWYgKHRoaXMuY29tbW9uUHJvcGVydGllcy5hcHBOYW1lKSB7XG4gICAgICBkaW1lbnNpb25zLnB1c2goe1xuICAgICAgICBuYW1lOiAnQXBwTmFtZScsXG4gICAgICAgIHZhbHVlOiB0aGlzLmNvbW1vblByb3BlcnRpZXMuYXBwTmFtZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZGltZW5zaW9ucztcbiAgfVxufVxuIiwiLy8gUmVnaXN0cnkgZm9yIExhYiBzaW5nbGV0b25zXG5cbmltcG9ydCBMYWJNZXRyaWNzUmVwb3J0ZXIgZnJvbSAnLi9MYWIyTWV0cmljc1JlcG9ydGVyJztcbmltcG9ydCBQcm9qZWN0TWFuYWdlciBmcm9tICcuL3Byb2plY3RzL1Byb2plY3RNYW5hZ2VyJztcbmltcG9ydCB7QXBwTmFtZX0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgTGlmZWN5Y2xlTm90aWZpZXIgZnJvbSAnLi91dGlscy9MaWZlY3ljbGVOb3RpZmllcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExhYjJSZWdpc3RyeSB7XG4gIHByaXZhdGUgcHJvamVjdE1hbmFnZXI6IFByb2plY3RNYW5hZ2VyIHwgbnVsbDtcbiAgcHJpdmF0ZSBtZXRyaWNzUmVwb3J0ZXI6IExhYk1ldHJpY3NSZXBvcnRlcjtcbiAgcHJpdmF0ZSBsaWZlY3ljbGVOb3RpZmllcjogTGlmZWN5Y2xlTm90aWZpZXI7XG4gIHByaXZhdGUgYXBwTmFtZTogQXBwTmFtZSB8IG51bGw7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBMYWIyUmVnaXN0cnk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5wcm9qZWN0TWFuYWdlciA9IG51bGw7XG4gICAgdGhpcy5tZXRyaWNzUmVwb3J0ZXIgPSBuZXcgTGFiTWV0cmljc1JlcG9ydGVyKCk7XG4gICAgdGhpcy5saWZlY3ljbGVOb3RpZmllciA9IG5ldyBMaWZlY3ljbGVOb3RpZmllcigpO1xuICAgIHRoaXMuYXBwTmFtZSA9IG51bGw7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IExhYjJSZWdpc3RyeSB7XG4gICAgaWYgKExhYjJSZWdpc3RyeS5faW5zdGFuY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgTGFiMlJlZ2lzdHJ5LmNyZWF0ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gTGFiMlJlZ2lzdHJ5Ll9pbnN0YW5jZTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaGFzRW5hYmxlZFByb2plY3RzKCkge1xuICAgIHJldHVybiAoXG4gICAgICBMYWIyUmVnaXN0cnkuX2luc3RhbmNlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIExhYjJSZWdpc3RyeS5faW5zdGFuY2UucHJvamVjdE1hbmFnZXIgIT09IG51bGxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBjcmVhdGUoKSB7XG4gICAgTGFiMlJlZ2lzdHJ5Ll9pbnN0YW5jZSA9IG5ldyBMYWIyUmVnaXN0cnkoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRQcm9qZWN0TWFuYWdlcihwcm9qZWN0TWFuYWdlcjogUHJvamVjdE1hbmFnZXIpIHtcbiAgICB0aGlzLnByb2plY3RNYW5hZ2VyID0gcHJvamVjdE1hbmFnZXI7XG4gIH1cblxuICBwdWJsaWMgZ2V0UHJvamVjdE1hbmFnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvamVjdE1hbmFnZXI7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJQcm9qZWN0TWFuYWdlcigpIHtcbiAgICB0aGlzLnByb2plY3RNYW5hZ2VyID0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNZXRyaWNzUmVwb3J0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljc1JlcG9ydGVyO1xuICB9XG5cbiAgcHVibGljIGdldExpZmVjeWNsZU5vdGlmaWVyKCkge1xuICAgIHJldHVybiB0aGlzLmxpZmVjeWNsZU5vdGlmaWVyO1xuICB9XG5cbiAgcHVibGljIHNldEFwcE5hbWUoYXBwTmFtZTogQXBwTmFtZSkge1xuICAgIHRoaXMuYXBwTmFtZSA9IGFwcE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0QXBwTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBOYW1lO1xuICB9XG59XG4iLCJpbXBvcnQge0NoYW5uZWwsIExldmVsUHJvcGVydGllcywgUHJvamVjdFNvdXJjZXN9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGVudW0gTGlmZWN5Y2xlRXZlbnQge1xuICBMZXZlbENoYW5nZVJlcXVlc3RlZCxcbiAgTGV2ZWxMb2FkU3RhcnRlZCxcbiAgTGV2ZWxMb2FkQ29tcGxldGVkLFxufVxuXG50eXBlIENhbGxiYWNrQXJncyA9IHtcbiAgW0xpZmVjeWNsZUV2ZW50LkxldmVsQ2hhbmdlUmVxdWVzdGVkXTogW1xuICAgIHByZXZpb3VzTGV2ZWxJZDogc3RyaW5nIHwgbnVsbCxcbiAgICBuZXh0TGV2ZWxJZDogc3RyaW5nXG4gIF07XG4gIFtMaWZlY3ljbGVFdmVudC5MZXZlbExvYWRTdGFydGVkXTogW2xldmVsSWQ6IG51bWJlcl07XG4gIFtMaWZlY3ljbGVFdmVudC5MZXZlbExvYWRDb21wbGV0ZWRdOiBbXG4gICAgbGV2ZWxQcm9wZXJ0aWVzOiBMZXZlbFByb3BlcnRpZXMsXG4gICAgY2hhbm5lbDogQ2hhbm5lbCB8IHVuZGVmaW5lZCxcbiAgICBpbml0aWFsU291cmNlczogUHJvamVjdFNvdXJjZXMgfCB1bmRlZmluZWQsXG4gICAgYWJ1c2VTY29yZTogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGlzUmVhZE9ubHk6IGJvb2xlYW4gfCB1bmRlZmluZWRcbiAgXTtcbn07XG5cbmV4cG9ydCB0eXBlIENhbGxiYWNrPFQgZXh0ZW5kcyBMaWZlY3ljbGVFdmVudD4gPSAoXG4gIC4uLmFyZ3M6IENhbGxiYWNrQXJnc1tUXVxuKSA9PiB2b2lkO1xuXG4vKipcbiAqIE5vdGlmaWVzIGxpc3RlbmVycyBvZiBsaWZlY3ljbGUgZXZlbnRzIGluIHRoZSBMYWIyIHN5c3RlbSwgd2hpY2ggZG9lc24ndCByZWxvYWQgdGhlIHBhZ2UgYmV0d2VlbiBsZXZlbHMuXG4gKi9cbmNsYXNzIExpZmVjeWNsZU5vdGlmaWVyIHtcbiAgcHJpdmF0ZSBsaXN0ZW5lcnM6IHtbVCBpbiBMaWZlY3ljbGVFdmVudF0/OiBDYWxsYmFjazxUPltdfTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmxpc3RlbmVycyA9IHt9O1xuICB9XG5cbiAgYWRkTGlzdGVuZXI8VCBleHRlbmRzIExpZmVjeWNsZUV2ZW50PihldmVudDogVCwgY2FsbGJhY2s6IENhbGxiYWNrPFQ+KSB7XG4gICAgaWYgKCF0aGlzLmxpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgIHRoaXMubGlzdGVuZXJzW2V2ZW50XSA9IFtdO1xuICAgIH1cbiAgICB0aGlzLmxpc3RlbmVyc1tldmVudF0/LnB1c2goY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcmVtb3ZlTGlzdGVuZXI8VCBleHRlbmRzIExpZmVjeWNsZUV2ZW50PihldmVudDogVCwgY2FsbGJhY2s6IENhbGxiYWNrPFQ+KSB7XG4gICAgaWYgKHRoaXMubGlzdGVuZXJzW2V2ZW50XSkge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxpc3RlbmVyc1tldmVudF0uaW5kZXhPZihjYWxsYmFjayk7XG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzW2V2ZW50XS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG5vdGlmeTxUIGV4dGVuZHMgTGlmZWN5Y2xlRXZlbnQ+KGV2ZW50OiBULCAuLi5hcmdzOiBDYWxsYmFja0FyZ3NbVF0pIHtcbiAgICB0aGlzLmxpc3RlbmVyc1tldmVudF0/LmZvckVhY2goY2FsbGJhY2sgPT4gY2FsbGJhY2soLi4uYXJncykpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExpZmVjeWNsZU5vdGlmaWVyO1xuIiwiaW1wb3J0IExhYjJSZWdpc3RyeSBmcm9tICcuLi9MYWIyUmVnaXN0cnknO1xuXG5pbXBvcnQge0xpZmVjeWNsZUV2ZW50fSBmcm9tICcuL0xpZmVjeWNsZU5vdGlmaWVyJztcblxuLy8gRnVuY3Rpb24gZm9yIGV4dGVybmFsIGNvbXBvbmVudHMgdG8gbm90aWZ5IHRoZSBMYWIyIGxpZmVjeWNsZSBub3RpZmllciB0aGF0IHRoZSBsZXZlbCBpcyBjaGFuZ2luZy5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vdGlmeUxldmVsQ2hhbmdlKFxuICBwcmV2aW91c0xldmVsSWQ6IHN0cmluZyB8IG51bGwsXG4gIG5leHRMZXZlbElkOiBzdHJpbmdcbikge1xuICBMYWIyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKVxuICAgIC5nZXRMaWZlY3ljbGVOb3RpZmllcigpXG4gICAgLm5vdGlmeShMaWZlY3ljbGVFdmVudC5MZXZlbENoYW5nZVJlcXVlc3RlZCwgcHJldmlvdXNMZXZlbElkLCBuZXh0TGV2ZWxJZCk7XG59XG4iLCJpbXBvcnQgSHR0cENsaWVudCBmcm9tICdAY2RvL2FwcHMvdXRpbC9IdHRwQ2xpZW50JztcblxuaW1wb3J0IHtNZXRyaWNzQXBpfSBmcm9tICcuL01ldHJpY3NBcGknO1xuaW1wb3J0IHtNZXRyaWNEYXR1bX0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IEJBU0VfVVJMID0gJy9icm93c2VyX2V2ZW50cy8nO1xuXG4vKipcbiAqIEEge0BsaW5rIE1ldHJpY3NBcGl9IGltcGxlbWVudGF0aW9uIHRoYXQgZm9yd2FyZHMgbWV0cmljcyB0byBEYXNoYm9hcmQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhc2hib2FyZE1ldHJpY3NBcGkgaW1wbGVtZW50cyBNZXRyaWNzQXBpIHtcbiAgYXN5bmMgc2VuZExvZ3MobG9nczogb2JqZWN0W10pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIEh0dHBDbGllbnQucG9zdChCQVNFX1VSTCArICdwdXRfbG9ncycsIEpTT04uc3RyaW5naWZ5KHtsb2dzfSksIHRydWUpO1xuICB9XG5cbiAgYXN5bmMgc2VuZE1ldHJpY0RhdGEobWV0cmljRGF0YTogTWV0cmljRGF0dW1bXSkge1xuICAgIHJldHVybiBIdHRwQ2xpZW50LnBvc3QoXG4gICAgICBCQVNFX1VSTCArICdwdXRfbWV0cmljX2RhdGEnLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe21ldHJpY0RhdGF9KSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQge2dldEJyb3dzZXJOYW1lfSBmcm9tICdAY2RvL2FwcHMvdXRpbC9icm93c2VyLWRldGVjdG9yJztcbmltcG9ydCB7aXNEZXZlbG9wbWVudEVudmlyb25tZW50fSBmcm9tICdAY2RvL2FwcHMvdXRpbHMnO1xuXG5pbXBvcnQgRGFzaGJvYXJkTWV0cmljc0FwaSBmcm9tICcuL0Rhc2hib2FyZE1ldHJpY3NBcGknO1xuaW1wb3J0IHtNZXRyaWNzQXBpfSBmcm9tICcuL01ldHJpY3NBcGknO1xuaW1wb3J0IHtMb2dMZXZlbCwgTWV0cmljRGF0dW0sIE1ldHJpY0RpbWVuc2lvbiwgTWV0cmljVW5pdH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogSWYgd2UgcmVjZWl2ZSBhbiB1bmF1dGhvcml6ZWQgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLCB0aGlzIG1heVxuICogaW5kaWNhdGUgdGhhdCBicm93c2VyIGV2ZW50IHJlcG9ydGluZyBoYXMgYmVlbiB0ZW1wb3JhcmlseSBkaXNhYmxlZC5cbiAqIFdlIHdpbGwgd2FpdCBmb3IgYSBzcGVjaWZpYyB0aW1lIGludGVydmFsIChkZWZpbmVkIGJlbG93KSBiZWZvcmUgbWFraW5nXG4gKiBhIHJlcXVlc3QgYWdhaW4sIHNvIGFzIHRvIG5vdCBmbG9vZCB0aGUgc2VydmVyIHdpdGggcmVxdWVzdHMuXG4gKi9cbmNvbnN0IENIRUNLX0NBTl9SRVBPUlRfSU5URVJWQUxfTUlOVVRFUyA9IDMwO1xuY29uc3QgQ0hFQ0tfQ0FOX1JFUE9SVF9JTlRFUlZBTF9NUyA9XG4gIENIRUNLX0NBTl9SRVBPUlRfSU5URVJWQUxfTUlOVVRFUyAqIDYwICogMTAwMDtcbmNvbnN0IExPQ0FMX1NUT1JBR0VfS0VZX05BTUUgPSAnY2RvLW1ldHJpY3MtcmVwb3J0ZXItbGFzdC1jaGVjay10aW1lJztcbi8vIEEgZmxhZyB0aGF0IGNhbiBiZSB0b2dnbGVkIHRvIHNlbmQgZXZlbnRzIHJlZ2FyZGxlc3Mgb2YgZW52aXJvbm1lbnRcbmNvbnN0IEFMV0FZU19TRU5EID0gZmFsc2U7XG5cbi8qKlxuICogUmVwb3J0cyBsb2dzIGFuZCBtZXRyaWNzLCBpbnRlbmRlZCBwcmltYXJpbHkgZm9yIGRldmVsb3Blci1mYWNpbmdcbiAqIGVycm9yIHJlcG9ydGluZywgbWV0cmljIHJlcG9ydGluZywgYW5kIGxvZ2dpbmcuXG4gKlxuICogRm9yIHRyYWNraW5nIHVzZXIgaW50ZXJhY3Rpb25zIGFuZCBiZWhhdmlvcnMgKHByb2R1Y3QtZmFjaW5nKSxcbiAqIHNlZSB7QGxpbmsgQW5hbHl0aWNzUmVwb3J0ZXJ9IHdoaWNoIHJlcG9ydHMgdG8gQW1wbGl0dWRlLlxuICpcbiAqIEZvciBsZWdhY3kgY2xpZW50LXNpZGUgcmVwb3J0aW5nIHNlZSB7QGxpbmsgZmlyZWhvc2V9IGZvciBBV1NcbiAqIEZpcmVob3NlIHJlcG9ydGluZyBhbmQge0BsaW5rIGxvZ1RvQ2xvdWR9IGZvciBOZXcgUmVsaWMgcmVwb3J0aW5nLlxuICovXG5jbGFzcyBNZXRyaWNzUmVwb3J0ZXIge1xuICBwcml2YXRlIGxhc3RDaGVja0NhblJlcG9ydFRpbWU6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG1ldHJpY3NBcGk6IE1ldHJpY3NBcGkpIHtcbiAgICB0aGlzLm1ldHJpY3NBcGkgPSBtZXRyaWNzQXBpO1xuICAgIHRoaXMubGFzdENoZWNrQ2FuUmVwb3J0VGltZSA9XG4gICAgICBwYXJzZUludChsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMT0NBTF9TVE9SQUdFX0tFWV9OQU1FKSB8fCAnMCcpIHx8IDA7XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaCBhbiBpbmZvcm1hdGlvbiBsb2cgbWVzc2FnZS4gQ2FuIGJlIGEgc3RyaW5nIG9yIGEgc3RydWN0dXJlZCBvYmplY3RcbiAgICovXG4gIGxvZ0luZm8obWVzc2FnZTogc3RyaW5nIHwgb2JqZWN0KSB7XG4gICAgaWYgKCF0aGlzLnNob3VsZFJlcG9ydCgpKSB7XG4gICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sb2coJ0lORk8nLCBtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoIGEgd2FybmluZyBsb2cgbWVzc2FnZS4gQ2FuIGJlIGEgc3RyaW5nIG9yIGEgc3RydWN0dXJlZCBvYmplY3RcbiAgICovXG4gIGxvZ1dhcm5pbmcobWVzc2FnZTogc3RyaW5nIHwgb2JqZWN0KSB7XG4gICAgaWYgKCF0aGlzLnNob3VsZFJlcG9ydCgpKSB7XG4gICAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubG9nKCdXQVJOSU5HJywgbWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaCBhbiBlcnJvciBsb2cgbWVzc2FnZS4gQ2FuIGJlIGEgc3RyaW5nIG9yIGEgc3RydWN0dXJlZCBvYmplY3RcbiAgICovXG4gIGxvZ0Vycm9yKG1lc3NhZ2U6IHN0cmluZyB8IG9iamVjdCkge1xuICAgIGlmICghdGhpcy5zaG91bGRSZXBvcnQoKSkge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sb2coJ1NFVkVSRScsIG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluY3JlbWVudCBhIGNvdW50ZXIgbWV0cmljLlxuICAgKi9cbiAgaW5jcmVtZW50Q291bnRlcihuYW1lOiBzdHJpbmcsIGRpbWVuc2lvbnM6IE1ldHJpY0RpbWVuc2lvbltdID0gW10pIHtcbiAgICB0aGlzLnB1Ymxpc2hNZXRyaWMobmFtZSwgMSwgJ0NvdW50JywgZGltZW5zaW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaCBhIG1ldHJpYy5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgd2lsbCBzZW5kIHR3byBtZXRyaWNzLCB3aXRoIGFuZCB3aXRob3V0IHRoZSBicm93c2VyIHZlcnNpb24gZGltZW5zaW9uXG4gICAqICh0aGUgYnJvd3NlciBuYW1lIGRpbWVuc2lvbiBpcyBpbmNsdWRlZCBpbiBib3RoKS5cbiAgICogVGhpcyBhbGxvd3MgdXMgdG8gbW9yZSBlYXNpbHkgYWdncmVnYXRlIG1ldHJpY3MgYnkgYnJvd3Nlci5cbiAgICovXG4gIHB1Ymxpc2hNZXRyaWMoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICAgdW5pdDogTWV0cmljVW5pdCxcbiAgICBkaW1lbnNpb25zOiBNZXRyaWNEaW1lbnNpb25bXSA9IFtdXG4gICkge1xuICAgIGNvbnN0IG1ldHJpYyA9IHtcbiAgICAgIG5hbWUsXG4gICAgICB2YWx1ZSxcbiAgICAgIHVuaXQsXG4gICAgICBkaW1lbnNpb25zOiBkaW1lbnNpb25zLmNvbmNhdCh0aGlzLmdldERldmljZURpbWVuc2lvbnMoKSksXG4gICAgfTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkUmVwb3J0KCkpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnW01ldHJpY3NSZXBvcnRlcl0gJyArIEpTT04uc3RyaW5naWZ5KG1ldHJpYykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBTZW5kIGEgdmVyc2lvbiBvZiB0aGUgbWV0cmljIHdpdGggYW5kIHdpdGhvdXQgdGhlIGJyb3dzZXIgdmVyc2lvbiBkaW1lbnNpb25cbiAgICB0aGlzLnNlbmRNZXRyaWNzKFtcbiAgICAgIG1ldHJpYyxcbiAgICAgIHtcbiAgICAgICAgLi4ubWV0cmljLFxuICAgICAgICBkaW1lbnNpb25zOiBbLi4ubWV0cmljLmRpbWVuc2lvbnMsIHRoaXMuZ2V0QnJvd3NlclZlcnNpb25EaW1lbnNpb24oKV0sXG4gICAgICB9LFxuICAgIF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2cobGV2ZWw6IExvZ0xldmVsLCBtZXNzYWdlOiBzdHJpbmcgfCBvYmplY3QpIHtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgbGV2ZWwsXG4gICAgICBtZXNzYWdlLFxuICAgICAgZGV2aWNlSW5mbzogdGhpcy5nZXREZXZpY2VJbmZvKCksXG4gICAgfTtcblxuICAgIGlmICghdGhpcy5pc1JlcG9ydGluZ0VuYWJsZWQoKSkge1xuICAgICAgdGhpcy5mYWxsYmFja0xvZyhwYXlsb2FkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5tZXRyaWNzQXBpLnNlbmRMb2dzKFtwYXlsb2FkXSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZmFsbGJhY2tMb2cocGF5bG9hZCk7XG4gICAgICB0aGlzLmhhbmRsZUVycm9yKGVycm9yIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRNZXRyaWNzKG1ldHJpY3M6IE1ldHJpY0RhdHVtW10pIHtcbiAgICBpZiAoIXRoaXMuaXNSZXBvcnRpbmdFbmFibGVkKCkpIHtcbiAgICAgIHRoaXMuZmFsbGJhY2tMb2cobWV0cmljcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMubWV0cmljc0FwaS5zZW5kTWV0cmljRGF0YShtZXRyaWNzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5mYWxsYmFja0xvZyhtZXRyaWNzKTtcbiAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRXJyb3IoZXJyb3I6IEVycm9yKSB7XG4gICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJzQwMScpKSB7XG4gICAgICAvLyBVbmF1dGhvcml6ZWQgcmVzcG9uc2UgZnJvbSBzZXJ2ZXI7IGNsaWVudCBsb2dnaW5nIGlzIGxpa2VseSBkaXNhYmxlZC5cbiAgICAgIC8vIFdlIHdpbGwgY2hlY2sgYWdhaW4gYWZ0ZXIgYSB0aW1lIHBlcmlvZCBvZiBDSEVDS19DQU5fUkVQT1JUX0lOVEVSVkFMXG4gICAgICB0aGlzLnNldFJlcG9ydGluZ0Rpc2FibGVkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGV2aWNlSW5mbygpOiBvYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICB1c2VyX2FnZW50OiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICAgIHdpbmRvd193aWR0aDogd2luZG93LmlubmVyV2lkdGgsXG4gICAgICB3aW5kb3dfaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQsXG4gICAgICBob3N0bmFtZTogd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLFxuICAgICAgZnVsbF9wYXRoOiB3aW5kb3cubG9jYXRpb24uaHJlZixcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZXZpY2VEaW1lbnNpb25zKCk6IE1ldHJpY0RpbWVuc2lvbltdIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnSG9zdG5hbWUnLFxuICAgICAgICB2YWx1ZTogd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ0Jyb3dzZXInLFxuICAgICAgICB2YWx1ZTogZ2V0QnJvd3Nlck5hbWUoKSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QnJvd3NlclZlcnNpb25EaW1lbnNpb24oKTogTWV0cmljRGltZW5zaW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogJ0Jyb3dzZXJWZXJzaW9uJyxcbiAgICAgIHZhbHVlOiBnZXRCcm93c2VyTmFtZSh0cnVlKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBmYWxsYmFja0xvZyhwYXlsb2FkOiBvYmplY3QpIHtcbiAgICBpZiAoaXNEZXZlbG9wbWVudEVudmlyb25tZW50KCkpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnQ2xpZW50LXNpZGUgcmVwb3J0aW5nIGRpc2FibGVkLiBBdHRlbXB0ZWQgdG8gcmVwb3J0OiAnICtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShwYXlsb2FkKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzUmVwb3J0aW5nRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgRGF0ZS5ub3coKSAtIHRoaXMubGFzdENoZWNrQ2FuUmVwb3J0VGltZSA+IENIRUNLX0NBTl9SRVBPUlRfSU5URVJWQUxfTVNcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRSZXBvcnRpbmdEaXNhYmxlZCgpIHtcbiAgICB0aGlzLmxhc3RDaGVja0NhblJlcG9ydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgTE9DQUxfU1RPUkFHRV9LRVlfTkFNRSxcbiAgICAgIHRoaXMubGFzdENoZWNrQ2FuUmVwb3J0VGltZS50b1N0cmluZygpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHdlIHNob3VsZCB0cnkgdG8gcmVwb3J0IG1ldHJpY3MgdG8gdGhlIHNlcnZlci5cbiAgICogQWx3YXlzIHRydWUgaWYgbm90IG9uIGRldmVsb3BtZW50LiBJZiBvbiBkZXZlbG9wbWVudCxcbiAgICogdGhpcyBpcyBjb250cm9sbGVkIGJ5IHRoZSBBTFdBWVNfU0VORCBmbGFnLlxuICAgKi9cbiAgcHJpdmF0ZSBzaG91bGRSZXBvcnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFMV0FZU19TRU5EIHx8ICFpc0RldmVsb3BtZW50RW52aXJvbm1lbnQoKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgTWV0cmljc1JlcG9ydGVyKG5ldyBEYXNoYm9hcmRNZXRyaWNzQXBpKCkpO1xuIiwiLy8gVHlwZXNjcmlwdCBkZWZpbml0aW9ucyBmb3IgdHlwZXMgcmVsYXRpbmcgdG8gcHJvZ3Jlc3MuIE5vdGUgdGhhdCBtYW55XG4vLyBvZiB0aGVzZSBhcmUgXCJkdXBsaWNhdGVkXCIgYnkgYC90ZW1wbGF0ZXMvcHJvZ3Jlc3MvcHJvZ3Jlc3NUeXBlcywgd2hpY2ggZGVmaW5lZFxuLy8gdGhlc2UgdXNpbmcgUHJvcFR5cGVzIGZvciB1c2FnZSBpbiBKYXZhc2NyaXB0IFJlYWN0IGNvbXBvbmVudHMuIEFzIHdlIG1vdmUgdG93YXJkc1xuLy8gdHlwZXNjcmlwdCB3ZSBjYW4gZGVwcmVjYXRlIHRoZSBQcm9wVHlwZXMgZGVmaW5pdGlvbnMgYW5kIHVzZSB0aGVzZSBpbnN0ZWFkLlxuXG4vKipcbiAqIFNlZSBBcHBsaWNhdGlvbkhlbHBlcjo6UFVaWkxFX1BBR0VfTk9ORS5cbiAqL1xuZXhwb3J0IGNvbnN0IFBVWlpMRV9QQUdFX05PTkUgPSAtMTtcblxuZXhwb3J0IHR5cGUgTGVzc29uQmFja2dyb3VuZCA9ICdsaWdodCcgfCAnZGFyaycgfCBudWxsO1xuXG5leHBvcnQgaW50ZXJmYWNlIExlc3NvbiB7XG4gIGFzc2Vzc21lbnQ6IGJvb2xlYW47XG4gIGRlc2NyaXB0aW9uX3N0dWRlbnQ6IHN0cmluZztcbiAgZGVzY3JpcHRpb25fdGVhY2hlcjogc3RyaW5nO1xuICBoYXNMZXNzb25QbGFuOiBib29sZWFuO1xuICBpZDogbnVtYmVyO1xuICBrZXk6IHN0cmluZztcbiAgbGVzc29uRWRpdFBhdGg6IHN0cmluZztcbiAgbGVzc29uTnVtYmVyOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxlc3NvblN0YXJ0VXJsOiBzdHJpbmc7XG4gIGxlc3Nvbl9leHRyYXNfbGV2ZWxfdXJsOiBzdHJpbmc7XG4gIGxlc3Nvbl9ncm91cF9kaXNwbGF5X25hbWU6IHN0cmluZztcbiAgbGV2ZWxzOiBMZXZlbFtdO1xuICBsb2NrYWJsZTogYm9vbGVhbjtcbiAgbmFtZTogc3RyaW5nO1xuICBudW1fc2NyaXB0X2xlc3NvbnM6IG51bWJlcjtcbiAgbnVtYmVyZWRMZXNzb246IGJvb2xlYW47XG4gIHBvc2l0aW9uOiBudW1iZXI7XG4gIHJlbGF0aXZlX3Bvc2l0aW9uOiBudW1iZXI7XG4gIHNjcmlwdF9pZDogbnVtYmVyO1xuICBzY3JpcHRfbmFtZTogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICB1bnBsdWdnZWQ6IGJvb2xlYW4gfCBudWxsO1xuICBiYWNrZ3JvdW5kOiBMZXNzb25CYWNrZ3JvdW5kO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExlc3Nvbkdyb3VwIHtcbiAgYmlnX3F1ZXN0aW9uczogc3RyaW5nIHwgbnVsbDtcbiAgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gIGRpc3BsYXlfbmFtZTogc3RyaW5nO1xuICBpZDogbnVtYmVyO1xuICBrZXk6IHN0cmluZztcbiAgcG9zaXRpb246IG51bWJlcjtcbiAgdXNlcl9mYWNpbmc6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGV2ZWwge1xuICBhY3RpdmVJZDogc3RyaW5nO1xuICBhcHA6IHN0cmluZztcbiAgYm9udXM6IGJvb2xlYW47XG4gIGRpc3BsYXlfYXNfdW5wbHVnZ2VkOiBib29sZWFuO1xuICBmcmVlUGxheTogYm9vbGVhbjtcbiAgaWNvbjogc3RyaW5nIHwgbnVsbDtcbiAgaWQ6IHN0cmluZztcbiAgaWRzOiBzdHJpbmdbXTtcbiAgaW5hY3RpdmVJZHM6IHN0cmluZ1tdO1xuICBpc19jb25jZXB0X2xldmVsOiBib29sZWFuO1xuICBraW5kOiBzdHJpbmc7XG4gIGxldmVsTnVtYmVyOiBudW1iZXI7XG4gIHBvc2l0aW9uOiBudW1iZXI7XG4gIHRpdGxlOiBudW1iZXI7XG4gIHVybDogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIHNjcmlwdExldmVsSWQ6IHN0cmluZztcbiAgc3RhdHVzPzogc3RyaW5nO1xuICBzdWJsZXZlbHM/OiBMZXZlbFtdO1xuICB1c2VzTGFiMjogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMZXZlbFdpdGhQcm9ncmVzcyBleHRlbmRzIExldmVsIHtcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIHBhaXJlZD86IGJvb2xlYW47XG4gIGlzTG9ja2VkPzogYm9vbGVhbjtcbiAgaXNDdXJyZW50TGV2ZWw/OiBib29sZWFuO1xuICBzdWJsZXZlbHM/OiBMZXZlbFdpdGhQcm9ncmVzc1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVuaXRQcm9ncmVzcyB7XG4gIGxhc3RUaW1lc3RhbXA6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbG9ja2VkOiBib29sZWFuO1xuICBwYWdlczogVW5pdFByb2dyZXNzW10gfCBudWxsO1xuICBwYWlyZWQ6IGJvb2xlYW47XG4gIHJlc3VsdDogbnVtYmVyO1xuICBzdGF0dXM6IHN0cmluZztcbiAgdGVhY2hlckZlZWRiYWNrUmV2aWV3U3RhdGU6IGtleW9mIHR5cGVvZiBSZXZpZXdTdGF0ZXMgfCB1bmRlZmluZWQ7XG4gIHRlYWNoZXJGZWVkYmFja05ldzogYm9vbGVhbjtcbiAgdGltZVNwZW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVlclJldmlld0xlc3NvbkluZm8ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGxlc3Nvbl9ncm91cF9kaXNwbGF5X25hbWU6IHN0cmluZztcbiAgbGV2ZWxzOiBQZWVyUmV2aWV3TGV2ZWxJbmZvW107XG4gIGxvY2thYmxlOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBlZXJSZXZpZXdMZXZlbEluZm8ge1xuICBpZDogbnVtYmVyO1xuICBraW5kOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHVybDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGljb246IHN0cmluZztcbiAgbG9ja2VkOiBib29sZWFuO1xuICBzdGF0dXM/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVlclJldmlld1N1bW1hcnkge1xuICBzdGF0dXM6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICByZXN1bHQ6IHN0cmluZztcbiAgaWNvbjogc3RyaW5nO1xuICBsb2NrZWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBSZXZpZXdTdGF0ZXMgPSB7XG4gIGNvbXBsZXRlZDogJ2NvbXBsZXRlZCcsXG4gIGtlZXBXb3JraW5nOiAna2VlcFdvcmtpbmcnLFxuICBhd2FpdGluZ1JldmlldzogJ2F3YWl0aW5nUmV2aWV3Jyxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5pdFByb2dyZXNzUGF5bG9hZCB7XG4gIGN1cnJlbnRMZXZlbElkOiBzdHJpbmcgfCBudWxsO1xuICBkZWVwZXJMZWFybmluZ0NvdXJzZTogYm9vbGVhbjtcbiAgc2F2ZUFuc3dlcnNCZWZvcmVOYXZpZ2F0aW9uOiBib29sZWFuIHwgbnVsbDtcbiAgbGVzc29uczogTGVzc29uW107XG4gIGxlc3Nvbkdyb3VwczogTGVzc29uR3JvdXBbXSB8IG51bGw7XG4gIHNjcmlwdElkOiBudW1iZXIgfCBudWxsO1xuICBzY3JpcHROYW1lOiBzdHJpbmcgfCBudWxsO1xuICBzY3JpcHREaXNwbGF5TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB1bml0VGl0bGU6IHN0cmluZyB8IG51bGw7XG4gIHVuaXREZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB1bml0U3R1ZGVudERlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHVuaXRIYXNVbm51bWJlcmVkTGVzc29uczogYm9vbGVhbjtcbiAgY291cnNlSWQ6IG51bWJlciB8IG51bGw7XG4gIGNvdXJzZVZlcnNpb25JZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBpc0xlc3NvbkV4dHJhczogYm9vbGVhbjtcbiAgcGVlclJldmlld0xlc3NvbkluZm86IFBlZXJSZXZpZXdMZXNzb25JbmZvIHwgbnVsbDtcbiAgaXNGdWxsUHJvZ3Jlc3M6IGJvb2xlYW47XG4gIGN1cnJlbnRQYWdlTnVtYmVyOiBudW1iZXI7XG59XG5cbi8vIExldmVsUmVzdWx0cyBpcyBhIG1hcCBvZiBsZXZlbElkIC0+IFRlc3RSZXN1bHQuIFRlc3RSZXN1bHQgaXMgYSBudW1iZXIuXG5leHBvcnQgdHlwZSBMZXZlbFJlc3VsdHMgPSB7W2tleTogbnVtYmVyXTogbnVtYmVyfTtcblxuZXhwb3J0IGNvbnN0IFZpZXdUeXBlID0ge1xuICBQYXJ0aWNpcGFudDogJ1BhcnRpY2lwYW50JyxcbiAgSW5zdHJ1Y3RvcjogJ0luc3RydWN0b3InLFxufTtcbiJdLCJuYW1lcyI6WyJjYW5DaGFuZ2VMZXZlbEluUGFnZSIsImN1cnJlbnRMZXZlbCIsIm5ld0xldmVsIiwiVVJMIiwiZG9jdW1lbnQiLCJsb2NhdGlvbiIsInBhdGhuYW1lIiwic3BsaXQiLCJpbmNsdWRlcyIsInVzZXNMYWIyIiwic2V0dXBOYXZpZ2F0aW9uSGFuZGxlciIsImluaXRpYWxMZXZlbElkIiwid2luZG93IiwiaGlzdG9yeSIsInJlcGxhY2VTdGF0ZSIsImxldmVsSWQiLCJhZGRFdmVudExpc3RlbmVyIiwiZXZlbnQiLCJfZXZlbnQkc3RhdGUiLCJzdGF0ZSIsIm5vdGlmeUxldmVsQ2hhbmdlIiwiZ2V0U3RvcmUiLCJkaXNwYXRjaCIsInNldEN1cnJlbnRMZXZlbElkIiwidXBkYXRlQnJvd3NlckZvckxldmVsTmF2aWdhdGlvbiIsInByb2dyZXNzU3RvcmVTdGF0ZSIsImxldmVsUGF0aCIsInB1c2hTdGF0ZSIsInNlYXJjaCIsInNldFdpbmRvd1RpdGxlIiwiX3Byb2dyZXNzUmVkdXgiLCJyZXF1aXJlIiwiX25vdGlmeUxldmVsQ2hhbmdlIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsImUiLCJfX2VzTW9kdWxlIiwiX3JlZHV4IiwibmV3TGV2ZWxJZCIsImxlc3NvbiIsImxlc3NvbnMiLCJmaW5kIiwiaWQiLCJjdXJyZW50TGVzc29uSWQiLCJudW1MZXNzb25zIiwibnVtX3NjcmlwdF9sZXNzb25zIiwibGVzc29uTmFtZSIsIm5hbWUiLCJsZXNzb25JbmRleCIsImxldmVscyIsImZpbmRJbmRleCIsImxldmVsIiwiYWN0aXZlSWQiLCJzY3JpcHREaXNwbGF5TmFtZSIsInRpdGxlIiwiY29uY2F0IiwiX2xvZGFzaCIsIl9jb25zdGFudHMiLCJfcHJvZ3Jlc3NIZWxwZXJzIiwiX3NoYXJlZENvbnN0YW50cyIsIl9hY3Rpdml0eVV0aWxzIiwiX3R5cGVvZiIsIm8iLCJTeW1ib2wiLCJpdGVyYXRvciIsImNvbnN0cnVjdG9yIiwicHJvdG90eXBlIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwiciIsIl9hcnJheVdpdGhvdXRIb2xlcyIsIkFycmF5IiwiaXNBcnJheSIsIl9hcnJheUxpa2VUb0FycmF5IiwiX2l0ZXJhYmxlVG9BcnJheSIsImZyb20iLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJhIiwidCIsInRvU3RyaW5nIiwiY2FsbCIsInNsaWNlIiwidGVzdCIsIl9ub25JdGVyYWJsZVNwcmVhZCIsIlR5cGVFcnJvciIsImxlbmd0aCIsIm4iLCJvd25LZXlzIiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJfdG9Qcm9wZXJ0eUtleSIsImkiLCJfdG9QcmltaXRpdmUiLCJ0b1ByaW1pdGl2ZSIsIlN0cmluZyIsIk51bWJlciIsInZhbHVlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJleHBvcnRzIiwiaGFzTG9ja2FibGVMZXNzb25zIiwic29tZSIsImxvY2thYmxlIiwiaGFzR3JvdXBzIiwiZ3JvdXBlZExlc3NvbnMiLCJnZXRDdXJyZW50TGVzc29uIiwiX3N0YXRlJHByb2dyZXNzJGxlc3NvIiwicHJvZ3Jlc3MiLCJsIiwibGVzc29uRnJvbUxlc3NvbkF0SW5kZXgiLCJsZXNzb25Gcm9tTGVzc29uIiwiaXNGb2N1c0FyZWEiLCJmb2N1c0FyZWFMZXNzb25JZHMiLCJfIiwicGljayIsInBlZXJSZXZpZXdMZXNzb24iLCJtYXAiLCJpbmRleCIsInBlZXJSZXZpZXdMZXNzb25JbmZvIiwicGVlclJldmlld0xldmVscyIsImlzTG9ja2VkIiwibG9ja2VkIiwic3RhdHVzIiwiTGV2ZWxTdGF0dXMiLCJub3RfdHJpZWQiLCJsZXZlbE51bWJlciIsIlByb2dyZXNzTGV2ZWxUeXBlIiwiU0NSSVBUX0xFVkVMIiwiTEVWRUwiLCJnZXRQcm9ncmVzc0xldmVsVHlwZSIsImN1cnJlbnRMZXZlbElkIiwibGV2ZWxXaXRoUHJvZ3Jlc3MiLCJnZXRMZXZlbFByb3BlcnRpZXNQYXRoIiwiX3N0YXRlJHByb2dyZXNzJGxlc3NvMiIsImxldmVsUG9zaXRpb24iLCJzdWJsZXZlbFBvc2l0aW9uIiwic2NyaXB0TmFtZSIsImxlc3NvblBvc2l0aW9uIiwicmVsYXRpdmVfcG9zaXRpb24iLCJnZXRDdXJyZW50TGV2ZWwiLCJwYXJlbnRMZXZlbElkIiwibGV2ZWxCeUlkIiwidW5kZWZpbmVkIiwiZ2V0VXNlckFwcE9wdGlvbnNQYXRoIiwiX3N0YXRlJHByb2dyZXNzJGxlc3NvMyIsIl9yZWYiLCJpc0xvY2thYmxlIiwiX2xldmVsUHJvZ3Jlc3MiLCJfbGV2ZWwkaWRzIiwiX2xldmVsJHN1YmxldmVscyIsImxldmVsUmVzdWx0cyIsInVuaXRQcm9ncmVzcyIsIl9yZWYkbGV2ZWxQYWlyaW5nIiwibGV2ZWxQYWlyaW5nIiwibm9ybWFsaXplZExldmVsIiwicHJvY2Vzc2VkTGV2ZWwiLCJpZHMiLCJiZXN0UmVzdWx0TGV2ZWxJZCIsImxldmVsSWRzIiwicHJvZ3Jlc3NEYXRhIiwiYXR0ZW1wdGVkSWRzIiwiYmVzdElkIiwiYmVzdFJlc3VsdCIsInJlc3VsdCIsInRlYWNoZXJGZWVkYmFja1Jldmlld1N0YXRlIiwibGV2ZWxQcm9ncmVzcyIsInBhZ2VzIiwicGFnZU51bWJlciIsImtpbmQiLCJMZXZlbEtpbmQiLCJhc3Nlc3NtZW50IiwiYWN0aXZpdHlDc3NDbGFzcyIsImlzQ3VycmVudCIsImlzQ3VycmVudExldmVsIiwicGFpcmVkIiwic3VibGV2ZWxzIiwic3VibGV2ZWwiLCJsZXZlbHNCeUxlc3NvbiIsIl9yZWYyIiwibGV2ZWxzRm9yTGVzc29uSWQiLCJsZXNzb25JZCIsIl9zdGF0ZSRsZXNzb25zIiwiX2xldmVsc0Zvckxlc3NvbklkIiwiX2xldmVsc0Zvckxlc3NvbklkJGZsIiwiZmxhdE1hcCIsIl9nZXRDdXJyZW50TGV2ZWxzIiwiX2dldEN1cnJlbnRMZXZlbHMkZmxhIiwiZ2V0Q3VycmVudExldmVscyIsImdldEN1cnJlbnRTY3JpcHRMZXZlbElkIiwiX2xldmVsQnlJZCIsInNjcmlwdExldmVsSWQiLCJuZXh0TGV2ZWxJZCIsImN1cnJlbnRMZXZlbEluZGV4IiwibGV2ZWxDb3VudCIsImxlc3NvbkV4dHJhc1VybCIsImxlc3NvbkV4dHJhc0VuYWJsZWQiLCJsZXNzb25fZXh0cmFzX2xldmVsX3VybCIsImlzUGVyZmVjdCIsIlRlc3RSZXN1bHRzIiwiTUlOSU1VTV9PUFRJTUFMX1JFU1VMVCIsImluY2x1ZGVCb251c0xldmVscyIsImJ5R3JvdXAiLCJhbGxMZXZlbHMiLCJsZXNzb25Hcm91cHMiLCJsZXNzb25Hcm91cCIsImRpc3BsYXlfbmFtZSIsInVzZXJGYWNpbmciLCJ1c2VyX2ZhY2luZyIsImRpc3BsYXlOYW1lIiwiZGVzY3JpcHRpb24iLCJiaWdRdWVzdGlvbnMiLCJiaWdfcXVlc3Rpb25zIiwiZ3JvdXAiLCJsZXNzb25fZ3JvdXBfZGlzcGxheV9uYW1lIiwibGVzc29uQXRJbmRleCIsImxlc3NvbkxldmVscyIsImJvbnVzIiwidmFsdWVzIiwicHJvZ3Jlc3Npb25zRnJvbUxldmVscyIsInByb2dyZXNzaW9ucyIsImN1cnJlbnRQcm9ncmVzc2lvbiIsInN0YXJ0IiwicHJvZ3Jlc3Npb24iLCJwcm9ncmVzc2lvbkRpc3BsYXlOYW1lIiwidmVyaWZpZWRJbnN0cnVjdG9yIiwiaW5pdGlhbFN0YXRlIiwiYWN0aW9uIiwidHlwZSIsIlNFVF9WRVJJRklFRCIsImlzVmVyaWZpZWQiLCJTRVRfVkVSSUZJRURfUkVTT1VSQ0VTIiwiaGFzVmVyaWZpZWRSZXNvdXJjZXMiLCJzZXRWZXJpZmllZCIsInNldFZlcmlmaWVkUmVzb3VyY2VzIiwiaXNJRSIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsImluZGV4T2YiLCJpc0lFMTEiLCJJRVZlcnNpb24iLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsImlzQ2hyb21lIiwiY2hyb21lVmVyc2lvbiIsImlzU2FmYXJpIiwic2FmYXJpVmVyc2lvbiIsImlzRmlyZWZveCIsImZpcmVmb3hWZXJzaW9uIiwiTVNJbnB1dE1ldGhvZENvbnRleHQiLCJkb2N1bWVudE1vZGUiLCJnZXRCcm93c2VyTmFtZSIsImluY2x1ZGVWZXJzaW9uIiwiaXNNb2JpbGVEZXZpY2UiLCJjaGVjayIsInN1YnN0ciIsInZlbmRvciIsIm9wZXJhIiwiaXNTdG9yYWdlQXZhaWxhYmxlIiwic3RvcmFnZSIsIngiLCJzZXRJdGVtIiwicmVtb3ZlSXRlbSIsImlzVW5zdXBwb3J0ZWRCcm93c2VyIiwiaXNVbnN1cHBvcnRlZElFIiwiaXNVbnN1cHBvcnRlZENocm9tZSIsImlzVW5zdXBwb3J0ZWRTYWZhcmkiLCJpc1Vuc3VwcG9ydGVkRmlyZWZveCIsIm5hdmlnYXRlVG9OZXh0TGV2ZWwiLCJnZXRTdGF0ZSIsIm5hdmlnYXRlVG9MZXZlbElkIiwic2VuZFN1Y2Nlc3NSZXBvcnQiLCJhcHBUeXBlIiwic2VuZFJlcG9ydEhlbHBlciIsIkFMTF9QQVNTIiwic2VuZFByb2dyZXNzUmVwb3J0IiwiZGVlcGVyTGVhcm5pbmdDb3Vyc2UiLCJzYXZlQW5zd2Vyc0JlZm9yZU5hdmlnYXRpb24iLCJzY3JpcHRJZCIsInZpZXdBc1VzZXJJZCIsInVuaXRUaXRsZSIsImNvdXJzZUlkIiwiaXNMZXNzb25FeHRyYXMiLCJ1bml0UHJvZ3Jlc3NIYXNMb2FkZWQiLCJwZWVyUmV2aWV3c1BlcmZvcm1lZCIsInBvc3RNaWxlc3RvbmVEaXNhYmxlZCIsImlzQWdlMTNSZXF1aXJlZCIsInN0dWRlbnREZWZhdWx0c1N1bW1hcnlWaWV3IiwiaXNTdW1tYXJ5VmlldyIsImlzTWluaVZpZXciLCJoYXNGdWxsUHJvZ3Jlc3MiLCJ1c2luZ0RiUHJvZ3Jlc3MiLCJjdXJyZW50UGFnZU51bWJlciIsIlBVWlpMRV9QQUdFX05PTkUiLCJjb3Vyc2VWZXJzaW9uSWQiLCJ1bml0RGVzY3JpcHRpb24iLCJ1bml0U3R1ZGVudERlc2NyaXB0aW9uIiwidW5pdEhhc1VubnVtYmVyZWRMZXNzb25zIiwiY2hhbmdlRm9jdXNBcmVhUGF0aCIsInVuaXRDb21wbGV0ZWQiLCJwcm9ncmVzc1NsaWNlIiwiY3JlYXRlU2xpY2UiLCJyZWR1Y2VycyIsImluaXRQcm9ncmVzcyIsInBheWxvYWQiLCJwcm9jZXNzZWRMZXNzb25zIiwiaXNGdWxsUHJvZ3Jlc3MiLCJzZXRTY3JpcHRQcm9ncmVzcyIsInByb2Nlc3NTZXJ2ZXJTdHVkZW50UHJvZ3Jlc3MiLCJjbGVhclJlc3VsdHMiLCJ1c2VEYlByb2dyZXNzIiwibWVyZ2VSZXN1bHRzIiwibmV3TGV2ZWxSZXN1bHRzIiwia2V5IiwicGFyc2VJbnQiLCJtZXJnZUFjdGl2aXR5UmVzdWx0Iiwib3ZlcndyaXRlUmVzdWx0cyIsIm1lcmdlUGVlclJldmlld1Byb2dyZXNzIiwidXBkYXRlRm9jdXNBcmVhIiwicmVkdWNlciIsInByZXBhcmUiLCJkaXNhYmxlUG9zdE1pbGVzdG9uZSIsInNldElzQWdlMTNSZXF1aXJlZCIsInNldElzU3VtbWFyeVZpZXciLCJzZXRJc01pbmlWaWV3Iiwic2V0U3R1ZGVudERlZmF1bHRzU3VtbWFyeVZpZXciLCJzZXRDdXJyZW50TGVzc29uSWQiLCJzZXRTY3JpcHRDb21wbGV0ZWQiLCJzZXRMZXNzb25FeHRyYXNFbmFibGVkIiwic2V0Vmlld0FzVXNlcklkIiwiZXh0cmFSZWR1Y2VycyIsIlNFVF9WSUVXX1RZUEUiLCJ2aWV3VHlwZSIsIlZpZXdUeXBlIiwiUGFydGljaXBhbnQiLCJwYXRoIiwiZ2V0SW5zdGFuY2UiLCJnZXRQcm9qZWN0TWFuYWdlciIsImNsZWFuVXAiLCJ1cmwiLCJnZXRCdWJibGVVcmwiLCJuYXZpZ2F0ZVRvSHJlZiIsImV4dHJhRGF0YSIsIlByb21pc2UiLCJyZXNvbHZlIiwiZGF0YSIsImFwcCIsInRlc3RSZXN1bHQiLCJmZXRjaCIsIm1ldGhvZCIsImhlYWRlcnMiLCJib2R5IiwiSlNPTiIsInN0cmluZ2lmeSIsInRoZW4iLCJyZXNwb25zZSIsIm9rIiwicXVlcnlVc2VyUHJvZ3Jlc3MiLCJ1c2VySWQiLCJtZXJnZVByb2dyZXNzIiwidXNlclByb2dyZXNzRnJvbVNlcnZlciIsInNlbmRQcmVkaWN0TGV2ZWxSZXBvcnQiLCJjcmVhdGVBc3luY1RodW5rIiwidGh1bmtBUEkiLCJleHRyYVBheWxvYWQiLCJwcm9ncmFtIiwicHJlZGljdFJlc3BvbnNlIiwiQ09OVEFJTkVEX0xFVkVMX1JFU1VMVCIsInNlbmRTdWJtaXRSZXBvcnQiLCJzdWJtaXR0ZWQiLCJTVUJNSVRURURfUkVTVUxUIiwiVU5TVUJNSVRURURfQVRURU1QVCIsImN1cnJlbnRVc2VyIiwibWVzc2FnZSIsIkVycm9yIiwiYWpheCIsInVzZXJfaWQiLCJkb25lIiwiaXNFbXB0eSIsImlzVmVyaWZpZWRJbnN0cnVjdG9yIiwib25PdmVydmlld1BhZ2UiLCJpc0luc3RydWN0b3IiLCJ0ZWFjaGVyVmlld2luZ1N0dWRlbnQiLCJhdXRob3JpemVMb2NrYWJsZSIsImxvY2thYmxlQXV0aG9yaXplZCIsImNvbXBsZXRlZCIsIm1hcFZhbHVlcyIsImdldExldmVsUmVzdWx0IiwiY3VycmVudF9sZXNzb24iLCJpc1BsYyIsIm51bUxlc3NvbnNXaXRoTGVzc29uUGxhbiIsImxlc3Nvbk51bWJlciIsIm51bWJlcmVkTGVzc29uIiwib21pdCIsImFjdGlvbnMiLCJfX3Rlc3Rvbmx5X18iLCJpbml0aWFsUHJvcGVydGllcyIsImNvbW1vblByb3BlcnRpZXMiLCJ0aGlzIiwidXBkYXRlUHJvcGVydGllcyIsInByb3BlcnRpZXMiLCJsb2dJbmZvIiwiZGVjb3JhdGVNZXNzYWdlIiwibG9nV2FybmluZyIsImxvZ0Vycm9yIiwiZXJyb3JNZXNzYWdlIiwiZXJyb3IiLCJkZXRhaWxzIiwic3RhY2siLCJyZXBvcnRMb2FkVGltZSIsIm1ldHJpY05hbWUiLCJsb2FkVGltZU1zIiwiZGltZW5zaW9ucyIsInB1Ymxpc2hNZXRyaWMiLCJnZXRDb21tb25EaW1lbnNpb25zIiwidW5pdCIsImluY3JlbWVudENvdW50ZXIiLCJyZXBvcnRTZXZlcmVFcnJvciIsInJlc2V0IiwiYXBwTmFtZSIsInByb2plY3RNYW5hZ2VyIiwibWV0cmljc1JlcG9ydGVyIiwibGlmZWN5Y2xlTm90aWZpZXIiLCJMYWIyUmVnaXN0cnkiLCJfaW5zdGFuY2UiLCJjcmVhdGUiLCJoYXNFbmFibGVkUHJvamVjdHMiLCJzZXRQcm9qZWN0TWFuYWdlciIsImNsZWFyUHJvamVjdE1hbmFnZXIiLCJnZXRNZXRyaWNzUmVwb3J0ZXIiLCJnZXRMaWZlY3ljbGVOb3RpZmllciIsInNldEFwcE5hbWUiLCJnZXRBcHBOYW1lIiwiTGlmZWN5Y2xlRXZlbnQiLCJsaXN0ZW5lcnMiLCJhZGRMaXN0ZW5lciIsImNhbGxiYWNrIiwicmVtb3ZlTGlzdGVuZXIiLCJzcGxpY2UiLCJub3RpZnkiLCJhcmdzIiwiTGlmZWN5Y2xlTm90aWZpZXIiLCJwcmV2aW91c0xldmVsSWQiLCJMZXZlbENoYW5nZVJlcXVlc3RlZCIsInNlbmRMb2dzIiwibG9ncyIsInBvc3QiLCJCQVNFX1VSTCIsInNlbmRNZXRyaWNEYXRhIiwibWV0cmljRGF0YSIsIm1ldHJpY3NBcGkiLCJsYXN0Q2hlY2tDYW5SZXBvcnRUaW1lIiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsInNob3VsZFJlcG9ydCIsImxvZyIsImNvbnNvbGUiLCJ3YXJuIiwibWV0cmljIiwiZ2V0RGV2aWNlRGltZW5zaW9ucyIsInNlbmRNZXRyaWNzIiwiZ2V0QnJvd3NlclZlcnNpb25EaW1lbnNpb24iLCJpbmZvIiwiZGV2aWNlSW5mbyIsImdldERldmljZUluZm8iLCJpc1JlcG9ydGluZ0VuYWJsZWQiLCJmYWxsYmFja0xvZyIsImhhbmRsZUVycm9yIiwibWV0cmljcyIsInNldFJlcG9ydGluZ0Rpc2FibGVkIiwidXNlcl9hZ2VudCIsIndpbmRvd193aWR0aCIsImlubmVyV2lkdGgiLCJ3aW5kb3dfaGVpZ2h0IiwiaW5uZXJIZWlnaHQiLCJob3N0bmFtZSIsImZ1bGxfcGF0aCIsImhyZWYiLCJpc0RldmVsb3BtZW50RW52aXJvbm1lbnQiLCJEYXRlIiwibm93IiwiQ0hFQ0tfQ0FOX1JFUE9SVF9JTlRFUlZBTF9NSU5VVEVTIiwiTWV0cmljc1JlcG9ydGVyIiwiUmV2aWV3U3RhdGVzIiwia2VlcFdvcmtpbmciLCJhd2FpdGluZ1JldmlldyIsIkluc3RydWN0b3IiXSwic291cmNlUm9vdCI6IiJ9