/* * ATTENTION: An "eval-source-map" devtool has been used. * This devtool is neither made for production nor for readable output files. * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) * or disable the default devtool with "devtool: false". * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(require("jQuery")); else if(typeof define === 'function' && define.amd) define(["jQuery"], factory); else { var a = typeof exports === 'object' ? factory(require("jQuery")) : factory(root["jQuery"]); for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; } })(self, function(__WEBPACK_EXTERNAL_MODULE_jquery__) { return /******/ (function() { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ "./libs/jquery-timepicker/jquery-timepicker.js": /*!*****************************************************!*\ !*** ./libs/jquery-timepicker/jquery-timepicker.js ***! \*****************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var timepicker_jquery_timepicker__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! timepicker/jquery.timepicker */ "./node_modules/timepicker/jquery.timepicker.js"); /* harmony import */ var timepicker_jquery_timepicker__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(timepicker_jquery_timepicker__WEBPACK_IMPORTED_MODULE_0__); /***/ }), /***/ "./node_modules/timepicker/jquery.timepicker.js": /*!******************************************************!*\ !*** ./node_modules/timepicker/jquery.timepicker.js ***! \******************************************************/ /***/ (function(module, exports, __webpack_require__) { eval("/* module decorator */ module = __webpack_require__.nmd(module);\nvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * jquery-timepicker v1.13.19 - A jQuery timepicker plugin inspired by Google Calendar. It supports both mouse and keyboard navigation.\n * Copyright (c) 2021 Jon Thornton - https://www.jonthornton.com/jquery-timepicker/\n * License: MIT\n */\n(function () {\n 'use strict';\n\n function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n }\n\n function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n }\n\n function ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n }\n\n function _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n }\n\n function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n }\n\n function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n }\n\n function _createForOfIteratorHelper(o, allowArrayLike) {\n var it;\n\n if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n var i = 0;\n\n var F = function () {};\n\n return {\n s: F,\n n: function () {\n if (i >= o.length) return {\n done: true\n };\n return {\n done: false,\n value: o[i++]\n };\n },\n e: function (e) {\n throw e;\n },\n f: F\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n var normalCompletion = true,\n didErr = false,\n err;\n return {\n s: function () {\n it = o[Symbol.iterator]();\n },\n n: function () {\n var step = it.next();\n normalCompletion = step.done;\n return step;\n },\n e: function (e) {\n didErr = true;\n err = e;\n },\n f: function () {\n try {\n if (!normalCompletion && it.return != null) it.return();\n } finally {\n if (didErr) throw err;\n }\n }\n };\n }\n\n var ONE_DAY = 86400;\n\n var roundingFunction = function roundingFunction(seconds, settings) {\n if (seconds === null) {\n return null;\n }\n\n var i = 0;\n var nextVal = 0;\n\n while (nextVal < seconds) {\n i++;\n nextVal += settings.step(i) * 60;\n }\n\n var prevVal = nextVal - settings.step(i - 1) * 60;\n\n if (seconds - prevVal < nextVal - seconds) {\n return moduloSeconds(prevVal, settings);\n } else {\n return moduloSeconds(nextVal, settings);\n }\n };\n\n function moduloSeconds(seconds, settings) {\n if (seconds == ONE_DAY && settings.show2400) {\n return seconds;\n }\n\n return seconds % ONE_DAY;\n }\n\n var DEFAULT_SETTINGS = {\n appendTo: \"body\",\n className: null,\n closeOnWindowScroll: false,\n disableTextInput: false,\n disableTimeRanges: [],\n disableTouchKeyboard: false,\n durationTime: null,\n forceRoundTime: false,\n lang: {},\n listWidth: null,\n maxTime: null,\n minTime: null,\n noneOption: false,\n orientation: \"l\",\n roundingFunction: roundingFunction,\n scrollDefault: null,\n selectOnBlur: false,\n show2400: false,\n showDuration: false,\n showOn: [\"click\", \"focus\"],\n showOnFocus: true,\n step: 30,\n stopScrollPropagation: false,\n timeFormat: \"g:ia\",\n typeaheadHighlight: true,\n useSelect: false,\n wrapHours: true\n };\n var DEFAULT_LANG = {\n am: \"am\",\n pm: \"pm\",\n AM: \"AM\",\n PM: \"PM\",\n decimal: \".\",\n mins: \"mins\",\n hr: \"hr\",\n hrs: \"hrs\"\n };\n\n var EVENT_DEFAULTS = {\n bubbles: true,\n cancelable: false,\n detail: null\n };\n\n var Timepicker = /*#__PURE__*/function () {\n function Timepicker(targetEl) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, Timepicker);\n\n this._handleFormatValue = this._handleFormatValue.bind(this);\n this._handleKeyUp = this._handleKeyUp.bind(this);\n this.targetEl = targetEl;\n var attrOptions = Timepicker.extractAttrOptions(targetEl, Object.keys(DEFAULT_SETTINGS));\n this.settings = this.parseSettings(_objectSpread2(_objectSpread2(_objectSpread2({}, DEFAULT_SETTINGS), options), attrOptions));\n }\n\n _createClass(Timepicker, [{\n key: \"hideMe\",\n value: function hideMe() {\n if (this.settings.useSelect) {\n this.targetEl.blur();\n return;\n }\n\n if (!this.list || !Timepicker.isVisible(this.list)) {\n return;\n }\n\n if (this.settings.selectOnBlur) {\n this._selectValue();\n }\n\n this.list.hide();\n var hideTimepickerEvent = new CustomEvent('hideTimepicker', EVENT_DEFAULTS);\n this.targetEl.dispatchEvent(hideTimepickerEvent);\n }\n }, {\n key: \"_findRow\",\n value: function _findRow(value) {\n if (!value && value !== 0) {\n return false;\n }\n\n var out = false;\n var value = this.settings.roundingFunction(value, this.settings);\n\n if (!this.list) {\n return false;\n }\n\n this.list.find(\"li\").each(function (i, obj) {\n var parsed = parseInt(obj.dataset.time);\n\n if (isNaN(parsed)) {\n return;\n }\n\n if (parsed == value) {\n out = obj;\n return false;\n }\n });\n return out;\n }\n }, {\n key: \"_hideKeyboard\",\n value: function _hideKeyboard() {\n return (window.navigator.msMaxTouchPoints || \"ontouchstart\" in document) && this.settings.disableTouchKeyboard;\n }\n }, {\n key: \"_setTimeValue\",\n value: function _setTimeValue(value, source) {\n if (this.targetEl.nodeName === \"INPUT\") {\n if (value !== null || this.targetEl.value != \"\") {\n this.targetEl.value = value;\n }\n\n var tp = this;\n var settings = tp.settings;\n\n if (settings.useSelect && source != \"select\" && tp.list) {\n tp.list.val(tp._roundAndFormatTime(tp.anytime2int(value)));\n }\n }\n\n var selectTimeEvent = new CustomEvent('selectTime', EVENT_DEFAULTS);\n\n if (this.selectedValue != value) {\n this.selectedValue = value;\n var changeTimeEvent = new CustomEvent('changeTime', EVENT_DEFAULTS);\n var changeEvent = new CustomEvent('change', Object.assign(EVENT_DEFAULTS, {\n detail: 'timepicker'\n }));\n\n if (source == \"select\") {\n this.targetEl.dispatchEvent(selectTimeEvent);\n this.targetEl.dispatchEvent(changeTimeEvent);\n this.targetEl.dispatchEvent(changeEvent);\n } else if ([\"error\", \"initial\"].indexOf(source) == -1) {\n this.targetEl.dispatchEvent(changeTimeEvent);\n }\n\n return true;\n } else {\n if ([\"error\", \"initial\"].indexOf(source) == -1) {\n this.targetEl.dispatchEvent(selectTimeEvent);\n }\n\n return false;\n }\n }\n }, {\n key: \"_getTimeValue\",\n value: function _getTimeValue() {\n if (this.targetEl.nodeName === \"INPUT\") {\n return this.targetEl.value;\n } else {\n // use the element's data attributes to store values\n return this.selectedValue;\n }\n }\n }, {\n key: \"_selectValue\",\n value: function _selectValue() {\n var tp = this;\n tp.settings;\n var list = tp.list;\n var cursor = list.find(\".ui-timepicker-selected\");\n\n if (cursor.hasClass(\"ui-timepicker-disabled\")) {\n return false;\n }\n\n if (!cursor.length) {\n return true;\n }\n\n var timeValue = cursor.get(0).dataset.time; // selected value found\n\n if (timeValue) {\n var parsedTimeValue = parseInt(timeValue);\n\n if (!isNaN(parsedTimeValue)) {\n timeValue = parsedTimeValue;\n }\n }\n\n if (timeValue !== null) {\n if (typeof timeValue != \"string\") {\n timeValue = tp._int2time(timeValue);\n }\n\n tp._setTimeValue(timeValue, \"select\");\n }\n\n return true;\n }\n }, {\n key: \"anytime2int\",\n value: function anytime2int(input) {\n if (typeof input === 'number') {\n return input;\n } else if (typeof input === 'string') {\n return this.time2int(input);\n } else if (_typeof(input) === 'object' && input instanceof Date) {\n return input.getHours() * 3600 + input.getMinutes() * 60 + input.getSeconds();\n } else if (typeof input == 'function') {\n return input();\n } else {\n return null;\n }\n }\n }, {\n key: \"time2int\",\n value: function time2int(timeString) {\n if (timeString === \"\" || timeString === null || timeString === undefined) {\n return null;\n }\n\n if (timeString === 'now') {\n return this.anytime2int(new Date());\n }\n\n if (typeof timeString != \"string\") {\n return timeString;\n }\n\n timeString = timeString.toLowerCase().replace(/[\\s\\.]/g, \"\"); // if the last character is an \"a\" or \"p\", add the \"m\"\n\n if (timeString.slice(-1) == \"a\" || timeString.slice(-1) == \"p\") {\n timeString += \"m\";\n }\n\n var pattern = /^(([^0-9]*))?([0-9]?[0-9])(([0-5][0-9]))?(([0-5][0-9]))?(([^0-9]*))$/;\n var hasDelimetersMatch = timeString.match(/\\W/);\n\n if (hasDelimetersMatch) {\n pattern = /^(([^0-9]*))?([0-9]?[0-9])(\\W+([0-5][0-9]?))?(\\W+([0-5][0-9]))?(([^0-9]*))$/;\n }\n\n var time = timeString.match(pattern);\n\n if (!time) {\n return null;\n }\n\n var hour = parseInt(time[3] * 1, 10);\n var ampm = time[2] || time[9];\n var minutes = this.parseMinuteString(time[5]);\n var seconds = time[7] * 1 || 0;\n\n if (!ampm && time[3].length == 2 && time[3][0] == \"0\") {\n // preceding '0' implies AM\n ampm = \"am\";\n }\n\n if (hour > 24 && !minutes) {\n // if someone types in something like \"83\", turn it into \"8h 30m\"\n hour = time[3][0] * 1;\n minutes = this.parseMinuteString(time[3][1]);\n }\n\n var hours = hour;\n\n if (hour <= 12 && ampm) {\n ampm = ampm.trim();\n var isPm = ampm == this.settings.lang.pm || ampm == this.settings.lang.PM;\n\n if (hour == 12) {\n hours = isPm ? 12 : 0;\n } else {\n hours = hour + (isPm ? 12 : 0);\n }\n } else {\n var t = hour * 3600 + minutes * 60 + seconds;\n\n if (t >= ONE_DAY + (this.settings.show2400 ? 1 : 0)) {\n if (this.settings.wrapHours === false) {\n return null;\n }\n\n hours = hour % 24;\n }\n }\n\n var timeInt = hours * 3600 + minutes * 60 + seconds; // if no am/pm provided, intelligently guess based on the scrollDefault\n\n if (hour < 12 && !ampm && this.settings._twelveHourTime && this.settings.scrollDefault()) {\n var delta = timeInt - this.settings.scrollDefault();\n\n if (delta < 0 && delta >= ONE_DAY / -2) {\n timeInt = (timeInt + ONE_DAY / 2) % ONE_DAY;\n }\n }\n\n return timeInt;\n }\n }, {\n key: \"parseMinuteString\",\n value: function parseMinuteString(minutesString) {\n if (!minutesString) {\n minutesString = 0;\n }\n\n var multiplier = 1;\n\n if (minutesString.length == 1) {\n multiplier = 10;\n }\n\n return parseInt(minutesString) * multiplier || 0;\n }\n }, {\n key: \"intStringDateOrFunc2func\",\n value: function intStringDateOrFunc2func(input) {\n var _this = this;\n\n if (input === null || input === undefined) {\n return function () {\n return null;\n };\n } else if (typeof input === 'function') {\n return function () {\n return _this.anytime2int(input());\n };\n } else {\n return function () {\n return _this.anytime2int(input);\n };\n }\n }\n }, {\n key: \"parseSettings\",\n value: function parseSettings(settings) {\n settings.lang = _objectSpread2(_objectSpread2({}, DEFAULT_LANG), settings.lang); // lang is used by other functions the rest of this depends on\n // todo: unwind circular dependency on lang\n\n this.settings = settings;\n\n if (settings.listWidth) {\n settings.listWidth = this.anytime2int(settings.listWidth);\n }\n\n settings.minTime = this.intStringDateOrFunc2func(settings.minTime);\n settings.maxTime = this.intStringDateOrFunc2func(settings.maxTime);\n settings.durationTime = this.intStringDateOrFunc2func(settings.durationTime);\n\n if (settings.scrollDefault) {\n settings.scrollDefault = this.intStringDateOrFunc2func(settings.scrollDefault);\n } else {\n settings.scrollDefault = settings.minTime;\n }\n\n if (typeof settings.timeFormat === \"string\" && settings.timeFormat.match(/[gh]/)) {\n settings._twelveHourTime = true;\n }\n\n if (settings.showOnFocus === false && settings.showOn.indexOf(\"focus\") != -1) {\n settings.showOn.splice(settings.showOn.indexOf(\"focus\"), 1);\n }\n\n if (typeof settings.step != 'function') {\n var curryStep = settings.step;\n\n settings.step = function () {\n return curryStep;\n };\n }\n\n settings.disableTimeRanges = this._parseDisableTimeRanges(settings.disableTimeRanges);\n return settings;\n }\n }, {\n key: \"_parseDisableTimeRanges\",\n value: function _parseDisableTimeRanges(disableTimeRanges) {\n if (!disableTimeRanges || disableTimeRanges.length == 0) {\n return [];\n } // convert string times to integers\n\n\n for (var i in disableTimeRanges) {\n disableTimeRanges[i] = [this.anytime2int(disableTimeRanges[i][0]), this.anytime2int(disableTimeRanges[i][1])];\n } // sort by starting time\n\n\n disableTimeRanges = disableTimeRanges.sort(function (a, b) {\n return a[0] - b[0];\n }); // merge any overlapping ranges\n\n for (var i = disableTimeRanges.length - 1; i > 0; i--) {\n if (disableTimeRanges[i][0] <= disableTimeRanges[i - 1][1]) {\n disableTimeRanges[i - 1] = [Math.min(disableTimeRanges[i][0], disableTimeRanges[i - 1][0]), Math.max(disableTimeRanges[i][1], disableTimeRanges[i - 1][1])];\n disableTimeRanges.splice(i, 1);\n }\n }\n\n return disableTimeRanges;\n }\n /*\n * Filter freeform input\n */\n\n }, {\n key: \"_disableTextInputHandler\",\n value: function _disableTextInputHandler(e) {\n switch (e.keyCode) {\n case 13: // return\n\n case 9:\n //tab\n return;\n\n default:\n e.preventDefault();\n }\n }\n }, {\n key: \"_int2duration\",\n value: function _int2duration(seconds, step) {\n seconds = Math.abs(seconds);\n var minutes = Math.round(seconds / 60),\n duration = [],\n hours,\n mins;\n\n if (minutes < 60) {\n // Only show (x mins) under 1 hour\n duration = [minutes, this.settings.lang.mins];\n } else {\n hours = Math.floor(minutes / 60);\n mins = minutes % 60; // Show decimal notation (eg: 1.5 hrs) for 30 minute steps\n\n if (step == 30 && mins == 30) {\n hours += this.settings.lang.decimal + 5;\n }\n\n duration.push(hours);\n duration.push(hours == 1 ? this.settings.lang.hr : this.settings.lang.hrs); // Show remainder minutes notation (eg: 1 hr 15 mins) for non-30 minute steps\n // and only if there are remainder minutes to show\n\n if (step != 30 && mins) {\n duration.push(mins);\n duration.push(this.settings.lang.mins);\n }\n }\n\n return duration.join(\" \");\n }\n }, {\n key: \"_roundAndFormatTime\",\n value: function _roundAndFormatTime(seconds) {\n // console.log('_roundAndFormatTime')\n seconds = this.settings.roundingFunction(seconds, this.settings);\n\n if (seconds !== null) {\n return this._int2time(seconds);\n }\n }\n }, {\n key: \"_int2time\",\n value: function _int2time(timeInt) {\n if (typeof timeInt != \"number\") {\n return null;\n }\n\n var seconds = parseInt(timeInt % 60),\n minutes = parseInt(timeInt / 60 % 60),\n hours = parseInt(timeInt / (60 * 60) % 24);\n var time = new Date(1970, 0, 2, hours, minutes, seconds, 0);\n\n if (isNaN(time.getTime())) {\n return null;\n }\n\n if (typeof this.settings.timeFormat === \"function\") {\n return this.settings.timeFormat(time);\n }\n\n var output = \"\";\n var hour, code;\n\n for (var i = 0; i < this.settings.timeFormat.length; i++) {\n code = this.settings.timeFormat.charAt(i);\n\n switch (code) {\n case \"a\":\n output += time.getHours() > 11 ? this.settings.lang.pm : this.settings.lang.am;\n break;\n\n case \"A\":\n output += time.getHours() > 11 ? this.settings.lang.PM : this.settings.lang.AM;\n break;\n\n case \"g\":\n hour = time.getHours() % 12;\n output += hour === 0 ? \"12\" : hour;\n break;\n\n case \"G\":\n hour = time.getHours();\n if (timeInt === ONE_DAY) hour = this.settings.show2400 ? 24 : 0;\n output += hour;\n break;\n\n case \"h\":\n hour = time.getHours() % 12;\n\n if (hour !== 0 && hour < 10) {\n hour = \"0\" + hour;\n }\n\n output += hour === 0 ? \"12\" : hour;\n break;\n\n case \"H\":\n hour = time.getHours();\n if (timeInt === ONE_DAY) hour = this.settings.show2400 ? 24 : 0;\n output += hour > 9 ? hour : \"0\" + hour;\n break;\n\n case \"i\":\n var minutes = time.getMinutes();\n output += minutes > 9 ? minutes : \"0\" + minutes;\n break;\n\n case \"s\":\n seconds = time.getSeconds();\n output += seconds > 9 ? seconds : \"0\" + seconds;\n break;\n\n case \"\\\\\":\n // escape character; add the next character and skip ahead\n i++;\n output += this.settings.timeFormat.charAt(i);\n break;\n\n default:\n output += code;\n }\n }\n\n return output;\n }\n }, {\n key: \"_setSelected\",\n value: function _setSelected() {\n var list = this.list;\n list.find(\"li\").removeClass(\"ui-timepicker-selected\");\n var timeValue = this.anytime2int(this._getTimeValue());\n\n if (timeValue === null) {\n return;\n }\n\n var selected = this._findRow(timeValue);\n\n if (selected) {\n var selectedRect = selected.getBoundingClientRect();\n var listRect = list.get(0).getBoundingClientRect();\n var topDelta = selectedRect.top - listRect.top;\n\n if (topDelta + selectedRect.height > listRect.height || topDelta < 0) {\n var newScroll = list.scrollTop() + (selectedRect.top - listRect.top) - selectedRect.height;\n list.scrollTop(newScroll);\n }\n\n var parsed = parseInt(selected.dataset.time);\n\n if (this.settings.forceRoundTime || parsed === timeValue) {\n selected.classList.add('ui-timepicker-selected');\n }\n }\n }\n }, {\n key: \"_isFocused\",\n value: function _isFocused(el) {\n return el === document.activeElement;\n }\n }, {\n key: \"_handleFormatValue\",\n value: function _handleFormatValue(e) {\n if (e && e.detail == \"timepicker\") {\n return;\n }\n\n this._formatValue(e);\n }\n }, {\n key: \"_formatValue\",\n value: function _formatValue(e, origin) {\n if (this.targetEl.value === \"\") {\n this._setTimeValue(null, origin);\n\n return;\n } // IE fires change event before blur\n\n\n if (this._isFocused(this.targetEl) && (!e || e.type != \"change\")) {\n return;\n }\n\n var settings = this.settings;\n var seconds = this.anytime2int(this.targetEl.value);\n\n if (seconds === null) {\n var timeFormatErrorEvent = new CustomEvent('timeFormatError', EVENT_DEFAULTS);\n this.targetEl.dispatchEvent(timeFormatErrorEvent);\n return;\n }\n\n var rangeError = false; // check that the time in within bounds\n\n if (settings.minTime !== null && settings.maxTime !== null && (seconds < settings.minTime() || seconds > settings.maxTime())) {\n rangeError = true;\n } // check that time isn't within disabled time ranges\n\n\n var _iterator = _createForOfIteratorHelper(settings.disableTimeRanges),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var range = _step.value;\n\n if (seconds >= range[0] && seconds < range[1]) {\n rangeError = true;\n break;\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n if (settings.forceRoundTime) {\n var roundSeconds = settings.roundingFunction(seconds, settings);\n\n if (roundSeconds != seconds) {\n seconds = roundSeconds;\n origin = null;\n }\n }\n\n var prettyTime = this._int2time(seconds);\n\n if (rangeError) {\n this._setTimeValue(prettyTime);\n\n var timeRangeErrorEvent = new CustomEvent('timeRangeError', EVENT_DEFAULTS);\n this.targetEl.dispatchEvent(timeRangeErrorEvent);\n } else {\n this._setTimeValue(prettyTime, origin);\n }\n }\n }, {\n key: \"_generateNoneElement\",\n value: function _generateNoneElement(optionValue, useSelect) {\n var label, className, value;\n\n if (_typeof(optionValue) == \"object\") {\n label = optionValue.label;\n className = optionValue.className;\n value = optionValue.value;\n } else if (typeof optionValue == \"string\") {\n label = optionValue;\n value = \"\";\n } else {\n $.error(\"Invalid noneOption value\");\n }\n\n var el;\n\n if (useSelect) {\n el = document.createElement(\"option\");\n el.value = value;\n } else {\n el = document.createElement(\"li\");\n el.dataset.time = String(value);\n }\n\n el.innerText = label;\n el.classList.add(className);\n return el;\n }\n /*\n * Time typeahead\n */\n\n }, {\n key: \"_handleKeyUp\",\n value: function _handleKeyUp(e) {\n var _this2 = this;\n\n if (!this.list || !Timepicker.isVisible(this.list) || this.settings.disableTextInput) {\n return true;\n }\n\n if (e.type === \"paste\" || e.type === \"cut\") {\n var handler = function handler() {\n if (_this2.settings.typeaheadHighlight) {\n _this2._setSelected();\n } else {\n _this2.list.hide();\n }\n };\n\n setTimeout(handler, 0);\n return;\n }\n\n switch (e.keyCode) {\n case 96: // numpad numerals\n\n case 97:\n case 98:\n case 99:\n case 100:\n case 101:\n case 102:\n case 103:\n case 104:\n case 105:\n case 48: // numerals\n\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n case 65: // a\n\n case 77: // m\n\n case 80: // p\n\n case 186: // colon\n\n case 8: // backspace\n\n case 46:\n // delete\n if (this.settings.typeaheadHighlight) {\n this._setSelected();\n } else {\n this.list.hide();\n }\n\n break;\n }\n }\n }], [{\n key: \"extractAttrOptions\",\n value: function extractAttrOptions(element, keys) {\n var output = {};\n\n var _iterator2 = _createForOfIteratorHelper(keys),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var key = _step2.value;\n\n if (key in element.dataset) {\n output[key] = element.dataset[key];\n }\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n return output;\n }\n }, {\n key: \"isVisible\",\n value: function isVisible(elem) {\n var el = elem[0];\n return el.offsetWidth > 0 && el.offsetHeight > 0;\n }\n }, {\n key: \"hideAll\",\n value: function hideAll() {\n var _iterator3 = _createForOfIteratorHelper(document.getElementsByClassName('ui-timepicker-input')),\n _step3;\n\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n var el = _step3.value;\n var tp = el.timepickerObj;\n\n if (tp) {\n tp.hideMe();\n }\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n }\n }]);\n\n return Timepicker;\n }(); // IE9-11 polyfill for CustomEvent\n\n\n (function () {\n if (typeof window.CustomEvent === \"function\") return false;\n\n function CustomEvent(event, params) {\n if (!params) {\n params = {};\n }\n\n params = Object.assign(EVENT_DEFAULTS, params);\n var evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n }\n\n window.CustomEvent = CustomEvent;\n })();\n\n function _getNoneOptionItems(settings) {\n if (!settings.noneOption) {\n return [];\n }\n\n var noneOptions = _getNoneOptionItemsHelper(settings.noneOption);\n\n if (Array.isArray(settings.noneOption)) {\n return noneOptions;\n } else {\n return [noneOptions];\n }\n }\n\n function _getNoneOptionItemsHelper(noneOption) {\n if (Array.isArray(noneOption)) {\n return noneOption.map(_getNoneOptionItemsHelper);\n }\n\n if (noneOption === true) {\n return {\n 'label': 'None',\n 'value': ''\n };\n }\n\n if (_typeof(noneOption) === 'object') {\n return noneOption;\n }\n\n return {\n 'label': noneOption,\n 'value': ''\n };\n }\n\n function _getDropdownTimes(tp) {\n var _settings$minTime, _settings$maxTime;\n\n var settings = tp.settings;\n var start = (_settings$minTime = settings.minTime()) !== null && _settings$minTime !== void 0 ? _settings$minTime : 0;\n var end = (_settings$maxTime = settings.maxTime()) !== null && _settings$maxTime !== void 0 ? _settings$maxTime : start + ONE_DAY - 1;\n\n if (end < start) {\n // make sure the end time is greater than start time, otherwise there will be no list to show\n end += ONE_DAY;\n }\n\n if (end === ONE_DAY - 1 && typeof settings.timeFormat === 'string' && settings.show2400) {\n // show a 24:00 option when using military time\n end = ONE_DAY;\n }\n\n var output = [];\n\n for (var i = start, j = 0; i <= end; j++, i += settings.step(j) * 60) {\n var timeInt = i;\n\n var timeString = tp._int2time(timeInt);\n\n var className = timeInt % ONE_DAY < ONE_DAY / 2 ? 'ui-timepicker-am' : 'ui-timepicker-pm';\n var item = {\n 'label': timeString,\n 'value': moduloSeconds(timeInt, settings),\n 'className': className\n };\n\n if ((settings.minTime() !== null || settings.durationTime() !== null) && settings.showDuration) {\n var _settings$durationTim;\n\n var durStart = (_settings$durationTim = settings.durationTime()) !== null && _settings$durationTim !== void 0 ? _settings$durationTim : settings.minTime();\n\n var durationString = tp._int2duration(i - durStart, settings.step());\n\n item.duration = durationString;\n }\n\n var _iterator = _createForOfIteratorHelper(settings.disableTimeRanges),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var range = _step.value;\n\n if (timeInt % ONE_DAY >= range[0] && timeInt % ONE_DAY < range[1]) {\n item.disabled = true;\n break;\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n output.push(item);\n }\n\n return output;\n }\n\n function _renderSelectItem(item) {\n var el = document.createElement('option');\n el.value = item.label;\n\n if (item.duration) {\n el.appendChild(document.createTextNode(item.label + ' (' + item.duration + ')'));\n } else {\n el.appendChild(document.createTextNode(item.label));\n }\n\n if (item.disabled) {\n el.disabled = true;\n }\n\n return el;\n }\n\n function _renderStandardItem(item) {\n var el = document.createElement('li');\n el.dataset['time'] = item.value;\n\n if (item.className) {\n el.classList.add(item.className);\n }\n\n el.className = item.className;\n el.appendChild(document.createTextNode(item.label));\n\n if (item.duration) {\n var durationEl = document.createElement('span');\n durationEl.appendChild(document.createTextNode('(' + item.duration + ')'));\n durationEl.classList.add('ui-timepicker-duration');\n el.appendChild(durationEl);\n }\n\n if (item.disabled) {\n el.classList.add('ui-timepicker-disabled');\n }\n\n return el;\n }\n\n function _renderStandardList(items) {\n var list = document.createElement('ul');\n list.classList.add('ui-timepicker-list');\n\n var _iterator2 = _createForOfIteratorHelper(items),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var item = _step2.value;\n\n var itemEl = _renderStandardItem(item);\n\n list.appendChild(itemEl);\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n var wrapper = document.createElement('div');\n wrapper.classList.add('ui-timepicker-wrapper');\n wrapper.tabIndex = -1;\n wrapper.style.display = 'none';\n wrapper.style.position = 'absolute';\n wrapper.appendChild(list);\n return wrapper;\n }\n\n function _renderSelectList(items, targetName) {\n var el = document.createElement('select');\n el.classList.add('ui-timepicker-select');\n\n if (targetName) {\n el.name = 'ui-timepicker-' + targetName;\n }\n\n var _iterator3 = _createForOfIteratorHelper(items),\n _step3;\n\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n var item = _step3.value;\n\n var itemEl = _renderSelectItem(item);\n\n el.appendChild(itemEl);\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n\n return el;\n }\n\n function renderHtml(tp) {\n var items = [].concat(_getNoneOptionItems(tp.settings), _getDropdownTimes(tp));\n var el;\n\n if (tp.settings.useSelect) {\n el = _renderSelectList(items, tp.targetEl.name);\n } else {\n el = _renderStandardList(items);\n }\n\n if (tp.settings.className) {\n var _iterator4 = _createForOfIteratorHelper(tp.settings.className.split(' ')),\n _step4;\n\n try {\n for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n var token = _step4.value;\n el.classList.add(token);\n }\n } catch (err) {\n _iterator4.e(err);\n } finally {\n _iterator4.f();\n }\n }\n\n if (tp.settings.showDuration && (tp.settings.minTime !== null || tp.settings.durationTime !== null)) {\n el.classList.add(\"ui-timepicker-with-duration\");\n el.classList.add(\"ui-timepicker-step-\" + tp.settings.step());\n }\n\n return el;\n }\n\n (function (factory) {\n if (( false ? 0 : _typeof(exports)) === \"object\" && exports && ( false ? 0 : _typeof(module)) === \"object\" && module && module.exports === exports) {\n // Browserify. Attach to jQuery module.\n factory(__webpack_require__(/*! jquery */ \"jquery\"));\n } else if (true) {\n // AMD. Register as an anonymous module.\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"jquery\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n })(function ($) {\n var methods = {\n init: function init(options) {\n return this.each(function () {\n var self = $(this);\n var tp = new Timepicker(this, options);\n var settings = tp.settings;\n settings.lang;\n this.timepickerObj = tp;\n self.addClass(\"ui-timepicker-input\");\n\n if (settings.useSelect) {\n _render(self);\n } else {\n self.prop(\"autocomplete\", \"off\");\n\n if (settings.showOn) {\n for (var i in settings.showOn) {\n self.on(settings.showOn[i] + \".timepicker\", methods.show);\n }\n }\n\n self.on(\"change.timepicker\", tp._handleFormatValue);\n self.on(\"keydown.timepicker\", _keydownhandler);\n self.on(\"keyup.timepicker\", tp._handleKeyUp);\n\n if (settings.disableTextInput) {\n self.on(\"keydown.timepicker\", tp._disableTextInputHandler);\n }\n\n self.on(\"cut.timepicker\", tp._handleKeyUp);\n self.on(\"paste.timepicker\", tp._handleKeyUp);\n\n tp._formatValue(null, \"initial\");\n }\n });\n },\n show: function show(e) {\n var self = $(this);\n var tp = self[0].timepickerObj;\n var settings = tp.settings;\n\n if (e) {\n e.preventDefault();\n }\n\n if (settings.useSelect) {\n tp.list.trigger('focus');\n return;\n }\n\n if (tp._hideKeyboard()) {\n // block the keyboard on mobile devices\n self.trigger('blur');\n }\n\n var list = tp.list; // check if input is readonly\n\n if (self.prop(\"readonly\")) {\n return;\n } // check if list needs to be rendered\n\n\n _render(self);\n\n list = tp.list;\n\n if (Timepicker.isVisible(list)) {\n return;\n }\n\n if (self.is('input')) {\n tp.selectedValue = self.val();\n }\n\n tp._setSelected(); // make sure other pickers are hidden\n\n\n Timepicker.hideAll();\n\n if (typeof settings.listWidth == \"number\") {\n list.width(self.outerWidth() * settings.listWidth);\n } // position the dropdown relative to the input\n\n\n list.show();\n var listOffset = {};\n\n if (settings.orientation.match(/r/)) {\n // right-align the dropdown\n listOffset.left = self.offset().left + self.outerWidth() - list.outerWidth() + parseInt(list.css(\"marginLeft\").replace(\"px\", \"\"), 10);\n } else if (settings.orientation.match(/l/)) {\n // left-align the dropdown\n listOffset.left = self.offset().left + parseInt(list.css(\"marginLeft\").replace(\"px\", \"\"), 10);\n } else if (settings.orientation.match(/c/)) {\n // center-align the dropdown\n listOffset.left = self.offset().left + (self.outerWidth() - list.outerWidth()) / 2 + parseInt(list.css(\"marginLeft\").replace(\"px\", \"\"), 10);\n }\n\n var verticalOrientation;\n\n if (settings.orientation.match(/t/)) {\n verticalOrientation = \"t\";\n } else if (settings.orientation.match(/b/)) {\n verticalOrientation = \"b\";\n } else if (self.offset().top + self.outerHeight(true) + list.outerHeight() > $(window).height() + $(window).scrollTop()) {\n verticalOrientation = \"t\";\n } else {\n verticalOrientation = \"b\";\n }\n\n if (verticalOrientation == \"t\") {\n // position the dropdown on top\n list.addClass(\"ui-timepicker-positioned-top\");\n listOffset.top = self.offset().top - list.outerHeight() + parseInt(list.css(\"marginTop\").replace(\"px\", \"\"), 10);\n } else {\n // put it under the input\n list.removeClass(\"ui-timepicker-positioned-top\");\n listOffset.top = self.offset().top + self.outerHeight() + parseInt(list.css(\"marginTop\").replace(\"px\", \"\"), 10);\n }\n\n list.offset(listOffset); // position scrolling\n\n var selected = list.find(\".ui-timepicker-selected\");\n\n if (!selected.length) {\n var timeInt = tp.anytime2int(tp._getTimeValue());\n\n if (timeInt !== null) {\n selected = $(tp._findRow(timeInt));\n } else if (settings.scrollDefault()) {\n selected = $(tp._findRow(settings.scrollDefault()));\n }\n } // if not found or disabled, intelligently find first selectable element\n\n\n if (!selected.length || selected.hasClass(\"ui-timepicker-disabled\")) {\n selected = list.find(\"li:not(.ui-timepicker-disabled):first\");\n }\n\n if (selected && selected.length) {\n var topOffset = list.scrollTop() + selected.position().top - selected.outerHeight();\n list.scrollTop(topOffset);\n } else {\n list.scrollTop(0);\n } // prevent scroll propagation\n\n\n if (settings.stopScrollPropagation) {\n $(document).on(\"wheel.ui-timepicker\", \".ui-timepicker-wrapper\", function (e) {\n e.preventDefault();\n var currentScroll = $(this).scrollTop();\n $(this).scrollTop(currentScroll + e.originalEvent.deltaY);\n });\n } // attach close handlers\n\n\n $(document).on(\"mousedown.ui-timepicker\", _closeHandler);\n window.addEventListener('resize', _closeHandler);\n\n if (settings.closeOnWindowScroll) {\n $(document).on(\"scroll.ui-timepicker\", _closeHandler);\n }\n\n self.trigger(\"showTimepicker\");\n return this;\n },\n hide: function hide(e) {\n var tp = this[0].timepickerObj;\n\n if (tp) {\n tp.hideMe();\n }\n\n Timepicker.hideAll();\n return this;\n },\n option: function option(key, value) {\n if (typeof key == \"string\" && typeof value == \"undefined\") {\n var tp = this[0].timepickerObj;\n return tp.settings[key];\n }\n\n return this.each(function () {\n var self = $(this);\n var tp = self[0].timepickerObj;\n var settings = tp.settings;\n var list = tp.list;\n\n if (_typeof(key) == \"object\") {\n settings = $.extend(settings, key);\n } else if (typeof key == \"string\") {\n settings[key] = value;\n }\n\n settings = tp.parseSettings(settings);\n tp.settings = settings;\n\n tp._formatValue({\n type: \"change\"\n }, \"initial\");\n\n if (list) {\n list.remove();\n tp.list = null;\n }\n\n if (settings.useSelect) {\n _render(self);\n }\n });\n },\n getSecondsFromMidnight: function getSecondsFromMidnight() {\n var tp = this[0].timepickerObj;\n return tp.anytime2int(tp._getTimeValue());\n },\n getTime: function getTime(relative_date) {\n var tp = this[0].timepickerObj;\n\n var time_string = tp._getTimeValue();\n\n if (!time_string) {\n return null;\n }\n\n var offset = tp.anytime2int(time_string);\n\n if (offset === null) {\n return null;\n }\n\n if (!relative_date) {\n relative_date = new Date();\n } // construct a Date from relative date, and offset's time\n\n\n var time = new Date(relative_date);\n time.setHours(offset / 3600);\n time.setMinutes(offset % 3600 / 60);\n time.setSeconds(offset % 60);\n time.setMilliseconds(0);\n return time;\n },\n isVisible: function isVisible() {\n var tp = this[0].timepickerObj;\n return !!(tp && tp.list && Timepicker.isVisible(tp.list));\n },\n setTime: function setTime(value) {\n var tp = this[0].timepickerObj;\n var settings = tp.settings;\n\n if (settings.forceRoundTime) {\n var prettyTime = tp._roundAndFormatTime(tp.anytime2int(value));\n } else {\n var prettyTime = tp._int2time(tp.anytime2int(value));\n }\n\n if (value && prettyTime === null && settings.noneOption) {\n prettyTime = value;\n }\n\n tp._setTimeValue(prettyTime, \"initial\");\n\n tp._formatValue({\n type: \"change\"\n }, \"initial\");\n\n if (tp && tp.list) {\n tp._setSelected();\n }\n\n return this;\n },\n remove: function remove() {\n var self = this; // check if this element is a timepicker\n\n if (!self.hasClass(\"ui-timepicker-input\")) {\n return;\n }\n\n var tp = self[0].timepickerObj;\n var settings = tp.settings;\n self.removeAttr(\"autocomplete\", \"off\");\n self.removeClass(\"ui-timepicker-input\");\n self.removeData(\"timepicker-obj\");\n self.off(\".timepicker\"); // timepicker-list won't be present unless the user has interacted with this timepicker\n\n if (tp.list) {\n tp.list.remove();\n }\n\n if (settings.useSelect) {\n self.show();\n }\n\n tp.list = null;\n return this;\n }\n }; // private methods\n\n function _render(self) {\n var tp = self[0].timepickerObj;\n var list = tp.list;\n var settings = tp.settings;\n\n if (list && list.length) {\n list.remove();\n tp.list = null;\n }\n\n var wrapped_list = $(renderHtml(tp));\n\n if (settings.useSelect) {\n list = wrapped_list;\n } else {\n list = wrapped_list.children('ul');\n }\n\n wrapped_list.data(\"timepicker-input\", self);\n tp.list = wrapped_list;\n\n if (settings.useSelect) {\n if (self.val()) {\n list.val(tp._roundAndFormatTime(tp.anytime2int(self.val())));\n }\n\n list.on(\"focus\", function () {\n $(this).data(\"timepicker-input\").trigger(\"showTimepicker\");\n });\n list.on(\"blur\", function () {\n $(this).data(\"timepicker-input\").trigger(\"hideTimepicker\");\n });\n list.on(\"change\", function () {\n tp._setTimeValue($(this).val(), \"select\");\n });\n\n tp._setTimeValue(list.val(), \"initial\");\n\n self.hide().after(list);\n } else {\n var appendTo = settings.appendTo;\n\n if (typeof appendTo === \"string\") {\n appendTo = $(appendTo);\n } else if (typeof appendTo === \"function\") {\n appendTo = appendTo(self);\n }\n\n appendTo.append(wrapped_list);\n\n tp._setSelected();\n\n list.on(\"mousedown click\", \"li\", function (e) {\n // hack: temporarily disable the focus handler\n // to deal with the fact that IE fires 'focus'\n // events asynchronously\n self.off(\"focus.timepicker\");\n self.on(\"focus.timepicker-ie-hack\", function () {\n self.off(\"focus.timepicker-ie-hack\");\n self.on(\"focus.timepicker\", methods.show);\n });\n\n if (!tp._hideKeyboard()) {\n self[0].focus();\n } // make sure only the clicked row is selected\n\n\n list.find(\"li\").removeClass(\"ui-timepicker-selected\");\n $(this).addClass(\"ui-timepicker-selected\");\n\n if (tp._selectValue()) {\n self.trigger(\"hideTimepicker\");\n list.on(\"mouseup.timepicker click.timepicker\", \"li\", function (e) {\n list.off(\"mouseup.timepicker click.timepicker\");\n wrapped_list.hide();\n });\n }\n });\n }\n } // event handler to decide whether to close timepicker\n\n\n function _closeHandler(e) {\n if (e.type == 'focus' && e.target == window) {\n // mobile Chrome fires focus events against window for some reason\n return;\n }\n\n var target = $(e.target);\n\n if (target.closest(\".ui-timepicker-input\").length || target.closest(\".ui-timepicker-wrapper\").length) {\n // active timepicker was focused. ignore\n return;\n }\n\n Timepicker.hideAll();\n $(document).off(\".ui-timepicker\");\n $(window).off(\".ui-timepicker\");\n }\n /*\n * Keyboard navigation via arrow keys\n */\n\n\n function _keydownhandler(e) {\n var self = $(this);\n var tp = self[0].timepickerObj;\n var list = tp.list;\n\n if (!list || !Timepicker.isVisible(list)) {\n if (e.keyCode == 40) {\n // show the list!\n methods.show.call(self.get(0));\n list = tp.list;\n\n if (!tp._hideKeyboard()) {\n self.trigger('focus');\n }\n } else {\n return true;\n }\n }\n\n switch (e.keyCode) {\n case 13:\n // return\n if (tp._selectValue()) {\n tp._formatValue({\n type: \"change\"\n });\n\n tp.hideMe();\n }\n\n e.preventDefault();\n return false;\n\n case 38:\n // up\n var selected = list.find(\".ui-timepicker-selected\");\n\n if (!selected.length) {\n list.find(\"li\").each(function (i, obj) {\n if ($(obj).position().top > 0) {\n selected = $(obj);\n return false;\n }\n });\n selected.addClass(\"ui-timepicker-selected\");\n } else if (!selected.is(\":first-child\")) {\n selected.removeClass(\"ui-timepicker-selected\");\n selected.prev().addClass(\"ui-timepicker-selected\");\n\n if (selected.prev().position().top < selected.outerHeight()) {\n list.scrollTop(list.scrollTop() - selected.outerHeight());\n }\n }\n\n return false;\n\n case 40:\n // down\n selected = list.find(\".ui-timepicker-selected\");\n\n if (selected.length === 0) {\n list.find(\"li\").each(function (i, obj) {\n if ($(obj).position().top > 0) {\n selected = $(obj);\n return false;\n }\n });\n selected.addClass(\"ui-timepicker-selected\");\n } else if (!selected.is(\":last-child\")) {\n selected.removeClass(\"ui-timepicker-selected\");\n selected.next().addClass(\"ui-timepicker-selected\");\n\n if (selected.next().position().top + 2 * selected.outerHeight() > list.outerHeight()) {\n list.scrollTop(list.scrollTop() + selected.outerHeight());\n }\n }\n\n return false;\n\n case 27:\n // escape\n list.find(\"li\").removeClass(\"ui-timepicker-selected\");\n tp.hideMe();\n break;\n\n case 9:\n //tab\n tp.hideMe();\n break;\n\n default:\n return true;\n }\n } // Plugin entry\n\n\n $.fn.timepicker = function (method) {\n if (!this.length) return this;\n\n if (methods[method]) {\n // check if this element is a timepicker\n if (!this.hasClass(\"ui-timepicker-input\")) {\n return this;\n }\n\n return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));\n } else if (_typeof(method) === \"object\" || !method) {\n return methods.init.apply(this, arguments);\n } else {\n $.error(\"Method \" + method + \" does not exist on jQuery.timepicker\");\n }\n }; // Default plugin options.\n\n\n $.fn.timepicker.defaults = DEFAULT_SETTINGS;\n });\n\n}());\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdGltZXBpY2tlci9qcXVlcnkudGltZXBpY2tlci5qcy5qcyIsIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsMkNBQTJDLFNBQVM7O0FBRXBEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0ZBQXdGO0FBQ3hGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOztBQUVYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxvREFBb0Q7O0FBRXBEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsc0VBQXNFOztBQUV0RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLFVBQVU7QUFDVjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsNkRBQTZEOztBQUU3RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdEQUF3RCxpQ0FBaUM7QUFDekY7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7OztBQUdWO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBO0FBQ0EsU0FBUyxHQUFHOztBQUVaLG1EQUFtRCxPQUFPO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLCtCQUErQjs7QUFFL0I7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0ZBQXNGO0FBQ3RGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx3QkFBd0IscUNBQXFDO0FBQzdEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVU7OztBQUdWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZ0NBQWdDOztBQUVoQztBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTs7QUFFQTtBQUNBLDhCQUE4Qiw4QkFBOEI7QUFDNUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwrQkFBK0IsZ0NBQWdDO0FBQy9EOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsK0JBQStCLGdDQUFnQztBQUMvRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHLElBQUk7OztBQUdQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLCtCQUErQixVQUFVO0FBQ3pDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDRCQUE0Qiw4QkFBOEI7QUFDMUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkIsZ0NBQWdDO0FBQzNEOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQixnQ0FBZ0M7QUFDM0Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2QkFBNkIsZ0NBQWdDO0FBQzdEO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFNBQVMsTUFBOEIsR0FBRyxDQUFXLGlEQUFpRCxNQUE2QixHQUFHLENBQVc7QUFDako7QUFDQSxjQUFjLG1CQUFPLENBQUMsc0JBQVE7QUFDOUIsTUFBTSxTQUFTLElBQTBDO0FBQ3pEO0FBQ0EsTUFBTSxpQ0FBTyxDQUFDLDJDQUFRLENBQUMsb0NBQUUsT0FBTztBQUFBO0FBQUE7QUFBQSxrR0FBQztBQUNqQyxNQUFNLEtBQUssRUFHTjtBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNEJBQTRCOztBQUU1QjtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkI7OztBQUczQjs7QUFFQTtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlDQUFpQzs7QUFFakM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxVQUFVOzs7QUFHVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXOztBQUVYO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQSx5QkFBeUI7O0FBRXpCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDOztBQUVqQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTOztBQUVUOztBQUVBO0FBQ0EsUUFBUTtBQUNSOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0EsWUFBWTs7O0FBR1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0EsR0FBRzs7QUFFSCxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vVnVleHkvLi9ub2RlX21vZHVsZXMvdGltZXBpY2tlci9qcXVlcnkudGltZXBpY2tlci5qcz8yMDUwIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICoganF1ZXJ5LXRpbWVwaWNrZXIgdjEuMTMuMTkgLSBBIGpRdWVyeSB0aW1lcGlja2VyIHBsdWdpbiBpbnNwaXJlZCBieSBHb29nbGUgQ2FsZW5kYXIuIEl0IHN1cHBvcnRzIGJvdGggbW91c2UgYW5kIGtleWJvYXJkIG5hdmlnYXRpb24uXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEgSm9uIFRob3JudG9uIC0gaHR0cHM6Ly93d3cuam9udGhvcm50b24uY29tL2pxdWVyeS10aW1lcGlja2VyL1xuICogTGljZW5zZTogTUlUXG4gKi9cbihmdW5jdGlvbiAoKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgX3R5cGVvZiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIF90eXBlb2Yob2JqKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH1cblxuICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgaWYgKGtleSBpbiBvYmopIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYmpba2V5XSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBmdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG4gICAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgICAgfSk7XG4gICAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGtleXM7XG4gIH1cblxuICBmdW5jdGlvbiBfb2JqZWN0U3ByZWFkMih0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG5cbiAgICAgIGlmIChpICUgMikge1xuICAgICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuXG4gIGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgICBpZiAoIW8pIHJldHVybjtcbiAgICBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xuICAgIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pO1xuICAgIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gICAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07XG5cbiAgICByZXR1cm4gYXJyMjtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7XG4gICAgdmFyIGl0O1xuXG4gICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgaWYgKGl0KSBvID0gaXQ7XG4gICAgICAgIHZhciBpID0gMDtcblxuICAgICAgICB2YXIgRiA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgczogRixcbiAgICAgICAgICBuOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgICAgICB2YWx1ZTogb1tpKytdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZTogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmOiBGXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbiAgICB9XG5cbiAgICB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsXG4gICAgICAgIGRpZEVyciA9IGZhbHNlLFxuICAgICAgICBlcnI7XG4gICAgcmV0dXJuIHtcbiAgICAgIHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIH0sXG4gICAgICBuOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdGVwID0gaXQubmV4dCgpO1xuICAgICAgICBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lO1xuICAgICAgICByZXR1cm4gc3RlcDtcbiAgICAgIH0sXG4gICAgICBlOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBkaWRFcnIgPSB0cnVlO1xuICAgICAgICBlcnIgPSBlO1xuICAgICAgfSxcbiAgICAgIGY6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXQucmV0dXJuICE9IG51bGwpIGl0LnJldHVybigpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChkaWRFcnIpIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICB2YXIgT05FX0RBWSA9IDg2NDAwO1xuXG4gIHZhciByb3VuZGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24gcm91bmRpbmdGdW5jdGlvbihzZWNvbmRzLCBzZXR0aW5ncykge1xuICAgIGlmIChzZWNvbmRzID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIG5leHRWYWwgPSAwO1xuXG4gICAgd2hpbGUgKG5leHRWYWwgPCBzZWNvbmRzKSB7XG4gICAgICBpKys7XG4gICAgICBuZXh0VmFsICs9IHNldHRpbmdzLnN0ZXAoaSkgKiA2MDtcbiAgICB9XG5cbiAgICB2YXIgcHJldlZhbCA9IG5leHRWYWwgLSBzZXR0aW5ncy5zdGVwKGkgLSAxKSAqIDYwO1xuXG4gICAgaWYgKHNlY29uZHMgLSBwcmV2VmFsIDwgbmV4dFZhbCAtIHNlY29uZHMpIHtcbiAgICAgIHJldHVybiBtb2R1bG9TZWNvbmRzKHByZXZWYWwsIHNldHRpbmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1vZHVsb1NlY29uZHMobmV4dFZhbCwgc2V0dGluZ3MpO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBtb2R1bG9TZWNvbmRzKHNlY29uZHMsIHNldHRpbmdzKSB7XG4gICAgaWYgKHNlY29uZHMgPT0gT05FX0RBWSAmJiBzZXR0aW5ncy5zaG93MjQwMCkge1xuICAgICAgcmV0dXJuIHNlY29uZHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlY29uZHMgJSBPTkVfREFZO1xuICB9XG5cbiAgdmFyIERFRkFVTFRfU0VUVElOR1MgPSB7XG4gICAgYXBwZW5kVG86IFwiYm9keVwiLFxuICAgIGNsYXNzTmFtZTogbnVsbCxcbiAgICBjbG9zZU9uV2luZG93U2Nyb2xsOiBmYWxzZSxcbiAgICBkaXNhYmxlVGV4dElucHV0OiBmYWxzZSxcbiAgICBkaXNhYmxlVGltZVJhbmdlczogW10sXG4gICAgZGlzYWJsZVRvdWNoS2V5Ym9hcmQ6IGZhbHNlLFxuICAgIGR1cmF0aW9uVGltZTogbnVsbCxcbiAgICBmb3JjZVJvdW5kVGltZTogZmFsc2UsXG4gICAgbGFuZzoge30sXG4gICAgbGlzdFdpZHRoOiBudWxsLFxuICAgIG1heFRpbWU6IG51bGwsXG4gICAgbWluVGltZTogbnVsbCxcbiAgICBub25lT3B0aW9uOiBmYWxzZSxcbiAgICBvcmllbnRhdGlvbjogXCJsXCIsXG4gICAgcm91bmRpbmdGdW5jdGlvbjogcm91bmRpbmdGdW5jdGlvbixcbiAgICBzY3JvbGxEZWZhdWx0OiBudWxsLFxuICAgIHNlbGVjdE9uQmx1cjogZmFsc2UsXG4gICAgc2hvdzI0MDA6IGZhbHNlLFxuICAgIHNob3dEdXJhdGlvbjogZmFsc2UsXG4gICAgc2hvd09uOiBbXCJjbGlja1wiLCBcImZvY3VzXCJdLFxuICAgIHNob3dPbkZvY3VzOiB0cnVlLFxuICAgIHN0ZXA6IDMwLFxuICAgIHN0b3BTY3JvbGxQcm9wYWdhdGlvbjogZmFsc2UsXG4gICAgdGltZUZvcm1hdDogXCJnOmlhXCIsXG4gICAgdHlwZWFoZWFkSGlnaGxpZ2h0OiB0cnVlLFxuICAgIHVzZVNlbGVjdDogZmFsc2UsXG4gICAgd3JhcEhvdXJzOiB0cnVlXG4gIH07XG4gIHZhciBERUZBVUxUX0xBTkcgPSB7XG4gICAgYW06IFwiYW1cIixcbiAgICBwbTogXCJwbVwiLFxuICAgIEFNOiBcIkFNXCIsXG4gICAgUE06IFwiUE1cIixcbiAgICBkZWNpbWFsOiBcIi5cIixcbiAgICBtaW5zOiBcIm1pbnNcIixcbiAgICBocjogXCJoclwiLFxuICAgIGhyczogXCJocnNcIlxuICB9O1xuXG4gIHZhciBFVkVOVF9ERUZBVUxUUyA9IHtcbiAgICBidWJibGVzOiB0cnVlLFxuICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgIGRldGFpbDogbnVsbFxuICB9O1xuXG4gIHZhciBUaW1lcGlja2VyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUaW1lcGlja2VyKHRhcmdldEVsKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUaW1lcGlja2VyKTtcblxuICAgICAgdGhpcy5faGFuZGxlRm9ybWF0VmFsdWUgPSB0aGlzLl9oYW5kbGVGb3JtYXRWYWx1ZS5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5faGFuZGxlS2V5VXAgPSB0aGlzLl9oYW5kbGVLZXlVcC5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy50YXJnZXRFbCA9IHRhcmdldEVsO1xuICAgICAgdmFyIGF0dHJPcHRpb25zID0gVGltZXBpY2tlci5leHRyYWN0QXR0ck9wdGlvbnModGFyZ2V0RWwsIE9iamVjdC5rZXlzKERFRkFVTFRfU0VUVElOR1MpKTtcbiAgICAgIHRoaXMuc2V0dGluZ3MgPSB0aGlzLnBhcnNlU2V0dGluZ3MoX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIERFRkFVTFRfU0VUVElOR1MpLCBvcHRpb25zKSwgYXR0ck9wdGlvbnMpKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlQ2xhc3MoVGltZXBpY2tlciwgW3tcbiAgICAgIGtleTogXCJoaWRlTWVcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBoaWRlTWUoKSB7XG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLnVzZVNlbGVjdCkge1xuICAgICAgICAgIHRoaXMudGFyZ2V0RWwuYmx1cigpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5saXN0IHx8ICFUaW1lcGlja2VyLmlzVmlzaWJsZSh0aGlzLmxpc3QpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3Muc2VsZWN0T25CbHVyKSB7XG4gICAgICAgICAgdGhpcy5fc2VsZWN0VmFsdWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGlzdC5oaWRlKCk7XG4gICAgICAgIHZhciBoaWRlVGltZXBpY2tlckV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdoaWRlVGltZXBpY2tlcicsIEVWRU5UX0RFRkFVTFRTKTtcbiAgICAgICAgdGhpcy50YXJnZXRFbC5kaXNwYXRjaEV2ZW50KGhpZGVUaW1lcGlja2VyRXZlbnQpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJfZmluZFJvd1wiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9maW5kUm93KHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUgJiYgdmFsdWUgIT09IDApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgb3V0ID0gZmFsc2U7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuc2V0dGluZ3Mucm91bmRpbmdGdW5jdGlvbih2YWx1ZSwgdGhpcy5zZXR0aW5ncyk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmxpc3QpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxpc3QuZmluZChcImxpXCIpLmVhY2goZnVuY3Rpb24gKGksIG9iaikge1xuICAgICAgICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChvYmouZGF0YXNldC50aW1lKTtcblxuICAgICAgICAgIGlmIChpc05hTihwYXJzZWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHBhcnNlZCA9PSB2YWx1ZSkge1xuICAgICAgICAgICAgb3V0ID0gb2JqO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIl9oaWRlS2V5Ym9hcmRcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBfaGlkZUtleWJvYXJkKCkge1xuICAgICAgICByZXR1cm4gKHdpbmRvdy5uYXZpZ2F0b3IubXNNYXhUb3VjaFBvaW50cyB8fCBcIm9udG91Y2hzdGFydFwiIGluIGRvY3VtZW50KSAmJiB0aGlzLnNldHRpbmdzLmRpc2FibGVUb3VjaEtleWJvYXJkO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJfc2V0VGltZVZhbHVlXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gX3NldFRpbWVWYWx1ZSh2YWx1ZSwgc291cmNlKSB7XG4gICAgICAgIGlmICh0aGlzLnRhcmdldEVsLm5vZGVOYW1lID09PSBcIklOUFVUXCIpIHtcbiAgICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgfHwgdGhpcy50YXJnZXRFbC52YWx1ZSAhPSBcIlwiKSB7XG4gICAgICAgICAgICB0aGlzLnRhcmdldEVsLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHRwID0gdGhpcztcbiAgICAgICAgICB2YXIgc2V0dGluZ3MgPSB0cC5zZXR0aW5ncztcblxuICAgICAgICAgIGlmIChzZXR0aW5ncy51c2VTZWxlY3QgJiYgc291cmNlICE9IFwic2VsZWN0XCIgJiYgdHAubGlzdCkge1xuICAgICAgICAgICAgdHAubGlzdC52YWwodHAuX3JvdW5kQW5kRm9ybWF0VGltZSh0cC5hbnl0aW1lMmludCh2YWx1ZSkpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2VsZWN0VGltZUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdzZWxlY3RUaW1lJywgRVZFTlRfREVGQVVMVFMpO1xuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkVmFsdWUgIT0gdmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICB2YXIgY2hhbmdlVGltZUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdjaGFuZ2VUaW1lJywgRVZFTlRfREVGQVVMVFMpO1xuICAgICAgICAgIHZhciBjaGFuZ2VFdmVudCA9IG5ldyBDdXN0b21FdmVudCgnY2hhbmdlJywgT2JqZWN0LmFzc2lnbihFVkVOVF9ERUZBVUxUUywge1xuICAgICAgICAgICAgZGV0YWlsOiAndGltZXBpY2tlcidcbiAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICBpZiAoc291cmNlID09IFwic2VsZWN0XCIpIHtcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0RWwuZGlzcGF0Y2hFdmVudChzZWxlY3RUaW1lRXZlbnQpO1xuICAgICAgICAgICAgdGhpcy50YXJnZXRFbC5kaXNwYXRjaEV2ZW50KGNoYW5nZVRpbWVFdmVudCk7XG4gICAgICAgICAgICB0aGlzLnRhcmdldEVsLmRpc3BhdGNoRXZlbnQoY2hhbmdlRXZlbnQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoW1wiZXJyb3JcIiwgXCJpbml0aWFsXCJdLmluZGV4T2Yoc291cmNlKSA9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy50YXJnZXRFbC5kaXNwYXRjaEV2ZW50KGNoYW5nZVRpbWVFdmVudCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKFtcImVycm9yXCIsIFwiaW5pdGlhbFwiXS5pbmRleE9mKHNvdXJjZSkgPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0RWwuZGlzcGF0Y2hFdmVudChzZWxlY3RUaW1lRXZlbnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJfZ2V0VGltZVZhbHVlXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gX2dldFRpbWVWYWx1ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMudGFyZ2V0RWwubm9kZU5hbWUgPT09IFwiSU5QVVRcIikge1xuICAgICAgICAgIHJldHVybiB0aGlzLnRhcmdldEVsLnZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHVzZSB0aGUgZWxlbWVudCdzIGRhdGEgYXR0cmlidXRlcyB0byBzdG9yZSB2YWx1ZXNcbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIl9zZWxlY3RWYWx1ZVwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9zZWxlY3RWYWx1ZSgpIHtcbiAgICAgICAgdmFyIHRwID0gdGhpcztcbiAgICAgICAgdHAuc2V0dGluZ3M7XG4gICAgICAgIHZhciBsaXN0ID0gdHAubGlzdDtcbiAgICAgICAgdmFyIGN1cnNvciA9IGxpc3QuZmluZChcIi51aS10aW1lcGlja2VyLXNlbGVjdGVkXCIpO1xuXG4gICAgICAgIGlmIChjdXJzb3IuaGFzQ2xhc3MoXCJ1aS10aW1lcGlja2VyLWRpc2FibGVkXCIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjdXJzb3IubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdGltZVZhbHVlID0gY3Vyc29yLmdldCgwKS5kYXRhc2V0LnRpbWU7IC8vIHNlbGVjdGVkIHZhbHVlIGZvdW5kXG5cbiAgICAgICAgaWYgKHRpbWVWYWx1ZSkge1xuICAgICAgICAgIHZhciBwYXJzZWRUaW1lVmFsdWUgPSBwYXJzZUludCh0aW1lVmFsdWUpO1xuXG4gICAgICAgICAgaWYgKCFpc05hTihwYXJzZWRUaW1lVmFsdWUpKSB7XG4gICAgICAgICAgICB0aW1lVmFsdWUgPSBwYXJzZWRUaW1lVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpbWVWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgdGltZVZhbHVlICE9IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRpbWVWYWx1ZSA9IHRwLl9pbnQydGltZSh0aW1lVmFsdWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRwLl9zZXRUaW1lVmFsdWUodGltZVZhbHVlLCBcInNlbGVjdFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJhbnl0aW1lMmludFwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGFueXRpbWUyaW50KGlucHV0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy50aW1lMmludChpbnB1dCk7XG4gICAgICAgIH0gZWxzZSBpZiAoX3R5cGVvZihpbnB1dCkgPT09ICdvYmplY3QnICYmIGlucHV0IGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgIHJldHVybiBpbnB1dC5nZXRIb3VycygpICogMzYwMCArIGlucHV0LmdldE1pbnV0ZXMoKSAqIDYwICsgaW5wdXQuZ2V0U2Vjb25kcygpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGlucHV0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwidGltZTJpbnRcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiB0aW1lMmludCh0aW1lU3RyaW5nKSB7XG4gICAgICAgIGlmICh0aW1lU3RyaW5nID09PSBcIlwiIHx8IHRpbWVTdHJpbmcgPT09IG51bGwgfHwgdGltZVN0cmluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGltZVN0cmluZyA9PT0gJ25vdycpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5hbnl0aW1lMmludChuZXcgRGF0ZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdGltZVN0cmluZyAhPSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIHRpbWVTdHJpbmc7XG4gICAgICAgIH1cblxuICAgICAgICB0aW1lU3RyaW5nID0gdGltZVN0cmluZy50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1tcXHNcXC5dL2csIFwiXCIpOyAvLyBpZiB0aGUgbGFzdCBjaGFyYWN0ZXIgaXMgYW4gXCJhXCIgb3IgXCJwXCIsIGFkZCB0aGUgXCJtXCJcblxuICAgICAgICBpZiAodGltZVN0cmluZy5zbGljZSgtMSkgPT0gXCJhXCIgfHwgdGltZVN0cmluZy5zbGljZSgtMSkgPT0gXCJwXCIpIHtcbiAgICAgICAgICB0aW1lU3RyaW5nICs9IFwibVwiO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHBhdHRlcm4gPSAvXigoW14wLTldKikpPyhbMC05XT9bMC05XSkoKFswLTVdWzAtOV0pKT8oKFswLTVdWzAtOV0pKT8oKFteMC05XSopKSQvO1xuICAgICAgICB2YXIgaGFzRGVsaW1ldGVyc01hdGNoID0gdGltZVN0cmluZy5tYXRjaCgvXFxXLyk7XG5cbiAgICAgICAgaWYgKGhhc0RlbGltZXRlcnNNYXRjaCkge1xuICAgICAgICAgIHBhdHRlcm4gPSAvXigoW14wLTldKikpPyhbMC05XT9bMC05XSkoXFxXKyhbMC01XVswLTldPykpPyhcXFcrKFswLTVdWzAtOV0pKT8oKFteMC05XSopKSQvO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRpbWUgPSB0aW1lU3RyaW5nLm1hdGNoKHBhdHRlcm4pO1xuXG4gICAgICAgIGlmICghdGltZSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGhvdXIgPSBwYXJzZUludCh0aW1lWzNdICogMSwgMTApO1xuICAgICAgICB2YXIgYW1wbSA9IHRpbWVbMl0gfHwgdGltZVs5XTtcbiAgICAgICAgdmFyIG1pbnV0ZXMgPSB0aGlzLnBhcnNlTWludXRlU3RyaW5nKHRpbWVbNV0pO1xuICAgICAgICB2YXIgc2Vjb25kcyA9IHRpbWVbN10gKiAxIHx8IDA7XG5cbiAgICAgICAgaWYgKCFhbXBtICYmIHRpbWVbM10ubGVuZ3RoID09IDIgJiYgdGltZVszXVswXSA9PSBcIjBcIikge1xuICAgICAgICAgIC8vIHByZWNlZGluZyAnMCcgaW1wbGllcyBBTVxuICAgICAgICAgIGFtcG0gPSBcImFtXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaG91ciA+IDI0ICYmICFtaW51dGVzKSB7XG4gICAgICAgICAgLy8gaWYgc29tZW9uZSB0eXBlcyBpbiBzb21ldGhpbmcgbGlrZSBcIjgzXCIsIHR1cm4gaXQgaW50byBcIjhoIDMwbVwiXG4gICAgICAgICAgaG91ciA9IHRpbWVbM11bMF0gKiAxO1xuICAgICAgICAgIG1pbnV0ZXMgPSB0aGlzLnBhcnNlTWludXRlU3RyaW5nKHRpbWVbM11bMV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGhvdXJzID0gaG91cjtcblxuICAgICAgICBpZiAoaG91ciA8PSAxMiAmJiBhbXBtKSB7XG4gICAgICAgICAgYW1wbSA9IGFtcG0udHJpbSgpO1xuICAgICAgICAgIHZhciBpc1BtID0gYW1wbSA9PSB0aGlzLnNldHRpbmdzLmxhbmcucG0gfHwgYW1wbSA9PSB0aGlzLnNldHRpbmdzLmxhbmcuUE07XG5cbiAgICAgICAgICBpZiAoaG91ciA9PSAxMikge1xuICAgICAgICAgICAgaG91cnMgPSBpc1BtID8gMTIgOiAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBob3VycyA9IGhvdXIgKyAoaXNQbSA/IDEyIDogMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciB0ID0gaG91ciAqIDM2MDAgKyBtaW51dGVzICogNjAgKyBzZWNvbmRzO1xuXG4gICAgICAgICAgaWYgKHQgPj0gT05FX0RBWSArICh0aGlzLnNldHRpbmdzLnNob3cyNDAwID8gMSA6IDApKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy53cmFwSG91cnMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBob3VycyA9IGhvdXIgJSAyNDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdGltZUludCA9IGhvdXJzICogMzYwMCArIG1pbnV0ZXMgKiA2MCArIHNlY29uZHM7IC8vIGlmIG5vIGFtL3BtIHByb3ZpZGVkLCBpbnRlbGxpZ2VudGx5IGd1ZXNzIGJhc2VkIG9uIHRoZSBzY3JvbGxEZWZhdWx0XG5cbiAgICAgICAgaWYgKGhvdXIgPCAxMiAmJiAhYW1wbSAmJiB0aGlzLnNldHRpbmdzLl90d2VsdmVIb3VyVGltZSAmJiB0aGlzLnNldHRpbmdzLnNjcm9sbERlZmF1bHQoKSkge1xuICAgICAgICAgIHZhciBkZWx0YSA9IHRpbWVJbnQgLSB0aGlzLnNldHRpbmdzLnNjcm9sbERlZmF1bHQoKTtcblxuICAgICAgICAgIGlmIChkZWx0YSA8IDAgJiYgZGVsdGEgPj0gT05FX0RBWSAvIC0yKSB7XG4gICAgICAgICAgICB0aW1lSW50ID0gKHRpbWVJbnQgKyBPTkVfREFZIC8gMikgJSBPTkVfREFZO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aW1lSW50O1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJwYXJzZU1pbnV0ZVN0cmluZ1wiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlTWludXRlU3RyaW5nKG1pbnV0ZXNTdHJpbmcpIHtcbiAgICAgICAgaWYgKCFtaW51dGVzU3RyaW5nKSB7XG4gICAgICAgICAgbWludXRlc1N0cmluZyA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbXVsdGlwbGllciA9IDE7XG5cbiAgICAgICAgaWYgKG1pbnV0ZXNTdHJpbmcubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICBtdWx0aXBsaWVyID0gMTA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFyc2VJbnQobWludXRlc1N0cmluZykgKiBtdWx0aXBsaWVyIHx8IDA7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImludFN0cmluZ0RhdGVPckZ1bmMyZnVuY1wiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGludFN0cmluZ0RhdGVPckZ1bmMyZnVuYyhpbnB1dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5hbnl0aW1lMmludChpbnB1dCgpKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuYW55dGltZTJpbnQoaW5wdXQpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwicGFyc2VTZXR0aW5nc1wiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlU2V0dGluZ3Moc2V0dGluZ3MpIHtcbiAgICAgICAgc2V0dGluZ3MubGFuZyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBERUZBVUxUX0xBTkcpLCBzZXR0aW5ncy5sYW5nKTsgLy8gbGFuZyBpcyB1c2VkIGJ5IG90aGVyIGZ1bmN0aW9ucyB0aGUgcmVzdCBvZiB0aGlzIGRlcGVuZHMgb25cbiAgICAgICAgLy8gdG9kbzogdW53aW5kIGNpcmN1bGFyIGRlcGVuZGVuY3kgb24gbGFuZ1xuXG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcblxuICAgICAgICBpZiAoc2V0dGluZ3MubGlzdFdpZHRoKSB7XG4gICAgICAgICAgc2V0dGluZ3MubGlzdFdpZHRoID0gdGhpcy5hbnl0aW1lMmludChzZXR0aW5ncy5saXN0V2lkdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0dGluZ3MubWluVGltZSA9IHRoaXMuaW50U3RyaW5nRGF0ZU9yRnVuYzJmdW5jKHNldHRpbmdzLm1pblRpbWUpO1xuICAgICAgICBzZXR0aW5ncy5tYXhUaW1lID0gdGhpcy5pbnRTdHJpbmdEYXRlT3JGdW5jMmZ1bmMoc2V0dGluZ3MubWF4VGltZSk7XG4gICAgICAgIHNldHRpbmdzLmR1cmF0aW9uVGltZSA9IHRoaXMuaW50U3RyaW5nRGF0ZU9yRnVuYzJmdW5jKHNldHRpbmdzLmR1cmF0aW9uVGltZSk7XG5cbiAgICAgICAgaWYgKHNldHRpbmdzLnNjcm9sbERlZmF1bHQpIHtcbiAgICAgICAgICBzZXR0aW5ncy5zY3JvbGxEZWZhdWx0ID0gdGhpcy5pbnRTdHJpbmdEYXRlT3JGdW5jMmZ1bmMoc2V0dGluZ3Muc2Nyb2xsRGVmYXVsdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0dGluZ3Muc2Nyb2xsRGVmYXVsdCA9IHNldHRpbmdzLm1pblRpbWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHNldHRpbmdzLnRpbWVGb3JtYXQgPT09IFwic3RyaW5nXCIgJiYgc2V0dGluZ3MudGltZUZvcm1hdC5tYXRjaCgvW2doXS8pKSB7XG4gICAgICAgICAgc2V0dGluZ3MuX3R3ZWx2ZUhvdXJUaW1lID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZXR0aW5ncy5zaG93T25Gb2N1cyA9PT0gZmFsc2UgJiYgc2V0dGluZ3Muc2hvd09uLmluZGV4T2YoXCJmb2N1c1wiKSAhPSAtMSkge1xuICAgICAgICAgIHNldHRpbmdzLnNob3dPbi5zcGxpY2Uoc2V0dGluZ3Muc2hvd09uLmluZGV4T2YoXCJmb2N1c1wiKSwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHNldHRpbmdzLnN0ZXAgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhciBjdXJyeVN0ZXAgPSBzZXR0aW5ncy5zdGVwO1xuXG4gICAgICAgICAgc2V0dGluZ3Muc3RlcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBjdXJyeVN0ZXA7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldHRpbmdzLmRpc2FibGVUaW1lUmFuZ2VzID0gdGhpcy5fcGFyc2VEaXNhYmxlVGltZVJhbmdlcyhzZXR0aW5ncy5kaXNhYmxlVGltZVJhbmdlcyk7XG4gICAgICAgIHJldHVybiBzZXR0aW5ncztcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiX3BhcnNlRGlzYWJsZVRpbWVSYW5nZXNcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBfcGFyc2VEaXNhYmxlVGltZVJhbmdlcyhkaXNhYmxlVGltZVJhbmdlcykge1xuICAgICAgICBpZiAoIWRpc2FibGVUaW1lUmFuZ2VzIHx8IGRpc2FibGVUaW1lUmFuZ2VzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9IC8vIGNvbnZlcnQgc3RyaW5nIHRpbWVzIHRvIGludGVnZXJzXG5cblxuICAgICAgICBmb3IgKHZhciBpIGluIGRpc2FibGVUaW1lUmFuZ2VzKSB7XG4gICAgICAgICAgZGlzYWJsZVRpbWVSYW5nZXNbaV0gPSBbdGhpcy5hbnl0aW1lMmludChkaXNhYmxlVGltZVJhbmdlc1tpXVswXSksIHRoaXMuYW55dGltZTJpbnQoZGlzYWJsZVRpbWVSYW5nZXNbaV1bMV0pXTtcbiAgICAgICAgfSAvLyBzb3J0IGJ5IHN0YXJ0aW5nIHRpbWVcblxuXG4gICAgICAgIGRpc2FibGVUaW1lUmFuZ2VzID0gZGlzYWJsZVRpbWVSYW5nZXMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgIHJldHVybiBhWzBdIC0gYlswXTtcbiAgICAgICAgfSk7IC8vIG1lcmdlIGFueSBvdmVybGFwcGluZyByYW5nZXNcblxuICAgICAgICBmb3IgKHZhciBpID0gZGlzYWJsZVRpbWVSYW5nZXMubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICAgIGlmIChkaXNhYmxlVGltZVJhbmdlc1tpXVswXSA8PSBkaXNhYmxlVGltZVJhbmdlc1tpIC0gMV1bMV0pIHtcbiAgICAgICAgICAgIGRpc2FibGVUaW1lUmFuZ2VzW2kgLSAxXSA9IFtNYXRoLm1pbihkaXNhYmxlVGltZVJhbmdlc1tpXVswXSwgZGlzYWJsZVRpbWVSYW5nZXNbaSAtIDFdWzBdKSwgTWF0aC5tYXgoZGlzYWJsZVRpbWVSYW5nZXNbaV1bMV0sIGRpc2FibGVUaW1lUmFuZ2VzW2kgLSAxXVsxXSldO1xuICAgICAgICAgICAgZGlzYWJsZVRpbWVSYW5nZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkaXNhYmxlVGltZVJhbmdlcztcbiAgICAgIH1cbiAgICAgIC8qXG4gICAgICAgKiAgRmlsdGVyIGZyZWVmb3JtIGlucHV0XG4gICAgICAgKi9cblxuICAgIH0sIHtcbiAgICAgIGtleTogXCJfZGlzYWJsZVRleHRJbnB1dEhhbmRsZXJcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBfZGlzYWJsZVRleHRJbnB1dEhhbmRsZXIoZSkge1xuICAgICAgICBzd2l0Y2ggKGUua2V5Q29kZSkge1xuICAgICAgICAgIGNhc2UgMTM6IC8vIHJldHVyblxuXG4gICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgLy90YWJcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiX2ludDJkdXJhdGlvblwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9pbnQyZHVyYXRpb24oc2Vjb25kcywgc3RlcCkge1xuICAgICAgICBzZWNvbmRzID0gTWF0aC5hYnMoc2Vjb25kcyk7XG4gICAgICAgIHZhciBtaW51dGVzID0gTWF0aC5yb3VuZChzZWNvbmRzIC8gNjApLFxuICAgICAgICAgICAgZHVyYXRpb24gPSBbXSxcbiAgICAgICAgICAgIGhvdXJzLFxuICAgICAgICAgICAgbWlucztcblxuICAgICAgICBpZiAobWludXRlcyA8IDYwKSB7XG4gICAgICAgICAgLy8gT25seSBzaG93ICh4IG1pbnMpIHVuZGVyIDEgaG91clxuICAgICAgICAgIGR1cmF0aW9uID0gW21pbnV0ZXMsIHRoaXMuc2V0dGluZ3MubGFuZy5taW5zXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBob3VycyA9IE1hdGguZmxvb3IobWludXRlcyAvIDYwKTtcbiAgICAgICAgICBtaW5zID0gbWludXRlcyAlIDYwOyAvLyBTaG93IGRlY2ltYWwgbm90YXRpb24gKGVnOiAxLjUgaHJzKSBmb3IgMzAgbWludXRlIHN0ZXBzXG5cbiAgICAgICAgICBpZiAoc3RlcCA9PSAzMCAmJiBtaW5zID09IDMwKSB7XG4gICAgICAgICAgICBob3VycyArPSB0aGlzLnNldHRpbmdzLmxhbmcuZGVjaW1hbCArIDU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZHVyYXRpb24ucHVzaChob3Vycyk7XG4gICAgICAgICAgZHVyYXRpb24ucHVzaChob3VycyA9PSAxID8gdGhpcy5zZXR0aW5ncy5sYW5nLmhyIDogdGhpcy5zZXR0aW5ncy5sYW5nLmhycyk7IC8vIFNob3cgcmVtYWluZGVyIG1pbnV0ZXMgbm90YXRpb24gKGVnOiAxIGhyIDE1IG1pbnMpIGZvciBub24tMzAgbWludXRlIHN0ZXBzXG4gICAgICAgICAgLy8gYW5kIG9ubHkgaWYgdGhlcmUgYXJlIHJlbWFpbmRlciBtaW51dGVzIHRvIHNob3dcblxuICAgICAgICAgIGlmIChzdGVwICE9IDMwICYmIG1pbnMpIHtcbiAgICAgICAgICAgIGR1cmF0aW9uLnB1c2gobWlucyk7XG4gICAgICAgICAgICBkdXJhdGlvbi5wdXNoKHRoaXMuc2V0dGluZ3MubGFuZy5taW5zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZHVyYXRpb24uam9pbihcIiBcIik7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIl9yb3VuZEFuZEZvcm1hdFRpbWVcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBfcm91bmRBbmRGb3JtYXRUaW1lKHNlY29uZHMpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ19yb3VuZEFuZEZvcm1hdFRpbWUnKVxuICAgICAgICBzZWNvbmRzID0gdGhpcy5zZXR0aW5ncy5yb3VuZGluZ0Z1bmN0aW9uKHNlY29uZHMsIHRoaXMuc2V0dGluZ3MpO1xuXG4gICAgICAgIGlmIChzZWNvbmRzICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2ludDJ0aW1lKHNlY29uZHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIl9pbnQydGltZVwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9pbnQydGltZSh0aW1lSW50KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGltZUludCAhPSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2Vjb25kcyA9IHBhcnNlSW50KHRpbWVJbnQgJSA2MCksXG4gICAgICAgICAgICBtaW51dGVzID0gcGFyc2VJbnQodGltZUludCAvIDYwICUgNjApLFxuICAgICAgICAgICAgaG91cnMgPSBwYXJzZUludCh0aW1lSW50IC8gKDYwICogNjApICUgMjQpO1xuICAgICAgICB2YXIgdGltZSA9IG5ldyBEYXRlKDE5NzAsIDAsIDIsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCAwKTtcblxuICAgICAgICBpZiAoaXNOYU4odGltZS5nZXRUaW1lKCkpKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2V0dGluZ3MudGltZUZvcm1hdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MudGltZUZvcm1hdCh0aW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvdXRwdXQgPSBcIlwiO1xuICAgICAgICB2YXIgaG91ciwgY29kZTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2V0dGluZ3MudGltZUZvcm1hdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvZGUgPSB0aGlzLnNldHRpbmdzLnRpbWVGb3JtYXQuY2hhckF0KGkpO1xuXG4gICAgICAgICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICAgICAgICBjYXNlIFwiYVwiOlxuICAgICAgICAgICAgICBvdXRwdXQgKz0gdGltZS5nZXRIb3VycygpID4gMTEgPyB0aGlzLnNldHRpbmdzLmxhbmcucG0gOiB0aGlzLnNldHRpbmdzLmxhbmcuYW07XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFwiQVwiOlxuICAgICAgICAgICAgICBvdXRwdXQgKz0gdGltZS5nZXRIb3VycygpID4gMTEgPyB0aGlzLnNldHRpbmdzLmxhbmcuUE0gOiB0aGlzLnNldHRpbmdzLmxhbmcuQU07XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFwiZ1wiOlxuICAgICAgICAgICAgICBob3VyID0gdGltZS5nZXRIb3VycygpICUgMTI7XG4gICAgICAgICAgICAgIG91dHB1dCArPSBob3VyID09PSAwID8gXCIxMlwiIDogaG91cjtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgXCJHXCI6XG4gICAgICAgICAgICAgIGhvdXIgPSB0aW1lLmdldEhvdXJzKCk7XG4gICAgICAgICAgICAgIGlmICh0aW1lSW50ID09PSBPTkVfREFZKSBob3VyID0gdGhpcy5zZXR0aW5ncy5zaG93MjQwMCA/IDI0IDogMDtcbiAgICAgICAgICAgICAgb3V0cHV0ICs9IGhvdXI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFwiaFwiOlxuICAgICAgICAgICAgICBob3VyID0gdGltZS5nZXRIb3VycygpICUgMTI7XG5cbiAgICAgICAgICAgICAgaWYgKGhvdXIgIT09IDAgJiYgaG91ciA8IDEwKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IFwiMFwiICsgaG91cjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIG91dHB1dCArPSBob3VyID09PSAwID8gXCIxMlwiIDogaG91cjtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgXCJIXCI6XG4gICAgICAgICAgICAgIGhvdXIgPSB0aW1lLmdldEhvdXJzKCk7XG4gICAgICAgICAgICAgIGlmICh0aW1lSW50ID09PSBPTkVfREFZKSBob3VyID0gdGhpcy5zZXR0aW5ncy5zaG93MjQwMCA/IDI0IDogMDtcbiAgICAgICAgICAgICAgb3V0cHV0ICs9IGhvdXIgPiA5ID8gaG91ciA6IFwiMFwiICsgaG91cjtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgXCJpXCI6XG4gICAgICAgICAgICAgIHZhciBtaW51dGVzID0gdGltZS5nZXRNaW51dGVzKCk7XG4gICAgICAgICAgICAgIG91dHB1dCArPSBtaW51dGVzID4gOSA/IG1pbnV0ZXMgOiBcIjBcIiArIG1pbnV0ZXM7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFwic1wiOlxuICAgICAgICAgICAgICBzZWNvbmRzID0gdGltZS5nZXRTZWNvbmRzKCk7XG4gICAgICAgICAgICAgIG91dHB1dCArPSBzZWNvbmRzID4gOSA/IHNlY29uZHMgOiBcIjBcIiArIHNlY29uZHM7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFwiXFxcXFwiOlxuICAgICAgICAgICAgICAvLyBlc2NhcGUgY2hhcmFjdGVyOyBhZGQgdGhlIG5leHQgY2hhcmFjdGVyIGFuZCBza2lwIGFoZWFkXG4gICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgb3V0cHV0ICs9IHRoaXMuc2V0dGluZ3MudGltZUZvcm1hdC5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBvdXRwdXQgKz0gY29kZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJfc2V0U2VsZWN0ZWRcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBfc2V0U2VsZWN0ZWQoKSB7XG4gICAgICAgIHZhciBsaXN0ID0gdGhpcy5saXN0O1xuICAgICAgICBsaXN0LmZpbmQoXCJsaVwiKS5yZW1vdmVDbGFzcyhcInVpLXRpbWVwaWNrZXItc2VsZWN0ZWRcIik7XG4gICAgICAgIHZhciB0aW1lVmFsdWUgPSB0aGlzLmFueXRpbWUyaW50KHRoaXMuX2dldFRpbWVWYWx1ZSgpKTtcblxuICAgICAgICBpZiAodGltZVZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNlbGVjdGVkID0gdGhpcy5fZmluZFJvdyh0aW1lVmFsdWUpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICAgIHZhciBzZWxlY3RlZFJlY3QgPSBzZWxlY3RlZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICB2YXIgbGlzdFJlY3QgPSBsaXN0LmdldCgwKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICB2YXIgdG9wRGVsdGEgPSBzZWxlY3RlZFJlY3QudG9wIC0gbGlzdFJlY3QudG9wO1xuXG4gICAgICAgICAgaWYgKHRvcERlbHRhICsgc2VsZWN0ZWRSZWN0LmhlaWdodCA+IGxpc3RSZWN0LmhlaWdodCB8fCB0b3BEZWx0YSA8IDApIHtcbiAgICAgICAgICAgIHZhciBuZXdTY3JvbGwgPSBsaXN0LnNjcm9sbFRvcCgpICsgKHNlbGVjdGVkUmVjdC50b3AgLSBsaXN0UmVjdC50b3ApIC0gc2VsZWN0ZWRSZWN0LmhlaWdodDtcbiAgICAgICAgICAgIGxpc3Quc2Nyb2xsVG9wKG5ld1Njcm9sbCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHBhcnNlZCA9IHBhcnNlSW50KHNlbGVjdGVkLmRhdGFzZXQudGltZSk7XG5cbiAgICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5mb3JjZVJvdW5kVGltZSB8fCBwYXJzZWQgPT09IHRpbWVWYWx1ZSkge1xuICAgICAgICAgICAgc2VsZWN0ZWQuY2xhc3NMaXN0LmFkZCgndWktdGltZXBpY2tlci1zZWxlY3RlZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJfaXNGb2N1c2VkXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gX2lzRm9jdXNlZChlbCkge1xuICAgICAgICByZXR1cm4gZWwgPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIl9oYW5kbGVGb3JtYXRWYWx1ZVwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9oYW5kbGVGb3JtYXRWYWx1ZShlKSB7XG4gICAgICAgIGlmIChlICYmIGUuZGV0YWlsID09IFwidGltZXBpY2tlclwiKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZm9ybWF0VmFsdWUoZSk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIl9mb3JtYXRWYWx1ZVwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9mb3JtYXRWYWx1ZShlLCBvcmlnaW4pIHtcbiAgICAgICAgaWYgKHRoaXMudGFyZ2V0RWwudmFsdWUgPT09IFwiXCIpIHtcbiAgICAgICAgICB0aGlzLl9zZXRUaW1lVmFsdWUobnVsbCwgb3JpZ2luKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBJRSBmaXJlcyBjaGFuZ2UgZXZlbnQgYmVmb3JlIGJsdXJcblxuXG4gICAgICAgIGlmICh0aGlzLl9pc0ZvY3VzZWQodGhpcy50YXJnZXRFbCkgJiYgKCFlIHx8IGUudHlwZSAhPSBcImNoYW5nZVwiKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3M7XG4gICAgICAgIHZhciBzZWNvbmRzID0gdGhpcy5hbnl0aW1lMmludCh0aGlzLnRhcmdldEVsLnZhbHVlKTtcblxuICAgICAgICBpZiAoc2Vjb25kcyA9PT0gbnVsbCkge1xuICAgICAgICAgIHZhciB0aW1lRm9ybWF0RXJyb3JFdmVudCA9IG5ldyBDdXN0b21FdmVudCgndGltZUZvcm1hdEVycm9yJywgRVZFTlRfREVGQVVMVFMpO1xuICAgICAgICAgIHRoaXMudGFyZ2V0RWwuZGlzcGF0Y2hFdmVudCh0aW1lRm9ybWF0RXJyb3JFdmVudCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJhbmdlRXJyb3IgPSBmYWxzZTsgLy8gY2hlY2sgdGhhdCB0aGUgdGltZSBpbiB3aXRoaW4gYm91bmRzXG5cbiAgICAgICAgaWYgKHNldHRpbmdzLm1pblRpbWUgIT09IG51bGwgJiYgc2V0dGluZ3MubWF4VGltZSAhPT0gbnVsbCAmJiAoc2Vjb25kcyA8IHNldHRpbmdzLm1pblRpbWUoKSB8fCBzZWNvbmRzID4gc2V0dGluZ3MubWF4VGltZSgpKSkge1xuICAgICAgICAgIHJhbmdlRXJyb3IgPSB0cnVlO1xuICAgICAgICB9IC8vIGNoZWNrIHRoYXQgdGltZSBpc24ndCB3aXRoaW4gZGlzYWJsZWQgdGltZSByYW5nZXNcblxuXG4gICAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihzZXR0aW5ncy5kaXNhYmxlVGltZVJhbmdlcyksXG4gICAgICAgICAgICBfc3RlcDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICB2YXIgcmFuZ2UgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICAgICAgaWYgKHNlY29uZHMgPj0gcmFuZ2VbMF0gJiYgc2Vjb25kcyA8IHJhbmdlWzFdKSB7XG4gICAgICAgICAgICAgIHJhbmdlRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZXR0aW5ncy5mb3JjZVJvdW5kVGltZSkge1xuICAgICAgICAgIHZhciByb3VuZFNlY29uZHMgPSBzZXR0aW5ncy5yb3VuZGluZ0Z1bmN0aW9uKHNlY29uZHMsIHNldHRpbmdzKTtcblxuICAgICAgICAgIGlmIChyb3VuZFNlY29uZHMgIT0gc2Vjb25kcykge1xuICAgICAgICAgICAgc2Vjb25kcyA9IHJvdW5kU2Vjb25kcztcbiAgICAgICAgICAgIG9yaWdpbiA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHByZXR0eVRpbWUgPSB0aGlzLl9pbnQydGltZShzZWNvbmRzKTtcblxuICAgICAgICBpZiAocmFuZ2VFcnJvcikge1xuICAgICAgICAgIHRoaXMuX3NldFRpbWVWYWx1ZShwcmV0dHlUaW1lKTtcblxuICAgICAgICAgIHZhciB0aW1lUmFuZ2VFcnJvckV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCd0aW1lUmFuZ2VFcnJvcicsIEVWRU5UX0RFRkFVTFRTKTtcbiAgICAgICAgICB0aGlzLnRhcmdldEVsLmRpc3BhdGNoRXZlbnQodGltZVJhbmdlRXJyb3JFdmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fc2V0VGltZVZhbHVlKHByZXR0eVRpbWUsIG9yaWdpbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiX2dlbmVyYXRlTm9uZUVsZW1lbnRcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2VuZXJhdGVOb25lRWxlbWVudChvcHRpb25WYWx1ZSwgdXNlU2VsZWN0KSB7XG4gICAgICAgIHZhciBsYWJlbCwgY2xhc3NOYW1lLCB2YWx1ZTtcblxuICAgICAgICBpZiAoX3R5cGVvZihvcHRpb25WYWx1ZSkgPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIGxhYmVsID0gb3B0aW9uVmFsdWUubGFiZWw7XG4gICAgICAgICAgY2xhc3NOYW1lID0gb3B0aW9uVmFsdWUuY2xhc3NOYW1lO1xuICAgICAgICAgIHZhbHVlID0gb3B0aW9uVmFsdWUudmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvblZhbHVlID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBsYWJlbCA9IG9wdGlvblZhbHVlO1xuICAgICAgICAgIHZhbHVlID0gXCJcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkLmVycm9yKFwiSW52YWxpZCBub25lT3B0aW9uIHZhbHVlXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGVsO1xuXG4gICAgICAgIGlmICh1c2VTZWxlY3QpIHtcbiAgICAgICAgICBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7XG4gICAgICAgICAgZWwudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsaVwiKTtcbiAgICAgICAgICBlbC5kYXRhc2V0LnRpbWUgPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWwuaW5uZXJUZXh0ID0gbGFiZWw7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICAgICAgcmV0dXJuIGVsO1xuICAgICAgfVxuICAgICAgLypcbiAgICAgICAqICBUaW1lIHR5cGVhaGVhZFxuICAgICAgICovXG5cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiX2hhbmRsZUtleVVwXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gX2hhbmRsZUtleVVwKGUpIHtcbiAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgICAgaWYgKCF0aGlzLmxpc3QgfHwgIVRpbWVwaWNrZXIuaXNWaXNpYmxlKHRoaXMubGlzdCkgfHwgdGhpcy5zZXR0aW5ncy5kaXNhYmxlVGV4dElucHV0KSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZS50eXBlID09PSBcInBhc3RlXCIgfHwgZS50eXBlID09PSBcImN1dFwiKSB7XG4gICAgICAgICAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiBoYW5kbGVyKCkge1xuICAgICAgICAgICAgaWYgKF90aGlzMi5zZXR0aW5ncy50eXBlYWhlYWRIaWdobGlnaHQpIHtcbiAgICAgICAgICAgICAgX3RoaXMyLl9zZXRTZWxlY3RlZCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgX3RoaXMyLmxpc3QuaGlkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBzZXRUaW1lb3V0KGhhbmRsZXIsIDApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoZS5rZXlDb2RlKSB7XG4gICAgICAgICAgY2FzZSA5NjogLy8gbnVtcGFkIG51bWVyYWxzXG5cbiAgICAgICAgICBjYXNlIDk3OlxuICAgICAgICAgIGNhc2UgOTg6XG4gICAgICAgICAgY2FzZSA5OTpcbiAgICAgICAgICBjYXNlIDEwMDpcbiAgICAgICAgICBjYXNlIDEwMTpcbiAgICAgICAgICBjYXNlIDEwMjpcbiAgICAgICAgICBjYXNlIDEwMzpcbiAgICAgICAgICBjYXNlIDEwNDpcbiAgICAgICAgICBjYXNlIDEwNTpcbiAgICAgICAgICBjYXNlIDQ4OiAvLyBudW1lcmFsc1xuXG4gICAgICAgICAgY2FzZSA0OTpcbiAgICAgICAgICBjYXNlIDUwOlxuICAgICAgICAgIGNhc2UgNTE6XG4gICAgICAgICAgY2FzZSA1MjpcbiAgICAgICAgICBjYXNlIDUzOlxuICAgICAgICAgIGNhc2UgNTQ6XG4gICAgICAgICAgY2FzZSA1NTpcbiAgICAgICAgICBjYXNlIDU2OlxuICAgICAgICAgIGNhc2UgNTc6XG4gICAgICAgICAgY2FzZSA2NTogLy8gYVxuXG4gICAgICAgICAgY2FzZSA3NzogLy8gbVxuXG4gICAgICAgICAgY2FzZSA4MDogLy8gcFxuXG4gICAgICAgICAgY2FzZSAxODY6IC8vIGNvbG9uXG5cbiAgICAgICAgICBjYXNlIDg6IC8vIGJhY2tzcGFjZVxuXG4gICAgICAgICAgY2FzZSA0NjpcbiAgICAgICAgICAgIC8vIGRlbGV0ZVxuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MudHlwZWFoZWFkSGlnaGxpZ2h0KSB7XG4gICAgICAgICAgICAgIHRoaXMuX3NldFNlbGVjdGVkKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmxpc3QuaGlkZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1dLCBbe1xuICAgICAga2V5OiBcImV4dHJhY3RBdHRyT3B0aW9uc1wiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGV4dHJhY3RBdHRyT3B0aW9ucyhlbGVtZW50LCBrZXlzKSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSB7fTtcblxuICAgICAgICB2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGtleXMpLFxuICAgICAgICAgICAgX3N0ZXAyO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yIChfaXRlcmF0b3IyLnMoKTsgIShfc3RlcDIgPSBfaXRlcmF0b3IyLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBfc3RlcDIudmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChrZXkgaW4gZWxlbWVudC5kYXRhc2V0KSB7XG4gICAgICAgICAgICAgIG91dHB1dFtrZXldID0gZWxlbWVudC5kYXRhc2V0W2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBfaXRlcmF0b3IyLmYoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImlzVmlzaWJsZVwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGlzVmlzaWJsZShlbGVtKSB7XG4gICAgICAgIHZhciBlbCA9IGVsZW1bMF07XG4gICAgICAgIHJldHVybiBlbC5vZmZzZXRXaWR0aCA+IDAgJiYgZWwub2Zmc2V0SGVpZ2h0ID4gMDtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiaGlkZUFsbFwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGhpZGVBbGwoKSB7XG4gICAgICAgIHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndWktdGltZXBpY2tlci1pbnB1dCcpKSxcbiAgICAgICAgICAgIF9zdGVwMztcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoX2l0ZXJhdG9yMy5zKCk7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMy5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICB2YXIgZWwgPSBfc3RlcDMudmFsdWU7XG4gICAgICAgICAgICB2YXIgdHAgPSBlbC50aW1lcGlja2VyT2JqO1xuXG4gICAgICAgICAgICBpZiAodHApIHtcbiAgICAgICAgICAgICAgdHAuaGlkZU1lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBfaXRlcmF0b3IzLmUoZXJyKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBfaXRlcmF0b3IzLmYoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBUaW1lcGlja2VyO1xuICB9KCk7IC8vIElFOS0xMSBwb2x5ZmlsbCBmb3IgQ3VzdG9tRXZlbnRcblxuXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gICAgZnVuY3Rpb24gQ3VzdG9tRXZlbnQoZXZlbnQsIHBhcmFtcykge1xuICAgICAgaWYgKCFwYXJhbXMpIHtcbiAgICAgICAgcGFyYW1zID0ge307XG4gICAgICB9XG5cbiAgICAgIHBhcmFtcyA9IE9iamVjdC5hc3NpZ24oRVZFTlRfREVGQVVMVFMsIHBhcmFtcyk7XG4gICAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7XG4gICAgICBldnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50LCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUsIHBhcmFtcy5kZXRhaWwpO1xuICAgICAgcmV0dXJuIGV2dDtcbiAgICB9XG5cbiAgICB3aW5kb3cuQ3VzdG9tRXZlbnQgPSBDdXN0b21FdmVudDtcbiAgfSkoKTtcblxuICBmdW5jdGlvbiBfZ2V0Tm9uZU9wdGlvbkl0ZW1zKHNldHRpbmdzKSB7XG4gICAgaWYgKCFzZXR0aW5ncy5ub25lT3B0aW9uKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgdmFyIG5vbmVPcHRpb25zID0gX2dldE5vbmVPcHRpb25JdGVtc0hlbHBlcihzZXR0aW5ncy5ub25lT3B0aW9uKTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNldHRpbmdzLm5vbmVPcHRpb24pKSB7XG4gICAgICByZXR1cm4gbm9uZU9wdGlvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbbm9uZU9wdGlvbnNdO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIF9nZXROb25lT3B0aW9uSXRlbXNIZWxwZXIobm9uZU9wdGlvbikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG5vbmVPcHRpb24pKSB7XG4gICAgICByZXR1cm4gbm9uZU9wdGlvbi5tYXAoX2dldE5vbmVPcHRpb25JdGVtc0hlbHBlcik7XG4gICAgfVxuXG4gICAgaWYgKG5vbmVPcHRpb24gPT09IHRydWUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdsYWJlbCc6ICdOb25lJyxcbiAgICAgICAgJ3ZhbHVlJzogJydcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKF90eXBlb2Yobm9uZU9wdGlvbikgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gbm9uZU9wdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgJ2xhYmVsJzogbm9uZU9wdGlvbixcbiAgICAgICd2YWx1ZSc6ICcnXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9nZXREcm9wZG93blRpbWVzKHRwKSB7XG4gICAgdmFyIF9zZXR0aW5ncyRtaW5UaW1lLCBfc2V0dGluZ3MkbWF4VGltZTtcblxuICAgIHZhciBzZXR0aW5ncyA9IHRwLnNldHRpbmdzO1xuICAgIHZhciBzdGFydCA9IChfc2V0dGluZ3MkbWluVGltZSA9IHNldHRpbmdzLm1pblRpbWUoKSkgIT09IG51bGwgJiYgX3NldHRpbmdzJG1pblRpbWUgIT09IHZvaWQgMCA/IF9zZXR0aW5ncyRtaW5UaW1lIDogMDtcbiAgICB2YXIgZW5kID0gKF9zZXR0aW5ncyRtYXhUaW1lID0gc2V0dGluZ3MubWF4VGltZSgpKSAhPT0gbnVsbCAmJiBfc2V0dGluZ3MkbWF4VGltZSAhPT0gdm9pZCAwID8gX3NldHRpbmdzJG1heFRpbWUgOiBzdGFydCArIE9ORV9EQVkgLSAxO1xuXG4gICAgaWYgKGVuZCA8IHN0YXJ0KSB7XG4gICAgICAvLyBtYWtlIHN1cmUgdGhlIGVuZCB0aW1lIGlzIGdyZWF0ZXIgdGhhbiBzdGFydCB0aW1lLCBvdGhlcndpc2UgdGhlcmUgd2lsbCBiZSBubyBsaXN0IHRvIHNob3dcbiAgICAgIGVuZCArPSBPTkVfREFZO1xuICAgIH1cblxuICAgIGlmIChlbmQgPT09IE9ORV9EQVkgLSAxICYmIHR5cGVvZiBzZXR0aW5ncy50aW1lRm9ybWF0ID09PSAnc3RyaW5nJyAmJiBzZXR0aW5ncy5zaG93MjQwMCkge1xuICAgICAgLy8gc2hvdyBhIDI0OjAwIG9wdGlvbiB3aGVuIHVzaW5nIG1pbGl0YXJ5IHRpbWVcbiAgICAgIGVuZCA9IE9ORV9EQVk7XG4gICAgfVxuXG4gICAgdmFyIG91dHB1dCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0LCBqID0gMDsgaSA8PSBlbmQ7IGorKywgaSArPSBzZXR0aW5ncy5zdGVwKGopICogNjApIHtcbiAgICAgIHZhciB0aW1lSW50ID0gaTtcblxuICAgICAgdmFyIHRpbWVTdHJpbmcgPSB0cC5faW50MnRpbWUodGltZUludCk7XG5cbiAgICAgIHZhciBjbGFzc05hbWUgPSB0aW1lSW50ICUgT05FX0RBWSA8IE9ORV9EQVkgLyAyID8gJ3VpLXRpbWVwaWNrZXItYW0nIDogJ3VpLXRpbWVwaWNrZXItcG0nO1xuICAgICAgdmFyIGl0ZW0gPSB7XG4gICAgICAgICdsYWJlbCc6IHRpbWVTdHJpbmcsXG4gICAgICAgICd2YWx1ZSc6IG1vZHVsb1NlY29uZHModGltZUludCwgc2V0dGluZ3MpLFxuICAgICAgICAnY2xhc3NOYW1lJzogY2xhc3NOYW1lXG4gICAgICB9O1xuXG4gICAgICBpZiAoKHNldHRpbmdzLm1pblRpbWUoKSAhPT0gbnVsbCB8fCBzZXR0aW5ncy5kdXJhdGlvblRpbWUoKSAhPT0gbnVsbCkgJiYgc2V0dGluZ3Muc2hvd0R1cmF0aW9uKSB7XG4gICAgICAgIHZhciBfc2V0dGluZ3MkZHVyYXRpb25UaW07XG5cbiAgICAgICAgdmFyIGR1clN0YXJ0ID0gKF9zZXR0aW5ncyRkdXJhdGlvblRpbSA9IHNldHRpbmdzLmR1cmF0aW9uVGltZSgpKSAhPT0gbnVsbCAmJiBfc2V0dGluZ3MkZHVyYXRpb25UaW0gIT09IHZvaWQgMCA/IF9zZXR0aW5ncyRkdXJhdGlvblRpbSA6IHNldHRpbmdzLm1pblRpbWUoKTtcblxuICAgICAgICB2YXIgZHVyYXRpb25TdHJpbmcgPSB0cC5faW50MmR1cmF0aW9uKGkgLSBkdXJTdGFydCwgc2V0dGluZ3Muc3RlcCgpKTtcblxuICAgICAgICBpdGVtLmR1cmF0aW9uID0gZHVyYXRpb25TdHJpbmc7XG4gICAgICB9XG5cbiAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihzZXR0aW5ncy5kaXNhYmxlVGltZVJhbmdlcyksXG4gICAgICAgICAgX3N0ZXA7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIHJhbmdlID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgICBpZiAodGltZUludCAlIE9ORV9EQVkgPj0gcmFuZ2VbMF0gJiYgdGltZUludCAlIE9ORV9EQVkgPCByYW5nZVsxXSkge1xuICAgICAgICAgICAgaXRlbS5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICAgIH1cblxuICAgICAgb3V0cHV0LnB1c2goaXRlbSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9yZW5kZXJTZWxlY3RJdGVtKGl0ZW0pIHtcbiAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICBlbC52YWx1ZSA9IGl0ZW0ubGFiZWw7XG5cbiAgICBpZiAoaXRlbS5kdXJhdGlvbikge1xuICAgICAgZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoaXRlbS5sYWJlbCArICcgKCcgKyBpdGVtLmR1cmF0aW9uICsgJyknKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGl0ZW0ubGFiZWwpKTtcbiAgICB9XG5cbiAgICBpZiAoaXRlbS5kaXNhYmxlZCkge1xuICAgICAgZWwuZGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBlbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9yZW5kZXJTdGFuZGFyZEl0ZW0oaXRlbSkge1xuICAgIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG4gICAgZWwuZGF0YXNldFsndGltZSddID0gaXRlbS52YWx1ZTtcblxuICAgIGlmIChpdGVtLmNsYXNzTmFtZSkge1xuICAgICAgZWwuY2xhc3NMaXN0LmFkZChpdGVtLmNsYXNzTmFtZSk7XG4gICAgfVxuXG4gICAgZWwuY2xhc3NOYW1lID0gaXRlbS5jbGFzc05hbWU7XG4gICAgZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoaXRlbS5sYWJlbCkpO1xuXG4gICAgaWYgKGl0ZW0uZHVyYXRpb24pIHtcbiAgICAgIHZhciBkdXJhdGlvbkVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgZHVyYXRpb25FbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnKCcgKyBpdGVtLmR1cmF0aW9uICsgJyknKSk7XG4gICAgICBkdXJhdGlvbkVsLmNsYXNzTGlzdC5hZGQoJ3VpLXRpbWVwaWNrZXItZHVyYXRpb24nKTtcbiAgICAgIGVsLmFwcGVuZENoaWxkKGR1cmF0aW9uRWwpO1xuICAgIH1cblxuICAgIGlmIChpdGVtLmRpc2FibGVkKSB7XG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCd1aS10aW1lcGlja2VyLWRpc2FibGVkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsO1xuICB9XG5cbiAgZnVuY3Rpb24gX3JlbmRlclN0YW5kYXJkTGlzdChpdGVtcykge1xuICAgIHZhciBsaXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKTtcbiAgICBsaXN0LmNsYXNzTGlzdC5hZGQoJ3VpLXRpbWVwaWNrZXItbGlzdCcpO1xuXG4gICAgdmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihpdGVtcyksXG4gICAgICAgIF9zdGVwMjtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKF9pdGVyYXRvcjIucygpOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lOykge1xuICAgICAgICB2YXIgaXRlbSA9IF9zdGVwMi52YWx1ZTtcblxuICAgICAgICB2YXIgaXRlbUVsID0gX3JlbmRlclN0YW5kYXJkSXRlbShpdGVtKTtcblxuICAgICAgICBsaXN0LmFwcGVuZENoaWxkKGl0ZW1FbCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfaXRlcmF0b3IyLmUoZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgX2l0ZXJhdG9yMi5mKCk7XG4gICAgfVxuXG4gICAgdmFyIHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB3cmFwcGVyLmNsYXNzTGlzdC5hZGQoJ3VpLXRpbWVwaWNrZXItd3JhcHBlcicpO1xuICAgIHdyYXBwZXIudGFiSW5kZXggPSAtMTtcbiAgICB3cmFwcGVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgd3JhcHBlci5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgd3JhcHBlci5hcHBlbmRDaGlsZChsaXN0KTtcbiAgICByZXR1cm4gd3JhcHBlcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9yZW5kZXJTZWxlY3RMaXN0KGl0ZW1zLCB0YXJnZXROYW1lKSB7XG4gICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VsZWN0Jyk7XG4gICAgZWwuY2xhc3NMaXN0LmFkZCgndWktdGltZXBpY2tlci1zZWxlY3QnKTtcblxuICAgIGlmICh0YXJnZXROYW1lKSB7XG4gICAgICBlbC5uYW1lID0gJ3VpLXRpbWVwaWNrZXItJyArIHRhcmdldE5hbWU7XG4gICAgfVxuXG4gICAgdmFyIF9pdGVyYXRvcjMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihpdGVtcyksXG4gICAgICAgIF9zdGVwMztcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKF9pdGVyYXRvcjMucygpOyAhKF9zdGVwMyA9IF9pdGVyYXRvcjMubigpKS5kb25lOykge1xuICAgICAgICB2YXIgaXRlbSA9IF9zdGVwMy52YWx1ZTtcblxuICAgICAgICB2YXIgaXRlbUVsID0gX3JlbmRlclNlbGVjdEl0ZW0oaXRlbSk7XG5cbiAgICAgICAgZWwuYXBwZW5kQ2hpbGQoaXRlbUVsKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIF9pdGVyYXRvcjMuZShlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBfaXRlcmF0b3IzLmYoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWw7XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJIdG1sKHRwKSB7XG4gICAgdmFyIGl0ZW1zID0gW10uY29uY2F0KF9nZXROb25lT3B0aW9uSXRlbXModHAuc2V0dGluZ3MpLCBfZ2V0RHJvcGRvd25UaW1lcyh0cCkpO1xuICAgIHZhciBlbDtcblxuICAgIGlmICh0cC5zZXR0aW5ncy51c2VTZWxlY3QpIHtcbiAgICAgIGVsID0gX3JlbmRlclNlbGVjdExpc3QoaXRlbXMsIHRwLnRhcmdldEVsLm5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbCA9IF9yZW5kZXJTdGFuZGFyZExpc3QoaXRlbXMpO1xuICAgIH1cblxuICAgIGlmICh0cC5zZXR0aW5ncy5jbGFzc05hbWUpIHtcbiAgICAgIHZhciBfaXRlcmF0b3I0ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodHAuc2V0dGluZ3MuY2xhc3NOYW1lLnNwbGl0KCcgJykpLFxuICAgICAgICAgIF9zdGVwNDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3I0LnMoKTsgIShfc3RlcDQgPSBfaXRlcmF0b3I0Lm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgdG9rZW4gPSBfc3RlcDQudmFsdWU7XG4gICAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3I0LmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjQuZigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0cC5zZXR0aW5ncy5zaG93RHVyYXRpb24gJiYgKHRwLnNldHRpbmdzLm1pblRpbWUgIT09IG51bGwgfHwgdHAuc2V0dGluZ3MuZHVyYXRpb25UaW1lICE9PSBudWxsKSkge1xuICAgICAgZWwuY2xhc3NMaXN0LmFkZChcInVpLXRpbWVwaWNrZXItd2l0aC1kdXJhdGlvblwiKTtcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoXCJ1aS10aW1lcGlja2VyLXN0ZXAtXCIgKyB0cC5zZXR0aW5ncy5zdGVwKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBlbDtcbiAgfVxuXG4gIChmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGlmICgodHlwZW9mIGV4cG9ydHMgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihleHBvcnRzKSkgPT09IFwib2JqZWN0XCIgJiYgZXhwb3J0cyAmJiAodHlwZW9mIG1vZHVsZSA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKG1vZHVsZSkpID09PSBcIm9iamVjdFwiICYmIG1vZHVsZSAmJiBtb2R1bGUuZXhwb3J0cyA9PT0gZXhwb3J0cykge1xuICAgICAgLy8gQnJvd3NlcmlmeS4gQXR0YWNoIHRvIGpRdWVyeSBtb2R1bGUuXG4gICAgICBmYWN0b3J5KHJlcXVpcmUoXCJqcXVlcnlcIikpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcbiAgICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cbiAgICAgIGRlZmluZShbXCJqcXVlcnlcIl0sIGZhY3RvcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCcm93c2VyIGdsb2JhbHNcbiAgICAgIGZhY3RvcnkoalF1ZXJ5KTtcbiAgICB9XG4gIH0pKGZ1bmN0aW9uICgkKSB7XG4gICAgdmFyIG1ldGhvZHMgPSB7XG4gICAgICBpbml0OiBmdW5jdGlvbiBpbml0KG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIHNlbGYgPSAkKHRoaXMpO1xuICAgICAgICAgIHZhciB0cCA9IG5ldyBUaW1lcGlja2VyKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICAgIHZhciBzZXR0aW5ncyA9IHRwLnNldHRpbmdzO1xuICAgICAgICAgIHNldHRpbmdzLmxhbmc7XG4gICAgICAgICAgdGhpcy50aW1lcGlja2VyT2JqID0gdHA7XG4gICAgICAgICAgc2VsZi5hZGRDbGFzcyhcInVpLXRpbWVwaWNrZXItaW5wdXRcIik7XG5cbiAgICAgICAgICBpZiAoc2V0dGluZ3MudXNlU2VsZWN0KSB7XG4gICAgICAgICAgICBfcmVuZGVyKHNlbGYpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxmLnByb3AoXCJhdXRvY29tcGxldGVcIiwgXCJvZmZcIik7XG5cbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5zaG93T24pIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzZXR0aW5ncy5zaG93T24pIHtcbiAgICAgICAgICAgICAgICBzZWxmLm9uKHNldHRpbmdzLnNob3dPbltpXSArIFwiLnRpbWVwaWNrZXJcIiwgbWV0aG9kcy5zaG93KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZWxmLm9uKFwiY2hhbmdlLnRpbWVwaWNrZXJcIiwgdHAuX2hhbmRsZUZvcm1hdFZhbHVlKTtcbiAgICAgICAgICAgIHNlbGYub24oXCJrZXlkb3duLnRpbWVwaWNrZXJcIiwgX2tleWRvd25oYW5kbGVyKTtcbiAgICAgICAgICAgIHNlbGYub24oXCJrZXl1cC50aW1lcGlja2VyXCIsIHRwLl9oYW5kbGVLZXlVcCk7XG5cbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5kaXNhYmxlVGV4dElucHV0KSB7XG4gICAgICAgICAgICAgIHNlbGYub24oXCJrZXlkb3duLnRpbWVwaWNrZXJcIiwgdHAuX2Rpc2FibGVUZXh0SW5wdXRIYW5kbGVyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2VsZi5vbihcImN1dC50aW1lcGlja2VyXCIsIHRwLl9oYW5kbGVLZXlVcCk7XG4gICAgICAgICAgICBzZWxmLm9uKFwicGFzdGUudGltZXBpY2tlclwiLCB0cC5faGFuZGxlS2V5VXApO1xuXG4gICAgICAgICAgICB0cC5fZm9ybWF0VmFsdWUobnVsbCwgXCJpbml0aWFsXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgc2hvdzogZnVuY3Rpb24gc2hvdyhlKSB7XG4gICAgICAgIHZhciBzZWxmID0gJCh0aGlzKTtcbiAgICAgICAgdmFyIHRwID0gc2VsZlswXS50aW1lcGlja2VyT2JqO1xuICAgICAgICB2YXIgc2V0dGluZ3MgPSB0cC5zZXR0aW5ncztcblxuICAgICAgICBpZiAoZSkge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZXR0aW5ncy51c2VTZWxlY3QpIHtcbiAgICAgICAgICB0cC5saXN0LnRyaWdnZXIoJ2ZvY3VzJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRwLl9oaWRlS2V5Ym9hcmQoKSkge1xuICAgICAgICAgIC8vIGJsb2NrIHRoZSBrZXlib2FyZCBvbiBtb2JpbGUgZGV2aWNlc1xuICAgICAgICAgIHNlbGYudHJpZ2dlcignYmx1cicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGxpc3QgPSB0cC5saXN0OyAvLyBjaGVjayBpZiBpbnB1dCBpcyByZWFkb25seVxuXG4gICAgICAgIGlmIChzZWxmLnByb3AoXCJyZWFkb25seVwiKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBjaGVjayBpZiBsaXN0IG5lZWRzIHRvIGJlIHJlbmRlcmVkXG5cblxuICAgICAgICBfcmVuZGVyKHNlbGYpO1xuXG4gICAgICAgIGxpc3QgPSB0cC5saXN0O1xuXG4gICAgICAgIGlmIChUaW1lcGlja2VyLmlzVmlzaWJsZShsaXN0KSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxmLmlzKCdpbnB1dCcpKSB7XG4gICAgICAgICAgdHAuc2VsZWN0ZWRWYWx1ZSA9IHNlbGYudmFsKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0cC5fc2V0U2VsZWN0ZWQoKTsgLy8gbWFrZSBzdXJlIG90aGVyIHBpY2tlcnMgYXJlIGhpZGRlblxuXG5cbiAgICAgICAgVGltZXBpY2tlci5oaWRlQWxsKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBzZXR0aW5ncy5saXN0V2lkdGggPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIGxpc3Qud2lkdGgoc2VsZi5vdXRlcldpZHRoKCkgKiBzZXR0aW5ncy5saXN0V2lkdGgpO1xuICAgICAgICB9IC8vIHBvc2l0aW9uIHRoZSBkcm9wZG93biByZWxhdGl2ZSB0byB0aGUgaW5wdXRcblxuXG4gICAgICAgIGxpc3Quc2hvdygpO1xuICAgICAgICB2YXIgbGlzdE9mZnNldCA9IHt9O1xuXG4gICAgICAgIGlmIChzZXR0aW5ncy5vcmllbnRhdGlvbi5tYXRjaCgvci8pKSB7XG4gICAgICAgICAgLy8gcmlnaHQtYWxpZ24gdGhlIGRyb3Bkb3duXG4gICAgICAgICAgbGlzdE9mZnNldC5sZWZ0ID0gc2VsZi5vZmZzZXQoKS5sZWZ0ICsgc2VsZi5vdXRlcldpZHRoKCkgLSBsaXN0Lm91dGVyV2lkdGgoKSArIHBhcnNlSW50KGxpc3QuY3NzKFwibWFyZ2luTGVmdFwiKS5yZXBsYWNlKFwicHhcIiwgXCJcIiksIDEwKTtcbiAgICAgICAgfSBlbHNlIGlmIChzZXR0aW5ncy5vcmllbnRhdGlvbi5tYXRjaCgvbC8pKSB7XG4gICAgICAgICAgLy8gbGVmdC1hbGlnbiB0aGUgZHJvcGRvd25cbiAgICAgICAgICBsaXN0T2Zmc2V0LmxlZnQgPSBzZWxmLm9mZnNldCgpLmxlZnQgKyBwYXJzZUludChsaXN0LmNzcyhcIm1hcmdpbkxlZnRcIikucmVwbGFjZShcInB4XCIsIFwiXCIpLCAxMCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2V0dGluZ3Mub3JpZW50YXRpb24ubWF0Y2goL2MvKSkge1xuICAgICAgICAgIC8vIGNlbnRlci1hbGlnbiB0aGUgZHJvcGRvd25cbiAgICAgICAgICBsaXN0T2Zmc2V0LmxlZnQgPSBzZWxmLm9mZnNldCgpLmxlZnQgKyAoc2VsZi5vdXRlcldpZHRoKCkgLSBsaXN0Lm91dGVyV2lkdGgoKSkgLyAyICsgcGFyc2VJbnQobGlzdC5jc3MoXCJtYXJnaW5MZWZ0XCIpLnJlcGxhY2UoXCJweFwiLCBcIlwiKSwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHZlcnRpY2FsT3JpZW50YXRpb247XG5cbiAgICAgICAgaWYgKHNldHRpbmdzLm9yaWVudGF0aW9uLm1hdGNoKC90LykpIHtcbiAgICAgICAgICB2ZXJ0aWNhbE9yaWVudGF0aW9uID0gXCJ0XCI7XG4gICAgICAgIH0gZWxzZSBpZiAoc2V0dGluZ3Mub3JpZW50YXRpb24ubWF0Y2goL2IvKSkge1xuICAgICAgICAgIHZlcnRpY2FsT3JpZW50YXRpb24gPSBcImJcIjtcbiAgICAgICAgfSBlbHNlIGlmIChzZWxmLm9mZnNldCgpLnRvcCArIHNlbGYub3V0ZXJIZWlnaHQodHJ1ZSkgKyBsaXN0Lm91dGVySGVpZ2h0KCkgPiAkKHdpbmRvdykuaGVpZ2h0KCkgKyAkKHdpbmRvdykuc2Nyb2xsVG9wKCkpIHtcbiAgICAgICAgICB2ZXJ0aWNhbE9yaWVudGF0aW9uID0gXCJ0XCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmVydGljYWxPcmllbnRhdGlvbiA9IFwiYlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZlcnRpY2FsT3JpZW50YXRpb24gPT0gXCJ0XCIpIHtcbiAgICAgICAgICAvLyBwb3NpdGlvbiB0aGUgZHJvcGRvd24gb24gdG9wXG4gICAgICAgICAgbGlzdC5hZGRDbGFzcyhcInVpLXRpbWVwaWNrZXItcG9zaXRpb25lZC10b3BcIik7XG4gICAgICAgICAgbGlzdE9mZnNldC50b3AgPSBzZWxmLm9mZnNldCgpLnRvcCAtIGxpc3Qub3V0ZXJIZWlnaHQoKSArIHBhcnNlSW50KGxpc3QuY3NzKFwibWFyZ2luVG9wXCIpLnJlcGxhY2UoXCJweFwiLCBcIlwiKSwgMTApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHB1dCBpdCB1bmRlciB0aGUgaW5wdXRcbiAgICAgICAgICBsaXN0LnJlbW92ZUNsYXNzKFwidWktdGltZXBpY2tlci1wb3NpdGlvbmVkLXRvcFwiKTtcbiAgICAgICAgICBsaXN0T2Zmc2V0LnRvcCA9IHNlbGYub2Zmc2V0KCkudG9wICsgc2VsZi5vdXRlckhlaWdodCgpICsgcGFyc2VJbnQobGlzdC5jc3MoXCJtYXJnaW5Ub3BcIikucmVwbGFjZShcInB4XCIsIFwiXCIpLCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICBsaXN0Lm9mZnNldChsaXN0T2Zmc2V0KTsgLy8gcG9zaXRpb24gc2Nyb2xsaW5nXG5cbiAgICAgICAgdmFyIHNlbGVjdGVkID0gbGlzdC5maW5kKFwiLnVpLXRpbWVwaWNrZXItc2VsZWN0ZWRcIik7XG5cbiAgICAgICAgaWYgKCFzZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgICAgICB2YXIgdGltZUludCA9IHRwLmFueXRpbWUyaW50KHRwLl9nZXRUaW1lVmFsdWUoKSk7XG5cbiAgICAgICAgICBpZiAodGltZUludCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2VsZWN0ZWQgPSAkKHRwLl9maW5kUm93KHRpbWVJbnQpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNldHRpbmdzLnNjcm9sbERlZmF1bHQoKSkge1xuICAgICAgICAgICAgc2VsZWN0ZWQgPSAkKHRwLl9maW5kUm93KHNldHRpbmdzLnNjcm9sbERlZmF1bHQoKSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBpZiBub3QgZm91bmQgb3IgZGlzYWJsZWQsIGludGVsbGlnZW50bHkgZmluZCBmaXJzdCBzZWxlY3RhYmxlIGVsZW1lbnRcblxuXG4gICAgICAgIGlmICghc2VsZWN0ZWQubGVuZ3RoIHx8IHNlbGVjdGVkLmhhc0NsYXNzKFwidWktdGltZXBpY2tlci1kaXNhYmxlZFwiKSkge1xuICAgICAgICAgIHNlbGVjdGVkID0gbGlzdC5maW5kKFwibGk6bm90KC51aS10aW1lcGlja2VyLWRpc2FibGVkKTpmaXJzdFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxlY3RlZCAmJiBzZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgICAgICB2YXIgdG9wT2Zmc2V0ID0gbGlzdC5zY3JvbGxUb3AoKSArIHNlbGVjdGVkLnBvc2l0aW9uKCkudG9wIC0gc2VsZWN0ZWQub3V0ZXJIZWlnaHQoKTtcbiAgICAgICAgICBsaXN0LnNjcm9sbFRvcCh0b3BPZmZzZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxpc3Quc2Nyb2xsVG9wKDApO1xuICAgICAgICB9IC8vIHByZXZlbnQgc2Nyb2xsIHByb3BhZ2F0aW9uXG5cblxuICAgICAgICBpZiAoc2V0dGluZ3Muc3RvcFNjcm9sbFByb3BhZ2F0aW9uKSB7XG4gICAgICAgICAgJChkb2N1bWVudCkub24oXCJ3aGVlbC51aS10aW1lcGlja2VyXCIsIFwiLnVpLXRpbWVwaWNrZXItd3JhcHBlclwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRTY3JvbGwgPSAkKHRoaXMpLnNjcm9sbFRvcCgpO1xuICAgICAgICAgICAgJCh0aGlzKS5zY3JvbGxUb3AoY3VycmVudFNjcm9sbCArIGUub3JpZ2luYWxFdmVudC5kZWx0YVkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IC8vIGF0dGFjaCBjbG9zZSBoYW5kbGVyc1xuXG5cbiAgICAgICAgJChkb2N1bWVudCkub24oXCJtb3VzZWRvd24udWktdGltZXBpY2tlclwiLCBfY2xvc2VIYW5kbGVyKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIF9jbG9zZUhhbmRsZXIpO1xuXG4gICAgICAgIGlmIChzZXR0aW5ncy5jbG9zZU9uV2luZG93U2Nyb2xsKSB7XG4gICAgICAgICAgJChkb2N1bWVudCkub24oXCJzY3JvbGwudWktdGltZXBpY2tlclwiLCBfY2xvc2VIYW5kbGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYudHJpZ2dlcihcInNob3dUaW1lcGlja2VyXCIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgICBoaWRlOiBmdW5jdGlvbiBoaWRlKGUpIHtcbiAgICAgICAgdmFyIHRwID0gdGhpc1swXS50aW1lcGlja2VyT2JqO1xuXG4gICAgICAgIGlmICh0cCkge1xuICAgICAgICAgIHRwLmhpZGVNZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgVGltZXBpY2tlci5oaWRlQWxsKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICAgIG9wdGlvbjogZnVuY3Rpb24gb3B0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgdmFsdWUgPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIHZhciB0cCA9IHRoaXNbMF0udGltZXBpY2tlck9iajtcbiAgICAgICAgICByZXR1cm4gdHAuc2V0dGluZ3Nba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBzZWxmID0gJCh0aGlzKTtcbiAgICAgICAgICB2YXIgdHAgPSBzZWxmWzBdLnRpbWVwaWNrZXJPYmo7XG4gICAgICAgICAgdmFyIHNldHRpbmdzID0gdHAuc2V0dGluZ3M7XG4gICAgICAgICAgdmFyIGxpc3QgPSB0cC5saXN0O1xuXG4gICAgICAgICAgaWYgKF90eXBlb2Yoa2V5KSA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBzZXR0aW5ncyA9ICQuZXh0ZW5kKHNldHRpbmdzLCBrZXkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGtleSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBzZXR0aW5nc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2V0dGluZ3MgPSB0cC5wYXJzZVNldHRpbmdzKHNldHRpbmdzKTtcbiAgICAgICAgICB0cC5zZXR0aW5ncyA9IHNldHRpbmdzO1xuXG4gICAgICAgICAgdHAuX2Zvcm1hdFZhbHVlKHtcbiAgICAgICAgICAgIHR5cGU6IFwiY2hhbmdlXCJcbiAgICAgICAgICB9LCBcImluaXRpYWxcIik7XG5cbiAgICAgICAgICBpZiAobGlzdCkge1xuICAgICAgICAgICAgbGlzdC5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRwLmxpc3QgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzZXR0aW5ncy51c2VTZWxlY3QpIHtcbiAgICAgICAgICAgIF9yZW5kZXIoc2VsZik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBnZXRTZWNvbmRzRnJvbU1pZG5pZ2h0OiBmdW5jdGlvbiBnZXRTZWNvbmRzRnJvbU1pZG5pZ2h0KCkge1xuICAgICAgICB2YXIgdHAgPSB0aGlzWzBdLnRpbWVwaWNrZXJPYmo7XG4gICAgICAgIHJldHVybiB0cC5hbnl0aW1lMmludCh0cC5fZ2V0VGltZVZhbHVlKCkpO1xuICAgICAgfSxcbiAgICAgIGdldFRpbWU6IGZ1bmN0aW9uIGdldFRpbWUocmVsYXRpdmVfZGF0ZSkge1xuICAgICAgICB2YXIgdHAgPSB0aGlzWzBdLnRpbWVwaWNrZXJPYmo7XG5cbiAgICAgICAgdmFyIHRpbWVfc3RyaW5nID0gdHAuX2dldFRpbWVWYWx1ZSgpO1xuXG4gICAgICAgIGlmICghdGltZV9zdHJpbmcpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvZmZzZXQgPSB0cC5hbnl0aW1lMmludCh0aW1lX3N0cmluZyk7XG5cbiAgICAgICAgaWYgKG9mZnNldCA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZWxhdGl2ZV9kYXRlKSB7XG4gICAgICAgICAgcmVsYXRpdmVfZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIH0gLy8gY29uc3RydWN0IGEgRGF0ZSBmcm9tIHJlbGF0aXZlIGRhdGUsIGFuZCBvZmZzZXQncyB0aW1lXG5cblxuICAgICAgICB2YXIgdGltZSA9IG5ldyBEYXRlKHJlbGF0aXZlX2RhdGUpO1xuICAgICAgICB0aW1lLnNldEhvdXJzKG9mZnNldCAvIDM2MDApO1xuICAgICAgICB0aW1lLnNldE1pbnV0ZXMob2Zmc2V0ICUgMzYwMCAvIDYwKTtcbiAgICAgICAgdGltZS5zZXRTZWNvbmRzKG9mZnNldCAlIDYwKTtcbiAgICAgICAgdGltZS5zZXRNaWxsaXNlY29uZHMoMCk7XG4gICAgICAgIHJldHVybiB0aW1lO1xuICAgICAgfSxcbiAgICAgIGlzVmlzaWJsZTogZnVuY3Rpb24gaXNWaXNpYmxlKCkge1xuICAgICAgICB2YXIgdHAgPSB0aGlzWzBdLnRpbWVwaWNrZXJPYmo7XG4gICAgICAgIHJldHVybiAhISh0cCAmJiB0cC5saXN0ICYmIFRpbWVwaWNrZXIuaXNWaXNpYmxlKHRwLmxpc3QpKTtcbiAgICAgIH0sXG4gICAgICBzZXRUaW1lOiBmdW5jdGlvbiBzZXRUaW1lKHZhbHVlKSB7XG4gICAgICAgIHZhciB0cCA9IHRoaXNbMF0udGltZXBpY2tlck9iajtcbiAgICAgICAgdmFyIHNldHRpbmdzID0gdHAuc2V0dGluZ3M7XG5cbiAgICAgICAgaWYgKHNldHRpbmdzLmZvcmNlUm91bmRUaW1lKSB7XG4gICAgICAgICAgdmFyIHByZXR0eVRpbWUgPSB0cC5fcm91bmRBbmRGb3JtYXRUaW1lKHRwLmFueXRpbWUyaW50KHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHByZXR0eVRpbWUgPSB0cC5faW50MnRpbWUodHAuYW55dGltZTJpbnQodmFsdWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSAmJiBwcmV0dHlUaW1lID09PSBudWxsICYmIHNldHRpbmdzLm5vbmVPcHRpb24pIHtcbiAgICAgICAgICBwcmV0dHlUaW1lID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB0cC5fc2V0VGltZVZhbHVlKHByZXR0eVRpbWUsIFwiaW5pdGlhbFwiKTtcblxuICAgICAgICB0cC5fZm9ybWF0VmFsdWUoe1xuICAgICAgICAgIHR5cGU6IFwiY2hhbmdlXCJcbiAgICAgICAgfSwgXCJpbml0aWFsXCIpO1xuXG4gICAgICAgIGlmICh0cCAmJiB0cC5saXN0KSB7XG4gICAgICAgICAgdHAuX3NldFNlbGVjdGVkKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOyAvLyBjaGVjayBpZiB0aGlzIGVsZW1lbnQgaXMgYSB0aW1lcGlja2VyXG5cbiAgICAgICAgaWYgKCFzZWxmLmhhc0NsYXNzKFwidWktdGltZXBpY2tlci1pbnB1dFwiKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0cCA9IHNlbGZbMF0udGltZXBpY2tlck9iajtcbiAgICAgICAgdmFyIHNldHRpbmdzID0gdHAuc2V0dGluZ3M7XG4gICAgICAgIHNlbGYucmVtb3ZlQXR0cihcImF1dG9jb21wbGV0ZVwiLCBcIm9mZlwiKTtcbiAgICAgICAgc2VsZi5yZW1vdmVDbGFzcyhcInVpLXRpbWVwaWNrZXItaW5wdXRcIik7XG4gICAgICAgIHNlbGYucmVtb3ZlRGF0YShcInRpbWVwaWNrZXItb2JqXCIpO1xuICAgICAgICBzZWxmLm9mZihcIi50aW1lcGlja2VyXCIpOyAvLyB0aW1lcGlja2VyLWxpc3Qgd29uJ3QgYmUgcHJlc2VudCB1bmxlc3MgdGhlIHVzZXIgaGFzIGludGVyYWN0ZWQgd2l0aCB0aGlzIHRpbWVwaWNrZXJcblxuICAgICAgICBpZiAodHAubGlzdCkge1xuICAgICAgICAgIHRwLmxpc3QucmVtb3ZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2V0dGluZ3MudXNlU2VsZWN0KSB7XG4gICAgICAgICAgc2VsZi5zaG93KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0cC5saXN0ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfTsgLy8gcHJpdmF0ZSBtZXRob2RzXG5cbiAgICBmdW5jdGlvbiBfcmVuZGVyKHNlbGYpIHtcbiAgICAgIHZhciB0cCA9IHNlbGZbMF0udGltZXBpY2tlck9iajtcbiAgICAgIHZhciBsaXN0ID0gdHAubGlzdDtcbiAgICAgIHZhciBzZXR0aW5ncyA9IHRwLnNldHRpbmdzO1xuXG4gICAgICBpZiAobGlzdCAmJiBsaXN0Lmxlbmd0aCkge1xuICAgICAgICBsaXN0LnJlbW92ZSgpO1xuICAgICAgICB0cC5saXN0ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHdyYXBwZWRfbGlzdCA9ICQocmVuZGVySHRtbCh0cCkpO1xuXG4gICAgICBpZiAoc2V0dGluZ3MudXNlU2VsZWN0KSB7XG4gICAgICAgIGxpc3QgPSB3cmFwcGVkX2xpc3Q7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0ID0gd3JhcHBlZF9saXN0LmNoaWxkcmVuKCd1bCcpO1xuICAgICAgfVxuXG4gICAgICB3cmFwcGVkX2xpc3QuZGF0YShcInRpbWVwaWNrZXItaW5wdXRcIiwgc2VsZik7XG4gICAgICB0cC5saXN0ID0gd3JhcHBlZF9saXN0O1xuXG4gICAgICBpZiAoc2V0dGluZ3MudXNlU2VsZWN0KSB7XG4gICAgICAgIGlmIChzZWxmLnZhbCgpKSB7XG4gICAgICAgICAgbGlzdC52YWwodHAuX3JvdW5kQW5kRm9ybWF0VGltZSh0cC5hbnl0aW1lMmludChzZWxmLnZhbCgpKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGlzdC5vbihcImZvY3VzXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAkKHRoaXMpLmRhdGEoXCJ0aW1lcGlja2VyLWlucHV0XCIpLnRyaWdnZXIoXCJzaG93VGltZXBpY2tlclwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxpc3Qub24oXCJibHVyXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAkKHRoaXMpLmRhdGEoXCJ0aW1lcGlja2VyLWlucHV0XCIpLnRyaWdnZXIoXCJoaWRlVGltZXBpY2tlclwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxpc3Qub24oXCJjaGFuZ2VcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRwLl9zZXRUaW1lVmFsdWUoJCh0aGlzKS52YWwoKSwgXCJzZWxlY3RcIik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRwLl9zZXRUaW1lVmFsdWUobGlzdC52YWwoKSwgXCJpbml0aWFsXCIpO1xuXG4gICAgICAgIHNlbGYuaGlkZSgpLmFmdGVyKGxpc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGFwcGVuZFRvID0gc2V0dGluZ3MuYXBwZW5kVG87XG5cbiAgICAgICAgaWYgKHR5cGVvZiBhcHBlbmRUbyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGFwcGVuZFRvID0gJChhcHBlbmRUbyk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGFwcGVuZFRvID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBhcHBlbmRUbyA9IGFwcGVuZFRvKHNlbGYpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXBwZW5kVG8uYXBwZW5kKHdyYXBwZWRfbGlzdCk7XG5cbiAgICAgICAgdHAuX3NldFNlbGVjdGVkKCk7XG5cbiAgICAgICAgbGlzdC5vbihcIm1vdXNlZG93biBjbGlja1wiLCBcImxpXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgLy8gaGFjazogdGVtcG9yYXJpbHkgZGlzYWJsZSB0aGUgZm9jdXMgaGFuZGxlclxuICAgICAgICAgIC8vIHRvIGRlYWwgd2l0aCB0aGUgZmFjdCB0aGF0IElFIGZpcmVzICdmb2N1cydcbiAgICAgICAgICAvLyBldmVudHMgYXN5bmNocm9ub3VzbHlcbiAgICAgICAgICBzZWxmLm9mZihcImZvY3VzLnRpbWVwaWNrZXJcIik7XG4gICAgICAgICAgc2VsZi5vbihcImZvY3VzLnRpbWVwaWNrZXItaWUtaGFja1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLm9mZihcImZvY3VzLnRpbWVwaWNrZXItaWUtaGFja1wiKTtcbiAgICAgICAgICAgIHNlbGYub24oXCJmb2N1cy50aW1lcGlja2VyXCIsIG1ldGhvZHMuc2hvdyk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoIXRwLl9oaWRlS2V5Ym9hcmQoKSkge1xuICAgICAgICAgICAgc2VsZlswXS5mb2N1cygpO1xuICAgICAgICAgIH0gLy8gbWFrZSBzdXJlIG9ubHkgdGhlIGNsaWNrZWQgcm93IGlzIHNlbGVjdGVkXG5cblxuICAgICAgICAgIGxpc3QuZmluZChcImxpXCIpLnJlbW92ZUNsYXNzKFwidWktdGltZXBpY2tlci1zZWxlY3RlZFwiKTtcbiAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKFwidWktdGltZXBpY2tlci1zZWxlY3RlZFwiKTtcblxuICAgICAgICAgIGlmICh0cC5fc2VsZWN0VmFsdWUoKSkge1xuICAgICAgICAgICAgc2VsZi50cmlnZ2VyKFwiaGlkZVRpbWVwaWNrZXJcIik7XG4gICAgICAgICAgICBsaXN0Lm9uKFwibW91c2V1cC50aW1lcGlja2VyIGNsaWNrLnRpbWVwaWNrZXJcIiwgXCJsaVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICBsaXN0Lm9mZihcIm1vdXNldXAudGltZXBpY2tlciBjbGljay50aW1lcGlja2VyXCIpO1xuICAgICAgICAgICAgICB3cmFwcGVkX2xpc3QuaGlkZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IC8vIGV2ZW50IGhhbmRsZXIgdG8gZGVjaWRlIHdoZXRoZXIgdG8gY2xvc2UgdGltZXBpY2tlclxuXG5cbiAgICBmdW5jdGlvbiBfY2xvc2VIYW5kbGVyKGUpIHtcbiAgICAgIGlmIChlLnR5cGUgPT0gJ2ZvY3VzJyAmJiBlLnRhcmdldCA9PSB3aW5kb3cpIHtcbiAgICAgICAgLy8gbW9iaWxlIENocm9tZSBmaXJlcyBmb2N1cyBldmVudHMgYWdhaW5zdCB3aW5kb3cgZm9yIHNvbWUgcmVhc29uXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHRhcmdldCA9ICQoZS50YXJnZXQpO1xuXG4gICAgICBpZiAodGFyZ2V0LmNsb3Nlc3QoXCIudWktdGltZXBpY2tlci1pbnB1dFwiKS5sZW5ndGggfHwgdGFyZ2V0LmNsb3Nlc3QoXCIudWktdGltZXBpY2tlci13cmFwcGVyXCIpLmxlbmd0aCkge1xuICAgICAgICAvLyBhY3RpdmUgdGltZXBpY2tlciB3YXMgZm9jdXNlZC4gaWdub3JlXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgVGltZXBpY2tlci5oaWRlQWxsKCk7XG4gICAgICAkKGRvY3VtZW50KS5vZmYoXCIudWktdGltZXBpY2tlclwiKTtcbiAgICAgICQod2luZG93KS5vZmYoXCIudWktdGltZXBpY2tlclwiKTtcbiAgICB9XG4gICAgLypcbiAgICAgKiAgS2V5Ym9hcmQgbmF2aWdhdGlvbiB2aWEgYXJyb3cga2V5c1xuICAgICAqL1xuXG5cbiAgICBmdW5jdGlvbiBfa2V5ZG93bmhhbmRsZXIoZSkge1xuICAgICAgdmFyIHNlbGYgPSAkKHRoaXMpO1xuICAgICAgdmFyIHRwID0gc2VsZlswXS50aW1lcGlja2VyT2JqO1xuICAgICAgdmFyIGxpc3QgPSB0cC5saXN0O1xuXG4gICAgICBpZiAoIWxpc3QgfHwgIVRpbWVwaWNrZXIuaXNWaXNpYmxlKGxpc3QpKSB7XG4gICAgICAgIGlmIChlLmtleUNvZGUgPT0gNDApIHtcbiAgICAgICAgICAvLyBzaG93IHRoZSBsaXN0IVxuICAgICAgICAgIG1ldGhvZHMuc2hvdy5jYWxsKHNlbGYuZ2V0KDApKTtcbiAgICAgICAgICBsaXN0ID0gdHAubGlzdDtcblxuICAgICAgICAgIGlmICghdHAuX2hpZGVLZXlib2FyZCgpKSB7XG4gICAgICAgICAgICBzZWxmLnRyaWdnZXIoJ2ZvY3VzJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZS5rZXlDb2RlKSB7XG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgLy8gcmV0dXJuXG4gICAgICAgICAgaWYgKHRwLl9zZWxlY3RWYWx1ZSgpKSB7XG4gICAgICAgICAgICB0cC5fZm9ybWF0VmFsdWUoe1xuICAgICAgICAgICAgICB0eXBlOiBcImNoYW5nZVwiXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdHAuaGlkZU1lKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjYXNlIDM4OlxuICAgICAgICAgIC8vIHVwXG4gICAgICAgICAgdmFyIHNlbGVjdGVkID0gbGlzdC5maW5kKFwiLnVpLXRpbWVwaWNrZXItc2VsZWN0ZWRcIik7XG5cbiAgICAgICAgICBpZiAoIXNlbGVjdGVkLmxlbmd0aCkge1xuICAgICAgICAgICAgbGlzdC5maW5kKFwibGlcIikuZWFjaChmdW5jdGlvbiAoaSwgb2JqKSB7XG4gICAgICAgICAgICAgIGlmICgkKG9iaikucG9zaXRpb24oKS50b3AgPiAwKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSAkKG9iaik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNlbGVjdGVkLmFkZENsYXNzKFwidWktdGltZXBpY2tlci1zZWxlY3RlZFwiKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFzZWxlY3RlZC5pcyhcIjpmaXJzdC1jaGlsZFwiKSkge1xuICAgICAgICAgICAgc2VsZWN0ZWQucmVtb3ZlQ2xhc3MoXCJ1aS10aW1lcGlja2VyLXNlbGVjdGVkXCIpO1xuICAgICAgICAgICAgc2VsZWN0ZWQucHJldigpLmFkZENsYXNzKFwidWktdGltZXBpY2tlci1zZWxlY3RlZFwiKTtcblxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkLnByZXYoKS5wb3NpdGlvbigpLnRvcCA8IHNlbGVjdGVkLm91dGVySGVpZ2h0KCkpIHtcbiAgICAgICAgICAgICAgbGlzdC5zY3JvbGxUb3AobGlzdC5zY3JvbGxUb3AoKSAtIHNlbGVjdGVkLm91dGVySGVpZ2h0KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjYXNlIDQwOlxuICAgICAgICAgIC8vIGRvd25cbiAgICAgICAgICBzZWxlY3RlZCA9IGxpc3QuZmluZChcIi51aS10aW1lcGlja2VyLXNlbGVjdGVkXCIpO1xuXG4gICAgICAgICAgaWYgKHNlbGVjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgbGlzdC5maW5kKFwibGlcIikuZWFjaChmdW5jdGlvbiAoaSwgb2JqKSB7XG4gICAgICAgICAgICAgIGlmICgkKG9iaikucG9zaXRpb24oKS50b3AgPiAwKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSAkKG9iaik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNlbGVjdGVkLmFkZENsYXNzKFwidWktdGltZXBpY2tlci1zZWxlY3RlZFwiKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFzZWxlY3RlZC5pcyhcIjpsYXN0LWNoaWxkXCIpKSB7XG4gICAgICAgICAgICBzZWxlY3RlZC5yZW1vdmVDbGFzcyhcInVpLXRpbWVwaWNrZXItc2VsZWN0ZWRcIik7XG4gICAgICAgICAgICBzZWxlY3RlZC5uZXh0KCkuYWRkQ2xhc3MoXCJ1aS10aW1lcGlja2VyLXNlbGVjdGVkXCIpO1xuXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQubmV4dCgpLnBvc2l0aW9uKCkudG9wICsgMiAqIHNlbGVjdGVkLm91dGVySGVpZ2h0KCkgPiBsaXN0Lm91dGVySGVpZ2h0KCkpIHtcbiAgICAgICAgICAgICAgbGlzdC5zY3JvbGxUb3AobGlzdC5zY3JvbGxUb3AoKSArIHNlbGVjdGVkLm91dGVySGVpZ2h0KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgIC8vIGVzY2FwZVxuICAgICAgICAgIGxpc3QuZmluZChcImxpXCIpLnJlbW92ZUNsYXNzKFwidWktdGltZXBpY2tlci1zZWxlY3RlZFwiKTtcbiAgICAgICAgICB0cC5oaWRlTWUoKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgLy90YWJcbiAgICAgICAgICB0cC5oaWRlTWUoKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gLy8gUGx1Z2luIGVudHJ5XG5cblxuICAgICQuZm4udGltZXBpY2tlciA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgIGlmICghdGhpcy5sZW5ndGgpIHJldHVybiB0aGlzO1xuXG4gICAgICBpZiAobWV0aG9kc1ttZXRob2RdKSB7XG4gICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgZWxlbWVudCBpcyBhIHRpbWVwaWNrZXJcbiAgICAgICAgaWYgKCF0aGlzLmhhc0NsYXNzKFwidWktdGltZXBpY2tlci1pbnB1dFwiKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1ldGhvZHNbbWV0aG9kXS5hcHBseSh0aGlzLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTtcbiAgICAgIH0gZWxzZSBpZiAoX3R5cGVvZihtZXRob2QpID09PSBcIm9iamVjdFwiIHx8ICFtZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIG1ldGhvZHMuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJC5lcnJvcihcIk1ldGhvZCBcIiArIG1ldGhvZCArIFwiIGRvZXMgbm90IGV4aXN0IG9uIGpRdWVyeS50aW1lcGlja2VyXCIpO1xuICAgICAgfVxuICAgIH07IC8vIERlZmF1bHQgcGx1Z2luIG9wdGlvbnMuXG5cblxuICAgICQuZm4udGltZXBpY2tlci5kZWZhdWx0cyA9IERFRkFVTFRfU0VUVElOR1M7XG4gIH0pO1xuXG59KCkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/timepicker/jquery.timepicker.js\n"); /***/ }), /***/ "jquery": /*!*************************!*\ !*** external "jQuery" ***! \*************************/ /***/ (function(module) { "use strict"; module.exports = __WEBPACK_EXTERNAL_MODULE_jquery__; /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ id: moduleId, /******/ loaded: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.loaded = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ /******/ /* webpack/runtime/compat get default export */ /******/ !function() { /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function() { return module['default']; } : /******/ function() { return module; }; /******/ __webpack_require__.d(getter, { a: getter }); /******/ return getter; /******/ }; /******/ }(); /******/ /******/ /* webpack/runtime/define property getters */ /******/ !function() { /******/ // define getter functions for harmony exports /******/ __webpack_require__.d = function(exports, definition) { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ !function() { /******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } /******/ }(); /******/ /******/ /* webpack/runtime/make namespace object */ /******/ !function() { /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ }(); /******/ /******/ /* webpack/runtime/node module decorator */ /******/ !function() { /******/ __webpack_require__.nmd = function(module) { /******/ module.paths = []; /******/ if (!module.children) module.children = []; /******/ return module; /******/ }; /******/ }(); /******/ /************************************************************************/ /******/ /******/ // startup /******/ // Load entry module and return exports /******/ // This entry module can't be inlined because the eval-source-map devtool is used. /******/ var __webpack_exports__ = __webpack_require__("./libs/jquery-timepicker/jquery-timepicker.js"); /******/ /******/ return __webpack_exports__; /******/ })() ; });